diff --git a/qweechat/preferences.py b/qweechat/preferences.py new file mode 100644 index 0000000..68d30e3 --- /dev/null +++ b/qweechat/preferences.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- +# +# preferences.py - preferences dialog box +# +# This file is part of QWeeChat, a Qt remote GUI for WeeChat. +# +# QWeeChat is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# QWeeChat is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with QWeeChat. If not, see . +# + +import qt_compat +import config +from buffer import GenericListWidget + +QtCore = qt_compat.import_module('QtCore') +QtGui = qt_compat.import_module('QtGui') + + +class PreferencesDialog(QtGui.QDialog): + """Preferences dialog.""" + + def __init__(self, name, config, *args): + QtGui.QDialog.__init__(*(self,) + args) + self.setModal(True) + self.setWindowTitle(name) + self.config = config + self.stacked_panes = QtGui.QStackedWidget() + self.list_panes = PreferencesListWidget() + splitter = QtGui.QSplitter() + splitter.addWidget(self.list_panes) + splitter.addWidget(self.stacked_panes) + + for section_name in config.sections(): + item = QtGui.QListWidgetItem(section_name) + pane = PreferencesPaneWidget(section_name) + self.list_panes.addItem(item) + self.stacked_panes.addWidget(pane) + for name, value in config.items(section_name): + pane.addItem(name, value) + self.list_panes.currentRowChanged.connect(self._pane_switch) + + hbox = QtGui.QHBoxLayout() + self.dialog_buttons = QtGui.QDialogButtonBox() + self.dialog_buttons.setStandardButtons( + QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel) + self.dialog_buttons.rejected.connect(self.close) + self.dialog_buttons.accepted.connect(self._save_and_close) + + hbox.addStretch(1) + hbox.addWidget(self.dialog_buttons) + hbox.addStretch(1) + + vbox = QtGui.QVBoxLayout() + vbox.addWidget(splitter) + vbox.addLayout(hbox) + + self.setLayout(vbox) + self.show() + + def _pane_switch(self, index): + """Switch the visible preference pane.""" + if index >= 0: + self.stacked_panes.setCurrentIndex(index) + + def _save_and_close(self): + for widget in (self.stacked_panes.widget(i) + for i in range(self.stacked_panes.count())): + for key, field in widget.fields.iteritems(): + self.config.set(widget.section_name, key, str(field.text())) + config.write(self.config) + self.close() + + +class PreferencesListWidget(GenericListWidget): + """Widget with list of preferences.""" + + def __init__(self, *args): + GenericListWidget.__init__(*(self,) + args) + + def switch_prev_buffer(self): + if self.currentRow() > 0: + self.setCurrentRow(self.currentRow() - 1) + else: + self.setCurrentRow(self.count() - 1) + + def switch_next_buffer(self): + if self.currentRow() < self.count() - 1: + self.setCurrentRow(self.currentRow() + 1) + else: + self.setCurrentRow(0) + + +class PreferencesPaneWidget(QtGui.QWidget): + """ + Widget with (from top to bottom): + title, chat + nicklist (optional) + prompt/input. + """ + + def __init__(self, section_name): + QtGui.QWidget.__init__(self) + self.grid = QtGui.QGridLayout() + self.section_name = section_name + self.fields = {} + self.setLayout(self.grid) + + def addItem(self, key, value): + """Add a key-value pair.""" + line = len(self.fields) + self.grid.addWidget(QtGui.QLabel(key.capitalize()), line, 0) + line_edit = QtGui.QLineEdit() + line_edit.setFixedWidth(200) + line_edit.insert(value) + if key == 'password': + line_edit.setEchoMode(QtGui.QLineEdit.Password) + self.grid.addWidget(line_edit, line, 1) + self.fields[key] = line_edit diff --git a/qweechat/qweechat.py b/qweechat/qweechat.py index cf0bca3..e430d35 100644 --- a/qweechat/qweechat.py +++ b/qweechat/qweechat.py @@ -44,6 +44,7 @@ from connection import ConnectionDialog from buffer import BufferListWidget, Buffer from debug import DebugDialog from about import AboutDialog +from preferences import PreferencesDialog from version import qweechat_version QtCore = qt_compat.import_module('QtCore') @@ -198,10 +199,8 @@ class MainWindow(QtGui.QMainWindow): def open_preferences_dialog(self): """Open a dialog with preferences.""" - # TODO: implement the preferences dialog box - messages = ['Not yet implemented!', - ''] - self.preferences_dialog = AboutDialog('Preferences', messages, self) + self.preferences_dialog = PreferencesDialog('Preferences', self.config, + self) def save_connection(self): """Save connection configuration."""