feat(gui): display inventory

This commit is contained in:
Kristofers Solo 2023-11-08 12:33:25 +02:00
parent 3ef55892da
commit 74ee80337d
5 changed files with 39 additions and 50 deletions

View File

@ -1,10 +1,16 @@
#!/usr/bin/env python3
from pathlib import Path
from bookstore.inventory import Inventory
from ui.app import App
def main() -> None:
app = App()
db_path = Path("db.sqlite3")
inventory = Inventory(db_path)
app = App(inventory)
app.run()

View File

@ -1,9 +1,34 @@
import npyscreen as nps
from .forms import AddBookForm, BookForm
import customtkinter as ctk
from bookstore.book import Book
from bookstore.inventory import Inventory
class App(nps.NPSAppManaged):
def onStart(self):
self.addForm("MAIN", BookForm, name="Bookstore")
self.addForm("ADD_BOOK", AddBookForm, name="Add Book")
class App(ctk.CTk):
def __init__(self, inventory: Inventory, *args, **kwargs) -> None:
super(App, self).__init__(*args, **kwargs)
self.inventory = inventory
self.geometry("600x400")
self.title("Bookstore")
ctk.set_appearance_mode("system")
self.resizable(width=True, height=True)
self.data = inventory.list_all()
self.display_table()
def display_table(self) -> None:
headers = Book.fields()
for col, header in enumerate(headers):
label = ctk.CTkLabel(self, text=header)
label.grid(row=0, column=col, padx=10, pady=5)
widths = [100, 100, 100, 100, 100]
for row, book in enumerate(self.data, start=1):
for col, value in enumerate(book):
entry = ctk.CTkLabel(self, width=widths[col], text=value)
entry.grid(row=row, column=col, padx=10, pady=5)
def run(self) -> None:
self.mainloop()

View File

@ -1,24 +0,0 @@
import npyscreen as nps
from bookstore.book import Book
from .utils import INVENTORY
from .widget import BookGrid
class BookForm(nps.FormBaseNew):
def create(self):
self.grid = self.add_widget(BookGrid, columns=5, select_whole_line=True, col_titles=Book.fields())
self.grid.values = [book.values() for book in INVENTORY.list_all()]
class AddBookForm(nps.ActionForm):
def create(self):
self.isbn = self.add(nps.TitleText, name="ISBN:")
self.title = self.add(nps.TitleText, name="Title:")
self.author = self.add(nps.TitleText, name="Author:")
self.price = self.add(nps.TitleText, name="Price:")
self.stock = self.add(nps.TitleText, name="Stock:")
def on_ok(self):
book = Book(self.isbn.value, self.title.value, self.author.value, self.price.value, self.stock.value)
INVENTORY.add(book)

View File

@ -1,5 +0,0 @@
from pathlib import Path
from bookstore.inventory import Inventory
INVENTORY = Inventory(Path("db.sqlite3"))

View File

@ -1,13 +0,0 @@
import npyscreen as nps
class BookGrid(nps.GridColTitles):
def custom_print_cell(self, actual_cell, cell_display_value):
if actual_cell == 4:
if int(cell_display_value) == 0:
actual_cell.color = "DANGER"
elif int(cell_display_value) < 5:
actual_cell.color = "WARNING"
else:
actual_cell.color = "DEFAULT"
return super().custom_print_cell(actual_cell, cell_display_value)