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
+
+
+
+
+
+
+