""" qtgui/MGSimpleDialog.py: CCP4MG Molecular Graphics Program Copyright (C) 2001-2008 University of York, CCLRC Copyright (C) 2009-2011 University of York This library is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3, modified in accordance with the provisions of the license to address the requirements of UK law. You should have received a copy of the modified GNU Lesser General Public License along with this library. If not, copies may be downloaded from http://www.ccp4.ac.uk/ccp4license.php 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 Lesser General Public License for more details. """ from PyQt4 import QtCore, QtGui import sys from global_definitions import * class MGAbstractGUI(QtCore.QObject): """ Class for generating GUIs somewhat more complex than a single dialog box. """ def CreateMenuEntry(self,force=0): self.menu_defn["text"] = self.title+'..' self.menu_defn["tip"] = self.title self.window_item = MAINWINDOW().addMenuDefinition(self.title,self.menu_defn,self.menu,force) def handleTrigger(self): pass def __init__(self,parent=None): self.menu = "Tools" self.title = "Simple Action" self.menu_defn = dict ( text = 'Simple Action', shortcut = '', #icon = 'info', tip = 'Simple Action', signal = 'triggered()', slot = self.handleTrigger, checkable = 1, initialise = '' ) QtCore.QObject.__init__(self,parent) self.window_item = None class MGSimpleDialog(QtGui.QDialog): def CreateMenuEntry(self,force=0): mainwin = MAINWINDOW() if not mainwin: return win_menu = MAINWINDOW().menuBar().findChild(QtGui.QMenu,self.menu) if self.window_item and win_menu: win_menu.removeAction(self.window_item) self.menu_defn["text"] = self.windowTitle()+'..' self.menu_defn["tip"] = self.windowTitle() self.window_item = MAINWINDOW().addMenuDefinition(self.windowTitle(),self.menu_defn,self.menu,force,submenu=self.submenu) self.connect(self.window_item,QtCore.SIGNAL('triggered()'),self.raise_) def UnClose(self): if MAINWINDOW(): win_menu = MAINWINDOW().menuBar().findChild(QtGui.QMenu,"Windows") if win_menu: window_item = MAINWINDOW().addMenuDefinition(self.windowTitle(),self.menu_defn,"Windows") if window_item: self.connect(window_item,QtCore.SIGNAL('triggered()'),self.raise_) self.show() self.raise_() def Close(self): if MAINWINDOW(): win_menu = MAINWINDOW().menuBar().findChild(QtGui.QMenu,"Windows") if win_menu: MAINWINDOW().removeMenuDefinition(self.windowTitle(),self.menu_defn,"Windows") win_menu.removeAction(self.window_item) self.hide() def minimumSizeHint(self): return QtCore.QSize(50, 50) #def sizeHint(self): # return QtCore.QSize(300, 100) def __init__(self,parent=None,menu='Tools',submenu=None): self.menu = menu self.submenu = submenu self.menu_defn = dict ( text = 'Simple Dialog', shortcut = '', #icon = 'info', tip = 'Simple Dialog', signal = 'triggered()', slot = self.UnClose, checkable = 0, initialise = '' ) QtGui.QDialog.__init__(self,parent) self.setWindowFlags(QtCore.Qt.Dialog) self.setModal(0) self.setSizeGripEnabled(0) self.window_item = None self.connect(self, QtCore.SIGNAL('finished(int)'), self.Close) self.setWindowFlags(QtCore.Qt.Window) self.connect(QtGui.QApplication.instance(),QtCore.SIGNAL("aboutToQuit()"),self.close) #------------------------------------------------------------------- def getParams(self,params={}): #------------------------------------------------------------------- import mgWidgets keyList = params.keys() for key in keyList: widget = self.findChild(QtGui.QWidget,key) value = '' if widget: if isinstance(widget,QtGui.QComboBox): value = str(widget.itemData(widget.currentIndex()).toString()) if not value: value = str(widget.currentText()) elif isinstance(widget,QtGui.QLabel): value = str(widget.text()) elif isinstance(widget,QtGui.QLineEdit): value = str(widget.text()) elif isinstance(widget,QtGui.QAbstractButton): value = int(widget.isChecked()) elif isinstance(widget,mgWidgets.mgSelectionCombo): value = str(widget.text()) elif isinstance(widget,mgWidgets.mgColourCombo): value = str(widget.get_colour()) elif isinstance(widget,mgWidgets.mgAtomPicker): value = str(widget.selection()) elif isinstance(widget,QtGui.QDoubleSpinBox): value = float(widget.value()) elif isinstance(widget,QtGui.QSpinBox): value = int(widget.value()) params[key] = value #print "MGSimpleDialog.getParams",params return params #---------------------------------------------------------------- def setParams(self,params): #---------------------------------------------------------------- import mgWidgets # Beware - do not assume that all items in params are # in our widget keyList = params.keys() #print "MGSimpleDialog.setParams",params,keyList for key in keyList: widget = self.findChild(QtGui.QWidget,key) #print "MGSimpleDialog.setParams",key,widget,params[key] if widget: if isinstance(widget,QtGui.QComboBox): ic = widget.findText(QtCore.QString(params[key])) if ic < 0: ic = widget.findData(QtCore.QVariant(params[key])) if ic>=0: widget.setCurrentIndex(ic) elif isinstance(widget,QtGui.QLineEdit): widget.setText(str(params[key])) elif isinstance(widget,QtGui.QLabel): widget.setText(str(params[key])) elif isinstance(widget,QtGui.QAbstractButton): widget.setChecked(params[key]) elif isinstance(widget,mgWidgets.mgSelectionCombo): widget.setText(params[key]) elif isinstance(widget,mgWidgets.mgColourCombo): widget.set_colour(params[key]) elif isinstance(widget,mgWidgets.mgAtomPicker): widget.setSelection(atomName=value) elif isinstance(widget,QtGui.QDoubleSpinBox): widget.setValue(float(params[key])) elif isinstance(widget,QtGui.QSpinBox): widget.setValue(int(params[key])) class MultiDialog(MGSimpleDialog): """ For dialogs we expect to have possible multiple copies of simultaneously. """ def setWindowTitle(self,title): win_menu = MAINWINDOW().menuBar().findChild(QtGui.QMenu,self.menu) max_dup_idx = 0 duplicate = 0 for action in win_menu.actions(): if action.text()[:len(title)] == title: duplicate = 1 if hasattr(self,'window_item') and self.window_item is not action: if str(action.text()).rfind('(') > -1 and str(action.text()).rfind(')') > 1: try: idx = int(action.text()[str(action.text()).rfind('(')+1:str(action.text()).rfind(')')]) if idx > max_dup_idx: max_dup_idx = idx except: pass if duplicate: if max_dup_idx == 0: title = title + ' (2)' else: title = title + ' ('+str(max_dup_idx+1)+')' if hasattr(self,'window_item') and hasattr(self.window_item,'setText'): self.window_item.setText(title) QtGui.QDialog.setWindowTitle(self,title) def CreateMenuEntry(self,force=0): #self.window_item = QtGui.QAction(self) #self.window_item.setText(self.windowTitle()) self.menu_defn["text"] = self.windowTitle()+'..' self.menu_defn["tip"] = self.windowTitle() self.window_item = MAINWINDOW().addMenuDefinition(self.windowTitle(),self.menu_defn,self.menu,force) self.connect(self.window_item,QtCore.SIGNAL('triggered()'),self.raise_) def __init__(self,parent=None,menu='Tools'): MGSimpleDialog.__init__(self,parent,menu=menu) self.setSizeGripEnabled(0) class MGSimpleDockDialog(MGSimpleDialog): def keyPressEvent(self,e): pass def tabify(self,area): mainwin = MAINWINDOW() others = mainwin.findChildren(QtGui.QDockWidget) for other in others: if (not other is self.dockWidget) and mainwin.dockWidgetArea(other) == area: self.dockWidget.blockSignals(True) mainwin.tabifyDockWidget(other,self.dockWidget) self.dockWidget.blockSignals(False) def setWindowTitle(self,title): MGSimpleDialog.setWindowTitle(self,title) #print self, self.dockWidget self.dockWidget.setWindowTitle(title) def __init__(self,parent=None,menu='Tools',submenu=None,defaultDockArea=QtCore.Qt.BottomDockWidgetArea,tabify=True,dockable=True): MGSimpleDialog.__init__(self,parent,menu,submenu) self.dockWidget = QtGui.QDockWidget(parent) self.dockWidget.setWidget(self) if defaultDockArea!=QtCore.Qt.NoDockWidgetArea: MAINWINDOW().addDockWidget(defaultDockArea,self.dockWidget) self.dockWidget.hide() if tabify: self.tabify(defaultDockArea) self.connect(self.dockWidget.toggleViewAction(),QtCore.SIGNAL("triggered(bool)"),self.dockWidget.raise_) self.connect(self.dockWidget,QtCore.SIGNAL("visibilityChanged(bool)"),self.visChanged) if defaultDockArea==QtCore.Qt.NoDockWidgetArea: self.dockWidget.setFloating(True) def visChanged(self,truth): if not truth: if hasattr(self.dockWidget.widget(),"scrollarea") and hasattr(self.dockWidget.widget().scrollarea,"widget"): if self.dockWidget.widget().scrollarea.widget() is DISPLAYTABLE(): return if not MAINWINDOW().wMGDisplayTable.dockWidget.isFloating() and MAINWINDOW().dockWidgetArea(self.dockWidget) == MAINWINDOW().dockWidgetArea(MAINWINDOW().wMGDisplayTable.dockWidget): MAINWINDOW().wMGDisplayTable.UnCloseNoUpdate() def UnClose(self): if hasattr(self,"dockWidget"): self.dockWidget.show() self.dockWidget.raise_() #print "raise",self sys.stdout.flush() return self.show() def Close(self): self.dockWidget.hide()