From 2472f8011175e4c7e04e87429c4de8df4042894d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Hamal=20Dvo=C5=99=C3=A1k?= <mordae@anilinux.org>
Date: Sun, 9 Mar 2025 10:52:34 +0100
Subject: [PATCH] Tweak watched status

---
 lazy_player/__init__.py   | 43 ++++++++++++++++++++++-----------------
 lazy_player/file_model.py |  5 +++++
 2 files changed, 29 insertions(+), 19 deletions(-)

diff --git a/lazy_player/__init__.py b/lazy_player/__init__.py
index 1ed4855..cc1a8d7 100644
--- a/lazy_player/__init__.py
+++ b/lazy_player/__init__.py
@@ -153,6 +153,10 @@ class MainWindow(Gtk.ApplicationWindow):
                     return
 
                 position = file_item.load_attribute("position", 0)
+                duration = file_item.load_attribute("duration", 1) or 1
+
+                if (position / duration) >= 0.99:
+                    position = 0
 
                 # Start playing the video
                 full_path = os.path.abspath(file_item.full_path)
@@ -235,26 +239,27 @@ class MainWindow(Gtk.ApplicationWindow):
         label = cast(Gtk.Label, box.get_last_child())
         item = cast(FileItem, list_item.get_item())
 
-        # Set appropriate icon
-        icon.set_opacity(1.0)
-        if item.file_type == FileType.DIRECTORY:
-            icon.set_from_icon_name("folder-symbolic")
-            icon.set_css_classes(["file-icon"])
-        else:
-            position = item.load_attribute("position", 0)
-            duration = item.load_attribute("duration", 1) or 1
-
-            if position == 0:
-                icon.set_from_icon_name("checkbox-symbolic")
-                icon.set_css_classes(["file-icon", "unwatched"])
-            elif (position / duration) >= 0.9:
-                icon.set_from_icon_name("object-select-symbolic")
-                icon.set_css_classes(["file-icon", "completed"])
+        def update_icon(*args: object) -> None:
+            if item.file_type == FileType.DIRECTORY:
+                icon.set_from_icon_name("folder-symbolic")
+                icon.set_css_classes(["file-icon"])
             else:
-                icon.set_from_icon_name("media-playback-pause-symbolic")
-                icon.set_css_classes(["file-icon", "in-progress"])
+                position = item.load_attribute("position", 0)
+                duration = item.load_attribute("duration", 1) or 1
+
+                if position == 0:
+                    icon.set_from_icon_name("media-playback-start-symbolic")
+                    icon.set_css_classes(["file-icon", "unwatched"])
+                elif (position / duration) >= 0.99:
+                    icon.set_from_icon_name("object-select-symbolic")
+                    icon.set_css_classes(["file-icon", "completed"])
+                else:
+                    icon.set_from_icon_name("media-playback-pause-symbolic")
+                    icon.set_css_classes(["file-icon", "in-progress"])
 
         label.set_text(item.name)
+        item.connect("notify::attrs-changed", update_icon)
+        update_icon()
 
     def _on_selection_changed(
         self,
@@ -340,8 +345,8 @@ class MainWindow(Gtk.ApplicationWindow):
         position = file_item.load_attribute("position", 0)
         duration = file_item.load_attribute("duration", 1) or 1
 
-        # If position exists and is >= 90% through, clear it
-        if position > 0 and (position / duration) >= 0.9:
+        # If position exists and is >= 99% through, clear it
+        if position > 0 and (position / duration) >= 0.99:
             file_item.save_attribute("position", None)
         else:
             # Otherwise mark as complete
diff --git a/lazy_player/file_model.py b/lazy_player/file_model.py
index 62c021c..ef640c9 100644
--- a/lazy_player/file_model.py
+++ b/lazy_player/file_model.py
@@ -21,8 +21,11 @@ class FileItem(GObject.Object):
 
     __gtype_name__ = "FileItem"
 
+    attrs_changed = GObject.Property(type=int, default=0)
+
     def __init__(self, name: str, file_type: FileType, full_path: str):
         super().__init__()
+        self.attrs_changed = 0
         self.name = name
         self.file_type = file_type
         self.full_path = full_path
@@ -62,3 +65,5 @@ class FileItem(GObject.Object):
                 os.setxattr(self.full_path, f"user.lazy_player.{name}", str(value).encode("utf8"))
         except OSError:
             pass
+
+        self.notify("attrs-changed")