From 5e9cfe3bf4e5f6d2a843c3b30a36d5efad3bea9a Mon Sep 17 00:00:00 2001 From: jjposner Date: Tue, 22 Sep 2009 18:37:55 +0000 Subject: HelpWindow --> HelpPanel / background colors Replace top-level HelpWindow with a HelpPanel (gtk.Frame) that swaps with the BlockPanel. The "Help" button now toggles between "Show Help" and "Hide Help". BlockPanel no longer has background color set. AnswerLabel background color and implementation tweaks. --- 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 -- cgit v0.9.1