#!/usr/bin/env python
# Copyright (C) 2021 ISIS Rutherford Appleton Laboratory UKRI
# SPDX - License - Identifier: GPL-3.0-or-later
from __future__ import annotations
import argparse
import sys
import warnings
import os
from pathlib import Path
import darkdetect
from PyQt5.QtCore import QSettings
from PyQt5.QtWidgets import QApplication, QMessageBox
from PyQt5 import QtCore
from PyQt5.QtGui import QGuiApplication, QFont, QFontInfo
import mantidimaging.core.parallel.manager as pm
from mantidimaging import helper as h
from mantidimaging.core.utility.command_line_arguments import CommandLineArguments
formatwarning_orig = warnings.formatwarning
warnings.formatwarning = lambda message, category, filename, lineno, line=None: formatwarning_orig(
message, category, filename, lineno, line="")
settings = QtCore.QSettings('mantidproject', 'Mantid Imaging')
[docs]
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Mantid Imaging GUI")
parser.add_argument(
"--log-level",
type=str,
default="INFO",
help="Log verbosity level. "
"Available options are: DEBUG, INFO, WARN, CRITICAL",
)
parser.add_argument("--version", action="store_true", help="Print version number and exit.")
parser.add_argument("--path", type=str, help="Comma separated Paths with no spaces for the data you wish to load.")
parser.add_argument("--operation", type=str, help="The initial operation to run on the dataset.")
parser.add_argument("--recon",
default=False,
action='store_true',
help="Opens the reconstruction window at start up.")
parser.add_argument("-sv",
"--spectrum_viewer",
default=False,
action='store_true',
help="Opens the spectrum viewer window at start up.")
parser.add_argument("-lv",
"--live_viewer",
type=str,
help="Path of directory to watch for new files in live viewer.")
return parser.parse_args()
[docs]
def setup_application() -> QApplication:
QGuiApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
q_application = QApplication(sys.argv)
default_font = QFont()
default_font_info = QFontInfo(default_font)
extra_style_default = {
# Density Scale
'density_scale': '-5',
# font
'font_size': str(default_font.pointSize()) + 'px',
}
settings.setValue('extra_style_default', extra_style_default)
if settings.value('extra_style') is None:
settings.setValue('extra_style', extra_style_default)
settings.setValue('os_theme', darkdetect.theme())
settings.setValue('default_font_size', str(default_font.pointSize()))
settings.setValue('default_font_family', str(default_font_info.family()))
q_application.setApplicationName("Mantid Imaging")
q_application.setOrganizationName("mantidproject")
q_application.setOrganizationDomain("mantidproject.org")
if sys.platform == 'win32':
os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "1"
os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"
os.environ["QT_SCALE_FACTOR"] = "1"
return q_application
[docs]
def main() -> None:
args = parse_args()
if args.version:
from mantidimaging import __version__ as version_no
print(version_no)
return
q_application = setup_application()
show_unclean_shutdown_warning(settings)
path = args.path if args.path else ""
operation = args.operation if args.operation else ""
CommandLineArguments(
path=path,
operation=operation,
show_recon=args.recon,
show_live_viewer=args.live_viewer,
show_spectrum_viewer=args.spectrum_viewer,
)
h.initialise_logging(args.log_level)
process_count = settings.value("multiprocessing/process_count", 8, type=int)
settings.setValue("app/last_shutdown_clean", False)
from mantidimaging import gui
try:
pm.create_and_start_pool(process_count)
gui.execute()
result = q_application.exec_()
settings.setValue("app/last_shutdown_clean", True)
return result
except BaseException:
if sys.platform == 'linux':
pm.clear_memory_from_current_process_linux()
raise
finally:
pm.end_pool()
[docs]
def show_unclean_shutdown_warning(settings: QSettings) -> None:
was_clean = settings.value("app/last_shutdown_clean", True, type=bool)
if was_clean:
return
log_dir = settings.value("logging/log_dir", "")
latest_log = None
if log_dir:
logs = sorted(Path(log_dir).glob("mantid_imaging_*.log"), key=lambda p: p.stat().st_mtime, reverse=True)
if logs:
latest_log = logs[0]
msg = QMessageBox()
msg.setIcon(QMessageBox.Warning)
msg.setWindowTitle("Previous Shutdown Warning")
if latest_log and latest_log.exists():
msg.setText(f"Mantid Imaging did not shut down cleanly last time.\n\nLog file:\n{latest_log}")
else:
msg.setText("Mantid Imaging did not shut down cleanly last time.\n\n"
"No log file is available.\n\n"
"To record log files to disk, configure a directory in File -> Settings.")
msg.setStandardButtons(QMessageBox.Ok)
msg.exec_()
if __name__ == "__main__":
main()