colourterm/colourterm/settingsdialog.py

383 lines
20 KiB
Python

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
from colourterm import Highlight, from_utf8, translate
class UiSettingsDialog(object):
def __init__(self):
"""
Just to satisfy PEP8/PyLint
"""
self.settings_layout = None
self.splitter = None
self.section_list_widget = None
self.section_stacked_widget = None
self.highlight_page = None
self.vertical_layout = None
self.highlight_list_widget = None
self.button_layout = None
self.up_button = None
self.down_button = None
self.add_button = None
self.edit_button = None
self.delete_button = None
self.save_button = None
self.discard_button = None
self.highlight_groupbox = None
self.highlight_layout = None
self.regex_label = None
self.regex_edit = None
self.foreground_label = None
self.fg_colour_button = None
self.background_checkbox = None
self.bg_colour_button = None
self.font_page = None
self.font_layout = None
self.font_label = None
self.font_combobox = None
self.size_label = None
self.size_spinbox = None
self.button_box = None
def setup_ui(self, settings_dialog):
settings_dialog.setObjectName(from_utf8('SettingsDialog'))
settings_dialog.resize(587, 390)
self.settings_layout = QtWidgets.QVBoxLayout(settings_dialog)
self.settings_layout.setSpacing(8)
self.settings_layout.setContentsMargins(8, 8, 8, 8)
self.settings_layout.setObjectName(from_utf8('settings_layout'))
self.splitter = QtWidgets.QSplitter(settings_dialog)
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setObjectName(from_utf8('splitter'))
self.section_list_widget = QtWidgets.QListWidget(self.splitter)
size_policy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
size_policy.setHorizontalStretch(0)
size_policy.setVerticalStretch(0)
size_policy.setHeightForWidth(self.section_list_widget.sizePolicy().hasHeightForWidth())
self.section_list_widget.setSizePolicy(size_policy)
self.section_list_widget.setMinimumSize(QtCore.QSize(100, 0))
self.section_list_widget.setMaximumSize(QtCore.QSize(200, 16777215))
self.section_list_widget.setObjectName(from_utf8('section_list_widget'))
item = QtWidgets.QListWidgetItem()
self.section_list_widget.addItem(item)
item = QtWidgets.QListWidgetItem()
self.section_list_widget.addItem(item)
self.section_stacked_widget = QtWidgets.QStackedWidget(self.splitter)
size_policy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
size_policy.setHorizontalStretch(0)
size_policy.setVerticalStretch(0)
size_policy.setHeightForWidth(self.section_stacked_widget.sizePolicy().hasHeightForWidth())
self.section_stacked_widget.setSizePolicy(size_policy)
self.section_stacked_widget.setObjectName(from_utf8('section_stacked_widget'))
self.highlight_page = QtWidgets.QWidget()
self.highlight_page.setObjectName(from_utf8('highlight_page'))
self.vertical_layout = QtWidgets.QVBoxLayout(self.highlight_page)
self.vertical_layout.setObjectName(from_utf8('vertical_layout'))
self.highlight_list_widget = QtWidgets.QListWidget(self.highlight_page)
self.highlight_list_widget.setObjectName(from_utf8('highlight_list_widget'))
self.vertical_layout.addWidget(self.highlight_list_widget)
self.button_layout = QtWidgets.QHBoxLayout()
self.button_layout.setSpacing(8)
self.button_layout.setContentsMargins(0, -1, -1, -1)
self.button_layout.setObjectName(from_utf8('button_layout'))
self.up_button = QtWidgets.QToolButton(self.highlight_page)
self.up_button.setIcon(QtGui.QIcon(':/settings/move-up.png'))
self.up_button.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
self.up_button.setFocusPolicy(QtCore.Qt.NoFocus)
self.up_button.setObjectName(from_utf8('up_button'))
self.button_layout.addWidget(self.up_button)
self.down_button = QtWidgets.QToolButton(self.highlight_page)
self.down_button.setIcon(QtGui.QIcon(':/settings/move-down.png'))
self.down_button.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
self.down_button.setFocusPolicy(QtCore.Qt.NoFocus)
self.down_button.setObjectName(from_utf8('down_button'))
self.button_layout.addWidget(self.down_button)
self.button_layout.addItem(QtWidgets.QSpacerItem(40, 20,
QtWidgets.QSizePolicy.Expanding,
QtWidgets.QSizePolicy.Minimum))
self.add_button = QtWidgets.QPushButton(self.highlight_page)
self.add_button.setIcon(QtGui.QIcon(':/settings/highlight-add.png'))
self.add_button.setObjectName(from_utf8('add_button'))
self.button_layout.addWidget(self.add_button)
self.edit_button = QtWidgets.QPushButton(self.highlight_page)
self.edit_button.setIcon(QtGui.QIcon(':/settings/highlight-edit.png'))
self.edit_button.setObjectName(from_utf8('edit_button'))
self.button_layout.addWidget(self.edit_button)
self.delete_button = QtWidgets.QPushButton(self.highlight_page)
self.delete_button.setIcon(QtGui.QIcon(':/settings/highlight-remove.png'))
self.delete_button.setObjectName(from_utf8('delete_button'))
self.button_layout.addWidget(self.delete_button)
self.save_button = QtWidgets.QPushButton(self.highlight_page)
self.save_button.setIcon(QtGui.QIcon(':/settings/highlight-save.png'))
self.save_button.setObjectName(from_utf8('save_button'))
self.save_button.setVisible(False)
self.button_layout.addWidget(self.save_button)
self.discard_button = QtWidgets.QPushButton(self.highlight_page)
self.discard_button.setIcon(QtGui.QIcon(':/settings/highlight-discard.png'))
self.discard_button.setObjectName(from_utf8('discard_button'))
self.discard_button.setVisible(False)
self.button_layout.addWidget(self.discard_button)
self.vertical_layout.addLayout(self.button_layout)
self.highlight_groupbox = QtWidgets.QGroupBox(self.highlight_page)
self.highlight_groupbox.setObjectName(from_utf8('highlight_groupbox'))
self.highlight_layout = QtWidgets.QFormLayout(self.highlight_groupbox)
self.highlight_layout.setContentsMargins(8, 8, 8, 8)
self.highlight_layout.setSpacing(8)
self.highlight_layout.setObjectName(from_utf8('highlight_layout'))
self.regex_label = QtWidgets.QLabel(self.highlight_groupbox)
self.regex_label.setObjectName(from_utf8('regex_label'))
self.highlight_layout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.regex_label)
self.regex_edit = QtWidgets.QLineEdit(self.highlight_groupbox)
self.regex_edit.setObjectName(from_utf8('regex_edit'))
self.highlight_layout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.regex_edit)
self.foreground_label = QtWidgets.QLabel(self.highlight_groupbox)
self.foreground_label.setObjectName(from_utf8('foreground_label'))
self.highlight_layout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.foreground_label)
self.fg_colour_button = QtWidgets.QPushButton(self.highlight_groupbox)
self.fg_colour_button.setText(from_utf8(''))
self.fg_colour_button.setObjectName(from_utf8('fg_colour_button'))
self.highlight_layout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.fg_colour_button)
self.background_checkbox = QtWidgets.QCheckBox(self.highlight_groupbox)
self.background_checkbox.setObjectName(from_utf8('background_checkbox'))
self.highlight_layout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.background_checkbox)
self.bg_colour_button = QtWidgets.QPushButton(self.highlight_groupbox)
self.bg_colour_button.setText(from_utf8(''))
self.bg_colour_button.setObjectName(from_utf8('bg_colour_button'))
self.highlight_layout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.bg_colour_button)
self.vertical_layout.addWidget(self.highlight_groupbox)
self.section_stacked_widget.addWidget(self.highlight_page)
self.font_page = QtWidgets.QWidget()
self.font_page.setObjectName(from_utf8('font_page'))
self.font_layout = QtWidgets.QFormLayout(self.font_page)
self.font_layout.setContentsMargins(8, 8, 8, 8)
self.font_layout.setSpacing(8)
self.font_layout.setObjectName(from_utf8('font_layout'))
self.font_label = QtWidgets.QLabel(self.font_page)
self.font_label.setObjectName(from_utf8('font_label'))
self.font_layout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.font_label)
self.font_combobox = QtWidgets.QFontComboBox(self.font_page)
self.font_combobox.setObjectName(from_utf8('font_combobox'))
self.font_layout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.font_combobox)
self.size_label = QtWidgets.QLabel(self.font_page)
self.size_label.setObjectName(from_utf8('size_label'))
self.font_layout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.size_label)
self.size_spinbox = QtWidgets.QSpinBox(self.font_page)
self.size_spinbox.setReadOnly(True)
self.size_spinbox.setSpecialValueText(from_utf8(''))
self.size_spinbox.setMinimum(6)
self.size_spinbox.setMaximum(50)
self.size_spinbox.setProperty('value', 12)
self.size_spinbox.setObjectName(from_utf8('size_spinbox'))
self.font_layout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.size_spinbox)
self.section_stacked_widget.addWidget(self.font_page)
self.settings_layout.addWidget(self.splitter)
self.button_box = QtWidgets.QDialogButtonBox(settings_dialog)
self.button_box.setOrientation(QtCore.Qt.Horizontal)
self.button_box.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok)
self.button_box.setObjectName(from_utf8('button_box'))
self.settings_layout.addWidget(self.button_box)
self.retranslate_ui(settings_dialog)
self.button_box.accepted.connect(settings_dialog.accept)
self.button_box.rejected.connect(settings_dialog.reject)
self.section_list_widget.currentRowChanged.connect(self.section_stacked_widget.setCurrentIndex)
settings_dialog.setTabOrder(self.section_list_widget, self.highlight_list_widget)
settings_dialog.setTabOrder(self.highlight_list_widget, self.add_button)
settings_dialog.setTabOrder(self.add_button, self.edit_button)
settings_dialog.setTabOrder(self.edit_button, self.delete_button)
settings_dialog.setTabOrder(self.delete_button, self.save_button)
settings_dialog.setTabOrder(self.save_button, self.discard_button)
settings_dialog.setTabOrder(self.discard_button, self.button_box)
def retranslate_ui(self, settings_dialog):
"""
Translate the user interface
"""
settings_dialog.setWindowTitle(translate('SettingsDialog', 'Settings'))
__sortingEnabled = self.section_list_widget.isSortingEnabled()
self.section_list_widget.setSortingEnabled(False)
item = self.section_list_widget.item(0)
item.setText(translate('SettingsDialog', 'Highlighting'))
item = self.section_list_widget.item(1)
item.setText(translate('SettingsDialog', 'Font'))
self.section_list_widget.setSortingEnabled(__sortingEnabled)
self.up_button.setText(translate('SettingsDialog', 'Move Up'))
self.down_button.setText(translate('SettingsDialog', 'Move Down'))
self.add_button.setText(translate('SettingsDialog', 'Add'))
self.edit_button.setText(translate('SettingsDialog', 'Edit'))
self.delete_button.setText(translate('SettingsDialog', 'Delete'))
self.save_button.setText(translate('SettingsDialog', 'Save'))
self.discard_button.setText(translate('SettingsDialog', 'Discard'))
self.highlight_groupbox.setTitle(translate('SettingsDialog', 'Highlight'))
self.regex_label.setText(translate('SettingsDialog', 'Regular Expression:'))
self.foreground_label.setText(translate('SettingsDialog', 'Foreground:'))
self.background_checkbox.setText(translate('SettingsDialog', 'Background:'))
self.font_label.setText(translate('SettingsDialog', 'Font:'))
self.size_label.setText(translate('SettingsDialog', 'Size:'))
self.size_spinbox.setSuffix(translate('SettingsDialog', 'pt'))
class SettingsDialog(QtWidgets.QDialog, UiSettingsDialog):
def __init__(self):
QtWidgets.QDialog.__init__(self)
self.setup_ui(self)
self._highlights = {}
self._current_highlight = None
self._current_row = -1
self.highlight_list_widget.itemSelectionChanged.connect(self.on_highlight_item_selected)
self.regex_edit.textEdited.connect(self.on_regex_edit_text_edited)
self.fg_colour_button.clicked.connect(self.on_fg_colour_button_clicked)
self.background_checkbox.toggled.connect(self.on_background_checkbox_toggled)
self.bg_colour_button.clicked.connect(self.on_bg_colour_button_clicked)
self.up_button.clicked.connect(self.on_up_button_clicked)
self.down_button.clicked.connect(self.on_down_button_clicked)
self.add_button.clicked.connect(self.on_add_button_clicked)
self.edit_button.clicked.connect(self.on_edit_button_clicked)
self.delete_button.clicked.connect(self.on_delete_button_clicked)
self.save_button.clicked.connect(self.on_save_button_clicked)
self.discard_button.clicked.connect(self.on_discard_button_clicked)
def _set_current_highlight(self):
self.regex_edit.setText(self._current_highlight.pattern)
if self._current_highlight.background:
self.background_checkbox.setChecked(True)
self.bg_colour_button.setEnabled(True)
self.bg_colour_button.setStyleSheet('background-color: %s' % self._current_highlight.background)
else:
self.background_checkbox.setChecked(False)
self.bg_colour_button.setEnabled(False)
self.bg_colour_button.setStyleSheet('')
self.fg_colour_button.setStyleSheet('background-color: %s' % self._current_highlight.foreground)
self.set_edit_mode(True)
def highlights(self):
return self._highlights.values()
def set_highlights(self, highlights):
self._highlights = {}
self.highlight_list_widget.clear()
for index, highlight in enumerate(highlights):
self._highlights[index] = highlight
item = QtWidgets.QListWidgetItem()
if highlight.background:
item.setBackground(QtGui.QBrush(QtGui.QColor(highlight.background)))
item.setForeground(QtGui.QBrush(QtGui.QColor(highlight.foreground)))
item.setText(highlight.pattern)
self.highlight_list_widget.addItem(item)
def on_highlight_item_selected(self):
self._current_row = self.highlight_list_widget.currentRow()
if self._current_row > -1:
self._current_highlight = self._highlights[self._current_row]
def on_regex_edit_text_edited(self):
self._current_highlight.set_pattern(self.regex_edit.text())
def on_background_checkbox_toggled(self, checked):
self.bg_colour_button.setEnabled(checked)
if not checked:
self._current_highlight.background = None
def on_fg_colour_button_clicked(self):
colour = QtWidgets.QColor(self._current_highlight.foreground)
colour = QtWidgets.QColorDialog.getColor(colour, self)
if colour.isValid():
self.fg_colour_button.setStyleSheet('background-color: %s' % colour.name())
self._current_highlight.foreground = colour.name()
def on_bg_colour_button_clicked(self):
if self._current_highlight.background:
colour = QtWidgets.QColor(self._current_highlight.background)
colour = QtWidgets.QColorDialog.getColor(colour, self)
else:
colour = QtWidgets.QColorDialog.getColor(QtCore.Qt.white, self)
if colour.isValid():
self.bg_colour_button.setStyleSheet('background-color: %s' % colour.name())
self._current_highlight.background = colour.name()
def on_up_button_clicked(self):
if self._current_row == 0:
return
row = self._current_row
item = self.highlight_list_widget.takeItem(row)
self.highlight_list_widget.insertItem(row - 1, item)
self._highlights[row - 1], self._highlights[row] = \
self._highlights[row], self._highlights[row - 1]
self.highlight_list_widget.setCurrentRow(row - 1)
self.on_highlight_item_selected()
def on_down_button_clicked(self):
if self._current_row == len(self._highlights) - 1:
return
row = self._current_row
item = self.highlight_list_widget.takeItem(row)
self.highlight_list_widget.insertItem(row + 1, item)
self._highlights[row + 1], self._highlights[row] = \
self._highlights[row], self._highlights[row + 1]
self.highlight_list_widget.setCurrentRow(row + 1)
self.on_highlight_item_selected()
def on_add_button_clicked(self):
self._current_row = -1
self._current_highlight = Highlight(u'', QtWidgets.QColor(QtWidgets.QPalette.WindowText).name())
self._set_current_highlight()
self.set_edit_mode(True)
def on_edit_button_clicked(self):
self._set_current_highlight()
self.set_edit_mode(True)
def on_delete_button_clicked(self):
if QtWidgets.QMessageBox.question(self, translate('SettingsDialog', 'Confirm Delete'),
translate('SettingsDialog',
'Are you sure you want to delete this highlight?'),
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) == \
QtWidgets.QMessageBox.Yes:
del self._highlights[self._current_row]
self.highlight_list_widget.takeItem(self._current_row)
self._current_row = -1
self._current_highlight = None
def on_save_button_clicked(self):
if self._current_row < 0:
new_index = len(self._highlights)
self._highlights[new_index] = self._current_highlight
item = QtWidgets.QListWidgetItem()
if self._current_highlight.background:
item.setBackgroundColor(QtWidgets.QColor(self._current_highlight.background))
item.setTextColor(QtWidgets.QColor(self._current_highlight.foreground))
item.setText(self._current_highlight.pattern)
self.highlight_list_widget.addItem(item)
self.highlight_list_widget.setCurrentRow(new_index)
else:
self._highlights[self._current_row] = self._current_highlight
self.set_edit_mode(False)
def on_discard_button_clicked(self):
self.set_edit_mode(False)
def set_edit_mode(self, enable):
for button in self.button_box.buttons():
button.setEnabled(not enable)
self.up_button.setVisible(not enable)
self.down_button.setVisible(not enable)
self.add_button.setVisible(not enable)
self.edit_button.setVisible(not enable)
self.delete_button.setVisible(not enable)
self.save_button.setVisible(enable)
self.discard_button.setVisible(enable)
self.highlight_list_widget.setEnabled(not enable)
self.regex_edit.setEnabled(enable)
self.fg_colour_button.setEnabled(enable)
self.background_checkbox.setEnabled(enable)
if enable and self.background_checkbox.isChecked():
self.bg_colour_button.setEnabled(True)
else:
self.bg_colour_button.setEnabled(False)
if not enable:
self.regex_edit.clear()
self.fg_colour_button.setStyleSheet('')
self.bg_colour_button.setStyleSheet('')