From b0bfcccf03b55ce9fff7acfa85cf747ddf454e59 Mon Sep 17 00:00:00 2001 From: BarsTiger Date: Fri, 4 Feb 2022 22:26:14 +0200 Subject: [PATCH] Package editing --- horsygui.py | 46 ++++++++- modules/gui.py | 140 +++++++++++++++++++++++--- modules/manager.py | 4 +- modules/package_edit.py | 69 +++++++++++++ uis/horsy_main.ui | 22 +---- uis/horsy_package.py | 123 +++++++++++++++++++++++ uis/horsy_package.ui | 214 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 585 insertions(+), 33 deletions(-) create mode 100644 modules/package_edit.py create mode 100644 uis/horsy_package.py create mode 100644 uis/horsy_package.ui diff --git a/horsygui.py b/horsygui.py index 871e55f..bbe2e2b 100644 --- a/horsygui.py +++ b/horsygui.py @@ -1,7 +1,8 @@ import os -import subprocess import sys import math +import threading +import time import webbrowser import modules.vars as horsy_vars from PyQt5 import QtWidgets @@ -29,6 +30,10 @@ UiDownloadWindow = QtWidgets.QMainWindow() download_ui = gui.Ui_DownloadWindow() download_ui.setupUi(UiDownloadWindow) +UiPackageWindow = QtWidgets.QMainWindow() +package_ui = gui.Ui_PackageWindow() +package_ui.setupUi(UiPackageWindow) + if __name__ == "__main__": UiMainWindow.show() from modules.login import loginload @@ -177,6 +182,43 @@ def login_logout_gui(): ui.username_box.setText(login()) +def get_users_apps(): + def get_threaded(): + apps = requests.get(f"{horsy_vars.protocol}{horsy_vars.server_url}/users/public" + f"/{ui.username_box.text()}").json() + try: + if apps['message'] == 'Too many requests': + while apps['message'] == 'Too many requests': + time.sleep(0.5) + apps = requests.get(f"{horsy_vars.protocol}{horsy_vars.server_url}/users/public" + f"/{ui.username_box.text()}").json() + except: + pass + try: + apps = apps['packages'] + ui.manage_packages_table.clear() + ui.manage_packages_table.setColumnCount(4) + ui.manage_packages_table.setRowCount(math.ceil(len(apps) / 4)) + for i in range(len(apps)): + ui.manage_packages_table.setItem(i // 4, i % 4, QtWidgets.QTableWidgetItem(str(apps[i]))) + except: + pass + threading.Thread(target=get_threaded).start() + + +def gui_package_edit(): + from modules.package_edit import edit + try: + app_name = ui.manage_packages_table.currentItem().text() + if app_name == "": + return + else: + UiPackageWindow.show() + edit(app_name, UiPackageWindow) + except: + return + + # Run functions on startup if __name__ == "__main__": # Checking version @@ -201,6 +243,7 @@ if __name__ == "__main__": os.system('horsy_updater.exe horsygui') sys.exit() + get_users_apps() installed_apps() # Binds @@ -220,6 +263,7 @@ if __name__ == "__main__": ui.changepass_button.clicked.connect(change_password_gui) ui.changeemail_button.clicked.connect(change_email_gui) ui.loginlogout_button.clicked.connect(login_logout_gui) + ui.manage_packages_table.itemDoubleClicked.connect(gui_package_edit) # Handle GUI exiting to exit whole program sys.exit(app.exec_()) diff --git a/modules/gui.py b/modules/gui.py index 05592c5..4436648 100644 --- a/modules/gui.py +++ b/modules/gui.py @@ -93,22 +93,22 @@ class Ui_MainWindow(object): "border-radius: 5px; \n" "color: rgb(242, 242, 242);\n" "padding: 0px 5px 0px 5px;\n") - self.username_box.setText("") + self.username_box.setText("Log in first") self.username_box.setReadOnly(True) self.username_box.setObjectName("username_box") self.regmessage_box = QtWidgets.QLineEdit(self.account_tab) self.regmessage_box.setGeometry(QtCore.QRect(720, 110, 151, 31)) self.regmessage_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" - "border-radius: 5px; \n" - "color: rgb(27, 166, 221);") + "border-radius: 5px; \n" + "color: rgb(27, 166, 221);") self.regmessage_box.setText(" Still not registered? Click here") self.regmessage_box.setReadOnly(True) self.regmessage_box.setObjectName("regmessage_box") self.regmessage_button = QtWidgets.QPushButton(self.account_tab) self.regmessage_button.setGeometry(QtCore.QRect(720, 110, 151, 31)) self.regmessage_button.setStyleSheet("background-color: rgb(0, 0, 0, 0);\n" - "border-color: rgb(0, 0, 0, 0);\n" - "color: rgb(0, 0, 0, 0);") + "border-color: rgb(0, 0, 0, 0);\n" + "color: rgb(0, 0, 0, 0);") self.regmessage_button.setText("") self.regmessage_button.setObjectName("regmessage_button") self.changeemail_button = QtWidgets.QPushButton(self.account_tab) @@ -202,13 +202,13 @@ class Ui_MainWindow(object): self.manage_packages_table = QtWidgets.QTableWidget(self.account_tab) self.manage_packages_table.setGeometry(QtCore.QRect(10, 240, 871, 411)) self.manage_packages_table.setStyleSheet("QTableWidget\n" - "{\n" - "color: white;\n" - "font: 15pt \"MS Shell Dlg 2\";\n" - "margin: 20px;\n" - "border-radius: 45px;\n" - "}\n" - "") + "{\n" + "color: white;\n" + "font: 15pt \"MS Shell Dlg 2\";\n" + "margin: 20px;\n" + "border-radius: 45px;\n" + "}\n" + "") self.manage_packages_table.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored) self.manage_packages_table.setAutoScroll(False) self.manage_packages_table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) @@ -217,7 +217,7 @@ class Ui_MainWindow(object): self.manage_packages_table.setDragDropOverwriteMode(False) self.manage_packages_table.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) self.manage_packages_table.setShowGrid(False) - self.manage_packages_table.setObjectName("manage_packages_table") + self.manage_packages_table.setObjectName("installed_table") self.manage_packages_table.horizontalHeader().setVisible(False) self.manage_packages_table.horizontalHeader().setDefaultSectionSize(203) self.manage_packages_table.horizontalHeader().setHighlightSections(False) @@ -225,6 +225,10 @@ class Ui_MainWindow(object): self.manage_packages_table.verticalHeader().setVisible(False) self.manage_packages_table.verticalHeader().setDefaultSectionSize(120) self.manage_packages_table.verticalHeader().setHighlightSections(False) + self.manage_packages_table.setLayoutDirection(QtCore.Qt.LeftToRight) + self.manage_packages_table.setColumnCount(0) + self.manage_packages_table.setRowCount(0) + self.manage_packages_table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.manage_packages_message = QtWidgets.QTextBrowser(self.account_tab) self.manage_packages_message.setGeometry(QtCore.QRect(380, 230, 121, 21)) self.manage_packages_message.setStyleSheet("color: white;\n" @@ -803,6 +807,116 @@ class Ui_DownloadWindow(object): self.logs_box.setPlaceholderText(_translate("MainWindow", "Logs")) +class Ui_PackageWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(331, 433) + MainWindow.setMinimumSize(QtCore.QSize(331, 433)) + MainWindow.setMaximumSize(QtCore.QSize(331, 433)) + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setStyleSheet("QWidget{\n" + " background-color: rgb(30, 30, 30);\n" + "}\n" + "") + self.centralwidget.setObjectName("centralwidget") + self.packagename_box = QtWidgets.QLineEdit(self.centralwidget) + self.packagename_box.setGeometry(QtCore.QRect(20, 20, 151, 31)) + self.packagename_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" + "border-radius: 5px; \n" + "color: rgb(242, 242, 242);") + self.packagename_box.setText("") + self.packagename_box.setReadOnly(True) + self.packagename_box.setObjectName("packagename_box") + self.main_exe_box = QtWidgets.QLineEdit(self.centralwidget) + self.main_exe_box.setGeometry(QtCore.QRect(20, 305, 291, 31)) + self.main_exe_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" + "border-radius: 5px; \n" + "color: rgb(242, 242, 242);") + self.main_exe_box.setObjectName("main_exe_box") + self.source_url_box = QtWidgets.QLineEdit(self.centralwidget) + self.source_url_box.setGeometry(QtCore.QRect(20, 200, 291, 31)) + self.source_url_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" + "border-radius: 5px; \n" + "color: rgb(242, 242, 242);") + self.source_url_box.setObjectName("source_url_box") + self.url_of_exe_box = QtWidgets.QLineEdit(self.centralwidget) + self.url_of_exe_box.setGeometry(QtCore.QRect(20, 165, 291, 31)) + self.url_of_exe_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" + "border-radius: 5px; \n" + "color: rgb(242, 242, 242);") + self.url_of_exe_box.setObjectName("url_of_exe_box") + self.dependency_url_box = QtWidgets.QLineEdit(self.centralwidget) + self.dependency_url_box.setGeometry(QtCore.QRect(20, 235, 291, 31)) + self.dependency_url_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" + "border-radius: 5px; \n" + "color: rgb(242, 242, 242);") + self.dependency_url_box.setObjectName("dependency_url_box") + self.dependency_run_box = QtWidgets.QLineEdit(self.centralwidget) + self.dependency_run_box.setGeometry(QtCore.QRect(20, 270, 291, 31)) + self.dependency_run_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" + "border-radius: 5px; \n" + "color: rgb(242, 242, 242);") + self.dependency_run_box.setObjectName("dependency_run_box") + self.package_desc_box = QtWidgets.QTextBrowser(self.centralwidget) + self.package_desc_box.setGeometry(QtCore.QRect(20, 60, 256, 101)) + self.package_desc_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" + "border-radius: 5px; \n" + "color: rgb(242, 242, 242);") + self.package_desc_box.setAcceptRichText(False) + self.package_desc_box.setTextInteractionFlags( + QtCore.Qt.LinksAccessibleByKeyboard | QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextBrowserInteraction | QtCore.Qt.TextEditable | QtCore.Qt.TextEditorInteraction | QtCore.Qt.TextSelectableByKeyboard | QtCore.Qt.TextSelectableByMouse) + self.package_desc_box.setObjectName("package_desc_box") + self.update_button = QtWidgets.QPushButton(self.centralwidget) + 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.setObjectName("update_button") + MainWindow.setCentralWidget(self.centralwidget) + + self.retranslateUi(MainWindow) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "horsy - editing package")) + self.packagename_box.setPlaceholderText(_translate("MainWindow", "Editing package")) + self.main_exe_box.setPlaceholderText( + _translate("MainWindow", "Main executable command (file.exe, python main.py, etc)")) + self.source_url_box.setPlaceholderText( + _translate("MainWindow", "Url of source (project on GitHub, source archive)")) + self.url_of_exe_box.setPlaceholderText(_translate("MainWindow", "Url of executable (ends on .exe or .zip)")) + self.dependency_url_box.setPlaceholderText(_translate("MainWindow", "Dependency URL (installer in .exe)")) + self.dependency_run_box.setPlaceholderText( + _translate("MainWindow", "Dependency run (run this during installation)")) + self.package_desc_box.setHtml(_translate("MainWindow", + "\n" + "\n" + "


")) + self.package_desc_box.setPlaceholderText( + _translate("MainWindow", "Package description. It should be a short text under 256 characters")) + self.update_button.setText(_translate("MainWindow", "Update")) + + def popup(title, text): QtWidgets.QMessageBox.information(None, title, text) diff --git a/modules/manager.py b/modules/manager.py index da12cd9..fff5d17 100644 --- a/modules/manager.py +++ b/modules/manager.py @@ -9,7 +9,7 @@ import zipfile from modules.virustotal import get_key, scan_file, get_report -def install(package, is_gui=False, UiDownloadWindow=None, ui_download=None): +def install(package): r = requests.get(f"{horsy_vars.protocol}{horsy_vars.server_url}/packages/json/{package}").text if r == "": print(f"[red]Package {package} not found[/]") @@ -127,7 +127,7 @@ def install(package, is_gui=False, UiDownloadWindow=None, ui_download=None): return -def uninstall(package, is_gui=False): +def uninstall(package): 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[/]") diff --git a/modules/package_edit.py b/modules/package_edit.py new file mode 100644 index 0000000..1138f4e --- /dev/null +++ b/modules/package_edit.py @@ -0,0 +1,69 @@ +import time +from modules.auth import get_auth +from horsygui import login_ui, UiLoginWindow as Ui_LoginWindow +import modules.gui as gui +import requests +from PyQt5 import QtWidgets +import modules.vars as horsy_vars +import json + + +def edit(package, UiPackageWindow): + package_ui = gui.Ui_PackageWindow() + package_ui.setupUi(UiPackageWindow) + + r = requests.get(f"{horsy_vars.protocol}{horsy_vars.server_url}/packages/json/{package}").text + if r == "": + gui.cpopup("Installation", f"Package {package} not found") + return f"Package {package} not found" + try: + r = json.loads(r) + except: + print("[red]Error with unsupported message[/]") + gui.cpopup("Error", "Error with unsupported message") + return "Error with unsupported message" + try: + if r["message"] == "Internal server error": + print("Internal server error") + gui.cpopup("Error", "Internal server error") + return "Internal server error" + if r["message"] == "Too many requests": + try: + if r['message'] == 'Too many requests': + while r['message'] == 'Too many requests': + time.sleep(0.5) + r = requests.get(f"{horsy_vars.protocol}{horsy_vars.server_url}/packages/json/{package}").text + try: + r = json.loads(r) + except: + pass + except: + pass + except: + pass + + package_ui.packagename_box.setText("Editing package " + r["name"]) + package_ui.package_desc_box.setText(r["description"]) + package_ui.url_of_exe_box.setText(r["url"]) + package_ui.source_url_box.setText(r["sourceUrl"]) + package_ui.dependency_url_box.setText(r["download"]) + package_ui.dependency_run_box.setText(r["install"]) + package_ui.main_exe_box.setText(r["run"]) + + UiPackageWindow.show() + + def send(): + body = { + 'auth': get_auth(True, login_ui, Ui_LoginWindow), + 'name': package, + 'description': (lambda x: x if x != '' else None)(package_ui.package_desc_box.toPlainText()), + 'url': (lambda x: x if x != '' else None)(package_ui.url_of_exe_box.text()), + 'sourceUrl': (lambda x: x if x != '' else None)(package_ui.source_url_box.text()), + 'download': (lambda x: x if x != '' else None)(package_ui.dependency_url_box.text()), + 'install': (lambda x: x if x != '' else None)(package_ui.dependency_run_box.text()), + 'run': (lambda x: x if x != '' else None)(package_ui.main_exe_box.text()) + } + + r = requests.put(f"{horsy_vars.protocol}{horsy_vars.server_url}/packages", json=body).text # TODO: add error handling + + package_ui.update_button.clicked.connect(send) diff --git a/uis/horsy_main.ui b/uis/horsy_main.ui index 0b4b014..d010df2 100644 --- a/uis/horsy_main.ui +++ b/uis/horsy_main.ui @@ -385,6 +385,9 @@ QPushButton:disabled{ 411 + + Qt::LeftToRight + QTableWidget { @@ -423,10 +426,10 @@ border-radius: 45px; true - 1 + 0 - 4 + 0 false @@ -449,21 +452,6 @@ border-radius: 45px; false - - - - - - - - - - - - - - - diff --git a/uis/horsy_package.py b/uis/horsy_package.py new file mode 100644 index 0000000..2010824 --- /dev/null +++ b/uis/horsy_package.py @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'D:\RAZNOE\prgrming\horsy\Source\client\uis\horsy_package.ui' +# +# Created by: PyQt5 UI code generator 5.15.6 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(331, 433) + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setStyleSheet("QWidget{\n" +" background-color: rgb(30, 30, 30);\n" +"}\n" +"") + self.centralwidget.setObjectName("centralwidget") + self.packagename_box = QtWidgets.QLineEdit(self.centralwidget) + self.packagename_box.setGeometry(QtCore.QRect(20, 20, 151, 31)) + self.packagename_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" +"border-radius: 5px; \n" +"color: rgb(242, 242, 242);") + self.packagename_box.setText("") + self.packagename_box.setReadOnly(True) + self.packagename_box.setObjectName("packagename_box") + self.main_exe_box = QtWidgets.QLineEdit(self.centralwidget) + self.main_exe_box.setGeometry(QtCore.QRect(20, 305, 291, 31)) + self.main_exe_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" +"border-radius: 5px; \n" +"color: rgb(242, 242, 242);") + self.main_exe_box.setObjectName("main_exe_box") + self.source_url_box = QtWidgets.QLineEdit(self.centralwidget) + self.source_url_box.setGeometry(QtCore.QRect(20, 200, 291, 31)) + self.source_url_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" +"border-radius: 5px; \n" +"color: rgb(242, 242, 242);") + self.source_url_box.setObjectName("source_url_box") + self.url_of_exe_box = QtWidgets.QLineEdit(self.centralwidget) + self.url_of_exe_box.setGeometry(QtCore.QRect(20, 165, 291, 31)) + self.url_of_exe_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" +"border-radius: 5px; \n" +"color: rgb(242, 242, 242);") + self.url_of_exe_box.setObjectName("url_of_exe_box") + self.dependency_url_box = QtWidgets.QLineEdit(self.centralwidget) + self.dependency_url_box.setGeometry(QtCore.QRect(20, 235, 291, 31)) + self.dependency_url_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" +"border-radius: 5px; \n" +"color: rgb(242, 242, 242);") + self.dependency_url_box.setObjectName("dependency_url_box") + self.dependency_run_box = QtWidgets.QLineEdit(self.centralwidget) + self.dependency_run_box.setGeometry(QtCore.QRect(20, 270, 291, 31)) + self.dependency_run_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" +"border-radius: 5px; \n" +"color: rgb(242, 242, 242);") + self.dependency_run_box.setObjectName("dependency_run_box") + self.package_desc_box = QtWidgets.QTextBrowser(self.centralwidget) + self.package_desc_box.setGeometry(QtCore.QRect(20, 60, 256, 101)) + self.package_desc_box.setStyleSheet("background-color: rgb(74, 76, 83);\n" +"border-radius: 5px; \n" +"color: rgb(242, 242, 242);") + self.package_desc_box.setAcceptRichText(False) + self.package_desc_box.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByKeyboard|QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextBrowserInteraction|QtCore.Qt.TextEditable|QtCore.Qt.TextEditorInteraction|QtCore.Qt.TextSelectableByKeyboard|QtCore.Qt.TextSelectableByMouse) + self.package_desc_box.setObjectName("package_desc_box") + self.update_button = QtWidgets.QPushButton(self.centralwidget) + 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.setObjectName("update_button") + MainWindow.setCentralWidget(self.centralwidget) + + self.retranslateUi(MainWindow) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "horsy - editing package")) + self.packagename_box.setPlaceholderText(_translate("MainWindow", "Editing package")) + self.main_exe_box.setPlaceholderText(_translate("MainWindow", "Main executable command (file.exe, python main.py, etc)")) + self.source_url_box.setPlaceholderText(_translate("MainWindow", "Url of source (project on GitHub, source archive)")) + self.url_of_exe_box.setPlaceholderText(_translate("MainWindow", "Url of executable (ends on .exe or .zip)")) + self.dependency_url_box.setPlaceholderText(_translate("MainWindow", "Dependency URL (installer in .exe)")) + self.dependency_run_box.setPlaceholderText(_translate("MainWindow", "Dependency run (run this during installation)")) + self.package_desc_box.setHtml(_translate("MainWindow", "\n" +"\n" +"


