[conduit] Use gtk.InfoBar instead of custom MsgArea



commit 0a67abec516e371a4c9afc1b71dafaa10beb5495
Author: John Stowers <john stowers gmail com>
Date:   Wed Sep 8 21:12:15 2010 +1200

    Use gtk.InfoBar instead of custom MsgArea

 conduit/gtkui/Canvas.py  |    7 +-
 conduit/gtkui/MsgArea.py |  275 ++++++++--------------------------------------
 2 files changed, 49 insertions(+), 233 deletions(-)
---
diff --git a/conduit/gtkui/Canvas.py b/conduit/gtkui/Canvas.py
index ef35f61..1d9315c 100644
--- a/conduit/gtkui/Canvas.py
+++ b/conduit/gtkui/Canvas.py
@@ -211,6 +211,7 @@ class Canvas(goocanvas.Canvas, _StyleMixin):
                                 new,
                                 1,1
                                 )
+        self.msg.remove(msgarea)
 
     def _make_hint(self, hint, timeout=4):
         if Knowledge.HINT_TEXT[hint][2]:
@@ -218,9 +219,9 @@ class Canvas(goocanvas.Canvas, _StyleMixin):
         else:
             buttons = []
         h = self.msg.new_from_text_and_icon(
-                            gtk.STOCK_INFO,
-                            _(Knowledge.HINT_TEXT[hint][0]),
-                            _(Knowledge.HINT_TEXT[hint][1]),
+                            primary=Knowledge.HINT_TEXT[hint][0],
+                            secondary=Knowledge.HINT_TEXT[hint][1],
+                            message_type=gtk.MESSAGE_INFO,
                             buttons=buttons,
                             timeout=timeout)
         h.connect("response", self._do_hint)
diff --git a/conduit/gtkui/MsgArea.py b/conduit/gtkui/MsgArea.py
index a34fe67..026a260 100644
--- a/conduit/gtkui/MsgArea.py
+++ b/conduit/gtkui/MsgArea.py
@@ -1,249 +1,64 @@
-# This file is part of the Hotwire Shell user interface.
-#   
-# Copyright (C) 2007,2008 Colin Walters <walters verbum org>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+import gtk
+import gobject
 
-import os, sys, re, logging, string
+class InfoBar(gtk.InfoBar):
+    def __init__(self, primary_text, secondary_text=None, message_type=gtk.MESSAGE_INFO, buttons=()):
+        gtk.InfoBar.__init__(self)
 
