Skip to content

Commit e69e49c

Browse files
committed
feat: Реализовал изменение параметров игры и исправил сортировку игр в списке
1 parent 2a48293 commit e69e49c

File tree

5 files changed

+437
-5
lines changed

5 files changed

+437
-5
lines changed

db.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,32 @@ def edit_games_category(self, category_id_old, category_id_new):
129129
finally:
130130
conn.close()
131131

132+
def check_category_id_is_valid(self):
133+
conn = self.get_connection()
134+
cursor = conn.cursor()
135+
try:
136+
cursor.execute("SELECT id FROM Categories")
137+
valid_category_ids = {row[0] for row in cursor.fetchall()}
138+
139+
cursor.execute(
140+
"SELECT id, name, category_id FROM Games WHERE category_id NOT IN ({})".format(
141+
','.join('?' for _ in valid_category_ids)
142+
), list(valid_category_ids))
143+
144+
invalid_games = cursor.fetchall()
145+
146+
for game_id, game_name, old_category_id in invalid_games:
147+
cursor.execute(
148+
"UPDATE Games SET category_id = ? WHERE id = ?",
149+
(1, game_id)
150+
)
151+
152+
conn.commit()
153+
except Exception as e:
154+
print(f"Ошибка при проверке категорий: {e}")
155+
finally:
156+
conn.close()
157+
132158
def get_categories(self):
133159
conn = self.get_connection()
134160
cursor = conn.cursor()
@@ -186,5 +212,20 @@ def get_game(self, name):
186212
conn.close()
187213
return row
188214

215+
def update_game(self, old_name, new_name, category_id):
216+
conn = self.get_connection()
217+
cursor = conn.cursor()
218+
try:
219+
cursor.execute(
220+
"UPDATE Games SET name = ?, category_id = ? WHERE name = ?",
221+
(new_name, category_id, old_name),
222+
)
223+
conn.commit()
224+
except Exception as e:
225+
print(str(e))
226+
227+
finally:
228+
conn.close()
229+
189230

190231
database = Database()

dialogs.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from ui.add_game_dialog import Ui_Dialog as AddGameUI
55
from ui.createCategory import Ui_Dialog as AddCategoryUI
66
from ui.deleteCategory import Ui_Dialog as DeleteCategoryUI
7+
from ui.edit_game_dialog_ui import Ui_Dialog as EditGameUI
78

89

910
class AddGameDialog(QDialog, AddGameUI):
@@ -72,6 +73,73 @@ def accept_dialog(self):
7273
f"Не удалось добавить игру: {str(e)}")
7374

7475

76+
class EditGameDialog(QDialog, EditGameUI):
77+
def __init__(self, game_name):
78+
super().__init__()
79+
self.orig_game_name = game_name
80+
self.setFixedSize(450, 180)
81+
82+
self.setupUi(self)
83+
84+
self.buttonBox.accepted.disconnect()
85+
self.buttonBox.rejected.disconnect()
86+
87+
self.get_categories()
88+
self.load_game_data()
89+
90+
self.path_button.setDisabled(True)
91+
92+
self.buttonBox.accepted.connect(self.accept_dialog)
93+
self.buttonBox.rejected.connect(self.reject)
94+
95+
def get_categories(self):
96+
combobox = self.comboBox
97+
categories = database.get_categories()
98+
for category in categories:
99+
combobox.addItem(category[0])
100+
101+
def load_game_data(self):
102+
game_data = database.get_game(self.orig_game_name)
103+
if game_data:
104+
self.game_name.setText(game_data[1]) # name
105+
self.file_path.setText(game_data[2]) # path
106+
107+
# Устанавливаем правильную категорию
108+
category_name = database.get_category_name_by_id(game_data[3])
109+
index = self.comboBox.findText(category_name)
110+
if index >= 0:
111+
self.comboBox.setCurrentIndex(index)
112+
113+
def accept_dialog(self):
114+
new_game_name = self.game_name.text().strip()
115+
category_id = database.get_category_id_by_name(
116+
self.comboBox.currentText())
117+
118+
if not new_game_name:
119+
QMessageBox.warning(self, "Ошибка", "Введите название игры")
120+
return
121+
122+
if not category_id:
123+
category_id = 1
124+
125+
# Проверяем уникальность имени, только если имя изменилось
126+
if new_game_name != self.orig_game_name and not database.check_name_is_unique(
127+
new_game_name):
128+
QMessageBox.warning(self, "Ошибка",
129+
"Игра с таким именем уже существует")
130+
return
131+
132+
try:
133+
database.update_game(self.orig_game_name, new_game_name,
134+
category_id)
135+
self.accept()
136+
QMessageBox.information(self, "Успех", "Игра обновлена!")
137+
138+
except Exception as e:
139+
QMessageBox.critical(self, "Ошибка",
140+
f"Не удалось обновить игру: {str(e)}")
141+
142+
75143
class AddCategoryDialog(QDialog, AddCategoryUI):
76144
def __init__(self):
77145
super().__init__()

main.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212

1313
def resource_path(relative_path: str) -> str:
14-
"""Корректный путь к файлу для работы из .py и из .exe"""
1514
if hasattr(sys, "_MEIPASS"):
1615
return os.path.join(sys._MEIPASS, relative_path)
1716
return os.path.join(os.path.abspath("."), relative_path)
@@ -30,6 +29,8 @@ def __init__(self):
3029

3130
self.update_menu_bar()
3231

32+
database.check_category_id_is_valid()
33+
3334
theme_file = resource_path(f"style/{json_editor.get_theme()}.qss")
3435
with open(theme_file, "r", encoding="utf-8") as qss:
3536
self.setStyleSheet(qss.read())
@@ -47,6 +48,7 @@ def __init__(self):
4748
self.delete_category.triggered.connect(
4849
lambda: self.open_dialog("delete_category")
4950
)
51+
self.edit_game.clicked.connect(lambda: self.open_dialog("edit_game"))
5052

5153
def set_theme(self, theme):
5254
theme_file = resource_path(f"style/{theme}.qss")
@@ -67,11 +69,15 @@ def update_last_game_list(self):
6769
self.last_games.addItem(game)
6870

6971
def sort_games(self, mode):
70-
games = database.get_games()
71-
sorted_games = sorted(games, reverse=(mode == "r"))
72+
items = []
73+
for i in range(self.list_games.count()):
74+
items.append(self.list_games.item(i).text())
75+
76+
sorted_items = sorted(items, reverse=(mode == "r"))
77+
7278
self.list_games.clear()
73-
for game in sorted_games:
74-
self.list_games.addItem(game)
79+
for game_name in sorted_items:
80+
self.list_games.addItem(game_name)
7581

7682
def delete_game_from_list(self):
7783
current_item = self.list_games.currentItem()
@@ -104,6 +110,13 @@ def open_dialog(self, dialog):
104110
_dialog = dialogs.DeleteCategoryDialog()
105111
_dialog.exec()
106112
self.update_menu_bar()
113+
if dialog == "edit_game":
114+
current_item = self.list_games.currentItem()
115+
if current_item:
116+
game_name = current_item.text()
117+
_dialog = dialogs.EditGameDialog(game_name)
118+
_dialog.exec()
119+
self.update_game_list()
107120

108121
def update_menu_bar(self):
109122
menu = self.menu_3

0 commit comments

Comments
 (0)