diff --git a/factorygame/data/vis.py b/factorygame/data/vis.py index 5c879d3..a72e0b2 100755 --- a/factorygame/data/vis.py +++ b/factorygame/data/vis.py @@ -12,7 +12,7 @@ from NodeGraphQt import NodeGraph, Port from NodeGraphQt.constants import PortTypeEnum, NodePropWidgetEnum, ViewerEnum from NodeGraphQt.widgets.node_widgets import _NodeGroupBox, NodeLineEdit, NodeCheckBox from PySide2 import QtGui -from PySide2.QtCore import Qt, QObject, QThread +from PySide2.QtCore import Qt, QObject, QThread, Slot, Signal from PySide2.QtWidgets import QSlider, QLineEdit, QCheckBox, QGraphicsItem, QInputDialog, QDialog, QLabel, QSizePolicy from Qt import QtWidgets from sqlalchemy import create_engine @@ -141,8 +141,9 @@ class AsyncResourceFinder(QThread): resource = data_provider.update_resource_recipes(session=session, resource=resource) if self.debug: print("AsyncResourceFinder updated resource", resource) - self.result.set_result(resource) session.commit() + session.refresh(resource) + self.result.set_result(resource) except: self.result.set_exception(sys.exception()) @@ -444,6 +445,10 @@ class Machine(BaseNode): class GraphController(QObject): + prompt_dialog_show = Signal(str, list, str) + loading_dialog_show = Signal() + loading_dialog_hide = Signal() + def __init__(self, debug: bool, parent=None): super().__init__(parent=parent) self.debug = debug @@ -461,19 +466,39 @@ class GraphController(QObject): self.graph.port_connected.connect(self.on_port_connected) - self.prompt_dialog = QInputDialog(parent=self.graph.widget) - self.prompt_dialog.setStyleSheet(generate_fgbg_stylesheet()) - self.prompt_dialog.setModal(True) + self._prompt_dialog = QInputDialog(parent=self.graph.widget) + self._prompt_dialog.setStyleSheet(generate_fgbg_stylesheet()) + self._prompt_dialog.setModal(True) self._dialog_future = Future() - self.prompt_dialog.rejected.connect(lambda: self._dialog_future.set_result(None)) - self.prompt_dialog.accepted.connect(lambda: self._dialog_future.set_result(self.prompt_dialog.textValue())) + self._prompt_dialog.rejected.connect(lambda: self._dialog_future.set_result(None)) + self._prompt_dialog.accepted.connect(lambda: self._dialog_future.set_result(self._prompt_dialog.textValue())) + self.prompt_dialog_show.connect(self.show_prompt_dialog) - self.loading_dialog = QDialog(parent=self.graph.widget, f=(Qt.Dialog | Qt.ToolTip)) - self.loading_dialog.setStyleSheet(generate_fgbg_stylesheet(0.5)) - self.loading_dialog.setModal(True) - self.loading_dialog.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - label = QLabel("Loading…", self.loading_dialog) + self._loading_dialog = QDialog(parent=self.graph.widget, f=(Qt.Dialog | Qt.ToolTip)) + self._loading_dialog.setStyleSheet(generate_fgbg_stylesheet(0.5)) + self._loading_dialog.setModal(True) + self._loading_dialog.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + label = QLabel("Loading…", self._loading_dialog) label.setAlignment(Qt.AlignCenter) + self.loading_dialog_show.connect(self.show_loading_dialog) + self.loading_dialog_hide.connect(self.hide_loading_dialog) + + @Slot(str, list, str) + def show_prompt_dialog(self, text: str, options: list, default: str = ""): + assert self._prompt_dialog.isHidden(), "Prompt dialog already visible" + self._prompt_dialog.setLabelText(text) + self._prompt_dialog.setComboBoxItems(options) + if default: + self._prompt_dialog.setTextValue(default) + self._prompt_dialog.show() + + @Slot() + def show_loading_dialog(self): + self._loading_dialog.show() + + @Slot() + def hide_loading_dialog(self): + self._loading_dialog.hide() def add_machine_from_search(self, search: str): recipe_selected_future = Future() @@ -642,8 +667,8 @@ class GraphController(QObject): debug=self.debug, ) fetch_future = Future() - self.loading_dialog.show() - fetch_future.add_done_callback(lambda fut: self.loading_dialog.hide()) + self.loading_dialog_show.emit() + fetch_future.add_done_callback(lambda fut: self.loading_dialog_hide.emit()) fetcher_thread.finished.connect(lambda: fetch_future.set_result(None)) fetcher_thread.start() return fetch_future @@ -665,22 +690,16 @@ class GraphController(QObject): prompt=show_prompt, debug=self.debug, ) - self.loading_dialog.show() - loading_future.add_done_callback(lambda fut: self.loading_dialog.hide()) + self.loading_dialog_show.emit() + loading_future.add_done_callback(lambda fut: self.loading_dialog_hide.emit()) fetcher_thread.start() return fetcher_thread.result def dialog_prompt(self, options: dict[int, str], text: str, default: int) -> Future[int | None]: - assert self.prompt_dialog.isHidden(), "Prompt dialog already visible" if self.debug: print("Displaying QInputDialog with options:", ", ".join(options.values())) - self.prompt_dialog.setLabelText(text) - if default in options: - self.prompt_dialog.setTextValue(options[default]) reversed_options: dict[str, int] = {value: key for key, value in options.items()} - self.prompt_dialog.setComboBoxItems(reversed_options.keys()) - ret = Future() self._dialog_future = Future() @@ -692,7 +711,7 @@ class GraphController(QObject): ret.set_result(reversed_options[result]) self._dialog_future.add_done_callback(map_result) - self.prompt_dialog.show() + self.prompt_dialog_show.emit(text, list(reversed_options.keys()), options.get(default, "")) return ret