Files
shikimori_list_viewer/window.py
2024-01-01 22:02:15 +07:00

177 lines
7.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
QMainWindow, QListWidgetItem, QFileDialog, QMessageBox
)
from form import Ui_MainWindow
from jsonIO import jsonIO
statuses = {
"none": "",
"planned": "Запланировано",
"watching": "Смотрю",
"rewatching": "Пересматриваю",
"completed": "Просмотрено",
"on_hold": "Отложено",
"dropped": "Брошено"
}
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
QMainWindow.__init__(self, parent, flags=Qt.Window)
Ui_MainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# self.file_list = jsonIO.load_json("JDM17_animes.json")
# for data in self.file_list:
# item = QListWidgetItem(data["target_title_ru"])
# item.setData(1, data["target_id"])
# self.ui.anime_list.addItem(item)
self.file_path = ""
self.file_list = []
for key, value in statuses.items():
self.ui.status.addItem(value, key)
self.ui.anime_list.currentItemChanged.connect(self.show_title_info)
self.ui.actionOpenFile.triggered.connect(self.action_open_file)
self.ui.actionSaveFile.triggered.connect(self.action_save_file)
self.ui.actionCloseFile.triggered.connect(self.action_close_file)
self.ui.actionExit.triggered.connect(self.action_close_window)
self.ui.actionAddTitle.triggered.connect(self.action_add_title)
self.ui.actionAddByID.triggered.connect(self.action_add_by_id)
self.ui.actionRemoveTitle.triggered.connect(self.action_remove_title)
@staticmethod
def show_question(title, text):
box = QMessageBox(QMessageBox.Question, title, text)
box.addButton("Да", QMessageBox.YesRole) # 0
box.addButton("Нет", QMessageBox.NoRole) # 1
return box.exec() == 0
def find_title(self, target_id):
for data in self.file_list:
if data["target_id"] == target_id:
return data
def check_changes(self, target_id):
tbl_to_check = {
"score": self.ui.score.value(),
"status": self.ui.status.itemData(self.ui.status.currentIndex()),
"episodes": self.ui.episodes.value(),
"rewatches": self.ui.rewatches.value(),
# TODO: fix this shit with "" or None
"text": self.ui.note.toPlainText()
# "text": self.ui.note.toPlainText() if len(self.ui.note.toPlainText()) > 0 else None
}
title_data = self.find_title(target_id)
for key, value in tbl_to_check.items():
if title_data[key] != value:
return True
return False
def save_changes(self, target_id):
title_data = self.find_title(target_id)
title_data["score"] = self.ui.score.value()
status_code = self.ui.status.itemData(self.ui.status.currentIndex())
if status_code == "none":
QMessageBox.warning(self, "Предупреждение", "Выбран неверный статус, он не будет сохранен.")
else:
title_data["status"] = status_code
title_data["episodes"] = self.ui.episodes.value()
title_data["rewatches"] = self.ui.rewatches.value()
title_data["text"] = self.ui.note.toPlainText()
def clear_fields(self):
self.ui.target_title.clear()
self.ui.target_title_ru.clear()
self.ui.score.setValue(0)
self.ui.status.setCurrentIndex(self.ui.status.findData("none"))
self.ui.episodes.setValue(0)
self.ui.rewatches.setValue(0)
self.ui.note.clear()
def show_title_info(self, current, previous):
if current is None:
return
if previous is not None:
previous_id = previous.data(1)
if self.check_changes(previous_id):
if self.show_question("Подтверждение", "Сохранить изменения?"):
self.save_changes(previous_id)
self.clear_fields()
data = self.find_title(current.data(1))
self.ui.target_title.setText(data["target_title"])
self.ui.target_title_ru.setText(data["target_title_ru"])
self.ui.score.setValue(data["score"])
self.ui.status.setCurrentIndex(self.ui.status.findData(data["status"]))
self.ui.episodes.setValue(data["episodes"])
self.ui.rewatches.setValue(data["rewatches"])
self.ui.note.setText(data["text"])
def action_open_file(self):
file_path, file_name = QFileDialog.getOpenFileName(parent=self,
caption=self.tr("Выберите ваш файл со списком"),
filter=self.tr("*.json"))
if file_path == "":
return
if jsonIO.is_valid_json(file_path):
self.clear_fields()
self.file_path = file_path
self.file_list = jsonIO.load_json(file_path)
for data in self.file_list:
if data["target_type"] == "Anime":
item = QListWidgetItem(data["target_title_ru"])
item.setData(1, data["target_id"])
self.ui.anime_list.addItem(item)
def action_save_file(self):
if self.file_path == "":
QMessageBox.critical(self, "Ошибка", "Сначала откройте список!")
return
if jsonIO.save_json(self.file_path, self.file_list):
QMessageBox.information(self, "Успешно", "Файл успешно сохранен.")
else:
QMessageBox.critical(self, "Ошибка", "Что-то пошло не так! Попробуйте еще раз.")
def action_close_file(self):
if self.file_path == "":
QMessageBox.critical(self, "Ошибка", "Сначала откройте список!")
return
self.file_path = ""
self.file_list = []
self.ui.anime_list.clear()
self.clear_fields()
def action_close_window(self):
self.close()
def action_add_title(self):
pass
def action_add_by_id(self):
pass
def action_remove_title(self):
if self.file_path == "":
QMessageBox.critical(self, "Ошибка", "Сначала откройте список!")
return
selectedItem = self.ui.anime_list.currentItem()
if selectedItem is None:
QMessageBox.critical(self, "Ошибка", "Выберите тайтл из списка!")
return
target_id = selectedItem.data(1)
title_name = self.find_title(target_id)["target_title_ru"]
if self.show_question("Подтверждение", "Вы действительно хотите удалить '{}'?".format(title_name)):
self.ui.anime_list.takeItem(self.ui.anime_list.currentRow())
for data in self.file_list:
if data["target_id"] == target_id:
self.file_list.remove(data)
QMessageBox.information(self, "Успешно", "Тайтл '{}' успешно удален из списка!".format(title_name))