Source code for lib_openmolar.common.qt4.plugin_tools.plugable_main_window
#! /usr/bin/env python
# -*- coding: utf-8 -*-
###############################################################################
## ##
## Copyright 2010, Neil Wallace <rowinggolfer@googlemail.com> ##
## ##
## 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 of the License, 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. If not, see <http://www.gnu.org/licenses/>. ##
## ##
###############################################################################
'''
provides the PlugableMainWindow class
'''
import logging
import pickle
import sys
from PyQt4 import QtGui, QtCore
from lib_openmolar.common.qt4.widgets import BaseMainWindow
from lib_openmolar.common.qt4.widgets import Preference
from lib_openmolar.common.qt4.plugin_tools import PluginOptionsWidget
from lib_openmolar.common.qt4.dialogs import PreferencesDialog
[docs]class PlugableMainWindow(BaseMainWindow):
'''
adds a preference dialog with font and plugin options
'''
_preferences_dialog = None
[docs] def __init__(self, parent=None):
BaseMainWindow.__init__(self, parent)
icon = QtGui.QIcon(":icons/plugins.png")
plugin_action = QtGui.QAction(icon, _("Plugins"), self)
self.plugin_toolbar = QtGui.QToolBar()
'''
A toolbar which plugins can (should?) add a QAction to
'''
self.plugin_toolbar.setObjectName("plugins toolbar")
self.plugin_toolbar.toggleViewAction().setText(_("Plugins Toolbar"))
self.plugin_toolbar.addAction(plugin_action)
self.addToolBar(self.plugin_toolbar)
self.loadSettings()
plugin_action.triggered.connect(self.plugin_action_triggered)
[docs] def loadSettings(self):
'''
load settings from QtCore.QSettings.
'''
settings = QtCore.QSettings()
#Qt settings
self.restoreGeometry(settings.value("geometry").toByteArray())
self.restoreState(settings.value("windowState").toByteArray())
statusbar_hidden = settings.value("statusbar_hidden").toBool()
self.statusbar.setVisible(not statusbar_hidden)
self.action_show_statusbar.setChecked(not self.statusbar.isHidden())
font = settings.value("Font").toPyObject()
if font:
QtGui.QApplication.instance().setFont(font)
toolbar_set = settings.value(
"Toolbar", QtCore.Qt.ToolButtonTextUnderIcon).toInt()[0]
for tb in self.toolbar_list:
tb.setToolButtonStyle(toolbar_set)
tiny_menu = settings.value("TinyMenu").toBool()
if tiny_menu:
self.menuBar().toggle_visability(True)
self.menuBar().menu_toolbar.toggleViewAction().setChecked(True)
qsettings = QtCore.QSettings()
#python dict of settings
dict_ = str(qsettings.value("settings_dict").toString())
if dict_:
try:
SETTINGS.PERSISTANT_SETTINGS = pickle.loads(dict_)
except Exception as e:
logging.exception(
"exception caught loading python settings...")
SETTINGS.PLUGIN_DIRS = list(qsettings.value(
"plugin_dirs").toStringList())
SETTINGS.NAKED_PLUGIN_DIRS = list(qsettings.value(
"naked_plugin_dirs").toStringList())
SETTINGS.ACTIVE_PLUGINS = set(qsettings.value(
"active_plugins").toStringList())
SETTINGS.main_ui = self
[docs] def saveSettings(self):
'''
save settings from QtCore.QSettings
'''
LOGGER.debug("saving settings")
qsettings = QtCore.QSettings()
#Qt settings
qsettings.setValue("geometry", self.saveGeometry())
qsettings.setValue("windowState", self.saveState())
qsettings.setValue("statusbar_hidden", self.statusbar.isHidden())
qsettings.setValue("Font", self.font())
qsettings.setValue("Toolbar", self.main_toolbar.toolButtonStyle())
qsettings.setValue("TinyMenu", not self.menuBar().isVisible())
# SETTINGS.PERSISTANT_SETTINGS is a python dict of non qt-specific settings.
# unfortunately.. QVariant.toPyObject can't recreate a dictionary
# so best to pickle this
pickled_dict = pickle.dumps(SETTINGS.PERSISTANT_SETTINGS)
qsettings.setValue("settings_dict", pickled_dict)
qsettings.setValue("plugin_dirs",
QtCore.QStringList(SETTINGS.PLUGIN_DIRS))
qsettings.setValue("naked_plugin_dirs",
QtCore.QStringList(SETTINGS.NAKED_PLUGIN_DIRS))
qsettings.setValue("active_plugins",
QtCore.QStringList(list(SETTINGS.ACTIVE_PLUGINS)))
[docs] def preferences_dialog(self):
if self._preferences_dialog is None:
dl = self._preferences_dialog = PreferencesDialog(self)
plugin_icon = QtGui.QIcon(":icons/plugins.png")
plugins_pref = Preference(_("Plugins"))
plugins_pref.setIcon(plugin_icon)
pl_widg = PluginOptionsWidget(self)
plugins_pref.setWidget(pl_widg)
dl.insert_preference_dialog(0, plugins_pref)
return self._preferences_dialog
[docs] def show_preferences_dialog(self):
'''
launch the preference dialog
'''
LOGGER.debug("show_preferences_dialog")
self.preferences_dialog().exec_()
[docs] def plugin_action_triggered(self):
'''
dummy function. should probably be overwritten
'''
self.advise("plugin action clicked.. does nothing")
def _test():
from lib_openmolar import client
SETTINGS.PLUGIN_DIRS = ["../../../../plugins/admin"]
app = QtGui.QApplication([])
app.setOrganizationName("om_test")
app.setApplicationName("om_test")
mw = PlugableMainWindow()
SETTINGS.load_plugins()
mw.main_toolbar.addAction(QtGui.QAction("Placeholder", mw))
mw.show()
app.exec_()
if __name__ == "__main__":
_test()