You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ffx/bin/ffx/show_details_screen.py

253 lines
6.8 KiB
Python

import click
from textual import events
from textual.app import App, ComposeResult
from textual.screen import Screen
from textual.widgets import Header, Footer, Placeholder, Label, ListView, ListItem, Static, DataTable, Button, Input
from textual.containers import Grid, Horizontal
from ffx.model.show import Show
from ffx.model.pattern import Pattern
from .pattern_details_screen import PatternDetailsScreen
from .pattern_delete_screen import PatternDeleteScreen
# Screen[dict[int, str, int]]
class ShowDetailsScreen(Screen):
CSS = """
Grid {
grid-size: 2;
grid-rows: 2 auto;
grid-columns: 30 330;
height: 100%;
width: 100%;
padding: 1;
}
Input {
border: none;
}
Button {
border: none;
}
DataTable {
column-span: 2;
min-height: 5;
}
#toplabel {
height: 1;
column-span: 2;
}
#two {
column-span: 2;
row-span: 2;
tint: magenta 40%;
}
.box {
height: 100%;
border: solid green;
}
"""
BINDINGS = [
#("e", "edit_show", "Edit Show"),
("a", "add_pattern", "Add Pattern"),
("r", "remove_pattern", "Remove Pattern"),
]
def __init__(self, show = {}):
super().__init__()
self.context = self.app.getContext()
self.Session = self.context['database_session'] # convenience
self.show_obj = show
def loadPatterns(self, show_id):
try:
s = self.Session()
q = s.query(Pattern).filter(Pattern.show_id == int(show_id))
return [{'id': int(p.id), 'pattern': p.pattern} for p in q.all()]
except Exception as ex:
click.ClickException(f"loadPatterns(): {repr(ex)}")
finally:
s.close()
def on_mount(self):
if self.show_obj:
self.query_one("#id_wdg", Static).update(str(self.show_obj['id']))
self.query_one("#name_input", Input).value = str(self.show_obj['name'])
self.query_one("#year_input", Input).value = str(self.show_obj['year'])
for pattern in self.loadPatterns(int(self.show_obj['id'])):
row = (pattern['pattern'],)
self.patternTable.add_row(*map(str, row))
def getSelectedPattern(self):
# Fetch the currently selected row when 'Enter' is pressed
#selected_row_index = self.table.cursor_row
row_key, col_key = self.patternTable.coordinate_to_cell_key(self.patternTable.cursor_coordinate)
selectedPattern = {}
if row_key is not None:
selected_row_data = self.patternTable.get_row(row_key)
selectedPattern['pattern'] = selected_row_data[0]
#selectedPattern['pattern'] = selected_row_data[1]
return selectedPattern
def action_add_pattern(self):
if self.show_obj:
self.app.push_screen(PatternDetailsScreen(show = self.show_obj), self.handle_add_pattern)
def handle_add_pattern(self, screenResult):
pattern = (screenResult['pattern'],)
self.patternTable.add_row(*map(str, pattern))
def action_remove_pattern(self):
selectedPattern = self.getSelectedPattern()
if selectedPattern:
self.app.push_screen(PatternDeleteScreen(pattern = selectedPattern, show = self.show_obj), self.handle_remove_pattern)
def handle_remove_pattern(self, screenResult):
row_key, col_key = self.patternTable.coordinate_to_cell_key(self.patternTable.cursor_coordinate)
self.patternTable.remove_row(row_key)
def compose(self):
# Create the DataTable widget
self.patternTable = DataTable()
# Define the columns with headers
self.column_key_id = self.patternTable.add_column("Pattern", width=60)
#self.column_key_name = self.patternTable.add_column("Name", width=50)
#self.column_key_year = self.patternTable.add_column("Year", width=10)
self.patternTable.cursor_type = 'row'
yield Header()
with Grid():
yield Static("Show" if self.show_obj else "New Show", id="toplabel")
yield Static("ID")
if self.show_obj:
yield Static("", id="id_wdg")
else:
yield Input(type="integer", id="id_wdg")
yield Static("Name")
yield Input(type="text", id="name_input")
yield Static("Year")
yield Input(type="integer", id="year_input")
yield Static("")
yield Static("")
yield self.patternTable
yield Static("")
yield Static("")
yield Button("Save", id="save_button")
yield Button("Cancel", id="cancel_button")
yield Footer()
def getValues(self):
if self.show_obj:
showId = int(self.show_obj['id'])
else:
showId = int(self.query_one("#id_wdg", Input).value)
showName = str(self.query_one("#name_input", Input).value)
showYear = int(self.query_one("#year_input", Input).value)
return showId, showName, showYear
# Event handler for button press
def on_button_pressed(self, event: Button.Pressed) -> None:
# Check if the button pressed is the one we are interested in
if event.button.id == "save_button":
showId, showName, showYear = self.getValues()
if self.updateShow(showId, showName, showYear):
screenResult = {}
screenResult['id'] = showId
screenResult['name'] = showName
screenResult['year'] = showYear
self.dismiss(screenResult)
else:
#TODO: Meldung
self.app.pop_screen()
if event.button.id == "cancel_button":
self.app.pop_screen()
def updateShow(self, show_id, show_name, show_year):
try:
s = self.Session()
q = s.query(Show).filter(Show.id == show_id)
if not q.count():
show = Show(id = int(show_id),
name = str(show_name),
year = int(show_year))
s.add(show)
s.commit()
return True
else:
currentShow = q.first()
changed = False
if currentShow.name != str(show_name):
currentShow.name = str(show_name)
changed = True
if currentShow.year != int(show_year):
currentShow.year = int(show_year)
changed = True
if changed:
s.commit()
return changed
except Exception as ex:
click.ClickException(f"ShowDetailsScreen.updateShow(): {repr(ex)}")
finally:
s.close()