This repository has been archived on 2021-04-14. You can view files and clone it, but cannot push or open issues or pull requests.
wikicookbook/WikiCookBook/wikicookbook.py

383 lines
12 KiB
Python

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QTableWidgetItem, QDialog
import WikiCookBook.UI as UI
from WikiCookBook.Model.Recipe import Recipe
from WikiCookBook.Writer.MoinMoinWriter import MoinMoinWriter
class AboutDialog(QDialog, UI.AboutDialog):
def __init__(self, *args, **kwargs):
super(AboutDialog, self).__init__(*args, **kwargs)
self.setupUi(self)
self.b_close.clicked.connect(self.close)
self.show()
class CloseDialog(QDialog, UI.CloseDialog):
def __init__(self, *args, **kwargs):
super(CloseDialog, self).__init__(*args, **kwargs)
self.setupUi(self)
self.b_yes.clicked.connect(self.accept)
self.b_no.clicked.connect(self.reject)
self.show()
class ClearDialog(QDialog, UI.ClearDialog):
def __init__(self, *args, **kwargs):
super(ClearDialog, self).__init__(*args, **kwargs)
self.setupUi(self)
self.b_yes.clicked.connect(self.accept)
self.b_no.clicked.connect(self.reject)
self.show()
class CodeDialog(QDialog, UI.CodeDialog):
def __init__(self, code, *args, **kwargs):
super(CodeDialog, self).__init__(*args, **kwargs)
self.setupUi(self)
self.copied = False
self.e_code.setPlainText(code)
self.b_close.clicked.connect(self.clear_fields)
self.b_copy.clicked.connect(self.copy)
self.show()
def copy(self):
self.e_code.selectAll()
self.e_code.copy()
self.copied = True
def clear_fields(self):
"""
Show the clear fields dialog if the code was at least copied once.
"""
if self.copied:
dialog = ClearDialog()
dialog.rejected.connect(self.reject)
dialog.accepted.connect(self.accept)
dialog.exec_()
else:
self.close()
class MainWindow(QMainWindow, UI.MainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setupUi(self)
# Connect close actions
self.b_cancel.clicked.connect(self.ask_close)
self.ma_close.triggered.connect(self.ask_close)
# Connect other menu actions
self.ma_information.triggered.connect(self.about)
self.ma_clear_fields.triggered.connect(self.clear_fields)
# Conncect recipe name typing
self.e_recipe_name.textChanged.connect(self.updateTitle)
# Handle categories
self.b_category_add.clicked.connect(self.category_add)
self.e_category.returnPressed.connect(self.category_add)
self.b_category_remove.clicked.connect(self.category_remove)
# Handle ingredients
self.b_ingredient_add.clicked.connect(self.ingredient_add)
self.b_ingredient_remove.clicked.connect(self.ingredient_remove)
# Handle utensils
self.b_utensil_add.clicked.connect(self.utensil_add)
self.e_utensil.returnPressed.connect(self.utensil_add)
self.b_utensil_remove.clicked.connect(self.utensil_remove)
# Handle steps
self.b_step_add.clicked.connect(self.step_add)
self.b_step_edit.clicked.connect(self.step_edit)
self.b_step_replace.clicked.connect(self.step_replace)
self.b_step_remove.clicked.connect(self.step_remove)
# Handle notes
self.b_note_add.clicked.connect(self.note_add)
self.b_note_edit.clicked.connect(self.note_edit)
self.b_note_replace.clicked.connect(self.note_replace)
self.b_note_remove.clicked.connect(self.note_remove)
# Handle tips
self.b_tip_add.clicked.connect(self.tip_add)
self.b_tip_edit.clicked.connect(self.tip_edit)
self.b_tip_replace.clicked.connect(self.tip_replace)
self.b_tip_remove.clicked.connect(self.tip_remove)
# Handle variations
self.b_variation_add.clicked.connect(self.variation_add)
self.b_variation_edit.clicked.connect(self.variation_edit)
self.b_variation_replace.clicked.connect(self.variation_replace)
self.b_variation_remove.clicked.connect(self.variation_remove)
# Handle ratings
self.b_rating_add.clicked.connect(self.rating_add)
self.b_rating_edit.clicked.connect(self.rating_edit)
self.b_rating_replace.clicked.connect(self.rating_replace)
self.b_rating_remove.clicked.connect(self.rating_remove)
# Handle recipe creation
self.b_create.clicked.connect(self.create_recipe)
self.show()
def updateTitle(self):
"""
Update the window title so it contains the name of the current recipe.
"""
current_recipe_name = self.e_recipe_name.text()
if current_recipe_name:
self.setWindowTitle(f"{current_recipe_name} - WikiCookBook")
else:
self.setWindowTitle("WikiCookBook")
def category_add(self):
if self.e_category.text():
self.v_categories.addItem(f"Kategorie{self.e_category.text()}")
self.e_category.setFocus()
self.e_category.selectAll()
def category_remove(self):
self.v_categories.takeItem(self.v_categories.currentRow())
def ingredient_add(self):
if self.e_ingredient.text():
if self.c_heading.checkState() == 2:
current_amount = QTableWidgetItem("----------")
else:
current_amount = QTableWidgetItem(self.e_amount.text())
current_ingredient = QTableWidgetItem(self.e_ingredient.text())
self.v_ingredients.setRowCount(self.v_ingredients.rowCount() + 1)
self.v_ingredients.setItem(self.v_ingredients.rowCount() - 1, 0, current_amount)
self.v_ingredients.setItem(self.v_ingredients.rowCount() - 1, 1, current_ingredient)
self.e_ingredient.setFocus()
self.e_ingredient.selectAll()
def ingredient_remove(self):
self.v_ingredients.removeRow(self.v_ingredients.currentRow())
def utensil_add(self):
if self.e_utensil.text():
self.v_utensils.addItem(self.e_utensil.text())
self.e_utensil.setFocus()
self.e_utensil.selectAll()
def utensil_remove(self):
self.v_utensils.takeItem(self.v_utensils.currentRow())
def step_add(self):
if self.e_step.toPlainText():
self.v_steps.addItem(self.e_step.toPlainText())
self.e_step.setFocus()
self.e_step.selectAll()
def step_edit(self):
if self.v_steps.count() > 0:
self.e_step.setText(self.v_steps.currentItem().text())
def step_replace(self):
if self.e_step.toPlainText() and self.v_steps.count() > 0:
self.v_steps.currentItem().setText(self.e_step.toPlainText())
def step_remove(self):
self.v_steps.takeItem(self.v_steps.currentRow())
def note_add(self):
if self.e_note.toPlainText():
self.v_notes.addItem(self.e_note.toPlainText())
self.e_note.setFocus()
self.e_note.selectAll()
def note_edit(self):
if self.v_notes.count() > 0:
self.e_note.setText(self.v_notes.currentItem().text())
def note_replace(self):
if self.e_note.toPlainText() and self.v_notes.count() > 0:
self.v_notes.currentItem().setText(self.e_note.toPlainText())
def note_remove(self):
self.v_notes.takeItem(self.v_notes.currentRow())
def tip_add(self):
if self.e_tip.toPlainText():
self.v_tips.addItem(self.e_tip.toPlainText())
self.e_tip.setFocus()
self.e_tip.selectAll()
def tip_edit(self):
if self.v_tips.count() > 0:
self.e_tip.setText(self.v_tips.currentItem().text())
def tip_replace(self):
if self.e_tip.toPlainText() and self.v_tips.count() > 0:
self.v_tips.currentItem().setText(self.e_tip.toPlainText())
def tip_remove(self):
self.v_tips.takeItem(self.v_tips.currentRow())
def variation_add(self):
if self.e_variation.toPlainText():
self.v_variations.addItem(self.e_variation.toPlainText())
self.e_variation.setFocus()
self.e_variation.selectAll()
def variation_edit(self):
if self.v_variations.count() > 0:
self.e_variation.setText(self.v_variations.currentItem().text())
def variation_replace(self):
if self.e_variation.toPlainText() and self.v_variations.count() > 0:
self.v_variations.currentItem().setText(self.e_variation.toPlainText())
def variation_remove(self):
self.v_variations.takeItem(self.v_variations.currentRow())
def rating_add(self):
if self.e_rating.toPlainText():
self.v_ratings.addItem(self.e_rating.toPlainText())
self.e_rating.setFocus()
self.e_rating.selectAll()
def rating_edit(self):
if self.v_ratings.count() > 0:
self.e_rating.setText(self.v_ratings.currentItem().text())
def rating_replace(self):
if self.e_rating.toPlainText() and self.v_ratings.count() > 0:
self.v_ratings.currentItem().setText(self.e_rating.toPlainText())
def rating_remove(self):
self.v_ratings.takeItem(self.v_ratings.currentRow())
def create_recipe(self):
current_recipe = Recipe(self.e_recipe_name.text(),
self.e_servings.text(),
self.e_time.text(),
self.e_rating_overall.value(),
self.e_url.text())
# Categories
for row in range(self.v_categories.count()):
current_recipe.add_category(self.v_categories.item(row).text())
# Ingredients
for row in range(self.v_ingredients.rowCount()):
current_recipe.add_ingredient(
self.v_ingredients.item(row, 0).text(),
self.v_ingredients.item(row, 1).text()
)
# Utensils
for row in range(self.v_utensils.count()):
current_recipe.add_utensil(self.v_utensils.item(row).text())
# Steps
for row in range(self.v_steps.count()):
current_recipe.add_step(self.v_steps.item(row).text())
# Notes
for row in range(self.v_notes.count()):
current_recipe.add_note(self.v_notes.item(row).text())
# Tips
for row in range(self.v_tips.count()):
current_recipe.add_tip(self.v_tips.item(row).text())
# Variations
for row in range(self.v_variations.count()):
current_recipe.add_variation(self.v_variations.item(row).text())
# Ratings
for row in range(self.v_ratings.count()):
current_recipe.add_rating(self.v_ratings.item(row).text())
writer = MoinMoinWriter()
code = current_recipe.wikicode(writer)
dialog = CodeDialog(code)
dialog.accepted.connect(self.clear)
dialog.exec_()
def clear(self):
"""
Clear all fields
"""
# Tab: Basics
self.e_recipe_name.setText("")
self.e_servings.setText("")
self.e_time.setText("")
self.e_rating_overall.setValue(3)
self.e_url.setText("")
self.e_category.setText("")
self.v_categories.clear()
# Tab: Ingredients
self.e_ingredient.setText("")
self.e_amount.setText("")
self.c_heading.setChecked(False)
self.v_ingredients.clear()
# Tab: Utensils
self.e_utensil.setText("")
self.v_utensils.clear()
# Tab: Steps
self.e_step.setText("")
self.v_steps.clear()
# Tab: Notes
self.e_note.setText("")
self.v_notes.clear()
# Tab: Tips
self.e_tip.setText("")
self.v_tips.clear()
# Tab: Variations
self.e_variation.setText("")
self.v_variations.clear()
# Tab: Ratings
self.e_rating.setText("")
self.v_ratings.clear()
def clear_fields(self):
"""
Show the clear fields dialog.
"""
dialog = ClearDialog()
dialog.accepted.connect(self.clear)
dialog.exec_()
def about(self):
"""
Show an about dialog.
"""
dialog = AboutDialog()
dialog.exec_()
def ask_close(self):
"""
Close the application. A warning is shown before.
"""
dialog = CloseDialog()
dialog.accepted.connect(self.close)
dialog.exec_()
def main():
app = QApplication([])
app.setApplicationName("WikiCookBook")
window = MainWindow()
return app.exec_()