Переглянути джерело

wxGUI: run UpdateSelection() in the thread

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@36993 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa 16 роки тому
батько
коміт
c30a674ea4
1 змінених файлів з 107 додано та 91 видалено
  1. 107 91
      gui/wxpython/gui_modules/menuform.py

+ 107 - 91
gui/wxpython/gui_modules/menuform.py

@@ -43,7 +43,7 @@ Classes:
 
 
 @todo
 @todo
  - verify option value types
  - verify option value types
- - use DOM instead of SAX
+ - use DOM instead of SAX (is it really necessary? ML)
 """
 """
 
 
 import sys
 import sys
@@ -54,6 +54,7 @@ import os
 import time
 import time
 import copy
 import copy
 import locale
 import locale
+from threading import Thread
 
 
 ### i18N
 ### i18N
 import gettext
 import gettext
@@ -64,11 +65,11 @@ if not os.getenv("GRASS_WXBUNDLED"):
     globalvar.CheckForWx()
     globalvar.CheckForWx()
 
 
 import wx
 import wx
+import wx.html
 import wx.lib.flatnotebook as FN
 import wx.lib.flatnotebook as FN
 import wx.lib.colourselect as csel
 import wx.lib.colourselect as csel
 import wx.lib.filebrowsebutton as filebrowse
 import wx.lib.filebrowsebutton as filebrowse
 from wx.lib.expando import ExpandoTextCtrl, EVT_ETC_LAYOUT_NEEDED
 from wx.lib.expando import ExpandoTextCtrl, EVT_ETC_LAYOUT_NEEDED
-import wx.html
 
 
 # Do the python 2.0 standard xml thing and map it on the old names
 # Do the python 2.0 standard xml thing and map it on the old names
 import xml.sax
 import xml.sax
@@ -161,6 +162,107 @@ def escape_ampersand(text):
     """Escapes ampersands with additional ampersand for GUI"""
     """Escapes ampersands with additional ampersand for GUI"""
     return string.replace(text, "&", "&&")
     return string.replace(text, "&", "&&")
 
 
+class UpdateThread(Thread):
+    """Update dialog widgets in the thread"""
+    def __init__(self, parent, eventId, task):
+        Thread.__init__(self)
+
+        self.parent = parent
+        self.eventId = eventId
+        self.task = task
+        self.setDaemon(True)
+
+        self.start()
+
+    def run(self):
+        # get widget id
+        if not self.eventId:
+            for p in self.task.params:
+                if p.get('gisprompt', False) == False:
+                    continue
+                prompt = p.get('element', '')
+                if prompt == 'vector':
+                    name = p.get('name', '')
+                    if name in ('map', 'input'):
+                        eventId = p['wxId']
+            if eventId is None:
+                return
+        
+        p = self.task.get_param(self.eventId, element='wxId', raiseError=True)
+        
+        if not p or \
+                not p.has_key('wxId-bind'):
+            return
+
+        # get widget prompt
+        pType = p.get('prompt', '')
+        if not pType:
+            return
+
+        # check for map/input parameter
+        pMap = self.task.get_param('map', raiseError=False)
+        if not pMap:
+            pMap = self.task.get_param('input', raiseError=False)
+
+        if pMap:
+            map = pMap.get('value', '')
+        else:
+            map = None
+        
+        # avoid multiple updating
+        columns = []
+        
+        # update reference widgets
+        for uid in p['wxId-bind']:
+            win = self.parent.FindWindowById(uid)
+            name = win.GetName()
+            
+            if name == 'LayerSelect':
+                win.InsertLayers(map)
+            
+            elif name == 'TableSelect':
+                pDriver = self.task.get_param('dbdriver', element='prompt', raiseError=False)
+                driver = db = None
+                if pDriver:
+                    driver = pDriver['value']
+                pDb = self.task.get_param('dbname', element='prompt', raiseError=False)
+                if pDb:
+                    db = pDb['value']
+                
+                win.InsertTables(driver, db)
+            
+            elif name == 'ColumnSelect':
+                if not columns:
+                    pLayer = self.task.get_param('layer', element='element', raiseError=False)
+                    if pLayer:
+                        if pLayer.get('value', '') != '':
+                            layer = int(pLayer.get('value', 1))
+                        else:
+                            layer = int(pLayer.get('default', 1))
+                    else:
+                        layer = 1
+                        
+                    if map:
+                        win.InsertColumns(map, layer)
+                        columns = win.GetItems()
+                    else: # table
+                        pDriver = self.task.get_param('dbdriver', element='prompt', raiseError=False)
+                        if pDriver:
+                            driver = pDriver.get('value', None)
+                        pDb = self.task.get_param('dbname', element='prompt', raiseError=False)
+                        if pDb:
+                            db = pDb.get('value', None)
+                        pTable = self.task.get_param('dbtable', element='element', raiseError=False)
+                        if pTable and \
+                                pTable.get('value', '') != '':
+                            if driver and db:
+                                win.InsertTableColumns(pTable.get('value'), driver, db)
+                            else:
+                                win.InsertTableColumns(pTable.get('value'))
+                            columns = win.GetItems()
+                else:
+                   win.SetItems(columns) 
+            
 class testSAXContentHandler(HandlerBase):
 class testSAXContentHandler(HandlerBase):
 # SAX compliant
 # SAX compliant
     def characters(self, ch, start, length):
     def characters(self, ch, start, length):
