131 lines
3.8 KiB
Python
131 lines
3.8 KiB
Python
from PyQt5.QtCore import Qt
|
|
from PyQt5.QtWidgets import (
|
|
QDialog,
|
|
QVBoxLayout,
|
|
QScrollArea,
|
|
QWidget,
|
|
QPushButton,
|
|
QLineEdit,
|
|
QMessageBox,
|
|
)
|
|
|
|
from .ButtonGroup import ButtonGroup
|
|
from .GraphRequester import GraphRequester
|
|
|
|
|
|
class PlotterDialog(QDialog):
|
|
focused_line_edit = None
|
|
|
|
def __init__(
|
|
self,
|
|
variable_full_names: dict[str, str],
|
|
function_full_names: dict[str, str],
|
|
# variable_values: dict[str, np.ndarray],
|
|
):
|
|
super().__init__()
|
|
|
|
self.setWindowTitle("Графопостроитель")
|
|
|
|
layout_boss = QVBoxLayout() # главный лояут
|
|
|
|
self.scroll = QScrollArea()
|
|
|
|
self.scroll.verticalScrollBar().rangeChanged.connect(self.scroll_bottom)
|
|
|
|
scrollWidget = QWidget()
|
|
|
|
# self.scroll.setFrameShape(QFrame.NoFrame)
|
|
self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
|
|
|
|
self.inputs_layout = QVBoxLayout() # лаяут первой трети
|
|
self.inputs_layout.addStretch(1)
|
|
|
|
self.num_of_input = 0 # инициализация первого графика
|
|
self.add_input()
|
|
|
|
scrollWidget.setLayout(self.inputs_layout)
|
|
|
|
self.scroll.setWidgetResizable(True)
|
|
self.scroll.setWidget(scrollWidget)
|
|
|
|
layout_boss.addWidget(self.scroll)
|
|
|
|
Button_make_fun_button = QPushButton("+")
|
|
Button_make_fun_button.clicked.connect(self.add_input)
|
|
Button_make_fun_button.setFixedWidth(80)
|
|
layout_boss.addWidget(Button_make_fun_button, alignment=Qt.AlignRight)
|
|
|
|
layout_boss.addWidget(
|
|
ButtonGroup(
|
|
"Переменные",
|
|
full_names=variable_full_names,
|
|
buttons_action=self.insert_variable,
|
|
)
|
|
)
|
|
layout_boss.addWidget(
|
|
ButtonGroup(
|
|
"Функции",
|
|
full_names=function_full_names,
|
|
buttons_action=self.insert_function,
|
|
)
|
|
)
|
|
|
|
self.setLayout(layout_boss)
|
|
|
|
def add_input(self):
|
|
self.num_of_input += 1
|
|
|
|
graph_requester = GraphRequester(self.num_of_input)
|
|
|
|
for line_edit in (graph_requester.LineEditX, graph_requester.LineEditY):
|
|
line_edit.focused_in.connect(
|
|
lambda line_edit=line_edit: self.set_focused_line_edit(line_edit)
|
|
)
|
|
|
|
graph_requester.LineEditGraf.focused_in.connect(
|
|
lambda: self.set_focused_line_edit(None)
|
|
)
|
|
|
|
self.inputs_layout.insertWidget(self.inputs_layout.count() - 1, graph_requester)
|
|
|
|
graph_requester.LineEditGraf.setFocus()
|
|
|
|
def set_focused_line_edit(self, line_edit: QLineEdit | None):
|
|
self.focused_line_edit = line_edit
|
|
|
|
def scroll_bottom(self):
|
|
self.scroll.verticalScrollBar().setValue(
|
|
self.scroll.verticalScrollBar().maximum()
|
|
)
|
|
|
|
def insert_string(self, string: str, string_cursor_padding=-1):
|
|
line_edit = self.focused_line_edit
|
|
|
|
if line_edit is None:
|
|
QMessageBox(
|
|
QMessageBox.Warning,
|
|
"Ошибка",
|
|
"Выберите поле ввода выражения",
|
|
).exec()
|
|
|
|
return
|
|
|
|
cusor_pos = line_edit.cursorPosition()
|
|
text = line_edit.text()
|
|
|
|
if string_cursor_padding < 1:
|
|
string_cursor_padding = len(string)
|
|
|
|
line_edit.setText(text[:cusor_pos] + string + text[cusor_pos:])
|
|
line_edit.setCursorPosition(cusor_pos + string_cursor_padding)
|
|
|
|
self.scroll.ensureWidgetVisible(line_edit)
|
|
line_edit.setFocus()
|
|
|
|
def insert_variable(self, name: str):
|
|
self.insert_string(f" {name} ")
|
|
|
|
def insert_function(self, name: str):
|
|
string = f" {name}()"
|
|
self.insert_string(string, len(string) - 1) # len - 1 for cursor between braces
|