[z3-checkins] r14870 - in z3/zopejam/trunk/src/zopejam: . icons/palette/12x12 icons/palette/16x16

hathawsh at codespeak.net hathawsh at codespeak.net
Thu Jul 21 17:00:45 CEST 2005


Author: hathawsh
Date: Thu Jul 21 17:00:40 2005
New Revision: 14870

Added:
   z3/zopejam/trunk/src/zopejam/icons/palette/12x12/
   z3/zopejam/trunk/src/zopejam/icons/palette/12x12/sort_down.png
   z3/zopejam/trunk/src/zopejam/icons/palette/12x12/sort_up.png
Removed:
   z3/zopejam/trunk/src/zopejam/icons/palette/16x16/sort_down.png
   z3/zopejam/trunk/src/zopejam/icons/palette/16x16/sort_up.png
Modified:
   z3/zopejam/trunk/src/zopejam/main.py
   z3/zopejam/trunk/src/zopejam/propbook.py
   z3/zopejam/trunk/src/zopejam/resources.xrc
Log:
Added popup menu to grid.  Also fixed a platform issue: Zope Jam was
loading 12x12 icons as 16x16, which Windows will not like.


Added: z3/zopejam/trunk/src/zopejam/icons/palette/12x12/sort_down.png
==============================================================================
Files (empty file) and z3/zopejam/trunk/src/zopejam/icons/palette/12x12/sort_down.png	Thu Jul 21 17:00:40 2005 differ

Added: z3/zopejam/trunk/src/zopejam/icons/palette/12x12/sort_up.png
==============================================================================
Files (empty file) and z3/zopejam/trunk/src/zopejam/icons/palette/12x12/sort_up.png	Thu Jul 21 17:00:40 2005 differ

Deleted: /z3/zopejam/trunk/src/zopejam/icons/palette/16x16/sort_down.png
==============================================================================
Binary file. No diff available.

Deleted: /z3/zopejam/trunk/src/zopejam/icons/palette/16x16/sort_up.png
==============================================================================
Binary file. No diff available.

Modified: z3/zopejam/trunk/src/zopejam/main.py
==============================================================================
--- z3/zopejam/trunk/src/zopejam/main.py	(original)
+++ z3/zopejam/trunk/src/zopejam/main.py	Thu Jul 21 17:00:40 2005
@@ -85,6 +85,7 @@
         self.commands.addCallbacks(self)
 
         self.small_palette_images = PaletteImageList(16, 16)
+        self.tiny_palette_images = PaletteImageList(12, 12)
         inctree = xrc.XRCCTRL(self.frame, 'structure_tree')
         inctree.SetImageList(self.small_palette_images)
         pkgtree = xrc.XRCCTRL(self.frame, 'package_tree')
@@ -434,6 +435,13 @@
         return p
 
 
+    def selectDirectives(self, directives):
+        self.dir_list.selectDirectives(directives)
+
+    def ensureDirectiveVisible(self, directive):
+        self.dir_list.ensureDirectiveVisible(directive)
+
+
 class DirectiveList(wx.ListCtrl, listctrl.ListCtrlAutoWidthMixin,
                     listctrl.ColumnSorterMixin):
 
@@ -446,7 +454,7 @@
 
         self.filter = Filter(gui, xrc.XRCCTRL(self.gui.frame, 'filter_panel'))
         self.columns = columns.create_default_columns()
-        self.SetImageList(self.gui.small_palette_images, wx.IMAGE_LIST_SMALL)
+        self.SetImageList(self.gui.tiny_palette_images, wx.IMAGE_LIST_SMALL)
 
         listctrl.ListCtrlAutoWidthMixin.__init__(self)
         self.initColumnSorter(len(self.columns))
@@ -456,6 +464,7 @@
 
         self.SortListItems(0, 1)
 
+        self.suppress_select_event = False
         self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.onSelectChange)
         self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.onSelectChange)
         self.Bind(wx.EVT_LIST_ITEM_FOCUSED, self.onSelectChange)
@@ -464,6 +473,8 @@
         self.select_timer.Bind(wx.EVT_TIMER, self.onSelectTimeout)
 
     def onSelectChange(self, event):
+        if self.suppress_select_event:
+            return
         self.select_timer.Stop()
         self.select_timer.Start(300, wx.TIMER_ONE_SHOT)
 
@@ -479,6 +490,36 @@
             item = self.GetNextSelected(item)
         self.gui.book.onSelect(selected)
 
