Source code for qtdraw.core.dialog_preference

"""
Preference dialog.

This module provides preference dialog for PyVistaWidget.
"""

from PySide6.QtWidgets import QDialog, QTabWidget, QWidget, QDialogButtonBox
from PySide6.QtCore import Qt
from qtdraw.widget.custom_widget import Layout, Label, Combo, Spin, DSpin, Check, VSpacer, HSpacer, ColorSelector
from qtdraw.util.util import create_style_sheet


# ==================================================
[docs] class PreferenceDialog(QDialog): # ================================================== def __init__(self, widget, parent=None): """ Preference dialog. Args: widget (PyVistaWidget): widget. parent (QWidget, optional): parent. """ super().__init__(parent) self.setWindowTitle("Preferences") self.resize(400, 300) self.widget = widget self.preference = widget._preference panel_label = self.create_label_panel(self) panel_axis = self.create_axis_panel(self) panel_cell = self.create_cell_panel(self) panel_light = self.create_light_panel(self) panel_latex = self.create_latex_panel(self) panel_general = self.create_general_panel(self) # tab content. tab = QTabWidget(self) tab.addTab(panel_label, "Label") tab.addTab(panel_axis, "Axis") tab.addTab(panel_cell, "Cell") tab.addTab(panel_light, "Light") tab.addTab(panel_latex, "LaTeX") tab.addTab(panel_general, "General") # button. button = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel | QDialogButtonBox.Apply) button.accepted.connect(self.accept) button.rejected.connect(self.reject) button.button(QDialogButtonBox.Apply).clicked.connect(self.apply) # main layout. layout = Layout(self) layout.setContentsMargins(10, 5, 10, 5) layout.addWidget(tab, 0, 0, 1, 2) layout.addWidget(button, 1, 0, 2, 1) # ==================================================
[docs] def create_label_panel(self, parent): """ Create label panel. """ panel = QWidget(parent) layout = Layout(panel) layout.setContentsMargins(10, 5, 10, 5) preference = self.preference["label"] # widgets. label_font = Label(parent, "font") combo_font = Combo(parent, ["arial", "courier", "times"]) label_size = Label(parent, "size") spin_size = Spin(parent, 4, 48) label_color = Label(parent, "color") combo_color = ColorSelector(parent, preference["color"], color_type="color") check_bold = Check(parent, "bold") check_italic = Check(parent, "italic") check_default = Check(parent, "default check") # set layout. layout.addWidget(label_font, 0, 0, 1, 1, Qt.AlignRight) layout.addWidget(combo_font, 0, 1, 1, 1) layout.addWidget(label_size, 0, 2, 1, 1, Qt.AlignRight) layout.addWidget(spin_size, 0, 3, 1, 1) layout.addWidget(check_bold, 1, 1, 1, 1) layout.addWidget(check_italic, 1, 3, 1, 1) layout.addWidget(label_color, 2, 0, 1, 1, Qt.AlignRight) layout.addWidget(combo_color, 2, 1, 1, 1) layout.addWidget(check_default, 3, 1, 1, 1) layout.addItem(HSpacer(), 0, 4, 1, 1) layout.addItem(VSpacer(), 4, 0, 1, 1) # initial values. combo_font.setCurrentText(preference["font"]) spin_size.setProperty("value", preference["size"]) check_bold.setChecked(preference["bold"]) check_italic.setChecked(preference["italic"]) check_default.setChecked(preference["default_check"]) # connections. combo_font.currentTextChanged.connect(lambda v: preference.update({"font": v})) spin_size.valueChanged.connect(lambda v: preference.update({"size": v})) combo_color.currentTextChanged.connect(lambda v: preference.update({"color": v})) check_bold.toggled.connect(lambda flag: preference.update({"bold": flag})) check_italic.toggled.connect(lambda flag: preference.update({"italic": flag})) check_default.toggled.connect(lambda flag: preference.update({"default_check": flag})) return panel
# ==================================================
[docs] def create_axis_panel(self, parent): """ Create axis panel. """ panel = QWidget(parent) layout = Layout(panel) layout.setContentsMargins(10, 5, 10, 5) preference = self.preference["axis"] axis_type = { "xyz": "[x,y,z]", "abc": "[a,b,c]", "abc*": "[a*,b*,c*]", "[x,y,z]": "xyz", "[a,b,c]": "abc", "[a*,b*,c*]": "abc*", } # widgets. label_type = Label(parent, "type") combo_type = Combo(parent, ["xyz", "abc", "abc*"]) label_size = Label(parent, "size") spin_size = Spin(parent, 12, 36) check_bold = Check(parent, "bold") check_italic = Check(parent, "italic") # set layout. layout.addWidget(label_type, 0, 0, 1, 1, Qt.AlignRight) layout.addWidget(combo_type, 0, 1, 1, 1) layout.addWidget(label_size, 0, 2, 1, 1, Qt.AlignRight) layout.addWidget(spin_size, 0, 3, 1, 1) layout.addWidget(check_bold, 1, 1, 1, 1) layout.addWidget(check_italic, 1, 3, 1, 1) layout.addItem(HSpacer(), 0, 4, 1, 1) layout.addItem(VSpacer(), 2, 0, 1, 1) # initial values. combo_type.setCurrentText(axis_type[preference["label"]]) spin_size.setProperty("value", preference["size"]) check_bold.setChecked(preference["bold"]) check_italic.setChecked(preference["italic"]) # connections. combo_type.currentTextChanged.connect(lambda v: preference.update({"label": axis_type[v]})) spin_size.valueChanged.connect(lambda v: preference.update({"size": v})) check_bold.toggled.connect(lambda flag: preference.update({"bold": flag})) check_italic.toggled.connect(lambda flag: preference.update({"italic": flag})) return panel
# ==================================================
[docs] def create_cell_panel(self, parent): """ Create cell panel. """ panel = QWidget(parent) layout = Layout(panel) layout.setContentsMargins(10, 5, 10, 5) preference = self.preference["cell"] # widgets. label_width = Label(parent, "width") spin_width = DSpin(parent, 0.0, 5.0, 0.1) label_color = Label(parent, "color") combo_color = ColorSelector(parent, preference["color"], color_type="color") label_opacity = Label(parent, "opacity") spin_opacity = DSpin(parent, 0.0, 1.0, 0.1) # set layout. layout.addWidget(label_width, 0, 0, 1, 1, Qt.AlignRight) layout.addWidget(spin_width, 0, 1, 1, 1) layout.addWidget(label_opacity, 1, 0, 1, 1, Qt.AlignRight) layout.addWidget(spin_opacity, 1, 1, 1, 1) layout.addWidget(label_color, 2, 0, 1, 1, Qt.AlignRight) layout.addWidget(combo_color, 2, 1, 1, 2) layout.addItem(HSpacer(), 2, 3, 1, 1) layout.addItem(VSpacer(), 3, 0, 1, 1) # initial values. spin_width.setProperty("value", preference["line_width"]) spin_opacity.setProperty("value", preference["opacity"]) # connections. spin_width.valueChanged.connect(lambda v: preference.update({"line_width": round(v, 4)})) combo_color.currentTextChanged.connect(lambda v: preference.update({"color": v})) spin_opacity.valueChanged.connect(lambda v: preference.update({"opacity": round(v, 4)})) return panel
# ==================================================
[docs] def create_light_panel(self, parent): """ Create light panel. """ panel = QWidget(parent) layout = Layout(panel) layout.setContentsMargins(10, 5, 10, 5) preference = self.preference["light"] # widgets. label_intensity = Label(parent, "intensity") spin_intensity = DSpin(parent, 0.0, 1.0, 0.05) check_pbr = Check(parent, "physics based rendering") label_metallic = Label(parent, "metallic") spin_metallic = DSpin(parent, 0.0, 1.0, 0.1) label_roughness = Label(parent, "roughness") spin_roughness = DSpin(parent, 0.0, 1.0, 0.1) label_color = Label(parent, "color") combo_color = ColorSelector(parent, preference["color"], color_type="color") label_type = Label(parent, "type") combo_type = Combo(parent, ["lightkit", "3 lights", "ver1"]) # set layout. layout.addWidget(label_type, 0, 0, 1, 1, Qt.AlignRight) layout.addWidget(combo_type, 0, 1, 1, 1) layout.addWidget(label_intensity, 1, 0, 1, 1, Qt.AlignRight) layout.addWidget(spin_intensity, 1, 1, 1, 1) layout.addWidget(label_color, 1, 2, 1, 1, Qt.AlignRight) layout.addWidget(combo_color, 1, 3, 1, 1) layout.addWidget(check_pbr, 2, 0, 1, 3) layout.addWidget(label_metallic, 3, 1, 1, 1, Qt.AlignRight) layout.addWidget(spin_metallic, 3, 2, 1, 1) layout.addWidget(label_roughness, 4, 1, 1, 1, Qt.AlignRight) layout.addWidget(spin_roughness, 4, 2, 1, 1) layout.addItem(HSpacer(), 0, 4, 1, 1) layout.addItem(VSpacer(), 5, 0, 1, 1) # initial values. spin_intensity.setProperty("value", preference["intensity"]) check_pbr.setChecked(preference["pbr"]) spin_metallic.setProperty("value", preference["metallic"]) spin_roughness.setProperty("value", preference["roughness"]) combo_type.setCurrentText(preference["type"]) # connections. spin_intensity.valueChanged.connect(lambda v: preference.update({"intensity": round(v, 4)})) check_pbr.toggled.connect(lambda flag: preference.update({"pbr": flag})) spin_metallic.valueChanged.connect(lambda v: preference.update({"metallic": round(v, 4)})) spin_roughness.valueChanged.connect(lambda v: preference.update({"roughness": round(v, 4)})) combo_color.currentTextChanged.connect(lambda v: preference.update({"color": v})) combo_type.currentTextChanged.connect(lambda v: preference.update({"type": v})) return panel
# ==================================================
[docs] def create_latex_panel(self, parent): """ Create LaTeX panel. """ panel = QWidget(parent) layout = Layout(panel) layout.setContentsMargins(10, 5, 10, 5) preference = self.preference["latex"] # widgets. label_color = Label(parent, "color") combo_color = ColorSelector(parent, preference["color"], color_type="color") label_size = Label(parent, "size") spin_size = Spin(parent, 8, 24) label_dpi = Label(parent, "DPI") combo_dpi = Combo(parent, ["120", "240", "300"]) # set layout. layout.addWidget(label_color, 0, 0, 1, 1, Qt.AlignRight) layout.addWidget(combo_color, 0, 1, 1, 2) layout.addWidget(label_size, 1, 0, 1, 1, Qt.AlignRight) layout.addWidget(spin_size, 1, 1, 1, 2) layout.addWidget(label_dpi, 2, 0, 1, 1, Qt.AlignRight) layout.addWidget(combo_dpi, 2, 1, 1, 2) layout.addItem(HSpacer(), 0, 3, 1, 1) layout.addItem(VSpacer(), 3, 0, 1, 1) # initial values. spin_size.setProperty("value", preference["size"]) combo_dpi.setCurrentText(str(preference["dpi"])) # connections. combo_color.currentTextChanged.connect(lambda v: preference.update({"color": v})) spin_size.valueChanged.connect(lambda v: preference.update({"size": v})) combo_dpi.currentTextChanged.connect(lambda v: preference.update({"dpi": int(v)})) return panel
# ==================================================
[docs] def create_general_panel(self, parent): """ Create general panel. """ panel = QWidget(parent) layout = Layout(panel) layout.setContentsMargins(10, 5, 10, 5) preference = self.preference["general"] # widgets. label_style = Label(parent, "style") combo_style = Combo(parent, ["fusion", "macos", "windows"]) label_font = Label(parent, "font") combo_font = Combo(parent, ["Osaka", "Monaco", "Arial", "Times New Roman", "Helvetica Neue"]) label_color = Label(parent, "scheme") combo_color = Combo(parent, ["Jmol", "VESTA"]) label_size = Label(parent, "size") spin_size = Spin(parent, 9, 14) # set layout. layout.addWidget(label_style, 0, 0, 1, 1, Qt.AlignRight) layout.addWidget(combo_style, 0, 1, 1, 1) layout.addWidget(label_font, 1, 0, 1, 1, Qt.AlignRight) layout.addWidget(combo_font, 1, 1, 1, 1) layout.addWidget(label_size, 1, 2, 1, 1, Qt.AlignRight) layout.addWidget(spin_size, 1, 3, 1, 1) layout.addWidget(label_color, 2, 0, 1, 1, Qt.AlignRight) layout.addWidget(combo_color, 2, 1, 1, 1) layout.addItem(HSpacer(), 1, 4, 1, 1) layout.addItem(VSpacer(), 3, 0, 1, 1) # initial values. combo_style.setCurrentText(preference["style"]) combo_font.setCurrentText(preference["font"]) combo_color.setCurrentText(preference["color_scheme"]) spin_size.setProperty("value", preference["size"]) # connections. combo_style.currentTextChanged.connect(lambda v: preference.update({"style": v})) combo_font.currentTextChanged.connect(lambda v: preference.update({"font": v})) combo_color.currentTextChanged.connect(lambda v: preference.update({"color_scheme": v})) spin_size.valueChanged.connect(lambda v: preference.update({"size": v})) return panel
# ================================================== def apply(self, button): """ Apply change. Args: button (QAbstractButton): button status. :meta private: """ self.parent().app.setStyleSheet(create_style_sheet(self.preference["general"]["size"])) self.widget.refresh() self.widget.redraw() self.parent()._update_panel()