diff --git a/src/digest/histogramchartwidget.py b/src/digest/histogramchartwidget.py index 9dbe557..f72befb 100644 --- a/src/digest/histogramchartwidget.py +++ b/src/digest/histogramchartwidget.py @@ -157,7 +157,6 @@ def __init__(self, *args, **kwargs): self.bar_spacing = 25 def set_data(self, data: OrderedDict, model_name, y_max, title="", set_ticks=False): - title_color = "rgb(0,0,0)" if set_ticks else "rgb(200,200,200)" self.plot_widget.setLabel( "left", @@ -173,7 +172,8 @@ def set_data(self, data: OrderedDict, model_name, y_max, title="", set_ticks=Fal x_positions = list(range(len(op_count))) total_count = sum(op_count) width = 0.6 - self.plot_widget.setFixedWidth(len(op_names) * self.bar_spacing) + self.plot_widget.setFixedWidth(500) + for count, x_pos, tick in zip(op_count, x_positions, op_names): x0 = x_pos - width / 2 y0 = 0 diff --git a/src/digest/main.py b/src/digest/main.py index dfdab4a..5a894b5 100644 --- a/src/digest/main.py +++ b/src/digest/main.py @@ -9,6 +9,7 @@ from typing import Dict, Tuple, Optional, Union import tempfile from enum import IntEnum +import pandas as pd import yaml # This is a temporary workaround since the Qt designer generated files @@ -37,7 +38,7 @@ from PySide6.QtCore import Qt, QSize from digest.dialog import StatusDialog, InfoDialog, WarnDialog, ProgressDialog -from digest.thread import StatsThread, SimilarityThread +from digest.thread import StatsThread, SimilarityThread, post_process from digest.popup_window import PopupWindow from digest.huggingface_page import HuggingfacePage from digest.multi_model_selection_page import MultiModelSelectionPage @@ -214,7 +215,7 @@ def __init__(self, model_file: Optional[str] = None): # Set up the HUGGINGFACE Page huggingface_page = HuggingfacePage() - huggingface_page.model_signal.connect(self.load_onnx) + huggingface_page.model_signal.connect(self.load_model) self.ui.stackedWidget.insertWidget(self.Page.HUGGINGFACE, huggingface_page) # Set up the multi model page and relevant button @@ -222,7 +223,7 @@ def __init__(self, model_file: Optional[str] = None): self.ui.stackedWidget.insertWidget( self.Page.MULTIMODEL, self.multimodelselection_page ) - self.multimodelselection_page.model_signal.connect(self.load_onnx) + self.multimodelselection_page.model_signal.connect(self.load_model) # Load model file if given as input to the executable if model_file: @@ -285,25 +286,14 @@ def closeTab(self, index): self.ui.singleModelWidget.hide() def openFile(self): - filename, _ = QFileDialog.getOpenFileName( + file_name, _ = QFileDialog.getOpenFileName( self, "Open File", "", "ONNX and Report Files (*.onnx *.yaml)" ) - if not filename: + if not file_name: return - file_ext = os.path.splitext(filename)[-1] - - if file_ext == ".onnx": - self.load_onnx(filename) - elif file_ext == ".yaml": - self.load_report(filename) - else: - bad_ext_dialog = StatusDialog( - f"Digest does not support files with the extension {file_ext}", - parent=self, - ) - bad_ext_dialog.show() + self.load_model(file_name) def update_cards( self, @@ -374,7 +364,8 @@ def update_similarity_widget( completed_successfully: bool, model_id: str, most_similar: str, - png_filepath: Union[str, None], + png_filepath: Optional[str] = None, + df_sorted: Optional[pd.DataFrame] = None, ): widget = None digest_model = None @@ -390,9 +381,24 @@ def update_similarity_widget( curr_index = index break - if completed_successfully and isinstance(widget, modelSummary) and png_filepath: + # convert back to a List[str] + most_similar_list = most_similar.split(",") + + if ( + completed_successfully + and isinstance(widget, modelSummary) + and digest_model + and png_filepath + ): + + if df_sorted is not None: + post_process( + digest_model.model_name, most_similar_list, df_sorted, png_filepath + ) + widget.load_gif.stop() widget.ui.similarityImg.clear() + # We give the image a 10% haircut to fit it more aesthetically widget_width = widget.ui.similarityImg.width() pixmap = QPixmap(png_filepath) @@ -411,30 +417,31 @@ def update_similarity_widget( # Show most correlated models widget.ui.similarityCorrelation.show() widget.ui.similarityCorrelationStatic.show() + + most_similar_list = most_similar_list[1:4] if most_similar: - most_similar_models = most_similar.split(",") text = ( "\n" - f"{most_similar_models[0]}, {most_similar_models[1]}, " - f"and {most_similar_models[2]}. " + f"{most_similar_list[0]}, {most_similar_list[1]}, " + f"and {most_similar_list[2]}. " "" ) else: # currently the similarity widget expects the most_similar_models # to allows contains 3 models. For now we will just send three empty # strings but at some point we should handle an arbitrary case. - most_similar_models = ["", "", ""] - text = "" + most_similar_list = ["", "", ""] + text = "NTD" # Create option to click to enlarge image widget.ui.similarityImg.mousePressEvent = ( lambda event: self.open_similarity_report( - model_id, png_filepath, most_similar_models + model_id, png_filepath, most_similar_list ) ) # Create option to click to enlarge image self.model_similarity_report[model_id] = SimilarityAnalysisReport( - png_filepath, most_similar_models + png_filepath, most_similar_list ) widget.ui.similarityCorrelation.setText(text) @@ -878,10 +885,10 @@ def load_report(self, filepath: str): movie.start() self.update_similarity_widget( - bool(digest_model.similarity_heatmap_path), - digest_model.unique_id, - "", - digest_model.similarity_heatmap_path, + completed_successfully=bool(digest_model.similarity_heatmap_path), + model_id=digest_model.unique_id, + most_similar="", + png_filepath=digest_model.similarity_heatmap_path, ) progress.close() @@ -889,6 +896,27 @@ def load_report(self, filepath: str): except FileNotFoundError as e: print(f"File not found: {e.filename}") + def load_model(self, file_path: str): + + # Ensure the filepath follows a standard formatting: + file_path = os.path.normpath(file_path) + + if not os.path.exists(file_path): + return + + file_ext = os.path.splitext(file_path)[-1] + + if file_ext == ".onnx": + self.load_onnx(file_path) + elif file_ext == ".yaml": + self.load_report(file_path) + else: + bad_ext_dialog = StatusDialog( + f"Digest does not support files with the extension {file_ext}", + parent=self, + ) + bad_ext_dialog.show() + def dragEnterEvent(self, event: QDragEnterEvent): if event.mimeData().hasUrls(): event.acceptProposedAction() @@ -897,12 +925,7 @@ def dropEvent(self, event: QDropEvent): if event.mimeData().hasUrls(): for url in event.mimeData().urls(): file_path = url.toLocalFile() - if file_path.endswith(".onnx"): - self.load_onnx(file_path) - break - elif file_path.endswith(".yaml"): - self.load_report(file_path) - break + self.load_model(file_path) ## functions for changing menu page def logo_clicked(self): @@ -950,9 +973,6 @@ def save_reports(self): self, "Select Directory" ) - if not save_directory: - return - # Check if the directory exists and is writable if not os.path.exists(save_directory) or not os.access(save_directory, os.W_OK): self.show_warning_dialog( diff --git a/src/digest/multi_model_analysis.py b/src/digest/multi_model_analysis.py index 6848403..d5937bc 100644 --- a/src/digest/multi_model_analysis.py +++ b/src/digest/multi_model_analysis.py @@ -1,12 +1,14 @@ # Copyright(C) 2024 Advanced Micro Devices, Inc. All rights reserved. import os +from datetime import datetime import csv from typing import List, Dict, Union from collections import Counter, defaultdict, OrderedDict # pylint: disable=no-name-in-module from PySide6.QtWidgets import QWidget, QTableWidgetItem, QFileDialog +from PySide6.QtCore import Qt from digest.dialog import ProgressDialog, StatusDialog from digest.ui.multimodelanalysis_ui import Ui_multiModelAnalysis from digest.histogramchartwidget import StackedHistogramWidget @@ -42,6 +44,9 @@ def __init__( self.ui.individualCheckBox.stateChanged.connect(self.check_box_changed) self.ui.multiCheckBox.stateChanged.connect(self.check_box_changed) + # For some reason setting alignments in designer lead to bugs in *ui.py files + self.ui.opHistogramChart.layout().setAlignment(Qt.AlignmentFlag.AlignTop) + if not model_list: return @@ -80,7 +85,8 @@ def __init__( if isinstance(model, DigestOnnxModel): item = QTableWidgetItem(str(model.opset)) elif isinstance(model, DigestReportModel): - item = QTableWidgetItem(str(model.model_data.get("opset", "NA"))) + item = QTableWidgetItem(str(model.model_data.get("opset", ""))) + self.ui.dataTable.setItem(row, 2, item) item = QTableWidgetItem(str(len(model.node_data))) @@ -193,12 +199,13 @@ def __init__( set_ticks=False, ) frame_layout = self.ui.stackedHistogramFrame.layout() - frame_layout.addWidget(stacked_histogram_widget) + if frame_layout: + frame_layout.addWidget(stacked_histogram_widget) # Add a "ghost" histogram to allow us to set the x axis label vertically model_name = list(node_type_counter.keys())[0] stacked_histogram_widget = StackedHistogramWidget() - ordered_dict = {key: 1 for key in top_ops} + ordered_dict = OrderedDict({key: 1 for key in top_ops}) stacked_histogram_widget.set_data( ordered_dict, model_name="_", @@ -206,18 +213,39 @@ def __init__( set_ticks=True, ) frame_layout = self.ui.stackedHistogramFrame.layout() - frame_layout.addWidget(stacked_histogram_widget) + if frame_layout: + frame_layout.addWidget(stacked_histogram_widget) self.model_list = model_list def save_reports(self): - # Model summary text report - save_directory = QFileDialog(self).getExistingDirectory( + """This function saves all available reports for the models that are opened + in the multi-model analysis page.""" + + base_directory = QFileDialog(self).getExistingDirectory( self, "Select Directory" ) - if not save_directory: - return + # Check if the directory exists and is writable + if not os.path.exists(base_directory) or not os.access(base_directory, os.W_OK): + bad_ext_dialog = StatusDialog( + f"The directory {base_directory} is not valid or writable.", + parent=self, + ) + bad_ext_dialog.show() + + # Append a subdirectory to the save_directory so that all reports are co-located + name_id = datetime.now().strftime("%Y%m%d%H%M%S") + sub_directory = f"multi_model_reports_{name_id}" + save_directory = os.path.join(base_directory, sub_directory) + try: + os.makedirs(save_directory) + except OSError as os_err: + bad_ext_dialog = StatusDialog( + f"Failed to create {save_directory} with error {os_err}", + parent=self, + ) + bad_ext_dialog.show() save_individual_reports = self.ui.individualCheckBox.isChecked() save_multi_reports = self.ui.multiCheckBox.isChecked() diff --git a/src/digest/multi_model_selection_page.py b/src/digest/multi_model_selection_page.py index ddf2e90..601c82b 100644 --- a/src/digest/multi_model_selection_page.py +++ b/src/digest/multi_model_selection_page.py @@ -65,12 +65,7 @@ def run(self): self.close_progress.emit() - model_list = [ - model - for model in self.model_dict.values() - if isinstance(model, DigestOnnxModel) - or isinstance(model, DigestReportModel) - ] + model_list = [model for model in self.model_dict.values()] self.completed.emit(model_list) diff --git a/src/digest/styles/darkstyle.qss b/src/digest/styles/darkstyle.qss index 82dd0f6..29c9bbd 100644 --- a/src/digest/styles/darkstyle.qss +++ b/src/digest/styles/darkstyle.qss @@ -191,4 +191,23 @@ QTreeView::item:selected:active { QTreeView::item:selected:!active { background-color: #949494; +} + +QRadioButton { + spacing: 5px; /* Add spacing between the indicator and text */ + color: white; /* Set text color to white */ +} + +QRadioButton::indicator { + /*width: 15px; + height: 15px;*/ + border-radius: 7px; /* Make the indicator circular */ +} + +QRadioButton::indicator:unchecked { + border: 2px solid gray; /* Add a gray border when unchecked */ +} + +QRadioButton::indicator:checked { + background-color: lightblue; /* Fill with light blue when checked */ } \ No newline at end of file diff --git a/src/digest/subgraph_analysis/find_match.py b/src/digest/subgraph_analysis/find_match.py index 5366810..7fce7e9 100644 --- a/src/digest/subgraph_analysis/find_match.py +++ b/src/digest/subgraph_analysis/find_match.py @@ -5,16 +5,14 @@ import json import zipfile import pandas as pd -import matplotlib.pyplot as plt + import numpy as np from digest.subgraph_analysis.model_encode import ( encode_model, ) # pylint: disable=import-error -def find_match( - model_path, model_output_path=None, dequantize=False, replace=False, dark_mode=False -): +def find_match(model_path, dequantize=False, replace=False): # Unzip database if needed analyzer_path = os.path.dirname(os.path.abspath(__file__)) @@ -71,8 +69,8 @@ def find_match( for reference_json in models_json: reference_basename = os.path.basename(reference_json) reference_name = os.path.splitext(reference_basename)[0] - with open(reference_json, "r", encoding="utf-8") as reference_json: - reference_model = json.load(reference_json) + with open(reference_json, "r", encoding="utf-8") as ref_json_f: + reference_model = json.load(ref_json_f) score = 0 row = {"Name": reference_name} @@ -101,54 +99,13 @@ def find_match( name_list = df_sorted["Name"].tolist() df_sorted.drop("Score", axis=1, inplace=True) df_sorted.drop("Name", axis=1, inplace=True) - df_sorted = pd.DataFrame( np.array(df_sorted.values), index=range(len(name_list)), columns=df_sorted.columns, ) - if dark_mode: - plt.style.use("dark_background") - fig, ax = plt.subplots(figsize=(12, 10)) - im = ax.imshow(df_sorted, cmap="viridis") - - # Show all ticks and label them with the respective list entries - ax.set_xticks(np.arange(len(df_sorted.columns))) - ax.set_yticks(np.arange(len(name_list))) - ax.set_xticklabels([a[:5] for a in df_sorted.columns]) - ax.set_yticklabels(name_list) - - # Rotate the tick labels and set their alignment - plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor") - - ax.set_title(f"Model Similarity Heatmap - {model_name}") - - cb = plt.colorbar( - im, - ax=ax, - shrink=0.5, - format="%.2f", - label="Correlation Ratio", - orientation="vertical", - # pad=0.02, - ) - cb.set_ticks([0, 0.5, 1]) # Set colorbar ticks at 0, 0.5, and 1 - cb.set_ticklabels( - ["0.0 (Low)", "0.5 (Medium)", "1.0 (High)"] - ) # Set corresponding labels - cb.set_label("Correlation Ratio", labelpad=-100) - - fig.tight_layout() - - if model_output_path is None: - model_output_path = "heatmap.png" - - fig.savefig(model_output_path) - - plt.close(fig) - - return name_list, reference_model + return name_list, reference_model, df_sorted def main(): @@ -160,12 +117,9 @@ def main(): parser.add_argument( "--replace", action="store_true", help="Replace models previously encoded" ) - parser.add_argument( - "--dark-mode", action="store_true", help="Plot image in dark mode" - ) args = parser.parse_args() - find_match(args.model_path, args.dequantize, args.replace, args.dark_mode) + find_match(args.model_path, args.dequantize, args.replace) if __name__ == "__main__": diff --git a/src/digest/thread.py b/src/digest/thread.py index cb70123..bf9c546 100644 --- a/src/digest/thread.py +++ b/src/digest/thread.py @@ -4,6 +4,9 @@ import os from typing import List, Optional from PySide6.QtCore import QThread, Signal, QEventLoop, QTimer +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd from digest.model_class.digest_onnx_model import DigestOnnxModel from digest.subgraph_analysis.find_match import find_match @@ -60,13 +63,13 @@ def run(self): self.completed.emit(digest_model, self.unique_id) - def wait(self, timeout=1000): + def wait(self, timeout=10000): wait_threads([self], timeout) class SimilarityThread(QThread): - completed_successfully = Signal(bool, str, str, str) + completed_successfully = Signal(bool, str, str, str, pd.DataFrame) def __init__( self, @@ -88,24 +91,72 @@ def run(self): raise ValueError("You must set the model id") try: - most_similar, _ = find_match( + most_similar, _, df_sorted = find_match( self.model_filepath, - self.png_filepath, dequantize=False, replace=True, - dark_mode=True, ) most_similar = [os.path.basename(path) for path in most_similar] - most_similar = ",".join(most_similar[1:4]) + # We convert List[str] to str to send through the signal + most_similar = ",".join(most_similar) self.completed_successfully.emit( - True, self.model_id, most_similar, self.png_filepath + True, self.model_id, most_similar, self.png_filepath, df_sorted ) except Exception as e: # pylint: disable=broad-exception-caught most_similar = "" self.completed_successfully.emit( - False, self.model_id, most_similar, self.png_filepath + False, self.model_id, most_similar, self.png_filepath, df_sorted ) print(f"Issue creating similarity analysis: {e}") - def wait(self, timeout=1000): + def wait(self, timeout=10000): wait_threads([self], timeout) + + +def post_process( + model_name: str, + name_list: List[str], + df_sorted: pd.DataFrame, + png_file_path: str, + dark_mode: bool = True, +): + """Matplotlib is not thread safe so we must do post_processing on the main thread""" + if dark_mode: + plt.style.use("dark_background") + fig, ax = plt.subplots(figsize=(12, 10)) + im = ax.imshow(df_sorted, cmap="viridis") + + # Show all ticks and label them with the respective list entries + ax.set_xticks(np.arange(len(df_sorted.columns))) + ax.set_yticks(np.arange(len(name_list))) + ax.set_xticklabels([a[:5] for a in df_sorted.columns]) + ax.set_yticklabels(name_list) + + # Rotate the tick labels and set their alignment + plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor") + + ax.set_title(f"Model Similarity Heatmap - {model_name}") + + cb = plt.colorbar( + im, + ax=ax, + shrink=0.5, + format="%.2f", + label="Correlation Ratio", + orientation="vertical", + # pad=0.02, + ) + cb.set_ticks([0, 0.5, 1]) # Set colorbar ticks at 0, 0.5, and 1 + cb.set_ticklabels( + ["0.0 (Low)", "0.5 (Medium)", "1.0 (High)"] + ) # Set corresponding labels + cb.set_label("Correlation Ratio", labelpad=-100) + + fig.tight_layout() + + if png_file_path is None: + png_file_path = "heatmap.png" + + fig.savefig(png_file_path) + + plt.close(fig) diff --git a/src/digest/ui/modelsummary.ui b/src/digest/ui/modelsummary.ui index d0ea5ca..737cf33 100644 --- a/src/digest/ui/modelsummary.ui +++ b/src/digest/ui/modelsummary.ui @@ -6,7 +6,7 @@ 0 0 - 1061 + 1138 837 @@ -153,11 +153,17 @@ border-top-right-radius: 10px; 0 - -558 + -776 991 1443 + + + 0 + 0 + + background-color: black; @@ -868,6 +874,9 @@ QFrame:hover { + + 6 + 20 @@ -878,6 +887,12 @@ QFrame:hover { + + + 0 + 0 + + QLabel { font-size: 18px; @@ -893,8 +908,8 @@ QFrame:hover { - - 0 + + 1 0 @@ -998,6 +1013,18 @@ QScrollBar::handle:vertical { 0 + + + 0 + 0 + + + + + 16777215 + 16777215 + + PointingHandCursor @@ -1082,7 +1109,7 @@ QPushButton:pressed { - + 0 0 diff --git a/src/digest/ui/modelsummary_ui.py b/src/digest/ui/modelsummary_ui.py index 3f3b290..e217372 100644 --- a/src/digest/ui/modelsummary_ui.py +++ b/src/digest/ui/modelsummary_ui.py @@ -29,7 +29,7 @@ class Ui_modelSummary(object): def setupUi(self, modelSummary): if not modelSummary.objectName(): modelSummary.setObjectName(u"modelSummary") - modelSummary.resize(1061, 837) + modelSummary.resize(1138, 837) sizePolicy = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.MinimumExpanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -115,17 +115,22 @@ def setupUi(self, modelSummary): self.scrollArea.setWidgetResizable(True) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") - self.scrollAreaWidgetContents.setGeometry(QRect(0, -558, 991, 1443)) + self.scrollAreaWidgetContents.setGeometry(QRect(0, -776, 991, 1443)) + sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.MinimumExpanding) + sizePolicy2.setHorizontalStretch(0) + sizePolicy2.setVerticalStretch(0) + sizePolicy2.setHeightForWidth(self.scrollAreaWidgetContents.sizePolicy().hasHeightForWidth()) + self.scrollAreaWidgetContents.setSizePolicy(sizePolicy2) self.scrollAreaWidgetContents.setStyleSheet(u"background-color: black;") self.verticalLayout_20 = QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayout_20.setObjectName(u"verticalLayout_20") self.cardFrame = QFrame(self.scrollAreaWidgetContents) self.cardFrame.setObjectName(u"cardFrame") - sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred) - sizePolicy2.setHorizontalStretch(0) - sizePolicy2.setVerticalStretch(0) - sizePolicy2.setHeightForWidth(self.cardFrame.sizePolicy().hasHeightForWidth()) - self.cardFrame.setSizePolicy(sizePolicy2) + sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred) + sizePolicy3.setHorizontalStretch(0) + sizePolicy3.setVerticalStretch(0) + sizePolicy3.setHeightForWidth(self.cardFrame.sizePolicy().hasHeightForWidth()) + self.cardFrame.setSizePolicy(sizePolicy3) self.cardFrame.setStyleSheet(u"background: transparent; /*rgb(40,40,40)*/") self.cardFrame.setFrameShape(QFrame.Shape.StyledPanel) self.cardFrame.setFrameShadow(QFrame.Shadow.Raised) @@ -134,19 +139,19 @@ def setupUi(self, modelSummary): self.horizontalLayout.setContentsMargins(-1, -1, -1, 1) self.cardWidget = QWidget(self.cardFrame) self.cardWidget.setObjectName(u"cardWidget") - sizePolicy2.setHeightForWidth(self.cardWidget.sizePolicy().hasHeightForWidth()) - self.cardWidget.setSizePolicy(sizePolicy2) + sizePolicy3.setHeightForWidth(self.cardWidget.sizePolicy().hasHeightForWidth()) + self.cardWidget.setSizePolicy(sizePolicy3) self.horizontalLayout_2 = QHBoxLayout(self.cardWidget) self.horizontalLayout_2.setSpacing(13) self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") self.horizontalLayout_2.setContentsMargins(-1, 6, 25, 35) self.opsetFrame = QFrame(self.cardWidget) self.opsetFrame.setObjectName(u"opsetFrame") - sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed) - sizePolicy3.setHorizontalStretch(0) - sizePolicy3.setVerticalStretch(0) - sizePolicy3.setHeightForWidth(self.opsetFrame.sizePolicy().hasHeightForWidth()) - self.opsetFrame.setSizePolicy(sizePolicy3) + sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed) + sizePolicy4.setHorizontalStretch(0) + sizePolicy4.setVerticalStretch(0) + sizePolicy4.setHeightForWidth(self.opsetFrame.sizePolicy().hasHeightForWidth()) + self.opsetFrame.setSizePolicy(sizePolicy4) self.opsetFrame.setMinimumSize(QSize(220, 70)) self.opsetFrame.setMaximumSize(QSize(16777215, 80)) self.opsetFrame.setStyleSheet(u"QFrame {\n" @@ -164,11 +169,11 @@ def setupUi(self, modelSummary): self.verticalLayout_5.setContentsMargins(-1, -1, 6, -1) self.opsetLabel = QLabel(self.opsetFrame) self.opsetLabel.setObjectName(u"opsetLabel") - sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) - sizePolicy4.setHorizontalStretch(0) - sizePolicy4.setVerticalStretch(0) - sizePolicy4.setHeightForWidth(self.opsetLabel.sizePolicy().hasHeightForWidth()) - self.opsetLabel.setSizePolicy(sizePolicy4) + sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) + sizePolicy5.setHorizontalStretch(0) + sizePolicy5.setVerticalStretch(0) + sizePolicy5.setHeightForWidth(self.opsetLabel.sizePolicy().hasHeightForWidth()) + self.opsetLabel.setSizePolicy(sizePolicy5) self.opsetLabel.setStyleSheet(u"QLabel {\n" " font-size: 18px;\n" " font-weight: bold;\n" @@ -182,8 +187,8 @@ def setupUi(self, modelSummary): self.opsetVersion = QLabel(self.opsetFrame) self.opsetVersion.setObjectName(u"opsetVersion") - sizePolicy4.setHeightForWidth(self.opsetVersion.sizePolicy().hasHeightForWidth()) - self.opsetVersion.setSizePolicy(sizePolicy4) + sizePolicy5.setHeightForWidth(self.opsetVersion.sizePolicy().hasHeightForWidth()) + self.opsetVersion.setSizePolicy(sizePolicy5) self.opsetVersion.setStyleSheet(u"QLabel {\n" " font-size: 18px;\n" " font-weight: bold;\n" @@ -199,8 +204,8 @@ def setupUi(self, modelSummary): self.nodesFrame = QFrame(self.cardWidget) self.nodesFrame.setObjectName(u"nodesFrame") - sizePolicy3.setHeightForWidth(self.nodesFrame.sizePolicy().hasHeightForWidth()) - self.nodesFrame.setSizePolicy(sizePolicy3) + sizePolicy4.setHeightForWidth(self.nodesFrame.sizePolicy().hasHeightForWidth()) + self.nodesFrame.setSizePolicy(sizePolicy4) self.nodesFrame.setMinimumSize(QSize(220, 70)) self.nodesFrame.setMaximumSize(QSize(16777215, 80)) self.nodesFrame.setStyleSheet(u"QFrame {\n" @@ -218,8 +223,8 @@ def setupUi(self, modelSummary): self.verticalLayout_12.setContentsMargins(-1, 9, -1, -1) self.nodesLabel = QLabel(self.nodesFrame) self.nodesLabel.setObjectName(u"nodesLabel") - sizePolicy4.setHeightForWidth(self.nodesLabel.sizePolicy().hasHeightForWidth()) - self.nodesLabel.setSizePolicy(sizePolicy4) + sizePolicy5.setHeightForWidth(self.nodesLabel.sizePolicy().hasHeightForWidth()) + self.nodesLabel.setSizePolicy(sizePolicy5) self.nodesLabel.setStyleSheet(u"QLabel {\n" " font-size: 18px;\n" " font-weight: bold;\n" @@ -233,8 +238,8 @@ def setupUi(self, modelSummary): self.nodes = QLabel(self.nodesFrame) self.nodes.setObjectName(u"nodes") - sizePolicy4.setHeightForWidth(self.nodes.sizePolicy().hasHeightForWidth()) - self.nodes.setSizePolicy(sizePolicy4) + sizePolicy5.setHeightForWidth(self.nodes.sizePolicy().hasHeightForWidth()) + self.nodes.setSizePolicy(sizePolicy5) self.nodes.setMinimumSize(QSize(150, 32)) self.nodes.setStyleSheet(u"QLabel {\n" " font-size: 18px;\n" @@ -254,8 +259,8 @@ def setupUi(self, modelSummary): self.paramFrame = QFrame(self.cardWidget) self.paramFrame.setObjectName(u"paramFrame") - sizePolicy3.setHeightForWidth(self.paramFrame.sizePolicy().hasHeightForWidth()) - self.paramFrame.setSizePolicy(sizePolicy3) + sizePolicy4.setHeightForWidth(self.paramFrame.sizePolicy().hasHeightForWidth()) + self.paramFrame.setSizePolicy(sizePolicy4) self.paramFrame.setMinimumSize(QSize(220, 70)) self.paramFrame.setMaximumSize(QSize(16777215, 80)) self.paramFrame.setStyleSheet(u"QFrame {\n" @@ -272,8 +277,8 @@ def setupUi(self, modelSummary): self.verticalLayout_9.setObjectName(u"verticalLayout_9") self.parametersLabel = QLabel(self.paramFrame) self.parametersLabel.setObjectName(u"parametersLabel") - sizePolicy4.setHeightForWidth(self.parametersLabel.sizePolicy().hasHeightForWidth()) - self.parametersLabel.setSizePolicy(sizePolicy4) + sizePolicy5.setHeightForWidth(self.parametersLabel.sizePolicy().hasHeightForWidth()) + self.parametersLabel.setSizePolicy(sizePolicy5) self.parametersLabel.setStyleSheet(u"QLabel {\n" " font-size: 18px;\n" " font-weight: bold;\n" @@ -287,8 +292,8 @@ def setupUi(self, modelSummary): self.parameters = QLabel(self.paramFrame) self.parameters.setObjectName(u"parameters") - sizePolicy4.setHeightForWidth(self.parameters.sizePolicy().hasHeightForWidth()) - self.parameters.setSizePolicy(sizePolicy4) + sizePolicy5.setHeightForWidth(self.parameters.sizePolicy().hasHeightForWidth()) + self.parameters.setSizePolicy(sizePolicy5) self.parameters.setStyleSheet(u"QLabel {\n" " font-size: 18px;\n" " font-weight: bold;\n" @@ -304,8 +309,8 @@ def setupUi(self, modelSummary): self.flopsFrame = QFrame(self.cardWidget) self.flopsFrame.setObjectName(u"flopsFrame") - sizePolicy3.setHeightForWidth(self.flopsFrame.sizePolicy().hasHeightForWidth()) - self.flopsFrame.setSizePolicy(sizePolicy3) + sizePolicy4.setHeightForWidth(self.flopsFrame.sizePolicy().hasHeightForWidth()) + self.flopsFrame.setSizePolicy(sizePolicy4) self.flopsFrame.setMinimumSize(QSize(220, 70)) self.flopsFrame.setMaximumSize(QSize(16777215, 80)) self.flopsFrame.setCursor(QCursor(Qt.CursorShape.ArrowCursor)) @@ -323,8 +328,8 @@ def setupUi(self, modelSummary): self.verticalLayout_11.setObjectName(u"verticalLayout_11") self.flopsLabel = QLabel(self.flopsFrame) self.flopsLabel.setObjectName(u"flopsLabel") - sizePolicy4.setHeightForWidth(self.flopsLabel.sizePolicy().hasHeightForWidth()) - self.flopsLabel.setSizePolicy(sizePolicy4) + sizePolicy5.setHeightForWidth(self.flopsLabel.sizePolicy().hasHeightForWidth()) + self.flopsLabel.setSizePolicy(sizePolicy5) self.flopsLabel.setStyleSheet(u"QLabel {\n" " font-size: 18px;\n" " font-weight: bold;\n" @@ -338,11 +343,11 @@ def setupUi(self, modelSummary): self.flops = QLabel(self.flopsFrame) self.flops.setObjectName(u"flops") - sizePolicy5 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Fixed) - sizePolicy5.setHorizontalStretch(0) - sizePolicy5.setVerticalStretch(0) - sizePolicy5.setHeightForWidth(self.flops.sizePolicy().hasHeightForWidth()) - self.flops.setSizePolicy(sizePolicy5) + sizePolicy6 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Fixed) + sizePolicy6.setHorizontalStretch(0) + sizePolicy6.setVerticalStretch(0) + sizePolicy6.setHeightForWidth(self.flops.sizePolicy().hasHeightForWidth()) + self.flops.setSizePolicy(sizePolicy6) self.flops.setMinimumSize(QSize(200, 32)) self.flops.setStyleSheet(u"QLabel {\n" " font-size: 18px;\n" @@ -380,11 +385,11 @@ def setupUi(self, modelSummary): self.parametersPieChart = PieChartWidget(self.scrollAreaWidgetContents) self.parametersPieChart.setObjectName(u"parametersPieChart") - sizePolicy6 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) - sizePolicy6.setHorizontalStretch(0) - sizePolicy6.setVerticalStretch(0) - sizePolicy6.setHeightForWidth(self.parametersPieChart.sizePolicy().hasHeightForWidth()) - self.parametersPieChart.setSizePolicy(sizePolicy6) + sizePolicy7 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) + sizePolicy7.setHorizontalStretch(0) + sizePolicy7.setVerticalStretch(0) + sizePolicy7.setHeightForWidth(self.parametersPieChart.sizePolicy().hasHeightForWidth()) + self.parametersPieChart.setSizePolicy(sizePolicy7) self.parametersPieChart.setMinimumSize(QSize(300, 500)) self.firstRowChartsLayout.addWidget(self.parametersPieChart) @@ -397,18 +402,18 @@ def setupUi(self, modelSummary): self.secondRowChartsLayout.setContentsMargins(-1, 20, -1, -1) self.similarityWidget = QWidget(self.scrollAreaWidgetContents) self.similarityWidget.setObjectName(u"similarityWidget") - sizePolicy6.setHeightForWidth(self.similarityWidget.sizePolicy().hasHeightForWidth()) - self.similarityWidget.setSizePolicy(sizePolicy6) + sizePolicy7.setHeightForWidth(self.similarityWidget.sizePolicy().hasHeightForWidth()) + self.similarityWidget.setSizePolicy(sizePolicy7) self.similarityWidget.setMinimumSize(QSize(300, 500)) self.placeholderWidget = QVBoxLayout(self.similarityWidget) self.placeholderWidget.setObjectName(u"placeholderWidget") self.similarityImg = ClickableLabel(self.similarityWidget) self.similarityImg.setObjectName(u"similarityImg") - sizePolicy7 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - sizePolicy7.setHorizontalStretch(0) - sizePolicy7.setVerticalStretch(0) - sizePolicy7.setHeightForWidth(self.similarityImg.sizePolicy().hasHeightForWidth()) - self.similarityImg.setSizePolicy(sizePolicy7) + sizePolicy8 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy8.setHorizontalStretch(0) + sizePolicy8.setVerticalStretch(0) + sizePolicy8.setHeightForWidth(self.similarityImg.sizePolicy().hasHeightForWidth()) + self.similarityImg.setSizePolicy(sizePolicy8) self.similarityImg.setMinimumSize(QSize(0, 0)) self.similarityImg.setMaximumSize(QSize(16777215, 16777215)) self.similarityImg.setScaledContents(False) @@ -418,8 +423,8 @@ def setupUi(self, modelSummary): self.similarityCorrelationStatic = QLabel(self.similarityWidget) self.similarityCorrelationStatic.setObjectName(u"similarityCorrelationStatic") - sizePolicy2.setHeightForWidth(self.similarityCorrelationStatic.sizePolicy().hasHeightForWidth()) - self.similarityCorrelationStatic.setSizePolicy(sizePolicy2) + sizePolicy3.setHeightForWidth(self.similarityCorrelationStatic.sizePolicy().hasHeightForWidth()) + self.similarityCorrelationStatic.setSizePolicy(sizePolicy3) self.similarityCorrelationStatic.setFont(font) self.similarityCorrelationStatic.setAlignment(Qt.AlignmentFlag.AlignCenter) @@ -427,8 +432,8 @@ def setupUi(self, modelSummary): self.similarityCorrelation = QLabel(self.similarityWidget) self.similarityCorrelation.setObjectName(u"similarityCorrelation") - sizePolicy2.setHeightForWidth(self.similarityCorrelation.sizePolicy().hasHeightForWidth()) - self.similarityCorrelation.setSizePolicy(sizePolicy2) + sizePolicy3.setHeightForWidth(self.similarityCorrelation.sizePolicy().hasHeightForWidth()) + self.similarityCorrelation.setSizePolicy(sizePolicy3) palette = QPalette() brush = QBrush(QColor(0, 0, 0, 255)) brush.setStyle(Qt.SolidPattern) @@ -452,8 +457,8 @@ def setupUi(self, modelSummary): self.flopsPieChart = PieChartWidget(self.scrollAreaWidgetContents) self.flopsPieChart.setObjectName(u"flopsPieChart") - sizePolicy6.setHeightForWidth(self.flopsPieChart.sizePolicy().hasHeightForWidth()) - self.flopsPieChart.setSizePolicy(sizePolicy6) + sizePolicy7.setHeightForWidth(self.flopsPieChart.sizePolicy().hasHeightForWidth()) + self.flopsPieChart.setSizePolicy(sizePolicy7) self.flopsPieChart.setMinimumSize(QSize(300, 500)) self.secondRowChartsLayout.addWidget(self.flopsPieChart) @@ -465,12 +470,18 @@ def setupUi(self, modelSummary): self.verticalLayout_20.addLayout(self.chartsLayout) self.thirdRowInputsLayout = QHBoxLayout() + self.thirdRowInputsLayout.setSpacing(6) self.thirdRowInputsLayout.setObjectName(u"thirdRowInputsLayout") self.thirdRowInputsLayout.setContentsMargins(20, 30, -1, -1) self.inputsLayout = QVBoxLayout() self.inputsLayout.setObjectName(u"inputsLayout") self.inputsLabel = QLabel(self.scrollAreaWidgetContents) self.inputsLabel.setObjectName(u"inputsLabel") + sizePolicy9 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Maximum) + sizePolicy9.setHorizontalStretch(0) + sizePolicy9.setVerticalStretch(0) + sizePolicy9.setHeightForWidth(self.inputsLabel.sizePolicy().hasHeightForWidth()) + self.inputsLabel.setSizePolicy(sizePolicy9) self.inputsLabel.setStyleSheet(u"QLabel {\n" " font-size: 18px;\n" " font-weight: bold;\n" @@ -491,11 +502,11 @@ def setupUi(self, modelSummary): __qtablewidgetitem3 = QTableWidgetItem() self.inputsTable.setHorizontalHeaderItem(3, __qtablewidgetitem3) self.inputsTable.setObjectName(u"inputsTable") - sizePolicy8 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred) - sizePolicy8.setHorizontalStretch(0) - sizePolicy8.setVerticalStretch(0) - sizePolicy8.setHeightForWidth(self.inputsTable.sizePolicy().hasHeightForWidth()) - self.inputsTable.setSizePolicy(sizePolicy8) + sizePolicy10 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + sizePolicy10.setHorizontalStretch(1) + sizePolicy10.setVerticalStretch(0) + sizePolicy10.setHeightForWidth(self.inputsTable.sizePolicy().hasHeightForWidth()) + self.inputsTable.setSizePolicy(sizePolicy10) self.inputsTable.setStyleSheet(u"QTableWidget {\n" " gridline-color: #353535; /* Grid lines */\n" " selection-background-color: #3949AB; /* Blue selection */\n" @@ -553,11 +564,13 @@ def setupUi(self, modelSummary): self.freezeButton = QPushButton(self.scrollAreaWidgetContents) self.freezeButton.setObjectName(u"freezeButton") - sizePolicy9 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) - sizePolicy9.setHorizontalStretch(0) - sizePolicy9.setVerticalStretch(0) - sizePolicy9.setHeightForWidth(self.freezeButton.sizePolicy().hasHeightForWidth()) - self.freezeButton.setSizePolicy(sizePolicy9) + sizePolicy11 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) + sizePolicy11.setHorizontalStretch(0) + sizePolicy11.setVerticalStretch(0) + sizePolicy11.setHeightForWidth(self.freezeButton.sizePolicy().hasHeightForWidth()) + self.freezeButton.setSizePolicy(sizePolicy11) + self.freezeButton.setMinimumSize(QSize(0, 0)) + self.freezeButton.setMaximumSize(QSize(16777215, 16777215)) self.freezeButton.setCursor(QCursor(Qt.CursorShape.PointingHandCursor)) self.freezeButton.setStyleSheet(u"QPushButton {\n" " color: white;\n" @@ -619,8 +632,11 @@ def setupUi(self, modelSummary): __qtablewidgetitem7 = QTableWidgetItem() self.outputsTable.setHorizontalHeaderItem(3, __qtablewidgetitem7) self.outputsTable.setObjectName(u"outputsTable") - sizePolicy8.setHeightForWidth(self.outputsTable.sizePolicy().hasHeightForWidth()) - self.outputsTable.setSizePolicy(sizePolicy8) + sizePolicy12 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Expanding) + sizePolicy12.setHorizontalStretch(0) + sizePolicy12.setVerticalStretch(0) + sizePolicy12.setHeightForWidth(self.outputsTable.sizePolicy().hasHeightForWidth()) + self.outputsTable.setSizePolicy(sizePolicy12) self.outputsTable.setStyleSheet(u"QTableWidget {\n" " gridline-color: #353535; /* Grid lines */\n" " selection-background-color: #3949AB; /* Blue selection */\n" @@ -687,8 +703,8 @@ def setupUi(self, modelSummary): self.sidePaneFrame = QFrame(modelSummary) self.sidePaneFrame.setObjectName(u"sidePaneFrame") - sizePolicy2.setHeightForWidth(self.sidePaneFrame.sizePolicy().hasHeightForWidth()) - self.sidePaneFrame.setSizePolicy(sizePolicy2) + sizePolicy3.setHeightForWidth(self.sidePaneFrame.sizePolicy().hasHeightForWidth()) + self.sidePaneFrame.setSizePolicy(sizePolicy3) self.sidePaneFrame.setMinimumSize(QSize(0, 0)) self.sidePaneFrame.setStyleSheet(u"QFrame {\n" " /*background: rgb(30,30,30);*/\n" @@ -744,8 +760,8 @@ def setupUi(self, modelSummary): __qtablewidgetitem21 = QTableWidgetItem() self.modelProtoTable.setItem(3, 1, __qtablewidgetitem21) self.modelProtoTable.setObjectName(u"modelProtoTable") - sizePolicy2.setHeightForWidth(self.modelProtoTable.sizePolicy().hasHeightForWidth()) - self.modelProtoTable.setSizePolicy(sizePolicy2) + sizePolicy3.setHeightForWidth(self.modelProtoTable.sizePolicy().hasHeightForWidth()) + self.modelProtoTable.setSizePolicy(sizePolicy3) self.modelProtoTable.setMinimumSize(QSize(0, 0)) self.modelProtoTable.setMaximumSize(QSize(16777215, 100)) self.modelProtoTable.setStyleSheet(u"QTableWidget::item {\n" @@ -794,11 +810,8 @@ def setupUi(self, modelSummary): __qtablewidgetitem23 = QTableWidgetItem() self.importsTable.setHorizontalHeaderItem(1, __qtablewidgetitem23) self.importsTable.setObjectName(u"importsTable") - sizePolicy10 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.MinimumExpanding) - sizePolicy10.setHorizontalStretch(0) - sizePolicy10.setVerticalStretch(0) - sizePolicy10.setHeightForWidth(self.importsTable.sizePolicy().hasHeightForWidth()) - self.importsTable.setSizePolicy(sizePolicy10) + sizePolicy2.setHeightForWidth(self.importsTable.sizePolicy().hasHeightForWidth()) + self.importsTable.setSizePolicy(sizePolicy2) self.importsTable.setStyleSheet(u"QTableWidget::item {\n" " color: white;\n" " padding: 5px;\n" diff --git a/src/digest/ui/multimodelanalysis.ui b/src/digest/ui/multimodelanalysis.ui index cf044e3..16109d0 100644 --- a/src/digest/ui/multimodelanalysis.ui +++ b/src/digest/ui/multimodelanalysis.ui @@ -6,8 +6,8 @@ 0 0 - 908 - 647 + 1085 + 866 @@ -51,7 +51,7 @@ QFrame::Shadow::Raised - + @@ -176,7 +176,7 @@ - + 0 0 @@ -198,8 +198,8 @@ 0 0 - 888 - 464 + 1065 + 688 @@ -242,6 +242,12 @@ + + + 0 + 0 + + QFrame::Shape::StyledPanel @@ -258,7 +264,7 @@ QFrame::Shadow::Raised - + @@ -279,17 +285,19 @@ + + + 0 + 0 + + QFrame::Shape::StyledPanel QFrame::Shadow::Raised - - - - - + diff --git a/src/digest/ui/multimodelanalysis_ui.py b/src/digest/ui/multimodelanalysis_ui.py index b9da242..9f4b359 100644 --- a/src/digest/ui/multimodelanalysis_ui.py +++ b/src/digest/ui/multimodelanalysis_ui.py @@ -26,7 +26,7 @@ class Ui_multiModelAnalysis(object): def setupUi(self, multiModelAnalysis): if not multiModelAnalysis.objectName(): multiModelAnalysis.setObjectName(u"multiModelAnalysis") - multiModelAnalysis.resize(908, 647) + multiModelAnalysis.resize(1085, 866) sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -71,7 +71,7 @@ def setupUi(self, multiModelAnalysis): self.modelName.setIndent(5) self.modelName.setTextInteractionFlags(Qt.TextInteractionFlag.LinksAccessibleByMouse|Qt.TextInteractionFlag.TextSelectableByKeyboard|Qt.TextInteractionFlag.TextSelectableByMouse) - self.verticalLayout_17.addWidget(self.modelName, 0, Qt.AlignmentFlag.AlignTop) + self.verticalLayout_17.addWidget(self.modelName) self.summaryTopBannerLayout.addWidget(self.modelNameFrame) @@ -127,7 +127,7 @@ def setupUi(self, multiModelAnalysis): self.scrollArea = QScrollArea(multiModelAnalysis) self.scrollArea.setObjectName(u"scrollArea") - sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.MinimumExpanding) + sizePolicy4 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.MinimumExpanding) sizePolicy4.setHorizontalStretch(0) sizePolicy4.setVerticalStretch(0) sizePolicy4.setHeightForWidth(self.scrollArea.sizePolicy().hasHeightForWidth()) @@ -138,7 +138,7 @@ def setupUi(self, multiModelAnalysis): self.scrollArea.setWidgetResizable(True) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") - self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 888, 464)) + self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 1065, 688)) sizePolicy5 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.MinimumExpanding) sizePolicy5.setHorizontalStretch(0) sizePolicy5.setVerticalStretch(100) @@ -165,6 +165,11 @@ def setupUi(self, multiModelAnalysis): self.frame_2 = QFrame(self.scrollAreaWidgetContents) self.frame_2.setObjectName(u"frame_2") + sizePolicy7 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Preferred) + sizePolicy7.setHorizontalStretch(0) + sizePolicy7.setVerticalStretch(0) + sizePolicy7.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth()) + self.frame_2.setSizePolicy(sizePolicy7) self.frame_2.setFrameShape(QFrame.Shape.StyledPanel) self.frame_2.setFrameShadow(QFrame.Shadow.Raised) self.horizontalLayout_2 = QHBoxLayout(self.frame_2) @@ -177,29 +182,29 @@ def setupUi(self, multiModelAnalysis): self.verticalLayout_3.setObjectName(u"verticalLayout_3") self.opHistogramChart = HistogramChartWidget(self.combinedHistogramFrame) self.opHistogramChart.setObjectName(u"opHistogramChart") - sizePolicy7 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum) - sizePolicy7.setHorizontalStretch(0) - sizePolicy7.setVerticalStretch(0) - sizePolicy7.setHeightForWidth(self.opHistogramChart.sizePolicy().hasHeightForWidth()) - self.opHistogramChart.setSizePolicy(sizePolicy7) + sizePolicy8 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum) + sizePolicy8.setHorizontalStretch(0) + sizePolicy8.setVerticalStretch(0) + sizePolicy8.setHeightForWidth(self.opHistogramChart.sizePolicy().hasHeightForWidth()) + self.opHistogramChart.setSizePolicy(sizePolicy8) self.opHistogramChart.setMinimumSize(QSize(500, 300)) - self.verticalLayout_3.addWidget(self.opHistogramChart, 0, Qt.AlignmentFlag.AlignTop) + self.verticalLayout_3.addWidget(self.opHistogramChart) self.horizontalLayout_2.addWidget(self.combinedHistogramFrame) self.stackedHistogramFrame = QFrame(self.frame_2) self.stackedHistogramFrame.setObjectName(u"stackedHistogramFrame") + sizePolicy9 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) + sizePolicy9.setHorizontalStretch(0) + sizePolicy9.setVerticalStretch(0) + sizePolicy9.setHeightForWidth(self.stackedHistogramFrame.sizePolicy().hasHeightForWidth()) + self.stackedHistogramFrame.setSizePolicy(sizePolicy9) self.stackedHistogramFrame.setFrameShape(QFrame.Shape.StyledPanel) self.stackedHistogramFrame.setFrameShadow(QFrame.Shadow.Raised) self.verticalLayout_5 = QVBoxLayout(self.stackedHistogramFrame) self.verticalLayout_5.setObjectName(u"verticalLayout_5") - self.verticalLayout_4 = QVBoxLayout() - self.verticalLayout_4.setObjectName(u"verticalLayout_4") - - self.verticalLayout_5.addLayout(self.verticalLayout_4) - self.horizontalLayout_2.addWidget(self.stackedHistogramFrame) diff --git a/src/digest/ui/multimodelselection_page.ui b/src/digest/ui/multimodelselection_page.ui index 0071b47..034ed88 100644 --- a/src/digest/ui/multimodelselection_page.ui +++ b/src/digest/ui/multimodelselection_page.ui @@ -218,13 +218,25 @@ - - + + + + + 0 + 0 + + + + + 550 + 0 + + - 0 selected models + The following models were found to be duplicates and have been deselected from the list on the left. true @@ -232,20 +244,33 @@ - - - - - - The following models were found to be duplicates and have been deselected from the list on the left. + + + Qt::Orientation::Horizontal - - true + + + 40 + 20 + - + + + + + + + + 0 selected models + + + true + + + diff --git a/src/digest/ui/multimodelselection_page_ui.py b/src/digest/ui/multimodelselection_page_ui.py index 79ed6a6..0e25178 100644 --- a/src/digest/ui/multimodelselection_page_ui.py +++ b/src/digest/ui/multimodelselection_page_ui.py @@ -135,23 +135,33 @@ def setupUi(self, MultiModelSelection): self.horizontalLayout_3.addWidget(self.radioReports) - self.numSelectedLabel = QLabel(MultiModelSelection) - self.numSelectedLabel.setObjectName(u"numSelectedLabel") - self.numSelectedLabel.setStyleSheet(u"") - self.numSelectedLabel.setWordWrap(True) - - self.horizontalLayout_3.addWidget(self.numSelectedLabel) - self.duplicateLabel = QLabel(MultiModelSelection) self.duplicateLabel.setObjectName(u"duplicateLabel") + sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred) + sizePolicy2.setHorizontalStretch(0) + sizePolicy2.setVerticalStretch(0) + sizePolicy2.setHeightForWidth(self.duplicateLabel.sizePolicy().hasHeightForWidth()) + self.duplicateLabel.setSizePolicy(sizePolicy2) + self.duplicateLabel.setMinimumSize(QSize(550, 0)) self.duplicateLabel.setStyleSheet(u"") self.duplicateLabel.setWordWrap(True) self.horizontalLayout_3.addWidget(self.duplicateLabel) + self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_3.addItem(self.horizontalSpacer_2) + self.verticalLayout.addLayout(self.horizontalLayout_3) + self.numSelectedLabel = QLabel(MultiModelSelection) + self.numSelectedLabel.setObjectName(u"numSelectedLabel") + self.numSelectedLabel.setStyleSheet(u"") + self.numSelectedLabel.setWordWrap(True) + + self.verticalLayout.addWidget(self.numSelectedLabel) + self.columnsLayout = QHBoxLayout() self.columnsLayout.setObjectName(u"columnsLayout") self.leftColumnLayout = QVBoxLayout() @@ -172,11 +182,11 @@ def setupUi(self, MultiModelSelection): self.rightColumnLayout.setObjectName(u"rightColumnLayout") self.duplicateListWidget = QListWidget(MultiModelSelection) self.duplicateListWidget.setObjectName(u"duplicateListWidget") - sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - sizePolicy2.setHorizontalStretch(0) - sizePolicy2.setVerticalStretch(0) - sizePolicy2.setHeightForWidth(self.duplicateListWidget.sizePolicy().hasHeightForWidth()) - self.duplicateListWidget.setSizePolicy(sizePolicy2) + sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy3.setHorizontalStretch(0) + sizePolicy3.setVerticalStretch(0) + sizePolicy3.setHeightForWidth(self.duplicateListWidget.sizePolicy().hasHeightForWidth()) + self.duplicateListWidget.setSizePolicy(sizePolicy3) self.duplicateListWidget.setStyleSheet(u"") self.duplicateListWidget.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers) self.duplicateListWidget.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection) @@ -209,7 +219,7 @@ def retranslateUi(self, MultiModelSelection): self.radioAll.setText(QCoreApplication.translate("MultiModelSelection", u"All", None)) self.radioONNX.setText(QCoreApplication.translate("MultiModelSelection", u"ONNX", None)) self.radioReports.setText(QCoreApplication.translate("MultiModelSelection", u"Reports", None)) - self.numSelectedLabel.setText(QCoreApplication.translate("MultiModelSelection", u"0 selected models", None)) self.duplicateLabel.setText(QCoreApplication.translate("MultiModelSelection", u"The following models were found to be duplicates and have been deselected from the list on the left.", None)) + self.numSelectedLabel.setText(QCoreApplication.translate("MultiModelSelection", u"0 selected models", None)) # retranslateUi