From ff8f756923f59ba779c2f1135e076662c1000372 Mon Sep 17 00:00:00 2001 From: SHUBHAM PURBEY Date: Thu, 21 May 2026 00:50:24 +0530 Subject: [PATCH] added a "Selected Compounds" box at the left of the canvas. --- .gitignore | 4 + src/main/python/mainApp.py | 82 ++++++++++++++++++++- src/main/python/utils/ComponentSelector.py | 5 +- undo_redo/Undo.pkl | Bin 0 -> 108 bytes 4 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 undo_redo/Undo.pkl diff --git a/.gitignore b/.gitignore index 5574e8e..f547e80 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,10 @@ simulateEQN.mos FlowsheetSEQ.csv__pycache__/ *.pyc +graphify-out/ +src/main/graphify-out/ +.graphify* +.agents* env/ venv/ diff --git a/src/main/python/mainApp.py b/src/main/python/mainApp.py index 5b32de6..7c4ff1e 100644 --- a/src/main/python/mainApp.py +++ b/src/main/python/mainApp.py @@ -1,4 +1,4 @@ -import pickle +import pickle import threading import os import ctypes @@ -68,6 +68,10 @@ def __init__(self): self.container = Container(self.textBrowser, self.graphicsView) self.comp = ComponentSelector(self) self.comp.accepted.connect(self.update_compounds) + self.comp.accepted.connect(self._refresh_selected_compounds) + + # Connect real-time compound checkbox changes + self.comp.compounds_changed.connect(self._refresh_selected_compounds) # Setting up interactive canvas self.scene = self.container.graphics.get_scene() @@ -75,6 +79,48 @@ def __init__(self): self.graphicsView.setMouseTracking(True) self.graphicsView.keyPressEvent=self.delete_call + # box for selected compounds + self.selectedElementsDock = QDockWidget("Selected Compounds", self) + self.selectedElementsDock.setFeatures( + QDockWidget.DockWidgetFloatable | + QDockWidget.DockWidgetMovable | + QDockWidget.DockWidgetClosable + ) + self.selectedElementsDock.setMinimumSize(180, 150) + self.selectedElementsDock.setMaximumWidth(250) + + self.selectedElementsList = QListWidget() + self.selectedElementsList.setAlternatingRowColors(True) + self.selectedElementsList.setStyleSheet(""" + QListWidget { + background-color: #f7f7f7; + border: none; + font: 10pt 'Microsoft JhengHei'; + color: #333; + } + QListWidget::item { + padding: 4px 8px; + } + QListWidget::item:alternate { + background-color: #eaeaea; + } + """) + + sel_dock_container = QWidget() + sel_dock_layout = QVBoxLayout(sel_dock_container) + sel_dock_layout.setContentsMargins(4, 4, 4, 4) + + sel_label = QLabel("No compounds selected") + sel_label.setStyleSheet("color: #888; font: 9pt 'Microsoft JhengHei'; padding: 2px 4px;") + sel_label.setAlignment(Qt.AlignCenter) + self._sel_status_label = sel_label + + sel_dock_layout.addWidget(sel_label) + sel_dock_layout.addWidget(self.selectedElementsList) + self.selectedElementsDock.setWidget(sel_dock_container) + + self.addDockWidget(Qt.LeftDockWidgetArea, self.selectedElementsDock) + self.dockWidget.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetClosable) @@ -160,6 +206,14 @@ def menu_bar(self): self.actionBinaryPhaseEnvelope.triggered.connect(self.bin_phase_env) self.actionViewMessageBrowser.triggered.connect(self.toggle_message_browser_view) self.actionViewComponentSelector.triggered.connect(self.toggle_component_selector_view) + + # View : Selected Compounds + self.actionViewSelectedElements = QAction("Selected Compounds", self) + self.actionViewSelectedElements.setCheckable(True) + self.actionViewSelectedElements.setChecked(True) + self.actionViewSelectedElements.triggered.connect(self.toggle_selected_elements_view) + self.menuView.addAction(self.actionViewSelectedElements) + self.actionSequentialMode.setEnabled(True) self.actionEquationOriented.setEnabled(True) @@ -499,6 +553,7 @@ def new(self): self.container = Container(self.textBrowser, self.graphicsView) self.scene = self.container.graphics.get_scene() self.graphicsView.setScene(self.scene) + self._clear_selected_compounds_panel() # ✅ Push initial empty snapshot for new project try: @@ -562,6 +617,7 @@ def undo_redo_helper(self): compound_selected.clear() self.scene = self.container.graphics.get_scene() self.graphicsView.setScene(self.scene) + self._clear_selected_compounds_panel() self.graphicsView.setMouseTracking(True) self.graphicsView.keyPressEvent = self.delete_call @@ -726,6 +782,30 @@ def toggle_message_browser_view(self): else: self.dockWidget_2.hide() + # function is used to show the slected ones and hide the unchecked ones + def toggle_selected_elements_view(self): + if self.actionViewSelectedElements.isChecked(): + self.selectedElementsDock.show() + else: + self.selectedElementsDock.hide() + + # function to refresh the selected compounds box + def _refresh_selected_compounds(self): + self.selectedElementsList.clear() + compounds = list(self.comp.selected_names_list) + print(f"[DEBUG] _refresh_selected_compounds: {len(compounds)} compounds") + + if compounds: + self._sel_status_label.setText(f"{len(compounds)} compound(s) selected") + for name in compounds: + self.selectedElementsList.addItem(name) + else: + self._sel_status_label.setText("No compounds selected") + + def _clear_selected_compounds_panel(self): + self.selectedElementsList.clear() + self._sel_status_label.setText("No compounds selected") + from python.utils.ComponentSelectorWindow import ComponentSelectorWindow def select_compounds(self): diff --git a/src/main/python/utils/ComponentSelector.py b/src/main/python/utils/ComponentSelector.py index 6055a72..2653bcb 100644 --- a/src/main/python/utils/ComponentSelector.py +++ b/src/main/python/utils/ComponentSelector.py @@ -1,4 +1,4 @@ -from PyQt5.QtCore import QThread, pyqtSignal, Qt, QStringListModel +from PyQt5.QtCore import QThread, pyqtSignal, Qt, QStringListModel from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.uic import loadUiType @@ -63,6 +63,8 @@ def run(self): # Main Dialog # ---------------------------- class ComponentSelector(QDialog, ui_dialog): + # will change the compound dynamically to the selected compounds box + compounds_changed = pyqtSignal() def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) @@ -197,6 +199,7 @@ def on_checkbox_state_changed(self, name, state): except ValueError: pass self.update_added_compounds() + self.compounds_changed.emit() def update_added_compounds(self): text = ", ".join(self.selected_names_list) diff --git a/undo_redo/Undo.pkl b/undo_redo/Undo.pkl new file mode 100644 index 0000000000000000000000000000000000000000..84c2f3767dca13fe55be0a903a18fac1f67b071d GIT binary patch literal 108 zcmZo*nVQG|0kKnRr}VI9mZatuPXVztdRX!jb5p1E@cSl~q!wi+<^-1%r6%SYPU> g$S