window: Port to AdwNavigationView

This commit is contained in:
Peter Eisenmann
2024-07-31 23:12:07 +02:00
parent 1bab819d2b
commit 89247119d3
4 changed files with 37 additions and 28 deletions

View File

@@ -7,7 +7,5 @@ template $OsInstallerWindow : Adw.ApplicationWindow {
default-width: 500;
default-height: 640;
Stack main_stack {
transition-type: slide_left_right;
}
Adw.NavigationView navigation_view {}
}

View File

@@ -1,12 +1,13 @@
using Gtk 4.0;
using Adw 1;
template $PageWrapper : Adw.Bin {
template $PageWrapper : Adw.NavigationPage {
child: Adw.ToolbarView {
[top]
Adw.HeaderBar {
show-start-title-buttons: false;
show-end-title-buttons: false;
show-back-button: false;
styles ["flat"]
[start]

View File

@@ -122,7 +122,7 @@ reloadable_pages = ['disk', 'partition']
@Gtk.Template(resource_path='/com/github/p3732/os-installer/ui/widgets/page_wrapper.ui')
class PageWrapper(Adw.Bin):
class PageWrapper(Adw.NavigationPage):
__gtype_name__ = __qualname__
next_revealer = Gtk.Template.Child()
@@ -146,7 +146,12 @@ class PageWrapper(Adw.Bin):
self.page_name = page_name
self.content.set_child(self.page)
self._set_title_image()
self.title_label.set_label(self._get_page_title())
page_title = self._get_page_title()
self.title_label.set_label(page_title)
# AdwNavigationPage properties
self.set_title(page_title)
self.set_tag(page_name)
def _get_page_title(self):
page_title = page_name_to_page_title[self.page_name]

View File

@@ -25,7 +25,7 @@ backwards = -1
class OsInstallerWindow(Adw.ApplicationWindow):
__gtype_name__ = __qualname__
main_stack = Gtk.Template.Child()
navigation_view = Gtk.Template.Child()
navigation_lock = Lock()
pages = []
@@ -49,7 +49,7 @@ class OsInstallerWindow(Adw.ApplicationWindow):
def _initialize_first_page(self):
page_name = self.available_pages[0]
initial_page = PageWrapper(page_name)
self.main_stack.add_named(initial_page, page_name)
self.navigation_view.add(initial_page)
self.pages = [page_name]
def _add_action(self, action_name, callback, keybinding):
@@ -127,25 +127,33 @@ class OsInstallerWindow(Adw.ApplicationWindow):
for page_name in filter(None, self.pages):
if page_name == kept_page_name:
continue
page = self.main_stack.get_child_by_name(page_name)
self.main_stack.remove(page)
page = self.navigation_view.find_page(page_name)
if not page:
continue
self.navigation_view.remove(page)
del page
self.pages = [kept_page_name] if kept_page_name else []
def _get_next_page_name(self, offset: int = forward):
current_page_name = self.main_stack.get_visible_child_name()
current_index = self.available_pages.index(current_page_name)
current_page = self.navigation_view.get_visible_page()
current_index = self.available_pages.index(current_page.get_tag())
return self.available_pages[current_index + offset]
def _load_page(self, page_name: str, offset: int = forward):
if page_name in non_returnable_pages:
self._remove_all_but_one_page(None)
page_to_load = self.main_stack.get_child_by_name(page_name)
page_to_load = self.navigation_view.find_page(page_name)
if not page_to_load:
page_to_load = PageWrapper(page_name)
self.main_stack.add_named(page_to_load, page_name)
self.navigation_view.add(page_to_load)
self.navigation_view.push_by_tag(page_name)
self.pages.append(page_name)
else:
if offset >= forward:
self.navigation_view.push_by_tag(page_name)
else:
self.navigation_view.pop_to_tag(page_name)
match config.steal('page_navigation'):
case 'load_prev':
@@ -155,9 +163,9 @@ class OsInstallerWindow(Adw.ApplicationWindow):
self._load_next_page(offset + (1 if offset > 0 else -1))
return
self.main_stack.set_visible_child(page_to_load)
current_page = self.navigation_view.get_visible_page()
is_first, is_last = self._current_is_first(), self._current_is_last()
page_to_load.update_navigation_buttons(is_first, is_last)
current_page.update_navigation_buttons(is_first, is_last)
def _load_next_page(self, offset: int = forward):
page_name = self._get_next_page_name(offset)
@@ -166,22 +174,19 @@ class OsInstallerWindow(Adw.ApplicationWindow):
def _load_previous_page(self):
assert self.previous_pages, 'Logic Error: No previous pages to go to!'
popped_page = self.main_stack.get_visible_child()
self.pages.pop()
# delete popped page
self.main_stack.remove(popped_page)
popped_page = self.navigation_view.get_visible_page()
self.navigation_view.pop()
del popped_page
previous_page_name = self.previous_pages.pop()
self._load_page(previous_page_name)
self._load_page(previous_page_name, offset=backwards)
def _current_is_first(self):
page_name = self.main_stack.get_visible_child_name()
return page_name == self.pages[0]
page = self.navigation_view.get_visible_page()
return page.get_tag() == self.pages[0]
def _current_is_last(self):
page_name = self.main_stack.get_visible_child_name()
page_name = self.navigation_view.get_visible_page().get_tag()
return page_name == self.pages[-1]
### callbacks ###
@@ -200,7 +205,7 @@ class OsInstallerWindow(Adw.ApplicationWindow):
def _reload_page(self, _, __):
with self.navigation_lock:
self.main_stack.get_visible_child().reload()
self.navigation_view.get_visible_page().reload()
match config.steal('page_navigation'):
case "load_prev":
@@ -238,7 +243,7 @@ class OsInstallerWindow(Adw.ApplicationWindow):
def advance(self, page, allow_return: bool = True):
with self.navigation_lock:
# confirm calling page is current page to prevent incorrect navigation
current_page = self.main_stack.get_visible_child()
current_page = self.navigation_view.get_visible_page()
if page != None and page != current_page.get_page():
return
@@ -259,5 +264,5 @@ class OsInstallerWindow(Adw.ApplicationWindow):
def navigate_to_page(self, page_name):
with self.navigation_lock:
self.previous_pages.append(
self.main_stack.get_visible_child_name())
self.navigation_view.get_visible_page().get_tag())
self._load_page(page_name)