remove some unused functions
[nephilim.git] / nephilim / winMain.py
blobfd6be888046448237567f5e7a02032415262d3b3
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 save_layout(self):
152 self.settings.setValue('layout', QVariant(self.saveState()))
153 def restore_layout(self):
154 layout = self.settings.value('layout').toByteArray()
155 if not layout:
156 layout = QtCore.QFile(':default_layout').readAll()
157 self.restoreState(layout)
160 def __on_connect_changed(self, val):
161 if val:
162 self.mDisconnect.setEnabled(True)
163 self.mConnect.setEnabled(False)
164 else:
165 self.mDisconnect.setEnabled(False)
166 self.mConnect.setEnabled(True)
168 def __update_state_messages(self):
169 """Update window title and statusbar"""
170 song = self.mpclient.current_song()
171 state = self.mpclient.status()['state']
172 state = 'playing' if state == 'play' else 'paused' if state == 'pause' else 'stopped'
173 if song:
174 self.setWindowTitle('%s by %s - %s [%s]'%(song['title'], song['artist'], APPNAME, state))
175 self.__statuslabel.setText('%s by %s on %s [%s]'%(song['title'], song['artist'],song['album'], state))
176 else:
177 self.setWindowTitle(APPNAME)
178 self.__statuslabel.setText('')
180 def __on___time_slider_change(self):
181 self.mpclient.seek(self.__time_slider.value())
183 def __on_song_change(self):
184 status = self.mpclient.status()
185 self.__time_slider.setMaximum(status['length'])
186 self.__time_slider.setEnabled(True)
187 self.__time_label.duration = sec2min(status['length'])
188 self.__update_state_messages()
190 def __on_time_change(self, new_time):
191 if not self.__time_slider.isSliderDown():
192 self.__time_slider.setValue(new_time)
193 self.__time_label.setText(sec2min(new_time) + '/' + self.__time_label.duration)