Skip to content

Commit

Permalink
Render page content dinamically
Browse files Browse the repository at this point in the history
Signed-off-by: Simó Albert i Beltran <sim6@bona.gent>
  • Loading branch information
sim6 committed May 22, 2024
1 parent b7c1cc5 commit 2e026e8
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 16 deletions.
2 changes: 1 addition & 1 deletion data/resources/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@
border-radius: 12px;
}

.transparent {
.transparent, .transparent row:hover, .transparent row:selected {
background-color: transparent;
}

Expand Down
60 changes: 50 additions & 10 deletions errands/widgets/base/base_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from datetime import datetime

from gi.repository import Adw, GObject, Gtk # type:ignore
from gi.repository import Adw, Gio, GObject, Gtk # type:ignore

from errands.lib.data import TaskData, UserData
from errands.lib.logging import Log
Expand All @@ -16,6 +16,21 @@
from errands.widgets.shared.components.toolbar_view import ErrandsToolbarView


class TaskListView(GObject.GObject):
def __init__(self, source):
super().__init__()
self._source = source

def __getattr__(self, name):
return getattr(self._source, name)

def __setattr__(self, name, value):
if name == "_source":
self.__dict__[name] = value
else:
setattr(self._source, name, value)


class BasePage(BasePageName, Adw.Bin):
def __init__(self):
super().__init__()
Expand All @@ -36,15 +51,33 @@ def __build_ui(self):
)

# Task List
self.task_list = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, margin_bottom=32)
self.task_list_store = Gio.ListStore(item_type=TaskListView)
task_list_sort_model = Gtk.SortListModel(model=self.task_list_store)
task_list_sort_model.set_sorter(Gtk.CustomSorter.new(self.sort))
factory = Gtk.SignalListItemFactory()
factory.connect(
"setup", lambda factory, list_item: list_item.set_child(PageTask(self))
)
factory.connect(
"bind",
lambda factory, list_item: list_item.get_child().set_data(
list_item.get_item()
),
)
self.task_list = Gtk.ListView(
model=Gtk.SingleSelection(model=task_list_sort_model),
factory=factory,
css_classes=["transparent"],
)

# Content
content = Gtk.ScrolledWindow(
propagate_natural_height=True,
child=Adw.Clamp(
child=Adw.ClampScrollable(
maximum_size=1000, tightening_threshold=300, child=self.task_list
),
)

self.status_page.bind_property(
"visible",
content,
Expand All @@ -71,17 +104,21 @@ def no_task_message(self) -> str:
raise NotImplementedError

@property
def tasks(self) -> list[PageTask]:
return get_children(self.task_list)
def tasks(self) -> list[TaskListView]:
items = []
for index in range(self.task_list_store.get_n_items()):
item = self.task_list_store.get_item(index)
items.append(item)
return items

@property
def tasks_data(self) -> list[TaskData]:
raise NotImplementedError

# ------ PUBLIC METHODS ------ #

def add_task(self, task_data: TaskData) -> PageTask:
self.task_list.append(PageTask(task_data, self))
def add_task(self, task_data: TaskData) -> None:
self.task_list_store.append(TaskListView(task_data))
self.status_page.set_visible(False)

def update_status(self):
Expand Down Expand Up @@ -109,7 +146,10 @@ def update_ui(self):
if task.uid not in tasks_uids:
task.purge()

for task in self.tasks:
task.update_ui()

self.task_list.get_model().get_model().get_sorter().changed(
Gtk.SorterChange.DIFFERENT
)
self.update_status()

def sort(self) -> GObject.TYPE_INT:
raise NotImplementedError
18 changes: 13 additions & 5 deletions errands/widgets/page_task.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,14 @@ class PageTask(Gtk.Revealer):
block_signals: bool = True
purging: bool = False

def __init__(self, task_data: TaskData, page: BasePage) -> None:
def __init__(self, page: BasePage) -> None:
super().__init__()
self.task_data = task_data
self.list_uid = task_data.list_uid
self.uid = task_data.uid
self.task_data = None
self.list_uid = None
self.uid = None
self.page = page
self.__build_ui()
self.__add_actions()
self.update_ui()
self.block_signals = False

def __repr__(self) -> str:
Expand Down Expand Up @@ -208,6 +207,12 @@ def tags(self) -> list[Tag]:

# ------ PUBLIC METHODS ------ #

def set_data(self, task_data: TaskListView):
self.task_data = task_data
self.list_uid = task_data.list_uid
self.uid = task_data.uid
self.update_ui()

def add_rm_crossline(self, add: bool) -> None:
if add:
self.title_row.add_css_class("task-completed")
Expand Down Expand Up @@ -258,9 +263,12 @@ def update_props(self, props: list[str], values: list[Any]) -> None:
values.append(datetime.datetime.now().strftime("%Y%m%dT%H%M%S"))
break
UserData.update_props(self.list_uid, self.uid, props, values)
for prop, value in zip(props, values):
setattr(self.task_data, prop, value)
# Update linked page
if props == ["expanded"] or props == ["toolbar_shown"]:
getattr(State, f"{self.page.page_name}_page").update_ui()
self.page.update_ui()

def toggle_visibility(self, on: bool) -> None:
GLib.idle_add(self.set_reveal_child, on)
Expand Down
5 changes: 5 additions & 0 deletions errands/widgets/today/today_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

from datetime import datetime

from gi.repository.GObject import TYPE_INT

from errands.lib.data import TaskData, UserData
from errands.widgets.base.base_page import BasePage
from errands.widgets.today.today_page_name import TodayPageName
Expand All @@ -25,3 +27,6 @@ def tasks_data(self) -> list[TaskData]:
and t.due_date
and datetime.fromisoformat(t.due_date).date() <= datetime.today().date()
]

def sort(self, task1, task2, user_data) -> TYPE_INT:
return (task1.due_date > task2.due_date) - (task1.due_date < task2.due_date)

0 comments on commit 2e026e8

Please sign in to comment.