-import gtk, gobject, pango
-
-#from hotssh.hotlib.logutil import log_except
-
-#_logger = logging.getLogger("hotwire.ui.MsgArea")
-
-# This file is a Python translation of gedit/gedit/gedit-message-area.c
-
-class MsgArea(gtk.HBox):
-    __gsignals__ = {
-        "response" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_INT,)),                    
-        "close" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, [])
-    }
-
-    def __init__(self, buttons, **kwargs):
-        super(MsgArea, self).__init__(**kwargs)
-        
-        self.__contents = None
-        self.__changing_style = False
-        
-        self.__main_hbox = gtk.HBox(False, 16) # FIXME: use style properties
-        self.__main_hbox.show()
-        self.__main_hbox.set_border_width(8) # FIXME: use style properties
-
-        self.__action_area = gtk.HBox(True, 4); # FIXME: use style properties
-        self.__action_area.show()
-        
-        #Pack the buttons into a VBox so they remain the same height and do 
-        #not expand to be the same size as the Primary + Secondary text
-        vb = gtk.VBox()
-        vb.pack_end(self.__action_area, False, False)
-        
-        self.__main_hbox.pack_end (vb, False, False, 0)
-
-        self.pack_start(self.__main_hbox, True, True, 0)
-
-        self.set_app_paintable(True)
-
-        self.connect("expose-event", self.__paint)
-
-        # Note that we connect to style-set on one of the internal
-        # widgets, not on the message area itself, since gtk does
-        # not deliver any further style-set signals for a widget on
-        # which the style has been forced with gtk_widget_set_style()
-        self.__main_hbox.connect("style-set", self.__on_style_set)
-        
-        self.add_buttons(buttons)       
-
-    def __get_response_data(self, w, create):
-        d = w.get_data('hotwire-msg-area-data')
-        if (d is None) and create:
-            d = {'respid': None}
-            w.set_data('hotwire-msg-area-data', d)
-        return d
-    
-    def __find_button(self, respid):
-        children = self.__actionarea.get_children()
-        for child in children:
-            rd = self.__get_response_data(child, False)
-            if rd is not None and rd['respid'] == respid:
-                return child
-    
-    def __close(self):
-        cancel = self.__find_button(gtk.RESPONSE_CANCEL)
-        if cancel is None: 
-            return
-        self.response(gtk.RESPONSE_CANCEL)
-        
-    def __paint(self, w, event):
-        gtk.Style.paint_flat_box(w.style,
-                                 w.window,
-                                 gtk.STATE_NORMAL,
-                                 gtk.SHADOW_OUT,
-                                 None,
-                                 w,
-                                 "tooltip",
-                                 w.allocation.x + 1,
-                                 w.allocation.y + 1,
-                                 w.allocation.width - 2,
-                                 w.allocation.height - 2)
-    
-        return False
-    
-    def __on_style_set(self, w, style):
-        if self.__changing_style:
-            return
-        # This is a hack needed to use the tooltip background color
-        window = gtk.Window(gtk.WINDOW_POPUP);
-        window.set_name("gtk-tooltip")
-        window.ensure_style()
-        style = window.get_style()
-
-        self.__changing_style = True
-        self.set_style(style)
-        self.__changing_style = False
-
-        window.destroy()
-
-        self.queue_draw()
-        
-    def __get_response_for_widget(self, w):
-        rd = self.__get_response_data(w, False)
-        if rd is None:
-            return gtk.RESPONSE_NONE
-        return rd['respid']
-    
-    def __on_action_widget_activated(self, w):
-        response_id = self.__get_response_for_widget(w)
-        self.response(response_id)
-        
-    def add_action_widget(self, child, respid):
-        rd = self.__get_response_data(child, True)
-        rd['respid'] = respid
-        if not isinstance(child, gtk.Button):
-            raise ValueError("Can only pack buttons as action widgets")
-        child.connect('clicked', self.__on_action_widget_activated)
-        if respid != gtk.RESPONSE_HELP:
-            self.__action_area.pack_start(child, False, False, 0)
-        else:
-            self.__action_area.pack_end(child, False, False, 0)
-            
-    def set_contents(self, contents):
-        self.__contents = contents
-        self.__main_hbox.pack_start(contents, True, True, 0)
-        
-        
-    def add_button(self, btext, respid):
-        button = gtk.Button(stock=btext)
-        button.set_focus_on_click(False)
-        button.set_flags(gtk.CAN_DEFAULT)
-        button.show()
-        self.add_action_widget(button, respid)
-        return button
-    
-    def add_buttons(self, args):
-        #_logger.debug("init buttons: %r", args)
-        for (btext, respid) in args:
-            self.add_button(btext, respid)
-    
-    def set_response_sensitive(self, respid, setting):
-        for child in self.__action_area.get_children():
-            rd = self.__get_response_data(child, False)
-            if rd is not None and rd['respid'] == respid:
-                child.set_sensitive(setting)
-                break
-            
-    def set_default_response(self, respid):
-        for child in self.__action_area.get_children():
-            rd = self.__get_response_data(child, False)
-            if rd is not None and rd['respid'] == respid:
-                child.grab_default()
-                break        
-            
-    def response(self, respid):
-        self.emit('response', respid)
-        
-    def add_stock_button_with_text(self, text, stockid, respid):
-        b = gtk.Button(label=text)
-        b.set_focus_on_click(False)
-        img = gtk.Image()
-        img.set_from_stock(stockid, gtk.ICON_SIZE_BUTTON)
-        b.set_image(img)
-        b.show_all()
-        self.add_action_widget(b, respid)
-        return b
-
-    def set_text_and_icon(self, stockid, primary_text, secondary_text=None):
-        hbox_content = gtk.HBox(False, 8)
-        hbox_content.show()
-
-        image = gtk.Image()
-        image.set_from_stock(stockid, gtk.ICON_SIZE_BUTTON)
-        image.show()
-        hbox_content.pack_start(image, False, False, 0)
-        image.set_alignment(0.5, 0.5)
-    
         vbox = gtk.VBox(False, 6)
