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
23 from common
import APPNAME
, sec2min
, appIcon
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"""
45 def __init__(self
, mpclient
):
46 QtGui
.QWidget
.__init
__(self
)
47 self
.settings
= QtCore
.QSettings()
48 self
.mpclient
= mpclient
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
66 m
= mBar
.addMenu("File")
68 self
.mConnect
=m
.addAction('Connect ...', QtGui
.QApplication
.instance().show_connect_win
)
69 self
.mConnect
.setIcon(QtGui
.QIcon(appIcon
))
71 self
.mDisconnect
=m
.addAction('Disconnect', self
.mpclient
.disconnect_mpd
)
72 self
.mDisconnect
.setIcon(QtGui
.QIcon(':icons/disconnect.png'))
76 m
.addAction("Quit", QtGui
.QApplication
.instance().quit
).setIcon(QtGui
.QIcon(':icons/gtk-quit.svg'))
79 m
=mBar
.addMenu("Options")
81 m
.addAction("Settings", QtGui
.QApplication
.instance().show_settings_win
).setIcon(QtGui
.QIcon(':icons/gtk-preferences.svg'))
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())
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
()
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
)
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()
126 for action
in m
.actions():
127 self
.__layout
_menu
.addAction(action
)
129 def __toggle_titlebars(self
, val
):
131 self
.settings
.setValue('show_titlebars', QVariant(True))
133 self
.settings
.setValue('show_titlebars', QVariant(False))
134 for dock
in self
.__docks
:
136 dock
.setTitleBarWidget(None)
138 dock
.setTitleBarWidget(QtGui
.QWidget())
139 def add_dock(self
, dock
):
141 self
.__docks
.append(dock
)
142 self
.addDockWidget(QtCore
.Qt
.TopDockWidgetArea
, dock
)
143 self
.__update
_layout
_menu
()
144 def remove_dock(self
, dock
):
146 if dock
in self
.__docks
:
147 self
.__docks
.remove(dock
)
148 self
.removeDockWidget(dock
)
149 self
.__update
_layout
_menu
()
151 def setStatus(self
, status
):
152 """Set the text of the statusbar."""
153 self
.statusBar().showMessage(status
, 5000)
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()
161 layout
= QtCore
.QFile(':default_layout').readAll()
162 self
.restoreState(layout
)
165 def __on_connect_changed(self
, val
):
167 self
.mDisconnect
.setEnabled(True)
168 self
.mConnect
.setEnabled(False)
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'
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
))
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
)