<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 19, 2015 at 11:33 AM, Michel Wortmann <span dir="ltr"><<a href="mailto:wortmann@pik-potsdam.de" target="_blank">wortmann@pik-potsdam.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div text="#000000" bgcolor="#FFFFFF">
    Hi Vaclav,<br>
    thanks for the ideas. I have already implemented an idea which I
    find works very well and is based on an add on, which works well
    with GRASS' existing addon structure. But it did require me to add a
    few lines in the gui_core.query as well as the dbmgr.base python
    files, which I guess is the downside of it. Here is the
    implementation:<br>
    <br>
    g.gui.triggers is a little addon that manages a sqlite table
    (__triggers__) in the current mapset, it records the vector name,
    the command and the argument=column mapping and additional arguments
    to be used. It can also be called with the arguments map= and cat=
    to actually do the triggering of the command listed in the table for
    the respective cat.<br>
    <br>
    To implement the dbmgr double-clicking, I add the following to
    dbmgr.base to call g.gui.triggers if the addon exists and if the
    vector is listed in the __triggers__ table.<br>
    <br>
    %%%% in header:<br>
    try: import guitriggers<br>
    except: guitriggers=None<br>
    <br>
    %%%% line 1063<br>
            if guitriggers and
    guitriggers.hasTrigger(**{a:self.dbMgrData['mapDBInfo'].layers[layer][a]
    for a in ['table','database']}):<br>
                win.Bind(wx.EVT_LEFT_DCLICK, self.OnDataTrigger)<br>
                win.Bind(wx.EVT_COMMAND_LEFT_DCLICK, self.OnDataTrigger)<br>
            elif UserSettings.Get(group = 'atm', key = 'leftDbClick',
    subkey = 'selection') == 0:<br>
    %%%%<br>
    <br>
    %%%% anywhere as method to the DbMgrBrowsePage class<br>
        def OnDataTrigger(self,event):<br>
            info  = self.dbMgrData['mapDBInfo'].layers[self.selLayer]<br>
            tlist =
    self.FindWindowById(self.layerPage[self.selLayer]['data'])<br>
            # get categories<br>
            cats = map(int,tlist.GetSelectedItems())<br>
           
    guitriggers.trigger(info['table'],cats,database=info['database'])<br>
            return<br>
    %%%%<br>
    <br>
    <br>
    To implement the selection idea in the map display, I added a check
    box to the query dialog (if the addon exists). If it is checked, the
    command listed in the __triggers__ table is executed. I added the
    following to the gui_core.query file:<br>
    <br>
    %%%% in header:<br>
    try: import guitriggers<br>
    except: guitriggers=None<br>
    <br>
    %%%% in QueryDialog.__init__ line 77<br>
            if guitriggers:<br>
               self.trigger = wx.CheckBox(self.panel, label=_("Enable
    trigger"))<br>
               self.trigger.SetValue(False)<br>
               hbox = wx.BoxSizer(wx.HORIZONTAL)<br>
               hbox.Add(item=self.trigger, proportion=0, flag=wx.EXPAND
    | wx.RIGHT, border=5)<br>
               self.mainSizer.Add(item=hbox, proportion=0,
    flag=wx.EXPAND | wx.ALL, border=5)<br>
    %%%%<br>
    <br>
    %%%% in QueryDialog.SetData, line 99<br>
            if guitriggers and self.trigger.IsChecked():<br>
                for m in data[1:]:<br>
                    info = m[m.keys()[0]] #unpack             <br>
                    try:
    guitriggers.trigger(info['Table'].split()[0],[info['Category']],<br>
                                       
    database=info['Database'].split()[0])<br>
                    except: pass<br>
    %%%%<br>
    <br>
    I have not found any major flaws with this approach, the only
    downside being the few added lines in the existing code (which are
    all pretty much copied from existing functionalities). The
    'guitriggers' module is so far still imported as a python module,
    but I guess it doesnt take much to check whether it's an installed
    addon.<br></div></blockquote><div><br></div><div>I'm glad you got that far. I don't have any opinion on this "triggers" yet. This seems like a general "custom action" system; something like a limited plugin system.  It could be quite useful but we should have a more general analysis of this before putting something to the main code base. Also, typically for wxGUI, some refactoring is needed before adding new features.<br><br>Anyway, you should not  put the "triggers" to SQLite database of the current Mapset, that's for data. This is GUI and behavior, this should go to ~/.grass7. It can be text file or anything else.<br><br></div><div>Also, main code should not depend on an addon, either  main code should implement a more general mechanism or addon's code should be moved to the main code.<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF">
    <br>
    Let me know if you want more details or would like me to upload the
    addon to the GRASS addon repro.<br></div></blockquote><div><br></div><div>When ready, please post here the code of the module to test and diff for the changes in existing code.<br><br></div><div>Vaclav<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF">
    Regards,<br>
    Michel<div><div class="h5"><br>
    <br>
    <br>
    <br>
    <div>On 08/19/2015 03:47 PM, Vaclav Petras
      wrote:<br>
    </div>
    <blockquote type="cite">
      <div dir="ltr">Hi Michel,<br>
        <div>
          <div class="gmail_extra"><br>
            <div class="gmail_quote">On Thu, Aug 13, 2015 at 10:32 AM,
              Michel Wortmann <span dir="ltr"><<a href="mailto:wortmann@pik-potsdam.de" target="_blank">wortmann@pik-potsdam.de</a>></span>
              wrote:<br>
              <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear
                Devs,<br>
                what would be the best and least invasive way of
                receiving input from the grass GUI to use in python
                scripts. The following functionalities are on my mind:<br>
                <br>
                - when double-clicking a line in the dbmgr, trigger a
                script/function using the line's content as input<br>
                - when selecting a feature in the map display, trigger a
                script/function using the query results as input<br>
                <br>
                I guess changing the effect of a dbmgr line double-click
                can only be changed by fiddling with the
                gui/wxpython/dbmgr module files. Receiving the select
                query results as input on the command line is in theory
                possible with the 'Redirect to console' option in the
                select pop-up, but how can I read the GUI console?<br>
                <br>
                In case someone had similar intentions and has some
                clues, I would appreciate hearing about them.<br>
              </blockquote>
              <div><br>
              </div>
              <div>these are reasonable requests. I suppose this would
                make your module more convenient for users to use.
                Unfortunately, there is no easy way. Anyway, these are
                the options:<br>
                <br>
                1. Create a new functionality similar to the button to
                select coordinates. Module would specify option type as
                feature ID and when the module's GUI is started from the
                main GUI, the button is associated with Map Display.
                User clicks the button. Clicks in Map Display. Some
                query function is invoked and result goes to the input
                field in module's GUI. There is already a "template" for
                implementing this - the coordinates button.<br>
                <br>
              </div>
              <div>2. Create a plugin system for wxGUI (thanks to Python
                relatively simple) and writing a plugin. If somebody
                wants to do that, please contact me, I can give you few
                pointers.</div>
              <div><br>
              </div>
              <div>3. Create a new feature in GUI Command Console to
                start a module with current output in console as
                standard input for the module. I'm not sure if this
                would overcomplicate things or how this can be made
                actually convenient for users, but it is en interesting
                option.<br>
              </div>
              <div><br>
              </div>
              <div>4. For attribute data (dbmgr), "copy and paste" the
                line's content can be enough. Same for query results.
                For query, the copy is implemented but the format might
                not be good for parsing. For dbmgr, the button to copy
                should be easy to add. This seems convenient enough for
                user.<br>
                <br>
              </div>
              <div>I suggest to first check the option number 4. The
                most general option is number 2 but when implemented, it
                would require writing a module to do the processing and
                then also a plugin for GUI to do the interaction. In
                this light option number 1 seems as a good way.<br>
              </div>
              <br>
            </div>
            <div class="gmail_quote">Best,<br>
            </div>
            <div class="gmail_quote">Vaclav<br>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
  </div></div></div>

</blockquote></div><br></div></div>