Updated scrollbars and added comments

This commit is contained in:
BarsTiger
2022-05-11 16:29:25 +03:00
parent 712ecbd993
commit 360b10215a
6 changed files with 242 additions and 463 deletions

View File

@@ -1,3 +1,4 @@
# Legacy, only if normal update method is not working
import argparse
import urllib.request
import threading

View File

@@ -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()

View File

@@ -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)

View File

@@ -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()

View File

@@ -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:

79
modules/styles.py Normal file
View File

@@ -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);
}
"""