[GRASS-SVN] r29502 - grass/trunk/gui/wxpython/gui_modules
svn_grass at osgeo.org
svn_grass at osgeo.org
Tue Dec 25 14:33:10 EST 2007
Author: martinl
Date: 2007-12-25 14:33:10 -0500 (Tue, 25 Dec 2007)
New Revision: 29502
Modified:
grass/trunk/gui/wxpython/gui_modules/dbm.py
Log:
wxGUI/Attribute Table Manager: Avoid duplicated arrow symbol in column header when sorting items. Use ScrolledPanel in dialog for editing/inserting records. Other
minor fixes (typos).
Modified: grass/trunk/gui/wxpython/gui_modules/dbm.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/dbm.py 2007-12-24 15:37:59 UTC (rev 29501)
+++ grass/trunk/gui/wxpython/gui_modules/dbm.py 2007-12-25 19:33:10 UTC (rev 29502)
@@ -64,14 +64,13 @@
class VirtualAttributeList(wx.ListCtrl,
listmix.ListCtrlAutoWidthMixin,
listmix.ColumnSorterMixin):
- # listmix.TextEditMixin):
"""
Support virtual list class
"""
def __init__(self, parent, log, mapDBInfo, layer):
wx.ListCtrl.__init__(self, parent=parent, id=wx.ID_ANY,
style=wx.LC_REPORT | wx.LC_HRULES |
- wx.LC_VRULES | wx.LC_VIRTUAL)
+ wx.LC_VRULES | wx.LC_VIRTUAL | wx.LC_SORT_ASCENDING)
#
# initialize variables
@@ -101,15 +100,17 @@
(16,16)))
self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
- self.LoadData(layer)
-
+ keyColumn = self.LoadData(layer)
+
# setup mixins
listmix.ListCtrlAutoWidthMixin.__init__(self)
listmix.ColumnSorterMixin.__init__(self, len(self.columns))
- #listmix.TextEditMixin.__init__(self)
- # sort by cat by default
- self.SortListItems(col=0, ascending=1) # FIXME category column can be different
+ # sort item by category (id)
+ if keyColumn > -1:
+ self.SortListItems(col=keyColumn, ascending=1)
+ else:
+ self.SortListItems(col=0, ascending=1)
# events
self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
@@ -130,8 +131,11 @@
self.LoadData(self.layer)
def LoadData(self, layer, cols='*', where=''):
- """Load data into list"""
+ """Load data into list
+ Returns id of key column or -1 if key column is not displayed
+ """
+
# These two should probably be passed to init more cleanly
# setting the numbers of items = number of elements in the dictionary
self.itemDataMap = {}
@@ -158,8 +162,13 @@
keyId = columnNames.index(keyColumn)
i = 0
+ info = wx.ListItem()
+ info.m_mask = wx.LIST_MASK_TEXT | wx.LIST_MASK_IMAGE | wx.LIST_MASK_FORMAT
+ info.m_image = -1
+ info.m_format = 0
for column in columnNames:
- self.InsertColumn(col=i, heading=column)
+ info.m_text = column
+ self.InsertColumnInfo(i, info)
i += 1
if i >= 256:
@@ -231,6 +240,8 @@
self.SendSizeEvent()
+ return keyId
+
def OnItemSelected(self, event):
"""Item selected. Add item to selected cats..."""
# cat = int(self.GetItemText(event.m_itemIndex))
@@ -285,6 +296,17 @@
def OnColumnClick(self, event):
"""Column heading clicked -> sorting"""
self._col = event.GetColumn()
+
+ # FIXME
+ # This artificial code removes duplicated arrow symbol from
+ # column header, should be done automatically
+ for column in range(self.GetColumnCount()):
+ name = self.GetColumn(column).GetText()
+ width = self.GetColumnWidth(column)
+ self.DeleteColumn(column)
+ self.InsertColumn(column, name)
+ self.SetColumnWidth(column, width)
+
event.Skip()
def SortItems(self, sorter=cmp):
@@ -295,7 +317,7 @@
# redraw the list
self.Refresh()
-
+
def Sorter(self, key1, key2):
colName = self.GetColumn(self._col).GetText()
ascending = self._colSortFlag[self._col]
@@ -322,9 +344,6 @@
"""Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py"""
return (self.sm_dn, self.sm_up)
- def SetVirtualData(self, row, col, data):
- pass
-
class AttributeManager(wx.Frame):
"""
GRASS Attribute manager main window
@@ -1454,15 +1473,15 @@
def OnApplySqlStatement(self, event):
"""Apply simple/advanced sql statement"""
+ keyColumn = -1 # index of key column
+ listWin = self.FindWindowById(self.layerPage[self.layer]['data'])
if self.FindWindowById(self.layerPage[self.layer]['simple']).GetValue():
# simple sql statement
where = self.FindWindowById(self.layerPage[self.layer]['where']).GetValue().strip()
if len(where) > 0:
- self.FindWindowById(self.layerPage[self.layer]['data']).LoadData( \
- self.layer, where=where)
+ keyColumn = listWin.LoadData(self.layer, where=where)
else:
- self.FindWindowById(self.layerPage[self.layer]['data']).LoadData( \
- self.layer)
+ keyColumn = listWin.LoadData(self.layer)
else:
# advanced sql statement
valid, cols, where = \
@@ -1473,9 +1492,14 @@
(valid, cols, where))
if valid is True:
- self.FindWindowById(self.layerPage[self.layer]['data']).LoadData( \
- self.layer, cols=cols, where=where)
+ keyColumn = listWin.LoadData(self.layer, cols=cols, where=where)
+ # sort by key column
+ if keyColumn > -1:
+ listWin.SortListItems(col=keyColumn, ascending=1)
+ else:
+ listWin.SortListItems(col=0, ascending=1)
+
# update statusbar
self.log.write(_("Number of loaded records: %d") % \
self.FindWindowById(self.layerPage[self.layer]['data']).GetItemCount())
@@ -3132,10 +3156,11 @@
"""
wx.Dialog.__init__(self, parent, id, title, style=style)
- self.panel = wx.Panel(parent=self, id=wx.ID_ANY)
-
- self.btnCancel = wx.Button(self.panel, wx.ID_CANCEL)
- self.btnSubmit = wx.Button(self.panel, wx.ID_OK)
+ self.panel = scrolled.ScrolledPanel(parent=self, id=wx.ID_ANY,
+ style=wx.TAB_TRAVERSAL)
+
+ self.btnCancel = wx.Button(self, wx.ID_CANCEL)
+ self.btnSubmit = wx.Button(self, wx.ID_OK)
self.btnSubmit.SetDefault()
self.widgets = []
@@ -3143,7 +3168,7 @@
for column, value in data:
label = wx.StaticText(parent=self.panel, id=wx.ID_ANY,
label=column + ":")
- value = wx.Texttrl(parent=self.panel, id=wx.ID_ANY,
+ value = wx.TextCtrl(parent=self.panel, id=wx.ID_ANY,
value=value, size=(250, -1))
if keyEditable[0] > -1: # id given
if keyEditable[0] == id:
@@ -3152,9 +3177,15 @@
value.GetId()))
id += 1
+
self.__Layout()
- self.SetMinSize(self.GetSize())
+ winSize = self.GetSize()
+ # fix height of window frame if needed
+ if winSize[1] > 480:
+ winSize[1] = 480
+ self.SetSize(winSize)
+ self.SetMinSize(winSize)
def __Layout(self):
"""Do layout"""
@@ -3173,21 +3204,25 @@
dataSizer.Add(value, proportion=0,
flag=wx.EXPAND)
+ self.panel.SetSizer(dataSizer)
+ self.panel.SetAutoLayout(1)
+ self.panel.SetupScrolling(scroll_x=False)
+
# buttons
btnSizer = wx.StdDialogButtonSizer()
btnSizer.AddButton(self.btnCancel)
btnSizer.AddButton(self.btnSubmit)
btnSizer.Realize()
- sizer.Add(item=dataSizer, proportion=1,
+ sizer.Add(item=self.panel, proportion=1,
flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
sizer.Add(item=btnSizer, proportion=0,
flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
-
- self.panel.SetSizer(sizer)
- sizer.Fit(self)
+ self.SetSizer(sizer)
+ self.SetAutoLayout(1)
+
def GetValues(self, columns=None):
"""Return list of values (as string).
More information about the grass-commit
mailing list