From e01fb0efd1b71ec4d0b40336a1c52c6ca0bcb25e Mon Sep 17 00:00:00 2001 From: BarsTiger Date: Fri, 5 Aug 2022 23:01:21 +0300 Subject: [PATCH] adding item --- GtaBuyBaseGui.py | 4 +- gui/gui.py | 15 +++++++ gui/gui.ui | 43 +++++++++++++++++++ gui/modules/adding_item/on_add_click.py | 57 +++++++++++++++++++++++++ gui/modules/adding_item/write_item.py | 17 ++++++++ gui/modules/core/items_list.py | 8 +++- gui/modules/handlers/fill_info.py | 8 +++- gui/modules/handlers/register.py | 3 ++ gui/modules/initialize/setup_ui.py | 2 + modules/database/database.py | 18 ++++++-- modules/database/model.py | 2 +- 11 files changed, 166 insertions(+), 11 deletions(-) create mode 100644 gui/modules/adding_item/write_item.py diff --git a/GtaBuyBaseGui.py b/GtaBuyBaseGui.py index 34c0106..a6c6916 100644 --- a/GtaBuyBaseGui.py +++ b/GtaBuyBaseGui.py @@ -6,8 +6,8 @@ from gui.modules.initialize import setup_ui from gui.modules.handlers.register import register_handlers import sys -sys.excepthook = hook -threading.excepthook = thread_hook +# sys.excepthook = hook +# threading.excepthook = thread_hook app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() diff --git a/gui/gui.py b/gui/gui.py index 1dccbee..3518b3f 100644 --- a/gui/gui.py +++ b/gui/gui.py @@ -364,6 +364,20 @@ class Ui_MainWindow(object): spacerItem15 = QtWidgets.QSpacerItem(20, 154, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_11.addItem(spacerItem15) self.adding_item_main_layout.addWidget(self.new_item_image_page) + self.new_item_finish_page = QtWidgets.QWidget() + self.new_item_finish_page.setObjectName("new_item_finish_page") + self.verticalLayout_12 = QtWidgets.QVBoxLayout(self.new_item_finish_page) + self.verticalLayout_12.setObjectName("verticalLayout_12") + spacerItem16 = QtWidgets.QSpacerItem(20, 176, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_12.addItem(spacerItem16) + self.new_item_finish_label = QtWidgets.QLabel(self.new_item_finish_page) + self.new_item_finish_label.setStyleSheet("font: 16pt \"Segoe UI\";") + self.new_item_finish_label.setWordWrap(True) + self.new_item_finish_label.setObjectName("new_item_finish_label") + self.verticalLayout_12.addWidget(self.new_item_finish_label) + spacerItem17 = QtWidgets.QSpacerItem(20, 175, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_12.addItem(spacerItem17) + self.adding_item_main_layout.addWidget(self.new_item_finish_page) self.verticalLayout_5.addWidget(self.adding_item_main_layout) self.content.addWidget(self.add_page) self.verticalLayout_4.addWidget(self.content) @@ -406,6 +420,7 @@ class Ui_MainWindow(object): self.new_item_shop_label.setText(_translate("MainWindow", "Choose website, where you can get this item")) self.new_item_image_label.setText(_translate("MainWindow", "Paste here URL of image with item")) self.new_item_image_box.setPlaceholderText(_translate("MainWindow", "https://www.gtabase.com/images/jch-optimize/ng/images_gta-5_vehicles_planes_main_luxor-deluxe.webp")) + self.new_item_finish_label.setText(_translate("MainWindow", "Fill all fields first")) import gui.images_rc diff --git a/gui/gui.ui b/gui/gui.ui index c682dcf..8b25427 100644 --- a/gui/gui.ui +++ b/gui/gui.ui @@ -1259,6 +1259,49 @@ p, li { white-space: pre-wrap; } + + + + + + Qt::Vertical + + + + 20 + 176 + + + + + + + + font: 16pt "Segoe UI"; + + + Fill all fields first + + + true + + + + + + + Qt::Vertical + + + + 20 + 175 + + + + + + diff --git a/gui/modules/adding_item/on_add_click.py b/gui/modules/adding_item/on_add_click.py index e69de29..fbfa938 100644 --- a/gui/modules/adding_item/on_add_click.py +++ b/gui/modules/adding_item/on_add_click.py @@ -0,0 +1,57 @@ +from gui.gui import Ui_MainWindow +from gui.modules.adding_item.write_item import add_item_if_can +from data import common + + +def on_add_button_click(ui: Ui_MainWindow): + sender_page = ui.content.currentWidget() + + ui.content.setCurrentWidget(ui.add_page) + ui.adding_item_main_layout.setCurrentIndex(0) + + ui.new_item_finish_label.setText("Fill all fields first") + + ui.new_item_name_box.clear() + ui.new_item_price_box.setValue(0) + ui.new_item_class_box.clear() + ui.new_item_type_box.clear() + ui.new_item_type_box.addItem("Other") + ui.new_item_shop_box.clear() + ui.new_item_image_box.clear() + + ui.new_item_class_box.addItems(common.items_class) + ui.new_item_class_box.setCurrentIndex(len(common.items_class) - 1) + ui.new_item_class_box.currentIndexChanged.connect( + lambda: ( + ui.new_item_type_box.clear(), + ui.new_item_type_box.addItems( + common.vehicle_type if ui.new_item_class_box.currentText() == "Vehicle" + else common.property_type if ui.new_item_class_box.currentText() == "Property" + else ["Other"] + ) + ) + ) + ui.new_item_shop_box.addItems(common.shop_sites) + ui.new_item_shop_box.setCurrentIndex(len(common.shop_sites) - 1) + + ui.next_adding_item_button.clicked.connect( + lambda: ( + ui.adding_item_main_layout.setCurrentIndex( + (lambda x: x if x <= ui.adding_item_main_layout.count() else ui.adding_item_main_layout.count()) + (ui.adding_item_main_layout.currentIndex() + 1)), + ui.new_item_finish_label.setText("Item registered. Press exit button on left side" if + ui.new_item_name_box.text() != "" and + ui.new_item_price_box.value() != 0 + else "Fill all fields first! (Image is not required)" + ), + add_item_if_can(ui) + ) + ) + + ui.back_adding_item_button.clicked.connect( + lambda: ui.adding_item_main_layout.setCurrentIndex( + (lambda x: x if x >= 0 else 0)(ui.adding_item_main_layout.currentIndex() - 1) + ) + ) + + ui.cancel_adding_item_button.clicked.connect(lambda: ui.content.setCurrentWidget(sender_page)) diff --git a/gui/modules/adding_item/write_item.py b/gui/modules/adding_item/write_item.py new file mode 100644 index 0000000..6ea3554 --- /dev/null +++ b/gui/modules/adding_item/write_item.py @@ -0,0 +1,17 @@ +from modules.database import Database +from modules.database.model import Item +from gui.gui import Ui_MainWindow + + +def add_item_if_can(ui: Ui_MainWindow): + if {"", 0} & {ui.new_item_name_box.text(), ui.new_item_price_box.value()}: + return + + Database.add_item(Item( + ui.new_item_name_box.text(), + ui.new_item_class_box.currentText(), + ui.new_item_type_box.currentText(), + ui.new_item_shop_box.currentText(), + ui.new_item_price_box.value(), + ui.new_item_image_box.text() if ui.new_item_image_box.text() != "" else None + )) diff --git a/gui/modules/core/items_list.py b/gui/modules/core/items_list.py index 81f425d..3db1925 100644 --- a/gui/modules/core/items_list.py +++ b/gui/modules/core/items_list.py @@ -14,8 +14,12 @@ def refill_list(ui: Ui_MainWindow): 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)) + try: + pixmap.loadFromData(requests.get(item.image).content) + list_item.setIcon(QtGui.QIcon(pixmap)) + except Exception as e: + print(f"Failed to load {item.image}, {e}") + ui.items_list.addItem(list_item) else: diff --git a/gui/modules/handlers/fill_info.py b/gui/modules/handlers/fill_info.py index 8e452d3..53c8588 100644 --- a/gui/modules/handlers/fill_info.py +++ b/gui/modules/handlers/fill_info.py @@ -11,8 +11,12 @@ def on_item_click(ui: Ui_MainWindow, mode: str): ] pixmap = QtGui.QPixmap() - pixmap.loadFromData(requests.get(item.image).content) - ui.properties_image.setPixmap(pixmap) + try: + pixmap.loadFromData(requests.get(item.image).content) + ui.properties_image.setPixmap(pixmap) + except Exception as e: + ui.properties_image.clear() + print(f"Failed to load {item.image}, {e}") ui.properties_name.setText(item.item_name) ui.properties_price.setText(f'${"{:,}".format(item.price)}') diff --git a/gui/modules/handlers/register.py b/gui/modules/handlers/register.py index 3ad54c8..18a1732 100644 --- a/gui/modules/handlers/register.py +++ b/gui/modules/handlers/register.py @@ -1,6 +1,7 @@ from gui.gui import Ui_MainWindow from gui.modules.handlers import fill_info from gui.modules.handlers import on_item_remove +from gui.modules.adding_item import on_add_click def register_handlers(ui: Ui_MainWindow): @@ -8,3 +9,5 @@ def register_handlers(ui: Ui_MainWindow): ui.items_list.itemDoubleClicked.connect(lambda: fill_info.on_item_click(ui, 'close')) ui.delete_item_button.clicked.connect(lambda: on_item_remove.on_rm_click(ui)) + + ui.add_item_button.clicked.connect(lambda: on_add_click.on_add_button_click(ui)) diff --git a/gui/modules/initialize/setup_ui.py b/gui/modules/initialize/setup_ui.py index 59b3e1f..0ea6ac4 100644 --- a/gui/modules/initialize/setup_ui.py +++ b/gui/modules/initialize/setup_ui.py @@ -5,6 +5,7 @@ from PyQt5.QtWidgets import QMainWindow from modules.config import Config from gui.modules.core import items_list from modules.database import Database +from modules.database.model import Item def on_load(ui: Ui_MainWindow, MainWindow: QMainWindow): @@ -18,3 +19,4 @@ def on_load(ui: Ui_MainWindow, MainWindow: QMainWindow): GlobalBlur(MainWindow.winId(), acrylic=True) items_list.refill_list(ui) + Database.add_item(Item("aa", "aa", "aa", "aa", 10, "aa")) diff --git a/modules/database/database.py b/modules/database/database.py index ce38bf0..6f91a26 100644 --- a/modules/database/database.py +++ b/modules/database/database.py @@ -1,7 +1,6 @@ import json -from .model import DatabaseModel, default_database +from modules.database.model import DatabaseModel, default_database, Item from modules.config import Config -import os class Database: @@ -14,10 +13,21 @@ class Database: json.dump(default_database, f, indent=4) return DatabaseModel.from_dict(default_database) + @staticmethod + def write(db: DatabaseModel): + with open(Config.get().database, 'w') as f: + json.dump(db.to_dict(), f, indent=4, sort_keys=True) + @staticmethod def remove_item(item_name: str): db = Database.get() db.items.pop(item_name) - with open(Config.get().database, 'w') as f: - json.dump(db.to_dict(), f, indent=4) + Database.write(db) + + @staticmethod + def add_item(item: Item): + db = Database.get() + db.items[item.item_name] = item + + Database.write(db) diff --git a/modules/database/model.py b/modules/database/model.py index 11c7dd6..157d02f 100644 --- a/modules/database/model.py +++ b/modules/database/model.py @@ -11,7 +11,7 @@ class Item: item_type: str shop: str price: int - image: str + image: str | None @dataclass_json