diff --git a/example/drawhorse/.vs/drawhorse/v16/.suo b/example/drawhorse/.vs/drawhorse/v16/.suo
new file mode 100644
index 0000000..e495d42
Binary files /dev/null and b/example/drawhorse/.vs/drawhorse/v16/.suo differ
diff --git a/example/drawhorse/drawhorse.sln b/example/drawhorse/drawhorse.sln
new file mode 100644
index 0000000..48af12c
--- /dev/null
+++ b/example/drawhorse/drawhorse.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.32002.261
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "drawhorse", "drawhorse\drawhorse.csproj", "{2A403205-DE3C-4836-8789-F1F760843BD2}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {2A403205-DE3C-4836-8789-F1F760843BD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2A403205-DE3C-4836-8789-F1F760843BD2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2A403205-DE3C-4836-8789-F1F760843BD2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2A403205-DE3C-4836-8789-F1F760843BD2}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {A1A6C8FE-5C85-4A46-AD4C-F3AE21463330}
+ EndGlobalSection
+EndGlobal
diff --git a/example/drawhorse/drawhorse/App.config b/example/drawhorse/drawhorse/App.config
new file mode 100644
index 0000000..56efbc7
--- /dev/null
+++ b/example/drawhorse/drawhorse/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/example/drawhorse/drawhorse/Program.cs b/example/drawhorse/drawhorse/Program.cs
new file mode 100644
index 0000000..f0ac624
--- /dev/null
+++ b/example/drawhorse/drawhorse/Program.cs
@@ -0,0 +1,32 @@
+using System;
+
+namespace drawhorse
+{
+ class Program
+ {
+ static void Main(string[] args)
+ {
+ Console.WriteLine(@"Sample app with <3 from horsy
+ |\ /|
+ ___| \,,/_/
+ ---__/ \/ \
+ __--/ (D) \
+ _ -/ (_ \
+ // / \_ / -\
+ __-------_____--___--/ / \_ O o)
+ / / \__/
+ / /
+|| ) \_/\
+|| / _ / |
+| | /--______ ___\ /\ :
+| / __- - _/ ------ | | \ \
+ | - - / | | \ )
+ | | - | | ) | |
+ | | | | | | | |
+ | | < | | | |_/
+ < | /__\ < \
+ /__\ /___\");
+ Console.ReadLine();
+ }
+ }
+}
diff --git a/example/drawhorse/drawhorse/Properties/AssemblyInfo.cs b/example/drawhorse/drawhorse/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..503b4e1
--- /dev/null
+++ b/example/drawhorse/drawhorse/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// Общие сведения об этой сборке предоставляются следующим набором
+// набора атрибутов. Измените значения этих атрибутов для изменения сведений,
+// связанные с этой сборкой.
+[assembly: AssemblyTitle("drawhorse")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("drawhorse")]
+[assembly: AssemblyCopyright("Copyright © 2022")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
+// для компонентов COM. Если необходимо обратиться к типу в этой сборке через
+// из модели COM задайте для атрибута ComVisible этого типа значение true.
+[assembly: ComVisible(false)]
+
+// Следующий GUID представляет идентификатор typelib, если этот проект доступен из модели COM
+[assembly: Guid("2a403205-de3c-4836-8789-f1f760843bd2")]
+
+// Сведения о версии сборки состоят из указанных ниже четырех значений:
+//
+// Основной номер версии
+// Дополнительный номер версии
+// Номер сборки
+// Номер редакции
+//
+// Можно задать все значения или принять номера сборки и редакции по умолчанию
+// используя "*", как показано ниже:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/example/drawhorse/drawhorse/bin/Debug/drawhorse.exe b/example/drawhorse/drawhorse/bin/Debug/drawhorse.exe
new file mode 100644
index 0000000..4b41084
Binary files /dev/null and b/example/drawhorse/drawhorse/bin/Debug/drawhorse.exe differ
diff --git a/example/drawhorse/drawhorse/bin/Debug/drawhorse.exe.config b/example/drawhorse/drawhorse/bin/Debug/drawhorse.exe.config
new file mode 100644
index 0000000..56efbc7
--- /dev/null
+++ b/example/drawhorse/drawhorse/bin/Debug/drawhorse.exe.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/example/drawhorse/drawhorse/bin/Debug/drawhorse.pdb b/example/drawhorse/drawhorse/bin/Debug/drawhorse.pdb
new file mode 100644
index 0000000..ba2badd
Binary files /dev/null and b/example/drawhorse/drawhorse/bin/Debug/drawhorse.pdb differ
diff --git a/example/drawhorse/drawhorse/drawhorse.csproj b/example/drawhorse/drawhorse/drawhorse.csproj
new file mode 100644
index 0000000..fcf0ec8
--- /dev/null
+++ b/example/drawhorse/drawhorse/drawhorse.csproj
@@ -0,0 +1,53 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {2A403205-DE3C-4836-8789-F1F760843BD2}
+ Exe
+ drawhorse
+ drawhorse
+ v4.7.2
+ 512
+ true
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/example/drawhorse/drawhorse/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs b/example/drawhorse/drawhorse/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs
new file mode 100644
index 0000000..3871b18
--- /dev/null
+++ b/example/drawhorse/drawhorse/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
diff --git a/example/drawhorse/drawhorse/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/example/drawhorse/drawhorse/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..300b7c6
Binary files /dev/null and b/example/drawhorse/drawhorse/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/example/drawhorse/drawhorse/obj/Debug/drawhorse.csproj.AssemblyReference.cache b/example/drawhorse/drawhorse/obj/Debug/drawhorse.csproj.AssemblyReference.cache
new file mode 100644
index 0000000..f5e894a
Binary files /dev/null and b/example/drawhorse/drawhorse/obj/Debug/drawhorse.csproj.AssemblyReference.cache differ
diff --git a/example/drawhorse/drawhorse/obj/Debug/drawhorse.csproj.CoreCompileInputs.cache b/example/drawhorse/drawhorse/obj/Debug/drawhorse.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..ee191d7
--- /dev/null
+++ b/example/drawhorse/drawhorse/obj/Debug/drawhorse.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+7f4b213b428f4c013f19137338418ee1f5525793
diff --git a/example/drawhorse/drawhorse/obj/Debug/drawhorse.csproj.FileListAbsolute.txt b/example/drawhorse/drawhorse/obj/Debug/drawhorse.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..681f886
--- /dev/null
+++ b/example/drawhorse/drawhorse/obj/Debug/drawhorse.csproj.FileListAbsolute.txt
@@ -0,0 +1,14 @@
+C:\Users\BarsTigerMeowcat\source\repos\drawhorse\drawhorse\bin\Debug\drawhorse.exe.config
+C:\Users\BarsTigerMeowcat\source\repos\drawhorse\drawhorse\bin\Debug\drawhorse.exe
+C:\Users\BarsTigerMeowcat\source\repos\drawhorse\drawhorse\bin\Debug\drawhorse.pdb
+C:\Users\BarsTigerMeowcat\source\repos\drawhorse\drawhorse\obj\Debug\drawhorse.csproj.AssemblyReference.cache
+C:\Users\BarsTigerMeowcat\source\repos\drawhorse\drawhorse\obj\Debug\drawhorse.csproj.CoreCompileInputs.cache
+C:\Users\BarsTigerMeowcat\source\repos\drawhorse\drawhorse\obj\Debug\drawhorse.exe
+C:\Users\BarsTigerMeowcat\source\repos\drawhorse\drawhorse\obj\Debug\drawhorse.pdb
+D:\RAZNOE\!программирование\VisualStudioProjects\drawhorse\drawhorse\bin\Debug\drawhorse.exe.config
+D:\RAZNOE\!программирование\VisualStudioProjects\drawhorse\drawhorse\bin\Debug\drawhorse.exe
+D:\RAZNOE\!программирование\VisualStudioProjects\drawhorse\drawhorse\bin\Debug\drawhorse.pdb
+D:\RAZNOE\!программирование\VisualStudioProjects\drawhorse\drawhorse\obj\Debug\drawhorse.csproj.AssemblyReference.cache
+D:\RAZNOE\!программирование\VisualStudioProjects\drawhorse\drawhorse\obj\Debug\drawhorse.csproj.CoreCompileInputs.cache
+D:\RAZNOE\!программирование\VisualStudioProjects\drawhorse\drawhorse\obj\Debug\drawhorse.exe
+D:\RAZNOE\!программирование\VisualStudioProjects\drawhorse\drawhorse\obj\Debug\drawhorse.pdb
diff --git a/example/drawhorse/drawhorse/obj/Debug/drawhorse.exe b/example/drawhorse/drawhorse/obj/Debug/drawhorse.exe
new file mode 100644
index 0000000..4b41084
Binary files /dev/null and b/example/drawhorse/drawhorse/obj/Debug/drawhorse.exe differ
diff --git a/example/drawhorse/drawhorse/obj/Debug/drawhorse.pdb b/example/drawhorse/drawhorse/obj/Debug/drawhorse.pdb
new file mode 100644
index 0000000..ba2badd
Binary files /dev/null and b/example/drawhorse/drawhorse/obj/Debug/drawhorse.pdb differ
diff --git a/horsy.py b/horsy.py
index d4bd981..55c9d1e 100644
--- a/horsy.py
+++ b/horsy.py
@@ -14,9 +14,9 @@ import modules.vars as horsy_vars
# Getting the arguments
parser = argparse.ArgumentParser(description='horsy - the best package manager')
parser.add_argument('option', help='options for horsy (install/i | uninstall/un | source/s | update/u | list/l | '
- 'upload | search | info)',
+ 'upload | search | info | like | dislike)',
choices=['install', 'i', 'uninstall', 'un', 'source', 's', 'update', 'u', 'list', 'l', 'upload',
- 'search', 'info'],
+ 'search', 'info', 'like', 'dislike'],
nargs='?')
parser.add_argument('app', help='app to do function with', nargs='?')
parser.add_argument('--vt', help='your virustotal api key (account -> api key in VT)', dest='vt_key')
diff --git a/img/algolia120x32.png b/img/algolia120x32.png
new file mode 100644
index 0000000..829e8c3
Binary files /dev/null and b/img/algolia120x32.png differ
diff --git a/img/horsy_white32x32.png b/img/horsy_white32x32.png
new file mode 100644
index 0000000..40e1950
Binary files /dev/null and b/img/horsy_white32x32.png differ
diff --git a/modules/liker.py b/modules/liker.py
new file mode 100644
index 0000000..e69de29
diff --git a/uis/horsy_main.py b/uis/horsy_main.py
new file mode 100644
index 0000000..7045db5
--- /dev/null
+++ b/uis/horsy_main.py
@@ -0,0 +1,526 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\RAZNOE\prgrming\horsy\Source\client\uis\horsy_main.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(899, 700)
+ MainWindow.setMinimumSize(QtCore.QSize(899, 700))
+ MainWindow.setMaximumSize(QtCore.QSize(899, 700))
+ icon = QtGui.QIcon()
+ icon.addPixmap(QtGui.QPixmap("D:\\RAZNOE\\prgrming\\horsy\\Source\\client\\uis\\../img/horsy_white32x32.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ MainWindow.setWindowIcon(icon)
+ MainWindow.setWindowOpacity(0.99)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setStyleSheet("QWidget{\n"
+" background-color: rgb(30, 30, 30);\n"
+"}\n"
+"")
+ self.centralwidget.setObjectName("centralwidget")
+ self.horsy_logo_lefttop = QtWidgets.QLabel(self.centralwidget)
+ self.horsy_logo_lefttop.setGeometry(QtCore.QRect(10, 10, 32, 32))
+ self.horsy_logo_lefttop.setStyleSheet("background: none;")
+ self.horsy_logo_lefttop.setText("")
+ self.horsy_logo_lefttop.setPixmap(QtGui.QPixmap("D:\\RAZNOE\\prgrming\\horsy\\Source\\client\\uis\\../img/horsy_white32x32.png"))
+ self.horsy_logo_lefttop.setObjectName("horsy_logo_lefttop")
+ self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
+ self.tabWidget.setGeometry(QtCore.QRect(10, 4, 881, 691))
+ 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.setDocumentMode(True)
+ self.tabWidget.setTabsClosable(False)
+ self.tabWidget.setMovable(True)
+ self.tabWidget.setTabBarAutoHide(False)
+ self.tabWidget.setObjectName("tabWidget")
+ self.account_tab = QtWidgets.QWidget()
+ self.account_tab.setObjectName("account_tab")
+ self.tabWidget.addTab(self.account_tab, "")
+ self.upload_tab = QtWidgets.QWidget()
+ self.upload_tab.setObjectName("upload_tab")
+ self.lineEdit = QtWidgets.QLineEdit(self.upload_tab)
+ self.lineEdit.setGeometry(QtCore.QRect(10, 55, 101, 31))
+ self.lineEdit.setStyleSheet("background-color: rgb(74, 76, 83);\n"
+"border-radius: 5px; \n"
+"color: rgb(242, 242, 242);")
+ self.lineEdit.setObjectName("lineEdit")
+ self.textBrowser = QtWidgets.QTextBrowser(self.upload_tab)
+ self.textBrowser.setGeometry(QtCore.QRect(10, 10, 321, 41))
+ self.textBrowser.setStyleSheet("color: white;\n"
+"border: none;")
+ self.textBrowser.setAcceptRichText(False)
+ self.textBrowser.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
+ self.textBrowser.setObjectName("textBrowser")
+ self.textBrowser_2 = QtWidgets.QTextBrowser(self.upload_tab)
+ self.textBrowser_2.setGeometry(QtCore.QRect(120, 60, 321, 21))
+ self.textBrowser_2.setStyleSheet("color: white;\n"
+"border: none;")
+ self.textBrowser_2.setAcceptRichText(False)
+ self.textBrowser_2.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
+ self.textBrowser_2.setObjectName("textBrowser_2")
+ self.textBrowser_3 = QtWidgets.QTextBrowser(self.upload_tab)
+ self.textBrowser_3.setGeometry(QtCore.QRect(10, 90, 256, 101))
+ self.textBrowser_3.setStyleSheet("background-color: rgb(74, 76, 83);\n"
+"border-radius: 5px; \n"
+"color: rgb(242, 242, 242);")
+ self.textBrowser_3.setAcceptRichText(False)
+ self.textBrowser_3.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByKeyboard|QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextBrowserInteraction|QtCore.Qt.TextEditable|QtCore.Qt.TextEditorInteraction|QtCore.Qt.TextSelectableByKeyboard|QtCore.Qt.TextSelectableByMouse)
+ self.textBrowser_3.setObjectName("textBrowser_3")
+ self.lineEdit_2 = QtWidgets.QLineEdit(self.upload_tab)
+ self.lineEdit_2.setGeometry(QtCore.QRect(10, 195, 291, 31))
+ self.lineEdit_2.setStyleSheet("background-color: rgb(74, 76, 83);\n"
+"border-radius: 5px; \n"
+"color: rgb(242, 242, 242);")
+ self.lineEdit_2.setObjectName("lineEdit_2")
+ self.lineEdit_3 = QtWidgets.QLineEdit(self.upload_tab)
+ self.lineEdit_3.setGeometry(QtCore.QRect(10, 230, 291, 31))
+ self.lineEdit_3.setStyleSheet("background-color: rgb(74, 76, 83);\n"
+"border-radius: 5px; \n"
+"color: rgb(242, 242, 242);")
+ self.lineEdit_3.setObjectName("lineEdit_3")
+ self.lineEdit_4 = QtWidgets.QLineEdit(self.upload_tab)
+ self.lineEdit_4.setGeometry(QtCore.QRect(10, 265, 291, 31))
+ self.lineEdit_4.setStyleSheet("background-color: rgb(74, 76, 83);\n"
+"border-radius: 5px; \n"
+"color: rgb(242, 242, 242);")
+ self.lineEdit_4.setObjectName("lineEdit_4")
+ self.lineEdit_5 = QtWidgets.QLineEdit(self.upload_tab)
+ self.lineEdit_5.setGeometry(QtCore.QRect(10, 300, 291, 31))
+ self.lineEdit_5.setStyleSheet("background-color: rgb(74, 76, 83);\n"
+"border-radius: 5px; \n"
+"color: rgb(242, 242, 242);")
+ self.lineEdit_5.setObjectName("lineEdit_5")
+ self.lineEdit_6 = QtWidgets.QLineEdit(self.upload_tab)
+ self.lineEdit_6.setGeometry(QtCore.QRect(10, 335, 291, 31))
+ self.lineEdit_6.setStyleSheet("background-color: rgb(74, 76, 83);\n"
+"border-radius: 5px; \n"
+"color: rgb(242, 242, 242);")
+ self.lineEdit_6.setObjectName("lineEdit_6")
+ self.info_button_2 = QtWidgets.QPushButton(self.upload_tab)
+ self.info_button_2.setEnabled(True)
+ self.info_button_2.setGeometry(QtCore.QRect(10, 380, 291, 50))
+ self.info_button_2.setMinimumSize(QtCore.QSize(0, 50))
+ self.info_button_2.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_2.setObjectName("info_button_2")
+ self.textBrowser_4 = QtWidgets.QTextBrowser(self.upload_tab)
+ self.textBrowser_4.setGeometry(QtCore.QRect(10, 450, 281, 161))
+ self.textBrowser_4.setStyleSheet("color: white;\n"
+"border: none;")
+ self.textBrowser_4.setAcceptRichText(False)
+ self.textBrowser_4.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
+ self.textBrowser_4.setObjectName("textBrowser_4")
+ self.label = QtWidgets.QLabel(self.upload_tab)
+ self.label.setGeometry(QtCore.QRect(390, 40, 471, 551))
+ self.label.setStyleSheet("background: none")
+ self.label.setText("")
+ self.label.setPixmap(QtGui.QPixmap("D:\\RAZNOE\\prgrming\\horsy\\Source\\client\\uis\\../img/horsy_white.png"))
+ self.label.setObjectName("label")
+ self.tabWidget.addTab(self.upload_tab, "")
+ self.browse_tab = QtWidgets.QWidget()
+ self.browse_tab.setLayoutDirection(QtCore.Qt.LeftToRight)
+ self.browse_tab.setObjectName("browse_tab")
+ self.search_table = QtWidgets.QTableWidget(self.browse_tab)
+ self.search_table.setGeometry(QtCore.QRect(0, 90, 871, 481))
+ self.search_table.setStyleSheet("QTableWidget\n"
+"{\n"
+"color: white;\n"
+"font: 15pt \"MS Shell Dlg 2\";\n"
+"margin: 20px;\n"
+"border-radius: 45px;\n"
+"}\n"
+"")
+ self.search_table.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
+ self.search_table.setAutoScroll(False)
+ self.search_table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+ self.search_table.setTabKeyNavigation(False)
+ self.search_table.setProperty("showDropIndicator", False)
+ self.search_table.setDragDropOverwriteMode(False)
+ self.search_table.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
+ self.search_table.setShowGrid(False)
+ self.search_table.setRowCount(1)
+ self.search_table.setColumnCount(4)
+ self.search_table.setObjectName("search_table")
+ item = QtWidgets.QTableWidgetItem()
+ self.search_table.setItem(0, 0, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.search_table.setItem(0, 1, item)
+ self.search_table.horizontalHeader().setVisible(False)
+ self.search_table.horizontalHeader().setDefaultSectionSize(203)
+ self.search_table.horizontalHeader().setHighlightSections(False)
+ self.search_table.horizontalHeader().setMinimumSectionSize(150)
+ self.search_table.verticalHeader().setVisible(False)
+ self.search_table.verticalHeader().setDefaultSectionSize(120)
+ self.search_table.verticalHeader().setHighlightSections(False)
+ self.search_box = QtWidgets.QTextEdit(self.browse_tab)
+ self.search_box.setEnabled(True)
+ self.search_box.setGeometry(QtCore.QRect(30, 30, 711, 51))
+ self.search_box.setStyleSheet("QTextEdit {\n"
+" background-color: rgb(74, 76, 83);\n"
+" border-radius: 15px; \n"
+" color: rgb(242, 242, 242);\n"
+" padding: 15px, 15px;\n"
+" border: 15px white;\n"
+"}")
+ self.search_box.setLineWrapMode(QtWidgets.QTextEdit.NoWrap)
+ self.search_box.setAcceptRichText(False)
+ self.search_box.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction)
+ self.search_box.setObjectName("search_box")
+ self.search_button = QtWidgets.QPushButton(self.browse_tab)
+ 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.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.setObjectName("install_button")
+ self.source_button = QtWidgets.QPushButton(self.browse_tab)
+ self.source_button.setEnabled(True)
+ self.source_button.setGeometry(QtCore.QRect(200, 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.setObjectName("source_button")
+ self.info_button = QtWidgets.QPushButton(self.browse_tab)
+ self.info_button.setEnabled(True)
+ self.info_button.setGeometry(QtCore.QRect(370, 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.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.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.setObjectName("dislike_button")
+ self.label_2 = QtWidgets.QLabel(self.browse_tab)
+ self.label_2.setGeometry(QtCore.QRect(820, 530, 31, 31))
+ self.label_2.setStyleSheet("background: none;")
+ self.label_2.setText("")
+ self.label_2.setPixmap(QtGui.QPixmap("D:\\RAZNOE\\prgrming\\horsy\\Source\\client\\uis\\../img/algolia120x32.png"))
+ self.label_2.setObjectName("label_2")
+ self.tabWidget.addTab(self.browse_tab, "")
+ self.installed_tab = QtWidgets.QWidget()
+ self.installed_tab.setLayoutDirection(QtCore.Qt.LeftToRight)
+ self.installed_tab.setObjectName("installed_tab")
+ self.delete_button = QtWidgets.QPushButton(self.installed_tab)
+ self.delete_button.setEnabled(True)
+ self.delete_button.setGeometry(QtCore.QRect(440, 575, 421, 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.setObjectName("delete_button")
+ self.update_button = QtWidgets.QPushButton(self.installed_tab)
+ self.update_button.setEnabled(True)
+ self.update_button.setGeometry(QtCore.QRect(20, 575, 401, 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")
+ self.installed_table = QtWidgets.QTableWidget(self.installed_tab)
+ self.installed_table.setGeometry(QtCore.QRect(0, 10, 871, 571))
+ self.installed_table.setStyleSheet("QTableWidget\n"
+"{\n"
+"color: white;\n"
+"font: 15pt \"MS Shell Dlg 2\";\n"
+"margin: 20px;\n"
+"border-radius: 45px;\n"
+"}\n"
+"")
+ self.installed_table.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
+ self.installed_table.setAutoScroll(False)
+ self.installed_table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+ self.installed_table.setTabKeyNavigation(False)
+ self.installed_table.setProperty("showDropIndicator", False)
+ self.installed_table.setDragDropOverwriteMode(False)
+ self.installed_table.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
+ self.installed_table.setShowGrid(False)
+ self.installed_table.setRowCount(1)
+ self.installed_table.setColumnCount(4)
+ self.installed_table.setObjectName("installed_table")
+ item = QtWidgets.QTableWidgetItem()
+ self.installed_table.setItem(0, 0, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.installed_table.setItem(0, 1, item)
+ self.installed_table.horizontalHeader().setVisible(False)
+ self.installed_table.horizontalHeader().setDefaultSectionSize(203)
+ self.installed_table.horizontalHeader().setHighlightSections(False)
+ self.installed_table.horizontalHeader().setMinimumSectionSize(150)
+ self.installed_table.verticalHeader().setVisible(False)
+ self.installed_table.verticalHeader().setDefaultSectionSize(120)
+ self.installed_table.verticalHeader().setHighlightSections(False)
+ self.tabWidget.addTab(self.installed_tab, "")
+ self.horsy_text_lefttop = QtWidgets.QLabel(self.centralwidget)
+ self.horsy_text_lefttop.setGeometry(QtCore.QRect(60, 10, 71, 31))
+ self.horsy_text_lefttop.setStyleSheet("color: white;\n"
+"font: 20pt \"MS Shell Dlg 2\";\n"
+"background: none;")
+ self.horsy_text_lefttop.setObjectName("horsy_text_lefttop")
+ self.tabWidget.raise_()
+ self.horsy_logo_lefttop.raise_()
+ self.horsy_text_lefttop.raise_()
+ MainWindow.setCentralWidget(self.centralwidget)
+
+ self.retranslateUi(MainWindow)
+ self.tabWidget.setCurrentIndex(0)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "horsy"))
+ self.tabWidget.setTabText(self.tabWidget.indexOf(self.account_tab), _translate("MainWindow", "Account"))
+ self.lineEdit.setPlaceholderText(_translate("MainWindow", "Package name"))
+ self.textBrowser.setHtml(_translate("MainWindow", "\n"
+"
\n"
+"Before starting, please make sure you have done your project and uploaded it to any hosting service or file sharing service
"))
+ self.textBrowser_2.setHtml(_translate("MainWindow", "\n"
+"\n"
+"It should contain only lowercase letters, underscores and dashes
"))
+ self.textBrowser_3.setHtml(_translate("MainWindow", "\n"
+"\n"
+"
"))
+ self.textBrowser_3.setPlaceholderText(_translate("MainWindow", "Package description. It should be a short text under 256 characters"))
+ self.lineEdit_2.setPlaceholderText(_translate("MainWindow", "Url of executable (ends on .exe or .zip)"))
+ self.lineEdit_3.setPlaceholderText(_translate("MainWindow", "Url of source (project on GitHub, source archive)"))
+ self.lineEdit_4.setPlaceholderText(_translate("MainWindow", "Dependency URL (installer in .exe)"))
+ self.lineEdit_5.setPlaceholderText(_translate("MainWindow", "Dependency run (run this during installation)"))
+ self.lineEdit_6.setPlaceholderText(_translate("MainWindow", "Main executable command (file.exe, python main.py, etc)"))
+ self.info_button_2.setText(_translate("MainWindow", "Upload"))
+ self.textBrowser_4.setHtml(_translate("MainWindow", "\n"
+"\n"
+"We don\'t moderate any apps and we won\'t delete your app, if it is not doesn\'t match some rules. But, if your app uses server vulnerabilities or hinders server work, we will delete your app. Keep in mind, that we don\'t responsible for your apps, but we advise you to share only working and safe apps on horsy
"))
+ self.tabWidget.setTabText(self.tabWidget.indexOf(self.upload_tab), _translate("MainWindow", "Upload"))
+ self.search_table.setSortingEnabled(True)
+ __sortingEnabled = self.search_table.isSortingEnabled()
+ self.search_table.setSortingEnabled(False)
+ self.search_table.setSortingEnabled(__sortingEnabled)
+ self.search_box.setPlaceholderText(_translate("MainWindow", "Search packages..."))
+ self.search_button.setText(_translate("MainWindow", "Search"))
+ self.install_button.setText(_translate("MainWindow", "Install"))
+ self.source_button.setText(_translate("MainWindow", "Get source"))
+ self.info_button.setText(_translate("MainWindow", "Info"))
+ self.like_button.setText(_translate("MainWindow", "👍"))
+ self.dislike_button.setText(_translate("MainWindow", "👎"))
+ self.tabWidget.setTabText(self.tabWidget.indexOf(self.browse_tab), _translate("MainWindow", "Browse"))
+ self.delete_button.setText(_translate("MainWindow", "Uninstall"))
+ self.update_button.setText(_translate("MainWindow", "Update"))
+ self.installed_table.setSortingEnabled(True)
+ __sortingEnabled = self.installed_table.isSortingEnabled()
+ self.installed_table.setSortingEnabled(False)
+ self.installed_table.setSortingEnabled(__sortingEnabled)
+ self.tabWidget.setTabText(self.tabWidget.indexOf(self.installed_tab), _translate("MainWindow", "Installed apps"))
+ self.horsy_text_lefttop.setText(_translate("MainWindow", "horsy"))
+
+
+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_main.ui b/uis/horsy_main.ui
index 7bff7e1..ea0ae0a 100644
--- a/uis/horsy_main.ui
+++ b/uis/horsy_main.ui
@@ -6,25 +6,1059 @@
0
0
- 800
- 600
+ 899
+ 700
-
- MainWindow
+
+
+ 899
+ 700
+
-
-