diff options
-rw-r--r--[-rwxr-xr-x] | BlockHeadActivity.py | 131 | ||||
-rw-r--r-- | activity/activity.info | 2 |
2 files changed, 89 insertions, 44 deletions
diff --git a/BlockHeadActivity.py b/BlockHeadActivity.py index 69152b2..fed9a94 100755..100644 --- a/BlockHeadActivity.py +++ b/BlockHeadActivity.py @@ -22,8 +22,8 @@ add or subtract two multiple-digit numbers, with number base <= 10 """ -__date__ = '10-Sep-2009' -__version__ = 2076 +__date__ = '22-Sep-2009' +__version__ = 2081 # set to True to run as an OLPC/Sugar "activity" # set to False to run as a standard Python program @@ -52,7 +52,7 @@ class P(): DEBUG = False # show help button and help window? - HELP_ENABLE = False if SUGAR_ACTIVITY else True + HELP_ENABLE = True # show exit button? EXIT_ENABLE = False if SUGAR_ACTIVITY else True @@ -143,14 +143,14 @@ class P(): 'answer': ["Answer", None], } -class HelpWindow(gtk.Window): +class HelpPanel(gtk.Frame): """ window to display help text for ADD mode or SUB mode """ - WID = 470 - HGT = 250 + HELP_WID = 400 + HELP_HGT = 275 FONT_STR = "Sans Bold 11" - BG_COLOR_STR = '#EEEAFA' + BG_COLOR_STR = '#FFEA44' HEAD_COLOR_STR = 'red' # help texts @@ -169,56 +169,73 @@ Click the "-" operator between the numbers to change it to "+". """ def __init__(self): - gtk.Window.__init__(self) - self.set_title("BlockHead Help") - self.set_transient_for(MainWin) - self.connect('destroy', lambda _: self.Cleanup()) - self.set_size_request(self.WID, self.HGT) - self.set_position(gtk.WIN_POS_CENTER) + gtk.Frame.__init__(self) + self.set_shadow_type(gtk.SHADOW_NONE) + + # set overall size from BlockPanel + _, _, wid, hgt = Bpnl.canv.get_allocation() + self.set_size_request(wid, hgt) # buffer self.tbuf = gtk.TextBuffer() - # view + # view -- will appear as box within overall panel tv = gtk.TextView(self.tbuf) tv.modify_base(gtk.STATE_NORMAL, tv.get_colormap().alloc_color(self.BG_COLOR_STR)) - tv.set_left_margin(10) + tv.set_left_margin(20) + tv.set_right_margin(20) tv.set_pixels_above_lines(10) tv.set_wrap_mode(gtk.WRAP_WORD) tv.set_cursor_visible(False) - self.add(tv) + tv.set_size_request(self.HELP_WID, self.HELP_HGT) + + algn = gtk.Alignment(0.5, 0.5) + self.add(algn) + algn.add(tv) # format tags self.heading_tag = self.tbuf.create_tag(None, font=self.FONT_STR, foreground=self.HEAD_COLOR_STR) self.text_tag = self.tbuf.create_tag(None, font=self.FONT_STR) - def Update(self): + def Update(self, change_sign): """ get rid of old text, display new text + + change_sign flag indicates whether this method was invoked by a sign-change, + instead of by pressing the Help button """ + if Cpnl.help_state == Cpnl.HELP_OFF: + return + help_text = self.HELP_ADD if Mode == P.ADD_MODE else self.HELP_SUB self.tbuf.set_text(help_text) + # iterators (assumtion: first text line is heading) start = self.tbuf.get_start_iter() end = self.tbuf.get_end_iter() - # heading is first text line end_of_hd = self.tbuf.get_iter_at_offset(help_text.index("\n")) + # apply fonts self.tbuf.apply_tag(self.heading_tag, start, end_of_hd) self.tbuf.apply_tag(self.text_tag, end_of_hd, end) - # show help, but main window always gets focus back - self.show_all() - MainWin.present() + # display HelpPanel + if change_sign: + # HelpPanel is already displayed + pass + else: + self.show_all() + vb.pack_start(self, expand=True, fill=True) + vb.reorder_child(self, 0) - def Cleanup(self): + def Remove(self): """ - remove help window + remove HelpPanel """ - global HelpWin + global Hpnl self.destroy() - HelpWin = None + Hpnl = None class AnswerLabel(gtk.EventBox): """ @@ -227,7 +244,7 @@ class AnswerLabel(gtk.EventBox): # standard bg color (in NORMAL state), to make label seem transparent # value is gtk.gdk.Color - std_bgcolor = tuple(gtk.Fixed().get_style().bg)[gtk.STATE_NORMAL] + std_bgcolor = tuple(gtk.Frame().get_style().bg)[gtk.STATE_NORMAL] def __init__(self): gtk.EventBox.__init__(self) @@ -242,16 +259,17 @@ class AnswerLabel(gtk.EventBox): """ empty the label """ - lab = self.child - lab.set_text("") - SetBgColor(self, self.std_bgcolor) + self.set_text("") def set_text(self, textstr): """ like gtk.Label.set_text() """ self.child.set_text(textstr) - SetBgColor(self, P.ANSW_COLOR_STR) + if textstr: + SetBgColor(self, P.ANSW_COLOR_STR) + else: + SetBgColor(self, self.std_bgcolor) def set_sensitive(self, arg): """ @@ -282,8 +300,11 @@ class CtrlPanel(gtk.Frame): # offsets into entries/labels lists N1, N2, ANS = range(3) + HELP_OFF, HELP_ON = 0, 1 + def __init__(self): gtk.Frame.__init__(self) + self.help_state = self.HELP_OFF ### ### create control widgets @@ -327,7 +348,7 @@ class CtrlPanel(gtk.Frame): else: del self.ctrlbtns[self.EXIT] if P.HELP_ENABLE: - self.ctrlbtns[self.HELP] = gtk.Button("Help") + self.ctrlbtns[self.HELP] = gtk.Button("Show Help") self.ctrlbtns[self.HELP].connect("clicked", self.HelpCmd) else: del self.ctrlbtns[self.HELP] @@ -349,6 +370,7 @@ class CtrlPanel(gtk.Frame): SA, COL_1, SB, COL_OP, SC, COL_2, SD, COL_EQ, SE, COL_ANS, SF = range(11) overall_box = gtk.HBox() + overall_box.set_border_width(3) self.cols = [] for i in range(11): onecol = gtk.VBox() @@ -407,7 +429,7 @@ class CtrlPanel(gtk.Frame): ctrlbtns_box.pack_start(btn) # ... gtk.Alignment keeps buttons from filling vertical space - buttons_box_algn = gtk.Alignment(0.5, 0.5) + buttons_box_algn = gtk.Alignment(1.0, 0.5) buttons_box_algn.add(ctrlbtns_box) overall_box.pack_end(buttons_box_algn, padding=5) @@ -428,22 +450,41 @@ class CtrlPanel(gtk.Frame): InitializeMode() - if HelpWin: - HelpWin.Update() + if Hpnl: + Hpnl.Update(change_sign=True) # might need to enable/disable "Draw Blocks" button self.ValidateInput(None, None) def HelpCmd(self, _btn="not used"): """ - display help text in top-level window + display or hide help text """ - global HelpWin + global Hpnl + + if self.help_state == self.HELP_OFF: + # adjust state variable, help button + self.help_state = self.HELP_ON + Cpnl.ctrlbtns[Cpnl.HELP].set_label("Hide Help") + Cpnl.ctrlbtns[Cpnl.HELP].child.modify_font(P.FONT) - if not HelpWin: - HelpWin = HelpWindow() + # create HelpPanel, with same size as BlockPanel + Hpnl = HelpPanel() - HelpWin.Update() + # new HelpPanel replaces BlockPanel onscreen + vb.remove(Bpnl.canv) + Hpnl.Update(change_sign=False) + + elif self.help_state == self.HELP_ON: + # adjust state variable, help button + self.help_state = self.HELP_OFF + Cpnl.ctrlbtns[Cpnl.HELP].set_label("Show Help") + Cpnl.ctrlbtns[Cpnl.HELP].child.modify_font(P.FONT) + + # remove HelpPanel, restore BlockPanel + Hpnl.Remove() + vb.pack_start(Bpnl.canv, expand=True, fill=True) + vb.reorder_child(Bpnl.canv, 0) def NewCmd(self, _btn="not used"): """ @@ -1330,6 +1371,7 @@ def SetBgColor(widget, colorstr): set background color of a widget """ widget.modify_bg(gtk.STATE_NORMAL, widget.get_colormap().alloc_color(colorstr)) + widget.modify_bg(gtk.STATE_INSENSITIVE, widget.get_colormap().alloc_color(colorstr)) def SetLabelColor(widget, colorstr): """ @@ -1539,12 +1581,11 @@ mytype = activity.Activity if SUGAR_ACTIVITY else object class BlockHeadActivity(mytype): def __init__(self, handle=None): - global Mode, HelpWin, MyDrawable, Pix, MainWin, Bpnl, Cpnl + global Mode, MyDrawable, Pix, MainWin, Bpnl, Cpnl, Hpnl, vb if SUGAR_ACTIVITY: activity.Activity.__init__(self, handle) Mode = P.ADD_MODE - HelpWin = None # we need an invisible Drawable, for use by SetDisplayStringWidths() # also, CreateBlockImage() needs it to establish pixel-depth of a Pixmap @@ -1578,9 +1619,9 @@ class BlockHeadActivity(mytype): # canvas where columns/blocks appear, at top Bpnl = BlockPanel(111, 2*P.BASE*P.UNIT_HGT + P.WINDOW_HGT_ADJ) - # ?? why is next statement necessary for correct block-position calculations? + # next statement is necessary for correct block-position calculations Bpnl.canv.set_has_window(True) - SetBgColor(Bpnl.canv, P.CANV_COLOR_STR) + #SetBgColor(Bpnl.canv, P.CANV_COLOR_STR) vb.pack_start(Bpnl.canv, expand=True, fill=True) # control panel, at bottom @@ -1588,6 +1629,9 @@ class BlockHeadActivity(mytype): Cpnl.NewCmd(None) vb.pack_start(Cpnl, expand=True, fill=True) + # HelpPanel is not created until user clicks Help button + Hpnl = None + # go MainWin.show_all() @@ -1601,3 +1645,4 @@ if __name__ == "__main__": BlockHeadActivity() gtk.main() sys.exit(0) + diff --git a/activity/activity.info b/activity/activity.info index c683c53..77f1b27 100644 --- a/activity/activity.info +++ b/activity/activity.info @@ -3,6 +3,6 @@ name = BlockHead bundle_id = org.laptop.BlockHeadActivity class = BlockHeadActivity.BlockHeadActivity icon = activity-blockhead -activity_version = 1 +activity_version = 6 host_version = 1 show_launcher = yes |