summaryrefslogtreecommitdiff
path: root/nephilim/main_window.py
diff options
context:
space:
mode:
Diffstat (limited to 'nephilim/main_window.py')
-rw-r--r--nephilim/main_window.py208
1 files changed, 208 insertions, 0 deletions
diff --git a/nephilim/main_window.py b/nephilim/main_window.py
new file mode 100644
index 0000000..67c8847
--- /dev/null
+++ b/nephilim/main_window.py
@@ -0,0 +1,208 @@
+#
+# Copyright (C) 2008 jerous <jerous@gmail.com>
+# 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 PyQt4.QtCore import pyqtSlot as Slot
+import logging
+
+from common import APPNAME, sec2min, appIcon
+import icons
+import data
+
+class MainWindow(QtGui.QMainWindow):
+ """
+ Application's main window class.
+ """
+ mpclient = None
+ settings = None
+ " menus"
+ mConnect = None
+ mDisconnect = None
+ __layout_menu = None
+
+ # Statusbar objects
+ __statuslabel = None
+ __time_slider = None
+ __time_label = None
+
+ __docks = []
+
+ def __init__(self, mpclient):
+ QtGui.QMainWindow.__init__(self)
+ self.settings = QtCore.QSettings()
+ self.mpclient = mpclient
+
+
+ # statusbar
+ self.statusBar()
+ self.__statuslabel = QtGui.QLabel()
+ self.__time_slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
+ self.__time_slider.setMaximumWidth(self.width()/4)
+ self.__time_slider.sliderReleased.connect( self.__on___time_slider_change)
+ self.__time_label = TimeLabel(self, mpclient)
+ self.mpclient.time_changed.connect(self.__on_time_change)
+
+ self.statusBar().addWidget(self.__statuslabel)
+ self.statusBar().addPermanentWidget(self.__time_label)
+ self.statusBar().addPermanentWidget(self.__time_slider)
+
+ mBar = QtGui.QMenuBar() # create a menubar
+ # File menu
+ m = mBar.addMenu("File")
+ # connect
+ self.mConnect=m.addAction('Connect ...', QtGui.QApplication.instance().show_connect_win)
+ self.mConnect.setIcon(QtGui.QIcon(appIcon))
+ # disconnect
+ self.mDisconnect=m.addAction('Disconnect', self.mpclient.disconnect_mpd)
+ self.mDisconnect.setIcon(QtGui.QIcon(':icons/disconnect.png'))
+ # separator
+ m.addSeparator()
+ # quit
+ m.addAction("Quit", QtGui.QApplication.instance().quit).setIcon(QtGui.QIcon(':icons/gtk-quit.svg'))
+
+ # menu options
+ m=mBar.addMenu("Options")
+ # settings
+ m.addAction("Settings", QtGui.QApplication.instance().show_settings_win).setIcon(QtGui.QIcon(':icons/gtk-preferences.svg'))
+
+ # menu layout
+ self.__layout_menu=mBar.addMenu("Layout")
+
+ # create a toolbar for the main menu
+ menu_toolbar = QtGui.QToolBar('Main menu', self)
+ menu_toolbar.addWidget(mBar)
+ self.addToolBar(QtCore.Qt.TopToolBarArea, menu_toolbar)
+
+ self.__update_layout_menu()
+ self.setDockOptions(QtGui.QMainWindow.AllowNestedDocks \
+ |QtGui.QMainWindow.AllowTabbedDocks \
+ |QtGui.QMainWindow.VerticalTabs)
+ self.setDockNestingEnabled(True)
+ self.restoreGeometry(self.settings.value('geometry', QtCore.QByteArray()))
+
+ " add event handlers"
+ self.mpclient.connect_changed.connect(self.__on_connect_changed)
+ self.mpclient.song_changed.connect(self.__on_song_change)
+ self.mpclient.state_changed.connect(self.__update_state_messages)
+
+ self.__update_state_messages()
+ self.show()
+
+ def on_quit(self):
+ self.settings.setValue('geometry', self.saveGeometry())
+
+ def __update_layout_menu(self):
+ self.__layout_menu.clear()
+ self.__layout_menu.addAction('Save layout', self.save_layout)
+ self.__layout_menu.addAction('Restore layout', self.restore_layout)
+ self.__layout_menu.addSeparator()
+ # create checkable menu
+ a = QtGui.QAction('Show titlebars', self)
+ a.setCheckable(True)
+ a.setChecked(int(self.settings.value('show_titlebars', 1)))
+ self.__toggle_titlebars(a.isChecked())
+ a.toggled.connect(self.__toggle_titlebars)
+ self.__layout_menu.addAction(a)
+ self.__layout_menu.addSeparator()
+
+ m = self.createPopupMenu()
+ if m:
+ for action in m.actions():
+ self.__layout_menu.addAction(action)
+
+ def __toggle_titlebars(self, val):
+ if val:
+ self.settings.setValue('show_titlebars', 1)
+ else:
+ self.settings.setValue('show_titlebars', 0)
+ for dock in self.__docks:
+ if val:
+ dock.setTitleBarWidget(None)
+ else:
+ dock.setTitleBarWidget(QtGui.QWidget())
+ def add_dock(self, dock):
+ if dock:
+ self.__docks.append(dock)
+ self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock)
+ self.__update_layout_menu()
+ def remove_dock(self, dock):
+ if dock:
+ self.removeDockWidget(dock)
+ if dock in self.__docks:
+ self.__docks.remove(dock)
+ self.__update_layout_menu()
+
+ def save_layout(self):
+ self.settings.setValue('layout', self.saveState())
+ def restore_layout(self):
+ layout = self.settings.value('layout')
+ if not layout:
+ l_file = QtCore.QFile(':default_layout')
+ l_file.open(QtCore.QIODevice.ReadOnly)
+ layout = l_file.readAll()
+ self.restoreState(layout)
+
+
+ def __on_connect_changed(self, val):
+ if val:
+ self.mDisconnect.setEnabled(True)
+ self.mConnect.setEnabled(False)
+ else:
+ self.mDisconnect.setEnabled(False)
+ self.mConnect.setEnabled(True)
+
+ def __update_state_messages(self):
+ """Update window title and statusbar"""
+ song = self.mpclient.cur_song
+ state = self.mpclient.status['state']
+ state = 'playing' if state == 'play' else 'paused' if state == 'pause' else 'stopped'
+ if song:
+ self.setWindowTitle('%s by %s - %s [%s]'%(song['?title'], song['?artist'], APPNAME, state))
+ self.__statuslabel.setText('%s by %s on %s [%s]'%(song['?title'], song['?artist'],song['?album'], state))
+ else:
+ self.setWindowTitle(APPNAME)
+ self.__statuslabel.setText('')
+
+ def __on___time_slider_change(self):
+ self.mpclient.seek(self.__time_slider.value())
+
+ def __on_song_change(self):
+ status = self.mpclient.status
+ self.__time_slider.setMaximum(status['time'][1])
+ self.__time_slider.setEnabled(True)
+ self.__update_state_messages()
+
+ def __on_time_change(self, new_time):
+ if not self.__time_slider.isSliderDown():
+ self.__time_slider.setValue(new_time)
+
+class TimeLabel(QtGui.QLabel):
+
+ _mpclient = None
+
+ def __init__(self, parent, mpclient):
+ QtGui.QLabel.__init__(self, parent)
+
+ self._mpclient = mpclient
+
+ self._mpclient.time_changed.connect(self._update_text)
+ self._update_text(self._mpclient.status['time'][0])
+
+ @Slot(int)
+ def _update_text(self, time):
+ self.setText('%s/%s'%(sec2min(time), sec2min(self._mpclient.status['time'][1])))