Switching to a real inconsistent button
authorEd Page <eopage@byu.net>
Tue, 23 Mar 2010 02:01:18 +0000 (21:01 -0500)
committerEd Page <eopage@byu.net>
Tue, 23 Mar 2010 02:24:58 +0000 (21:24 -0500)
src/libview.py

index 9a08869..5ad8502 100644 (file)
@@ -38,7 +38,8 @@ except NameError:
 _moduleLogger = logging.getLogger(__name__)
 
 
-class CellRendererTriple(gtk.GenericCellRenderer):
+class TripleToggleCellRenderer(gtk.CellRendererToggle):
+
        __gproperties__ = {
                "status": (gobject.TYPE_STRING, "Status",
                "Status", "", gobject.PARAM_READWRITE),
@@ -49,139 +50,31 @@ class CellRendererTriple(gtk.GenericCellRenderer):
        }
 
        def __init__(self):
-               #self.__gobject_init__()
-               #gtk.GenericCellRenderer.__init__(self, *args, **kwargs)
-               gtk.GenericCellRenderer.__init__(self)
-               #self.__gobject_init__()
+               gtk.CellRendererToggle.__init__(self)
+               self.set_property("activatable", True)
+               self.connect('toggled', self._on_toggled)
                self.status = -1
-               self.xpad = 2
-               self.ypad = 2
-               self.mode = gtk.CELL_RENDERER_MODE_ACTIVATABLE
-               self.xpad = -2
-               self.ypad = -2
-               self.xalign = 0.5
-               self.yalign = 0.5
-               self.active = 0
-               self.widget = None
-               self.last_cell = None
-               self.connect('editing-started', self.on_clicked)
 
        def do_set_property(self, property, value):
-               setattr(self, property.name, value)
-
-       def do_get_property(self, property):
-               return getattr(self, property.name)
-
-       def get_layout(self, widget):
-               '''Gets the Pango layout used in the cell in a TreeView widget.'''
-
-               layout = pango.Layout(widget.get_pango_context())
-               layout.set_width(-1)    # Do not wrap text.
-
-               layout.set_text('  ')
-
-               return layout
-
-       def on_get_size(self, widget, cell_area = None):
-               xpad = 2
-               ypad = 2
-
-               xalign = 0
-               yalign = 0.5
-
-               layout = self.get_layout(widget)
-               width, height = layout.get_pixel_size()
-
-               x_offset = xpad
-               y_offset = ypad
-
-               if cell_area:
-
-                       x_offset = xalign * (cell_area.width - width)
-                       x_offset = max(x_offset, xpad)
-                       x_offset = int(round(x_offset, 0))
-
-                       y_offset = yalign * (cell_area.height - height)
-                       y_offset = max(y_offset, ypad)
-                       y_offset = int(round(y_offset, 0))
-
-               width  = width  + (xpad * 2)
-               height = height + (ypad * 2)
-
-               return x_offset, y_offset, width, height
-
-       def on_clicked(self,  widget, data):
-               print widget, data
-
-       def clicked(self, widget, data1 = None):
-               x, y = widget.get_pointer()
-               widget.realize()
-
-               path = widget.get_path_at_pos(x, y)
-
-               #print "a", widget.get_cursor()
-               #print path
-
-               path = widget.get_cursor()[0]
-
-               if path is not None:
-                       irow = path[0]  #path[0][0]-1
-                       rect = widget.get_cell_area(irow, widget.get_column(0)) #FixME 0 is hardcoded
-                       if x < rect.x+rect.width:
-                               self.emit("status_changed", irow, self.status)
-               else:
+               if getattr(self, property.name) == value:
                        return
 
