plugin: really remove dock widgets
[nephilim.git] / nephilim / winMain.py
blobd4668c9ad4012c53de0c20d9740a71585ce9d90e
2 # Copyright (C) 2008 jerous <jerous@gmail.com>
3 # Copyright (C) 2009 Anton Khirnov <wyskas@gmail.com>
5 # Nephilim is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
10 # Nephilim is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with Nephilim. If not, see <http://www.gnu.org/licenses/>.
19 from PyQt4 import QtGui, QtCore
20 from PyQt4.QtCore import QVariant
21 import logging
23 from common import APPNAME, sec2min, appIcon
24 import icons
25 import data
27 DEFAULT_LAYOUT_FILE = 'nephilim/default_layout'
29 class winMain(QtGui.QMainWindow):
30 """The winMain class is mpc's main window, showing the playlists and control-interface"""
31 mpclient = None
32 settings = None
33 " menus"
34 mConnect = None
35 mDisconnect = None
36 __layout_menu = None
38 # Statusbar objects
39 __statuslabel = None
40 __time_slider = None
41 __time_label = None
43 __docks = []
45 def __init__(self, mpclient):
46 QtGui.QWidget.__init__(self)
47 self.settings = QtCore.QSettings()
48 self.mpclient = mpclient
51 # statusbar
52 self.statusBar()
53 self.__statuslabel = QtGui.QLabel()
54 self.__time_slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
55 self.__time_slider.setMaximumWidth(self.width()/4)
56 self.__time_slider.sliderReleased.connect( self.__on___time_slider_change)
57 self.__time_label = QtGui.QLabel()
58 self.__time_label.duration = '0:00'
60 self.statusBar().addWidget(self.__statuslabel)
61 self.statusBar().addPermanentWidget(self.__time_label)
62 self.statusBar().addPermanentWidget(self.__time_slider)
64 mBar = QtGui.QMenuBar() # create a menubar
65 # File menu
66 m = mBar.addMenu("File")
67 # connect
68 self.mConnect=m.addAction('Connect ...', QtGui.QApplication.instance().show_connect_win)
69 self.mConnect.setIcon(QtGui.QIcon(appIcon))
70 # disconnect
71 self.mDisconnect=m.addAction('Disconnect', self.mpclient.disconnect_mpd)
72 self.mDisconnect.setIcon(QtGui.QIcon(':icons/disconnect.png'))
73 # separator
74 m.addSeparator()
75 # quit
76 m.addAction("Quit", QtGui.QApplication.instance().quit).setIcon(QtGui.QIcon(':icons/gtk-quit.svg'))
78 # menu options
79 m=mBar.addMenu("Options")
80 # settings
81 m.addAction("Settings", QtGui.QApplication.instance().show_settings_win).setIcon(QtGui.QIcon(':icons/gtk-preferences.svg'))
83 # menu layout
84 self.__layout_menu=mBar.addMenu("Layout")
86 # create a toolbar for the main menu
87 menu_toolbar = QtGui.QToolBar('Main menu', self)
88 menu_toolbar.addWidget(mBar)
89 self.addToolBar(QtCore.Qt.TopToolBarArea, menu_toolbar)
91 self.__update_layout_menu()
92 self.setDockOptions(QtGui.QMainWindow.AllowNestedDocks \
93 |QtGui.QMainWindow.AllowTabbedDocks \
94 |QtGui.QMainWindow.VerticalTabs)
95 self.setDockNestingEnabled(True)
96 self.restoreGeometry(self.settings.value('geometry').toByteArray())
98 " add event handlers"
99 self.mpclient.connect_changed.connect(self.__on_connect_changed)
100 self.mpclient.song_changed.connect(self.__on_song_change)
101 self.mpclient.state_changed.connect(self.__update_state_messages)
102 self.mpclient.time_changed.connect(self.__on_time_change)
104 self.__update_state_messages()
105 self.show()
107 def on_quit(self):
108 self.settings.setValue('geometry', QVariant(self.saveGeometry()))
110 def __update_layout_menu(self):
111 self.__layout_menu.clear()
112 self.__layout_menu.addAction('Save layout', self.save_layout)
113 self.__layout_menu.addAction('Restore layout', self.restore_layout)
114 self.__layout_menu.addSeparator()
115 # create checkable menu
116 a = QtGui.QAction('Show titlebars', self)
117 a.setCheckable(True)
118 a.setChecked(self.settings.value('show_titlebars', QVariant(True)).toBool())
119 self.__toggle_titlebars(a.isChecked())
120 a.toggled.connect(self.__toggle_titlebars)
121 self.__layout_menu.addAction(a)
122 self.__layout_menu.addSeparator()
124 m = self.createPopupMenu()
125 if m:
126 for action in m.actions():
127 self.__layout_menu.addAction(action)
129 def __toggle_titlebars(self, val):
130 if val:
131 self.settings.setValue('show_titlebars', QVariant(True))
132 else:
133 self.settings.setValue('show_titlebars', QVariant(False))
134 for dock in self.__docks:
135 if val:
136 dock.setTitleBarWidget(None)
137 else:
138 dock.setTitleBarWidget(QtGui.QWidget())
139 def add_dock(self, dock):
140 if dock:
141 self.__docks.append(dock)
142 self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock)
143 self.__update_layout_menu()
144 def remove_dock(self, dock):
145 if dock:
146 self.removeDockWidget(dock)
147 if dock in self.__docks:
148 self.__docks.remove(dock)
149 self.__update_layout_menu()
151 def setStatus(self, status):
152 """Set the text of the statusbar."""
153 self.statusBar().showMessage(status, 5000)
154 logging.info(status)
156 def save_layout(self):
157 self.settings.setValue('layout', QVariant(self.saveState()))
158 def restore_layout(self):
159 layout = self.settings.value('layout').toByteArray()
160 if not layout:
161 layout = QtCore.QFile(':default_layout').readAll()
162 self.restoreState(layout)
165 def __on_connect_changed(self, val):
166 if val:
167 self.mDisconnect.setEnabled(True)
168 self.mConnect.setEnabled(False)
169 else:
170 self.mDisconnect.setEnabled(False)
171 self.mConnect.setEnabled(True)
173 def __update_state_messages(self):
174 """Update window title and statusbar"""
175 song = self.mpclient.current_song()
176 state = self.mpclient.status()['state']
177 state = 'playing' if state == 'play' else 'paused' if state == 'pause' else 'stopped'
178 if song:
179 self.setWindowTitle('%s by %s - %s [%s]'%(song['title'], song['artist'], APPNAME, state))
180 self.__statuslabel.setText('%s by %s on %s [%s]'%(song['title'], song['artist'],song['album'], state))
181 else:
182 self.setWindowTitle(APPNAME)
183 self.__statuslabel.setText('')
185 def __on___time_slider_change(self):
186 self.mpclient.seek(self.__time_slider.value())
188 def __on_song_change(self):
189 status = self.mpclient.status()
190 self.__time_slider.setMaximum(status['length'])
191 self.__time_slider.setEnabled(True)
192 self.__time_label.duration = sec2min(status['length'])
193 self.__update_state_messages()
195 def __on_time_change(self, new_time):
196 if not self.__time_slider.isSliderDown():
197 self.__time_slider.setValue(new_time)
198 self.__time_label.setText(sec2min(new_time) + '/' + self.__time_label.duration)