This commit is contained in:
kramo
2023-05-07 17:38:31 +02:00
parent bd0386bcba
commit e1296444e5
2 changed files with 80 additions and 87 deletions

View File

@@ -85,6 +85,7 @@ class CartridgesApplication(Adw.Application):
("show_hidden", ("<primary>h",), self.win), ("show_hidden", ("<primary>h",), self.win),
("go_back", ("<alt>Left",), self.win), ("go_back", ("<alt>Left",), self.win),
("go_to_parent", ("<alt>Up",), self.win), ("go_to_parent", ("<alt>Up",), self.win),
("go_home", ("<alt>Home",), self.win),
("toggle_search", ("<primary>f",), self.win), ("toggle_search", ("<primary>f",), self.win),
("escape", ("Escape",), self.win), ("escape", ("Escape",), self.win),
("undo", ("<primary>z",), self.win), ("undo", ("<primary>z",), self.win),

View File

@@ -50,7 +50,6 @@ class CartridgesWindow(Adw.ApplicationWindow):
details_view_spinner = Gtk.Template.Child() details_view_spinner = Gtk.Template.Child()
details_view_title = Gtk.Template.Child() details_view_title = Gtk.Template.Child()
details_view_header_bar_title = Gtk.Template.Child() details_view_header_bar_title = Gtk.Template.Child()
details_view_play_button = Gtk.Template.Child()
details_view_blurred_cover = Gtk.Template.Child() details_view_blurred_cover = Gtk.Template.Child()
details_view_developer = Gtk.Template.Child() details_view_developer = Gtk.Template.Child()
details_view_added = Gtk.Template.Child() details_view_added = Gtk.Template.Child()
@@ -114,6 +113,8 @@ class CartridgesWindow(Adw.ApplicationWindow):
self.library.set_sort_func(self.sort_func) self.library.set_sort_func(self.sort_func)
self.hidden_library.set_sort_func(self.sort_func) self.hidden_library.set_sort_func(self.sort_func)
self.set_library_child()
games = {} games = {}
if self.games_dir.exists(): if self.games_dir.exists():
@@ -123,35 +124,31 @@ class CartridgesWindow(Adw.ApplicationWindow):
for game_id, game in games.items(): for game_id, game in games.items():
if game.get("removed"): if game.get("removed"):
(self.games_dir / f"{game_id}.json").unlink(missing_ok=True) for path in (
(self.covers_dir / f"{game_id}.tiff").unlink(missing_ok=True) self.games_dir / f"{game_id}.json",
(self.covers_dir / f"{game_id}.gif").unlink(missing_ok=True) self.covers_dir / f"{game_id}.tiff",
self.covers_dir / f"{game_id}.gif",
):
path.unlink(missing_ok=True)
else: else:
Game(self, game).update() Game(self, game).update()
self.set_library_child()
# Connect signals # Connect signals
self.search_entry.connect("search-changed", self.search_changed, False) self.search_entry.connect("search-changed", self.search_changed, False)
self.hidden_search_entry.connect("search-changed", self.search_changed, True) self.hidden_search_entry.connect("search-changed", self.search_changed, True)
back_mouse_button = Gtk.GestureClick(button=8) back_mouse_button = Gtk.GestureClick(button=8)
back_mouse_button.connect("pressed", self.on_go_back_action) (back_mouse_button).connect("pressed", self.on_go_back_action)
self.add_controller(back_mouse_button) self.add_controller(back_mouse_button)
Adw.StyleManager.get_default().connect( style_manager = Adw.StyleManager.get_default()
"notify::dark", self.set_details_view_opacity style_manager.connect("notify::dark", self.set_details_view_opacity)
) style_manager.connect("notify::high-contrast", self.set_details_view_opacity)
Adw.StyleManager.get_default().connect(
"notify::high-contrast", self.set_details_view_opacity
)
def search_changed(self, _widget, hidden): def search_changed(self, _widget, hidden):
# Refresh search filter on keystroke in search box # Refresh search filter on keystroke in search box
if hidden: (self.hidden_library if hidden else self.library).invalidate_filter()
self.hidden_library.invalidate_filter()
else:
self.library.invalidate_filter()
def set_library_child(self): def set_library_child(self):
child, hidden_child = self.notice_empty, self.hidden_notice_empty child, hidden_child = self.notice_empty, self.hidden_notice_empty
@@ -175,9 +172,12 @@ class CartridgesWindow(Adw.ApplicationWindow):
def filter_func(self, child): def filter_func(self, child):
game = child.get_child() game = child.get_child()
hidden = self.stack.get_visible_child() == self.hidden_library_view
text = ( text = (
(self.hidden_search_entry if hidden else self.search_entry) (
self.hidden_search_entry
if self.stack.get_visible_child() == self.hidden_library_view
else self.search_entry
)
.get_text() .get_text()
.lower() .lower()
) )
@@ -197,8 +197,7 @@ class CartridgesWindow(Adw.ApplicationWindow):
self.active_game = game self.active_game = game
def get_time(self, timestamp): def get_time(self, timestamp):
date = datetime.fromtimestamp(timestamp) days_no = (datetime.today() - datetime.fromtimestamp(timestamp)).days
days_no = (datetime.today() - date).days
if days_no == 0: if days_no == 0:
return _("Today") return _("Today")
@@ -216,21 +215,19 @@ class CartridgesWindow(Adw.ApplicationWindow):
self.details_view_cover.set_visible(not game.loading) self.details_view_cover.set_visible(not game.loading)
self.details_view_spinner.set_spinning(game.loading) self.details_view_spinner.set_spinning(game.loading)
if game.developer: self.details_view_developer.set_label(game.developer or "")
self.details_view_developer.set_label(game.developer) self.details_view_developer.set_visible(bool(game.developer))
self.details_view_developer.set_visible(True)
else:
self.details_view_developer.set_visible(False)
icon, text = "view-conceal-symbolic", _("Hide")
if game.hidden: if game.hidden:
self.details_view_hide_button.set_icon_name("view-reveal-symbolic") icon, text = "view-reveal-symbolic", _("Unhide")
self.details_view_hide_button.set_tooltip_text(_("Unhide"))
else: self.details_view_hide_button.set_icon_name(icon)
self.details_view_hide_button.set_icon_name("view-conceal-symbolic") self.details_view_hide_button.set_tooltip_text(text)
self.details_view_hide_button.set_tooltip_text(_("Hide"))
if self.details_view_game_cover: if self.details_view_game_cover:
self.details_view_game_cover.pictures.remove(self.details_view_cover) self.details_view_game_cover.pictures.remove(self.details_view_cover)
self.details_view_game_cover = game.game_cover self.details_view_game_cover = game.game_cover
self.details_view_game_cover.add_picture(self.details_view_cover) self.details_view_game_cover.add_picture(self.details_view_cover)
@@ -240,6 +237,7 @@ class CartridgesWindow(Adw.ApplicationWindow):
self.details_view_title.set_label(game.name) self.details_view_title.set_label(game.name)
self.details_view_header_bar_title.set_title(game.name) self.details_view_header_bar_title.set_title(game.name)
date = self.get_time(game.added) date = self.get_time(game.added)
self.details_view_added.set_label( self.details_view_added.set_label(
# The variable is the date when the game was added # The variable is the date when the game was added
@@ -254,32 +252,27 @@ class CartridgesWindow(Adw.ApplicationWindow):
) )
if self.stack.get_visible_child() != self.details_view: if self.stack.get_visible_child() != self.details_view:
self.stack.set_transition_type(Gtk.StackTransitionType.OVER_LEFT) self.navigate(self.details_view)
self.stack.set_visible_child(self.details_view)
self.set_details_view_opacity() self.set_details_view_opacity()
def set_details_view_opacity(self, *_args): def set_details_view_opacity(self, *_args):
if self.stack.get_visible_child() == self.details_view: if self.stack.get_visible_child() != self.details_view:
style_manager = Adw.StyleManager.get_default() return
if ( if (
style_manager.get_high_contrast() style_manager := Adw.StyleManager.get_default()
or not style_manager.get_system_supports_color_schemes() ).get_high_contrast() or not style_manager.get_system_supports_color_schemes():
): self.details_view_blurred_cover.set_opacity(0.3)
self.details_view_blurred_cover.set_opacity(0.3) return
return
dark_theme = style_manager.get_dark() self.details_view_blurred_cover.set_opacity(
1.2 - self.details_view_game_cover.luminance[0]
self.details_view_blurred_cover.set_opacity( if style_manager.get_dark()
1.2 - self.details_view_game_cover.luminance[0] else self.details_view_game_cover.luminance[1]
if dark_theme )
else 0.2 + self.details_view_game_cover.luminance[1]
)
def sort_func(self, child1, child2): def sort_func(self, child1, child2):
games = (child1.get_child(), child2.get_child())
var, order = "name", True var, order = "name", True
if self.sort_state in ("newest", "oldest"): if self.sort_state in ("newest", "oldest"):
@@ -290,40 +283,51 @@ class CartridgesWindow(Adw.ApplicationWindow):
order = False order = False
def get_value(index): def get_value(index):
return str(getattr(games[index], var)).lower() return str(
getattr((child1.get_child(), child2.get_child())[index], var)
).lower()
if var != "name" and get_value(0) == get_value(1): if var != "name" and get_value(0) == get_value(1):
var, order = "name", True var, order = "name", True
return ((get_value(0) > get_value(1)) ^ order) * 2 - 1 return ((get_value(0) > get_value(1)) ^ order) * 2 - 1
def navigate(self, next_page):
levels = (self.library_view, self.hidden_library_view, self.details_view)
self.stack.set_transition_type(
Gtk.StackTransitionType.UNDER_RIGHT
if levels.index(self.stack.get_visible_child()) - levels.index(next_page)
> 0
else Gtk.StackTransitionType.OVER_LEFT
)
if next_page == self.library_view or self.hidden_library_view:
self.previous_page = next_page
self.lookup_action("show_hidden").set_enabled(
next_page == self.library_view
)
self.stack.set_visible_child(next_page)
def on_go_back_action(self, *_args): def on_go_back_action(self, *_args):
if self.stack.get_visible_child() == self.hidden_library_view: if self.stack.get_visible_child() == self.hidden_library_view:
self.on_show_library_action() self.navigate(self.library_view)
elif self.stack.get_visible_child() == self.details_view: elif self.stack.get_visible_child() == self.details_view:
self.on_go_to_parent_action() self.on_go_to_parent_action()
def on_go_to_parent_action(self, *_args): def on_go_to_parent_action(self, *_args):
if self.stack.get_visible_child() == self.details_view: if self.stack.get_visible_child() == self.details_view:
if self.previous_page == self.library_view: self.navigate(
self.on_show_library_action() self.hidden_library_view
else: if self.previous_page == self.hidden_library_view
self.on_show_hidden_action() else self.library_view
)
def on_show_library_action(self, *_args): def on_go_home_action(self, *_args):
self.stack.set_transition_type(Gtk.StackTransitionType.UNDER_RIGHT) self.navigate(self.library_view)
self.stack.set_visible_child(self.library_view)
self.lookup_action("show_hidden").set_enabled(True)
self.previous_page = self.library_view
def on_show_hidden_action(self, *_args): def on_show_hidden_action(self, *_args):
if self.stack.get_visible_child() == self.library_view: self.navigate(self.hidden_library_view)
self.stack.set_transition_type(Gtk.StackTransitionType.OVER_LEFT)
else:
self.stack.set_transition_type(Gtk.StackTransitionType.UNDER_RIGHT)
self.lookup_action("show_hidden").set_enabled(False)
self.stack.set_visible_child(self.hidden_library_view)
self.previous_page = self.hidden_library_view
def on_sort_action(self, action, state): def on_sort_action(self, action, state):
action.set_state(state) action.set_state(state)
@@ -346,34 +350,22 @@ class CartridgesWindow(Adw.ApplicationWindow):
else: else:
return return
search_mode = search_bar.get_search_mode() search_bar.set_search_mode(not (search_mode := search_bar.get_search_mode()))
search_bar.set_search_mode(not search_mode)
search_button.set_active(not search_button.get_active()) search_button.set_active(not search_button.get_active())
if not search_mode: if not search_mode:
self.set_focus(search_entry) self.set_focus(search_entry)
else:
search_entry.set_text("") search_entry.set_text("")
def on_escape_action(self, *_args): def on_escape_action(self, *_args):
if self.stack.get_visible_child() == self.details_view: if self.stack.get_visible_child() == self.details_view:
self.on_go_back_action() self.on_go_back_action()
return elif (
if self.stack.get_visible_child() == self.library_view: self.get_focus() == self.search_entry.get_focus_child()
search_bar = self.search_bar or self.hidden_search_entry.get_focus_child()
search_entry = self.search_entry ):
search_button = self.search_button self.on_toggle_search_action()
elif self.stack.get_visible_child() == self.hidden_library_view:
search_bar = self.hidden_search_bar
search_entry = self.hidden_search_entry
search_button = self.hidden_search_button
else:
return
if self.get_focus() == search_entry.get_focus_child():
search_bar.set_search_mode(False)
search_button.set_active(False)
search_entry.set_text("")
def on_undo_action(self, _widget, game=None, undo=None): def on_undo_action(self, _widget, game=None, undo=None):
if not game: # If the action was activated via Ctrl + Z if not game: # If the action was activated via Ctrl + Z