Source code for qtdraw.multipie.multipie_modulation_dialog

"""
MultiPie modulation dialog.

This module provides a dialog for modulation editor.
"""

import copy
from PySide6.QtWidgets import QDialog
from PySide6.QtCore import Qt

from qtdraw.widget.custom_widget import Layout, Button, LineEdit, Label, Check
from qtdraw.widget.group_model import GroupModel
from qtdraw.widget.group_view import GroupView

# ==================================================
modulation_panel = {
    "id": ("hide", {}, "0"),
    "basis": ("combo", ["Q01"], "Q01"),
    "coeff": ("math", {"var": [""]}, "1"),
    "k_vector": ("math", {"shape": (3,), "var": [""]}, "[1,0,0]"),
    "phase": ("combo", ["cos", "sin"], "cos"),
}


# ==================================================
[docs] class ModulationDialog(QDialog): # ================================================== def __init__(self, parent, modulation_range, var, vec): super().__init__(parent) self.parent = parent self.parent.parent._pvw.save_current() self._vec = vec self._var = {"Q": var["Q"] + var["G"], "T": var["T"] + var["M"]} title = "Modulation - vector" if vec else "Modulation - orbital" self.setWindowTitle(title) self.resize(600, 300) # widget. button_add = Button(self, text="Add") button_remove = Button(self, text="Remove") button_reset = Button(self, text="Reset") button_cancel = Button(self, text="Cancel") button_ok = Button(self, text="OK") label_repeat = Label(self, text="repeat") self.edit_range = LineEdit(self, text="[1,1,1]", validator=("list_int", {"shape": (3,)})) self.check_magnetic = Check(self, "magnetic") # modulation data. if modulation_range.count(":"): modulation, rng = modulation_range.split(":") else: modulation = modulation_range rng = "[1,1,1]" self.edit_range.setText(rng) mod_list, is_magnetic = self.parent.data._parse_modulation(modulation) self.mod_list = [[str(no), *i] for no, i in enumerate(mod_list)] self.check_magnetic.setChecked(is_magnetic) self.view = self.create_panel() # main layout. self.layout = Layout(self) self.layout.setContentsMargins(10, 10, 10, 10) self.layout.setSpacing(5) self.layout.addWidget(self.view, 0, 0, 1, 4) self.layout.addWidget(self.check_magnetic, 1, 0, 1, 1) self.layout.addWidget(button_add, 1, 1, 1, 1) self.layout.addWidget(button_remove, 1, 2, 1, 1) self.layout.addWidget(label_repeat, 2, 0, 1, 1, Qt.AlignRight) self.layout.addWidget(self.edit_range, 2, 1, 1, 2) self.layout.addWidget(button_reset, 2, 3, 1, 1) self.layout.addWidget(button_cancel, 3, 2, 1, 1) self.layout.addWidget(button_ok, 3, 3, 1, 1) # connections. button_add.clicked.connect(self.add_data) button_remove.clicked.connect(self.remove_data) button_reset.clicked.connect(self.reset) button_cancel.clicked.connect(self.reject_data) button_ok.clicked.connect(self.accept_data) self.edit_range.returnPressed.connect(self.create_modulation) self.check_magnetic.toggled.connect(self.set_view) self.show() # ==================================================
[docs] def create_panel(self): magnetic = self.check_magnetic.is_checked() if magnetic: var = self._var["T"] else: var = self._var["Q"] if len(var) == 0: return None mod_panel = copy.deepcopy(modulation_panel) mod_panel["basis"] = ("combo", var, var[0]) model = GroupModel(self, "modulation", mod_panel) model.set_data(self.mod_list) view = GroupView(self, model) view.customContextMenuRequested.disconnect() return view
# ==================================================
[docs] def set_view(self, magnetic): view = self.create_panel() if view is None: if magnetic: self.check_magnetic.setChecked(False) else: self.layout.removeWidget(self.view) self.view = view self.layout.addWidget(self.view, 0, 0, 1, 4)
# ==================================================
[docs] def modulation_range(self): data = self.view.model().tolist() rng = self.edit_range.text() if len(data) < 1: return "" data = [i[1:] for i in data] s = str(data).replace("'", "") + " : " + rng return s
# ==================================================
[docs] def create_modulation(self): mr = self.modulation_range() if mr == "": return self.reset() if self._vec: self.parent.show_vector_samb_modulation(mr) else: self.parent.show_orbital_samb_modulation(mr)
# ==================================================
[docs] def add_data(self): row_data = copy.deepcopy(self.view.model().column_default) n = self.view.model().rowCount() row_data[0] = str(n) self.view.model().append_row(row_data)
# ==================================================
[docs] def remove_data(self): index = self.view.selectedIndexes() if len(index) != 0: self.view.model().remove_row(index[0]) data = self.view.model().tolist() for row in range(len(data)): data[row][0] = str(row) self.view.model().clear_data() self.view.model().set_data(data)
# ==================================================
[docs] def accept_data(self): mr = self.modulation_range() if self._vec: self.parent.edit_vector_modulation.setText(mr) else: self.parent.edit_orbital_modulation.setText(mr) super().accept()
# ==================================================
[docs] def reject_data(self): self.parent.parent._pvw.restore() super().reject()
# ==================================================
[docs] def reset(self): self.parent.parent._pvw.restore()