-        vbox.show()
-        hbox_content.pack_start (vbox, True, True, 0)
     
-        primary_markup = "<b>%s</b>" % (primary_text,)
-        primary_label = gtk.Label(primary_markup)
-        primary_label.show()
+        primary_label = gtk.Label()
         vbox.pack_start(primary_label, True, True, 0)
-        primary_label.set_use_markup(True)
         primary_label.set_line_wrap(True)
         primary_label.set_alignment(0, 0.5)
-        primary_label.set_flags(gtk.CAN_FOCUS)
-        primary_label.set_selectable(True)
-    
+        self._primary_label = primary_label
+
+        secondary_label = None
         if secondary_text:
-            secondary_markup = "<small>%s</small>" % (secondary_text,)
-            secondary_label = gtk.Label(secondary_markup)
-            secondary_label.show()
+            secondary_label = gtk.Label()
             vbox.pack_start(secondary_label, True, True, 0)
-            secondary_label.set_flags(gtk.CAN_FOCUS)
-            secondary_label.set_use_markup(True)
-            secondary_label.set_line_wrap(True)
-            secondary_label.set_selectable(True)
+            if buttons:
+                secondary_label.set_line_wrap(True)
             secondary_label.set_alignment(0, 0.5)
-    
-        self.set_contents(hbox_content)
+        self._secondary_label = secondary_label
+
+        self.update_text(primary_text, secondary_text)
 
-class MsgAreaController(gtk.HBox):
+        if buttons:
+            for name,response_id in buttons:
+                self.add_button(name, response_id)
+
+        self.set_message_type(message_type)
+        self.get_content_area().pack_start(vbox, False, False)
+
+    def update_text(self, primary_text="", secondary_text=""):
+        if primary_text:
+            self._primary_label.set_markup("<b>%s</b>" % primary_text)
+        if secondary_text and self._secondary_label:
+            self._secondary_label.set_markup("<small>%s</small>" % secondary_text)
+
+class MsgAreaController(gtk.VBox):
     def __init__(self):
-        super(MsgAreaController, self).__init__()
+        gtk.VBox.__init__(self)
         
-        self.__msgarea = None
-        
-    def _timeout(self, msgarea):
-        if msgarea == self.__msgarea:
-            self.clear()
+    def _timeout(self, infobar):
+        try:
+            self.remove(infobar)
+        except:
+            pass
         
     def clear(self):
-        if self.__msgarea is not None:
-            self.remove(self.__msgarea)
-            self.__msgarea.destroy()
-            self.__msgarea = None
+        for i in self.get_children():
+            if type(i) == InfoBar:
+                self.remove(i)
         
-    def new_from_text_and_icon(self, stockid, primary, secondary=None, buttons=[], timeout=0):
-        self.clear()
-        msgarea = self.__msgarea = MsgArea(buttons)
-        msgarea.set_text_and_icon(stockid, primary, secondary)
-        self.pack_start(msgarea, expand=True)
+    def new_from_text_and_icon(self, primary, secondary=None, message_type=gtk.MESSAGE_INFO, buttons=(), timeout=0):
+        infobar = InfoBar(primary, secondary, message_type, buttons)
+        infobar.show_all()
+        self.pack_start(infobar, False, True)
         
         if timeout:
-            gobject.timeout_add(timeout*1000, self._timeout, msgarea)
+            gobject.timeout_add(timeout*1000, self._timeout, infobar)
             
-        return msgarea
+        return infobar
+



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]