winMain: remove useless variable
[nephilim.git] / nephilim / winMain.py
bloba743298813cd1fd34c2da378e44dd502ab5851d1
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 pyqtSlot as Slot
21 import logging
23 from common import APPNAME, sec2min, appIcon
24 import icons
25 import data
27 class winMain(QtGui.QMainWindow):
28 """The winMain class is mpc's main window, showing the playlists and control-interface"""
29 mpclient = None
30 settings = None
31 " menus"
32 mConnect = None
33 mDisconnect = None
34 __layout_menu = None
36 # Statusbar objects
37 __statuslabel = None
38 __time_slider = None
39 __time_label = None
41 __docks = []
43 def __init__(self, mpclient):
44 QtGui.QMainWindow.__init__(self)
45 self.settings = QtCore.QSettings()
46 self.mpclient = mpclient
49 # statusbar
50 self.statusBar()
51 self.__statuslabel = QtGui.QLabel()
52 self.__time_slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
53 self.__time_slider.setMaximumWidth(self.width()/4)
54 self.__time_slider.sliderReleased.connect( self.__on___time_slider_change)
55 self.__time_label = TimeLabel(self, mpclient)
56 self.mpclient.time_changed.connect(self.__on_time_change)
58 self.statusBar().addWidget(self.__statuslabel)
59 self.statusBar().addPermanentWidget(self.__time_label)
60 self.statusBar().addPermanentWidget(self.__time_slider)
62 mBar = QtGui.QMenuBar() # create a menubar
63 # File menu
64 m = mBar.addMenu("File")
65 # connect
66 self.mConnect=m.addAction('Connect ...', QtGui.QApplication.instance().show_connect_win)
67 self.mConnect.setIcon(QtGui.QIcon(appIcon))
68 # disconnect
69 self.mDisconnect=m.addAction('Disconnect', self.mpclient.disconnect_mpd)
70 self.mDisconnect.setIcon(QtGui.QIcon(':icons/disconnect.png'))
71 # separator
72 m.addSeparator()
73 # quit
74 m.addAction("Quit", QtGui.QApplication.instance().quit).setIcon(QtGui.QIcon(':icons/gtk-quit.svg'))
76 # menu options
77 m=mBar.addMenu("Options")
78 # settings
79 m.addAction("Settings", QtGui.QApplication.instance().show_settings_win).setIcon(QtGui.QIcon(':icons/gtk-preferences.svg'))
81 # menu layout
82 self.__layout_menu=mBar.addMenu("Layout")
84 # create a toolbar for the main menu
85 menu_toolbar = QtGui.QToolBar('Main menu', self)
86 menu_toolbar.addWidget(mBar)
87 self.addToolBar(QtCore.Qt.TopToolBarArea, menu_toolbar)
89 self.__update_layout_menu()
90 self.setDockOptions(QtGui.QMainWindow.AllowNestedDocks \
91 |QtGui.QMainWindow.AllowTabbedDocks \
92 |QtGui.QMainWindow.VerticalTabs)
93 self.setDockNestingEnabled(True)
94 self.restoreGeometry(self.settings.value('geometry', QtCore.QByteArray()))
96 " add event handlers"
97 self.mpclient.connect_changed.connect(self.__on_connect_changed)
98 self.mpclient.song_changed.connect(self.__on_song_change)
99 self.mpclient.state_changed.connect(self.__update_state_messages)
101 self.__update_state_messages()
102 self.show()
104 def on_quit(self):
105 self.settings.setValue('geometry', self.saveGeometry())
107 def __update_layout_menu(self):
108 self.__layout_menu.clear()
109 self.__layout_menu.addAction('Save layout', self.save_layout)
110 self.__layout_menu.addAction('Restore layout', self.restore_layout)
111 self.__layout_menu.addSeparator()
112 # create checkable menu
113 a = QtGui.QAction('Show titlebars', self)
114 a.setCheckable(True)
115 a.setChecked(int(self.settings.value('show_titlebars', 1)))
116 self.__toggle_titlebars(a.isChecked())
117 a.toggled.connect(self.__toggle_titlebars)
118 self.__layout_menu.addAction(a)
119 self.__layout_menu.addSeparator()
121 m = self.createPopupMenu()
122 if m:
123 for action in m.actions():
124 self.__layout_menu.addAction(action)
126 def __toggle_titlebars(self, val):
127 if val:
128 self.settings.setValue('show_titlebars', 1)
129 else:
130 self.settings.setValue('show_titlebars', 0)
131 for dock in self.__docks:
132 if val:
133 dock.setTitleBarWidget(None)
134 else:
135 dock.setTitleBarWidget(QtGui.QWidget())
136 def add_dock(self, dock):
137 if dock:
138 self.__docks.append(dock)
139 self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock)
140 self.__update_layout_menu()
141 def remove_dock(self, dock):
142 if dock:
143 self.removeDockWidget(dock)
144 if dock in self.__docks:
145 self.__docks.remove(dock)
146 self.__update_layout_menu()
148 def save_layout(self):
149 self.settings.setValue('layout', self.saveState())
150 def restore_layout(self):
151 layout = self.settings.value('layout')
152 if not layout:
153 l_file = QtCore.QFile(':default_layout')
154 l_file.open(QtCore.QIODevice.ReadOnly)
155 layout = l_file.readAll()
156 self.restoreState(layout)
159 def __on_connect_changed(self, val):
160 if val:
161 self.mDisconnect.setEnabled(True)
162 self.mConnect.setEnabled(False)
163 else:
164 self.mDisconnect.setEnabled(False)
165 self.mConnect.setEnabled(True)
167 def __update_state_messages(self):
168 """Update window title and statusbar"""
169 song = self.mpclient.cur_song
170 state = self.mpclient.status['state']
171 state = 'playing' if state == 'play' else 'paused' if state == 'pause' else 'stopped'
172 if song:
173 self.setWindowTitle('%s by %s - %s [%s]'%(song['?title'], song['?artist'], APPNAME, state))
174 self.__statuslabel.setText('%s by %s on %s [%s]'%(song['?title'], song['?artist'],song['?album'], state))
175 else:
176 self.setWindowTitle(APPNAME)
177 self.__statuslabel.setText('')
179 def __on___time_slider_change(self):
180 self.mpclient.seek(self.__time_slider.value())
182 def __on_song_change(self):
183 status = self.mpclient.status
184 self.__time_slider.setMaximum(status['time'][1])
185 self.__time_slider.setEnabled(True)
186 self.__update_state_messages()
188 def __on_time_change(self, new_time):
189 if not self.__time_slider.isSliderDown():
190 self.__time_slider.setValue(new_time)
192 class TimeLabel(QtGui.QLabel):
194 _mpclient = None
196 def __init__(self, parent, mpclient):
197 QtGui.QLabel.__init__(self, parent)
199 self._mpclient = mpclient
201 self._mpclient.time_changed.connect(self._update_text)
202 self._update_text(self._mpclient.status['time'][0])
204 @Slot(int)
205 def _update_text(self, time):
206 self.setText('%s/%s'%(sec2min(time), sec2min(self._mpclient.status['time'][1])))