From 9ae0d7e5cf8f4f8a13248f2b9db2b6db3fb02ddb Mon Sep 17 00:00:00 2001 From: glubsy Date: Wed, 22 Jul 2020 21:38:03 +0200 Subject: [PATCH] Add color picker buttons to preferences dialog * Buttons display the color currently in use * Result table uses selected colors accordingly * Keep items aligned with GridLayouts in preference dialog * Reordering of items in a more logical manner* --- qt/preferences.py | 12 +++++ qt/preferences_dialog.py | 95 +++++++++++++++++++++++++++++++++------- qt/results_model.py | 6 +-- 3 files changed, 93 insertions(+), 20 deletions(-) diff --git a/qt/preferences.py b/qt/preferences.py index 3d00b42b..604a9107 100644 --- a/qt/preferences.py +++ b/qt/preferences.py @@ -5,6 +5,8 @@ # http://www.gnu.org/licenses/gpl-3.0.html from PyQt5.QtWidgets import QApplication +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QColor from hscommon import trans from hscommon.plat import ISLINUX @@ -40,6 +42,12 @@ class Preferences(PreferencesBase): self.details_dialog_override_theme_icons =\ get('DetailsDialogOverrideThemeIcons', self.details_dialog_override_theme_icons) if ISLINUX else True + + self.result_table_ref_foreground_color =\ + get('ResultTableRefForegroundColor', self.result_table_ref_foreground_color) + self.result_table_delta_foreground_color =\ + get('ResultTableDeltaForegroundColor', self.result_table_delta_foreground_color) + self.resultWindowIsMaximized = get( "ResultWindowIsMaximized", self.resultWindowIsMaximized ) @@ -80,6 +88,8 @@ class Preferences(PreferencesBase): self.details_dialog_vertical_titlebar = True # By default use internal icons on platforms other than Linux for now self.details_dialog_override_theme_icons = False if not ISLINUX else True + self.result_table_ref_foreground_color = QColor(Qt.blue) + self.result_table_delta_foreground_color = QColor(255, 142, 40) # orange self.resultWindowIsMaximized = False self.resultWindowRect = None self.directoriesWindowRect = None @@ -116,6 +126,8 @@ class Preferences(PreferencesBase): set_('DetailsDialogTitleBarEnabled', self.details_dialog_titlebar_enabled) set_('DetailsDialogVerticalTitleBar', self.details_dialog_vertical_titlebar) set_('DetailsDialogOverrideThemeIcons', self.details_dialog_override_theme_icons) + set_('ResultTableRefForegroundColor', self.result_table_ref_foreground_color) + set_('ResultTableDeltaForegroundColor', self.result_table_delta_foreground_color) set_("ResultWindowIsMaximized", self.resultWindowIsMaximized) self.set_rect("ResultWindowRect", self.resultWindowRect) self.set_rect("DirectoriesWindowRect", self.directoriesWindowRect) diff --git a/qt/preferences_dialog.py b/qt/preferences_dialog.py index f074f986..f7dac6e5 100644 --- a/qt/preferences_dialog.py +++ b/qt/preferences_dialog.py @@ -4,12 +4,13 @@ # which should be included with this package. The terms are also available at # http://www.gnu.org/licenses/gpl-3.0.html -from PyQt5.QtCore import Qt, QSize +from PyQt5.QtCore import Qt, QSize, pyqtSlot, pyqtSignal from PyQt5.QtWidgets import ( QDialog, QDialogButtonBox, QVBoxLayout, QHBoxLayout, + QGridLayout, QLabel, QComboBox, QSlider, @@ -22,7 +23,11 @@ from PyQt5.QtWidgets import ( QLayout, QTabWidget, QWidget, + QColorDialog, + QPushButton, + QFrame, ) +from PyQt5.QtGui import QPixmap, QColor, QIcon from hscommon.trans import trget from hscommon.plat import ISLINUX @@ -140,15 +145,42 @@ class PreferencesDialogBase(QDialog): self.widgetsVLayout.addWidget(self.customCommandEdit) def _setupDisplayPage(self): + self.languageLabel = QLabel(tr("Language:"), self) + self.languageComboBox = QComboBox(self) + for lang in self.supportedLanguages: + self.languageComboBox.addItem(get_langnames()[lang]) + self.displayVLayout.insertLayout( + 0, horizontalWrap([self.languageLabel, self.languageComboBox, None]) + ) + + line = QFrame(self) + line.setFrameShape(QFrame.HLine) + self.displayVLayout.addWidget(line) + + gridlayout = QGridLayout() + self.result_table_label = QLabel(tr("Result Table:")) + gridlayout.addWidget(self.result_table_label, 0, 0) self.fontSizeLabel = QLabel(tr("Font size:")) self.fontSizeSpinBox = QSpinBox() self.fontSizeSpinBox.setMinimum(5) - self.displayVLayout.addLayout( - horizontalWrap([self.fontSizeLabel, self.fontSizeSpinBox, None]) - ) + gridlayout.addWidget(self.fontSizeLabel, 1, 0) + gridlayout.addWidget(self.fontSizeSpinBox, 1, 1, 1, 1, Qt.AlignLeft) self._setupAddCheckbox("reference_bold_font", tr("Bold font for reference")) - self.displayVLayout.addWidget(self.reference_bold_font) + gridlayout.addWidget(self.reference_bold_font, 2, 0) + self.result_table_ref_foreground_color_label = QLabel(tr("Reference foreground color:")) + gridlayout.addWidget(self.result_table_ref_foreground_color_label, 3, 0) + self.result_table_ref_foreground_color = ColorPickerButton(self) + gridlayout.addWidget(self.result_table_ref_foreground_color, 3, 1, 1, 1, Qt.AlignLeft) + self.result_table_delta_foreground_color_label = QLabel(tr("Delta foreground color:")) + gridlayout.addWidget(self.result_table_delta_foreground_color_label, 4, 0) + self.result_table_delta_foreground_color = ColorPickerButton(self) + gridlayout.addWidget(self.result_table_delta_foreground_color, 4, 1, 1, 1, Qt.AlignLeft) + self.displayVLayout.addLayout(gridlayout) + + line = QFrame(self) + line.setFrameShape(QFrame.HLine) + self.displayVLayout.addWidget(line) self.details_dialog_label = QLabel(tr("Details window:")) self.displayVLayout.addWidget(self.details_dialog_label) @@ -167,19 +199,11 @@ class PreferencesDialogBase(QDialog): self._setupAddCheckbox("details_dialog_override_theme_icons", tr("Override theme icons")) self.details_dialog_override_theme_icons.setToolTip( - tr("Use our own internal icons instead of those provided by theme engine")) + tr("Use our own internal icons instead of those provided by the theme engine")) # Prevent changing this on platforms where themes are unpredictable self.details_dialog_override_theme_icons.setEnabled(False if not ISLINUX else True) self.displayVLayout.addWidget(self.details_dialog_override_theme_icons) - self.languageLabel = QLabel(tr("Language:"), self) - self.languageComboBox = QComboBox(self) - for lang in self.supportedLanguages: - self.languageComboBox.addItem(get_langnames()[lang]) - self.displayVLayout.insertLayout( - 0, horizontalWrap([self.languageLabel, self.languageComboBox, None]) - ) - def _setupAddCheckbox(self, name, label, parent=None): if parent is None: parent = self @@ -242,10 +266,17 @@ class PreferencesDialogBase(QDialog): self.customCommandEdit.setText(prefs.custom_command) if section & Sections.DISPLAY: setchecked(self.reference_bold_font, prefs.reference_bold_font) - setchecked(self.details_dialog_titlebar_enabled , prefs.details_dialog_titlebar_enabled) - setchecked(self.details_dialog_vertical_titlebar, prefs.details_dialog_vertical_titlebar) + setchecked(self.details_dialog_titlebar_enabled, + prefs.details_dialog_titlebar_enabled) + setchecked(self.details_dialog_vertical_titlebar, + prefs.details_dialog_vertical_titlebar) self.fontSizeSpinBox.setValue(prefs.tableFontSize) - setchecked(self.details_dialog_override_theme_icons, prefs.details_dialog_override_theme_icons) + setchecked(self.details_dialog_override_theme_icons, + prefs.details_dialog_override_theme_icons) + self.result_table_ref_foreground_color.setColor( + prefs.result_table_ref_foreground_color) + self.result_table_delta_foreground_color.setColor( + prefs.result_table_delta_foreground_color) try: langindex = self.supportedLanguages.index(self.app.prefs.language) except ValueError: @@ -266,6 +297,8 @@ class PreferencesDialogBase(QDialog): prefs.details_dialog_titlebar_enabled = ischecked(self.details_dialog_titlebar_enabled) prefs.details_dialog_vertical_titlebar = ischecked(self.details_dialog_vertical_titlebar) prefs.details_dialog_override_theme_icons = ischecked(self.details_dialog_override_theme_icons) + prefs.result_table_ref_foreground_color = self.result_table_ref_foreground_color.color + prefs.result_table_delta_foreground_color = self.result_table_delta_foreground_color.color prefs.destination_type = self.copyMoveDestinationComboBox.currentIndex() prefs.custom_command = str(self.customCommandEdit.text()) prefs.tableFontSize = self.fontSizeSpinBox.value() @@ -296,3 +329,31 @@ class PreferencesDialogBase(QDialog): if current_tab is self.page_display: section_to_update = Sections.DISPLAY self.resetToDefaults(section_to_update) + + +class ColorPickerButton(QPushButton): + def __init__(self, parent): + super().__init__(parent) + self.parent = parent + self.color = None + self.clicked.connect(self.onClicked) + + @pyqtSlot() + def onClicked(self): + color = QColorDialog.getColor( + self.color if self.color is not None else Qt.white, + self.parent) + self.setColor(color) + + def setColor(self, color): + size = QSize(1, 1) + px = QPixmap(size) + if color is None: + size.width = 0 + size.height = 0 + elif not color.isValid(): + return + else: + self.color = color + px.fill(color) + self.setIcon(QIcon(px)) diff --git a/qt/results_model.py b/qt/results_model.py index d16fcc97..b896bc92 100644 --- a/qt/results_model.py +++ b/qt/results_model.py @@ -7,7 +7,7 @@ # http://www.gnu.org/licenses/gpl-3.0.html from PyQt5.QtCore import Qt, pyqtSignal, QModelIndex -from PyQt5.QtGui import QBrush, QFont, QFontMetrics, QColor +from PyQt5.QtGui import QBrush, QFont, QFontMetrics from PyQt5.QtWidgets import QTableView from qtlib.table import Table @@ -37,9 +37,9 @@ class ResultsModel(Table): return data[column.name] elif role == Qt.ForegroundRole: if row.isref: - return QBrush(Qt.blue) + return QBrush(self.prefs.result_table_ref_foreground_color) elif row.is_cell_delta(column.name): - return QBrush(QColor(255, 142, 40)) # orange + return QBrush(self.prefs.result_table_delta_foreground_color) elif role == Qt.FontRole: font = QFont(self.view.font()) if self.prefs.reference_bold_font: