Loads database and fills gui with items
This commit is contained in:
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
/.idea/
|
||||
/venv/
|
||||
/build/
|
||||
/dist/
|
||||
/tests/
|
||||
*.spec
|
||||
*.gtabase
|
||||
*.cfg
|
||||
20
GtaBuyBaseGui.py
Normal file
20
GtaBuyBaseGui.py
Normal file
@@ -0,0 +1,20 @@
|
||||
import threading
|
||||
from PyQt5 import QtWidgets
|
||||
from gui.gui import Ui_MainWindow
|
||||
from modules.core.exceptions import hook, thread_hook
|
||||
from gui.modules import setup_ui
|
||||
import sys
|
||||
|
||||
sys.excepthook = hook
|
||||
threading.excepthook = thread_hook
|
||||
|
||||
app = QtWidgets.QApplication(sys.argv)
|
||||
MainWindow = QtWidgets.QMainWindow()
|
||||
ui = Ui_MainWindow()
|
||||
ui.setupUi(MainWindow)
|
||||
setup_ui.on_load(ui, MainWindow)
|
||||
|
||||
MainWindow.show()
|
||||
|
||||
|
||||
sys.exit(app.exec_())
|
||||
0
data/__init__.py
Normal file
0
data/__init__.py
Normal file
72
data/common.py
Normal file
72
data/common.py
Normal file
@@ -0,0 +1,72 @@
|
||||
items_class = [
|
||||
"Vehicle",
|
||||
"Property",
|
||||
"Other"
|
||||
]
|
||||
|
||||
vehicle_type = [
|
||||
"Boats",
|
||||
"Commercial",
|
||||
"Compacts",
|
||||
"Coupes",
|
||||
"Cycle",
|
||||
"Emergency",
|
||||
"Helicopters",
|
||||
"Industrial",
|
||||
"Military",
|
||||
"Motorcycles",
|
||||
"Muscle",
|
||||
"Off-Road",
|
||||
"Open Wheel",
|
||||
"Planes",
|
||||
"Remote Control",
|
||||
"Sedans",
|
||||
"Service",
|
||||
"Sports",
|
||||
"Sports Classics",
|
||||
"Super",
|
||||
"SUVs",
|
||||
"Tuners",
|
||||
"Utility",
|
||||
"Vans",
|
||||
"Other"
|
||||
]
|
||||
|
||||
property_type = [
|
||||
"Agencies",
|
||||
"Apartments",
|
||||
"Arena Workshop",
|
||||
"Auto Shops",
|
||||
"Bunkers",
|
||||
"Casino Penthouse",
|
||||
"Command Centers",
|
||||
"Crate Warehouses",
|
||||
"Executive Office Garages",
|
||||
"Executive Offices",
|
||||
"Facilities",
|
||||
"Garages",
|
||||
"Hangars",
|
||||
"MC Businesses",
|
||||
"MC Clubhouses",
|
||||
"Nightclubs",
|
||||
"Retro Arcades",
|
||||
"Vehicle Warehouses",
|
||||
"Yachts",
|
||||
"Other"
|
||||
]
|
||||
|
||||
shop_sites = [
|
||||
"TheDiamondCasinoandResort.com",
|
||||
"Arenawar.tv",
|
||||
"Dynasty8realestate.com",
|
||||
"Elitastravel.com",
|
||||
"Legendary Motorsport",
|
||||
"Southern San Andreas Super Autos",
|
||||
"Pandmcycles.com",
|
||||
"docktease.com",
|
||||
"warstock-cache-and-carry.com",
|
||||
"Bennysoriginalmotorworks.com",
|
||||
"foreclosure.maze-bank.com",
|
||||
"dynasty8executiverealty.com",
|
||||
"Other"
|
||||
]
|
||||
0
gui/__init__.py
Normal file
0
gui/__init__.py
Normal file
133
gui/gui.py
Normal file
133
gui/gui.py
Normal file
@@ -0,0 +1,133 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file 'gui.ui'
|
||||
#
|
||||
# Created by: PyQt5 UI code generator 5.15.7
|
||||
#
|
||||
# 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(800, 435)
|
||||
icon = QtGui.QIcon()
|
||||
icon.addPixmap(QtGui.QPixmap(":/img/img/icon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||
MainWindow.setWindowIcon(icon)
|
||||
self.centralwidget = QtWidgets.QWidget(MainWindow)
|
||||
self.centralwidget.setStyleSheet("")
|
||||
self.centralwidget.setObjectName("centralwidget")
|
||||
self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
|
||||
self.horizontalLayout.setContentsMargins(9, 9, 9, 9)
|
||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||
self.content = QtWidgets.QStackedWidget(self.centralwidget)
|
||||
self.content.setObjectName("content")
|
||||
self.main_page = QtWidgets.QWidget()
|
||||
self.main_page.setObjectName("main_page")
|
||||
self.verticalLayout = QtWidgets.QVBoxLayout(self.main_page)
|
||||
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.topmenu = QtWidgets.QWidget(self.main_page)
|
||||
self.topmenu.setObjectName("topmenu")
|
||||
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.topmenu)
|
||||
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
|
||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||
self.open_filter_button = QtWidgets.QPushButton(self.topmenu)
|
||||
self.open_filter_button.setMinimumSize(QtCore.QSize(48, 48))
|
||||
self.open_filter_button.setMaximumSize(QtCore.QSize(48, 48))
|
||||
self.open_filter_button.setText("")
|
||||
icon1 = QtGui.QIcon()
|
||||
icon1.addPixmap(QtGui.QPixmap(":/img/img/menu.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||
self.open_filter_button.setIcon(icon1)
|
||||
self.open_filter_button.setIconSize(QtCore.QSize(32, 32))
|
||||
self.open_filter_button.setObjectName("open_filter_button")
|
||||
self.horizontalLayout_2.addWidget(self.open_filter_button)
|
||||
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
||||
self.horizontalLayout_2.addItem(spacerItem)
|
||||
self.add_item_button = QtWidgets.QPushButton(self.topmenu)
|
||||
self.add_item_button.setMinimumSize(QtCore.QSize(48, 48))
|
||||
self.add_item_button.setMaximumSize(QtCore.QSize(48, 48))
|
||||
self.add_item_button.setText("")
|
||||
icon2 = QtGui.QIcon()
|
||||
icon2.addPixmap(QtGui.QPixmap(":/img/img/plus.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||
self.add_item_button.setIcon(icon2)
|
||||
self.add_item_button.setIconSize(QtCore.QSize(32, 32))
|
||||
self.add_item_button.setObjectName("add_item_button")
|
||||
self.horizontalLayout_2.addWidget(self.add_item_button)
|
||||
self.manage_profiles_button = QtWidgets.QPushButton(self.topmenu)
|
||||
self.manage_profiles_button.setMinimumSize(QtCore.QSize(48, 48))
|
||||
self.manage_profiles_button.setMaximumSize(QtCore.QSize(48, 48))
|
||||
self.manage_profiles_button.setText("")
|
||||
icon3 = QtGui.QIcon()
|
||||
icon3.addPixmap(QtGui.QPixmap(":/img/img/account.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||
self.manage_profiles_button.setIcon(icon3)
|
||||
self.manage_profiles_button.setIconSize(QtCore.QSize(32, 32))
|
||||
self.manage_profiles_button.setObjectName("manage_profiles_button")
|
||||
self.horizontalLayout_2.addWidget(self.manage_profiles_button)
|
||||
self.open_settings_button = QtWidgets.QPushButton(self.topmenu)
|
||||
self.open_settings_button.setMinimumSize(QtCore.QSize(48, 48))
|
||||
self.open_settings_button.setMaximumSize(QtCore.QSize(48, 48))
|
||||
self.open_settings_button.setText("")
|
||||
icon4 = QtGui.QIcon()
|
||||
icon4.addPixmap(QtGui.QPixmap(":/img/img/settings.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||
self.open_settings_button.setIcon(icon4)
|
||||
self.open_settings_button.setIconSize(QtCore.QSize(32, 32))
|
||||
self.open_settings_button.setObjectName("open_settings_button")
|
||||
self.horizontalLayout_2.addWidget(self.open_settings_button)
|
||||
self.verticalLayout.addWidget(self.topmenu)
|
||||
self.content_layout = QtWidgets.QWidget(self.main_page)
|
||||
self.content_layout.setObjectName("content_layout")
|
||||
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.content_layout)
|
||||
self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
|
||||
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
|
||||
self.logo_if_empty = QtWidgets.QTextBrowser(self.content_layout)
|
||||
self.logo_if_empty.setMaximumSize(QtCore.QSize(16777215, 16777215))
|
||||
self.logo_if_empty.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
|
||||
self.logo_if_empty.setObjectName("logo_if_empty")
|
||||
self.horizontalLayout_3.addWidget(self.logo_if_empty)
|
||||
self.items_list = QtWidgets.QListWidget(self.content_layout)
|
||||
self.items_list.setMaximumSize(QtCore.QSize(16777215, 16777215))
|
||||
self.items_list.setStyleSheet("QListWidget:item {\n"
|
||||
" padding-left: 10px;\n"
|
||||
" height: 60px;\n"
|
||||
"}")
|
||||
self.items_list.setIconSize(QtCore.QSize(16777215, 56))
|
||||
self.items_list.setObjectName("items_list")
|
||||
self.horizontalLayout_3.addWidget(self.items_list)
|
||||
self.verticalLayout.addWidget(self.content_layout)
|
||||
self.content.addWidget(self.main_page)
|
||||
self.add_page = QtWidgets.QWidget()
|
||||
self.add_page.setObjectName("add_page")
|
||||
self.content.addWidget(self.add_page)
|
||||
self.horizontalLayout.addWidget(self.content)
|
||||
MainWindow.setCentralWidget(self.centralwidget)
|
||||
|
||||
self.retranslateUi(MainWindow)
|
||||
QtCore.QMetaObject.connectSlotsByName(MainWindow)
|
||||
|
||||
def retranslateUi(self, MainWindow):
|
||||
_translate = QtCore.QCoreApplication.translate
|
||||
MainWindow.setWindowTitle(_translate("MainWindow", "GTABuyBase"))
|
||||
self.logo_if_empty.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
|
||||
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
|
||||
"p, li { white-space: pre-wrap; }\n"
|
||||
"</style></head><body style=\" font-family:\'Segoe UI\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
|
||||
"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:28pt; font-weight:600;\">GTABuyBase</span></p>\n"
|
||||
"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><img src=\":/img/img/icon.ico\" /></p>\n"
|
||||
"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:12pt;\">Press add button on top right corner to add item</span></p>\n"
|
||||
"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:12pt;\">To use own options create profile on profile page</span></p></body></html>"))
|
||||
import gui.images_rc
|
||||
|
||||
|
||||
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_())
|
||||
501
gui/gui.ui
Normal file
501
gui/gui.ui
Normal file
@@ -0,0 +1,501 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>435</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>GTABuyBase</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="images.qrc">
|
||||
<normaloff>:/img/img/icon.ico</normaloff>:/img/img/icon.ico</iconset>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">
|
||||
QWidget {
|
||||
background-color: rgb(30, 30, 30);
|
||||
color: rgb(255, 255, 255);
|
||||
font: 10pt "Segoe UI";
|
||||
}
|
||||
QScrollBar:vertical,
|
||||
QScrollBar:horizontal {
|
||||
border: none;
|
||||
background: rgb(30, 30, 30);
|
||||
width: 10px;
|
||||
margin: 15px 0 15px 0;
|
||||
border-radius: 0px;
|
||||
}
|
||||
QScrollBar::handle:vertical,
|
||||
QScrollBar::handle:horizontal {
|
||||
background-color: rgb(139, 139, 139);
|
||||
min-height: 30px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
QScrollBar::handle:vertical:hover,
|
||||
QScrollBar::handle:vertical:pressed,
|
||||
QScrollBar::handle:horizontal:hover,
|
||||
QScrollBar::handle:horizontal: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,
|
||||
QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal,
|
||||
QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal {
|
||||
background: none;
|
||||
}
|
||||
QPushButton {
|
||||
color: white;
|
||||
border-width: 1px;
|
||||
border-radius:6px;
|
||||
border-style: solid;
|
||||
border-color: #303030;
|
||||
background-color: #2c2d2e;
|
||||
}
|
||||
QPushButton:hover {
|
||||
border-width: 2px;
|
||||
background-color: #323232;
|
||||
}
|
||||
QPushButton:pressed {
|
||||
background-color: #262728;
|
||||
}
|
||||
QPushButton:disabled {
|
||||
background-color: #434343;
|
||||
border-color: #0000;
|
||||
}
|
||||
QLineEdit, QTextBrowser, QPlainTextEdit, QTextEdit {
|
||||
border-width: 1px;
|
||||
border-radius: 5px;
|
||||
border-style: solid;
|
||||
border-color: #303030;
|
||||
background-color: #242424;
|
||||
font: 10pt "Segoe UI";
|
||||
}
|
||||
QListWidget {
|
||||
border-width: 1px;
|
||||
border-radius: 15px;
|
||||
border-style: solid;
|
||||
border-color: #303030;
|
||||
padding: 10px;
|
||||
background-color: #242424;
|
||||
font: 10pt "Segoe UI";
|
||||
}
|
||||
QListWidget:item {
|
||||
background-color: #242424;
|
||||
selection-color: white;
|
||||
}
|
||||
QListWidget:item:hover {
|
||||
background-color: #323232;
|
||||
}
|
||||
QListWidget:item:selected {
|
||||
background-color: #777777;
|
||||
}
|
||||
QComboBox
|
||||
{
|
||||
border-width: 1px;
|
||||
border-radius:6px;
|
||||
border-style: solid;
|
||||
border-color: #303030;
|
||||
background-color: #2c2d2e;
|
||||
color: #ffffff;
|
||||
}
|
||||
QComboBox::disabled
|
||||
{
|
||||
background-color: #434343;
|
||||
color: #656565;
|
||||
border-color: #434343;
|
||||
}
|
||||
QComboBox:hover
|
||||
{
|
||||
background-color: #323232;
|
||||
}
|
||||
QComboBox:on
|
||||
{
|
||||
background-color: #434343;
|
||||
}
|
||||
QComboBox QAbstractItemView
|
||||
{
|
||||
background-color: #434343;
|
||||
color: #ffffff;
|
||||
selection-background-color: #777777;
|
||||
selection-color: white;
|
||||
outline: 0;
|
||||
}
|
||||
QComboBox::drop-down
|
||||
{
|
||||
subcontrol-origin: padding;
|
||||
subcontrol-position: top right;
|
||||
border-radius: 6px;
|
||||
}
|
||||
QTabBar::tab
|
||||
{
|
||||
background-color: #2c2d2e;
|
||||
color: #ffffff;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-top-left-radius: 3px;
|
||||
border-top-right-radius: 3px;
|
||||
border-color: #303030;
|
||||
padding: 5px;
|
||||
}
|
||||
QTabBar::tab:disabled
|
||||
{
|
||||
background-color: #656565;
|
||||
color: #656565;
|
||||
}
|
||||
QTabWidget::pane
|
||||
{
|
||||
background-color: #a0a0a0;
|
||||
color: #ffffff;
|
||||
border: 3px solid;
|
||||
border-radius: 15px;
|
||||
border-color: #1c1c1c;
|
||||
}
|
||||
QTabBar::tab:selected
|
||||
{
|
||||
background-color: #262728;
|
||||
color: #ffffff;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-top-left-radius: 3px;
|
||||
border-top-right-radius: 3px;
|
||||
border-color: #303030;
|
||||
padding: 5px;
|
||||
}
|
||||
QTabBar::tab:selected:disabled
|
||||
{
|
||||
background-color: #404040;
|
||||
color: #656565;
|
||||
}
|
||||
QTabBar::tab:!selected
|
||||
{
|
||||
background-color: #262626;
|
||||
}
|
||||
QTabBar::tab:!selected:hover
|
||||
{
|
||||
background-color: #323232;
|
||||
}
|
||||
QTabBar::tab:top:!selected
|
||||
{
|
||||
margin-top: 3px;
|
||||
}
|
||||
QTabBar::tab:bottom:!selected
|
||||
{
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
QTabBar::tab:top, QTabBar::tab:bottom
|
||||
{
|
||||
min-width: 8ex;
|
||||
margin-right: -1px;
|
||||
padding: 5px 10px 5px 10px;
|
||||
}
|
||||
QTabBar::tab:top:selected
|
||||
{
|
||||
border-bottom-color: none;
|
||||
}
|
||||
QTabBar::tab:bottom:selected
|
||||
{
|
||||
border-top-color: none;
|
||||
}
|
||||
QTabBar::tab:top:last, QTabBar::tab:bottom:last,
|
||||
QTabBar::tab:top:only-one, QTabBar::tab:bottom:only-one
|
||||
{
|
||||
margin-right: 0;
|
||||
}
|
||||
QTabBar::tab:left:!selected
|
||||
{
|
||||
margin-right: 3px;
|
||||
}
|
||||
QTabBar::tab:right:!selected
|
||||
{
|
||||
margin-left: 3px;
|
||||
}
|
||||
QTabBar::tab:left, QTabBar::tab:right
|
||||
{
|
||||
min-height: 8ex;
|
||||
margin-bottom: -1px;
|
||||
padding: 10px 5px 10px 5px;
|
||||
}
|
||||
QTabBar::tab:left:selected
|
||||
{
|
||||
border-left-color: none;
|
||||
}
|
||||
QTabBar::tab:right:selected
|
||||
{
|
||||
border-right-color: none;
|
||||
}
|
||||
QTabBar::tab:left:last, QTabBar::tab:right:last,
|
||||
QTabBar::tab:left:only-one, QTabBar::tab:right:only-one
|
||||
{
|
||||
margin-bottom: 0;
|
||||
}
|
||||
</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QStackedWidget" name="content">
|
||||
<widget class="QWidget" name="main_page">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QWidget" name="topmenu" native="true">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="open_filter_button">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>48</width>
|
||||
<height>48</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>48</width>
|
||||
<height>48</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="images.qrc">
|
||||
<normaloff>:/img/img/menu.png</normaloff>:/img/img/menu.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>32</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="top_menu_spacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="add_item_button">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>48</width>
|
||||
<height>48</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>48</width>
|
||||
<height>48</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="images.qrc">
|
||||
<normaloff>:/img/img/plus.png</normaloff>:/img/img/plus.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>32</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="manage_profiles_button">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>48</width>
|
||||
<height>48</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>48</width>
|
||||
<height>48</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="images.qrc">
|
||||
<normaloff>:/img/img/account.png</normaloff>:/img/img/account.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>32</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="open_settings_button">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>48</width>
|
||||
<height>48</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>48</width>
|
||||
<height>48</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="images.qrc">
|
||||
<normaloff>:/img/img/settings.png</normaloff>:/img/img/settings.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>32</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QWidget" name="content_layout" native="true">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QTextBrowser" name="logo_if_empty">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="html">
|
||||
<string><!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:'Segoe UI'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:28pt; font-weight:600;">GTABuyBase</span></p>
|
||||
<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/img/img/icon.ico" /></p>
|
||||
<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Press add button on top right corner to add item</span></p>
|
||||
<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">To use own options create profile on profile page</span></p></body></html></string>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::NoTextInteraction</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QListWidget" name="items_list">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QListWidget:item {
|
||||
padding-left: 10px;
|
||||
height: 60px;
|
||||
}</string>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>56</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="add_page"/>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="images.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
9
gui/images.qrc
Normal file
9
gui/images.qrc
Normal file
@@ -0,0 +1,9 @@
|
||||
<RCC>
|
||||
<qresource prefix="img">
|
||||
<file>img/account.png</file>
|
||||
<file>img/icon.ico</file>
|
||||
<file>img/menu.png</file>
|
||||
<file>img/plus.png</file>
|
||||
<file>img/settings.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
2234
gui/images_rc.py
Normal file
2234
gui/images_rc.py
Normal file
File diff suppressed because it is too large
Load Diff
BIN
gui/img/account.png
Normal file
BIN
gui/img/account.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 947 B |
BIN
gui/img/icon.ico
Normal file
BIN
gui/img/icon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 264 KiB |
BIN
gui/img/menu.png
Normal file
BIN
gui/img/menu.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 310 B |
BIN
gui/img/plus.png
Normal file
BIN
gui/img/plus.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 816 B |
BIN
gui/img/settings.png
Normal file
BIN
gui/img/settings.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.3 KiB |
0
gui/modules/__init__.py
Normal file
0
gui/modules/__init__.py
Normal file
133
gui/modules/blur.py
Normal file
133
gui/modules/blur.py
Normal file
@@ -0,0 +1,133 @@
|
||||
# source: https://github.com/Opticos/GWSL-Source/blob/master/blur.py,
|
||||
# https://www.cnblogs.com/zhiyiYo/p/14659981.html ,
|
||||
# https://github.com/ifwe/digsby/blob/master/digsby/src/gui/vista.py
|
||||
import platform
|
||||
import ctypes
|
||||
|
||||
|
||||
if platform.system() == 'Windows':
|
||||
from ctypes.wintypes import DWORD, BOOL, HRGN, HWND
|
||||
|
||||
user32 = ctypes.windll.user32
|
||||
dwm = ctypes.windll.dwmapi
|
||||
|
||||
|
||||
class ACCENTPOLICY(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("AccentState", ctypes.c_uint),
|
||||
("AccentFlags", ctypes.c_uint),
|
||||
("GradientColor", ctypes.c_uint),
|
||||
("AnimationId", ctypes.c_uint)
|
||||
]
|
||||
|
||||
|
||||
class WINDOWCOMPOSITIONATTRIBDATA(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("Attribute", ctypes.c_int),
|
||||
("Data", ctypes.POINTER(ctypes.c_int)),
|
||||
("SizeOfData", ctypes.c_size_t)
|
||||
]
|
||||
|
||||
|
||||
class DWM_BLURBEHIND(ctypes.Structure):
|
||||
_fields_ = [
|
||||
('dwFlags', DWORD),
|
||||
('fEnable', BOOL),
|
||||
('hRgnBlur', HRGN),
|
||||
('fTransitionOnMaximized', BOOL)
|
||||
]
|
||||
|
||||
|
||||
class MARGINS(ctypes.Structure):
|
||||
_fields_ = [("cxLeftWidth", ctypes.c_int),
|
||||
("cxRightWidth", ctypes.c_int),
|
||||
("cyTopHeight", ctypes.c_int),
|
||||
("cyBottomHeight", ctypes.c_int)
|
||||
]
|
||||
|
||||
|
||||
SetWindowCompositionAttribute = user32.SetWindowCompositionAttribute
|
||||
SetWindowCompositionAttribute.argtypes = (HWND, WINDOWCOMPOSITIONATTRIBDATA)
|
||||
SetWindowCompositionAttribute.restype = ctypes.c_int
|
||||
|
||||
|
||||
def ExtendFrameIntoClientArea(hwnd):
|
||||
margins = MARGINS(-1, -1, -1, -1)
|
||||
dwm.DwmExtendFrameIntoClientArea(hwnd, ctypes.byref(margins))
|
||||
|
||||
|
||||
def Win7Blur(hwnd, Acrylic):
|
||||
if not Acrylic:
|
||||
DWM_BB_ENABLE = 0x01
|
||||
bb = DWM_BLURBEHIND()
|
||||
bb.dwFlags = DWM_BB_ENABLE
|
||||
bb.fEnable = 1
|
||||
bb.hRgnBlur = 1
|
||||
dwm.DwmEnableBlurBehindWindow(hwnd, ctypes.byref(bb))
|
||||
else:
|
||||
ExtendFrameIntoClientArea(hwnd)
|
||||
|
||||
|
||||
def HEXtoRGBAint(HEX: str):
|
||||
alpha = HEX[7:]
|
||||
blue = HEX[5:7]
|
||||
green = HEX[3:5]
|
||||
red = HEX[1:3]
|
||||
|
||||
gradient_color = alpha + blue + green + red
|
||||
return int(gradient_color, base=16)
|
||||
|
||||
|
||||
def blur(hwnd, hex_color=False, acrylic=False, dark=False):
|
||||
accent = ACCENTPOLICY()
|
||||
accent.AccentState = 3 # Default window Blur #ACCENT_ENABLE_BLURBEHIND
|
||||
|
||||
gradient_color = 0
|
||||
|
||||
if hex_color:
|
||||
gradient_color = HEXtoRGBAint(hex_color)
|
||||
accent.AccentFlags = 2 # Window Blur With Accent Color #ACCENT_ENABLE_TRANSPARENTGRADIENT
|
||||
|
||||
if acrylic:
|
||||
accent.AccentState = 4 # UWP but LAG #ACCENT_ENABLE_ACRYLICBLURBEHIND
|
||||
if not hex_color: # UWP without color is translucent
|
||||
accent.AccentFlags = 2
|
||||
gradient_color = HEXtoRGBAint('#12121240') # placeholder color
|
||||
|
||||
accent.GradientColor = gradient_color
|
||||
|
||||
data = WINDOWCOMPOSITIONATTRIBDATA()
|
||||
data.Attribute = 19 # WCA_ACCENT_POLICY
|
||||
data.SizeOfData = ctypes.sizeof(accent)
|
||||
data.Data = ctypes.cast(ctypes.pointer(accent), ctypes.POINTER(ctypes.c_int))
|
||||
|
||||
SetWindowCompositionAttribute(int(hwnd), data)
|
||||
|
||||
if dark:
|
||||
data.Attribute = 26 # WCA_USEDARKMODECOLORS
|
||||
SetWindowCompositionAttribute(int(hwnd), data)
|
||||
|
||||
|
||||
def BlurLinux(WID): # may not work in all distros (working in Deepin)
|
||||
import os
|
||||
|
||||
c = "xprop -f _KDE_NET_WM_BLUR_BEHIND_REGION 32c -set _KDE_NET_WM_BLUR_BEHIND_REGION 0 -id " + str(WID)
|
||||
os.system(c)
|
||||
|
||||
|
||||
def GlobalBlur(hwnd, hex_color=False, acrylic=False, dark=False):
|
||||
release = platform.release()
|
||||
system = platform.system()
|
||||
|
||||
if system == 'Windows':
|
||||
if release == 'Vista':
|
||||
Win7Blur(hwnd, acrylic)
|
||||
else:
|
||||
release = int(float(release))
|
||||
if release == 10 or release == 8 or release == 11:
|
||||
blur(hwnd, hex_color, acrylic, dark)
|
||||
else:
|
||||
Win7Blur(hwnd, acrylic)
|
||||
|
||||
if system == 'Linux':
|
||||
BlurLinux(hwnd)
|
||||
20
gui/modules/popup.py
Normal file
20
gui/modules/popup.py
Normal file
@@ -0,0 +1,20 @@
|
||||
import ctypes
|
||||
|
||||
|
||||
def qtpopup(title, text):
|
||||
from PyQt5 import QtWidgets
|
||||
QtWidgets.QMessageBox.information(None, title, text)
|
||||
|
||||
|
||||
def popup(title, text, style=0):
|
||||
"""
|
||||
Styles:
|
||||
0 : OK
|
||||
1 : OK | Cancel
|
||||
2 : Abort | Retry | Ignore
|
||||
3 : Yes | No | Cancel
|
||||
4 : Yes | No
|
||||
5 : Retry | Cancel
|
||||
6 : Cancel | Try Again | Continue
|
||||
"""
|
||||
return ctypes.windll.user32.MessageBoxW(0, text, title, style)
|
||||
32
gui/modules/setup_ui.py
Normal file
32
gui/modules/setup_ui.py
Normal file
@@ -0,0 +1,32 @@
|
||||
import requests
|
||||
from gui.gui import Ui_MainWindow
|
||||
from .blur import GlobalBlur
|
||||
from gui.modules import styles
|
||||
from PyQt5 import QtWidgets, QtGui
|
||||
from PyQt5.QtWidgets import QMainWindow
|
||||
from modules.config import Config
|
||||
from modules.database import Database
|
||||
|
||||
|
||||
def on_load(ui: Ui_MainWindow, MainWindow: QMainWindow):
|
||||
ui.logo_if_empty.hide()
|
||||
|
||||
ui.content.setCurrentIndex(0)
|
||||
|
||||
MainWindow.setStyleSheet(styles.centralwidget())
|
||||
if 'acrylic' in Config.get().theme:
|
||||
GlobalBlur(MainWindow.winId(), acrylic=True)
|
||||
|
||||
if Database.get().items:
|
||||
for item in Database.get().items:
|
||||
item = Database.get().items[item]
|
||||
list_item = QtWidgets.QListWidgetItem()
|
||||
list_item.setText(f'{item.item_name} - ${"{:,}".format(item.price)}')
|
||||
pixmap = QtGui.QPixmap()
|
||||
pixmap.loadFromData(requests.get(item.image).content)
|
||||
list_item.setIcon(QtGui.QIcon(pixmap))
|
||||
ui.items_list.addItem(list_item)
|
||||
|
||||
else:
|
||||
ui.logo_if_empty.show()
|
||||
ui.items_list.hide()
|
||||
545
gui/modules/styles.py
Normal file
545
gui/modules/styles.py
Normal file
@@ -0,0 +1,545 @@
|
||||
from modules.config import Config
|
||||
|
||||
|
||||
centralwidget_b = """
|
||||
QWidget {
|
||||
background-color: rgba(30, 30, 30, 0.1);
|
||||
color: white;
|
||||
font: 10pt "Segoe UI";
|
||||
}
|
||||
|
||||
|
||||
QScrollBar:vertical,
|
||||
QScrollBar:horizontal {
|
||||
border: none;
|
||||
background: rgba(30, 30, 30, 0);
|
||||
width: 10px;
|
||||
margin: 15px 0 15px 0;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
QScrollBar::handle:vertical,
|
||||
QScrollBar::handle:horizontal {
|
||||
background-color: rgba(139, 139, 139, 0);
|
||||
min-height: 30px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
QScrollBar::handle:vertical:hover,
|
||||
QScrollBar::handle:vertical:pressed,
|
||||
QScrollBar::handle:horizontal:hover,
|
||||
QScrollBar::handle:horizontal:pressed {
|
||||
background-color: rgba(149, 149, 149, 0);
|
||||
}
|
||||
|
||||
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,
|
||||
QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal,
|
||||
QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal {
|
||||
background: none;
|
||||
}
|
||||
|
||||
|
||||
QPushButton {
|
||||
color: white;
|
||||
border-width: 1px;
|
||||
border-radius:6px;
|
||||
border-style: solid;
|
||||
border-color: rgba(48, 48, 48, 0.5);
|
||||
background-color: rgba(44, 45, 46, 0.3);
|
||||
}
|
||||
QPushButton:hover {
|
||||
border-width: 2px;
|
||||
background-color: rgba(50, 50, 50, 0.7);
|
||||
}
|
||||
QPushButton:pressed {
|
||||
background-color: rgba(38, 39, 40, 0.7);
|
||||
}
|
||||
QPushButton:disabled {
|
||||
background-color: rgba(67, 67, 67, 0.7);
|
||||
border-color: rgba(0, 0, 0, 0.7);
|
||||
}
|
||||
|
||||
|
||||
QLineEdit, QTextBrowser, QPlainTextEdit, QTextEdit {
|
||||
border-width: 1px;
|
||||
border-radius: 5px;
|
||||
border-style: solid;
|
||||
border-color: rgba(48, 48, 48);
|
||||
background-color: rgba(36, 36, 36, 0);
|
||||
font: 10pt "Segoe UI";
|
||||
}
|
||||
|
||||
|
||||
QListWidget {
|
||||
border-width: 1px;
|
||||
border-radius: 15px;
|
||||
border-style: solid;
|
||||
border-color: rgba(48, 48, 48);
|
||||
padding: 10px;
|
||||
background-color: rgba(100, 100, 100, 0);
|
||||
font: 10pt "Segoe UI";
|
||||
}
|
||||
QListWidget:item {
|
||||
background-color: rgba(36, 36, 36, 0);
|
||||
selection-color: white;
|
||||
}
|
||||
QListWidget:item:hover {
|
||||
background-color: rgba(50, 50, 50, 0);
|
||||
}
|
||||
QListWidget:item:selected {
|
||||
background-color: rgba(119, 119, 119, 1);
|
||||
}
|
||||
|
||||
|
||||
QComboBox
|
||||
{
|
||||
border-width: 1px;
|
||||
border-radius:6px;
|
||||
border-style: solid;
|
||||
border-color: rgba(48, 48, 48);
|
||||
background-color: rgba(44, 45, 46, 0);
|
||||
color: white;
|
||||
}
|
||||
|
||||
QComboBox::disabled
|
||||
{
|
||||
background-color: rgba(67, 67, 67, 0);
|
||||
color: #656565;
|
||||
border-color: rgba(67, 67, 67);
|
||||
}
|
||||
|
||||
QComboBox:hover
|
||||
{
|
||||
background-color: rgba(50, 50, 50, 0);
|
||||
}
|
||||
|
||||
QComboBox:on
|
||||
{
|
||||
background-color: rgba(67, 67, 67, 0);
|
||||
}
|
||||
|
||||
QComboBox QAbstractItemView
|
||||
{
|
||||
background-color: rgba(67, 67, 67, 0);
|
||||
color: #ffffff;
|
||||
selection-background-color: rgba(119, 119, 119, 0);
|
||||
selection-color: white;
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
QComboBox::drop-down
|
||||
{
|
||||
subcontrol-origin: padding;
|
||||
subcontrol-position: top right;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
|
||||
QTabBar::tab
|
||||
{
|
||||
background-color: rgba(44, 45, 46, 0);
|
||||
color: #ffffff;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-top-left-radius: 3px;
|
||||
border-top-right-radius: 3px;
|
||||
border-color: rgba(48, 48, 48);
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
QTabBar::tab:disabled
|
||||
{
|
||||
background-color: rgba(101, 101, 101, 0);
|
||||
color: #656565;
|
||||
}
|
||||
|
||||
QTabWidget::pane
|
||||
{
|
||||
background-color: rgba(160, 160, 160, 0);
|
||||
color: #ffffff;
|
||||
border: 3px solid;
|
||||
border-radius: 15px;
|
||||
border-color: rgba(28, 28, 28);
|
||||
}
|
||||
|
||||
QTabBar::tab:selected
|
||||
{
|
||||
background-color: rgba(38, 39, 40, 0);
|
||||
color: #ffffff;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-top-left-radius: 3px;
|
||||
border-top-right-radius: 3px;
|
||||
border-color: rgba(48, 48, 48);
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
QTabBar::tab:selected:disabled
|
||||
{
|
||||
background-color: rgba(64, 64, 64, 0);
|
||||
color: #656565;
|
||||
}
|
||||
|
||||
QTabBar::tab:!selected
|
||||
{
|
||||
background-color: rgba(38, 38, 38, 0);
|
||||
}
|
||||
|
||||
QTabBar::tab:!selected:hover
|
||||
{
|
||||
background-color: rgba(50, 50, 50, 0);
|
||||
}
|
||||
|
||||
QTabBar::tab:top:!selected
|
||||
{
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
QTabBar::tab:bottom:!selected
|
||||
{
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
QTabBar::tab:top, QTabBar::tab:bottom
|
||||
{
|
||||
min-width: 8ex;
|
||||
margin-right: -1px;
|
||||
padding: 5px 10px 5px 10px;
|
||||
}
|
||||
|
||||
QTabBar::tab:top:selected
|
||||
{
|
||||
border-bottom-color: none;
|
||||
}
|
||||
|
||||
QTabBar::tab:bottom:selected
|
||||
{
|
||||
border-top-color: none;
|
||||
}
|
||||
|
||||
QTabBar::tab:top:last, QTabBar::tab:bottom:last,
|
||||
QTabBar::tab:top:only-one, QTabBar::tab:bottom:only-one
|
||||
{
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
QTabBar::tab:left:!selected
|
||||
{
|
||||
margin-right: 3px;
|
||||
}
|
||||
|
||||
QTabBar::tab:right:!selected
|
||||
{
|
||||
margin-left: 3px;
|
||||
}
|
||||
|
||||
QTabBar::tab:left, QTabBar::tab:right
|
||||
{
|
||||
min-height: 8ex;
|
||||
margin-bottom: -1px;
|
||||
padding: 10px 5px 10px 5px;
|
||||
}
|
||||
|
||||
QTabBar::tab:left:selected
|
||||
{
|
||||
border-left-color: none;
|
||||
}
|
||||
|
||||
QTabBar::tab:right:selected
|
||||
{
|
||||
border-right-color: none;
|
||||
}
|
||||
|
||||
QTabBar::tab:left:last, QTabBar::tab:right:last,
|
||||
QTabBar::tab:left:only-one, QTabBar::tab:right:only-one
|
||||
{
|
||||
margin-bottom: 0;
|
||||
}
|
||||
"""
|
||||
|
||||
menupage_b = """
|
||||
QListWidget {
|
||||
border-width: 0px;
|
||||
border-radius: 0px;
|
||||
border: none;
|
||||
padding: 0px;
|
||||
background-color: rgba(36, 36, 36, 0);
|
||||
font: 10pt "Segoe UI";
|
||||
}
|
||||
QListWidget:item {
|
||||
padding-left: 10px;
|
||||
height: 60px;
|
||||
background-color: rgba(25, 25, 25, 0);
|
||||
selection-color: rgba(255, 255, 255);
|
||||
}
|
||||
QListWidget:item:hover {
|
||||
background-color: rgba(50, 50, 50, 0);
|
||||
}
|
||||
QListWidget:item:selected {
|
||||
background-color: rgba(38, 39, 40, 0);
|
||||
}
|
||||
"""
|
||||
|
||||
centralwidget_g = """
|
||||
QWidget {
|
||||
background-color: rgb(30, 30, 30);
|
||||
color: rgb(255, 255, 255);
|
||||
font: 10pt "Segoe UI";
|
||||
}
|
||||
QScrollBar:vertical,
|
||||
QScrollBar:horizontal {
|
||||
border: none;
|
||||
background: rgb(30, 30, 30);
|
||||
width: 10px;
|
||||
margin: 15px 0 15px 0;
|
||||
border-radius: 0px;
|
||||
}
|
||||
QScrollBar::handle:vertical,
|
||||
QScrollBar::handle:horizontal {
|
||||
background-color: rgb(139, 139, 139);
|
||||
min-height: 30px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
QScrollBar::handle:vertical:hover,
|
||||
QScrollBar::handle:vertical:pressed,
|
||||
QScrollBar::handle:horizontal:hover,
|
||||
QScrollBar::handle:horizontal: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,
|
||||
QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal,
|
||||
QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal {
|
||||
background: none;
|
||||
}
|
||||
QPushButton {
|
||||
color: white;
|
||||
border-width: 1px;
|
||||
border-radius:6px;
|
||||
border-style: solid;
|
||||
border-color: #303030;
|
||||
background-color: #2c2d2e;
|
||||
}
|
||||
QPushButton:hover {
|
||||
border-width: 2px;
|
||||
background-color: #323232;
|
||||
}
|
||||
QPushButton:pressed {
|
||||
background-color: #262728;
|
||||
}
|
||||
QPushButton:disabled {
|
||||
background-color: #434343;
|
||||
border-color: #0000;
|
||||
}
|
||||
QLineEdit, QTextBrowser, QPlainTextEdit, QTextEdit {
|
||||
border-width: 1px;
|
||||
border-radius: 5px;
|
||||
border-style: solid;
|
||||
border-color: #303030;
|
||||
background-color: #242424;
|
||||
font: 10pt "Segoe UI";
|
||||
}
|
||||
QListWidget {
|
||||
border-width: 1px;
|
||||
border-radius: 15px;
|
||||
border-style: solid;
|
||||
border-color: #303030;
|
||||
padding: 10px;
|
||||
background-color: #242424;
|
||||
font: 10pt "Segoe UI";
|
||||
}
|
||||
QListWidget:item {
|
||||
background-color: #242424;
|
||||
selection-color: white;
|
||||
}
|
||||
QListWidget:item:hover {
|
||||
background-color: #323232;
|
||||
}
|
||||
QListWidget:item:selected {
|
||||
background-color: #777777;
|
||||
}
|
||||
QComboBox
|
||||
{
|
||||
border-width: 1px;
|
||||
border-radius:6px;
|
||||
border-style: solid;
|
||||
border-color: #303030;
|
||||
background-color: #2c2d2e;
|
||||
color: #ffffff;
|
||||
}
|
||||
QComboBox::disabled
|
||||
{
|
||||
background-color: #434343;
|
||||
color: #656565;
|
||||
border-color: #434343;
|
||||
}
|
||||
QComboBox:hover
|
||||
{
|
||||
background-color: #323232;
|
||||
}
|
||||
QComboBox:on
|
||||
{
|
||||
background-color: #434343;
|
||||
}
|
||||
QComboBox QAbstractItemView
|
||||
{
|
||||
background-color: #434343;
|
||||
color: #ffffff;
|
||||
selection-background-color: #777777;
|
||||
selection-color: white;
|
||||
outline: 0;
|
||||
}
|
||||
QComboBox::drop-down
|
||||
{
|
||||
subcontrol-origin: padding;
|
||||
subcontrol-position: top right;
|
||||
border-radius: 6px;
|
||||
}
|
||||
QTabBar::tab
|
||||
{
|
||||
background-color: #2c2d2e;
|
||||
color: #ffffff;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-top-left-radius: 3px;
|
||||
border-top-right-radius: 3px;
|
||||
border-color: #303030;
|
||||
padding: 5px;
|
||||
}
|
||||
QTabBar::tab:disabled
|
||||
{
|
||||
background-color: #656565;
|
||||
color: #656565;
|
||||
}
|
||||
QTabWidget::pane
|
||||
{
|
||||
background-color: #a0a0a0;
|
||||
color: #ffffff;
|
||||
border: 3px solid;
|
||||
border-radius: 15px;
|
||||
border-color: #1c1c1c;
|
||||
}
|
||||
QTabBar::tab:selected
|
||||
{
|
||||
background-color: #262728;
|
||||
color: #ffffff;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-top-left-radius: 3px;
|
||||
border-top-right-radius: 3px;
|
||||
border-color: #303030;
|
||||
padding: 5px;
|
||||
}
|
||||
QTabBar::tab:selected:disabled
|
||||
{
|
||||
background-color: #404040;
|
||||
color: #656565;
|
||||
}
|
||||
QTabBar::tab:!selected
|
||||
{
|
||||
background-color: #262626;
|
||||
}
|
||||
QTabBar::tab:!selected:hover
|
||||
{
|
||||
background-color: #323232;
|
||||
}
|
||||
QTabBar::tab:top:!selected
|
||||
{
|
||||
margin-top: 3px;
|
||||
}
|
||||
QTabBar::tab:bottom:!selected
|
||||
{
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
QTabBar::tab:top, QTabBar::tab:bottom
|
||||
{
|
||||
min-width: 8ex;
|
||||
margin-right: -1px;
|
||||
padding: 5px 10px 5px 10px;
|
||||
}
|
||||
QTabBar::tab:top:selected
|
||||
{
|
||||
border-bottom-color: none;
|
||||
}
|
||||
QTabBar::tab:bottom:selected
|
||||
{
|
||||
border-top-color: none;
|
||||
}
|
||||
QTabBar::tab:top:last, QTabBar::tab:bottom:last,
|
||||
QTabBar::tab:top:only-one, QTabBar::tab:bottom:only-one
|
||||
{
|
||||
margin-right: 0;
|
||||
}
|
||||
QTabBar::tab:left:!selected
|
||||
{
|
||||
margin-right: 3px;
|
||||
}
|
||||
QTabBar::tab:right:!selected
|
||||
{
|
||||
margin-left: 3px;
|
||||
}
|
||||
QTabBar::tab:left, QTabBar::tab:right
|
||||
{
|
||||
min-height: 8ex;
|
||||
margin-bottom: -1px;
|
||||
padding: 10px 5px 10px 5px;
|
||||
}
|
||||
QTabBar::tab:left:selected
|
||||
{
|
||||
border-left-color: none;
|
||||
}
|
||||
QTabBar::tab:right:selected
|
||||
{
|
||||
border-right-color: none;
|
||||
}
|
||||
QTabBar::tab:left:last, QTabBar::tab:right:last,
|
||||
QTabBar::tab:left:only-one, QTabBar::tab:right:only-one
|
||||
{
|
||||
margin-bottom: 0;
|
||||
}
|
||||
"""
|
||||
|
||||
menupage_g = """
|
||||
QListWidget {
|
||||
border-width: 0px;
|
||||
border-radius: 0px;
|
||||
border: none;
|
||||
padding: 0px;
|
||||
background-color: #242424;
|
||||
font: 10pt "Segoe UI";
|
||||
}
|
||||
QListWidget:item {
|
||||
padding-left: 10px;
|
||||
height: 60px;
|
||||
background-color: #191919;
|
||||
selection-color: rgba(255, 255, 255);
|
||||
}
|
||||
QListWidget:item:hover {
|
||||
background-color: #323232;
|
||||
}
|
||||
QListWidget:item:selected {
|
||||
background-color: #262728;
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
def centralwidget():
|
||||
return centralwidget_g if Config.get().theme == "Dark gray" else centralwidget_b
|
||||
|
||||
|
||||
def menupage():
|
||||
return menupage_g if Config.get().theme == "Dark gray" else menupage_b
|
||||
0
modules/__init__.py
Normal file
0
modules/__init__.py
Normal file
1
modules/config/__init__.py
Normal file
1
modules/config/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .settings import Config
|
||||
11
modules/config/model.py
Normal file
11
modules/config/model.py
Normal file
@@ -0,0 +1,11 @@
|
||||
from typing import Dict, List
|
||||
from dataclasses import dataclass
|
||||
from dataclasses_json import dataclass_json
|
||||
|
||||
|
||||
@dataclass_json
|
||||
@dataclass(frozen=True)
|
||||
class ConfigModel:
|
||||
database: str
|
||||
profile: str | None
|
||||
theme: str
|
||||
41
modules/config/settings.py
Normal file
41
modules/config/settings.py
Normal file
@@ -0,0 +1,41 @@
|
||||
from modules.config.model import ConfigModel
|
||||
import json
|
||||
|
||||
|
||||
class Config:
|
||||
@staticmethod
|
||||
def default():
|
||||
return {
|
||||
"database": "default.gtabase",
|
||||
"profile": None,
|
||||
"theme": "Dark gray"
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def fix() -> None:
|
||||
try:
|
||||
with open("config.cfg", "w") as file:
|
||||
json.dump(Config.default(), file)
|
||||
except FileNotFoundError:
|
||||
Config.fix()
|
||||
|
||||
@staticmethod
|
||||
def get() -> ConfigModel:
|
||||
try:
|
||||
with open("config.cfg", "r") as file:
|
||||
return ConfigModel.from_dict(json.load(file))
|
||||
except:
|
||||
Config.fix()
|
||||
return Config.get()
|
||||
|
||||
@staticmethod
|
||||
def update(key: str, value: str) -> dict:
|
||||
with open("config.cfg", "r") as file:
|
||||
settings = json.load(file)
|
||||
|
||||
settings[key] = value
|
||||
|
||||
with open("config.cfg", "w") as file:
|
||||
json.dump(settings, file)
|
||||
|
||||
return settings
|
||||
0
modules/core/__init__.py
Normal file
0
modules/core/__init__.py
Normal file
15
modules/core/exceptions.py
Normal file
15
modules/core/exceptions.py
Normal file
@@ -0,0 +1,15 @@
|
||||
from traceback import format_exception
|
||||
|
||||
|
||||
def hook(type_, value, traceback):
|
||||
print("[!] Error happened")
|
||||
print("Error type: ", type_.__name__)
|
||||
print("Error value: ", value)
|
||||
print("Error traceback: ", format_exception(type_, value, traceback)[2])
|
||||
|
||||
|
||||
def thread_hook(exception):
|
||||
print(f"[!] Error happened in {exception.thread}")
|
||||
print("Error type: ", exception.exc_type.__name__)
|
||||
print("Error value: ", exception.exc_value)
|
||||
print("Error traceback: ", format_exception(exception.exc_type, exception.exc_value, exception.exc_traceback)[2])
|
||||
2
modules/database/__init__.py
Normal file
2
modules/database/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from .model import DatabaseModel
|
||||
from .database import Database
|
||||
15
modules/database/database.py
Normal file
15
modules/database/database.py
Normal file
@@ -0,0 +1,15 @@
|
||||
import json
|
||||
from .model import DatabaseModel, default_database
|
||||
from modules.config import Config
|
||||
import os
|
||||
|
||||
|
||||
class Database:
|
||||
@staticmethod
|
||||
def get():
|
||||
try:
|
||||
return DatabaseModel.from_dict(json.load(open(Config.get().database)))
|
||||
except:
|
||||
with open(Config.get().database, 'w') as f:
|
||||
json.dump(default_database, f, indent=4)
|
||||
return DatabaseModel.from_dict(default_database)
|
||||
66
modules/database/model.py
Normal file
66
modules/database/model.py
Normal file
@@ -0,0 +1,66 @@
|
||||
from typing import Dict, List
|
||||
from dataclasses import dataclass
|
||||
from dataclasses_json import dataclass_json
|
||||
|
||||
|
||||
@dataclass_json
|
||||
@dataclass(frozen=True)
|
||||
class Item:
|
||||
item_name: str
|
||||
item_class: str
|
||||
item_type: str
|
||||
shop: str
|
||||
price: int
|
||||
image: str
|
||||
|
||||
|
||||
@dataclass_json
|
||||
@dataclass(frozen=True)
|
||||
class Profile:
|
||||
profile_name: str
|
||||
owned_items: List[str]
|
||||
|
||||
|
||||
@dataclass_json
|
||||
@dataclass(frozen=True)
|
||||
class DatabaseModel:
|
||||
items: Dict[str, Item] | None
|
||||
profiles: Dict[str, Profile] | None
|
||||
|
||||
|
||||
default_database = {
|
||||
"items": None,
|
||||
"profiles": None
|
||||
}
|
||||
|
||||
|
||||
aa = DatabaseModel.from_dict(
|
||||
{
|
||||
"items": {
|
||||
"sieg": {
|
||||
"item_name": "seig",
|
||||
"item_class": "meow",
|
||||
"item_type": "bebra44ka",
|
||||
"shop": "aaaaaaatb",
|
||||
"price": 100000000,
|
||||
"image": "https://magichitler.sieg/public/static/img/mama.png"
|
||||
},
|
||||
"aaaaaaaaaaaaa": {
|
||||
"item_name": "aaaaaaaaaaaaa",
|
||||
"item_class": "aaaaaaaaaaaaaaaaaaaa",
|
||||
"item_type": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"shop": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"price": 10000000000000000,
|
||||
"image": "https://sieg-heil.com/"
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"BarsTiger": {
|
||||
"profile_name": "BarsTiger",
|
||||
"owned_items": [
|
||||
"aaaaaaaaaaaaa"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
5
requirements.txt
Normal file
5
requirements.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
wheel
|
||||
PyQt5
|
||||
pyinstaller
|
||||
dataclasses-json
|
||||
requests
|
||||
Reference in New Issue
Block a user