From 0d83bf4ab073ccb0efa84a5b2a508fd2685b90cd Mon Sep 17 00:00:00 2001 From: alessandro90 Date: Tue, 26 Mar 2019 21:47:17 +0100 Subject: [PATCH] Improved download database management --- constants.py | 20 +- download_window.py | 9 - main.py | 100 ++++- main_window.ui | 10 +- themes/3-material_design/colors.txt | 2 - themes/3-material_design/icons/down-arrow.png | Bin 270 -> 0 bytes .../icons/down-arrow_hover.png | Bin 1732 -> 0 bytes .../icons/down-arrow_off.png | Bin 1737 -> 0 bytes themes/3-material_design/icons/off.png | Bin 820 -> 0 bytes themes/3-material_design/icons/off_press.png | Bin 2928 -> 0 bytes themes/3-material_design/icons/on.png | Bin 916 -> 0 bytes themes/3-material_design/icons/on_press.png | Bin 2987 -> 0 bytes .../3-material_design/icons/search_icon.png | Bin 2017 -> 0 bytes themes/3-material_design/icons/up-arrow.png | Bin 827 -> 0 bytes .../icons/up-arrow_hover.png | Bin 1725 -> 0 bytes .../3-material_design/icons/up-arrow_off.png | Bin 1734 -> 0 bytes themes/3-material_design/icons/volume.png | Bin 17580 -> 0 bytes themes/3-material_design/material_design.qss | 410 ------------------ utilities.py | 14 +- 19 files changed, 113 insertions(+), 452 deletions(-) delete mode 100644 themes/3-material_design/colors.txt delete mode 100644 themes/3-material_design/icons/down-arrow.png delete mode 100644 themes/3-material_design/icons/down-arrow_hover.png delete mode 100644 themes/3-material_design/icons/down-arrow_off.png delete mode 100644 themes/3-material_design/icons/off.png delete mode 100644 themes/3-material_design/icons/off_press.png delete mode 100644 themes/3-material_design/icons/on.png delete mode 100644 themes/3-material_design/icons/on_press.png delete mode 100644 themes/3-material_design/icons/search_icon.png delete mode 100644 themes/3-material_design/icons/up-arrow.png delete mode 100644 themes/3-material_design/icons/up-arrow_hover.png delete mode 100644 themes/3-material_design/icons/up-arrow_off.png delete mode 100644 themes/3-material_design/icons/volume.png delete mode 100644 themes/3-material_design/material_design.qss diff --git a/constants.py b/constants.py index c2a7afe..2904393 100644 --- a/constants.py +++ b/constants.py @@ -14,14 +14,18 @@ class ChecksumWhat(Enum): DB = auto() class Messages(object): - NO_DB_AVAIL = "No database available.\nGo to Updates->Update database." - NO_DB = "No database" - NO_CONNECTION = "No internet 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." - BAD_FILE = "Bad file detected" - BAD_FILE_MSG = "The downloaded file seems to be corrupted.\nThe old database has not been deleted and\nthe downloaded file has been discarded." + DB_UP_TO_DATE = "Already up to date" + DB_UP_TO_DATE_MSG = "No newer version to download." + DB_NEW_VER = "New version available" + DB_NEW_VER_MSG = "A new version of the database is available for download." + NO_DB_AVAIL = "No database detected." + 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_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." class Signal(object): NAME = "name" diff --git a/download_window.py b/download_window.py index cfce206..8d8d0f0 100644 --- a/download_window.py +++ b/download_window.py @@ -28,11 +28,6 @@ class DownloadWindow(QWidget, Ui_Download_window): text = Messages.BAD_DOWNLOAD_MSG, connection = self.close) - # Never used (should exploit the checksum check for the single file) - self.bad_file_msg = throwable_message(self, title = Messages.BAD_FILE, - text = Messages.BAD_FILE_MSG, - connection = self.close) - self.download_thread = DownloadThread() self.download_thread.finished.connect(self.wait_close) @@ -46,10 +41,6 @@ class DownloadWindow(QWidget, Ui_Download_window): self.bad_db_download_msg.show() self.everything_ok = False - def show_bad_file_warning(self): - self.bad_file_msg.show() - self.everything_ok = False - @pyqtSlot() def terminate_process(self): if self.download_thread.isRunning(): diff --git a/main.py b/main.py index 121aeaf..bb385cf 100644 --- a/main.py +++ b/main.py @@ -12,6 +12,7 @@ from PyQt5.QtWidgets import (QMainWindow, qApp, QDesktopWidget, QListWidgetItem, + QMessageBox, QSplashScreen, QTreeView, QTreeWidgetItem,) @@ -29,7 +30,8 @@ from download_window import DownloadWindow import constants from themes import Theme -from utilities import (uncheck_and_emit, +from utilities import (checksum_ok, + uncheck_and_emit, throwable_message, connect_to, filters_ok, @@ -49,7 +51,8 @@ class MyApp(QMainWindow, Ui_MainWindow): self.set_initial_size() self.download_window = DownloadWindow() self.actionExit.triggered.connect(qApp.quit) - self.action_update_database.triggered.connect(self.download_db) + self.action_update_database.triggered.connect(self.ask_if_download) + self.action_check_db_ver.triggered.connect(self.check_db_ver) self.db = None self.current_signal_name = '' self.signal_names = [] @@ -334,14 +337,13 @@ class MyApp(QMainWindow, Ui_MainWindow): # ########################################################################################## - self.load_db() + # self.load_db() # Left list widget and search bar. self.search_bar.textChanged.connect(self.display_signals) - self.result_list.addItems(self.signal_names) 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.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, @@ -365,8 +367,10 @@ class MyApp(QMainWindow, Ui_MainWindow): BandLabel(self.ehf_left, self.ehf, self.ehf_right), ] +# Final operations. self.theme.initialize() - + self.load_db() + self.display_signals() self.show() @pyqtSlot() @@ -456,6 +460,9 @@ class MyApp(QMainWindow, Ui_MainWindow): self.lower_band_confidence.setFixedWidth(120) self.upper_band_confidence.setFixedWidth(120) + self.freq_gfd.setFixedWidth(200) + self.unit_freq_gfd.setFixedWidth(120) + self.audio_progress.setFixedHeight(20) self.volume.setStyleSheet(""" QSlider::groove:horizontal { @@ -475,9 +482,57 @@ class MyApp(QMainWindow, Ui_MainWindow): @pyqtSlot() def download_db(self): - self.download_window.download_thread.finished.connect(self.show_downloaded_signals) - self.download_window.download_thread.start() - self.download_window.show() + if not self.download_window.isVisible(): + 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(): + db_path = os.path.join(constants.DATA_FOLDER, constants.Database.NAME) + try: + with open(db_path, "rb") as file_db: + db = file_db.read() + except: + self.download_db() + else: + if not checksum_ok(db, constants.ChecksumWhat.DB): + self.download_db() + 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: + self.download_db() + + @pyqtSlot() + def check_db_ver(self): + if not self.download_window.isVisible(): + db_path = os.path.join(constants.DATA_FOLDER, constants.Database.NAME) + answer = None + try: + 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() + 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() + + 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() @pyqtSlot() def show_downloaded_signals(self): @@ -497,14 +552,19 @@ class MyApp(QMainWindow, Ui_MainWindow): names = names,) except FileNotFoundError: self.search_bar.setDisabled(True) - throwable_message(self, title = constants.Messages.NO_DB, - text = constants.Messages.NO_DB_AVAIL).show() + 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() + if answer == QMessageBox.Yes: + self.download_db() else: self.signal_names = self.db.index self.total_signals = len(self.signal_names) self.db.fillna(constants.UNKNOWN, inplace = True) self.db[constants.Signal.WIKI_CLICKED] = False self.update_status_tip(self.total_signals) + self.result_list.addItems(self.signal_names) @pyqtSlot() def set_min_value_upper_limit(self, lower_combo_box, @@ -621,6 +681,8 @@ class MyApp(QMainWindow, Ui_MainWindow): available_signals += 1 else: self.result_list.item(index).setHidden(True) + # Remove selected item. + self.result_list.selectionModel().clear() self.update_status_tip(available_signals) def update_status_tip(self, available_signals): @@ -959,12 +1021,12 @@ class MyApp(QMainWindow, Ui_MainWindow): 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) + # 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) + # splash.finish(w) sys.exit(my_app.exec_()) diff --git a/main_window.ui b/main_window.ui index 6fc624e..2fd0733 100644 --- a/main_window.ui +++ b/main_window.ui @@ -178,7 +178,7 @@ QTabWidget::Rounded - 2 + 0 true @@ -1775,7 +1775,7 @@ p, li { white-space: pre-wrap; } - 4 + 0 true @@ -4869,6 +4869,7 @@ QSlider::handle:horizontal { Updates + @@ -4895,6 +4896,11 @@ QSlider::handle:horizontal { Update database + + + Check latest database version + + diff --git a/themes/3-material_design/colors.txt b/themes/3-material_design/colors.txt deleted file mode 100644 index cd95572..0000000 --- a/themes/3-material_design/colors.txt +++ /dev/null @@ -1,2 +0,0 @@ -active=#ddffdf -inactive=#949494 \ No newline at end of file diff --git a/themes/3-material_design/icons/down-arrow.png b/themes/3-material_design/icons/down-arrow.png deleted file mode 100644 index b2cd4a52cf922c10bea9defbcf62c8fba414b23c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF>t*I;7bhncr0V4trO$q6BL!5X7~m7) z`v3obhE-D;*3M*DJDp)25X}HF)&j{H5O%}PN&A3`xl4llf*E)mix(_B{`k|U&-W_2 zBZ0ymo-U3d9MQ=M2Y6c)rzkp4W9~?cJhtE-Q&NS9p+P7^Ys4*435hGwk`hW?4U2rH yGOoES>hS4Ru(BhQf?@|l0EZHTNE6osCI$^wt}EUB9{Yi2GI+ZBxvXsUDe diff --git a/themes/3-material_design/icons/down-arrow_hover.png b/themes/3-material_design/icons/down-arrow_hover.png deleted file mode 100644 index f7ad171d7f16a110e14f720dbf7bd5e3d5e64ecd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1732 zcmb7FOKjXk7fB$2C zpPQeX9X;^q0YMN(%cWwKzsIus{`>gzv1{9yzaEH6XA(geSw&$$EG?FCW|x$b=vSlTfFl1cOvjzTRdH;$d$;UO~14n(^IQ+ zHL|)$Ojn$G4jk)PoFJen2A!Z4CRWE5ySx@3XVa1hx{!3y7N;|VV4*S(92Qeh$Z3!u zRROx0Lz-+V>QSJ`NS9}A#IrS!^8t7 zb#Nr1oSeDT1-fL2iqH0CRW!05_-v!5)%;&J$EpnLI@TcaH0mLl7)Yms{Y6HWvI5BV z_s)XL2c6X>j=~mJcynK7%cbCYXqFuuO zTeJUPct0ehiNglvy;Tx3SEQ^9^%5fO&Q*79N5>k#c^k}z!~V-Zh8>)SoI2+Hxp3~4 zUwChSt6ZF}8RO)}_V(00Pn^fUjyAtqUH|0r-|yF}g|+K%UtfD<>zy0PWr}w^m5EV9GJ$rFt@=!Ff_Co&W zW>Fv6^foRFm&P{M|2%T|uoJz0zm`B?Gy6O)$ifUUp$%pXUa2k#fv9i GTl)ua11Sgq diff --git a/themes/3-material_design/icons/down-arrow_off.png b/themes/3-material_design/icons/down-arrow_off.png deleted file mode 100644 index e7f0af30cbf493e2adc6c41e8c1a865d0e135d47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1737 zcmb7F%WvF795x}KQizmXs?rO_rHI$~y?!YsBzDLy>ZW14Qo@POj>o%J)*fSfvzr_c zL`4FL14pPLf>2QlLi__1AtX?^6p0I{2P6a+Dh>#xhu*??A0`dy1538YGv9o_@AsIW z-&tB*m^gakD8n!lm9kr-@5%f=@*sUawz~)E>!G;(O3Ernqvdc=9WuUu^KzL6_hs;e0F28 zjy6`2>2Wj9v(r6`5`;K|Y%gp_snxT&KCeZ``Lw{XeMq)ybF;ZYcBQ(+IwZktiPr#< zRGHOHUeZKUR-a>KQPKrb7bFFUk|k=EVzR@Fqt+77w`%T-LtFIA=2}@6TY}K-cKNQt zlcXs~rfCYIEXXpT2#~Hv8SH^5Jvm}A;0BE@-247$zDp zp$B6@;>FyhKF~u2F771lzHtu;xQ#;`Whuo<1vYMxjHE4c8|q^D76UZ2)oNkmP%U9t zm`JnvHR{GNAcvyU`g)9o8cs8S6I)J#VMdZVA?;D3mPV3U$6=pZ4kC|q z)2H{ru?sV7b2MiLkR%}Lby=|_(~`|+^W=#GXq9+@zkUE})J55n4XdQz0;L7x!3^FN z>>*yD!N!6EUuC(FbA-4>>#cc_wq^_2Ko7bbYNNn>}H8We6PJ%wv`7JhGu94I;< z{J%B(|Ah}jf?6Ro* LMfZ!jbDRGF>dq>Q diff --git a/themes/3-material_design/icons/off.png b/themes/3-material_design/icons/off.png deleted file mode 100644 index ef39d9e77ab00a309f33db4db5b492aa82803ee5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 820 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!n2Vh}LpV4%Za?&Y0OWEOctjR6 zFz~y9Fk?orLK9F>vcxr_Bsf2(yEr+qAXP8FD1G)j8z}|`M)3fj z5ZC|z{{z)KI5?PldRn@NnmTw{y8D^B`nY;K}xCB_b23WcUn7aj7y7-v`*)Dz- zuKpIT0T!-)7HcYb6 z+Im~MC$>g}xAsnI>zmRZ5#HW6WzvkfiNXu!PIe)?8r8{=+KXB~ojhlC#zy0+2 zpW?QgV!#kh@N{tui8%arT6*{)1Ch4F_naeBogW|Bd$g4~?(FmTzx73pgOjDH{(!LOvSmd=lkb#hNq#hVys?DWdcm~5o5v2bzM0{4L+E>I z${Qxj$Hvc_Ro_esDzK4XYkg8DCujRJxA3no;_a?HXiG2GkLx(}{p`(2hF3WLKKmP* zSGU#Qji)c|%fVIm1)l8ex0jqyxGwz5$364d41Y8 zCFU%oi2h%zJ^*m^0i97XRKIcE{VBV({70)*<4A9N}`SU=kce8nDMKpW9&WE+U`*t4M oUjBnInaO<)r_3f6CdLN&D#tlb&P+bd3yc~DPgg&ebxsLQ0PsL*W&i*H diff --git a/themes/3-material_design/icons/off_press.png b/themes/3-material_design/icons/off_press.png deleted file mode 100644 index 3355d12c5bde1379b4ed8a5f0b4b63e4873f4eab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2928 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 diff --git a/themes/3-material_design/icons/on_press.png b/themes/3-material_design/icons/on_press.png deleted file mode 100644 index 475450803b4d6b419a30a791c06f788956adabc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2987 zcmb7G2UHW;8lLDPh=w34xcZP7JRT4xnS^vhkpLz@5CM?|3zNx&L`WtifdoNBln9Cq zEQqp#y1K3nb}jh8h7}IjyMn^5f(Qc7hNAc;h^+2$Th5u>JNJI~|GvN6|4dG3$TXt$ zSZe?Ph+>gn7(V)#AFCnw|4+)q27DN*5q+lv021H)5H|AeRRMrSlQJSoA0-LqBbbT` z%P=WQHL5f?8UO^|Mh%R_qk6IwjZ>;UDIFCjC}gF~lQN4Xfg~Css!)m+XwmQmArZ)e zc!VdTczclrMm}yph3a9lQI(+9@r|C8KD&H;ZeFHQ$bArfyeDOl88EBX^@j-$7|jT4Xml!McBv02Lk4h~ByB<;xeTG938)HH>vcGmK7iFI zFg>PIV1HtIVEYRKJhT$Y0LNFgs8jtlrLLLYoUx+1O zTAUKs0vd3iv2t(cu=TH zrHn6U$+>JPA_ZA=hyzMtrVQkIa1juJxe$!9*laF``RTkLh9sF&Z$AI=7RWFJxAD6? z4wDBl*oYkDAyPIdLzq$!hU6&7Kp6;~g}^*IeL&50trEY8aKh(S&8lQ(RdfbR&O%wB zoPlsb4~PkaTpq&%M7d0)_>8ezQKUN|TCKQl+2pS3+_x>w7J9FkYdW^sH>tRbeNzUm^i zw5=AX5S1j9gepc9O0u$@-Ulj_J0#ZvgsgOdEo-J<;QXLHhnRNm_PetqipdtQ^6QD> zg=Lep0>kaI{&2F%F^|x3TFl;j)bQ*BC+^vsf;|MF?!z7CD8Ryp5DI)bXp!B{b|B+s?D=!6}9}J8ggs)ItWk&ocpy!TgPo|n{4NV zv|&FsK0yhWV{SKV@=o1wO$ma}m6*}EUsRNvU4O9NdfZ_& zqhSm2$tw!fHHEB9weQ{N3QUN-K7_zB*;^EIo>#6Lnq9i`TyU(R&14G4gy%W8N_HI~ zrB~LIj=W9JeD?j^?%$r%O5WZO#+KfNovT8}SzW(d3S?YSr1`}+nVN`cr`FiScxW3R zmIaI%^KSJ0@g$>QZm02Bck0Cp9j-^FbuWC=%5rhplSwoU7x`-D6EdQmiXWeUOi4pRQr!?eW zN{Y1FKi)cPV$SNqamOZPBZXdyRSE0%1_GMb7C`m6+FfTDox>%lK-8# zlsf3R{m6W^=7yswDW=wKa_(;TjO%%6;#=EZB_-A`8u{Pe_-WINt(<~Gj-o487hY;! zw!b5l>~&ofsn6^IWk9zuH;<$ir_=S^>@U`_Xr7CUz}24Cwb zMx)L;3nK*d<0TRE=R*5WWtN23zKXv3oZo)IyXlwd z&(?;!*O39WarZD$%Y3g7S++OV0Y164kM2LsTj%lwtQ2&uM752cWFUQ>9UxDdwNqrHc;)S~IZ| zd4qL+*7v6cUbY1xR>1C|CR2xR;v<6l-VGav?yN{2WT=cNdpA{-<$U(Cq)Zfh@y^hq zIrR@;TW&bk_2yl=LU3*3sL1&(q*@2zT5WlBThq%Juv1$%4&t+IdVPEjcZYI^&zo~} zh$(o=P5a1~>rV%4@48|nj<6fiuoqi;ub?Kxa!KOrrCp-YE&lN*^rPFNLh`Eu*Av%@ zg4{U`K3DG~j_SyIzOUU^Ms6q_V`bM`RRXKTOV|w`ab)I{EhNnx~ClR+r45(_;S+zx}?kng0iC`FiF6 diff --git a/themes/3-material_design/icons/search_icon.png b/themes/3-material_design/icons/search_icon.png deleted file mode 100644 index dd0ec52bfc9d027629b93b1cc6943da4da945ee4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2017 zcmb_dUu@e%9Cq8$ZtY4{%BpH~V0i)!QO7?2iDT2SbxGG`A|>jAT3)7}&*#KSVjJ6S z((YxNiYhdT|4$QQ>|v-v)5P|`3rOn&4~VML${QM*096`1OiUm^3?4WqY3NY)2Sg;t z=ezHIzwh_mcXzL5CntKl_jXeh)tgQwr^uTRpPilLf4cqmW%AnPre5+Xs%Id4+Nd+{ z4pCI+$5w78n8`e^A*URHhNI(1wd@i!MU5V;x)2p{KUE_Pp&YuWyG0jIm2h% z1TI*qMGqfaoXnxcB2o?J;B)k7RU-k)IDmAuT(W(w8fR*8HPQ~dIfkx5f?}K*3lq{a znJk@fJWR`xD2sq3(25!XQC=0K5nAAZ!tn|RM3x5{AJs&aZu}UM%`;4GDtV-li+shI zLJ+tb$5kqoNJWe|UY-N0s&c%*2?9$HtiNCfu*%y0{;dc}>?6-|1Iw}LFe22QxggFE zru7oaZZoXyH)JA$aaHJYAi{?w)qnf;ht;@R!ox6dyqx2d zwiYV8MVU?{=mXQ1Z8#PG>1}YFgaM8-WX)nM04yKNftV(!8W5fd7mu$)Gmc@I3$37{ zq)E{`pu{i+4B&mi2GUH&D??JQRfc)YxptnRn<8onr{s7fF<~ce?@uQZSfHuPEWSk+=L@dkDcv(lL$^#atF`hMbNoFB7RW>SM z$uN# z^O&5i9P{5xc`#4bIkqfi`}X_4O5wr-weBtMpSG)wZ99C)BG$Udi5@naR|)xOUPjm^ zDtY9pX}`oco>nz>tCgJ?znpM%9-37Cq5MRZFY=Y*xmJ7|8X;y8@}-n zx^TAb$VaC?K$m;^mUDwooLU(f-El7aY0sCBtfo?lnSo2cJv=}cf9P5Nx$@0Q?}6d$ zM)%U@pW0CB&2~!t`s9&u`p*JYBqf&5&My<+JzB{*-u! rdTMDewU7FqI@CpJ)YZ0IORK%R_MBLIapSwb@DfgsPbM!Oo;~#!GI@nY diff --git a/themes/3-material_design/icons/up-arrow.png b/themes/3-material_design/icons/up-arrow.png deleted file mode 100644 index 6f0f09084c07abaefcb2695d8ead0df3c57c5f52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 827 zcmV-B1H}A^P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+Kp6MlHDK-{O1%o0@_%P!&;RaL~7KqOwD*<@Y^Bv0-NFaR;bTc8R==D>P#yNYt1Bw@tBn3NR_Y!$Y8N7)&93nf? z1xj4^znqUD(8%;E-*? zANaeh7c99P&O!W8l<>UZoITAswt*H6n6+?C(Ot|51jCAZtRf7h=q3SwINKBeX~USt zi>9xj>>H7v#2|8D))ETTDB@HqWLuV?Px$Jfxk)H8voh0Qh5dkRoU1rppq{*OXCBC$ z{D6@nn9}$ext|(-M{}-eMS1D^*JwAJS6@)gYWvz@h9=Mr?UxyOEO9;^2h@GKpnHDo zTSwly)q;Ssw+op7(nfCHne8Wey3reQMh$UE) z1>CIxI)eNRq2tE;y}3R3^Qnp@Rk55}kx6W>Y_=9#Hv9Yhz#9tz0LEi1(hsz;>J0$z z*JBZx#L*!Epgvv3B06w$7Xw6xW diff --git a/themes/3-material_design/icons/up-arrow_hover.png b/themes/3-material_design/icons/up-arrow_hover.png deleted file mode 100644 index 149eae09cd9d89aa607d65f722735edfda90fe1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1725 zcmb7FOKjXk81}XWLYqjSUP?J&xdMV(~r+M{fv#2dORv0+J8YT(rIc)aUm?Qv}< zyIG;Cs!$~k9N>haA|Xzk;0^}_2jI}C#~!$p3lbm%QZC^X#`_`-=>to)$1~r2|Mx%U z_xp|IOEag>pB4mRrdF-2@b@$MJ@q7izOZ+I`RnPp`gSS^XU^t#LD;!J!r0F zYxOq}VWEsY=2E#A#vCmObMw6zlMR}QE^P%-S^D$qZzM7B%F^XxU9HCsZ3oqULRb6C zP14^WwkOSB6z6(~6NEIwVlV7ODe9G_0Wad?d|Hvj0VLZfOAEO{ajo7E9hOkBD4T#l zLlaB33{BP6jMqd>g(XETDNqM0M5>8&TO3^yx0ZN5TB*D~vc`a1TW3g)u{grX&gCEMSqCGh&x*W@U*h9l8+46WS;pg^34D z>ET#`vYNXz0D5GCi#L>g+MywhvXo=t1RJ+m#?m%>0QF?~J_9_o_4>rdv0B1# zVj|6!wzwOkfEtK97G=L zrmq}=(+bXLS>idf0E9p-H8mYU8)^2ddGgdDw9dT1-#!AhnyQ9$6+z=ZC@&ZfXZVp| zk075VA?EG|A#PD6j#`p92_kY>hb7!FSEnDIuQ^U5VSdoz3+c+GMX|Qzn9w#&pviC` zw_ZoJD9vz0XsuF~cxdDx@R0678|$P9DD+j}S%wX4)%Ac|qy+j!-G`<<-d|y4GcSOA z|L`n$jBt*B6@@PW_vRU_;JLY!>qX~k27l6 zuw4sVz;|r}=p{o3F10P7`>Np=A;c~=^P(Tr5vm3$&+zu>7_HK)qfsXi2c?5B$&W-? zB6%%PPZ~`J$He2YERXhg+mw?&q)LX?Q|4z~oX~|9kKH3`Pn%1*q|KMQ${XUqw zwtM%E%olFnyE}dM2Qr0sPfdUO+26NM+$x;;$kE^H?OM}?^YJfM<1hWKoeyUUzZQO@ v?XUVfPyIOi(mVRx?d$#P{pW68^G^u-?_T+1b^lW*|H0IjmMdQ@Ub*oPW?Unv diff --git a/themes/3-material_design/icons/up-arrow_off.png b/themes/3-material_design/icons/up-arrow_off.png deleted file mode 100644 index ac2217f10db8821aac2a37fa06d2dcc8f705f26b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1734 zcmb7FO=uid9G}v(tPL9?3T;(zIzdqEe7u?6*_lT-X)>F37qT&=3ymJsH}AdOon~g< zI5Wv^77^+}jD#FjidRoUy$T*gL_M}13I!1g1rHTe@Zv#;Z}!VHrlu~;&inYi-~adj zc>md6S-zY<^~@CYIkfFndojJz zTW;XqI<|>4H!EJ~LQW9S6p7uy4-?oeOMPC*$Jw$fiG4`AUY6!FgW_6!MRZt9#iC-$ z7!-7|WGlebY`t(^)HP62wUP=9Sp!frp<#=|pTw=jqzP9mmxi|ZtSq(DG=i$y>2#Ei zp|H560^7D#O;>eY<_J023RBdT!(?W}P@xHqy(slqC}xbvWgBT(;z|cD1kso_Oon0N z0aLpuQh}mnF7<%~k8#mP?DvfmtWuu_G)xnY1!HW~W+_YB>=D%C?S~BT(AMi?8;5EM zg0YDtUEJhu3jkJq)hKL9;y8%VVLpqwVXn^Dzg}~km6$a>pKm0qmlwp^qGJNvG-X`@ zeYy2Itc6L6LQHFwvcyB9cpiZTtq2TaHszvemE;mC*s_bb+g6bxS4V^taba}6!th2` z0NMG$T_6l|j(_9p>iT%=n2xnKK zEa9vcD3ONC-l6e$49mmwoi^p9|4}6a>j`V79Td~~7LVN#HK;yHdV)5O68<=e94I;< z{NFYE|Ah}jg4-x;QQlisDRV{5y3imY>cL#~_x5$H5uCTdY&h<}d@}CfH00DV@6X5Y zEZpV2{d%o3->{yi| z>gm6hcACVw*t^&}`{4Ag`^VxBw(snaDyXX8+`hFWoSb;>`!8mG-OauWLQ7KZ1YBW?b zqNYtsGGZ(x+lX;9=6=sTQa!)l|9#)j`#zt~^Lc9SbDwkF=X|g4wVdmEl3X@BDa>3j z6NAAhtXpfp6@w86e-y{aN`wFWq`n^q|Cw=U?XD0EMotC&R}6D5Zyp9CrR=|bXXwsN z8!bI42UoazQ9Qg?P!ApgqcIo)k$TA8Gr&6(>*4L|A7q6ac*MkE{k^PkZmTw}+;qs! z+s}V(M6ma^h|SwQBLX}vyl_NoEP-kXCOGIF>W-xz3=9gfq*~!b^IC#Gqd((uSkaKs z04tm=x*&GvCKs$7CD zmc|y?U;p61YQbJUmRs!|f2{@nW`*+$4LxLu$A^W5tq3z-K?(N78(LUc;8z;qjf@Py z2!oLDpip> zx*x(Du2_kFl4zip=kIZcjsypa7WeYRdk1n+k3Hl^38jSiQT{hm|9Fsb7h^dW!%^^#> zU~l(OO7M0HC2;znT&6|F+Sy^3xcLWpQNlu&{x#g&-aXXY3J1>2+`!P#V5Ql1BV$WL z3ri!5<>=w9oEo}`;^prX{vSilw;P&U8k<2+cksFX z2i<+W@rQzZaoFFRXlX|Yqy&S7fpo@y|Gv)7&Lx=Q;~xkfglu(MgI(ufXKH9+YHDD# z!cZjcrcIXXfU+NPYbLPUU;`I_%1JyCtc2^0a)pN>YTUj@KObv;VV#ew@%)1!% z+iz?X7rI_})s&_5X8v`htc;hJ=FN;w$tI}DR@}Ks*phKAa>df5_u=`=t)s>UzdlWL z-mQ5nnI-Hd%Rs^owX8Xs2cwOsgKgFEGK!>+j60Zl3y?mdaOBb$&E0FH8$wE$T~kjr z7`MaqY>gf$%tM??h86T-lc^4Sgah-62^aEYd?1Wju*lNSi!f1(1bSd7Q?_y7erD7Y$ zzP#{s+na~iUU3xN3H2xEcMJ63Z387)4eAVB?$dZPGknp^B%`0PFIt|xJDD=6Kmg+u zxGxQ$iO7cY63mTdOjjd*|A4GTReY0^P`&7+`992cKBM?nYA+I_akv!P*SAp`mC}kD zA`jD3##7@oYx^l#4V4qC*UTDh8%am58bBdd-_E9%w4|o6q0@|yU%`=-;3@t?pNH-* z6OWnqkh#N%@?&5vx<*#__}<)Znb6wxUlY8*CNZ9IDQaRCyhOb-VST)rAKnOTBe~3> zDA+ec3COB^23jOmvHIZL) z#kP4|iY^G#(FUJspbx!?W3)*8vrgSVDY2F{yYE1unw zTHDa$5R9V13gSxPf41Ds)8E9r4cFYX*Qwwyy%L4S7j8OS4D9EhKLD?_A0d zE#{WQdA5g319G*ka^$^iCUz+{Ya^-M^+a?sJKma8)$7K|!)>+7ojvQz!78DhcSqo2m@^c1{fIuU+InuDU zI`vX`q?>S5Hullb#frg@3|#{C+Y8S35zeKfKt_E^cP4Y|OJB?azU&TQ;u+V@`YObKjT*Y)k90i7$SNDAfYjXRt`e^FS5S^IdfO$%yI0U&xd6nay1 z)G?%?Nal7P6a84yL&BmxC<;lB1h+^?+n!jk%X;UViZEFCNxWK?AjuyHsj?I@mbiUd z_W@9X0k6R2u<_M_XO-y2WAQ~z!Z(XD->7Hc2~?v_a%s-nu<;5f)4?lsBpAyVK z-{6kW}p zMYjP8S2i?SEa+3hgmu`ZpW>BeqWY1B%0N;5`%Fb!jjmGr_mSET2XkqHuhqR(6H%w# z)G(cqaV$*@Mq8&d7NQO={+cCKHG3$t0mWWY?c7iIhK0OBx^ql3wQJmO;)@DBacTHA zWa0z&g1Q(gOG2F|i`c?SLspX5z1jm~b;+E`2V(*+Yi{%JRg8I2pV$tnwrRVL{3; z-pV60^s!NU2?`0OK%s6SI%Sj+pG7_+P;c6k%yTO#5}v)dItorbP`u3EC=uwD3X7?R z$H1Q_MqC7u!u%Y8nW=Mm)Pqkw=g_6~!P44@swP(6R(K?;;Sld;;beTW{bGgSKY&5M7CFT;tL?PDzsOF=9DdIz8COXC{809!Ir%?{L39KF z3W{G9qFoPG1+}?Nvk1-?% zvX?nWM~2IsjsJd?s9?k2!Ht6Ie_BXT(W3;|24i0go2;k*s@rN32GK zSDFNYdXl5!oWvr#9+ZM>mqIF?yTux}S8wTJ0s|5p3znq!j0_}qz*=JPM6(2sh7a<5 z1zG+B0HO$&EQ3M_#3kXGRY0dX3rdUU6nHkzrw;mb9cDr#n37K9DTbn zZDNuIyK2<)~~s3<%ws2RM( zxPP3>e7^Sau8CTa*Re%n$DB2$gU9RXe(BK3ZZ)|6>-8pnkLSZLo}<0CHo`|kgQrIn z`(>*Vd^_~KBotx2Ir9M?whiSCt8Y_En=>&QQU$aBg+S3LJ>-@#V4ZYCl}9rOl3+vq zpCe_$I?4MkR5chgN&!9NIuA3EQv%m2;~Xt$h>_zcR(zvT+>Q>ThuHmX-&MQ6W>Nz&Xq+bcEPGu1zhO{9rbD1+WO2toTocF!SY)_zWrzUKB{?qpD)o&)jx+ml#prJ61YlD8q zee7cT_f<@kwP=D{A8`mbLO8lx%y7mOhz)4tGL!YslsT>*0f|^H_ z>x<%S@v7S|bZji4mVz-mg^fr=ir{nP6(zHh6=LnEHtqHZ2_rI_k`(? z>smP}SCRGPb^2Tm;7TdNDYJ<;(vJ3Z^K3+o_{Lr;aaUwcF@Mz?W zWO??IZi0zL*b-mM5rjr6>yUo=V|{y_#i$mqq*er5CVV;=^tv zV7=PUjZJ$zbvQRCw<&I^;Bl^r70uMbQ;lEHPwo}!s~#6P-^=b3^QsUO)UXLx!Nl(>vD= z*plc9ch_)`EtRKdI*z>PIo9+UAhz?H|0)1jJT+t}nKN-U1CfTq21WpK>B$1^06hGp z>HODw)=#_VVw|{&l%?pF?AZ%ch{zjwjh@cV0~ZVaV$t$rBDF||mKjTT-3Z@9DeJu@ zBGLIz?1Xnu0$3#(@W>9rb|QQjQ>o!1Qwl$cvq^cNVTm8jtIbNVJqqTme@ySH2UeK;Z=6R zC(met^L@7VnH{*g;`k7q!f=9N)tBG{n*Ic zPBg|#(_)mm>Vuv7+2-)+beG1Ck{ZgKuXd-e!dAmo{m+-_#LRv#)KSZT#cTgW0azfK zCd_Whd_=pYq_2g1hbk}lN%r6Os9Y3mo#TtUnGe+joZ_A@gBmpNfhcst8nH_+432>)(l}}=iUh=|ms_HTs4!m7ZG5qL z(*jkSNJHm$#F+;-b2d^1ul{hf29LNLRc5tJX5)mSLF;bhaX~Y=Y^{s3;po_u_u6s^ zSQF?NiP(pafs4+%56*}bYK;oNKyKIifbl$TQZw`}AjX1$oieC__I_J|e)XnlE0#{q z(3IL4*qR`ULxH%>3tOwubYH+>*5 z$iEU`qF6DRq$!nSC-jltzsYEg(0;x%3p$ctL25q5qg`rR&n6OJ^`WK!q~|nQc!E1u zilzlYQ8#8{xSG<=>wgB}mFme}6Dlq)n;zO9D(h!EOy2E3bekfIbIxysRboUz1$$8v zi}=1w{L1~(y0fyyQxWZc;9IN<0^ocn1ZOa?OY-)PD*G+BW}7Dn@LxJm>c&0LLe_RD z!7_CzcW(V-`h(2hE3tREjYnzt>Ni7w!XfQtw+@0pF6a4vpZmeqgIyiKpoaq2sA9=u z2ci4WnLK`LIs#KSu%Wl}LIex6VV^$DVVS;k#8F|VYtI?R``(RPC|2~avscEW+KzN6 z#lYuN+V^-F&=UnuX$LGj(ss-s$P!L@{(3YbM8karl0cF1t(E zb&N{e3&@zfis#Zy1_pb^$cG%=V`0|t^2R9Xg2OZnh$J+3X(QnDZ+$kjLU!$#vGMCz zZpVjldAcaN*4isT*Eq}kI;VEfZrNqb@-n7hzKq`|&L3LW!}W|nfN9Bh1dB-TFJta8 z4?Dd7IB6gkdm0!P`$3*lu?|Pdb9JG>Q&Xy7@)nu!?V=tHn?__D?<{$rl(2g-31{x6 z^!V}IwG;JQi7~sCj_*aiBh9S?M-RZY=2k{>QmHfmh7VSo7uZTR^`h2l2fVr#|Ie0K zqGW|j+LimJpOmXlVP<=D()M1?MCQWf8qA%^v7cj`=|4R!Z+rxiRV=#TgK*`{Auf;j zG{r{;dpqG+2FmX_N|-fkfRd~me5Tu$(5bmi@~%tT>-KMj7bgNx-@{JKW^Eee1ALg` zq2Vj`12R7sXF&RwG5mmX;>ftog?nXUL5Xvn8y^zYM%djmF(;5DEEnuM^Jh*)x8_sB z`lcYLQMp>VBgkgLxb~o@CiA}d{vug%_^F-nVjb~;VB>`P7hyvT>0zyNd0^hsV>_*l zxO9E|3#HoYofNB;^PiejhhzKjqq@gR_7AA4lORh!uXEU32yh?F$AJu0)cK^G~x z)f-thrZ{WS~@z9R}QG~WYpQrZ$cuR>OMaAFi`QTuN%xmGLL3$ap`4cDp5wE0p zL134~e1`bi1_NZ=bs@+kz}om`PSvIBPlf%zoDG>dUnMN;sZ%m|)jCHg-8LBQRcq#O zYu^2FjAu*o5}kMoB%$H6)ijzP^pxN9qkG$D;X|n^C0NBc8Dt#ngxb_ar^)*4!?zlR zIvUJGm5B+sMfhPVOw;T7F`^BO7_PHl`* zj?r%lgcO&u=;E;;r;rBO^UAv#*W!E*u-hFm$vxm zgP_K$GWjJKS${P>1~puHpmOsHXztAMzMVHeX@$o?Xd?^e_=DZnRu;lvePRh{E zC4M`Hen$U5-HMAC6t}ObTQBk7eb-mjSKTLE^MW< zWzBaNP@VV13d}}@-;L|?u;cdsq-hbjni+y`aN%JAZx)Ei_-+7Z&l1)(G-JURS~GSg z?z2l{a-$x9V0moZpih1<;pv0+nVp-QaF7#5?A z5<&tKMg##G@MCS~wimJGH)i_fzr&5Hx@^T>m}>(!X{RXDSG{lxVsE`PyvA|M zT#U|!S2Bd=;hDiRNkVRRPbX)&Not%|9USWv=?H%K+4}sgiFAf;w*(2>x2s*5o6$*6 zCtD6(it@ps)B;RoqF%1vmbIDn^l!)5bN6mwrXEr2I2oHOX8w;j_M@(LIuW>+NqU^(~n zPRxn=20P^qB!I|&pu{?}!C&5_c*(L5)O~bPDX*~>+Qjr5AREG2v<$WIWfw|4zA3Z z`~rik63pmxcA@D%hN65dT&oND==3#Y=A5TDk2V=#PP2$hG|JuEw2)_9wsLiKm)hY< zBxGXGRHBoppYO4A7K-!w3$#;$;IsTCJ%?H@d@lGmtiHh|pP%l#W2HufH1|lHKC;RN zMTACQct0x*3WjxWyb3-8?kPklWUQg6!cO_*?TPM3W@5aa)+7OFgDedcXb}SvoG9Gj zzFj|>)s*VU&GE6hIAVF(ORt%+11yLZOMn1>bX&~HEl0|MlnDaS8=Y*hT z(^S0fp^r&JBGTUwn(=@f%q4q}KrdNF#u(ql2_} zE3$|;R&JO_el!vAL1+lQ)_^J7af;kQk_oUmhffK1C76_czVqKes?Q=8r9D^of#_3l zNjecgENDLq@KE-0h_tC+RdG!xGz}efV|mqC&g)zBg00)M)VcJa$JuAkznnIM)fOw| zj|(g`2h$XIYPbqr8vWkKDX>(BTbCK$u|?$t$Iex=sM+$%?8(%0n938l^c=x1+&tKM zUf4n8?h4EczIZyclTZUT52##8h_w-KgR1sj_>(x+aVS$CEaAsCu05L%Wx%=%$j=`x z!2V*RFfSHS;1PHt{nKg@4gjYV=6FfLiF-~R7AP;rtUa5jNWJIFWy5V_x;rpw=v4OQ zzNGr-*og*{k)YNy*L**gdDw$2MQpcrwu(wzXlxt$wmY95U}F5Q`Md)Rsl8iuC*I_ z5X>$CF?;#;neE5pQ4D@~Yy;?r+l{|uX!QH+Rr#@0`~vvtW%JFhLVf$WVckEbJfW5H z&m!MwOP~aCtdsqD-Gz4BYl8nidywztM*0_<{9z3s$&!WnXDXZlvD=xlh<#CbgQ*)3 zz!hM*G$K$=aKv1-Z?FZwjSY>*C}gB{A`i#99-Hy%^=BZLWvV60|dExr_7 zNr*e!!(?WVL_E^znjW4u5<$LWqsZX^JWkIEimQBWFxq!2k%DX zazC#`uZ*(QlU^WizmUJ&F+`=QnMe4?ZPP}fREG>#)0Ln~U*7Z$M5JG~E|Qf;zlH{=c+7RSY$MENM8C%>60+{9oo_ zSsV*`QV}pgKO*MxSnZ_XY5UTkryz^Pq7N%=j9f8~SQE;4@h`PE-3oVevp?h`2e(UM zczU}47rn`kbaG^aP(#_(*W$&$(4cK-+;X<^GRDSqZ{C#jG6dzPLmO^lu;`mfL2QpE zpg~17dK|zBSKToG%>X-#VPNkyeWcrRX2$MMj6)Fvyo+MK=0(9(Yp!EVzm_nfkG_*5 zj^^X?J)|3QFY^hDeu7l{lMC%9rt)Kc3nX~-l^G8eB=G*Q;(uOjE*M?66(l<#`7%T2X}wbKuQ!=M#KYsa$FA0P0)%LSL|~t6DV`r zoBhg|ZpH7w)!W0XTMK|y5gCPNoZ%A9s;K2Z23t#_1;<%P^B3~nQ5qaS%7QK{hhr1@ zmjHJpdjk8+O+WfdBblA*3(-W^3R0+q(ni$3Q`W3(9pw<+PFB49r!8E2m ztaeJ1#eb9dCrbJRV(-5ki~IS=o;mJVgfkj8@PeZuc1ZD+t;3kjEM7NY5D?-fm*elu zY39TibcEa<4FmV!`!FA6y5aZF0a#GT5SPJD@Mz6OUiO*u{2Iftrgo;AOtK&Fzm3t z<;bTc9~v?1L`I?efwrBnXi*rKXluV~$};$|i2M1S#R6lt%t2?1(Ugx3{gO&&x>2gbvBfy zmEqH%ye&T_WO%~`la;|2f<&>sNZ9n zK@kTiSD!Z#Gx|3SlpcqAzC_7B_0D& zJhvOLyiJFO7#j5HaF%e9%{^ZogkRd?}0CrJR#a&dAaG8W{i)|3pS0 zf=?85WI!V}LykRKuXY4N9`x*p^qTJC0sIy;6bH`Vvrog>EfeIsR_7~}j+*zM5Gadc?b6Yj!JNIqZ4K(P zZ3l>Q1y)XrfDM_6@%Y~A@+H&m#Ndga4Er+v>`u+d0Zo{u233wKf^geODb2!J6L>g= zi#e^v?+vt&8+^^qqAwxk%wt2_0x#- zfvPrGGmFMm-^NCW%VDP@3$qVEjf2R(z`l}Z&Tk7i``PyN#G|E8pULKasNH0P%6_G`a6IxeeMTtR}ux8#F+Vgl(+5Q z0RR2=gG$#c#iGISy3=IUN~oCwQaY>uxI#0|=^jhcO~x!%Kq(TE?ZeZ?#-{I`rcyy^ z4po{BS8PALzsj1e!E+uM^S&4+EpFwrPegRT3Vvigx~_H0xolhja{Ps#LRRtcqp$>! zC7=0;U3h=;2zqg^w_~PgnZ}<*k~2@z8XvzE{*%f4#9?=jmQVS~#M0oE{<8^O&cIkr z+TFW1_)MP(mGFhNBnp}rN{YQSEOCuB2QFE-hfB1y4j)YdCRpQnKR!iFNlQ(fH5-=s z65=X9;ru3L(q^J}5%b23pz}Sm6!NggmWih==PBO1wPGpqF#-v=PfV(P+hPjG{220- zjGgT&iFE@scllgD9|(PJ)XWQ7ijiHa&=PguK^u{J;J6$Zxcf;Ut0qi`5Nh55=#eU> zMH;&%iDw|TSRwhWo?+9*6^It$VkN>CyGOk4j6lR4X!6|=^?y+C2R!FKoP} zdWAJ|f^rhmv5#}*qu7fFp4gw|J^s_)yQZamZG_`Hn^ zjte}qA&pNX5zM0#+e$Kf)>_4cNpwQrG>BjB47pYw9=UxYi8gj3Z3ox@L&g$covYo* zo+$aX!mV=bM{%_SFTVJK&>t;3%ZW5?tn0Xi!M(>}or;6Qmp##C>7_v%9o|G^``EXG zwyjNW6p|j*vZwP+*M^H`Zjqc_O_RnpRfPW(I5^C8nb^=iZ^uMrhegcqnv?4z$Crwq zOiKX>TqAtjN&kU67*fUrH>aC>#wtNx{#Od;QSo={!_T^$Qt+ z#LI2@Cc(HX6}M)_xoFq`HTX6Ol6jZ_oyn3bZawSF`V*< zH)U-;u%Jz_8^bH8XvG`hjjzykMOPmQ8mBv?wnU@?wJ$hU;Ro7o7rELCc5K`^JiDsb zRC%~TwxJH)b{26z3@xg@SSKC;bqy=jWEP?Y1Q~liGH%GasEU1YlJJ9AOy5A?4Cuwv z51Hl68+@pCXtkAitU#MDR;Om)lePDl zw@=d-&)2QHEbDh-7pA^Jtsuw5uZ+8VsIlCFi$CIiMgR4vTFoG`u;w%vR)1M`P$pCQ zR&D0T#d_Jyn#@pwQC%OtEFWr=HU?K&=V}e&-c?#Q*YgO6`@9@s?Gk^gMQzDa;FW5A z8LH=`wOrCT+UaTwDW$z5?fAMbsa4w{{RI(ZgxQ7{?567r;-f`Xmo2!jhUBWjH<)Jf zTX2Od(WyCJYAZYzA*_K+r>n5I&#%}@W=d-zu3Q@9`H+qxLTtePDl))5&|U36n=N%u zFVmopa{t@zbY|X`*o__&Dzlk4R5CZFn#UBg>p_+ut-a;WB|1lkJ7?mm$dYFqwjTZg zU738@EKGwwDm@hFs%83YADx&%Ba7+{rc$zKy+L}*CGHl^0 zSXr~OYwQd4G^bQpy-2KLFi>C*cE?HS&_A*Tm1zxXJ#gaB`r zzb~p{y(CMzEUeO;@;H^U1(RCH_0#m-N0TV)O2%sj7koQY%l=c!)%4uh!NygVphl;e zbIu^;IgNY8X-n zonBLrrE(~;PMf6`wn39QRaPU*Ubo;latQ#I8X5fAhC85A0Y@zyTzxP5NPAFfM`5Bc z0HoA&Be11XnbI}q8}3$d2l5r4j&q}|EuXM)e)w?7KEJFEvuhZe6NCQ*HYBNvH35d6 z^kZ{*W(*?Ix4N-=8=W>De&PFYYs>xRLS)jVH4W12^B&LPjrnING3HZM#a^!57HkA4 zYd{zINHxBfeI)|frb*mnbj(bJhTHG;WPNBpT7LBCxr7yRxaR)i`PJtQbDQ{!lJXsF zF7-Kkyg3O%1H|n5Phof3bb*7EslSWOaCYKuN$$ODJhlCm7LUA1Sa)jW=4ip6Dlz%5 z3SW0QU^1nT%u^_sOiBht;LU5_81OWI#q|%LW^=A}-B`n#P4d+MqgIILm@H{uyGaX1h-%0(zrnsse+qpcwu&xv>6V|S>vHU<65%b%D0hIUfDCF}kn6$Q?t#^d%RwQ# zAK&x`sw2l4Z3bx#;TsC(qsA{CDH6Eq8b=7fgin_%91#cQ3ZTeGZs>c$hLb)hi-7!d z*hh}NydClh6v<52EaJ2#^$`|uHb|5|Wec%DzL(pWM1{>tZFunp z-#rWYWU!MoSE1_w@vNKO-8sc(PyM4$u+hx3CTTw*83QqjGPsIhIwyUE;t_zCBT;-g ztwnONyh+X2ntY+-R0bS66pcU^1RvkN1y1o9x|D`~L!X0#uGtb3mY zMZj*A$m$5;@NnqH)e`s_8V)wbt=IGU>(dc0tJPd0aDpE4HNTIT0@RZRcbt{T1OY6K zD_Cy@f^DzJq>aLAG6gMr%$6_7H|bI8<}Viq@+-OumF}zEr73EWDG@L6pmJEYaG7;tzKWWSmDJSwp5<-wiSoGoOXjP z9!McKCi&X0Nk`#6RdIH%FvsND1}&`jTkPT5xp0X#UM$_U5@{wCkfJ-+*ZgBzGs+0nNDlJj|D|= z3XIv|jZtFBxB^J2>WVE3a)fK=(&D<_{oS7diYRr4m!P;p^KEkV#OJL@SX?KO^Er|| z+72~a##zIltAjC*x^cn#XcP2uh)cZ2*W4`(`BjndUD79C{)tovt z9SC-A3tO#VO|FS7>{Oj{xQD1{j{H@OqYO-3-U`VbbnqNh44X7qbENW+ziMzuPYC&P zIR#B8Kn#MbM931^kRC~dU{K_!?p#^y#4b7}#{u` z$9}ymc6|k$EXX_qnd&f)=OEIc&{mpslTau-c5;}lCYJPq6Sg-EVm~oVkhMTW)sf)a zfNf|Wz7-LTIo&PZtTH|q>{=J_($0Hp$|y$KjhXd20cH(SlPW&}{?? zg0szOxGGKNOSP5Na2oYgI#FvY>h3Rk`l>3vd^XKZimfW9%}zw?&kFf?17!Ymv5hn+ zLaz0z%Ej%!u`V7|C`@j05rPX3eYmK}6{>%|=&`_YmD?Q92eh?&izGGT*^OEi&XZ2g zYUK+iOLBYdL5Ad)fo`3ZPfw1n@RCN%j}e1AGLlT8~Gie zzGVIyp6h@3D`3*=yd0CBKqVJ7@pYR3$#(Ql%GJ4IVe1(*@_ zK~(^5EL&iP6KsqZqp$&m!D2;S2^z|Ir%?PN?3~0q|)FlSg$7Y(4uF{kUxGq+Av^t&UYR|_w^}15~wL_j}#hq zE&s!@8jM}k6E#s{N`SJN#(3_QSp6qaM@IW9e>Wbze0sM_u0ZzWHCY>BWw_Q{v0XRd z8`A~lO|;r8w!SGC|AeZ!aEj(Ad+RH=h@LHWXd_p*MW*ynY{3uE&448h_E~2|U9~U= zZE!Cx%bxU=lz_wJ?%E%cP4V---o1R$JAfR$Gfqmeg3L6iEbRlokrpslY(9L$R}3wN zr-X6KQVp(>_vX&K-l_JRInzL6z@Ag!D~#GTVCR@d7W35 zOm{F%c?oD|#o1hwCC3Y|Ce1juE+8J!Y$lRcob?6-rk7;VlV0OZ$zoBdj7S-zZ& z@LL@xm0aZUaZ+IE^$fdZnnKY|gCpVJ`R+c+pyo_!fDKJ-9)aJN%(A2pB(pVB5XkJf z*$C4a^QYtymDBSr7F55e)c#j#BWO!V8KkEz zEO8^K0phAIYHeLzJ8j1mfeWTI-QNacI?zpIJDh{xFZ_s8r)Gpl_|@xyh9$jYPD(4u zUckC|wHAoSf_A9-^xfL|T>7`{iqJ@EV9SU`78Vqylt1GqywUvZ^(DUX$-Ql7` zQ*YesdJ+ggT9_%lG&$B=JiHnlH)=sM64B zRmOG@%aI1f+y32?Oe-&h+3=X^T`4qc`stMKf3lO^iB0d}lx;RrbnKIb&u1ouyT$WWz9vO<>X&uPt&yu^f(;|&VK{Ra_1YN12hD%d zi-B?Zz}*-6P^v93&`pD_5(W4iT}g(ri}c|-=9-YXFPx!D77#+)u~QEeTfZ~zTzl<% tBcY|3&=6WJ!JG%6g1)0R3y&aT#~mKM2-WFE|9>Lu95&k*ui1a>e*txA42J*! diff --git a/themes/3-material_design/material_design.qss b/themes/3-material_design/material_design.qss deleted file mode 100644 index e5b9d6e..0000000 --- a/themes/3-material_design/material_design.qss +++ /dev/null @@ -1,410 +0,0 @@ -/***************************************************************************** -MainWindow -*****************************************************************************/ -QWidget:window { - border: 0px solid #2e2f34; - background-color: #2e2f34; -} - -/***************************************************************************** -Search bar -*****************************************************************************/ -QLineEdit { - background-color: transparent; - border: 0px solid transparent; - border-bottom: 2px solid #669900; - color: #669900; -} - -/***************************************************************************** -Scroll Bars -*****************************************************************************/ -QScrollBar:horizontal { - background: transparent; /* Background where slider is not */ - height: 10px; - margin: 0; -} - -QScrollBar:vertical { - background: transparent; /* Background where slider is not */ - width: 10px; - margin: 0; -} - -QScrollBar::handle:horizontal { - background: #37474F; /* Slider color */ - min-width: 16px; - border-radius: 5px; -} - -QScrollBar::handle:vertical { - background: #37474F; /* Slider color */ - min-height: 16px; - border-radius: 5px; -} - -QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal, -QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { - background: none; /* Removes the dotted background */ -} - -QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal, -QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { /* Hides the slider arrows */ - border: none; - background: none; -} - -/***************************************************************************** -List -*****************************************************************************/ -QListWidget { - background-color: transparent; - border: 0px solid transparent; - border-bottom: 2px solid #80CBC4; - color: #c2cfd6; -} - -QListView::item:hover { - color: #669900; - background: transparent; -} - -QListView::item:selected { - color: #88cc00; - background: transparent; -} - -QListView { - background-color: transparent; - color: #c2cfd6; - outline: 0; - border: 0px solid transparent; -} - -/* === QTabBar === */ -QTabBar { - background: transparent; -} - -QTabWidget::pane { - background: transparent; /* Only at the very bottom of the tabs */ -} - -QTabBar::tab { - background: transparent; - border: 0px solid transparent; - border-bottom: 2px solid transparent; - color: #546E7A; - padding-left: 10px; - padding-right: 10px; - padding-top: 3px; - padding-bottom: 3px; -} - -QTabBar::tab:hover { - background-color: transparent; - border: 0px solid transparent; - border-bottom: 2px solid #88cc00; - color: #AFBDC4; -} - -QTabBar::tab:selected { - background-color: transparent; - border: 0px solid transparent; - border-top: none; - border-bottom: 2px solid #88cc00; - color: #FFFFFF; -} - -QStackedWidget { - background: #2e2f34;/* This covers a bunch of things, I was thinking about making it transparent, */ - /* but I would have to find all the other elements... but QTabWidget::pane may be it */ -} - -/* ==================== Dialog ==================== */ -QLabel { - background: transparent; - color: #CFD8DC; /* Not sure about this one */ -} - -QDialog { - background-color: #263238; - color: #546E7A; - outline: 0; - border: 2px solid transparent; -} - -/***************************************************************************** -Buttons -*****************************************************************************/ - -QToolTip { - background-color: #80CBC4; - color: black; - padding: 5px; - border-radius: 0; - opacity: 200; -} - -QPushButton { - background-color: transparent; - color: #c2cfd6; - border: 1px solid transparent; - padding: 4px 22px; -} - -QPushButton:hover { - border-left: 2px solid #88cc00; - border-right: 2px solid #88cc00; - color: #f0f3f5; -} - -QPushButton:pressed { - color: #efffcc; -} - -QPushButton:disabled { - color:#546E7A; -} - -QPushButton:checked { - color: #88cc00; -} - -/***************************************************************************** -Rich Text Box -*****************************************************************************/ -QTextBrowser { - background: transparent; - border: 0px solid transparent; - color: #546E7A; -} - -/***************************************************************************** -Main Menu (Upper part) -*****************************************************************************/ -QTreeView { - background-color: #263238; -} - -QMenu { - background-color: #263238; /* File Menu Background color */ - color: #546E7A; -} - -QMenu::item:selected { - color: #AFBDC4; -} - -QMenu::item:pressed { - color: #FFFFFF; -} - -QMenu::separator { - height: 1px; - background: transparent; /* Could change this to #546E7A and reduce the margin top and bottom to 1px */ - margin-left: 10px; - margin-right: 10px; - margin-top: 5px; - margin-bottom: 5px; -} - -/***************************************************************************** -Main Menu (Bar) -*****************************************************************************/ -QMenuBar { - background-color: transparent; - color: #546E7A; -} - -QMenuBar::item { - background: transparent; -} - -QMenuBar::item:disabled { - color: gray; -} - -QMenuBar::item:selected { - color: #AFBDC4; -} - -QMenuBar::item:pressed { - color: #FFFFFF; -} - -QToolBar { - background: transparent; - border: 1px solid transparent; -} - -QToolBar:handle { - background: transparent; - border-left: 2px dotted #80CBC4; /* Fix the 4 handle dots so it doesn't look crappy */ - color: transparent; -} - -QToolBar::separator { - border: 0; -} - -/***************************************************************************** -ComboBox -*****************************************************************************/ -QComboBox { - border: 0px solid gray; - border-radius: 2px; - padding: 1px 6px 1px 6px; - min-width: 2em; -} - -QComboBox:!editable, QComboBox::drop-down:editable { - color: #c2cfd6; - selection-color: #80CBC4; - background-color: transparent; - selection-background-color: transparent; -} - -QComboBox:disabled { - color: #546E7A; -} - -/* QComboBox gets the "on" state when the popup is open */ -QComboBox:!editable:on, -QComboBox::drop-down:editable:on { - color: #c2cfd6; - background-color: transparent; - selection-background-color: transparent; -} - -QComboBox:on { /* shift the text when the popup opens */ - padding-top: 3px; - padding-left: 4px; -} - -QComboBox::drop-down { - background-color: transparent; - subcontrol-origin: padding; - subcontrol-position: top right; - width: 20px; - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; -} - -QComboBox::down-arrow:enabled { - image: url("./themes/3-material_design/icons/down-arrow.png"); -} - -QComboBox::down-arrow:disabled { - image: url("./themes/3-material_design/icons/down-arrow_off.png"); -} - -QComboBox::down-arrow:hover { - image: url("./themes/3-material_design/icons/down-arrow_hover.png"); -} - -QComboBox::down-arrow:on { /* shift the arrow when popup is open */ - top: 1px; - left: 1px; -} - -QComboBox QAbstractItemView { -background-color: #2e2f34; -} - -/***************************************************************************** -RadioButton -*****************************************************************************/ - -QRadioButton{ - color: #c2cfd6; -} - -QRadioButton:disabled{ - color: #546E7A; -} - -QRadioButton::indicator{ - width: 50px; - height: 50px; -} - -QRadioButton::indicator::unchecked { - image: url("./themes/3-material_design/icons/off.png"); -} - -QRadioButton::indicator:unchecked:hover { - image: url("./themes/3-material_design/icons/off_press.png"); -} - -QRadioButton::indicator:unchecked:pressed { - image: url("./themes/3-material_design/icons/off_press.png"); -} - -QRadioButton::indicator::checked { - image: url("./themes/3-material_design/icons/on.png"); -} - -QRadioButton::indicator:checked:hover { - image: url("./themes/3-material_design/icons/on_press.png"); -} - -QRadioButton::indicator:checked:pressed { - image: url("./themes/3-material_design/icons/on_press.png"); -} - -/***************************************************************************** -SpinBox -*****************************************************************************/ -QSpinBox { - color: #c2cfd6; - border-width: 0px; - background: transparent; -} - -QSpinBox:disabled { - color: #546E7A; - border-width: 0px; - background: transparent; -} - -QSpinBox::up-button { - subcontrol-origin: border; - subcontrol-position: top right; - width: 16px; - image: url("./themes/3-material_design/icons/up-arrow.png"); - border-width: 0px; -} - -QSpinBox::up-button:hover { - image: url("./themes/3-material_design/icons/up-arrow_hover.png"); -} - -QSpinBox::up-button:pressed { - image: url("./themes/3-material_design/icons/up-arrow.png"); -} - -QSpinBox::up-button:disabled { - image: url("./themes/3-material_design/icons/up-arrow_off.png"); -} - -QSpinBox::down-button { - subcontrol-origin: border; - subcontrol-position: bottom right; /* position at bottom right corner */ - width: 16px; - image: url("./themes/3-material_design/icons/down-arrow.png"); - border-width: 0px; - border-top-width: 0; -} - -QSpinBox::down-button:hover { - image: url("./themes/3-material_design/icons/down-arrow_hover.png"); -} - -QSpinBox::down-button:pressed { - image: url("./themes/3-material_design/icons/down-arrow.png"); -} - -QSpinBox::down-button:disabled { - image: url("./themes/3-material_design/icons/down-arrow_off.png"); -} \ No newline at end of file diff --git a/utilities.py b/utilities.py index 2855341..6be34e7 100644 --- a/utilities.py +++ b/utilities.py @@ -13,12 +13,22 @@ def uncheck_and_emit(button): button.setChecked(False) button.clicked.emit() -def throwable_message(cls, title, text, connection = None): +def throwable_message(cls, title, text, + informative_text = None, + connection = None, + is_question = False, + default_btn = QMessageBox.Yes): msg = QMessageBox(cls) msg.setWindowTitle(title) msg.setText(text) + if informative_text: + msg.setInformativeText(informative_text) if connection: msg.finished.connect(connection) + if is_question: + msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) + msg.setDefaultButton(default_btn) + msg.adjustSize() return msg def checksum_ok(data, what): @@ -26,7 +36,7 @@ def checksum_ok(data, what): code.update(data) if what == constants.ChecksumWhat.FOLDER: n = 0 - elif what == constants.ChecksumWhat.DB: # This is for a runtime check of db version and suggest an update.. + elif what == constants.ChecksumWhat.DB: n = 1 else: raise ValueError("Wrong entry name.")