77# Licensed under the terms of the GNU General Public License.
88# -----------------------------------------------------------------------------
99
10- # ---- Standard imports
10+ from cdprep import __appname__
11+ print ('Starting {}...' .format (__appname__ ))
12+
13+ # ---- Setup the main Qt application.
1114import sys
12- import os
15+ from qtpy .QtWidgets import QApplication
16+ app = QApplication (sys .argv )
17+
18+ # ---- Standard imports
1319import os .path as osp
1420import platform
1521
1622# ---- Third parties imports
1723from appconfigs .base import get_home_dir
18- from qtpy .QtCore import Qt
24+ from qtpy .QtCore import Qt , QPoint
1925from qtpy .QtWidgets import (
2026 QApplication , QMainWindow , QToolBar , QToolButton , QLineEdit , QGridLayout ,
2127 QLabel , QWidget , QFileDialog )
2834from cdprep .gapfill_data .gapfill_weather_gui import WeatherDataGapfiller
2935from cdprep .utils .qthelpers import (
3036 create_toolbar_stretcher , qbytearray_to_hexstate , hexstate_to_qbytearray )
31- from cdprep .config .ospath import (
32- get_select_file_dialog_dir , set_select_file_dialog_dir )
37+ from cdprep .config .ospath import set_select_file_dialog_dir
3338
3439
3540class MainWindow (QMainWindow ):
@@ -49,17 +54,18 @@ def __init__(self):
4954 ctypes .windll .shell32 .SetCurrentProcessExplicitAppUserModelID (
5055 myappid )
5156
52- self .data_downloader = WeatherStationDownloader ( self )
57+ self .data_downloader = None
5358
5459 # Setup the toolbar.
5560 self .show_data_downloader_btn = QToolButton ()
5661 self .show_data_downloader_btn .setIcon (get_icon ('search_weather_data' ))
5762 self .show_data_downloader_btn .setAutoRaise (True )
5863 self .show_data_downloader_btn .setToolTip ("Download Data" )
5964 self .show_data_downloader_btn .clicked .connect (
60- self .data_downloader . show )
65+ self .show_data_downloader )
6166
6267 toolbar = QToolBar ('Main' )
68+ toolbar .setObjectName ('main_toolbar' )
6369 toolbar .setFloatable (False )
6470 toolbar .setMovable (False )
6571 toolbar .setIconSize (get_iconsize ('normal' ))
@@ -102,7 +108,8 @@ def set_workdir(self, workdir):
102108 self ._workdir = workdir
103109 CONF .set ('main' , 'working_dir' , workdir )
104110 self .workdir_ledit .setText (workdir )
105- self .data_downloader .workdir = workdir
111+ if self .data_downloader is not None :
112+ self .data_downloader .workdir = workdir
106113 self .gapfiller .set_workdir (workdir )
107114 else :
108115 self .set_workdir (get_home_dir ())
@@ -118,6 +125,24 @@ def select_working_directory(self):
118125 set_select_file_dialog_dir (dirname )
119126 self .set_workdir (dirname )
120127
128+ def show_data_downloader (self ):
129+ """
130+ Show the download data dialog.
131+ """
132+ if self .data_downloader is None :
133+ self .data_downloader = WeatherStationDownloader (self )
134+ self .data_downloader .workdir = self ._workdir
135+ self .data_downloader .show ()
136+ qr = self .data_downloader .frameGeometry ()
137+ wp = self .frameGeometry ().width ()
138+ hp = self .frameGeometry ().height ()
139+ cp = self .mapToGlobal (QPoint (wp / 2 , hp / 2 ))
140+ qr .moveCenter (cp )
141+ self .data_downloader .move (qr .topLeft ())
142+ self .data_downloader .show ()
143+ self .data_downloader .activateWindow ()
144+ self .data_downloader .raise_ ()
145+
121146 # ---- Main window settings
122147 def _restore_window_geometry (self ):
123148 """
@@ -129,7 +154,7 @@ def _restore_window_geometry(self):
129154 hexstate = hexstate_to_qbytearray (hexstate )
130155 self .restoreGeometry (hexstate )
131156 else :
132- from gwhat .config .gui import INIT_MAINWINDOW_SIZE
157+ from cdprep .config .gui import INIT_MAINWINDOW_SIZE
133158 self .resize (* INIT_MAINWINDOW_SIZE )
134159
135160 def _save_window_geometry (self ):
@@ -164,11 +189,29 @@ def closeEvent(self, event):
164189 self ._save_window_geometry ()
165190 self ._save_window_state ()
166191 self .gapfiller .close ()
192+ if self .data_downloader is not None :
193+ self .data_downloader .close ()
167194 event .accept ()
168195
169196
197+ def except_hook (cls , exception , traceback ):
198+ """
199+ Used to override the default sys except hook so that this application
200+ doesn't automatically exit when an unhandled exception occurs.
201+
202+ See this StackOverflow answer for more details :
203+ https://stackoverflow.com/a/33741755/4481445
204+ """
205+ sys .__excepthook__ (cls , exception , traceback )
206+
207+
170208if __name__ == '__main__' :
171- app = QApplication (sys .argv )
172- mainwindow = MainWindow ()
173- mainwindow .show ()
209+ sys .excepthook = except_hook
210+ main = MainWindow ()
211+
212+ if platform .system () == 'Windows' :
213+ from PyQt5 .QtWidgets import QStyleFactory
214+ app .setStyle (QStyleFactory .create ('WindowsVista' ))
215+
216+ main .show ()
174217 sys .exit (app .exec_ ())
0 commit comments