From f24dfac98fc55e8dde55f04591295b623377a7e6 Mon Sep 17 00:00:00 2001 From: alessandro90 Date: Fri, 22 Mar 2019 19:31:49 +0100 Subject: [PATCH] Move themes management into the Theme class. Also add a splashscreen --- .gitignore | 2 + constants.py | 14 +---- main.py | 138 ++++-------------------------------------- splash.jpg | Bin 0 -> 78424 bytes themes.py | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 181 insertions(+), 139 deletions(-) create mode 100644 splash.jpg create mode 100644 themes.py diff --git a/.gitignore b/.gitignore index 5aed056..917bc1e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ pyinstaller_cmd.txt icons_imgs TestData themes/.current_theme +*.bat +*.sh diff --git a/constants.py b/constants.py index 0289848..94ecf23 100644 --- a/constants.py +++ b/constants.py @@ -9,22 +9,9 @@ class ChecksumWhat(Enum): FOLDER = auto() DB = auto() -class Theme(object): - FOLDER = "themes" - EXTENSION = ".qss" - ICONS_FOLDER = "icons" - DEFAULT = "1-system" - CURRENT = ".current_theme" - COLORS = "colors.txt" - COLOR_SEPARATOR = "=" - DEFAULT_ACTIVE_COLOR = "#39eaff" - DEFAULT_INACTIVE_COLOR = "#9f9f9f" - class Messages(object): NO_DB_AVAIL = "No database available.\nGo to Updates->Update database." NO_DB = "No database" - THEME_NOT_FOUND = "Theme not found" - MISSING_THEME = "Missing theme in " + Theme.FOLDER + " folder." NO_CONNECTION = "No internet connection" NO_CONNECTION_MSG = "Unable to establish an internet connection." BAD_DOWNLOAD = "Something went wrong" @@ -70,6 +57,7 @@ class Database(object): Signal.INF_BAND, Signal.SUP_BAND, Signal.CATEGORY_CODE,) + ACF_DOCS = "https://aresvalley.com/documentation/" SEARCH_LABEL_IMG = "search_icon.png" VOLUME_LABEL_IMG = "volume.png" diff --git a/main.py b/main.py index 5e1f6d2..4551f66 100644 --- a/main.py +++ b/main.py @@ -4,20 +4,20 @@ from glob import glob import webbrowser import os import sys +from time import sleep from pandas import read_csv from PyQt5.QtWidgets import (QMainWindow, QApplication, - QAction, qApp, QDesktopWidget, QListWidgetItem, + QSplashScreen, QTreeView, QTreeWidgetItem,) from PyQt5.QtGui import QPixmap from PyQt5 import uic from PyQt5.QtCore import (QFileInfo, - QSize, Qt, pyqtSlot,) @@ -27,10 +27,10 @@ from double_text_button import DoubleTextButton from download_window import DownloadWindow import constants +from themes import Theme from utilities import (uncheck_and_emit, throwable_message, - is_valid_html_color, connect_to, filters_ok, is_undef_freq, @@ -54,8 +54,7 @@ class MyApp(QMainWindow, Ui_MainWindow): self.current_signal_name = '' self.signal_names = [] self.total_signals = 0 - self.active_color = constants.Theme.DEFAULT_ACTIVE_COLOR - self.inactive_color = constants.Theme.DEFAULT_INACTIVE_COLOR + self.theme = Theme(self) # Manage frequency filters. self.frequency_filters_btns = ( @@ -328,11 +327,6 @@ class MyApp(QMainWindow, Ui_MainWindow): fun_args = None ) - # Find available themes. - self.default_images_folder = os.path.join(constants.Theme.FOLDER, - constants.Theme.DEFAULT, - constants.Theme.ICONS_FOLDER) - # ########################################################################################## self.load_db() @@ -366,8 +360,7 @@ class MyApp(QMainWindow, Ui_MainWindow): BandLabel(self.ehf_left, self.ehf, self.ehf_right), ] - self.find_themes() - self.set_theme() + self.theme.initialize() self.show() @@ -392,119 +385,6 @@ class MyApp(QMainWindow, Ui_MainWindow): self.upper_freq_confidence, self.freq_range_lbl) - @pyqtSlot() - def show_theme(self, theme): - self.change_theme(theme) - self.display_specs(self.result_list.currentItem(), None) - self.refresh_range_labels() - self.audio_widget.refresh_btns_colors(self.active_color, self.inactive_color) - - def find_themes(self): - themes = [] - for theme_folder in os.listdir(constants.Theme.FOLDER): - relative_folder = os.path.join(constants.Theme.FOLDER, theme_folder) - if os.path.isdir(os.path.abspath(relative_folder)): - relative_folder = os.path.join(constants.Theme.FOLDER, theme_folder) - themes.append(relative_folder) - for theme in themes: - theme_name = '&' + ' '.join( - map(lambda s: s.capitalize(), - os.path.basename(theme).split('-')[1].split('_') - ) - ) - new_theme = QAction(theme_name, self) - self.menu_themes.addAction(new_theme) - - new_theme.triggered.connect(partial(self.show_theme, theme)) - - @pyqtSlot() - def change_theme(self, theme_path): - try: - with open(os.path.join( - theme_path, - os.path.basename(theme_path).split('-')[1] + constants.Theme.EXTENSION) - ) as stylesheet: - style = stylesheet.read() - self.setStyleSheet(style) - self.download_window.setStyleSheet(style) - except FileNotFoundError: - throwable_message(self, title = constants.Messages.THEME_NOT_FOUND, - text = constants.Messages.MISSING_THEME).show() - else: - icons_path = os.path.join(theme_path, constants.Theme.ICONS_FOLDER) - default_icons_path = os.path.join(constants.Theme.FOLDER, constants.Theme.DEFAULT, constants.Theme.ICONS_FOLDER) - - if os.path.exists(os.path.join(icons_path, constants.NOT_SELECTED)) and \ - os.path.exists(os.path.join(icons_path, constants.NOT_AVAILABLE)): - self.default_images_folder = icons_path - else: - self.default_images_folder = default_icons_path - - path_to_search_label = os.path.join(icons_path, constants.SEARCH_LABEL_IMG) - default_search_label = os.path.join(default_icons_path, constants.SEARCH_LABEL_IMG) - - if os.path.exists(path_to_search_label): - self.search_label.setPixmap(QPixmap(path_to_search_label)) - self.modulation_search_label.setPixmap(QPixmap(path_to_search_label)) - self.location_search_label.setPixmap(QPixmap(path_to_search_label)) - else: - self.search_label.setPixmap(QPixmap(default_search_label)) - self.modulation_search_label.setPixmap(QPixmap(default_search_label)) - self.location_search_label.setPixmap(QPixmap(default_search_label)) - - self.search_label.setScaledContents(True) - self.modulation_search_label.setScaledContents(True) - self.location_search_label.setScaledContents(True) - - path_to_volume_label = os.path.join(icons_path, constants.VOLUME_LABEL_IMG) - default_volume_label = os.path.join(default_icons_path, constants.VOLUME_LABEL_IMG) - - if os.path.exists(path_to_volume_label): - self.volume_label.setPixmap(QPixmap(path_to_volume_label)) - else: - self.volume_label.setPixmap(QPixmap(default_volume_label)) - - self.volume_label.setScaledContents(True) - - path_to_colors = os.path.join(theme_path, constants.Theme.COLORS) - active_color_ok = False - inactive_color_ok = False - valid_format = False - valid_file = False - if os.path.exists(path_to_colors): - valid_file = True - with open(path_to_colors, "r") as colors_file: - for line in colors_file: - if constants.Theme.COLOR_SEPARATOR in line: - valid_format = True - quality, color = line.split(constants.Theme.COLOR_SEPARATOR) - color = color.rstrip() - if quality.lower() == constants.ACTIVE and is_valid_html_color(color): - self.active_color = color - active_color_ok = True - if quality.lower() == constants.INACTIVE and is_valid_html_color(color): - self.inactive_color = color - inactive_color_ok = True - - if not all([valid_file, valid_format, active_color_ok, inactive_color_ok]): - self.active_color = constants.Theme.DEFAULT_ACTIVE_COLOR - self.inactive_color = constants.Theme.DEFAULT_INACTIVE_COLOR - - try: - with open(os.path.join(constants.Theme.FOLDER, - constants.Theme.CURRENT), "w") as current_theme: - current_theme.write(theme_path) - except: - pass - - def set_theme(self): - current_theme_file = os.path.join(constants.Theme.FOLDER, constants.Theme.CURRENT) - if os.path.exists(current_theme_file): - with open(current_theme_file) as current_theme: - theme = current_theme.read() - if theme != constants.Theme.DEFAULT: - self.show_theme(theme) - @pyqtSlot(QListWidgetItem) def remove_if_unselected_modulation(self, item): if not item.isSelected(): @@ -1079,8 +959,14 @@ class MyApp(QMainWindow, Ui_MainWindow): super().closeEvent(event) - if __name__ == '__main__': my_app = QApplication(sys.argv) + img = QPixmap("splash.jpg") + img = img.scaled(600, 600, aspectRatioMode = Qt.KeepAspectRatio) + splash = QSplashScreen(img) + splash.show() + splash.showMessage("Loading database...") + sleep(2) w = MyApp() + splash.finish(w) sys.exit(my_app.exec_()) \ No newline at end of file diff --git a/splash.jpg b/splash.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c83acfc9ce793dc0dd82660bd4d700e128afa53e GIT binary patch literal 78424 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 YC1WM~Sy7&I#xDWYL_!59EEKH&*~NkEcmMzZ literal 0 HcmV?d00001 diff --git a/themes.py b/themes.py new file mode 100644 index 0000000..7973af1 --- /dev/null +++ b/themes.py @@ -0,0 +1,166 @@ +from functools import partial +import os +from PyQt5.QtWidgets import QAction +from PyQt5.QtCore import pyqtSlot +from PyQt5.QtGui import QPixmap +import constants +from utilities import (throwable_message, + is_valid_html_color,) + +class ThemeConstants(object): + FOLDER = "themes" + EXTENSION = ".qss" + ICONS_FOLDER = "icons" + DEFAULT = "1-system" + CURRENT = ".current_theme" + COLORS = "colors.txt" + COLOR_SEPARATOR = "=" + DEFAULT_ACTIVE_COLOR = "#39eaff" + DEFAULT_INACTIVE_COLOR = "#9f9f9f" + THEME_NOT_FOUND = "Theme not found" + MISSING_THEME = "Missing theme in " + FOLDER + " folder." + +class Theme(object): + def __init__(self, parent): + self.__parent = parent + self.__parent.active_color = ThemeConstants.DEFAULT_ACTIVE_COLOR + self.__parent.inactive_color = ThemeConstants.DEFAULT_INACTIVE_COLOR + self.__theme_path = ThemeConstants.DEFAULT + self.__parent.default_images_folder = os.path.join(ThemeConstants.FOLDER, + ThemeConstants.DEFAULT, + ThemeConstants.ICONS_FOLDER) + self.__detect_themes() + + def __refresh_range_labels(self): + self.__parent.set_acf_interval_label() + self.__parent.set_band_filter_label(self.__parent.activate_low_band_filter_btn, + self.__parent.lower_band_spinbox, + self.__parent.lower_band_filter_unit, + self.__parent.lower_band_confidence, + self.__parent.activate_up_band_filter_btn, + self.__parent.upper_band_spinbox, + self.__parent.upper_band_filter_unit, + self.__parent.upper_band_confidence, + self.__parent.band_range_lbl) + self.__parent.set_band_filter_label(self.__parent.activate_low_freq_filter_btn, + self.__parent.lower_freq_spinbox, + self.__parent.lower_freq_filter_unit, + self.__parent.lower_freq_confidence, + self.__parent.activate_up_freq_filter_btn, + self.__parent.upper_freq_spinbox, + self.__parent.upper_freq_filter_unit, + self.__parent.upper_freq_confidence, + self.__parent.freq_range_lbl) + + @pyqtSlot() + def __apply(self, theme_path): + self.__theme_path = theme_path + self.__change() + self.__parent.display_specs(self.__parent.result_list.currentItem(), None) + self.__refresh_range_labels() + self.__parent.audio_widget.refresh_btns_colors(self.__parent.active_color, self.__parent.inactive_color) + + def __detect_themes(self): + themes = [] + for theme_folder in os.listdir(ThemeConstants.FOLDER): + relative_folder = os.path.join(ThemeConstants.FOLDER, theme_folder) + if os.path.isdir(os.path.abspath(relative_folder)): + relative_folder = os.path.join(ThemeConstants.FOLDER, theme_folder) + themes.append(relative_folder) + for theme_path in themes: + theme_name = '&' + ' '.join( + map(lambda s: s.capitalize(), + os.path.basename(theme_path).split('-')[1].split('_') + ) + ) + new_theme = QAction(theme_name, self.__parent) + self.__parent.menu_themes.addAction(new_theme) + new_theme.triggered.connect(partial(self.__apply, theme_path)) + + def __change(self): + try: + with open(os.path.join( + self.__theme_path, + os.path.basename(self.__theme_path).split('-')[1] + ThemeConstants.EXTENSION)) as stylesheet: + style = stylesheet.read() + self.__parent.setStyleSheet(style) + self.__parent.download_window.setStyleSheet(style) + except FileNotFoundError: + throwable_message(self.__parent, title = ThemeConstants.THEME_NOT_FOUND, + text = ThemeConstants.MISSING_THEME).show() + else: + icons_path = os.path.join(self.__theme_path, ThemeConstants.ICONS_FOLDER) + default_icons_path = os.path.join(ThemeConstants.FOLDER, + ThemeConstants.DEFAULT, + ThemeConstants.ICONS_FOLDER) + + if os.path.exists(os.path.join(icons_path, constants.NOT_SELECTED)) and \ + os.path.exists(os.path.join(icons_path, constants.NOT_AVAILABLE)): + self.__parent.default_images_folder = icons_path + else: + self.__parent.default_images_folder = default_icons_path + + path_to_search_label = os.path.join(icons_path, constants.SEARCH_LABEL_IMG) + default_search_label = os.path.join(default_icons_path, constants.SEARCH_LABEL_IMG) + + if os.path.exists(path_to_search_label): + self.__parent.search_label.setPixmap(QPixmap(path_to_search_label)) + self.__parent.modulation_search_label.setPixmap(QPixmap(path_to_search_label)) + self.__parent.location_search_label.setPixmap(QPixmap(path_to_search_label)) + else: + self.__parent.search_label.setPixmap(QPixmap(default_search_label)) + self.__parent.modulation_search_label.setPixmap(QPixmap(default_search_label)) + self.__parent.location_search_label.setPixmap(QPixmap(default_search_label)) + + self.__parent.search_label.setScaledContents(True) + self.__parent.modulation_search_label.setScaledContents(True) + self.__parent.location_search_label.setScaledContents(True) + + path_to_volume_label = os.path.join(icons_path, constants.VOLUME_LABEL_IMG) + default_volume_label = os.path.join(default_icons_path, constants.VOLUME_LABEL_IMG) + + if os.path.exists(path_to_volume_label): + self.__parent.volume_label.setPixmap(QPixmap(path_to_volume_label)) + else: + self.__parent.volume_label.setPixmap(QPixmap(default_volume_label)) + + self.__parent.volume_label.setScaledContents(True) + + path_to_colors = os.path.join(self.__theme_path, ThemeConstants.COLORS) + active_color_ok = False + inactive_color_ok = False + valid_format = False + valid_file = False + if os.path.exists(path_to_colors): + valid_file = True + with open(path_to_colors, "r") as colors_file: + for line in colors_file: + if ThemeConstants.COLOR_SEPARATOR in line: + valid_format = True + quality, color = line.split(ThemeConstants.COLOR_SEPARATOR) + color = color.rstrip() + if quality.lower() == constants.ACTIVE and is_valid_html_color(color): + self.__parent.active_color = color + active_color_ok = True + if quality.lower() == constants.INACTIVE and is_valid_html_color(color): + self.__parent.inactive_color = color + inactive_color_ok = True + + if not all([valid_file, valid_format, active_color_ok, inactive_color_ok]): + self.__parent.active_color = ThemeConstants.DEFAULT_ACTIVE_COLOR + self.__parent.inactive_color = ThemeConstants.DEFAULT_INACTIVE_COLOR + + try: + with open(os.path.join(ThemeConstants.FOLDER, + ThemeConstants.CURRENT), "w") as current_theme: + current_theme.write(self.__theme_path) + except: + pass + + def initialize(self): + current_theme_file = os.path.join(ThemeConstants.FOLDER, ThemeConstants.CURRENT) + if os.path.exists(current_theme_file): + with open(current_theme_file) as current_theme_path: + theme_path = current_theme_path.read() + if theme_path != ThemeConstants.DEFAULT: + self.__apply(theme_path) \ No newline at end of file