Skip to content

Commit

Permalink
deletion bug
Browse files Browse the repository at this point in the history
  • Loading branch information
benvanbasten-ns committed Sep 5, 2024
1 parent 8f99cc1 commit d0b8b9b
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 49 deletions.
72 changes: 25 additions & 47 deletions tool_flow_summary/flow_summary.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
from qgis.PyQt.QtWidgets import QPushButton
from qgis.PyQt.QtWidgets import QSizePolicy
from qgis.PyQt.QtWidgets import QSpacerItem
from qgis.PyQt.QtWidgets import QTableWidgetItem
from qgis.PyQt.QtWidgets import QWidget
from threedi_results_analysis.threedi_plugin_model import ThreeDiGridItem
from threedi_results_analysis.threedi_plugin_model import ThreeDiResultItem
Expand All @@ -18,7 +17,6 @@
from typing import Dict
from typing import List
from typing import Tuple
from typing import Union

import json
import logging
Expand All @@ -27,7 +25,7 @@

logger = logging.getLogger(__name__)

INTERESTING_HEADERS = ["general_information", "volume_balance", "volume_balance_of_0d_model"]
GROUP_NAMES = ["general_information", "volume_balance", "volume_balance_of_0d_model"]


class FlowSummaryTool(ThreeDiPluginTool):
Expand All @@ -39,8 +37,8 @@ def __init__(self, parent, iface, model):

# The list of shown results in the summary, idx+1 corresponding to column idx in the table
self.result_ids : List[int] = []
# The list of parameters shown in the summary, idx corresponding to row idx in the table
self.param_names : List[str] = []
# The map of group name to table
self.tables: Dict[str, VariableTable] = {}

self.setup_ui()

Expand All @@ -51,15 +49,15 @@ def setup_ui(self) -> None:
self.main_widget.setWindowTitle("Flow summary")
self.main_widget.setLayout(QGridLayout())

# TODO: add other tables and move logic
self.general_info_table = VariableTable(self.main_widget)
for group_name in GROUP_NAMES:
self.tables[group_name] = VariableTable(group_name, self.main_widget)
self.main_widget.layout().addWidget(self.tables[group_name])

self.main_widget.layout().addWidget(self.general_info_table)
self.main_widget.setEnabled(True)
self.main_widget.hide()
self.main_widget.setWindowFlags(Qt.WindowStaysOnTopHint)

# Add ok button
# Add Ok button
button_widget = QWidget(self.main_widget)
button_widget.setLayout(QHBoxLayout(button_widget))
spacer_item = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
Expand All @@ -69,16 +67,6 @@ def setup_ui(self) -> None:
self.main_widget.layout().addWidget(button_widget)
ok_button.clicked.connect(self.main_widget.hide)

def _format_variable(self, param_name: str, param_data: dict) -> Tuple[str, Union[str, int]]:

# TODO: remove underscores from param names
if type(param_data) is dict:
name = f'{param_name} [{param_data["units"]}]'
value = param_data["value"]
return name, value
else:
return param_name, param_data

def show_summary_grid(self, item: ThreeDiGridItem) -> None:
results = []
self.model.get_results_from_item(item=item, checked_only=False, results=results)
Expand All @@ -91,42 +79,27 @@ def show_summary_result(self, item: ThreeDiResultItem) -> None:
logger.warning("Result already added to flow summary, ignoring...")
return

header_item = QTableWidgetItem(item.text())
self.result_ids.append(item.id)
self.general_info_table.insertColumn(len(self.result_ids))
self.general_info_table.setHorizontalHeaderItem(self.general_info_table.columnCount()-1, header_item)

# find and parse the result files
flow_summary_path = item.path.parent / "flow_summary.json"
if not flow_summary_path.exists():
logger.warning(f"Flow summary file from Result {item.text()} cannot be found.")
# TODO: make red, but unclear how to style individual items in header
return

self.result_ids.append(item.id)

# retrieve all the entries in this file
with flow_summary_path.open() as file:
data = json.load(file)

for interesting_header in INTERESTING_HEADERS:
if interesting_header in data:
for param in data[interesting_header]:
param_name, param_value = self._format_variable(param, data[interesting_header][param])

# Check if we've added this parameter before, then use that row idx,
# otherwise append to bottom of table
try:
param_index = self.param_names.index(param)
except ValueError:
param_index = len(self.param_names)
self.param_names.append(param)
# Add a new row and set the parameter name
assert param_index == self.general_info_table.rowCount()
self.general_info_table.insertRow(param_index)
self.general_info_table.setItem(param_index, 0, QTableWidgetItem(param_name))

