diff options
-rwxr-xr-x | nephilim.py | 13 | ||||
-rw-r--r-- | nephilim/nephilim_app.py | 91 | ||||
-rw-r--r-- | nephilim/plugin.py | 7 | ||||
-rw-r--r-- | nephilim/plugins/Notify.py | 2 | ||||
-rw-r--r-- | nephilim/settings_wg.py | 25 | ||||
-rw-r--r-- | nephilim/winMain.py | 46 |
6 files changed, 122 insertions, 62 deletions
diff --git a/nephilim.py b/nephilim.py index 4e7ce45..48fe2b9 100755 --- a/nephilim.py +++ b/nephilim.py @@ -27,21 +27,14 @@ try: except ImportError: sys.exit('PyQt4 not found. Ensure that it is installed.') -from nephilim.winMain import winMain -from nephilim.misc import APPNAME, ORGNAME, appIcon - +from nephilim.nephilim_app import NephilimApp def main(): try: - app = QtGui.QApplication(sys.argv) - app.setApplicationName(APPNAME) - app.setOrganizationName(ORGNAME) - app.setWindowIcon(QtGui.QIcon(appIcon)) + app = NephilimApp(sys.argv) - wMain = winMain() - wMain.show() app.exec_() - wMain.quit() + app.quit() except Exception, e: print_exc() diff --git a/nephilim/nephilim_app.py b/nephilim/nephilim_app.py new file mode 100644 index 0000000..00cb8b4 --- /dev/null +++ b/nephilim/nephilim_app.py @@ -0,0 +1,91 @@ +# +# Copyright (C) 2009 Anton Khirnov <wyskas@gmail.com> +# +# Nephilim 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. +# +# Nephilim 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 Nephilim. If not, see <http://www.gnu.org/licenses/>. +# + +from PyQt4 import QtGui, QtCore + +from winMain import winMain +from misc import ORGNAME, APPNAME, appIcon +from mpclient import MPClient +from settings_wg import SettingsWidget +import plugins + +class NephilimApp(QtGui.QApplication): + "main window object" + main_win = None + "MPD layer" + mpclient = None + "plugins interface" + plugins = None + "settings object" + settings = None + "settings window" + settings_win = None + + def __init__(self, argv): + QtGui.QApplication.__init__(self, argv) + + self.setApplicationName(APPNAME) + self.setOrganizationName(ORGNAME) + self.setWindowIcon(QtGui.QIcon(appIcon)) + + def exec_(self): + #init MPD layer + self.mpclient = MPClient() + + #init settings + self.settings = QtCore.QSettings() + + #init main window + self.main_win = winMain() + + #init plugins + show_settings = False # are there new plugins? + self.plugins = plugins.Plugins(self.main_win, self.mpclient) + for plugin in self.plugins.plugins(): + if self.settings.value(plugin.name() + '/load') == None: + show_settings = True + if self.settings.value(plugin.name() + '/load', QtCore.QVariant(True)).toBool(): + self.plugins.load(plugin.name()) + + self.connect(self, QtCore.SIGNAL('aboutToQuit()'), self.cleanup) + + self.main_win.restore_layout() + QtGui.QApplication.exec_() + + def cleanup(self): + # unload all plugins + for plugin in self.plugins.loaded_plugins(): + plugin.unload() + + self.main_win.on_quit() + self.settings.sync() + + def show_settings_win(self): + if not self.settings_win: + self.settings_win = SettingsWidget(self.mpclient, self.plugins) + + self.connect(self.settings_win, QtCore.SIGNAL('destroyed()'), self.__del_settings_win) + self.settings_win.show() + self.settings_win.raise_() + + def __del_settings_win(self): + self.settings_win = None + + def expand_tags(self, str): + ret = str + ret = ret.replace('$musicdir', self.settings.value('MPD/music_dir').toString()) + return ret diff --git a/nephilim/plugin.py b/nephilim/plugin.py index ca09c86..fdf1c91 100644 --- a/nephilim/plugin.py +++ b/nephilim/plugin.py @@ -69,7 +69,8 @@ class Plugin(QtCore.QObject): self.logger.info('loading') self._load() opts = QtGui.QDockWidget.DockWidgetClosable|QtGui.QDockWidget.DockWidgetMovable - self._parent.addDock(self.get_dock_widget(opts)) + QtGui.QApplication.instance().main_win.addDock(self.get_dock_widget(opts)) + QtGui.QApplication.instance().main_win.restore_layout() self._loaded = True def unload(self): if not self._loaded: @@ -78,7 +79,7 @@ class Plugin(QtCore.QObject): self._unload() dock_widget = self.get_dock_widget() if dock_widget: - self._parent.removeDock(dock_widget) + QtGui.QApplication.instance().main_win.removeDock(dock_widget) self._dock_widget = None self._settingsWidget = None self._loaded = False @@ -128,7 +129,7 @@ class Plugin(QtCore.QObject): return None def _create_dock(self, widget): """Creates a QDockWidget with _parent $_parent containing widget $widget.""" - dock=QtGui.QDockWidget(self._name, self._parent) + dock=QtGui.QDockWidget(self._name, QtGui.QApplication.instance().main_win) dock.setObjectName(self._name) dock.setWidget(widget) diff --git a/nephilim/plugins/Notify.py b/nephilim/plugins/Notify.py index 2f373eb..d9e2a24 100644 --- a/nephilim/plugins/Notify.py +++ b/nephilim/plugins/Notify.py @@ -63,7 +63,7 @@ class winNotify(QtGui.QWidget): font.setPixelSize(20) self.setFont(font) - ac = self.parent.plugins.plugin('AlbumCover') + ac = QtGui.QApplication.instance().plugins.plugin('AlbumCover') if ac: self.connect(ac, QtCore.SIGNAL('cover_changed'), self.on_cover_changed) diff --git a/nephilim/settings_wg.py b/nephilim/settings_wg.py index d757e83..8886144 100644 --- a/nephilim/settings_wg.py +++ b/nephilim/settings_wg.py @@ -27,11 +27,13 @@ import plugin class SettingsWidget(QtGui.QWidget): save_btn = None close_btn = None - pluginlist = None - main_win = None + pluginlist = None settings = None settings_wg = [] + mpclient = None + plugins = None + class SettingsWidgetMPD(plugin.Plugin.SettingsWidget): mpclient = None host_txt = None @@ -116,23 +118,24 @@ class SettingsWidget(QtGui.QWidget): def update_db(self): self.mpclient.update_db() - def __init__(self, main_win): - QtGui.QWidget.__init__(self, main_win, QtCore.Qt.Window) + def __init__(self, mpclient, plugins): + QtGui.QWidget.__init__(self, None, QtCore.Qt.Window) self.settings = QtCore.QSettings() - self.main_win = main_win + self.plugins = plugins + self.mpclient = mpclient self.save_btn = Button('save all', self.save_clicked) self.close_btn = Button('close', self.close_clicked) tab_wg = QtGui.QTabWidget(self) - self.settings_wg.append(self.SettingsWidgetMPD(self.main_win.mpclient)) + self.settings_wg.append(self.SettingsWidgetMPD(mpclient)) tab_wg.addTab(self.settings_wg[-1], 'MPD settings') self.pluginlist = QtGui.QListWidget(self) self.fill_pluginlist() tab_wg.addTab(self.pluginlist, 'Plugins') - for plugin in self.main_win.plugins.loaded_plugins(): + for plugin in self.plugins.loaded_plugins(): wg = plugin.get_settings_widget() if wg: self.settings_wg.append(wg) @@ -152,7 +155,7 @@ class SettingsWidget(QtGui.QWidget): def fill_pluginlist(self): self.pluginlist.clear() - for plugin in self.main_win.plugins.plugins(): + for plugin in self.plugins.plugins(): item = QtGui.QListWidgetItem("%s\t%s"%(plugin.name(), plugin.info())) if plugin.is_loaded(): item.setCheckState(QtCore.Qt.Checked) @@ -178,13 +181,11 @@ class SettingsWidget(QtGui.QWidget): name = str(item.text()[0:str(item.text()).find('\t')]) if toload: # refresh the plugin file - self.main_win.plugins.load(name) + self.plugins.load(name) self.fill_pluginlist() - self.main_win.restoreLayout() else: - self.main_win.plugins.unload(name) + self.plugins.unload(name) self.settings.setValue(name + '/load', QtCore.QVariant(toload)) def closeEvent(self, event): self.settings_wg = None - self.main_win.wSettings = None diff --git a/nephilim/winMain.py b/nephilim/winMain.py index 1ea6213..5b79d38 100644 --- a/nephilim/winMain.py +++ b/nephilim/winMain.py @@ -23,8 +23,6 @@ import logging from misc import APPNAME, sec2min, appIcon from mpclient import MPClient from connect_wg import ConnectWidget -from settings_wg import SettingsWidget -import plugins DEFAULT_LAYOUT_FILE = 'default_layout' @@ -38,10 +36,8 @@ class winMain(QtGui.QMainWindow): mLayout = None wConnect = None - wSettings = None mpclient = None - plugins = None settings = None # Statusbar objects @@ -49,10 +45,10 @@ class winMain(QtGui.QMainWindow): time_slider = None time_label = None - def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) + def __init__(self): + QtGui.QWidget.__init__(self) self.settings = QtCore.QSettings() - self.mpclient = MPClient() + self.mpclient = QtGui.QApplication.instance().mpclient self.wConnect = ConnectWidget(self) @@ -82,13 +78,13 @@ class winMain(QtGui.QMainWindow): # separator m.addSeparator() # quit - m.addAction("Quit", self.quit).setIcon(QtGui.QIcon('gfx/gtk-quit.svg')) + m.addAction("Quit", QtGui.QApplication.instance().quit).setIcon(QtGui.QIcon('gfx/gtk-quit.svg')) # menu options m=mBar.addMenu("Options") m.setTearOffEnabled(True) # settings - m.addAction("Settings", self.showWinSettings).setIcon(QtGui.QIcon('gfx/gtk-preferences.svg')) + m.addAction("Settings", QtGui.QApplication.instance().show_settings_win).setIcon(QtGui.QIcon('gfx/gtk-preferences.svg')) # menu layout self.mLayout=mBar.addMenu("Layout") @@ -99,21 +95,12 @@ class winMain(QtGui.QMainWindow): menu_toolbar.addWidget(mBar) self.addToolBar(QtCore.Qt.TopToolBarArea, menu_toolbar) - showWinSettings = False # are there new plugins? - self.plugins = plugins.Plugins(self, self.mpclient) - for plugin in self.plugins.plugins(): - if self.settings.value(plugin.name() + '/load') == None: - showWinSettings = True - if self.settings.value(plugin.name() + '/load', QVariant(True)).toBool(): - self.plugins.load(plugin.name()) - self.updateLayoutMenu() self.setDockOptions(QtGui.QMainWindow.AllowNestedDocks \ |QtGui.QMainWindow.AllowTabbedDocks \ |QtGui.QMainWindow.VerticalTabs) self.setDockNestingEnabled(True) self.restoreGeometry(self.settings.value('geometry').toByteArray()) - self.restoreLayout() " add event handlers" self.connect(self.mpclient, QtCore.SIGNAL('connected'), self.onConnected) @@ -122,27 +109,19 @@ class winMain(QtGui.QMainWindow): self.connect(self.mpclient, QtCore.SIGNAL('state_changed'), self.update_state_messages) self.connect(self.mpclient, QtCore.SIGNAL('time_changed'), self.on_time_change) - self.enableAll(True) +# self.enableAll(True) self.wConnect.monitor() self.update_state_messages() self.show() - if showWinSettings: - self.showWinSettings() - - def quit(self): - # unload all plugins - for plugin in self.plugins.loaded_plugins(): - plugin.unload() + def on_quit(self): self.settings.setValue('geometry', QVariant(self.saveGeometry())) - self.settings.sync() - QtCore.QCoreApplication.exit() def updateLayoutMenu(self): self.mLayout.clear() self.mLayout.addAction('Save layout', self.saveLayout) - self.mLayout.addAction('Restore layout', self.restoreLayout) + self.mLayout.addAction('Restore layout', self.restore_layout) self.mLayout.addSeparator() # create checkable menu a=QtGui.QAction('Show titlebars', self) @@ -207,7 +186,7 @@ class winMain(QtGui.QMainWindow): def saveLayout(self): self.settings.setValue('layout', QVariant(self.saveState())) - def restoreLayout(self): + def restore_layout(self): layout = self.settings.value('layout').toByteArray() if not layout: try: @@ -217,11 +196,6 @@ class winMain(QtGui.QMainWindow): return self.restoreState(layout) - def showWinSettings(self): - if not self.wSettings: - self.wSettings = SettingsWidget(self) - self.wSettings.show() - self.wSettings.raise_() def onConnected(self): self.mDisconnect.setEnabled(True) @@ -236,7 +210,7 @@ class winMain(QtGui.QMainWindow): pass def initialiseData(self): - self.enableAll(True) +# self.enableAll(True) self.setStatus("") def onDisconnect(self): |