From 360b10215a31334d4883698067dcfca6329cda93 Mon Sep 17 00:00:00 2001 From: BarsTiger Date: Wed, 11 May 2022 16:29:25 +0300 Subject: [PATCH] Updated scrollbars and added comments --- horsy_updater.py | 1 + horsygui.py | 77 ++++++++ modules/gui.py | 431 ++--------------------------------------- modules/gui_manager.py | 102 +++++----- modules/manager.py | 15 ++ modules/styles.py | 79 ++++++++ 6 files changed, 242 insertions(+), 463 deletions(-) create mode 100644 modules/styles.py diff --git a/horsy_updater.py b/horsy_updater.py index de571f6..062b12c 100644 --- a/horsy_updater.py +++ b/horsy_updater.py @@ -1,3 +1,4 @@ +# Legacy, only if normal update method is not working import argparse import urllib.request import threading diff --git a/horsygui.py b/horsygui.py index f704799..05fd334 100644 --- a/horsygui.py +++ b/horsygui.py @@ -42,10 +42,19 @@ if __name__ == "__main__": # Connected functions def refresh_gui(): + """ + Updates the GUI with the latest data + :return: + """ installed_apps() def fill_installed(apps: list): + """ + Fills the installed apps table with the given list of apps. + :param apps: + :return: + """ ui.installed_table.clear() ui.installed_table.setColumnCount(4) ui.installed_table.setRowCount(math.ceil(len(apps) / 4)) @@ -54,11 +63,19 @@ def fill_installed(apps: list): def installed_apps(): + """ + Gets the list of installed apps and fills the table. + :return: + """ from modules.manager import apps_list fill_installed(apps_list(True)) def update_app(): + """ + Updates the selected app. + :return: + """ try: app_name = ui.installed_table.currentItem().text().replace('!', '') if app_name == "": @@ -72,6 +89,10 @@ def update_app(): def uninstall_app(): + """ + Uninstalls the selected app. + :return: + """ try: app_name = ui.installed_table.currentItem().text().replace('!', '') if app_name == "": @@ -85,6 +106,10 @@ def uninstall_app(): def search_gui(): + """ + Searches for apps and fills the table. + :return: + """ from modules.search import search search_query = ui.search_box.toPlainText() if search_query == "": @@ -99,6 +124,10 @@ def search_gui(): def install_app(): + """ + Installs the selected app. + :return: + """ from modules.gui_manager import install try: app_name = ui.search_table.currentItem().text() @@ -111,6 +140,10 @@ def install_app(): def check_updates(): + """ + Checks for updates. + :return: + """ from modules.updates import check needupdate = check(True) try: @@ -120,6 +153,10 @@ def check_updates(): def get_source_gui(): + """ + Gets the source code of the selected app. + :return: + """ from modules.source import get_source try: app_name = ui.search_table.currentItem().text() @@ -134,6 +171,10 @@ def get_source_gui(): def info_gui(): + """ + Gets the info of the selected app. + :return: + """ from modules.search import info try: app_name = ui.search_table.currentItem().text() @@ -148,6 +189,10 @@ def info_gui(): def like_gui(): + """ + Likes the selected app. + :return: + """ from modules.liker import like try: app_name = ui.search_table.currentItem().text() @@ -162,6 +207,10 @@ def like_gui(): def dislike_gui(): + """ + Dislikes the selected app. + :return: + """ from modules.liker import dislike try: app_name = ui.search_table.currentItem().text() @@ -176,26 +225,46 @@ def dislike_gui(): def upload_gui(): + """ + Uploads app to the server. + :return: + """ from modules.uploader import upload gui.popup('Upload', str(upload(True, ui))) def change_password_gui(): + """ + Changes the password. + :return: + """ from modules.change_password import change change(ui.oldpass_box.toPlainText(), ui.newpass_box.toPlainText()) def change_email_gui(): + """ + Changes the email. + :return: + """ from modules.change_email import change change(ui.email_box.toPlainText()) def login_logout_gui(): + """ + Logs in or logs out. + :return: + """ from modules.login import login ui.username_box.setText(login()) def get_users_apps(): + """ + Gets the uploaded apps of the user. + :return: + """ def get_threaded(): try: apps = request.get(f"{horsy_vars.protocol}{horsy_vars.server_url}/users/public" @@ -215,6 +284,10 @@ def get_users_apps(): def gui_package_edit(): + """ + Edits the selected package. + :return: + """ from modules.package_edit import edit try: app_name = ui.manage_packages_table.currentItem().text() @@ -228,6 +301,10 @@ def gui_package_edit(): def gui_push_version(): + """ + Updates the selected package version. + :return: + """ from modules.package_edit import push_version try: app_name = ui.manage_packages_table.currentItem().text() diff --git a/modules/gui.py b/modules/gui.py index 2b0e979..3c9c638 100644 --- a/modules/gui.py +++ b/modules/gui.py @@ -1,5 +1,6 @@ from PyQt5 import QtCore, QtGui, QtWidgets import modules.images # import images from binaries +import modules.styles as styles import ctypes @@ -14,84 +15,7 @@ class Ui_MainWindow(object): MainWindow.setWindowIcon(icon) MainWindow.setWindowOpacity(0.99) self.centralwidget = QtWidgets.QWidget(MainWindow) - self.centralwidget.setStyleSheet("""QWidget{\n" - background-color: rgb(30, 30, 30); -} -QScrollBar:horizontal { - border: none; - background: rgb(52, 59, 72); - height: 8px; - margin: 0px 21px 0 21px; - border-radius: 0px; -} -QScrollBar::handle:horizontal { - background: rgb(47, 48, 50); - min-width: 25px; - border-radius: 4px -} -QScrollBar::add-line:horizontal { - border: none; - background: rgb(55, 63, 77); - width: 20px; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - subcontrol-position: right; - subcontrol-origin: margin; -} -QScrollBar::sub-line:horizontal { - border: none; - background: rgb(55, 63, 77); - width: 20px; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - subcontrol-position: left; - subcontrol-origin: margin; -} -QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal -{ - background: none; -} -QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal -{ - background: none; -} -QScrollBar:vertical { - border: none; - background: rgb(52, 59, 72); - width: 8px; - margin: 21px 0 21px 0; - border-radius: 0px; -} - QScrollBar::handle:vertical { - background: rgb(47, 48, 50); - min-height: 25px; - border-radius: 4px - } - QScrollBar::add-line:vertical { - border: none; - background: transparent; - height: 10px; - border-radius: 4px; - subcontrol-position: bottom; - subcontrol-origin: margin; - } - QScrollBar::sub-line:vertical { - border: none; - background: transparent; - height: 10px; - border-radius: 4px; - subcontrol-position: top; - subcontrol-origin: margin; - } - QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { - background: none; - } - - QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { - background: none; - } - -""") + self.centralwidget.setStyleSheet(styles.centralwidget) self.centralwidget.setObjectName("centralwidget") self.horsy_logo_lefttop = QtWidgets.QLabel(self.centralwidget) self.horsy_logo_lefttop.setGeometry(QtCore.QRect(10, 10, 32, 32)) @@ -104,33 +28,7 @@ QScrollBar:vertical { self.tabWidget.setToolTip("") self.tabWidget.setLayoutDirection(QtCore.Qt.RightToLeft) self.tabWidget.setAutoFillBackground(False) - self.tabWidget.setStyleSheet("QTabBar::tab\n" - "{\n" - " background: rgb(22, 22, 22);\n" - " color: white; \n" - " font: 12pt \"MS Shell Dlg 2\";\n" - " width: 150px;\n" - " height: 21px;\n" - " padding: 13px;\n" - "}\n" - "\n" - "QTabBar::tab:selected\n" - "{\n" - " color: rgb(166, 184, 200);\n" - " background: rgb(45, 45, 45);\n" - "}\n" - "\n" - "QTabBar::tab:hover \n" - "{\n" - " color: rgb(166, 184, 200);\n" - " background: rgb(29, 29, 29);\n" - "}\n" - "\n" - "QTabBar\n" - "{\n" - "margin-top: 5px;\n" - "}\n" - "") + self.tabWidget.setStyleSheet(styles.tabwidget) self.tabWidget.setDocumentMode(True) self.tabWidget.setTabsClosable(False) self.tabWidget.setMovable(True) @@ -142,24 +40,7 @@ QScrollBar:vertical { self.loginlogout_button.setEnabled(True) self.loginlogout_button.setGeometry(QtCore.QRect(720, 10, 151, 50)) self.loginlogout_button.setMinimumSize(QtCore.QSize(0, 50)) - self.loginlogout_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.loginlogout_button.setStyleSheet(styles.button) self.loginlogout_button.setObjectName("loginlogout_button") self.username_box = QtWidgets.QLineEdit(self.account_tab) self.username_box.setGeometry(QtCore.QRect(720, 70, 151, 31)) @@ -187,70 +68,19 @@ QScrollBar:vertical { self.regmessage_button.setObjectName("regmessage_button") self.requestupdate_button = QtWidgets.QPushButton(self.account_tab) self.requestupdate_button.setGeometry(QtCore.QRect(225, 590, 200, 40)) - self.requestupdate_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.requestupdate_button.setStyleSheet(styles.button) self.requestupdate_button.setText("Request selected package \nupdate on user side") self.requestupdate_button.setObjectName("requestupdate_button") self.editowned_button = QtWidgets.QPushButton(self.account_tab) self.editowned_button.setGeometry(QtCore.QRect(445, 590, 200, 40)) - self.editowned_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.editowned_button.setStyleSheet(styles.button) self.editowned_button.setText("Edit selected package") self.editowned_button.setObjectName("requestupdate_button") self.changeemail_button = QtWidgets.QPushButton(self.account_tab) self.changeemail_button.setEnabled(True) self.changeemail_button.setGeometry(QtCore.QRect(360, 20, 151, 50)) self.changeemail_button.setMinimumSize(QtCore.QSize(0, 50)) - self.changeemail_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.changeemail_button.setStyleSheet(styles.button) self.changeemail_button.setObjectName("changeemail_button") self.email_box = QtWidgets.QTextEdit(self.account_tab) self.email_box.setEnabled(True) @@ -298,24 +128,7 @@ QScrollBar:vertical { self.changepass_button.setEnabled(True) self.changepass_button.setGeometry(QtCore.QRect(360, 140, 151, 50)) self.changepass_button.setMinimumSize(QtCore.QSize(0, 50)) - self.changepass_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.changepass_button.setStyleSheet(styles.button) self.changepass_button.setObjectName("changepass_button") self.manage_packages_table = QtWidgets.QTableWidget(self.account_tab) self.manage_packages_table.setGeometry(QtCore.QRect(10, 240, 871, 351)) @@ -422,24 +235,7 @@ QScrollBar:vertical { self.upload_button.setEnabled(True) self.upload_button.setGeometry(QtCore.QRect(10, 380, 291, 50)) self.upload_button.setMinimumSize(QtCore.QSize(0, 50)) - self.upload_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.upload_button.setStyleSheet(styles.button) self.upload_button.setObjectName("upload_button") self.safetywarning_message = QtWidgets.QTextBrowser(self.upload_tab) self.safetywarning_message.setGeometry(QtCore.QRect(10, 450, 281, 161)) @@ -502,139 +298,37 @@ QScrollBar:vertical { self.search_button.setEnabled(True) self.search_button.setGeometry(QtCore.QRect(750, 30, 91, 50)) self.search_button.setMinimumSize(QtCore.QSize(0, 50)) - self.search_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.search_button.setStyleSheet(styles.button) self.search_button.setObjectName("search_button") self.install_button = QtWidgets.QPushButton(self.browse_tab) self.install_button.setEnabled(True) self.install_button.setGeometry(QtCore.QRect(20, 575, 146, 50)) self.install_button.setMinimumSize(QtCore.QSize(0, 50)) - self.install_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.install_button.setStyleSheet(styles.button) self.install_button.setObjectName("install_button") self.source_button = QtWidgets.QPushButton(self.browse_tab) self.source_button.setEnabled(True) self.source_button.setGeometry(QtCore.QRect(190, 575, 146, 50)) self.source_button.setMinimumSize(QtCore.QSize(0, 50)) - self.source_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.source_button.setStyleSheet(styles.button) self.source_button.setObjectName("source_button") self.info_button = QtWidgets.QPushButton(self.browse_tab) self.info_button.setEnabled(True) self.info_button.setGeometry(QtCore.QRect(360, 575, 146, 50)) self.info_button.setMinimumSize(QtCore.QSize(0, 50)) - self.info_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.info_button.setStyleSheet(styles.button) self.info_button.setObjectName("info_button") self.like_button = QtWidgets.QPushButton(self.browse_tab) self.like_button.setEnabled(True) self.like_button.setGeometry(QtCore.QRect(540, 575, 146, 50)) self.like_button.setMinimumSize(QtCore.QSize(0, 50)) - self.like_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.like_button.setStyleSheet(styles.button) self.like_button.setObjectName("like_button") self.dislike_button = QtWidgets.QPushButton(self.browse_tab) self.dislike_button.setEnabled(True) self.dislike_button.setGeometry(QtCore.QRect(710, 575, 146, 50)) self.dislike_button.setMinimumSize(QtCore.QSize(0, 50)) - self.dislike_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.dislike_button.setStyleSheet(styles.button) self.dislike_button.setObjectName("dislike_button") self.algolia_logo = QtWidgets.QLabel(self.browse_tab) self.algolia_logo.setGeometry(QtCore.QRect(820, 530, 31, 31)) @@ -650,70 +344,19 @@ QScrollBar:vertical { self.delete_button.setEnabled(True) self.delete_button.setGeometry(QtCore.QRect(300, 575, 275, 50)) self.delete_button.setMinimumSize(QtCore.QSize(0, 50)) - self.delete_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.delete_button.setStyleSheet(styles.button) self.delete_button.setObjectName("delete_button") self.update_button = QtWidgets.QPushButton(self.installed_tab) self.update_button.setEnabled(True) self.update_button.setGeometry(QtCore.QRect(5, 575, 275, 50)) self.update_button.setMinimumSize(QtCore.QSize(0, 50)) - self.update_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.update_button.setStyleSheet(styles.button) self.update_button.setObjectName("update_button") self.check_updates_button = QtWidgets.QPushButton(self.installed_tab) self.check_updates_button.setEnabled(True) self.check_updates_button.setGeometry(QtCore.QRect(595, 575, 275, 50)) self.check_updates_button.setMinimumSize(QtCore.QSize(0, 50)) - self.check_updates_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.check_updates_button.setStyleSheet(styles.button) self.check_updates_button.setObjectName("check_updates_button") self.installed_table = QtWidgets.QTableWidget(self.installed_tab) self.installed_table.setGeometry(QtCore.QRect(0, 10, 871, 571)) @@ -867,24 +510,7 @@ class Ui_LoginWindow(object): self.login_button.setEnabled(True) self.login_button.setGeometry(QtCore.QRect(70, 140, 151, 50)) self.login_button.setMinimumSize(QtCore.QSize(0, 50)) - self.login_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.login_button.setStyleSheet(styles.button) self.login_button.setObjectName("login_button") self.email_box = QtWidgets.QLineEdit(self.centralwidget) self.email_box.setGeometry(QtCore.QRect(20, 20, 251, 51)) @@ -1022,24 +648,7 @@ class Ui_PackageWindow(object): self.update_button.setEnabled(True) self.update_button.setGeometry(QtCore.QRect(20, 360, 291, 50)) self.update_button.setMinimumSize(QtCore.QSize(0, 50)) - self.update_button.setStyleSheet("QPushButton {\n" - " color: rgb(204, 204, 204);\n" - " border-width: 1px;\n" - " border-radius:6px;\n" - " border-style: solid;\n" - " background-color: rgb(28, 30, 33);\n" - " border-color: rgb(66, 143, 225);\n" - "}\n" - "QPushButton:hover{\n" - " border-width: 2px;\n" - "}\n" - "QPushButton:pressed{\n" - " background-color: rgb(50, 60, 63);\n" - "}\n" - "QPushButton:disabled{\n" - " border-width: 0px;\n" - " background-color: rgb(92, 99, 109);\n" - "}") + self.update_button.setStyleSheet(styles.button) self.update_button.setObjectName("update_button") MainWindow.setCentralWidget(self.centralwidget) diff --git a/modules/gui_manager.py b/modules/gui_manager.py index 87849c0..bf58653 100644 --- a/modules/gui_manager.py +++ b/modules/gui_manager.py @@ -13,6 +13,11 @@ from PyQt5 import QtGui from urllib.parse import unquote +def log(message): + download_ui.logs_box.append(message) + download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + + def install(package): r = request.get(f"{horsy_vars.protocol}{horsy_vars.server_url}/packages/json/{package}") r_code = handle(r.status_code) @@ -25,7 +30,7 @@ def install(package): try: UiDownloadWindow.show() download_ui.logs_box.clear() - download_ui.logs_box.append(f"Downloading {unquote(r['url'].split('/')[-1])}") + log(f"Downloading {unquote(r['url'].split('/')[-1])}") def install_this(): if not os.path.exists('{1}apps/{0}'.format(r['name'], horsy_vars.horsypath)): @@ -43,15 +48,13 @@ def install(package): if chunk: percent += 1 f.write(chunk) - download_ui.logs_box.append("") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log("") threads = list() threads.append(threading.Thread(target=dl_main_file)) if r['download']: - download_ui.logs_box.append(f"Downloading {unquote(r['download'].split('/')[-1])}") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log(f"Downloading {unquote(r['download'].split('/')[-1])}") def dl_dep_file(): global success @@ -62,9 +65,8 @@ def install(package): for chunk in file_r.iter_content(chunk_size=chunk_size): if chunk: f.write(chunk) - download_ui.logs_box.append("") - download_ui.logs_box.append(f"Starting virustotal scan for dependency") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log("") + log(f"Starting virustotal scan for dependency") threads.append(threading.Thread(target=dl_dep_file)) @@ -77,82 +79,79 @@ def install(package): def unzip(file, where): with zipfile.ZipFile(file, 'r') as zip_ref: zip_ref.extractall(where) - download_ui.logs_box.append(f"Extracted") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log(f"Extracted") if r['url'].split('.')[-1] == 'zip': - download_ui.logs_box.append(f"Extracting {unquote(r['url'].split('/')[-1])}") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log(f"Extracting {unquote(r['url'].split('/')[-1])}") + unzip('{2}apps/{0}/{1}'.format(r['name'], unquote(r['url'].split('/')[-1]), horsy_vars.horsypath), '{1}apps/{0}'.format(r['name'], horsy_vars.horsypath)) - download_ui.logs_box.append("") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log("") if not get_key(): - download_ui.logs_box.append("Virustotal api key not found \n" - "You can add it by entering horsy --vt [key] in terminal") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log("Virustotal api key not found \n" + "You can add it by entering horsy --vt [key] in terminal") + else: try: - download_ui.logs_box.append("If you want to disable scan, type horsy --vt disable in terminal") - download_ui.logs_box.append("Starting virustotal scan for program") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log("If you want to disable scan, type horsy --vt disable in terminal") + log("Starting virustotal scan for program") + scan_file('{2}apps/{0}/{1}'.format(r['name'], unquote(r['url'].split('/')[-1]), horsy_vars.horsypath)) analysis = get_report('{2}apps/{0}/{1}'.format(r['name'], unquote(r['url'].split('/')[-1]), horsy_vars.horsypath)) - download_ui.logs_box.append(f"Scan finished for program \nYou can see report for program by " - f"opening: " - f"{analysis['link']} \n" - f"{analysis['detect']['malicious']} antivirus flagged this file as " - f"malicious") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log(f"Scan finished for program \nYou can see report for program by " + f"opening: " + f"{analysis['link']} \n" + f"{analysis['detect']['malicious']} antivirus flagged this file as " + f"malicious") + except: pass if r['download']: try: - download_ui.logs_box.append("") - download_ui.logs_box.append("Starting virustotal scan for dependency") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log("") + log("Starting virustotal scan for dependency") + scan_file('{2}apps/{0}/{1}'.format(r['name'], unquote(r['download'].split('/')[-1]), horsy_vars.horsypath)) - download_ui.logs_box.append(f"Scan finished for dependency") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log(f"Scan finished for dependency") + analysis = get_report('{2}apps/{0}/{1}'.format(r['name'], unquote(r['download'].split('/')[-1]), horsy_vars.horsypath)) - download_ui.logs_box.append(f"You can see report for dependency by opening: {analysis['link']}") - download_ui.logs_box.append(f"{analysis['detect']['malicious']} " - f"antivirus flagged this file as malicious") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log(f"You can see report for dependency by opening: {analysis['link']}") + log(f"{analysis['detect']['malicious']} " + f"antivirus flagged this file as malicious") + if analysis['detect']['malicious'] > 0: - download_ui.logs_box.append("") - download_ui.logs_box.append(f"SECURITY WARNING, APP INSTALLATION STOPPED") - download_ui.logs_box.append(f"Dependency can be malicious. " - f"It may run now, if this added to installation config") - download_ui.logs_box.append(f"You can disable VT check with horsy --vt disable \n" - f"or use horsy CLI to force install") - download_ui.logs_box.append("") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log("") + log(f"SECURITY WARNING, APP INSTALLATION STOPPED") + log(f"Dependency can be malicious. " + f"It may run now, if this added to installation config") + log(f"You can disable VT check with horsy --vt disable \n" + f"or use horsy CLI to force install") + log("") + except: pass if r['url'].split('.')[-1] == 'zip': os.remove('{2}apps/{0}/{1}'.format(r['name'], r['url'].split('/')[-1], horsy_vars.horsypath)) - download_ui.logs_box.append("") - download_ui.logs_box.append("Generating launch script") + log("") + log("Generating launch script") with open('{1}apps/{0}.bat'.format(r['name'], horsy_vars.horsypath), 'w') as f: f.write(f"@ECHO off\n") f.write(f"""{r['run'].replace('$appdir$', f'%horsypath%/apps/{r["name"]}')} %*\n""") - download_ui.logs_box.append("") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log("") if r['install']: - download_ui.logs_box.append(f"Found install option, launching {r['install']}") - download_ui.logs_box.append("") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log(f"Found install option, launching {r['install']}") + log("") + threading.Thread(target=os.system, args=('{2}apps/{0}/{1}'.format(r['name'], r['install'], horsy_vars.horsypath),)).start() @@ -163,8 +162,7 @@ def install(package): versions[r['name']] = r['version'] f.write(json.dumps(versions)) - download_ui.logs_box.append(f"All done!\nYou can run your app by entering {r['name']} in terminal") - download_ui.logs_box.moveCursor(QtGui.QTextCursor.End) + log(f"All done!\nYou can run your app by entering {r['name']} in terminal") threading.Thread(target=install_this).start() diff --git a/modules/manager.py b/modules/manager.py index f63e0ff..03a3503 100644 --- a/modules/manager.py +++ b/modules/manager.py @@ -11,6 +11,11 @@ from ezzdl import dl def install(package): + """ + Install an app + :param package: + :return: + """ r = request.get(f"{horsy_vars.protocol}{horsy_vars.server_url}/packages/json/{package}") r_code = handle(r.status_code) r = r.text @@ -99,6 +104,11 @@ def install(package): def uninstall(package): + """ + Uninstall package + :param package: + :return: + """ if os.path.exists('{1}apps/{0}'.format(package, horsy_vars.horsypath)): os.system('rmdir /s /q "{1}apps/{0}"'.format(package, horsy_vars.horsypath)) print(f"[green][OK] Files deleted[/]") @@ -112,6 +122,11 @@ def uninstall(package): def apps_list(is_gui=False): + """ + List all installed apps + :param is_gui: + :return: + """ apps = list() if os.path.exists('{0}apps'.format(horsy_vars.horsypath)): if not is_gui: diff --git a/modules/styles.py b/modules/styles.py new file mode 100644 index 0000000..d9f8ffa --- /dev/null +++ b/modules/styles.py @@ -0,0 +1,79 @@ +centralwidget = """ +QWidget { + background-color: rgb(30, 30, 30); +} + +QScrollBar:vertical { + border: none; + background: rgb(30, 30, 30); + width: 10px; + margin: 15px 0 15px 0; + border-radius: 0px; +} + +QScrollBar::handle:vertical { + background-color: rgb(139, 139, 139); + min-height: 30px; + border-radius: 5px; +} + +QScrollBar::handle:vertical:hover, +QScrollBar::handle:vertical:pressed { + background-color: rgb(149, 149, 149); +} + +QScrollBar::sub-line:vertical, +QScrollBar::add-line:vertical, +QScrollBar::up-arrow:vertical, +QScrollBar::down-arrow:vertical { + height: 0px; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical, +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical{ + background: none; +} +""" + +tabwidget = """ +QTabBar::tab { + background: rgb(22, 22, 22); + color: white; + font: 12pt \"MS Shell Dlg 2\"; + width: 150px; + height: 21px; + padding: 13px; +} +QTabBar::tab:selected { + color: rgb(166, 184, 200); + background: rgb(45, 45, 45); +} +QTabBar::tab:hover { + color: rgb(166, 184, 200); + background: rgb(29, 29, 29); +} +QTabBar { + margin-top: 5px; +} +""" + +button = """ +QPushButton { + color: rgb(204, 204, 204); + border-width: 1px; + border-radius:6px; + border-style: solid; + background-color: rgb(28, 30, 33); + border-color: rgb(66, 143, 225); +} +QPushButton:hover { + border-width: 2px; +} +QPushButton:pressed { + background-color: rgb(50, 60, 63); +} +QPushButton:disabled { + border-width: 0px; + background-color: rgb(92, 99, 109); +} +"""