wiki:wxGUIDevelopment/Refactoring/wxGUIAPIproposal

Version 8 (modified by wenzeslaus, 12 years ago) ( diff )

markup improvements and rashadkm's rendering notes moved to wxGUIDevelopment/MapRendering

wxGUI API proposal

The proposal does not have to be complete and there can be several different proposals. (All can be listed in different sections on this page for now; if too long a subpage should be created and linked here.)

The API should be used for communication between objects in the wxGUI, for creating new GUI applications (and GUI addons/plugins) and for controlling the wxGUI from the embedded Python command line.

Short proposal based on the current state of refactoring

Note that the main purpose of this API called GrassInterface is to create layer between existing wxGUI classes. This layer enables us to combine existing parts freely.

The term GrassInterface denotes the class which is the root of the object tree. However, all classes which belongs to this tree can sometimes by reffered as GrassInterface too. GrassInterface interface is the abstract base class or interface and its implementation may be also called interfaces because the word interface is overloaded in this case.

Currently the GrassInterface implementations are some proxy objects which provides the right API to the existing classes. However, it is expected that some classes will implement GrassInterface directly.

class Layer(object):

class LayerList(object):
    def GetSelectedLayers(self, checkedOnly=True):

# GrassInterface is a root in the tree of objects/interfaces which compose API
# provides the functionality which should be available to every GUI component
# and is expected to be passed to almost all objects
class GrassInterface:
    def RunCmd(self, *args, **kwargs):

    def Help(self, entry):

    def WriteLog(self, text, wrap=None, priority=1):
        """The meaning and usage of priority is not clear"""

    def WriteCmdLog(self, line, pid=None, switchPage=True):

    def WriteWarning(self, line):

    def WriteError(self, line):

    def GetLayerList(self):

    def GetMapDisplay(self):

    def GetAllMapDisplays(self):

    def GetMapWindow(self):

# more classes should be defined...

Proposing More classes

non-GUI classes

class WxGUI:
  RASTER = 'raster'
  VECTOR = 'vector'

class Layer(object):

  self.ltype = None
  self.lname = None
  self.style = None

  def __init__():
    ""TBD""

  def setName(self,n):
   self.lname = n

  def setType(self,t):
    self.ltype = t

  def getName(self):
    return lname
 
  def getType(self):
    return ltype

  def setStyle(style):
    """ 
    (A virtual function)
    style object must be a new class which holds the style info such as color map for vector/raster"
    """
  def getStyle():
   return lstyle

class RasterStyle; #Functionality: TBD
class VectorStyle; #Functionality: TBD

class RasterLayer(Layer):

   def getType(self):
      return wxGUI.RASTER

   def getStyle(self):
    return stlye #instance of RasterStyle

class VectorLayer(Layer):

   def getType(self):
      return wxGUI.VECTOR   

   def getStyle(self):
    return stlye #instance of VectorStyle


class LayerManager(object):

   def addLayer(sef,layer, type):
      """
      Is specifying type is mandatory? We already have access to type = layer.ltype
      I mentioned here to demonstrate the idea to enum instead of hardcorded string for layer type
      """

   def addRaster(self,layer):
       """
       suggest a namespace name instead of wxGUI
       """
       addLayer(layer, wxGUI.RASTER) #no more hardcorded string ex: addLayer(layer,'raster')

   def addVector(self,layer):
       addLayer(layer, wxGUI.VECTOR)

   def addOther(self,layer):
      """TBD"""

GUI classes

class LayerManagerFrame(wx.Frame, layerManager):
  
   def __init__(parent, id, title,size,pos):
      wx.Frame.__init__(parent,id,title,size,pos)
      self.lmgrObject = LayerManager(self) #creates non-gui layer manager

  def getLayerManager(self):
      return self.lmgrObject
  

  def addRasterLayer(self,layer):
   self.lmgrObject.addRasterLayer(layer)
   """ltreeitem can be created using a GUI class"""
   ltreeitem.text = layer.getName()
   ltreeitem.checked = True
   self.ltree.Append(ltreeitem)


class GMFrame(wx.Frame):
    def __init__(self,id,title,size,pos):
        wx.Frame.__init__(id,title,size,pos)

    def SetLayerManager(self,lmgr):
       if type(lmgr) == wx.Frame:
          self.lmgrFrame = lmgr
          self.lmgrAsFrame = True

       if type(lmgr) == wx.Panel:
          self.lmgrFrame = lmgr
          self.lmgrAsFrame = False

    def LmgrAsFrame(self):
       return self.lmgrAsFrame

Simple usage of the above Pseudo code

frame = new GFrame() #gui object
lmgr = LayerManagerFrame() #gui object panel/Frame
frame.SetLayerManager(lmgr)
rlayer = new RasterLayer() #non-gui object
lmgr.addRasterLayer(rlayer)
vlayer = new VectorLayer() #non-gui object
vlayer.setEditable(True)
lmgr.addVectorLayer(vlayer)

PyDispatcher added by vaclav should be used for Event mechanism in the New GUI

TBD: To Be Decided

Note: See TracWiki for help on using the wiki.