1+ # Divert the program flow in worker sub-process as soon as possible,
2+ # before importing heavy-weight modules.
3+ if __name__ == '__main__' :
4+ import multiprocessing
5+ multiprocessing .freeze_support ()
6+
17import sys
28import os
3- from logging import getLogger
49from importlib import metadata
510
611import requests
1318 import ctypes
1419 ctypes .windll .shell32 .SetCurrentProcessExplicitAppUserModelID ("activity.browser.1" )
1520
16- from activity_browser import application
17- from activity_browser .ui import icons
18-
19- from .logger import setup_ab_logging
21+ from loguru import logger
22+ import platformdirs
2023from .static .icons import main
2124
22- log = getLogger ( __name__ )
25+
2326
2427
2528class SpecialProgressBar (QtWidgets .QWidget ):
@@ -88,29 +91,12 @@ def load_modules(self):
8891 thread .start ()
8992
9093 def load_layout (self ):
91- from .ui .widgets import MainWindow , CentralTabWidget
92- from .layouts import panes , pages
93- from activity_browser .bwutils import AB_metadata
94- from activity_browser import signals
95-
96- application .main_window = MainWindow ()
97- central_widget = CentralTabWidget (application .main_window )
98- central_widget .addTab (pages .WelcomePage (), "Welcome" )
99- central_widget .addTab (pages .ParametersPage (), "Parameters" )
100-
101- application .main_window .setCentralWidget (central_widget )
102-
103- self .load_settings ()
104-
105- def load_settings (self ):
106- self .text_label .setText ("Loading project" )
107- thread = SettingsThread (self )
108- thread .finished .connect (self .load_finished )
109- thread .start ()
94+ self .load_finished ()
11095
11196 def load_finished (self ):
112- application .main_window .sync ()
113- application .main_window .show ()
97+ from activity_browser import app
98+ app .main_window .sync ()
99+ app .main_window .show ()
114100 self .deleteLater ()
115101
116102
@@ -119,68 +105,47 @@ class ModuleThread(QtCore.QThread):
119105
120106 def run (self ):
121107 self .status .emit ("Loading Numpy" )
122- log .debug ("ABLoader: Importing numpy" )
108+ logger .debug ("ABLoader: Importing numpy" )
123109 import numpy , pandas
124110 self .status .emit ("Loading Brightway25" )
125- log .debug ("ABLoader: Importing brightway modules" )
111+ logger .debug ("ABLoader: Importing brightway modules" )
126112 import bw2data , bw2calc , bw2analyzer , bw2io , bw_functional , bw_processing , matrix_utils
127- self .status .emit ("Loading Activity Browser" )
128- log .debug ("ABLoader: Importing activity_browser" )
129- from activity_browser import actions , layouts , mod , settings , ui , signals
130- from activity_browser .layouts import panes , pages
131- from activity_browser .ui import core , widgets , web , wizards
132113
133114
134- class SettingsThread (QtCore .QThread ):
135- def run (self ):
136- import bw2data as bd
137- from activity_browser import settings , actions
138-
139- if settings .ab_settings .settings :
140- from pathlib import Path
115+ def setup_logging ():
116+ """Configure loguru sinks for console and file logging."""
117+ logger .remove ()
118+ logger .add (sys .stderr , level = "DEBUG" , colorize = True ,
119+ format = "<green>{time:HH:mm:ss}</green> | <level>{level: <8}</level> | <level>{message}</level>" )
141120
142- base_dir = Path (settings .ab_settings .current_bw_dir )
143- project_name = settings .ab_settings .startup_project
144- bd .projects .change_base_directories (base_dir , project_name = project_name , update = False )
145-
146- if not bd .projects .twofive :
147- log .warning (f"Project: { bd .projects .current } is not yet BW25 compatible" )
148- actions .ProjectSwitch .set_warning_bar ()
149-
150- log .info (f"Brightway2 data directory: { bd .projects ._base_data_dir } " )
151- log .info (f"Brightway2 current project: { bd .projects .current } " )
121+ log_dir = platformdirs .user_log_dir ("ActivityBrowser" , "ActivityBrowser" )
122+ os .makedirs (log_dir , exist_ok = True )
123+ log_file = os .path .join (log_dir , "activity_browser.log" )
124+ logger .add (log_file , level = "DEBUG" , rotation = "5 MB" , retention = 5 )
152125
153126
154127def run_activity_browser ():
128+ from activity_browser .ui .core .application import ABApplication
129+ app = ABApplication ()
130+
155131 pre_flight_checks ()
156- setup_ab_logging ()
132+ setup_logging ()
157133 loader = ABLoader ()
158134 loader .show ()
159- application .set_icon () # setting this here seems to fix the icon not showing sometimes
160- sys .exit (application .exec_ ())
135+
136+ app .set_icon () # setting this here seems to fix the icon not showing sometimes
137+ sys .exit (app .exec_ ())
161138
162139
163140def run_activity_browser_no_launcher ():
164141 pre_flight_checks ()
165- setup_ab_logging ()
142+ setup_logging ()
166143
167144 modules = ModuleThread ()
168145 modules .run ()
169146
170- from .ui .widgets import MainWindow , CentralTabWidget
171- from .layouts import panes , pages
172- from activity_browser .bwutils import AB_metadata
173- from activity_browser import signals
174-
175- application .main_window = MainWindow ()
176- central_widget = CentralTabWidget (application .main_window )
177- central_widget .addTab (pages .WelcomePage (), "Welcome" )
178- central_widget .addTab (pages .ParametersPage (), "Parameters" )
179-
180- application .main_window .setCentralWidget (central_widget )
181-
182- settings = SettingsThread ()
183- settings .run ()
147+ from .ui .widgets import CentralTabWidget
148+ from .app import panes , pages , application , metadata
184149
185150 application .main_window .sync ()
186151 application .main_window .show ()
@@ -252,7 +217,7 @@ def check_pypi_update():
252217if "--no-launcher" in sys .argv :
253218 run_activity_browser_no_launcher ()
254219elif sys .version_info [1 ] == 10 :
255- log .info ("Running Activity Browser without launcher for Python 3.10" )
220+ logger .info ("Running Activity Browser without launcher for Python 3.10" )
256221 run_activity_browser_no_launcher ()
257222else :
258223 run_activity_browser ()
0 commit comments