[GRASS-SVN] r58590 - grass/trunk/doc/gui/wxpython/example
svn_grass at osgeo.org
svn_grass at osgeo.org
Thu Jan 2 19:39:48 PST 2014
Author: annakrat
Date: 2014-01-02 19:39:48 -0800 (Thu, 02 Jan 2014)
New Revision: 58590
Added:
grass/trunk/doc/gui/wxpython/example/Makefile
grass/trunk/doc/gui/wxpython/example/g.gui.example.html
grass/trunk/doc/gui/wxpython/example/g.gui.example.py
Removed:
grass/trunk/doc/gui/wxpython/example/wxGUI.example.html
Modified:
grass/trunk/doc/gui/wxpython/example/README
grass/trunk/doc/gui/wxpython/example/dialogs.py
grass/trunk/doc/gui/wxpython/example/frame.py
grass/trunk/doc/gui/wxpython/example/toolbars.py
Log:
wxGUI example application update to work with current gui
Added: grass/trunk/doc/gui/wxpython/example/Makefile
===================================================================
--- grass/trunk/doc/gui/wxpython/example/Makefile (rev 0)
+++ grass/trunk/doc/gui/wxpython/example/Makefile 2014-01-03 03:39:48 UTC (rev 58590)
@@ -0,0 +1,5 @@
+MODULE_TOPDIR = ../../..
+
+include $(MODULE_TOPDIR)/include/Make/GuiScript.make
+
+default: guiscript
Modified: grass/trunk/doc/gui/wxpython/example/README
===================================================================
--- grass/trunk/doc/gui/wxpython/example/README 2014-01-03 03:36:51 UTC (rev 58589)
+++ grass/trunk/doc/gui/wxpython/example/README 2014-01-03 03:39:48 UTC (rev 58590)
@@ -22,17 +22,8 @@
2. Copy directory ./doc/gui/wxpython/example to ./gui/wxpython/example
-3. Now you should be able to run Example Tool as a standalone
-application in GRASS environment. Start GRASS GIS and start application:
+3. Edit ./gui/wxpython/Makefile:
- > python ./gui/wxpython/example/frame.py
-
-If you want to add Example Tool in the compilation.
-
-4. Move file ./gui/wxpython/example/wxGUI.Example.html to ./gui/wxpython/docs/
-
-5. Edit ./gui/wxpython/Makefile:
-
SRCFILES := $(wildcard icons/*.* scripts/* xml/*) \
- $(wildcard core/* dbmgr/* gcp/* gmodeler/* ... \
+ $(wildcard core/* dbmgr/* example/* gcp/* gmodeler/* ... \
@@ -40,12 +31,18 @@
-PYDSTDIRS := $(patsubst %,$(ETCDIR)/%,core dbmgr gcp gmodeler ... \
+PYDSTDIRS := $(patsubst %,$(ETCDIR)/%,core dbmgr example gcp gmodeler ... \
-6. Run make (in ./gui/wxpython)
-
+4. Run make (in ./gui/wxpython)
+
+Now you can start the application by running
+
+$ g.gui.example
+
+from terminal or wxGUI command console. Try also g.gui.example --help.
+
If you want to access Example Tool from Layer Manager menu, there are
a few more things to be done.
-7. Edit ./gui/wxpython/xml/menudata.xml. Add following code to appropriate place:
+5. Edit ./gui/wxpython/xml/menudata.xml. Add following code to appropriate place:
<menuitem>
<label>Example</label>
@@ -54,22 +51,19 @@
<handler>OnExample</handler>
</menuitem>
-8. Add folowing event handler to class GMFrame in ./gui/wxpython/lmgr/frame.py:
+6. Add folowing event handler to class GMFrame in ./gui/wxpython/lmgr/frame.py:
def OnExample(self, event):
"""!Launch ExampleTool"""
- win = ExampleMapFrame(parent = self)
+ from example.frame import ExampleMapFrame
+ win = ExampleMapFrame(parent=self, giface=self._giface)
win.CentreOnScreen()
win.Show()
-
-and don't forget to insert following line at the beginning of the file:
- from example.frame import ExampleMapFrame
+7. Run make again.
-9. Run make again.
-
Note
----
Feel free to improve Example Tool or suggest possible improvements.
Modified: grass/trunk/doc/gui/wxpython/example/dialogs.py
===================================================================
--- grass/trunk/doc/gui/wxpython/example/dialogs.py 2014-01-03 03:36:51 UTC (rev 58589)
+++ grass/trunk/doc/gui/wxpython/example/dialogs.py 2014-01-03 03:39:48 UTC (rev 58590)
@@ -6,53 +6,54 @@
Classes:
- dialogs::ExampleMapDialog
-(C) 2006-2011 by the GRASS Development Team
+(C) 2011-2014 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.
- at author Anna Kratochvilova <kratochanna gmail.com>
+ at author Anna Petrasova <kratochanna gmail.com>
"""
import wx
-from core import globalvar
-from gui_core.dialogs import SimpleDialog, GroupDialog
-from gui_core import gselect
+from core import globalvar
+from gui_core.dialogs import SimpleDialog
+from gui_core import gselect
+from core.utils import _
+
class ExampleMapDialog(SimpleDialog):
"""!Dialog for adding raster map.
-
+
Dialog can be easily changed to enable to choose vector, imagery groups or other elements.
"""
- def __init__(self, parent, title = _("Choose raster map"), id = wx.ID_ANY):
+ def __init__(self, parent, title=_("Choose raster map")):
"""!Calls super class constructor.
-
+
@param parent gui parent
@param title dialog window title
@param id id
"""
SimpleDialog.__init__(self, parent, title)
-
+
# here is the place to determine element type
- self.element = gselect.Select(parent = self.panel, type = 'raster',
- size = globalvar.DIALOG_GSELECT_SIZE)
-
+ self.element = gselect.Select(parent=self.panel, type='raster',
+ size=globalvar.DIALOG_GSELECT_SIZE)
+
self._layout()
self.SetMinSize(self.GetSize())
def _layout(self):
"""!Do layout"""
- self.dataSizer.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
- label = _("Name of raster map:")),
- proportion = 0, flag = wx.ALL, border = 1)
- self.dataSizer.Add(self.element, proportion = 0,
- flag = wx.EXPAND | wx.ALL, border = 1)
+ self.dataSizer.Add(item=wx.StaticText(parent=self.panel,
+ label=_("Name of raster map:")),
+ proportion=0, flag=wx.ALL, border=1)
+ self.dataSizer.Add(self.element, proportion=0,
+ flag=wx.EXPAND | wx.ALL, border=1)
self.panel.SetSizer(self.sizer)
self.sizer.Fit(self)
-
+
def GetRasterMap(self):
"""!Returns selected raster map"""
return self.element.GetValue()
-
Modified: grass/trunk/doc/gui/wxpython/example/frame.py
===================================================================
--- grass/trunk/doc/gui/wxpython/example/frame.py 2014-01-03 03:36:51 UTC (rev 58589)
+++ grass/trunk/doc/gui/wxpython/example/frame.py 2014-01-03 03:39:48 UTC (rev 58590)
@@ -7,12 +7,12 @@
- frame::ExampleMapFrame
- frame::ExampleInfoTextManager
-(C) 2006-2011 by the GRASS Development Team
+(C) 2011-2014 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.
- at author Anna Kratochvilova <kratochanna gmail.com>
+ at author Anna Petrasova <kratochanna gmail.com>
"""
import os
@@ -24,16 +24,18 @@
sys.path.append(os.path.join(os.environ['GISBASE'], "etc", "gui", "wxpython"))
from gui_core.mapdisp import SingleMapFrame
-from mapdisp.mapwindow import BufferedWindow
+from mapwin.buffered import BufferedMapWindow
+from mapwin.base import MapWindowProperties
from mapdisp import statusbar as sb
from core.render import Map
from core.debug import Debug
-from core.gcmd import RunCommand
+from core.gcmd import RunCommand, GError
+from core.utils import _
-import grass.script as grass
+from grass.script import core as gcore
from toolbars import ExampleMapToolbar, ExampleMiscToolbar, ExampleMainToolbar
-from dialogs import ExampleMapDialog
+from dialogs import ExampleMapDialog
# It is possible to call grass library functions (in C) directly via ctypes
# however this is less stable. Example is available in trunk/doc/python/, ctypes
@@ -48,33 +50,34 @@
# haveExample = False
# errMsg = _("Loading raster lib failed.\n%s") % e
+
class ExampleMapFrame(SingleMapFrame):
"""! Main frame of example tool.
-
+
Inherits from SingleMapFrame, so map is displayed in one map widow.
In case two map windows are needed, use DoubleMapFrame from (gui_core.mapdisp).
-
+
@see IClassMapFrame in iclass.frame
"""
- def __init__(self, parent = None, title = _("Example Tool"),
- toolbars = ["MiscToolbar", "MapToolbar", "MainToolbar"],
- size = (800, 600), name = 'exampleWindow', **kwargs):
+ def __init__(self, parent, giface, title=_("Example Tool"),
+ toolbars=["MiscToolbar", "MapToolbar", "MainToolbar"],
+ size=(800, 600), name='exampleWindow', **kwargs):
"""!Map Frame constructor
-
+
@param parent (no parent is expected)
@param title window title
@param toolbars list of active toolbars (default value represents all toolbars)
@param size default size
"""
- SingleMapFrame.__init__(self, parent = parent, title = title,
- name = name, Map = Map(), **kwargs)
-
+ SingleMapFrame.__init__(self, parent=parent, title=title,
+ name=name, Map=Map(), **kwargs)
+
# Place debug message where appropriate
# and set debug level from 1 to 5 (higher to lower level functions).
# To enable debug mode write:
# > g.gisenv set=WX_DEBUG=5
Debug.msg(1, "ExampleMapFrame.__init__()")
-
+
#
# Add toolbars to aui manager
#
@@ -82,14 +85,18 @@
# workaround to have the same toolbar order on all platforms
if sys.platform == 'win32':
toolbarsCopy.reverse()
-
+
for toolbar in toolbarsCopy:
self.AddToolbar(toolbar)
-
+
+ self.mapWindowProperties = MapWindowProperties()
+ self.mapWindowProperties.setValuesFromUserSettings()
+ self.mapWindowProperties.autoRenderChanged.connect(
+ lambda value: self.OnRender(None) if value else None)
#
# Add statusbar
#
-
+
# choose items in statusbar choice, which makes sense for your application
self.statusbarItems = [sb.SbCoordinates,
sb.SbRegionExtent,
@@ -101,94 +108,90 @@
sb.SbMapScale,
sb.SbGoTo,
sb.SbProjection]
-
+
# create statusbar and its manager
- statusbar = self.CreateStatusBar(number = 4, style = 0)
+ statusbar = self.CreateStatusBar(number=4, style=0)
statusbar.SetStatusWidths([-5, -2, -1, -1])
- self.statusbarManager = sb.SbManager(mapframe = self, statusbar = statusbar)
-
+ self.statusbarManager = sb.SbManager(mapframe=self, statusbar=statusbar)
+
# fill statusbar manager
- self.statusbarManager.AddStatusbarItemsByClass(self.statusbarItems, mapframe = self, statusbar = statusbar)
- self.statusbarManager.AddStatusbarItem(sb.SbMask(self, statusbar = statusbar, position = 2))
- self.statusbarManager.AddStatusbarItem(sb.SbRender(self, statusbar = statusbar, position = 3))
-
+ self.statusbarManager.AddStatusbarItemsByClass(self.statusbarItems,
+ mapframe=self, statusbar=statusbar)
+ self.statusbarManager.AddStatusbarItem(sb.SbMask(self, statusbar=statusbar, position=2))
+ self.statusbarManager.AddStatusbarItem(sb.SbRender(self, statusbar=statusbar, position=3))
+
self.statusbarManager.Update()
-
-
+
# create map window
- self.MapWindow = BufferedWindow(self, Map = self.GetMap(), frame = self, giface = self)
-
+ self.MapWindow = BufferedMapWindow(parent=self, Map=self.GetMap(),
+ properties=self.mapWindowProperties, giface=self)
+ self._setUpMapWindow(self.MapWindow)
+ self.MapWindow.InitZoomHistory()
+
# create whatever you want, here it is a widget for displaying raster info
self.info = ExampleInfoTextManager(self)
-
+
# add map window (and other widgets) to aui manager
self._addPanes()
self._mgr.Update()
-
- # default action in map toolbar
- self.OnPan(event = None)
-
+
# initialize variables related to your application functionality
self.InitVariables()
-
+
+ # default action
+ self.GetMapToolbar().SelectDefault()
+
+ self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
-
+
self.SetSize(size)
-
+
def __del__(self):
"""!Destructor deletes temporary region"""
- grass.del_temp_region()
-
+ gcore.del_temp_region()
+
def OnCloseWindow(self, event):
"""!Destroy frame"""
self.Destroy()
-
+
def IsStandalone(self):
"""!Check if application is standalone.
-
+
Standalone application can work without parent.
Parent can be e.g. Layer Manager.
"""
if self.parent:
return False
-
+
return True
-
- def GetLayerManager(self):
- """!Returns frame parent.
-
- If IsStandalone() is True, returns None,
- otherwise retuns frame parent (Layer Manager)
- """
- return self.parent
-
+
def InitVariables(self):
"""!Initialize any variables nneded by application"""
self.currentRaster = None
self.statitistics = dict()
-
+
# use WIND_OVERRIDE region not to affect current region
- grass.use_temp_region()
-
+ gcore.use_temp_region()
+
def _addPanes(self):
"""!Add mapwindow (and other widgets) to aui manager"""
window = self.GetWindow()
name = "mainWindow"
self._mgr.AddPane(window, wx.aui.AuiPaneInfo().
- Name(name).CentrePane().
- Dockable(False).CloseButton(False).DestroyOnClose(True).
- Layer(0))
-
+ Name(name).CentrePane().
+ Dockable(False).CloseButton(False).DestroyOnClose(True).
+ Layer(0))
+
window = self.info.GetControl()
name = "infoText"
self._mgr.AddPane(window, wx.aui.AuiPaneInfo().
- Name(name).Caption(_("Raster Info")).MinSize((250, -1)).
- Dockable(True).CloseButton(False).
- Layer(0).Left())
-
+ Name(name).Caption(_("Raster Info")).MinSize((250, -1)).
+ Dockable(True).CloseButton(False).
+ Layer(0).Left())
+
def AddToolbar(self, name):
"""!Add defined toolbar to the window
-
+
Currently known toolbars are:
- 'ExampleMapToolbar' - basic map toolbar
- 'ExampleMainToolbar' - toolbar with application specific tools
@@ -196,8 +199,8 @@
"""
# see wx.aui.AuiPaneInfo documentation for understanding all options
if name == "MapToolbar":
- self.toolbars[name] = ExampleMapToolbar(self)
-
+ self.toolbars[name] = ExampleMapToolbar(self, self._toolSwitcher)
+
self._mgr.AddPane(self.toolbars[name],
wx.aui.AuiPaneInfo().
Name(name).Caption(_("Map Toolbar")).
@@ -206,10 +209,10 @@
BottomDockable(False).TopDockable(True).
CloseButton(False).Layer(1).Row(1).
BestSize((self.toolbars[name].GetBestSize())))
-
+
if name == "MiscToolbar":
self.toolbars[name] = ExampleMiscToolbar(self)
-
+
self._mgr.AddPane(self.toolbars[name],
wx.aui.AuiPaneInfo().
Name(name).Caption(_("Misc Toolbar")).
@@ -218,10 +221,10 @@
BottomDockable(False).TopDockable(True).
CloseButton(False).Layer(1).Row(1).
BestSize((self.toolbars[name].GetBestSize())))
-
+
if name == "MainToolbar":
self.toolbars[name] = ExampleMainToolbar(self)
-
+
self._mgr.AddPane(self.toolbars[name],
wx.aui.AuiPaneInfo().
Name(name).Caption(_("Main Toolbar")).
@@ -230,95 +233,97 @@
BottomDockable(False).TopDockable(True).
CloseButton(False).Layer(1).Row(1).
BestSize((self.toolbars[name].GetBestSize())))
-
+
def GetMapToolbar(self):
"""!Returns toolbar with zooming tools"""
return self.toolbars['MapToolbar']
-
+
def OnHelp(self, event):
"""!Show help page"""
- RunCommand('g.manual', entry = 'wxGUI.Example')
-
+ RunCommand('g.manual', entry='wxGUI.Example')
+
def OnSelectRaster(self, event):
"""!Opens dialog to select raster map"""
dlg = ExampleMapDialog(self)
-
+
if dlg.ShowModal() == wx.ID_OK:
- raster = grass.find_file(name = dlg.GetRasterMap(), element = 'cell')
+ raster = gcore.find_file(name=dlg.GetRasterMap(), element='cell')
if raster['fullname']:
- self.SetLayer(name = raster['fullname'])
-
+ self.SetLayer(name=raster['fullname'])
+ else:
+ # show user that the map name is incorrect
+ GError(parent=self,
+ message=_("Raster map <{raster}> not found").format(raster=dlg.GetRasterMap()))
+
dlg.Destroy()
-
+
def SetLayer(self, name):
"""!Sets layer in Map and updates statistics.
-
+
@param name layer (raster) name
"""
Debug.msg (3, "ExampleMapFrame.SetLayer(): name=%s" % name)
-
+
# this simple application enables to keep only one raster
self.GetMap().DeleteAllLayers()
cmdlist = ['d.rast', 'map=%s' % name]
# add layer to Map instance (core.render)
- newLayer = self.GetMap().AddLayer(ltype = 'raster', command = cmdlist, active = True,
- name = name, hidden = False, opacity = 1.0,
- render = True)
- self.GetWindow().ZoomToMap(layers = [newLayer,], render = True)
+ newLayer = self.GetMap().AddLayer(ltype='raster', command=cmdlist, active=True,
+ name=name, hidden=False, opacity=1.0,
+ render=True)
+ self.GetWindow().ZoomToMap(layers=[newLayer, ], render=True)
self.currentRaster = name
-
+
# change comp. region to match new raster, so that the statistics
# are computed for the entire raster
RunCommand('g.region',
- rast = self.currentRaster,
- parent = self)
-
+ rast=self.currentRaster,
+ parent=self)
+
self.UpdateStatistics()
-
+
def ComputeStatitistics(self):
"""!Computes statistics for raster map using 'r.univar' module.
-
- @return statistic in form of dictionary
+
+ @return statistic in form of dictionary
"""
# RunCommand enables to run GRASS module
- res = RunCommand('r.univar', # module name
- flags = 'g', # command flags
- map = self.currentRaster, # module parameters
- read = True) # get command output
-
- return grass.parse_key_val(res, val_type = float)
-
+ res = RunCommand('r.univar', # module name
+ flags='g', # command flags
+ map=self.currentRaster, # module parameters
+ read=True) # get command output
+
+ return gcore.parse_key_val(res, val_type=float)
+
def UpdateStatistics(self):
"""!Upadate statistic information.
-
+
Called after changing raster map.
"""
stats = self.ComputeStatitistics()
- self.info.WriteStatistics(name = self.currentRaster, statDict = stats)
-
-
+ self.info.WriteStatistics(name=self.currentRaster, statDict=stats)
+
+
class ExampleInfoTextManager:
"""!Class for displaying information.
-
- Wrraper for wx.TextCtrl.
+
+ Wrraper for wx.TextCtrl.
"""
def __init__(self, parent):
"""!Creates wx.TextCtrl for displaying information.
"""
- self.textCtrl = wx.TextCtrl(parent, id = wx.ID_ANY,
- style = wx.TE_MULTILINE | wx.TE_RICH2 | wx.TE_READONLY)
+ self.textCtrl = wx.TextCtrl(parent, id=wx.ID_ANY,
+ style=wx.TE_MULTILINE | wx.TE_RICH2 | wx.TE_READONLY)
self.textCtrl.SetInsertionPoint(0)
- self.textCtrl.Disable()
self.font = self.textCtrl.GetFont()
- self.bgColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_BACKGROUND)
-
+
def GetControl(self):
"""!Returns control itself."""
return self.textCtrl
-
+
def _setStyle(self, style):
"""!Sets default style of textCtrl.
-
+
@param style "title"/"value"
"""
if style == "title":
@@ -327,44 +332,28 @@
self.font.SetWeight(wx.FONTWEIGHT_NORMAL)
else:
return
-
- self.textCtrl.SetDefaultStyle(wx.TextAttr(colBack = self.bgColor, font = self.font))
-
+
+ self.textCtrl.SetDefaultStyle(wx.TextAttr(font=self.font))
+
def _writeLine(self, title, value):
"""!Formats text (key, value pair) with styles."""
self._setStyle("title")
self.textCtrl.AppendText("%s: " % title)
self._setStyle("value")
self.textCtrl.AppendText("%.2f\n" % value)
-
+
def _writeRasterTitle(self, name):
"""!Writes title."""
self._setStyle("title")
self.textCtrl.AppendText("%s\n\n" % name)
-
+
def WriteStatistics(self, name, statDict):
"""!Write and format information about raster map
-
+
@param name raster map name
@param statDict dictionary containing information
"""
self.GetControl().Clear()
- self._writeRasterTitle(name = name)
+ self._writeRasterTitle(name=name)
for key, value in statDict.iteritems():
- self._writeLine(title = key, value = value)
-
-
-def main():
- import gettext
-
- gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
-
- app = wx.PySimpleApp()
- wx.InitAllImageHandlers()
-
- frame = ExampleMapFrame()
- frame.Show()
- app.MainLoop()
-
-if __name__ == "__main__":
- main()
+ self._writeLine(title=key, value=value)
Copied: grass/trunk/doc/gui/wxpython/example/g.gui.example.html (from rev 58580, grass/trunk/doc/gui/wxpython/example/wxGUI.example.html)
===================================================================
--- grass/trunk/doc/gui/wxpython/example/g.gui.example.html (rev 0)
+++ grass/trunk/doc/gui/wxpython/example/g.gui.example.html 2014-01-03 03:39:48 UTC (rev 58590)
@@ -0,0 +1,76 @@
+<!-- meta page description: wxGUI Example Tool -->
+<!-- meta page index: wxGUI -->
+<h2>DESCRIPTION</h2>
+
+<p>
+The purpose of the <b>Example Tool</b> is to make life easier
+for new wxGUI developers. It can serve as a basic template when
+creating standalone GRASS GUI-based application. Example tool
+can display one raster map a show information about it.
+</p>
+
+<p>
+Following topics are covered:
+</p>
+
+<ul>
+ <li>creating standalone window</li>
+ <li>adding toolbars, statusbar</li>
+ <li>displaying raster map</li>
+ <li>running GRASS modules from application</li>
+ <li>creating dialog for element (raster, vector, ...) selection</li>
+ <li>using temporary region</li>
+ <li>access from main menu</li>
+ <li>writing programmer documentation</li>
+ <li>writing user documentation</li>
+</ul>
+
+<h2>NOTE</h2>
+
+<p>
+See README to learn how to get Example Tool to work.
+</p>
+
+<!--
+Put screenshot here
+<center>
+<br><img src="wxGUI_example.jpg" border="1"><br><br>
+</center>
+
+-->
+
+<h3>EXAMPLE TOOL TOOLBAR</h3>
+
+<dl>
+ <dt><img src="icons/layer-raster-add.png">
+ <em>Select raster layer</em></dt>
+ <dd>Select raster layer and compute statistics related to this layer.</dd>
+</dl>
+
+
+
+<h2>SEE ALSO</h2>
+
+<em>
+ <a href="wxGUI.html">wxGUI</a><br>
+ <a href="wxGUI.components.html">wxGUI components</a>
+</em>
+
+<!--
+Create wiki page and put the link here:
+<p>
+See also
+user <a href="http://grasswiki.osgeo.org/wiki/WxGUI_...">wiki</a> page.
+</p>
+-->
+
+<h2>AUTHOR</h2>
+
+<p>
+Anna Kratochvilova,
+ <a href="http://www.cvut.cz">Czech Technical University in Prague</a>, Czech Republic<br>
+</p>
+
+<p>
+<i>$Date$</i>
+
Added: grass/trunk/doc/gui/wxpython/example/g.gui.example.py
===================================================================
--- grass/trunk/doc/gui/wxpython/example/g.gui.example.py (rev 0)
+++ grass/trunk/doc/gui/wxpython/example/g.gui.example.py 2014-01-03 03:39:48 UTC (rev 58590)
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+############################################################################
+#
+# MODULE: g.gui.iclass
+# AUTHOR(S): Anna Petrasova
+# PURPOSE: Example GUI application
+# COPYRIGHT: (C) 2012-2014 by the GRASS Development Team
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+############################################################################
+
+#%module
+#% description: Example GUI application which displays raster map and further information
+#% keywords: example
+#% keywords: GUI
+#% keywords: raster
+#%end
+#%option G_OPT_R_INPUT
+#% description: Name of raster map to load
+#% required: no
+#%end
+
+import os
+import sys
+import wx
+
+import grass.script.core as gcore
+
+if __name__ == '__main__':
+ wxbase = os.path.join(os.getenv('GISBASE'), 'etc', 'gui', 'wxpython')
+ if wxbase not in sys.path:
+ sys.path.append(wxbase)
+
+from core.globalvar import CheckWxVersion
+from core.giface import StandaloneGrassInterface
+from core.utils import _, GuiModuleMain
+from core.settings import UserSettings
+from example.frame import ExampleMapFrame
+
+
+def main():
+ options, flags = gcore.parser()
+ if options['input']:
+ map_name = gcore.find_file(name=options['input'], element='cell')['fullname']
+ if not map_name:
+ gcore.fatal(_("Raster map <{raster}> not found").format(raster=options['input']))
+
+ # define display driver (avoid 'no graphics device selected' error at start up)
+ driver = UserSettings.Get(group='display', key='driver', subkey='type')
+ if driver == 'png':
+ os.environ['GRASS_RENDER_IMMEDIATE'] = 'png'
+ else:
+ os.environ['GRASS_RENDER_IMMEDIATE'] = 'cairo'
+
+ # launch application
+ app = wx.App()
+ if not CheckWxVersion([2, 9]):
+ wx.InitAllImageHandlers()
+
+ # show main frame
+ giface = StandaloneGrassInterface()
+ frame = ExampleMapFrame(parent=None, giface=giface)
+ if options['input']:
+ giface.WriteLog(_("Loading raster map <{raster}>...").format(raster=map_name))
+ frame.SetLayer(map_name)
+
+ frame.Show()
+ app.MainLoop()
+
+if __name__ == '__main__':
+ GuiModuleMain(main)
Modified: grass/trunk/doc/gui/wxpython/example/toolbars.py
===================================================================
--- grass/trunk/doc/gui/wxpython/example/toolbars.py 2014-01-03 03:36:51 UTC (rev 58589)
+++ grass/trunk/doc/gui/wxpython/example/toolbars.py 2014-01-03 03:39:48 UTC (rev 58590)
@@ -8,12 +8,12 @@
- toolbars::ExampleMainToolbar
- toolbars::ExampleMiscToolbar
-(C) 2006-2011 by the GRASS Development Team
+(C) 2011-2014 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.
- at author Anna Kratochvilova <kratochanna gmail.com>
+ at author Anna Petrasova <kratochanna gmail.com>
"""
import wx
@@ -25,22 +25,23 @@
class ExampleMapToolbar(BaseToolbar):
"""!Map toolbar (to control map zoom and rendering)
"""
- def __init__(self, parent):
+ def __init__(self, parent, toolSwitcher):
"""!Map toolbar constructor
"""
- BaseToolbar.__init__(self, parent)
-
+ BaseToolbar.__init__(self, parent, toolSwitcher)
+
self.InitToolbar(self._toolbarData())
# realize the toolbar
self.Realize()
-
- self.action = { 'id' : self.pan }
- self.defaultAction = { 'id' : self.pan,
- 'bind' : self.parent.OnPan }
-
+
+ self._default = self.pan
+
+ for tool in (self.pan, self.zoomIn, self.zoomOut):
+ self.toolSwitcher.AddToolToGroup(group='mouseUse', toolbar=self, tool=tool)
+
self.EnableTool(self.zoomBack, False)
-
+
def _toolbarData(self):
"""!Returns toolbar data (name, icon, handler)"""
# BaseIcons are a set of often used icons. It is possible
@@ -52,10 +53,10 @@
self.parent.OnRender),
("erase", icons["erase"],
self.parent.OnErase),
- (None, ), # creates separator
+ (None, ), # creates separator
("pan", icons["pan"],
self.parent.OnPan,
- wx.ITEM_CHECK), # toggle tool
+ wx.ITEM_CHECK), # toggle tool
("zoomIn", icons["zoomIn"],
self.parent.OnZoomIn,
wx.ITEM_CHECK),
@@ -67,8 +68,9 @@
self.parent.OnZoomBack),
("zoomToMap", icons["zoomExtent"],
self.parent.OnZoomToMap),
- ))
-
+ ))
+
+
class ExampleMainToolbar(BaseToolbar):
"""!Toolbar with tools related to application functionality
"""
@@ -76,18 +78,19 @@
"""!Toolbar constructor
"""
BaseToolbar.__init__(self, parent)
-
+
self.InitToolbar(self._toolbarData())
-
+
# realize the toolbar
self.Realize()
-
+
def _toolbarData(self):
"""!Toolbar data"""
return self._getToolbarData((("addRaster", BaseIcons['addRast'],
self.parent.OnSelectRaster),
- ))
-
+ ))
+
+
class ExampleMiscToolbar(BaseToolbar):
"""!Toolbar with miscellaneous tools related to app
"""
@@ -95,11 +98,11 @@
"""!Toolbar constructor
"""
BaseToolbar.__init__(self, parent)
-
+
self.InitToolbar(self._toolbarData())
# realize the toolbar
self.Realize()
-
+
def _toolbarData(self):
"""!Toolbar data"""
icons = BaseIcons
Deleted: grass/trunk/doc/gui/wxpython/example/wxGUI.example.html
===================================================================
--- grass/trunk/doc/gui/wxpython/example/wxGUI.example.html 2014-01-03 03:36:51 UTC (rev 58589)
+++ grass/trunk/doc/gui/wxpython/example/wxGUI.example.html 2014-01-03 03:39:48 UTC (rev 58590)
@@ -1,76 +0,0 @@
-<!-- meta page description: wxGUI Example Tool -->
-<!-- meta page index: wxGUI -->
-<h2>DESCRIPTION</h2>
-
-<p>
-The purpose of the <b>Example Tool</b> is to make life easier
-for new wxGUI developers. It can serve as a basic template when
-creating standalone GRASS GUI-based application. Example tool
-can display one raster map a show information about it.
-</p>
-
-<p>
-Following topics are covered:
-</p>
-
-<ul>
- <li>creating standalone window</li>
- <li>adding toolbars, statusbar</li>
- <li>displaying raster map</li>
- <li>running GRASS modules from application</li>
- <li>creating dialog for element (raster, vector, ...) selection</li>
- <li>using temporary region</li>
- <li>access from main menu</li>
- <li>writing programmer documentation</li>
- <li>writing user documentation</li>
-</ul>
-
-<h2>NOTE</h2>
-
-<p>
-See README to learn how to get Example Tool to work.
-</p>
-
-<!--
-Put screenshot here
-<center>
-<br><img src="wxGUI_example.jpg" border="1"><br><br>
-</center>
-
--->
-
-<h3>EXAMPLE TOOL TOOLBAR</h3>
-
-<dl>
- <dt><img src="icons/layer-raster-add.png">
- <em>Select raster layer</em></dt>
- <dd>Select raster layer and compute statistics related to this layer.</dd>
-</dl>
-
-
-
-<h2>SEE ALSO</h2>
-
-<em>
- <a href="wxGUI.html">wxGUI</a><br>
- <a href="wxGUI.components.html">wxGUI components</a>
-</em>
-
-<!--
-Create wiki page and put the link here:
-<p>
-See also
-user <a href="http://grasswiki.osgeo.org/wiki/WxGUI_...">wiki</a> page.
-</p>
--->
-
-<h2>AUTHOR</h2>
-
-<p>
-Anna Kratochvilova,
- <a href="http://www.cvut.cz">Czech Technical University in Prague</a>, Czech Republic<br>
-</p>
-
-<p>
-<i>$Date$</i>
-
More information about the grass-commit
mailing list