diff --git a/constants.py b/constants.py index 2904393..ccc4acc 100644 --- a/constants.py +++ b/constants.py @@ -22,7 +22,7 @@ class Messages(object): NO_DB = "No database" DOWNLOAD_NOW_QUESTION = "Do you want to download it now?" DOWNLOAD_ANYWAY_QUESTION = "Do you want to download it anyway?" - NO_CONNECTION = "No internet connection" + NO_CONNECTION = "No connection" NO_CONNECTION_MSG = "Unable to establish an internet connection." BAD_DOWNLOAD = "Something went wrong" BAD_DOWNLOAD_MSG = "Something went wrong with the downaload.\nCheck your internet connection and try again." diff --git a/download_window.py b/download_window.py index 8d8d0f0..52fdd54 100644 --- a/download_window.py +++ b/download_window.py @@ -2,7 +2,7 @@ from PyQt5 import uic from PyQt5.QtCore import Qt, pyqtSlot from PyQt5.QtWidgets import QWidget from threads import DownloadThread, ThreadStatus -from utilities import throwable_message +from utilities import pop_up from constants import Messages Ui_Download_window, _ = uic.loadUiType("download_db_window.ui") @@ -20,13 +20,13 @@ class DownloadWindow(QWidget, Ui_Download_window): ) self.everything_ok = True - self.no_internet_msg = throwable_message(self, title = Messages.NO_CONNECTION, - text = Messages.NO_CONNECTION_MSG, - connection = self.close) + self.no_internet_msg = pop_up(self, title = Messages.NO_CONNECTION, + text = Messages.NO_CONNECTION_MSG, + connection = self.close) - self.bad_db_download_msg = throwable_message(self, title = Messages.BAD_DOWNLOAD, - text = Messages.BAD_DOWNLOAD_MSG, - connection = self.close) + self.bad_db_download_msg = pop_up(self, title = Messages.BAD_DOWNLOAD, + text = Messages.BAD_DOWNLOAD_MSG, + connection = self.close) self.download_thread = DownloadThread() self.download_thread.finished.connect(self.wait_close) @@ -45,7 +45,7 @@ class DownloadWindow(QWidget, Ui_Download_window): def terminate_process(self): if self.download_thread.isRunning(): self.download_thread.terminate() - self.download_thread.wait() + self.download_thread.wait() self.close() @pyqtSlot() diff --git a/main.py b/main.py index bb385cf..64e9fe0 100644 --- a/main.py +++ b/main.py @@ -18,7 +18,7 @@ from PyQt5.QtWidgets import (QMainWindow, QTreeWidgetItem,) from PyQt5.QtGui import QPixmap from PyQt5 import uic -from PyQt5.QtCore import (QFileInfo, +from PyQt5.QtCore import (QFileInfo, Qt, pyqtSlot,) @@ -31,8 +31,8 @@ import constants from themes import Theme from utilities import (checksum_ok, - uncheck_and_emit, - throwable_message, + uncheck_and_emit, + pop_up, connect_to, filters_ok, is_undef_freq, @@ -81,9 +81,9 @@ class MyApp(QMainWindow, Ui_MainWindow): self.upper_freq_filter_unit.currentTextChanged, self.activate_low_freq_filter_btn.toggled], fun_to_connect = self.set_min_value_upper_limit, - fun_args = [self.lower_freq_filter_unit, - self.lower_freq_spinbox, - self.upper_freq_filter_unit, + fun_args = [self.lower_freq_filter_unit, + self.lower_freq_spinbox, + self.upper_freq_filter_unit, self.upper_freq_spinbox] ) @@ -134,7 +134,7 @@ class MyApp(QMainWindow, Ui_MainWindow): ], self.activate_low_freq_filter_btn, [ - self.lower_freq_spinbox, + self.lower_freq_spinbox, self.lower_freq_filter_unit, self.lower_freq_confidence, ], @@ -157,9 +157,9 @@ class MyApp(QMainWindow, Ui_MainWindow): self.upper_band_filter_unit.currentTextChanged, self.activate_low_band_filter_btn.toggled], fun_to_connect = self.set_min_value_upper_limit, - fun_args = [self.lower_band_filter_unit, - self.lower_band_spinbox, - self.upper_band_filter_unit, + fun_args = [self.lower_band_filter_unit, + self.lower_band_spinbox, + self.upper_band_filter_unit, self.upper_band_spinbox] ) @@ -209,7 +209,7 @@ class MyApp(QMainWindow, Ui_MainWindow): ], self.activate_low_band_filter_btn, [ - self.lower_band_spinbox, + self.lower_band_spinbox, self.lower_band_filter_unit, self.lower_band_confidence, ], @@ -244,7 +244,7 @@ class MyApp(QMainWindow, Ui_MainWindow): self.number_stations_btn, self.time_signal_btn,] - self.apply_remove_cat_filter_btn.set_texts(constants.APPLY, constants.REMOVE) + self.apply_remove_cat_filter_btn.set_texts(constants.APPLY, constants.REMOVE) self.apply_remove_cat_filter_btn.set_slave_filters([*self.cat_filter_btns, self.cat_at_least_one, self.cat_all]) @@ -291,7 +291,7 @@ class MyApp(QMainWindow, Ui_MainWindow): self.mode_tree_widget.itemSelectionChanged.connect(self.manage_mode_selections) self.reset_mode_filters_btn.clicked.connect(self.reset_mode_filters) self.apply_remove_mode_filter_btn.set_texts(constants.APPLY, constants.REMOVE) - self.apply_remove_mode_filter_btn.set_slave_filters([self.mode_tree_widget, + self.apply_remove_mode_filter_btn.set_slave_filters([self.mode_tree_widget, self.include_unknown_modes_btn]) self.apply_remove_mode_filter_btn.clicked.connect(self.display_signals) @@ -344,10 +344,10 @@ class MyApp(QMainWindow, Ui_MainWindow): self.result_list.currentItemChanged.connect(self.display_specs) self.result_list.itemDoubleClicked.connect(lambda: self.main_tab.setCurrentWidget(self.signal_properties_tab)) # self.display_signals() - self.audio_widget = AudioPlayer(self.play, - self.pause, - self.stop, - self.volume, + self.audio_widget = AudioPlayer(self.play, + self.pause, + self.stop, + self.volume, self.audio_progress, self.active_color, self.inactive_color) @@ -486,7 +486,7 @@ class MyApp(QMainWindow, Ui_MainWindow): self.download_window.download_thread.finished.connect(self.show_downloaded_signals) self.download_window.download_thread.start() self.download_window.show() - + @pyqtSlot() def ask_if_download(self): if not self.download_window.isVisible(): @@ -497,16 +497,22 @@ class MyApp(QMainWindow, Ui_MainWindow): except: self.download_db() else: - if not checksum_ok(db, constants.ChecksumWhat.DB): - self.download_db() + try: + is_checksum_ok = checksum_ok(db, constants.ChecksumWhat.DB) + except: + pop_up(self, title = constants.Messages.NO_CONNECTION, + text = constants.Messages.NO_CONNECTION_MSG).show() else: - answer = throwable_message(self, title = constants.Messages.DB_UP_TO_DATE, - text = constants.Messages.DB_UP_TO_DATE_MSG, - informative_text = constants.Messages.DOWNLOAD_ANYWAY_QUESTION, - is_question = True, - default_btn = QMessageBox.No).exec() - if answer == QMessageBox.Yes: + if not is_checksum_ok: self.download_db() + else: + answer = pop_up(self, title = constants.Messages.DB_UP_TO_DATE, + text = constants.Messages.DB_UP_TO_DATE_MSG, + informative_text = constants.Messages.DOWNLOAD_ANYWAY_QUESTION, + is_question = True, + default_btn = QMessageBox.No).exec() + if answer == QMessageBox.Yes: + self.download_db() @pyqtSlot() def check_db_ver(self): @@ -517,22 +523,28 @@ class MyApp(QMainWindow, Ui_MainWindow): with open(db_path, "rb") as file_db: db = file_db.read() except: - answer = throwable_message(self, title = constants.Messages.NO_DB, - text = constants.Messages.NO_DB_AVAIL, - informative_text = constants.Messages.DOWNLOAD_NOW_QUESTION, - is_question = True).exec() + answer = pop_up(self, title = constants.Messages.NO_DB, + text = constants.Messages.NO_DB_AVAIL, + informative_text = constants.Messages.DOWNLOAD_NOW_QUESTION, + is_question = True).exec() else: - if checksum_ok(db, constants.ChecksumWhat.DB): - throwable_message(self, title = constants.Messages.DB_UP_TO_DATE, - text = constants.Messages.DB_UP_TO_DATE_MSG).show() - + try: + is_checksum_ok = checksum_ok(db, constants.ChecksumWhat.DB) + except: + pop_up(self, title = constants.Messages.NO_CONNECTION, + text = constants.Messages.NO_CONNECTION_MSG).show() else: - answer = throwable_message(self, title = constants.Messages.DB_NEW_VER, - text = constants.Messages.DB_NEW_VER_MSG, - informative_text = constants.Messages.DOWNLOAD_NOW_QUESTION, - is_question = True).exec() - if answer == QMessageBox.Yes: - self.download_db() + if is_checksum_ok: + pop_up(self, title = constants.Messages.DB_UP_TO_DATE, + text = constants.Messages.DB_UP_TO_DATE_MSG).show() + + else: + answer = pop_up(self, title = constants.Messages.DB_NEW_VER, + text = constants.Messages.DB_NEW_VER_MSG, + informative_text = constants.Messages.DOWNLOAD_NOW_QUESTION, + is_question = True).exec() + if answer == QMessageBox.Yes: + self.download_db() @pyqtSlot() def show_downloaded_signals(self): @@ -544,7 +556,7 @@ class MyApp(QMainWindow, Ui_MainWindow): def load_db(self): names = constants.Database.NAMES try: - self.db = read_csv(os.path.join(constants.DATA_FOLDER, constants.Database.NAME), + self.db = read_csv(os.path.join(constants.DATA_FOLDER, constants.Database.NAME), sep = constants.Database.DELIMITER, header = None, index_col = 0, @@ -552,10 +564,10 @@ class MyApp(QMainWindow, Ui_MainWindow): names = names,) except FileNotFoundError: self.search_bar.setDisabled(True) - answer = throwable_message(self, title = constants.Messages.NO_DB, - text = constants.Messages.NO_DB_AVAIL, - informative_text = constants.Messages.DOWNLOAD_NOW_QUESTION, - is_question = True).exec() + answer = pop_up(self, title = constants.Messages.NO_DB, + text = constants.Messages.NO_DB_AVAIL, + informative_text = constants.Messages.DOWNLOAD_NOW_QUESTION, + is_question = True).exec() if answer == QMessageBox.Yes: self.download_db() else: @@ -567,9 +579,9 @@ class MyApp(QMainWindow, Ui_MainWindow): self.result_list.addItems(self.signal_names) @pyqtSlot() - def set_min_value_upper_limit(self, lower_combo_box, - lower_spin_box, - upper_combo_box, + def set_min_value_upper_limit(self, lower_combo_box, + lower_spin_box, + upper_combo_box, upper_spin_box): if lower_spin_box.isEnabled(): unit_conversion = {'Hz' : ['kHz', 'MHz', 'GHz'], @@ -592,23 +604,23 @@ class MyApp(QMainWindow, Ui_MainWindow): upper_combo_box.disconnect() upper_combo_box.setCurrentText(new_unit) upper_combo_box.currentTextChanged.connect( - partial(self.set_min_value_upper_limit, - lower_combo_box, - lower_spin_box, - upper_combo_box, + partial(self.set_min_value_upper_limit, + lower_combo_box, + lower_spin_box, + upper_combo_box, upper_spin_box) ) @pyqtSlot() - def set_band_filter_label(self, - activate_low_btn, - lower_spinbox, - lower_unit, - lower_confidence, - activate_up_btn, - upper_spinbox, - upper_unit, - upper_confidence, + def set_band_filter_label(self, + activate_low_btn, + lower_spinbox, + lower_unit, + lower_confidence, + activate_up_btn, + upper_spinbox, + upper_unit, + upper_confidence, range_lbl): activate_low = False activate_high = False @@ -774,7 +786,7 @@ class MyApp(QMainWindow, Ui_MainWindow): else: return False - signal_freqs = (int(self.db.at[signal_name, constants.Signal.INF_FREQ]), + signal_freqs = (int(self.db.at[signal_name, constants.Signal.INF_FREQ]), int(self.db.at[signal_name, constants.Signal.SUP_FREQ])) band_filter_ok = False @@ -787,12 +799,12 @@ class MyApp(QMainWindow, Ui_MainWindow): lower_limit_ok = True upper_limit_ok = True if self.activate_low_freq_filter_btn.isChecked(): - if not signal_freqs[1] >= filters_ok(self.lower_freq_spinbox, + if not signal_freqs[1] >= filters_ok(self.lower_freq_spinbox, self.lower_freq_filter_unit, self.lower_freq_confidence, -1): lower_limit_ok = False if self.activate_up_freq_filter_btn.isChecked(): - if not signal_freqs[0] < filters_ok(self.upper_freq_spinbox, + if not signal_freqs[0] < filters_ok(self.upper_freq_spinbox, self.upper_freq_filter_unit, self.upper_freq_confidence): upper_limit_ok = False @@ -811,18 +823,18 @@ class MyApp(QMainWindow, Ui_MainWindow): else: return False - signal_bands = (int(self.db.at[signal_name, constants.Signal.INF_BAND]), + signal_bands = (int(self.db.at[signal_name, constants.Signal.INF_BAND]), int(self.db.at[signal_name, constants.Signal.SUP_BAND])) lower_limit_ok = True upper_limit_ok = True if self.activate_low_band_filter_btn.isChecked(): - if not signal_bands[1] >= filters_ok(self.lower_band_spinbox, + if not signal_bands[1] >= filters_ok(self.lower_band_spinbox, self.lower_band_filter_unit, self.lower_band_confidence, -1): lower_limit_ok = False if self.activate_up_band_filter_btn.isChecked(): - if not signal_bands[0] < filters_ok(self.upper_band_spinbox, + if not signal_bands[0] < filters_ok(self.upper_band_spinbox, self.upper_band_filter_unit, self.upper_band_confidence): upper_limit_ok = False @@ -836,7 +848,7 @@ class MyApp(QMainWindow, Ui_MainWindow): positive_cases = 0 for index, cat in enumerate(self.cat_filter_btns): if cat.isChecked(): - cat_checked += 1 + cat_checked += 1 if cat_code[index] == '1': positive_cases += 1 if self.cat_at_least_one.isChecked(): @@ -901,7 +913,7 @@ class MyApp(QMainWindow, Ui_MainWindow): return True else: return False - + @pyqtSlot(QListWidgetItem, QListWidgetItem) def display_specs(self, item, previous_item): self.display_spectrogram() @@ -955,14 +967,14 @@ class MyApp(QMainWindow, Ui_MainWindow): lab.setStyleSheet(f"color: {self.inactive_color};") self.set_band_range() self.audio_widget.set_audio_player() - + def display_spectrogram(self): default_pic = os.path.join(self.default_images_folder, constants.NOT_SELECTED) item = self.result_list.currentItem() if item: spectrogram_name = item.text() - path_spectr = os.path.join(constants.DATA_FOLDER, - constants.SPECTRA_FOLDER, + path_spectr = os.path.join(constants.DATA_FOLDER, + constants.SPECTRA_FOLDER, spectrogram_name + constants.SPECTRA_EXT) if not QFileInfo(path_spectr).exists(): path_spectr = os.path.join(self.default_images_folder, constants.NOT_AVAILABLE) diff --git a/themes.py b/themes.py index 88e1988..02bea3c 100644 --- a/themes.py +++ b/themes.py @@ -4,8 +4,7 @@ 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,) +from utilities import pop_up, is_valid_html_color class ThemeConstants(object): FOLDER = "themes" @@ -69,7 +68,7 @@ class Theme(object): themes.append(relative_folder) for theme_path in themes: theme_name = '&' + ' '.join( - map(lambda s: s.capitalize(), + map(lambda s: s.capitalize(), os.path.basename(theme_path).split('-')[1].split('_') ) ) @@ -81,17 +80,17 @@ class Theme(object): try: with open(os.path.join( self.__theme_path, - os.path.basename(self.__theme_path).split('-')[1] + ThemeConstants.EXTENSION)) as stylesheet: + os.path.basename(self.__theme_path).split('-')[1] + ThemeConstants.EXTENSION), "r") 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() + pop_up(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, + 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 \ @@ -111,7 +110,7 @@ class Theme(object): 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) @@ -145,13 +144,13 @@ class Theme(object): 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, + with open(os.path.join(ThemeConstants.FOLDER, ThemeConstants.CURRENT), "w") as current_theme: current_theme.write(self.__theme_path) except: @@ -160,7 +159,7 @@ class Theme(object): 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: + with open(current_theme_file, "r") 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 + self.__apply(theme_path) diff --git a/threads.py b/threads.py index 9c8efc0..cd82f8b 100644 --- a/threads.py +++ b/threads.py @@ -42,9 +42,15 @@ class DownloadThread(QThread): self.reason = db.reason self.__status = ThreadStatus.BAD_DOWNLOAD_ERR return - if not checksum_ok(db.data, constants.ChecksumWhat.FOLDER): - self.__status = ThreadStatus.BAD_DOWNLOAD_ERR + try: + is_checksum_ok = checksum_ok(db.data, constants.ChecksumWhat.FOLDER) + except: + self.__status = ThreadStatus.NO_CONNECTION_ERR return + else: + if not is_checksum_ok: + self.__status = ThreadStatus.BAD_DOWNLOAD_ERR + return if os.path.exists(constants.DATA_FOLDER): rmtree(constants.DATA_FOLDER) try: diff --git a/utilities.py b/utilities.py index 6be34e7..ba98cf5 100644 --- a/utilities.py +++ b/utilities.py @@ -13,11 +13,11 @@ def uncheck_and_emit(button): button.setChecked(False) button.clicked.emit() -def throwable_message(cls, title, text, - informative_text = None, - connection = None, - is_question = False, - default_btn = QMessageBox.Yes): +def pop_up(cls, title, text, + informative_text = None, + connection = None, + is_question = False, + default_btn = QMessageBox.Yes): msg = QMessageBox(cls) msg.setWindowTitle(title) msg.setText(text) @@ -41,10 +41,10 @@ def checksum_ok(data, what): else: raise ValueError("Wrong entry name.") try: - reference = read_csv(constants.Database.LINK_REF, + reference = read_csv(constants.Database.LINK_REF, delimiter = constants.Database.DELIMITER).iat[-1, n] - except HTTPError: - return False + except: + raise return code.hexdigest() == reference def is_valid_html_color(color): @@ -52,11 +52,11 @@ def is_valid_html_color(color): def connect_to(events_to_connect, fun_to_connect, fun_args): if fun_args: - for signal in events_to_connect: - signal.connect(partial(fun_to_connect, *fun_args)) + for event in events_to_connect: + event.connect(partial(fun_to_connect, *fun_args)) else: - for signal in events_to_connect: - signal.connect(fun_to_connect) + for event in events_to_connect: + event.connect(fun_to_connect) def filters_ok(spinbox, filter_unit, confidence, sign = 1): band_filter = spinbox.value() * constants.CONVERSION_FACTORS[filter_unit.currentText()] @@ -95,7 +95,7 @@ def format_numbers(lower, upper): lower = int(lower) if upper.is_integer(): upper = int(upper) - if pre_lower != pre_upper: + if pre_lower != pre_upper: return f"{lower:,} {units[lower_factor]} - {upper:,} {units[upper_factor]}" else: - return f"{lower:,} {units[lower_factor]}" \ No newline at end of file + return f"{lower:,} {units[lower_factor]}"