self.general_info_table.setItem(param_index, len(self.result_ids), QTableWidgetItem(str(param_value)))

self.general_info_table.resizeColumnsToContents()
for group_name in GROUP_NAMES:
assert group_name in self.tables
if group_name in data:
group_data = data[group_name]
else:
group_data = {}
self.tables[group_name].add_summary_results(item, group_data)

self.main_widget.show()

def get_custom_actions(self) -> Dict[QAction, Tuple[Callable[[ThreeDiGridItem], None], Callable[[ThreeDiResultItem], None]]]:
Expand All @@ -145,9 +118,13 @@ def result_removed(self, result_item: ThreeDiResultItem):
return # result not in summary

self.result_ids.pop(idx)
self.general_info_table.removeColumn(idx+1)
for table in self.tables:
self.tables[table].remove_result(idx+1)

# TODO: if empty: fully clean table?
# if empty: fully clean tables
if len(self.result_ids) == 0:
for table in self.tables:
self.tables[table].clean_results()

@pyqtSlot(ThreeDiResultItem)
def result_changed(self, result_item: ThreeDiResultItem):
Expand All @@ -156,7 +133,8 @@ def result_changed(self, result_item: ThreeDiResultItem):
except ValueError:
return # result not in summary

self.general_info_table.setHorizontalHeaderItem(idx+1, QTableWidgetItem(result_item.text()))
for table in self.tables:
self.tables[table].change_result(idx+1, result_item.text())

def run(self) -> None:
self.main_widget.show()
64 changes: 62 additions & 2 deletions tool_flow_summary/variable_table.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,74 @@

from qgis.PyQt.QtCore import Qt
from qgis.PyQt.QtWidgets import QAbstractItemView
from qgis.PyQt.QtWidgets import QTableWidget
from qgis.PyQt.QtWidgets import QTableWidgetItem
from threedi_results_analysis.threedi_plugin_model import ThreeDiResultItem
from typing import List
from typing import Tuple
from typing import Union


class VariableTable(QTableWidget):
def __init__(self, parent):
def __init__(self, group_name: str, parent):
super().__init__(0, 1, parent)
self.setHorizontalHeaderLabels(["Variable"])
self.group_name = group_name
self.setHorizontalHeaderLabels([group_name])
self.resizeColumnsToContents()
self.horizontalHeader().setStretchLastSection(True)
self.verticalHeader().hide()
self.setSortingEnabled(False)
self.setSelectionMode(QAbstractItemView.NoSelection)

# The list of parameters shown in the summary, idx corresponding to row idx in the table
self.param_names : List[str] = []

def add_summary_results(self, item: ThreeDiResultItem, group_data):
header_item = QTableWidgetItem(item.text())
self.insertColumn(self.columnCount())
self.setHorizontalHeaderItem(self.columnCount()-1, header_item)

for param in group_data:
param_name, param_value = self._format_variable(param, group_data[param])

# Check if we've added this parameter before, then use that row idx,
# otherwise append to bottom of table
try:
param_index = self.param_names.index(param)
except ValueError:
param_index = len(self.param_names)
self.param_names.append(param)
# Add a new row and set the parameter name
assert param_index == self.rowCount()
self.insertRow(param_index)
item = QTableWidgetItem(param_name)
item.setFlags(item.flags() ^ Qt.ItemIsEditable)
self.setItem(param_index, 0, item)

item = QTableWidgetItem(str(param_value))
item.setFlags(item.flags() ^ Qt.ItemIsEditable)
self.setItem(param_index, self.columnCount()-1, item)

self.resizeColumnsToContents()

def clean_results(self) -> None:
self.setColumnCount(1)
self.setRowCount(0)
self.setHorizontalHeaderLabels([self.group_name])
self.resizeColumnsToContents()

def remove_result(self, idx: int) -> None:
self.removeColumn(idx)

def change_result(self, idx: int, text: str) -> None:
self.setHorizontalHeaderItem(idx, QTableWidgetItem(text))

def _format_variable(self, param_name: str, param_data: dict) -> Tuple[str, Union[str, int]]:

# TODO: remove underscores from param names
if type(param_data) is dict:
name = f'{param_name} [{param_data["units"]}]'
value = param_data["value"]
return name, value
else:
return param_name, param_data

0 comments on commit d0b8b9b

Please sign in to comment.