Compare commits

...

3 Commits

Author SHA1 Message Date
jpt
48d29b4d0c UI 2025-04-16 11:12:50 -05:00
jpt
99cbbfe5f0 improve choice selector 2025-04-15 00:19:13 -05:00
jpt
d0e80bb59e add week stub 2025-04-14 11:04:57 -05:00
4 changed files with 61 additions and 17 deletions

View File

@ -39,6 +39,10 @@ class Task(BaseModel):
self.updated_at = datetime.now() self.updated_at = datetime.now()
return super(Task, self).save(*args, **kwargs) return super(Task, self).save(*args, **kwargs)
@property
def due_week(self):
return self.due.isocalendar()[1] - 12
class SavedSearch(BaseModel): class SavedSearch(BaseModel):
name = CharField(unique=True) name = CharField(unique=True)

View File

@ -211,7 +211,11 @@ class TableEditor(App):
self.table.move_cursor(row=0, column=1) self.table.move_cursor(row=0, column=1)
def action_delete_item(self): def action_delete_item(self):
self.push_screen(ConfirmModal(f"delete ?"), self._delete_item_callback) if self.table.cursor_column == 0:
current_value = self.table.get_cell_at(
(self.table.cursor_row, 1) # assumes col 1 is name
)
self.push_screen(ConfirmModal(f"delete [green]{current_value}[/]?"), self._delete_item_callback)
def _delete_item_callback(self, confirm): def _delete_item_callback(self, confirm):
if confirm and self.table.cursor_column == 0: if confirm and self.table.cursor_column == 0:

View File

@ -14,6 +14,10 @@ class ConfirmModal(ModalScreen):
align: center middle; align: center middle;
background: $primary 30%; background: $primary 30%;
} }
ConfirmModal Vertical {
border: double teal;
height: 4;
}
""" """
BINDINGS = [ BINDINGS = [
@ -26,9 +30,9 @@ class ConfirmModal(ModalScreen):
super().__init__() super().__init__()
def compose(self): def compose(self):
yield Label(self.message) with Vertical():
yield Label("(y)es") yield Label(self.message)
yield Label("(n)o") yield Label("[b](y)[/]es [b](n)[/]o")
def action_confirm(self): def action_confirm(self):
self.dismiss(True) self.dismiss(True)
@ -43,6 +47,15 @@ class ChoiceModal(ModalScreen):
align: center middle; align: center middle;
background: $primary 30%; background: $primary 30%;
} }
ChoiceModal Vertical {
border: double teal;
height: 10;
width: 38;
}
ChoiceModal Label.hints {
border: solid grey;
height: 4;
}
ChoiceModal Label { ChoiceModal Label {
height: 1; height: 1;
} }
@ -72,21 +85,28 @@ class ChoiceModal(ModalScreen):
super().__init__() super().__init__()
def compose(self): def compose(self):
for idx, e in enumerate(self._enum): with Vertical():
yield Label( for idx, e in enumerate(self._enum):
("> " if idx == self.sel_idx else " ") + yield Label(
get_color_enum(e.value, self._enum), (f"> {idx} " if idx == self.sel_idx else f" {idx} ")
classes="selected" if idx == self.sel_idx else "", + get_color_enum(e.value, self._enum),
) classes="selected" if idx == self.sel_idx else "",
)
yield Label("""(h/j/k/l) move (0-9) quick select
(enter) confirm (esc) quit""", classes="hints")
def _move_cursor(self, dir): def _move_cursor(self, dir):
labels = self.query(Label) labels = self.query(Label)
# reset old # reset old
labels[self.sel_idx].update(" " + get_color_enum(self.enum_by_idx[self.sel_idx], self._enum)) labels[self.sel_idx].update(
f" {self.sel_idx} " + get_color_enum(self.enum_by_idx[self.sel_idx], self._enum)
)
# move cursor # move cursor
self.sel_idx = (self.sel_idx + dir) % len(self._enum) self.sel_idx = (self.sel_idx + dir) % len(self._enum)
# reset new # reset new
labels[self.sel_idx].update("> " + get_color_enum(self.enum_by_idx[self.sel_idx], self._enum)) labels[self.sel_idx].update(
f"> {self.sel_idx} " + get_color_enum(self.enum_by_idx[self.sel_idx], self._enum)
)
def action_cursor_down(self): def action_cursor_down(self):
self._move_cursor(1) self._move_cursor(1)
@ -100,6 +120,12 @@ class ChoiceModal(ModalScreen):
def action_cancel(self): def action_cancel(self):
self.app.pop_screen() self.app.pop_screen()
def on_key(self, event) -> None:
key = event.key
if key in "0123456789":
idx = int(key)
self.dismiss(self.enum_by_idx[idx])
class DateModal(ModalScreen): class DateModal(ModalScreen):
CSS = """ CSS = """
@ -112,8 +138,6 @@ class DateModal(ModalScreen):
height: 10; height: 10;
width: 50; width: 50;
} }
DateModal Horizonal {
}
DateModal Label { DateModal Label {
border: solid white; border: solid white;
align: center middle; align: center middle;
@ -155,9 +179,15 @@ class DateModal(ModalScreen):
with Vertical(): with Vertical():
with Horizontal(): with Horizontal():
for i in range(3): for i in range(3):
yield Label(f"{self.pieces[i]}", classes="selected-date" if self.selected == i else "") yield Label(
yield Label("""(h/j/k/l) move (enter) confirm (esc) quit f"{self.pieces[i]}",
(p)ast (t)oday (f)uture""", classes="hints") classes="selected-date" if self.selected == i else "",
)
yield Label(
"""(h/j/k/l) move (enter) confirm (esc) quit
(p)ast (t)oday (f)uture""",
classes="hints",
)
def action_future(self): def action_future(self):
self.pieces = list(SPECIAL_DATES_PIECES["future"]) self.pieces = list(SPECIAL_DATES_PIECES["future"])

View File

@ -58,6 +58,12 @@ field_name = "due"
field_type = "date" field_type = "date"
default = "1999-01-01" default = "1999-01-01"
[[views.columns]]
field_name = "due_week"
read_only = true
#field_type = "date"
#default = "1999-01-01"
[[views.columns]] [[views.columns]]
field_name = "project" field_name = "project"
display_name = "Project" display_name = "Project"