From 0bfb73d20c1e56e156dcc7cf6964fdaee9099791 Mon Sep 17 00:00:00 2001 From: Ricky Brent Date: Mon, 14 Nov 2016 13:11:11 -0800 Subject: [PATCH] Added swatches for color picker and color picker, better boolean/combobox preferences --- qweechat/preferences.py | 66 ++++++++++++++++++++++++++++++++++++----- qweechat/qweechat.py | 14 +++++++++ 2 files changed, 72 insertions(+), 8 deletions(-) diff --git a/qweechat/preferences.py b/qweechat/preferences.py index ab5a0b9..d9aebe2 100644 --- a/qweechat/preferences.py +++ b/qweechat/preferences.py @@ -2,6 +2,8 @@ # # preferences.py - preferences dialog box # +# Copyright (C) 2016 Ricky Brent +# # This file is part of QWeeChat, a Qt remote GUI for WeeChat. # # QWeeChat is free software; you can redistribute it and/or modify @@ -81,6 +83,8 @@ class PreferencesDialog(QtGui.QDialog): for key, field in widget.fields.items(): if isinstance(field, QtGui.QComboBox): text = field.itemText(field.currentIndex()) + elif isinstance(field, QtGui.QCheckBox): + text = "on" if field.isChecked() else "off" else: text = field.text() self.config.set(widget.section_name, key, str(text)) @@ -110,6 +114,40 @@ class PreferencesTreeWidget(QtGui.QTreeWidget): self.setCurrentRow(0) +class PreferencesColorEdit(QtGui.QPushButton): + """Simple color square that changes based on the color selected.""" + def __init__(self, *args): + QtGui.QPushButton.__init__(*(self,) + args) + self.color = "#000000" + self.clicked.connect(self._color_picker) + # Some of the configured colors use a astrisk prefix. + # Toggle this on right click. + self.star = False + self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + self.customContextMenuRequested.connect(self._color_star) + + def insert(self, color): + """Insert the desired color for the widget.""" + if color[:1] == "*": + self.star = True + color = color[1:] + self.setText("*" if self.star else "") + self.color = color + self.setStyleSheet("background-color: " + color) + + def text(self): + """Returns the hex value of the color.""" + return ("*" if self.star else "") + self.color + + def _color_picker(self): + color = QtGui.QColorDialog.getColor() + self.insert(color.name()) + + def _color_star(self): + self.star = not self.star + self.insert(self.text()) + + class PreferencesPaneWidget(QtGui.QWidget): """ Widget with (from top to bottom): @@ -125,6 +163,10 @@ class PreferencesPaneWidget(QtGui.QWidget): self.setLayout(self.grid) self.grid.setColumnStretch(2, 1) self.grid.setSpacing(10) + self.checkboxes = ("ssl", "autoconnect", "statusbar", "topic", + "menubar", "toolbar", "nicklist", "debug") + self.comboboxes = {"style": QtGui.QStyleFactory.keys(), + "buffer_list": ["left", "right"]} def addItem(self, key, value): """Add a key-value pair.""" @@ -134,15 +176,23 @@ class PreferencesPaneWidget(QtGui.QWidget): start = 2 * (line % 2) line = line // 2 self.grid.addWidget(QtGui.QLabel(key.capitalize()), line, start + 0) - edit = QtGui.QLineEdit() - edit.setFixedWidth(200) - edit.insert(value) + if self.section_name == "color": + edit = PreferencesColorEdit() + edit.setFixedWidth(edit.sizeHint().height()) + edit.insert(value) + elif key in self.comboboxes.keys(): + edit = QtGui.QComboBox() + edit.addItems(self.comboboxes[key]) + edit.setCurrentIndex(edit.findText(value)) + edit.setFixedWidth(200) + elif key in self.checkboxes: + edit = QtGui.QCheckBox() + edit.setChecked(value == "on") + else: + edit = QtGui.QLineEdit() + edit.setFixedWidth(200) + edit.insert(value) if key == 'password': edit.setEchoMode(QtGui.QLineEdit.Password) - if key == 'style': - edit = QtGui.QComboBox() - edit.addItems(QtGui.QStyleFactory.keys()) - edit.setCurrentIndex(edit.findText(QtGui.qApp.style().objectName(), - QtCore.Qt.MatchFixedString)) self.grid.addWidget(edit, line, start + 1) self.fields[key] = edit diff --git a/qweechat/qweechat.py b/qweechat/qweechat.py index 15c4ab5..6fddda5 100644 --- a/qweechat/qweechat.py +++ b/qweechat/qweechat.py @@ -203,6 +203,12 @@ class MainWindow(QtGui.QMainWindow): self.actions['quit']]) self.toolbar = toolbar + # Override context menu for both -- default is a simple menubar toggle. + self.menu.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + self.toolbar.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + self.menu.customContextMenuRequested.connect(self._menu_context) + self.toolbar.customContextMenuRequested.connect(self._menu_context) + self.buffers[0].widget.input.setFocus() # open debug dialog @@ -263,6 +269,14 @@ class MainWindow(QtGui.QMainWindow): toggle = self.config.get(ac[0], ac[1]) self.actions[name].setChecked(toggle == "on") + def _menu_context(self, event): + """Show a slightly nicer context menu for the menu/toolbar.""" + menu = QtGui.QMenu() + menu.addActions([self.actions['show menubar'], + self.actions['show toolbar'], + self.actions['show status bar']]) + action = menu.exec_(self.mapToGlobal(event)) + def _buffer_switch(self, index): """Switch to a buffer.""" if index >= 0: