diff -r 3f92a5e18804 -r 5024d42e1050 RessourceEditor.py --- a/RessourceEditor.py Thu Sep 22 15:33:31 2011 +0200 +++ b/RessourceEditor.py Fri Sep 23 20:07:40 2011 +0200 @@ -25,6 +25,7 @@ import wx import wx.grid +from dialogs import DurationEditorDialog #------------------------------------------------------------------------------- # Configuration Editor class @@ -214,10 +215,13 @@ renderer = None colname = self.GetColLabelValue(col, False) grid.SetReadOnly(row, col, False) - if colname in ["Name", "Interval"]: + if colname == "Name": editor = wx.grid.GridCellTextEditor() renderer = wx.grid.GridCellStringRenderer() - if colname == "Interval" and self.GetValueByName(row, "Triggering") != "Cyclic": + elif colname == "Interval": + editor = DurationCellEditor(self) + renderer = wx.grid.GridCellStringRenderer() + if self.GetValueByName(row, "Triggering") != "Cyclic": grid.SetReadOnly(row, col, True) elif colname == "Single": editor = wx.grid.GridCellChoiceEditor() @@ -464,7 +468,7 @@ self.TasksDefaultValue = {"Name" : "", "Triggering" : "", "Single" : "", "Interval" : "", "Priority" : 0} self.TasksTable = ResourceTable(self, [], GetTasksTableColnames()) self.TasksTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT]) - self.TasksTable.SetColSizes([200, 100, 100, 100, 100]) + self.TasksTable.SetColSizes([200, 100, 100, 150, 100]) self.TasksGrid.SetTable(self.TasksTable) self.TasksGrid.SetRowLabelSize(0) self.TasksTable.ResetView(self.TasksGrid) @@ -538,13 +542,13 @@ task_select = min(task_select, len(tasks) - 1) col = self.TasksGrid.GetGridCursorCol() self.TasksGrid.SetGridCursor(task_select, col) - self.TasksGrid.MakeCellVisible(instance_select, col) + self.TasksGrid.MakeCellVisible(task_select, col) self.TasksGrid.SetFocus() if instance_select is not None and len(instances) > 0: if instance_select == -1: instance_select = len(instances) - 1 else: - task_select = min(task_select, len(instances) - 1) + instance_select = min(instance_select, len(instances) - 1) col = self.InstancesGrid.GetGridCursorCol() self.InstancesGrid.SetGridCursor(instance_select, col) self.InstancesGrid.MakeCellVisible(instance_select, col) @@ -678,4 +682,122 @@ self.TasksTable.AddError(infos[1:]) elif infos[0] == "instance": self.InstancesTable.AddError(infos[1:]) - + + +class DurationCellControl(wx.PyControl): + + def _init_coll_MainSizer_Items(self, parent): + parent.AddWindow(self.Duration, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.EditButton, 0, border=0, flag=wx.GROW) + + def _init_coll_MainSizer_Growables(self, parent): + parent.AddGrowableCol(0) + parent.AddGrowableRow(0) + + def _init_sizers(self): + self.MainSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0) + + self._init_coll_MainSizer_Items(self.MainSizer) + self._init_coll_MainSizer_Growables(self.MainSizer) + + self.SetSizer(self.MainSizer) + + def _init_ctrls(self, prnt): + wx.Control.__init__(self, id=-1, + name='DurationCellControl', parent=prnt, + size=wx.DefaultSize, style=0) + + # create location text control + self.Duration = wx.TextCtrl(id=-1, name='Duration', parent=self, + pos=wx.Point(0, 0), size=wx.Size(0, 0), style=wx.TE_PROCESS_ENTER) + self.Duration.Bind(wx.EVT_KEY_DOWN, self.OnDurationChar) + + # create browse button + self.EditButton = wx.Button(id=-1, label='...', + name='EditButton', parent=self, pos=wx.Point(0, 0), + size=wx.Size(30, 0), style=0) + self.EditButton.Bind(wx.EVT_BUTTON, self.OnEditButtonClick) + + self.Bind(wx.EVT_SIZE, self.OnSize) + + self._init_sizers() + + ''' + Custom cell editor control with a text box and a button that launches + the DurationEditorDialog. + ''' + def __init__(self, parent): + self._init_ctrls(parent) + + def SetValue(self, value): + self.Duration.SetValue(value) + + def GetValue(self): + return self.Duration.GetValue() + + def OnSize(self, event): + self.Layout() + + def OnEditButtonClick(self, event): + # pop up the Duration Editor dialog + dialog = DurationEditorDialog(self) + dialog.SetDuration(self.Duration.GetValue()) + if dialog.ShowModal() == wx.ID_OK: + # set the duration + self.Duration.SetValue(dialog.GetDuration()) + + dialog.Destroy() + + self.Duration.SetFocus() + + def OnDurationChar(self, event): + keycode = event.GetKeyCode() + if keycode == wx.WXK_RETURN or keycode == wx.WXK_TAB: + self.Parent.Parent.ProcessEvent(event) + self.Parent.Parent.SetFocus() + else: + event.Skip() + + def SetInsertionPoint(self, i): + self.Duration.SetInsertionPoint(i) + + def SetFocus(self): + self.Duration.SetFocus() + +class DurationCellEditor(wx.grid.PyGridCellEditor): + ''' + Grid cell editor that uses DurationCellControl to display an edit button. + ''' + def __init__(self, table): + wx.grid.PyGridCellEditor.__init__(self) + self.Table = table + + def __del__(self): + self.CellControl = None + + def Create(self, parent, id, evt_handler): + self.CellControl = DurationCellControl(parent) + self.SetControl(self.CellControl) + if evt_handler: + self.CellControl.PushEventHandler(evt_handler) + + def BeginEdit(self, row, col, grid): + self.CellControl.SetValue(self.Table.GetValueByName(row, 'Interval')) + self.CellControl.SetFocus() + + def EndEdit(self, row, col, grid): + duration = self.CellControl.GetValue() + old_duration = self.Table.GetValueByName(row, 'Interval') + if duration != old_duration: + self.Table.SetValueByName(row, 'Interval', duration) + return True + return False + + def SetSize(self, rect): + self.CellControl.SetDimensions(rect.x + 1, rect.y, + rect.width, rect.height, + wx.SIZE_ALLOW_MINUS_ONE) + + def Clone(self): + return DurationCellEditor(self.Table) +