Skip to content
Snippets Groups Projects
msearch.py 7.32 KiB
Newer Older
# msearch.py --- 
# 
# Filename: msearch.py
# Description: 
# Author: 
# Maintainer: 
# Created: Tue Jun  4 15:10:16 2013 (+0530)
# Version: 
# Last-Updated: Thu Jun  6 18:26:02 2013 (+0530)
#           By: subha
#     Update #: 181
# URL: 
# Keywords: 
# Compatibility: 
# 
# 

# Commentary: 
# 
# 
# 
# 

# Change log:
# 
# 
# 
# 
# 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 3, 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.
# 
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING.  If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street, Fifth
# Floor, Boston, MA 02110-1301, USA.
# 
# 

# Code:
"""
Widget giving access to wildcardFind function in MOOSE

"""
import sys

from PyQt4 import QtGui, QtCore
from PyQt4.Qt import Qt

import moose

class SearchWidget(QtGui.QWidget):
    """Widget to search MOOSE model tree using wildcards.
    
    SIGNALS:

    executed(list of elements matching search criterion).

    """
    executed = QtCore.pyqtSignal(list, name='executed')

    def __init__(self, *args):
        QtGui.QWidget.__init__(self, *args)
        layout = QtGui.QVBoxLayout()
        self.modeCombo = QtGui.QComboBox()
        self.modeCombo.addItem('Basic', QtCore.QVariant(QtCore.QString('basic')))
        self.modeCombo.addItem('Advanced', QtCore.QVariant(QtCore.QString('advanced')))
        self.modeCombo.setCurrentIndex(0)
        self.setLayout(layout)
        layout.addWidget(self.modeCombo)
        layout.addWidget(self.getBasicPanel())
        layout.addWidget(self.getAdvancedPanel())
        self.connect(self.modeCombo, QtCore.SIGNAL('currentIndexChanged(const QString &)'), self.switchModeSlot)
        self.switchModeSlot('basic')
        self.searchButton = QtGui.QPushButton('Search')
        self.searchButton.clicked.connect(self.searchSlot)
        layout.addWidget(self.searchButton)
        self.__results = []

    def switchModeSlot(self, text):
        basic = (str(text).lower() == 'basic')
        self.getBasicPanel().setVisible(basic)
        self.getAdvancedPanel().setVisible(not basic)

    def getBasicPanel(self):
        """Create a widget for basic level usage."""
        if not hasattr(self, '_basicPanel'):
            self._basicPanel = QtGui.QWidget()
            self.searchRootEdit = QtGui.QLineEdit()
            self.searchRootEdit.returnPressed.connect(self.searchSlot)
            self.searchRootLabel = QtGui.QLabel('Search under')
            self.typeEdit = QtGui.QLineEdit()
            self.typeEdit.returnPressed.connect(self.searchSlot)            
            self.typeLabel = QtGui.QLabel('for elements of type')
            self.fieldEdit = QtGui.QLineEdit()
            self.fieldEdit.returnPressed.connect(self.searchSlot)            
            self.fieldLabel = QtGui.QLabel('or elements with field')
            self.comparisonCombo = QtGui.QComboBox()
            self.comparisonCombo.addItem('=', QtCore.QVariant(QtCore.QString('=')))
            self.comparisonCombo.addItem('<', QtCore.QVariant(QtCore.QString('<')))
            self.comparisonCombo.addItem('>', QtCore.QVariant(QtCore.QString('>')))
            self.comparisonCombo.addItem('<=', QtCore.QVariant(QtCore.QString('<=')))
            self.comparisonCombo.addItem('>=', QtCore.QVariant(QtCore.QString('>=')))
            self.comparisonCombo.addItem('!=', QtCore.QVariant(QtCore.QString('!=')))
            self.valueEdit = QtGui.QLineEdit()
            self.valueEdit.returnPressed.connect(self.searchSlot)            
            self.recurseButton = QtGui.QRadioButton('Search inside children recursively')
            self.recurseButton.setChecked(True)
            layout = QtGui.QGridLayout()
            # layout.setVerticalSpacing(2)
            self._basicPanel.setLayout(layout)
            layout.addWidget(self.searchRootLabel, 0, 0, 1, 1)
            layout.addWidget(self.searchRootEdit, 0, 1, 1, 4)
            layout.addWidget(self.typeLabel, 1, 0, 1, 1)
            layout.addWidget(self.typeEdit, 1, 1, 1, 4)
            layout.addWidget(self.fieldLabel, 2, 0, 1, 1)
            layout.addWidget(self.fieldEdit, 2, 1, 1, 1)
            layout.addWidget(self.comparisonCombo, 2, 2, 1, 1)
            layout.addWidget(self.valueEdit, 2, 3, 1, 2)
            layout.addWidget(self.recurseButton, 3, 0, 1, 1)
            # layout.addItem(QtGui.QSpacerItem(1,1), 3, 0, 1, 7)
        return self._basicPanel

    def getAdvancedPanel(self):
        """Create a panel for advanced users who can enter the search string
        directly."""
        if not hasattr(self, '_advancedPanel'):
            self._advancedPanel = QtGui.QWidget(self)
            self._searchEdit = QtGui.QLineEdit()
            self._searchEdit.returnPressed.connect(self.searchSlot)
            self._searchLabel = QtGui.QLabel('Search string:')
            layout = QtGui.QHBoxLayout()
            self._advancedPanel.setLayout(layout)
            layout.addWidget(self._searchLabel)
            layout.addWidget(self._searchEdit)
        return self._advancedPanel
    
    def searchSlot(self):
        """Do the search and store the paths of the id's found. The results
        can be obtained later with getResults()"""
        search_str = ''
        if str(self.modeCombo.currentText()).lower() == 'basic':
            root = str(self.searchRootEdit.text()).strip()
            if len(root) == 0:
                root = '/'
            search_str += root
            if not search_str.endswith('/'):
                search_str += '/'
            if self.recurseButton.isChecked():
                search_str += '##'
            else:
                search_str += '#'
            type_ = str(self.typeEdit.text()).strip()
            if len(type_) > 0:
                search_str += '[ISA=%s]' % (type_)
            field = str(self.fieldEdit.text()).strip()
            if len(field) > 0:
                search_str += '[FIELD(%s)'
                operator = str(self.comparisonCombo.currentText())
                value = str(self.valueEdit.text())
                search_str += '%s%s]' % (operator, value)
        else:
            search_str = str(self._searchEdit.text()).strip()
        ids = moose.wildcardFind(search_str)
        self.__results = [el.path for el in ids]
        self.executed.emit(list(self.__results))

    def getResults(self):
        return list(self.__results)

    def setSearchRoot(self, root):
        self.searchRootEdit.setText(moose.element(root).path)

def main():
    """Test main"""
    model = moose.Neutral('/model')
    moose.loadModel('../Demos/Genesis_files/Kholodenko.g', '/model/Kholodenko')
    # tab = moose.element('/model/Kholodenko/graphs/conc1/MAPK_PP.Co')
    # print tab
    # for t in tab.children:
    #     print t
    app = QtGui.QApplication(sys.argv)
    mainwin = QtGui.QMainWindow()
    mainwin.setWindowTitle('Model tree test')
    wildcardWidget = SearchWidget()
    mainwin.setCentralWidget(wildcardWidget)
    mainwin.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()


# 
# msearch.py ends here