Thanks Vaclav,
I agree that it is a bit of a dirty implementation, but I guess I just wanted to make this work quickly. First to your copy-paste solution: I was more looking for something more interactive/clickable to precisely avoid the typing/reformatting. Something to seamlessly parse a few arguments to existing modules/addons or even scripts. Taking on your comments about the non-dependency and sqlite DB issue, I will rewrite g.gui.triggers to work with a file in ~/.grass7 and the existence of which could then be checked in the dbmgr.base file and the gui_core.query file. There could be a 'Launch...' section in the right-click menu maybe? I'll update you once I have come that far and maybe you can play around with it to see if it's useful for general inclusion.

Best,
Michel

On 08/19/2015 06:30 PM, Vaclav Petras wrote:


On Wed, Aug 19, 2015 at 11:33 AM, Michel Wortmann <[email protected] <mailto:[email protected]>> wrote:

    Hi Vaclav,
    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:

    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.

    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.

    %%%% in header:
    try: import guitriggers
    except: guitriggers=None

    %%%% line 1063
            if guitriggers and
    guitriggers.hasTrigger(**{a:self.dbMgrData['mapDBInfo'].layers[layer][a]
    for a in ['table','database']}):
                win.Bind(wx.EVT_LEFT_DCLICK, self.OnDataTrigger)
                win.Bind(wx.EVT_COMMAND_LEFT_DCLICK, self.OnDataTrigger)
            elif UserSettings.Get(group = 'atm', key = 'leftDbClick',
    subkey = 'selection') == 0:
    %%%%

    %%%% anywhere as method to the DbMgrBrowsePage class
        def OnDataTrigger(self,event):
            info  = self.dbMgrData['mapDBInfo'].layers[self.selLayer]
            tlist =
    self.FindWindowById(self.layerPage[self.selLayer]['data'])
            # get categories
            cats = map(int,tlist.GetSelectedItems())
    guitriggers.trigger(info['table'],cats,database=info['database'])
            return
    %%%%


    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:

    %%%% in header:
    try: import guitriggers
    except: guitriggers=None

    %%%% in QueryDialog.__init__ line 77
            if guitriggers:
               self.trigger = wx.CheckBox(self.panel, label=_("Enable
    trigger"))
               self.trigger.SetValue(False)
               hbox = wx.BoxSizer(wx.HORIZONTAL)
               hbox.Add(item=self.trigger, proportion=0,
    flag=wx.EXPAND | wx.RIGHT, border=5)
               self.mainSizer.Add(item=hbox, proportion=0,
    flag=wx.EXPAND | wx.ALL, border=5)
    %%%%

    %%%% in QueryDialog.SetData, line 99
            if guitriggers and self.trigger.IsChecked():
                for m in data[1:]:
                    info = m[m.keys()[0]] #unpack
                    try:
    guitriggers.trigger(info['Table'].split()[0],[info['Category']],
    database=info['Database'].split()[0])
                    except: pass
    %%%%

    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.


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.

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.

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.


    Let me know if you want more details or would like me to upload
    the addon to the GRASS addon repro.


When ready, please post here the code of the module to test and diff for the changes in existing code.

Vaclav

    Regards,
    Michel




    On 08/19/2015 03:47 PM, Vaclav Petras wrote:
    Hi Michel,

    On Thu, Aug 13, 2015 at 10:32 AM, Michel Wortmann
    <[email protected] <mailto:[email protected]>> wrote:

        Dear Devs,
        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:

        - when double-clicking a line in the dbmgr, trigger a
        script/function using the line's content as input
        - when selecting a feature in the map display, trigger a
        script/function using the query results as input

        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?

        In case someone had similar intentions and has some clues, I
        would appreciate hearing about them.


    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:

    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.

    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.

    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.

    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.

    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.

    Best,
    Vaclav



_______________________________________________
grass-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/grass-dev

Reply via email to