+    def selectDirectives(self, selected):
+        """Selects a specific set of directives"""
+        self.suppress_select_event = True
+        try:
+            d = {}
+            for dir in selected:
+                d[dir] = True
+            for i, directive_index in enumerate(self.indexes):
+                dir = self.directives[directive_index]
+                want_sel = d.has_key(dir)
+                flag = wx.LIST_STATE_SELECTED
+                state = self.GetItemState(i, flag)
+                if want_sel and not state:
+                    self.SetItemState(i, flag, flag)
+                elif not want_sel and state:
+                    self.SetItemState(i, 0, flag)
+            self.gui.book.onSelect(selected)
+        finally:
+            self.suppress_select_event = False
+
+    def ensureDirectiveVisible(self, directive):
+        try:
+            directive_index = self.directives.index(directive)
+            item = self.indexes.index(directive_index)
+        except ValueError:
+            # Not in list
+            return
+        else:
+            self.EnsureVisible(item)
+
     def populate(self):
         self.itemDataMap = {}
 
@@ -523,8 +564,8 @@
         return self
 
     def GetSortImages(self):
-        return (self.gui.small_palette_images['sort_up'],
-                self.gui.small_palette_images['sort_down'])
+        return (self.gui.tiny_palette_images['sort_up'],
+                self.gui.tiny_palette_images['sort_down'])
 
     def SortItems(self, sorter=None):
         """A SortItem implementation that works with virtual lists.

Modified: z3/zopejam/trunk/src/zopejam/propbook.py
==============================================================================
--- z3/zopejam/trunk/src/zopejam/propbook.py	(original)
+++ z3/zopejam/trunk/src/zopejam/propbook.py	Thu Jul 21 17:00:40 2005
@@ -29,29 +29,132 @@
         sizer = wx.BoxSizer(wx.VERTICAL)
         self.grid_page.SetSizer(sizer)
         self.notebook.AddPage(self.grid_page, "Grid")
-        self.grid_table = PropertyGridTable()
+        self.pgrid = PropertyGrid(self.gui, self.grid_page)
 
         self.source_page = wx.Panel(self.notebook)
         self.notebook.AddPage(self.source_page, "Source")
 
     def onSelect(self, directives):
-        self.grid_page.DestroyChildren()
-        sizer = self.grid_page.GetSizer()
+        self.pgrid.onSelect(directives)
+
+
+class PropertyGrid:
+
+    def __init__(self, gui, panel):
+        self.gui = gui
+        self.panel = panel
+        self.table = PropertyGridTable()
+        self.next_resize_column = None
+        self.resize_timer = wx.Timer()
+        self.resize_timer.Bind(wx.EVT_TIMER, self.resizeOneColumn)
+        self.grid = None
+        
+    def onSelect(self, directives):
+        self.panel.DestroyChildren()
+        sizer = self.panel.GetSizer()
         if directives:
             # Display the grid
-            self.grid_table.populate(directives)
-            self.grid = wx.grid.Grid(self.grid_page, -1)
-            self.grid.SetTable(self.grid_table)
-            if len(directives) < 50:
-                self.grid.AutoSizeColumns(setAsMin=False)
-            # else resizing would take a while.
+            self.table.populate(directives)
+            self.grid = wx.grid.Grid(self.panel, -1)
+            self.grid.SetTable(self.table)
+            self.resizeColumns()
             sizer.Add(self.grid, proportion=1, flag=wx.EXPAND)
+            self.grid.Bind(wx.grid.EVT_GRID_CELL_RIGHT_CLICK,
+                           self.onRightClickCell)
+            self.grid.Bind(wx.grid.EVT_GRID_LABEL_RIGHT_CLICK,
+                           self.onRightClickLabel)
+            self.grid.Bind(wx.grid.EVT_GRID_SELECT_CELL,
+                           self.onSelectCell)
         else:
             label = wx.StaticText(
-                self.grid_page, -1, "No directives selected.")
+                self.panel, -1, "No directives selected.")
             sizer.Add(label, flag=wx.EXPAND|wx.ALL, border=4)
-        self.grid_page.Layout()
-            
+        self.panel.Layout()
+
+    def resizeColumns(self):
+        if self.grid.GetNumberRows() < 50:
+            self.grid.AutoSizeColumns(setAsMin=False)
+        else:
+            # resize one column at a time.
+            self.next_resize_column = 0
+            self.resize_timer.Start(100, oneShot=True)
+
+    def resizeOneColumn(self, event):
+        cols = self.grid.GetNumberCols()
+        if self.next_resize_column < cols:
+            self.grid.AutoSizeColumn(self.next_resize_column, setAsMin=False)
+            self.panel.Layout()
+            self.grid.ForceRefresh()
+            self.next_resize_column += 1
+            if self.next_resize_column < cols:
+                self.resize_timer.Start(100, oneShot=True)
+
+    def onRightClickCell(self, event):
+        if not self.grid.IsInSelection(event.GetRow(), event.GetCol()):
+            self.grid.SetGridCursor(event.GetRow(), event.GetCol())
+            self.grid.SelectBlock(
+                event.GetRow(), event.GetCol(),
+                event.GetRow(), event.GetCol(),
+                addToSelected=False)
+        menu = self.gui.resources.LoadMenu('grid_popup')
+        for name in ['show_selected', 'resize', 'cut',
+                     'copy', 'paste', 'clear']:
+            id = xrc.XRCID(name)
+            menu.Bind(wx.EVT_MENU, getattr(self, 'on_menu_%s' % name), id=id)
+        self.grid.PopupMenu(menu, event.GetPosition())
+        menu.Destroy()
+
+    def onRightClickLabel(self, event):
+        row = event.GetRow()
+        if row < 0:
+            return
+        if not self.grid.IsInSelection(event.GetRow(), 0):
+            self.grid.SelectRow(row)
+        menu = wx.Menu()
+        menu.Append(xrc.XRCID('show_selected'), "&Show selected directive(s)")
+        for name in ['show_selected']:
+            id = xrc.XRCID(name)
+            menu.Bind(wx.EVT_MENU, getattr(self, 'on_menu_%s' % name), id=id)
+        self.grid.PopupMenu(menu, event.GetPosition())
+        menu.Destroy()
+
+    def onSelectCell(self, event):
+        directive = self.table.directives[event.GetRow()]
+        self.gui.ensureDirectiveVisible(directive)
+        event.Skip()
+
+    def on_menu_show_selected(self, event):
+        # Make a dictionary containing all rows with anything selected
+        rows = {}
+        for (top, left), (bottom, right) in zip(
+            self.grid.GetSelectionBlockTopLeft(),
+            self.grid.GetSelectionBlockBottomRight()):
+            for row in range(top, bottom + 1):
+                rows[row] = True
+        for row, col in self.grid.GetSelectedCells():
+            rows[row] = True
+        for row in self.grid.GetSelectedRows():
+            rows[row] = True
+
+        selected = []
+        for row in rows.keys():
+            selected.append(self.table.directives[row])
+        self.gui.selectDirectives(selected)
+
+    def on_menu_resize(self, event):
+        self.resizeColumns()
+
+    def on_menu_cut(self, event):
+        pass
+
+    def on_menu_copy(self, event):
+        pass
+
+    def on_menu_paste(self, event):
+        pass
+
+    def on_menu_clear(self, event):
+        pass
 
 
 class PropertyGridTable(wx.grid.PyGridTableBase):

Modified: z3/zopejam/trunk/src/zopejam/resources.xrc
==============================================================================
--- z3/zopejam/trunk/src/zopejam/resources.xrc	(original)
+++ z3/zopejam/trunk/src/zopejam/resources.xrc	Thu Jul 21 17:00:40 2005
@@ -733,4 +733,34 @@
     </object>
     <bg>#000000</bg>
   </object>
+  <object class="wxMenu" name="grid_popup">
+    <label></label>
+    <object class="wxMenuItem" name="show_selected">
+      <label>&amp;Show selected directive(s)</label>
+    </object>
+    <object class="wxMenuItem" name="resize">
+      <label>&amp;Resize columns</label>
+    </object>
+    <object class="separator"/>
+    <object class="wxMenuItem" name="cut">
+      <label>Cut</label>
+      <bitmap>icons/menu/editcut.png</bitmap>
+      <accel>Ctrl+X</accel>
+    </object>
+    <object class="wxMenuItem" name="copy">
+      <label>&amp;Copy</label>
+      <bitmap>icons/menu/editcopy.png</bitmap>
+      <accel>Ctrl+C</accel>
+    </object>
+    <object class="wxMenuItem" name="paste">
+      <label>&amp;Paste</label>
+      <bitmap>icons/menu/editpaste.png</bitmap>
+      <accel>Ctrl+V</accel>
+    </object>
+    <object class="wxMenuItem" name="clear">
+      <label>C&amp;lear</label>
+      <bitmap>icons/menu/editdelete.png</bitmap>
+      <accel>Ctrl+D</accel>
+    </object>
+  </object>
 </resource>


More information about the z3-checkins mailing list