-                       #workarround -1 means last item, because bug in treeview?!
-                       #print "not in list"
-                       rect = widget.get_visible_rect() #widget.get_cell_area(-1, widget.get_column(0))
-                       #print rect.x, rect.y, rect.width, rect.height, x, y
-                       irow = -1
-                       rect = widget.get_cell_area(0, widget.get_column(0)) #FixME 0 is hardcoded
-                       if x < rect.x+rect.width:
-                               self.emit("status_changed", irow, "-1")
-
-       def on_render(self, window, widget, background_area, cell_area, expose_area, flags ):
-               if (self.widget == None):
-                       #print widget
-                       self.widget = widget
-                       self.widget.connect("cursor-changed", self.clicked) #button-press-event
-
-               self.last_cell = cell_area
-
-               x = int(cell_area.x+(cell_area.width-2)/2-(cell_area.height-2)/2)
-               y = int(cell_area.y+1)
-               height = int(cell_area.height-2)
-               width = int(height)
-
-               if (self.status == "1"):
-                       widget.style.paint_check(window, gtk.STATE_NORMAL, gtk.SHADOW_IN, cell_area, widget, "cellradio", x, y, width, height)
-               elif (self.status == "0"):
-                       #width = height
-                       height = height-3
-                       width = height
-
-                       widget.style.paint_flat_box(window, gtk.STATE_NORMAL, gtk.SHADOW_NONE, cell_area, widget, "cellunselected", x, y, width, height)
-
-                       widget.style.paint_hline(window, gtk.STATE_NORMAL, cell_area, widget, "cellunselected", x, x+width, y)
-                       widget.style.paint_hline(window, gtk.STATE_NORMAL, cell_area, widget, "cellunselected", x, x+width, y+height)
-                       widget.style.paint_vline(window, gtk.STATE_NORMAL, cell_area, widget, "cellunselected", y, y+height, x)
-                       widget.style.paint_vline(window, gtk.STATE_NORMAL, cell_area, widget, "cellunselected", y, y+height, x+width)
-
-               else:
-                       widget.style.paint_diamond(window, gtk.STATE_NORMAL, gtk.SHADOW_IN, cell_area, widget, "cellunselected", x, y, width, height)
+               setattr(self, property.name, value)
 
-               #widget.show_all()
-               #print "render"
-               pass
+               if property.name == "status":
+                       active, inconsistent = {
+                               "-1": (False, True),
+                               "0": (False, False),
+                               "1": (True, False),
+                       }[value]
+                       self.set_property("active", active)
+                       self.set_property("inconsistent", inconsistent)
 
-       def on_start_editing(self, event, widget, path, background_area, cell_area, flags):
-               print "on_start_editing", path
-               return None
+       def do_get_property(self, property):
+               return getattr(self, property.name)
 
-       def on_activate(self, event, widget, path, background_area, cell_area, flags):
-               print "activate", path
-               return False
+       def _on_toggled(self, widget, path):
+               self.emit("status_changed", int(path), "-1")
 
 
 class CellRendererCombo2(gtk.GenericCellRenderer):
@@ -314,7 +207,7 @@ class CellRendererCombo2(gtk.GenericCellRenderer):
 
 
 gobject.type_register(CellRendererCombo2)
-gobject.type_register(CellRendererTriple)
+gobject.type_register(TripleToggleCellRenderer)
 
 
 class View(gtk.VBox):
@@ -380,6 +273,7 @@ class View(gtk.VBox):
 
                self.treeview = gtk.TreeView(self.modelsort)
                self.treeview.set_headers_visible(True)
+               self.treeview.set_reorderable(False)
 
                self.cell = range(self.liststorehandler.get_colcount())
                self.tvcolumn = range(self.liststorehandler.get_colcount())
@@ -393,7 +287,8 @@ class View(gtk.VBox):
                                default = "0"
                        if self.db.ladeDirekt("showcol_"+str(self.liststorehandler.get_colname(i)), default) == "1":
                                if i in [1]:
-                                       self.cell[i] = CellRendererTriple()
+                                       #self.cell[i] = CellRendererTriple()
+                                       self.cell[i] = TripleToggleCellRenderer()
                                        self.tvcolumn[i] = gtk.TreeViewColumn("", self.cell[i])
                                        self.cell[i].connect( 'status_changed', self.col_toggled)
                                        self.tvcolumn[i].set_attributes( self.cell[i], status = i)
@@ -419,9 +314,6 @@ class View(gtk.VBox):
                                self.tvcolumn[i].set_resizable(True)
                                self.treeview.append_column(self.tvcolumn[i])
 
-               # Disable drag and drop reordering of rows
-               self.treeview.set_reorderable(False)
-
                if self.scrolled_window is not None:
                        self.scrolled_window.destroy()