summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <wyskas@gmail.com>2009-06-19 10:49:54 +0200
committerAnton Khirnov <wyskas@gmail.com>2009-06-19 10:49:54 +0200
commit27e27a05b82e4a64123c30cc8261e9e69cd1bea3 (patch)
tree953bc9b71b032929878b4702a9915dfd469b8bff
parentcfbaa2bde498f61bde1d565c66742eb5875d8f2c (diff)
Split some parts of winMain into a subclass of QApplication.
-rwxr-xr-xnephilim.py13
-rw-r--r--nephilim/nephilim_app.py91
-rw-r--r--nephilim/plugin.py7
-rw-r--r--nephilim/plugins/Notify.py2
-rw-r--r--nephilim/settings_wg.py25
-rw-r--r--nephilim/winMain.py46
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):