49365e132c
This new invoker is able to handle all the palettes on a treeview, removing the need of one invoker per cell renderer (CellRendererInvoker). This simplifies the code and makes it more efficient. Also removes the logic from the CellRendererIcon, which should only care about drawing itself. [1] Is important to note than in Gtk3 a CellRenderer is not a GtkWidget then can't know when the mouse is over it or have the usual events used by other invokers, making the implementation CellRendererInvoker very complicate. This commit also removes the invoker of CellRendererIcon. The ScrollingDetector logic is simplified too, because now there are only one invoker instead of one by renderer and the example code updated. [1] https://developer.gnome.org/gtk3/stable/GtkCellRenderer.html
72 lines
1.9 KiB
Python
72 lines
1.9 KiB
Python
import os
|
|
import time
|
|
|
|
from gi.repository import Gtk
|
|
|
|
from sugar3.graphics import style
|
|
from sugar3.graphics.icon import CellRendererIcon
|
|
from sugar3.graphics.xocolor import XoColor
|
|
from sugar3.graphics.scrollingdetector import ScrollingDetector
|
|
from sugar3.graphics.palettewindow import TreeViewInvoker
|
|
import common
|
|
|
|
|
|
def _scroll_start_cb(event, treeview, invoker):
|
|
print "Scroll starts"
|
|
invoker.detach()
|
|
|
|
def _scroll_end_cb(event, treeview, invoker):
|
|
print "Scroll ends"
|
|
invoker.attach_treeview(treeview)
|
|
|
|
test = common.Test()
|
|
test.show()
|
|
|
|
model = Gtk.ListStore(str)
|
|
|
|
data_dir = os.getenv('GTK_DATA_PREFIX', '/usr/')
|
|
|
|
iconlist = os.listdir(os.path.join(data_dir,
|
|
'share/icons/sugar/scalable/actions/'))
|
|
print "Displaying %s icons" % len(iconlist)
|
|
for icon in iconlist:
|
|
icon = os.path.basename(icon)
|
|
icon = icon[:icon.find('.')]
|
|
model.append([icon])
|
|
|
|
scrolled = Gtk.ScrolledWindow()
|
|
scrolled.set_size_request(800, 800)
|
|
treeview = Gtk.TreeView()
|
|
|
|
treeview.set_model(model)
|
|
scrolled.add(treeview)
|
|
test.pack_start(scrolled, True, True, 0)
|
|
test.show_all()
|
|
|
|
col = Gtk.TreeViewColumn()
|
|
treeview.append_column(col)
|
|
|
|
xo_color = XoColor('#FF0000,#00FF00')
|
|
cell_icon = CellRendererIcon()
|
|
cell_icon.props.width = style.GRID_CELL_SIZE
|
|
cell_icon.props.height = style.GRID_CELL_SIZE
|
|
cell_icon.props.size = style.STANDARD_ICON_SIZE
|
|
cell_icon.props.xo_color = xo_color
|
|
|
|
col.pack_start(cell_icon, expand=False)
|
|
col.add_attribute(cell_icon, 'icon-name', 0)
|
|
cell_text = Gtk.CellRendererText()
|
|
col.pack_start(cell_text, expand=True)
|
|
col.add_attribute(cell_text, 'text', 0)
|
|
|
|
invoker = TreeViewInvoker()
|
|
invoker.attach_treeview(treeview)
|
|
|
|
detector = ScrollingDetector(scrolled)
|
|
detector.connect('scroll-start', _scroll_start_cb, treeview, invoker)
|
|
detector.connect('scroll-end', _scroll_end_cb, treeview, invoker)
|
|
|
|
if __name__ == '__main__':
|
|
time_ini = time.time()
|
|
common.main(test)
|