-
Notifications
You must be signed in to change notification settings - Fork 0
/
template_scales_widget.py
133 lines (106 loc) · 6.35 KB
/
template_scales_widget.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
from sys import float_info
from typing import List
from PyQt5 import QtCore, QtWidgets, QtGui
from ui.py.template_scales_tabwidget import Ui_template_scales_tabwidget as ScalesWidgetForm
from irspy.qt.custom_widgets.EditListDialog import EditedListOnlyNumbers
from scale_limits_dialog import ScaleLimitsDialog
from db_templates import TemplatesDB
import constants as cfg
from irspy import utils
class ScalesWidget(QtWidgets.QWidget):
tab_added = QtCore.pyqtSignal()
tab_removed = QtCore.pyqtSignal(int)
def __init__(self, a_templates_db: TemplatesDB, a_parent=None):
super().__init__(a_parent)
self.ui = ScalesWidgetForm()
self.ui.setupUi(self)
self.parent = a_parent
self.scales_id = {}
self.template_id = 0
self.templates_db = a_templates_db
self.set_up_tab_widget()
def __del__(self):
print("scales widget deleted")
def set_up_tab_widget(self):
plus_button = QtWidgets.QPushButton()
plus_button.setIcon(QtGui.QIcon(QtGui.QPixmap(":/icons/icons/plus.png")))
plus_button.setFlat(True)
plus_button.setFixedSize(20, 20)
self.ui.tabWidget.addTab(QtWidgets.QWidget(), "")
self.ui.tabWidget.setTabEnabled(self.ui.tabWidget.count() - 1, False)
self.ui.tabWidget.tabBar().setTabButton(self.ui.tabWidget.count() - 1, QtWidgets.QTabBar.RightSide, plus_button)
self.ui.tabWidget.tabCloseRequested.connect(self.remove_tab)
plus_button.clicked.connect(self.plus_button_clicked)
def plus_button_clicked(self):
assert self.template_id != 0, "self.measure_id must not be 0!"
self.add_new_tab(self.template_id)
def reset(self, a_template_id: int, a_scales: List[cfg.Scale]):
for tab_idx in range(self.ui.tabWidget.count() - 1):
self.ui.tabWidget.removeTab(0)
self.template_id = a_template_id
self.scales_id.clear()
for scale in a_scales:
self.add_new_tab(self.template_id, scale)
self.ui.tabWidget.setCurrentIndex(0)
@utils.exception_decorator_print
def add_new_tab(self, a_template_id: int, a_scale: cfg.Scale = None):
new_tab_index = self.ui.tabWidget.count() - 1
if a_scale is None:
a_scale = self.templates_db.new_scale(a_template_id, a_scale)
a_scale.number = new_tab_index
config_scale_button = QtWidgets.QPushButton("Пределы", self)
config_scale_button.clicked.connect(self.edit_scale_limits)
scale_list = EditedListOnlyNumbers(parent=self, a_init_items=(p for p in a_scale.points),
a_min_value=-float_info.max, a_max_value=float_info.max,
a_optional_widget=config_scale_button,
a_list_header="Числовые отметки шкалы, деление")
self.ui.tabWidget.insertTab(new_tab_index, scale_list, str(self.ui.tabWidget.count()))
self.ui.tabWidget.setCurrentIndex(new_tab_index)
self.scales_id[new_tab_index + 1] = a_scale.id
@utils.exception_decorator_print
def remove_tab(self, a_idx: int):
if self.ui.tabWidget.count() > 2:
res = QtWidgets.QMessageBox.question(self, "Подтвердите действие",
"Вы действительно хотите удалить шкалу №{0}?".format(a_idx + 1),
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
QtWidgets.QMessageBox.No)
if res == QtWidgets.QMessageBox.Yes:
if a_idx == self.ui.tabWidget.count() - 2 and a_idx == self.ui.tabWidget.currentIndex():
# Если удаляемая вкладка активна, меняем активную на предыдущую
self.ui.tabWidget.setCurrentIndex(self.ui.tabWidget.count() - 3)
self.ui.tabWidget.removeTab(a_idx)
self.templates_db.delete_scale(self.scales_id[a_idx + 1])
# Последнюю вкладку с плюсиком не переименовываем
for tab_idx in range(self.ui.tabWidget.count() - 1):
old_scale_number = int(self.ui.tabWidget.tabText(tab_idx))
actual_scale_number = tab_idx + 1
actual_tab_name = str(actual_scale_number)
if self.ui.tabWidget.tabText(tab_idx) != actual_tab_name:
scale_id = self.scales_id[old_scale_number]
del self.scales_id[old_scale_number]
self.scales_id[actual_scale_number] = scale_id
self.ui.tabWidget.setTabText(tab_idx, actual_tab_name)
@utils.exception_decorator_print
def edit_scale_limits(self, _):
current_scale_number = self.ui.tabWidget.currentIndex() + 1
scale_id = self.scales_id[current_scale_number]
limits = self.templates_db.get_limits(scale_id)
scale_limits_dialog = ScaleLimitsDialog(limits, self)
new_limits, deleted_ids = scale_limits_dialog.exec_and_get_limits()
if new_limits is not None:
# Вносим изменения в базу, только если пользователь подтвердил ввод
self.templates_db.delete_limits(deleted_ids)
for limit in new_limits:
if limit.id != 0:
self.templates_db.update_limit(limit)
else:
self.templates_db.new_limit(scale_id, limit)
def get_scales(self) -> List[cfg.Scale]:
scales = [self.get_scale_by_tab_idx(tab_idx) for tab_idx in range(self.ui.tabWidget.count() - 1)]
return scales
def get_scale_by_tab_idx(self, a_tab_idx):
scale_points_list = self.ui.tabWidget.widget(a_tab_idx)
scale_number = a_tab_idx + 1
# Пределы обновляются в базе сразу после изменения, их передавать не нужно
return cfg.Scale(a_id=self.scales_id[scale_number], a_number=scale_number,
a_scale_points=scale_points_list.get_list())