@@ -1533,96 +1635,10 @@ class cmdPanel(wx.Panel):
         """
         """
         Update dialog (layers, tables, columns, etc.)
         Update dialog (layers, tables, columns, etc.)
         """
         """
-        # get widget id
-        if not event:
-            id = None
-            for p in self.task.params:
-                if p.get('gisprompt', False) == False:
-                    continue
-                prompt = p.get('element', '')
-                if prompt == 'vector':
-                    name = p.get('name', '')
-                    if name in ('map', 'input'):
-                        id = p['wxId']
-            if id is None:
-                return
+        if event:
+            UpdateThread(self, event.GetId(), self.task)
         else:
         else:
-            id = event.GetId()
-        
-        p = self.task.get_param(id, element='wxId', raiseError=False)
-        
-        if not p or \
-                not p.has_key('wxId-bind'):
-            return
-
-        # get widget prompt
-        pType = p.get('prompt', '')
-        if not pType:
-            return
-
-        # check for map/input parameter
-        pMap = self.task.get_param('map', raiseError=False)
-        if not pMap:
-            pMap = self.task.get_param('input', raiseError=False)
-
-        if pMap:
-            map = pMap.get('value', '')
-        else:
-            map = None
-        
-        # avoid multiple updating
-        columns = []
-        
-        # update reference widgets
-        for uid in p['wxId-bind']:
-            win = self.FindWindowById(uid)
-            name = win.GetName()
-            
-            if name == 'LayerSelect':
-                win.InsertLayers(map)
-            
-            elif name == 'TableSelect':
-                pDriver = self.task.get_param('dbdriver', element='prompt', raiseError=False)
-                driver = db = None
-                if pDriver:
-                    driver = pDriver['value']
-                pDb = self.task.get_param('dbname', element='prompt', raiseError=False)
-                if pDb:
-                    db = pDb['value']
-                
-                win.InsertTables(driver, db)
-            
-            elif name == 'ColumnSelect':
-                if not columns:
-                    pLayer = self.task.get_param('layer', element='element', raiseError=False)
-                    if pLayer:
-                        if pLayer.get('value', '') != '':
-                            layer = int(pLayer.get('value', 1))
-                        else:
-                            layer = int(pLayer.get('default', 1))
-                    else:
-                        layer = 1
-                        
-                    if map:
-                        win.InsertColumns(map, layer)
-                        columns = win.GetItems()
-                    else: # table
-                        pDriver = self.task.get_param('dbdriver', element='prompt', raiseError=False)
-                        if pDriver:
-                            driver = pDriver.get('value', None)
-                        pDb = self.task.get_param('dbname', element='prompt', raiseError=False)
-                        if pDb:
-                            db = pDb.get('value', None)
-                        pTable = self.task.get_param('dbtable', element='element', raiseError=False)
-                        if pTable and \
-                                pTable.get('value', '') != '':
-                            if driver and db:
-                                win.InsertTableColumns(pTable.get('value'), driver, db)
-                            else:
-                                win.InsertTableColumns(pTable.get('value'))
-                            columns = win.GetItems()
-                else:
-                   win.SetItems(columns) 
+            UpdateThread(self, None, self.task)
         
         
     def createCmd( self, ignoreErrors = False ):
     def createCmd( self, ignoreErrors = False ):
         """
         """