""" @package gmodeler.preferences @brief wxGUI Graphical Modeler - preferences Classes: - preferences::PreferencesDialog - preferences::PropertiesDialog (C) 2010-2013 by the GRASS Development Team This program is free software under the GNU General Public License (>=v2). Read the file COPYING that comes with GRASS for details. @author Martin Landa """ import wx import wx.lib.colourselect as csel from core import globalvar from gui_core.preferences import PreferencesBaseDialog from core.settings import UserSettings from gui_core.wrap import SpinCtrl, Button, StaticText, \ StaticBox, TextCtrl class PreferencesDialog(PreferencesBaseDialog): """User preferences dialog""" def __init__(self, parent, giface, settings=UserSettings, title=_("Modeler settings")): PreferencesBaseDialog.__init__( self, parent=parent, giface=giface, title=title, settings=settings) # create notebook pages self._createGeneralPage(self.notebook) self._createActionPage(self.notebook) self._createDataPage(self.notebook) self._createLoopPage(self.notebook) self._createCommentPage(self.notebook) self.SetMinSize(self.GetBestSize()) self.SetSize(self.size) def _createGeneralPage(self, notebook): """Create notebook page for action settings""" panel = wx.Panel(parent=notebook, id=wx.ID_ANY) notebook.AddPage(page=panel, text=_("General")) # colors border = wx.BoxSizer(wx.VERTICAL) box = StaticBox(parent=panel, id=wx.ID_ANY, label=" %s " % _("Item properties")) sizer = wx.StaticBoxSizer(box, wx.VERTICAL) gridSizer = wx.GridBagSizer(hgap=3, vgap=3) row = 0 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Disabled:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) rColor = csel.ColourSelect( parent=panel, id=wx.ID_ANY, colour=self.settings.Get( group='modeler', key='disabled', subkey='color'), size=globalvar.DIALOG_COLOR_SIZE) rColor.SetName('GetColour') self.winId['modeler:disabled:color'] = rColor.GetId() gridSizer.Add(rColor, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) gridSizer.AddGrowableCol(0) sizer.Add( gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5) border.Add(sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3) panel.SetSizer(border) return panel def _createActionPage(self, notebook): """Create notebook page for action settings""" panel = wx.Panel(parent=notebook, id=wx.ID_ANY) notebook.AddPage(page=panel, text=_("Command")) # colors border = wx.BoxSizer(wx.VERTICAL) box = StaticBox(parent=panel, id=wx.ID_ANY, label=" %s " % _("Color")) sizer = wx.StaticBoxSizer(box, wx.VERTICAL) gridSizer = wx.GridBagSizer(hgap=3, vgap=3) row = 0 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Valid:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) vColor = csel.ColourSelect( parent=panel, id=wx.ID_ANY, colour=self.settings.Get( group='modeler', key='action', subkey=( 'color', 'valid')), size=globalvar.DIALOG_COLOR_SIZE) vColor.SetName('GetColour') self.winId['modeler:action:color:valid'] = vColor.GetId() gridSizer.Add(vColor, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) row += 1 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Invalid:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) iColor = csel.ColourSelect( parent=panel, id=wx.ID_ANY, colour=self.settings.Get( group='modeler', key='action', subkey=( 'color', 'invalid')), size=globalvar.DIALOG_COLOR_SIZE) iColor.SetName('GetColour') self.winId['modeler:action:color:invalid'] = iColor.GetId() gridSizer.Add(iColor, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) row += 1 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Running:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) rColor = csel.ColourSelect( parent=panel, id=wx.ID_ANY, colour=self.settings.Get( group='modeler', key='action', subkey=( 'color', 'running')), size=globalvar.DIALOG_COLOR_SIZE) rColor.SetName('GetColour') self.winId['modeler:action:color:running'] = rColor.GetId() gridSizer.Add(rColor, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) gridSizer.AddGrowableCol(0) sizer.Add( gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5) border.Add(sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3) # size box = StaticBox(parent=panel, id=wx.ID_ANY, label=" %s " % _("Shape size")) sizer = wx.StaticBoxSizer(box, wx.VERTICAL) gridSizer = wx.GridBagSizer(hgap=3, vgap=3) row = 0 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Width:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) width = SpinCtrl( parent=panel, id=wx.ID_ANY, min=0, max=500, initial=self.settings.Get( group='modeler', key='action', subkey=( 'size', 'width'))) width.SetName('GetValue') self.winId['modeler:action:size:width'] = width.GetId() gridSizer.Add(width, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) row += 1 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Height:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) height = SpinCtrl( parent=panel, id=wx.ID_ANY, min=0, max=500, initial=self.settings.Get( group='modeler', key='action', subkey=( 'size', 'height'))) height.SetName('GetValue') self.winId['modeler:action:size:height'] = height.GetId() gridSizer.Add(height, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) gridSizer.AddGrowableCol(0) sizer.Add( gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5) border.Add(sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3) panel.SetSizer(border) return panel def _createDataPage(self, notebook): """Create notebook page for data settings""" panel = wx.Panel(parent=notebook, id=wx.ID_ANY) notebook.AddPage(page=panel, text=_("Data")) # colors border = wx.BoxSizer(wx.VERTICAL) box = StaticBox(parent=panel, id=wx.ID_ANY, label=" %s " % _("Type")) sizer = wx.StaticBoxSizer(box, wx.VERTICAL) gridSizer = wx.GridBagSizer(hgap=3, vgap=3) row = 0 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Raster:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) rColor = csel.ColourSelect( parent=panel, id=wx.ID_ANY, colour=self.settings.Get( group='modeler', key='data', subkey=( 'color', 'raster')), size=globalvar.DIALOG_COLOR_SIZE) rColor.SetName('GetColour') self.winId['modeler:data:color:raster'] = rColor.GetId() gridSizer.Add(rColor, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) row += 1 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("3D raster:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) r3Color = csel.ColourSelect( parent=panel, id=wx.ID_ANY, colour=self.settings.Get( group='modeler', key='data', subkey=( 'color', 'raster3d')), size=globalvar.DIALOG_COLOR_SIZE) r3Color.SetName('GetColour') self.winId['modeler:data:color:raster3d'] = r3Color.GetId() gridSizer.Add(r3Color, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) row += 1 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Vector:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) vColor = csel.ColourSelect( parent=panel, id=wx.ID_ANY, colour=self.settings.Get( group='modeler', key='data', subkey=( 'color', 'vector')), size=globalvar.DIALOG_COLOR_SIZE) vColor.SetName('GetColour') self.winId['modeler:data:color:vector'] = vColor.GetId() gridSizer.Add(vColor, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) row += 1 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Table:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) tColor = csel.ColourSelect( parent=panel, id=wx.ID_ANY, colour=self.settings.Get( group='modeler', key='data', subkey=( 'color', 'dbtable')), size=globalvar.DIALOG_COLOR_SIZE) tColor.SetName('GetColour') self.winId['modeler:data:color:dbtable'] = tColor.GetId() gridSizer.Add(tColor, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) gridSizer.AddGrowableCol(0) sizer.Add( gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5) border.Add(sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3) # size box = StaticBox(parent=panel, id=wx.ID_ANY, label=" %s " % _("Shape size")) sizer = wx.StaticBoxSizer(box, wx.VERTICAL) gridSizer = wx.GridBagSizer(hgap=3, vgap=3) row = 0 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Width:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) width = SpinCtrl( parent=panel, id=wx.ID_ANY, min=0, max=500, initial=self.settings.Get( group='modeler', key='data', subkey=( 'size', 'width'))) width.SetName('GetValue') self.winId['modeler:data:size:width'] = width.GetId() gridSizer.Add(width, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) row += 1 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Height:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) height = SpinCtrl( parent=panel, id=wx.ID_ANY, min=0, max=500, initial=self.settings.Get( group='modeler', key='data', subkey=( 'size', 'height'))) height.SetName('GetValue') self.winId['modeler:data:size:height'] = height.GetId() gridSizer.Add(height, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) gridSizer.AddGrowableCol(0) sizer.Add( gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5) border.Add(sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3) panel.SetSizer(border) return panel def _createLoopPage(self, notebook): """Create notebook page for loop settings""" panel = wx.Panel(parent=notebook, id=wx.ID_ANY) notebook.AddPage(page=panel, text=_("Loop")) # colors border = wx.BoxSizer(wx.VERTICAL) box = StaticBox(parent=panel, id=wx.ID_ANY, label=" %s " % _("Color")) sizer = wx.StaticBoxSizer(box, wx.VERTICAL) gridSizer = wx.GridBagSizer(hgap=3, vgap=3) row = 0 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Valid:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) vColor = csel.ColourSelect( parent=panel, id=wx.ID_ANY, colour=self.settings.Get( group='modeler', key='loop', subkey=( 'color', 'valid')), size=globalvar.DIALOG_COLOR_SIZE) vColor.SetName('GetColour') self.winId['modeler:loop:color:valid'] = vColor.GetId() gridSizer.Add(vColor, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) gridSizer.AddGrowableCol(0) sizer.Add( gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5) border.Add(sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3) # size box = StaticBox(parent=panel, id=wx.ID_ANY, label=" %s " % _("Shape size")) sizer = wx.StaticBoxSizer(box, wx.VERTICAL) gridSizer = wx.GridBagSizer(hgap=3, vgap=3) row = 0 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Width:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) width = SpinCtrl( parent=panel, id=wx.ID_ANY, min=0, max=500, initial=self.settings.Get( group='modeler', key='loop', subkey=( 'size', 'width'))) width.SetName('GetValue') self.winId['modeler:loop:size:width'] = width.GetId() gridSizer.Add(width, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) row += 1 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Height:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) height = SpinCtrl( parent=panel, id=wx.ID_ANY, min=0, max=500, initial=self.settings.Get( group='modeler', key='loop', subkey=( 'size', 'height'))) height.SetName('GetValue') self.winId['modeler:loop:size:height'] = height.GetId() gridSizer.Add(height, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) gridSizer.AddGrowableCol(0) sizer.Add( gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5) border.Add(sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3) panel.SetSizer(border) return panel def _createCommentPage(self, notebook): """Create notebook page for comment settings""" panel = wx.Panel(parent=notebook, id=wx.ID_ANY) notebook.AddPage(page=panel, text=_("Comment")) # colors border = wx.BoxSizer(wx.VERTICAL) box = StaticBox(parent=panel, id=wx.ID_ANY, label=" %s " % _("Color")) sizer = wx.StaticBoxSizer(box, wx.VERTICAL) gridSizer = wx.GridBagSizer(hgap=3, vgap=3) row = 0 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Valid:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) vColor = csel.ColourSelect( parent=panel, id=wx.ID_ANY, colour=self.settings.Get( group='modeler', key='comment', subkey='color'), size=globalvar.DIALOG_COLOR_SIZE) vColor.SetName('GetColour') self.winId['modeler:comment:color'] = vColor.GetId() gridSizer.Add(vColor, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) gridSizer.AddGrowableCol(0) sizer.Add( gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5) border.Add(sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3) # size box = StaticBox(parent=panel, id=wx.ID_ANY, label=" %s " % _("Shape size")) sizer = wx.StaticBoxSizer(box, wx.VERTICAL) gridSizer = wx.GridBagSizer(hgap=3, vgap=3) row = 0 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Width:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) width = SpinCtrl( parent=panel, id=wx.ID_ANY, min=0, max=500, initial=self.settings.Get( group='modeler', key='comment', subkey=( 'size', 'width'))) width.SetName('GetValue') self.winId['modeler:comment:size:width'] = width.GetId() gridSizer.Add(width, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) row += 1 gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY, label=_("Height:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 0)) height = SpinCtrl( parent=panel, id=wx.ID_ANY, min=0, max=500, initial=self.settings.Get( group='modeler', key='comment', subkey=( 'size', 'height'))) height.SetName('GetValue') self.winId['modeler:comment:size:height'] = height.GetId() gridSizer.Add(height, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, pos=(row, 1)) gridSizer.AddGrowableCol(0) sizer.Add( gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5) border.Add(sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3) panel.SetSizer(border) return panel def OnApply(self, event): """Button 'Apply' pressed""" PreferencesBaseDialog.OnApply(self, event) self.parent.GetModel().Update() self.parent.GetCanvas().Refresh() def OnSave(self, event): """Button 'Save' pressed""" PreferencesBaseDialog.OnSave(self, event) self.parent.GetModel().Update() self.parent.GetCanvas().Refresh() class PropertiesDialog(wx.Dialog): """Model properties dialog """ def __init__(self, parent, id=wx.ID_ANY, title=_('Model properties'), size=(350, 400), style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER): wx.Dialog.__init__(self, parent, id, title, size=size, style=style) self.metaBox = StaticBox(parent=self, id=wx.ID_ANY, label=" %s " % _("Metadata")) self.cmdBox = StaticBox(parent=self, id=wx.ID_ANY, label=" %s " % _("Commands")) self.name = TextCtrl(parent=self, id=wx.ID_ANY, size=(300, 25)) self.desc = TextCtrl(parent=self, id=wx.ID_ANY, style=wx.TE_MULTILINE, size=(300, 50)) self.author = TextCtrl(parent=self, id=wx.ID_ANY, size=(300, 25)) # commands self.overwrite = wx.CheckBox(parent=self, id=wx.ID_ANY, label=_( "Allow output files to overwrite existing files")) self.overwrite.SetValue( UserSettings.Get( group='cmd', key='overwrite', subkey='enabled')) # buttons self.btnOk = Button(self, wx.ID_OK) self.btnCancel = Button(self, wx.ID_CANCEL) self.btnOk.SetDefault() self.btnOk.SetToolTip(_("Apply properties")) self.btnOk.SetDefault() self.btnCancel.SetToolTip(_("Close dialog and ignore changes")) self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) self._layout() def _layout(self): metaSizer = wx.StaticBoxSizer(self.metaBox, wx.VERTICAL) gridSizer = wx.GridBagSizer(hgap=3, vgap=3) gridSizer.Add(StaticText(parent=self, id=wx.ID_ANY, label=_("Name:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(0, 0)) gridSizer.Add(self.name, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, pos=(0, 1)) gridSizer.Add(StaticText(parent=self, id=wx.ID_ANY, label=_("Description:")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(1, 0)) gridSizer.Add(self.desc, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, pos=(1, 1)) gridSizer.Add(StaticText(parent=self, id=wx.ID_ANY, label=_("Author(s):")), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, pos=(2, 0)) gridSizer.Add(self.author, flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, pos=(2, 1)) gridSizer.AddGrowableCol(1) gridSizer.AddGrowableRow(1) metaSizer.Add(gridSizer, proportion=1, flag=wx.EXPAND) cmdSizer = wx.StaticBoxSizer(self.cmdBox, wx.VERTICAL) cmdSizer.Add(self.overwrite, flag=wx.EXPAND | wx.ALL, border=3) btnStdSizer = wx.StdDialogButtonSizer() btnStdSizer.AddButton(self.btnCancel) btnStdSizer.AddButton(self.btnOk) btnStdSizer.Realize() mainSizer = wx.BoxSizer(wx.VERTICAL) mainSizer.Add(metaSizer, proportion=1, flag=wx.EXPAND | wx.ALL, border=5) mainSizer.Add( cmdSizer, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, border=5) mainSizer.Add(btnStdSizer, proportion=0, flag=wx.EXPAND | wx.ALL, border=5) self.SetSizer(mainSizer) mainSizer.Fit(self) def OnCloseWindow(self, event): self.Hide() def GetValues(self): """Get values""" return {'name': self.name.GetValue(), 'description': self.desc.GetValue(), 'author': self.author.GetValue(), 'overwrite': self.overwrite.IsChecked()} def Init(self, prop): """Initialize dialog""" self.name.SetValue(prop['name']) self.desc.SetValue(prop['description']) self.author.SetValue(prop['author']) if 'overwrite' in prop: self.overwrite.SetValue(prop['overwrite'])