G3iQ%dZddlZddlmZmZmZmZmZmZm Z m Z ddl m Z m Z mZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lm Z ejBe"Z#GddeZ$y)zo Main Window for Portfolio Manager. Central window with tab widget for Snapshot, Transactions, and Analytics. N) QMainWindow QTabWidgetQWidget QVBoxLayout QStatusBar QMessageBoxQMenuBarQMenu)QtQTimerQTime)QAction) DBManager) PriceFetcher) Portfolio)TransactionManager)AnalyticsEngine) SnapshotTab)TransactionsTab) AnalyticsTabcdeZdZdZfdZdZdZdZdZde fdZ d Z d Z d Z d Zd ZxZS) MainWindowz(Main application window with tab widget.ct|tjdt |_t |j |_t|j |_ t|j |j|_ t|j|j |_ |jj|j|j!tjdy)zInitialize main window.z"Initializing backend components...z$Main window initialized successfullyN)super__init__loggerinfor db_managerr price_fetcherr portfoliortransaction_managerr analytics load_holdingsinit_uisetup_auto_refresh)self __class__s A/mnt/ssd/data/python-lab/portfolio-manager/src/gui/main_window.pyrzMainWindow.__init__s   89#+)$//:"4??3#5doot~~#V (I $$&  ! :;c|jd|jdddd|jddt}|j |t |}|j ddddt|_|j|jtjdt||_ t||_t!||_|jj%|jd |jj%|jd |jj%|j"d |jj&j)|j*|j-t/|_|j3|j0|j0j5d tjd y)zInitialize user interface.zPortfolio Manager v1.0dii iiXrzCreating tabs...u 📊 Snapshotu📝 Transactionsu📈 AnalyticsReadyzUI initializedN)setWindowTitle setGeometrysetMinimumSizersetCentralWidgetrsetContentsMarginsr tab_widget addWidgetrdebugr snapshot_tabrtransactions_tabr analytics_tabaddTabcurrentChangedconnecton_tab_changedcreate_menu_barr status_bar setStatusBar showMessage)r&central_widgetlayouts r(r$zMainWindow.init_ui6s} 45 c4- C%! n-^,!!!Q1-%,)  '('- / 5)$/ t00/B t446IJ t113CD &&..t/B/BC %, $//* ##G, %&r)c|j}|jd}td|}|jd|jj |j |j||jtd|}|jj |j|j||jtd|}|jd|jj |j|j||jd}td|}|jj |j|j|td |}|jj |j|j|y ) zCreate application menu bar.z&Filez &Refresh AllzCtrl+Rz&Backup DatabasezE&xitzCtrl+Qz&Helpz&Aboutz&Database StatsN) menuBaraddMenur setShortcut triggeredr:refresh_all_tabs addAction addSeparatorbackup_databaseclose show_aboutshow_database_stats) r&menubar file_menurefresh_action backup_action exit_action help_menu about_action stats_actions r(r<zMainWindow.create_menu_barasc,,.OOG,  6""8,  (()>)>?N+  2D9 ''(<(<=M* gt, )%%djj1K(OOG, x. &&t7L)0$7 &&t'?'?@L)r)ct||_|jjj|j|jj dt jdy)z+Setup auto-refresh timer for price updates.iz!Auto-refresh timer set to 4 hoursN)r auto_refresh_timertimeoutr:auto_refresh_pricesstartrr)r&s r(r%zMainWindow.setup_auto_refreshsR#), ''//0H0HI %%&89 78r)ctj}d|jcxkrdkr5nn2tj d|j j dytjdy)z)Auto-refresh prices (triggered by timer).zAuto-refresh triggeredT) auto_refreshz)Auto-refresh skipped (outside 6:00-23:00)N)r currentTimehourrrr5 update_pricesr4)r& current_times r(rYzMainWindow.auto_refresh_pricessY((* !!# (b ( KK0 1    + + + > LLD Er)indexcgd}d|cxkrt|kr?nytjd|||dk(r|jj yyy)zZ Handle tab change event. Args: index: New tab index )Snapshot Transactions AnalyticsrzTab changed to: N)lenrr4r7 load_data)r&rc tab_namess r(r;zMainWindow.on_tab_changedsY>  &I & LL+Ie,<+=> ?z"",,. 'r)c tjd |jj|jj |j j |jj |jjddtjdy #t$rG}tjd|dtj|dd t|Yd }~y d }~wwxYw) zRefresh all tabs (reload data).zRefreshing all tabs...zAll tabs refreshedi zAll tabs refreshed successfullyzError refreshing tabs: Texc_infoz Refresh ErrorzFailed to refresh tabs: N)rrr r#r5rjr6r7r=r? Exceptionerrorrcriticalstr)r&es r(rGzMainWindow.refresh_all_tabss ,-  NN ( ( *    ' ' )  ! ! + + -    ( ( * OO ' '(  ,SVH5   sA A B=BBc6d}tj|d|y)zShow About dialog.u

Portfolio Manager v1.0

Desktop application for managing investment portfolio.

Target Portfolio: 180k EUR (Core ETF 160k + Satellite Stock 20k)


Features:


Tech Stack: Python 3.12 • PyQt6 • SQLite • yfinance • matplotlib

License: Personal Use

zAbout Portfolio ManagerN)rabout)r& about_texts r(rLzMainWindow.show_abouts $ $ 9:Fr)c |jj}|jj}d|dd|dd|dd|dd d |d d d |d dd|ddd|dd d}t j |d|y#t $rG}tjd|dt j|ddt|Yd}~yd}~wwxYw)zShow database statistics.zo

Database Statistics

Holdings:holdingsz@
Transactions: transactionszA
Cached Prices: price_cachez

Portfolio Summary

Total Value: total_valuez,.2fuF €
Total Invested:total_investedu; €
P&L: pnl_amountz+,.2fu € ( pnl_percentz+.1fz:%)
Cash:cashu0 €
zDatabase StatisticszFailed to get stats: TrmErrorzFailed to retrieve statistics: N) rget_database_statsr get_portfolio_summaryrrurorrprqrr)r&statssummary stats_textrss r(rMzMainWindow.show_database_statss0 OO668Enn::rsa +*)/(39,4.   8 $|*|*r)