From f2a073597238fd0d1d9b5d258a5e1dfa24745bad Mon Sep 17 00:00:00 2001 From: Roland W-H Date: Fri, 25 Apr 2025 17:35:54 +0100 Subject: [PATCH] add time slider and saving functionality to output --- gui/output_window.ui | 81 ++++++++++++++++++++++++++++++++++++++- src/main_window.py | 2 +- src/output_window.py | 47 ++++++++++++++++++----- src/widgets/mpl_widget.py | 4 +- 4 files changed, 120 insertions(+), 14 deletions(-) diff --git a/gui/output_window.ui b/gui/output_window.ui index 50c50d1..9e3fac9 100644 --- a/gui/output_window.ui +++ b/gui/output_window.ui @@ -7,7 +7,7 @@ 0 0 1330 - 630 + 685 @@ -23,6 +23,85 @@ + + + + 1231 + 642 + 91 + 31 + + + + + 10 + + + + Save graph + + + + + + 370 + 635 + 581 + 41 + + + + 1 + + + 20 + + + Qt::Orientation::Horizontal + + + QSlider::TickPosition::TicksAbove + + + 1 + + + + + + 1134 + 642 + 91 + 31 + + + + + 10 + + + + Save CSV + + + + + + 10 + 640 + 341 + 31 + + + + + 11 + + + + Fees over 1 year(s) (assuming no change in value) + + diff --git a/src/main_window.py b/src/main_window.py index e32508d..e775f48 100644 --- a/src/main_window.py +++ b/src/main_window.py @@ -133,7 +133,7 @@ class SIPPCompare(QMainWindow): # Show the output window - this func is called from calculate_fee() def show_output_win(self): # Refresh the results when new fees are calculated - self.output_win.display_output(self.results) + self.output_win.display_output(self.results, 1) self.output_win.show() def show_platform_list(self): diff --git a/src/output_window.py b/src/output_window.py index bee2fe0..f8dbdcb 100644 --- a/src/output_window.py +++ b/src/output_window.py @@ -1,11 +1,12 @@ -import datetime import os +from datetime import datetime from PyQt6 import uic from PyQt6.QtGui import QIcon -from PyQt6.QtWidgets import QWidget +from PyQt6.QtWidgets import QWidget, QFileDialog import resource_finder +from widgets.mpl_widget import MplWidget class OutputWindow(QWidget): @@ -15,17 +16,43 @@ class OutputWindow(QWidget): uic.loadUi(resource_finder.get_res_path("gui/output_window.ui"), self) self.setWindowIcon(QIcon(resource_finder.get_res_path("icon2.ico"))) - def display_output(self, results: list): - ax = self.graphWidget.canvas.axes - ax.clear() - ax.cla() - self.graphWidget.canvas.draw_idle() + # Define class variables + self.canvas = self.graphWidget.canvas + self.ax = self.canvas.axes + self.fig = self.canvas.figure + self.results = [] + + # Handle events + self.save_graph_but.clicked.connect(self.save_graph) + self.time_slider.valueChanged.connect(self.change_time) + + def display_output(self, results: list, years: int): + self.results = results + self.ax.clear() + self.ax.cla() + self.canvas.draw_idle() names = [] values = [] for result in results: names.append(result[4]) - values.append(sum(result[:4])) + values.append(sum(result[:4]) * years) - h_bars = ax.barh(names, values) - ax.bar_label(h_bars, label_type='center', labels=[f"£{x:,.2f}" for x in h_bars.datavalues]) + h_bars = self.ax.barh(names, values) + self.ax.bar_label(h_bars, label_type='center', labels=[f"£{x:,.2f}" for x in h_bars.datavalues]) + + def save_graph(self): + file_picker = QFileDialog(self) + file_picker.setFileMode(QFileDialog.FileMode.Directory) + folder_path = "" + if file_picker.exec(): + folder_path = file_picker.selectedFiles()[0] + + cur_time = datetime.now() + filename_str = f"{folder_path}/SIPPCompare-{cur_time.year}.{cur_time.month}.{cur_time.day}.png" + self.fig.savefig(filename_str, dpi=150) + + def change_time(self): + years: int = self.time_slider.value() + self.time_lab.setText(f"Fees over {years} year(s) (assuming no change in value)") + self.display_output(self.results, years) diff --git a/src/widgets/mpl_widget.py b/src/widgets/mpl_widget.py index d7c03ee..a5de8ac 100644 --- a/src/widgets/mpl_widget.py +++ b/src/widgets/mpl_widget.py @@ -6,8 +6,8 @@ from PyQt6.QtWidgets import QWidget, QVBoxLayout class MplWidget(QWidget): def __init__(self, parent=None): super().__init__(parent) - self.canvas = FigureCanvasQTAgg(Figure(figsize=(10, 10), dpi=100)) + self.canvas = FigureCanvasQTAgg(Figure(figsize=(15, 8), dpi=100)) vertical_layout = QVBoxLayout() vertical_layout.addWidget(self.canvas) self.canvas.axes = self.canvas.figure.add_subplot(1, 1, 1) - self.setLayout(vertical_layout) \ No newline at end of file + self.setLayout(vertical_layout)