")) + self.package_desc_box.setPlaceholderText(_translate("MainWindow", "Package description. It should be a short text under 256 characters")) + self.update_button.setText(_translate("MainWindow", "Update")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + MainWindow = QtWidgets.QMainWindow() + ui = Ui_MainWindow() + ui.setupUi(MainWindow) + MainWindow.show() + sys.exit(app.exec_()) diff --git a/uis/horsy_package.ui b/uis/horsy_package.ui new file mode 100644 index 0000000..c7a9b4c --- /dev/null +++ b/uis/horsy_package.ui @@ -0,0 +1,214 @@ + + + MainWindow + + + + 0 + 0 + 331 + 433 + + + + horsy - editing package + + + + QWidget{ + background-color: rgb(30, 30, 30); +} + + + + + + 20 + 20 + 151 + 31 + + + + background-color: rgb(74, 76, 83); +border-radius: 5px; +color: rgb(242, 242, 242); + + + + + + true + + + Editing package + + + + + + 20 + 305 + 291 + 31 + + + + background-color: rgb(74, 76, 83); +border-radius: 5px; +color: rgb(242, 242, 242); + + + Main executable command (file.exe, python main.py, etc) + + + + + + 20 + 200 + 291 + 31 + + + + background-color: rgb(74, 76, 83); +border-radius: 5px; +color: rgb(242, 242, 242); + + + Url of source (project on GitHub, source archive) + + + + + + 20 + 165 + 291 + 31 + + + + background-color: rgb(74, 76, 83); +border-radius: 5px; +color: rgb(242, 242, 242); + + + Url of executable (ends on .exe or .zip) + + + + + + 20 + 235 + 291 + 31 + + + + background-color: rgb(74, 76, 83); +border-radius: 5px; +color: rgb(242, 242, 242); + + + Dependency URL (installer in .exe) + + + + + + 20 + 270 + 291 + 31 + + + + background-color: rgb(74, 76, 83); +border-radius: 5px; +color: rgb(242, 242, 242); + + + Dependency run (run this during installation) + + + + + + 20 + 60 + 256 + 101 + + + + background-color: rgb(74, 76, 83); +border-radius: 5px; +color: rgb(242, 242, 242); + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + false + + + Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextEditable|Qt::TextEditorInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + Package description. It should be a short text under 256 characters + + + + + true + + + + 20 + 360 + 291 + 50 + + + + + 0 + 50 + + + + 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); +} + + + Update + + + + + + +