from PyQt4 import QtGui, QtCore from PyQt4.QtCore import QVariant import os from misc import ORGNAME, APPNAME, Button, appIcon import plugin class SettingsWindow(QtGui.QWidget): save_btn = None close_btn = None pluginlist = None main_win = None settings = None settings_wg = [] class SettingsWidgetMPD(plugin.Plugin.SettingsWidget): mpclient = None host_txt = None port_txt = None lib_txt = None update = None outputs = None def __init__(self, mpclient): plugin.Plugin.SettingsWidget.__init__(self, None) self.mpclient = mpclient self.settings().beginGroup('MPD') self.host_txt = QtGui.QLineEdit(self.settings().value('host', QVariant('localhost')).toString()) self.port_txt = QtGui.QLineEdit(self.settings().value('port', QVariant('6600')).toString()) self.lib_txt = QtGui.QLineEdit(self.settings().value('music_dir', QVariant(os.path.expanduser('~/music/'))).toString()) self.settings().endGroup() self.update = QtGui.QPushButton('Update MPD database') self.connect(self.update, QtCore.SIGNAL('clicked()'), self.update_db) self.outputs = QtGui.QGroupBox('Audio outputs') self.outputs.setLayout(QtGui.QVBoxLayout()) class Output(QtGui.QCheckBox): id = None mpclient = None def __init__(self, text, mpclient, id): QtGui.QCheckBox.__init__(self, text) self.mpclient = mpclient self.id = id self.connect(self, QtCore.SIGNAL('stateChanged(int)'), self.change_state) def change_state(self, state): self.mpclient.set_output(self.id, state) for output in self.mpclient.outputs(): box = Output(output['outputname'], self.mpclient, output['outputid']) if output['outputenabled'] == '1': box.setChecked(True) else: box.setChecked(False) self.outputs.layout().addWidget(box) self.setLayout(QtGui.QVBoxLayout()) self._add_widget(self.host_txt, 'Host', 'Host or socket to connect to') self._add_widget(self.port_txt, 'Port', 'Port to use (empty when using sockets)') self._add_widget(self.lib_txt, 'Music library', 'Path to music library') self.layout().addWidget(self.update) self.layout().addWidget(self.outputs) def save_settings(self): self.settings().beginGroup('MPD') self.settings().setValue('host', QVariant(self.host_txt.text())) self.settings().setValue('port', QVariant(self.port_txt.text())) self.settings().setValue('music_dir', QVariant(self.lib_txt.text())) self.settings().endGroup() def update_db(self): self.mpclient.update_db() def __init__(self, main_win): QtGui.QWidget.__init__(self, main_win, QtCore.Qt.Window) self.settings = QtCore.QSettings(ORGNAME, APPNAME) self.main_win = main_win self.save_btn = Button('save all', self.save_clicked) self.close_btn = Button('close', self.close_clicked) tab_wg = QtGui.QTabWidget(self) self.settings_wg.append(self.SettingsWidgetMPD(self.main_win.mpclient)) tab_wg.addTab(self.settings_wg[-1], 'MPD settings') self.pluginlist = QtGui.QListWidget(self) self.fill_pluginlist() tab_wg.addTab(self.pluginlist, 'Plugins') for plugin in self.main_win.plugins.loaded_plugins(): wg = plugin.get_settings_widget() if wg: self.settings_wg.append(wg) tab_wg.addTab(self.settings_wg[-1], plugin.name()) self.setLayout(QtGui.QGridLayout()) self.layout().addWidget(tab_wg, 0, 0, 1, 2) self.layout().addWidget(self.save_btn, 1, 0) self.layout().addWidget(self.close_btn, 1, 1) self.connect(self.pluginlist, QtCore.SIGNAL('itemChanged(QListWidgetItem*)'), self.plugin_checked) self.setWindowIcon(QtGui.QIcon(appIcon)) self.setWindowTitle('Settings') self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.center() self.resize(800,400) def fill_pluginlist(self): self.pluginlist.clear() for plugin in self.main_win.plugins.plugins(): item = QtGui.QListWidgetItem("%s\t%s"%(plugin.name(), plugin.info())) if plugin.is_loaded(): item.setCheckState(QtCore.Qt.Checked) else: item.setCheckState(QtCore.Qt.Unchecked) self.pluginlist.addItem(item) def center(self): screen = QtGui.QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2+100) def save_clicked(self): for wg in self.settings_wg: wg.save_settings() def close_clicked(self): self.close() def plugin_checked(self, item): toload = (item.checkState() == QtCore.Qt.Checked) name = str(item.text()[0:str(item.text()).find('\t')]) if toload: # refresh the plugin file self.main_win.plugins.load(name) self.fill_pluginlist() self.main_win.restoreLayout() else: self.main_win.plugins.unload(name) self.settings.setValue(name + '/load', QtCore.QVariant(toload)) def closeEvent(self, event): self.settings_wg = None self.main_win.wSettings = None