aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoris Guyonvarch2026-01-17 13:21:52 +0100
committerJoris Guyonvarch2026-01-17 13:21:52 +0100
commitf641c5b987b35f63ad066c0fa634c0a9f11bc7ab (patch)
tree85508f3210d8983c9e62f99369682cfaa3ebf605 /src
parentf2656765a27a38b1a9e5602c3430dde1cbc361f1 (diff)
Show dialog to keep or remove book sources
Diffstat (limited to 'src')
-rw-r--r--src/book_form.py17
-rw-r--r--src/book_store.py14
-rw-r--r--src/remove_paths_dialog.py45
3 files changed, 62 insertions, 14 deletions
diff --git a/src/book_form.py b/src/book_form.py
index 5968592..2e5bc52 100644
--- a/src/book_form.py
+++ b/src/book_form.py
@@ -1,21 +1,27 @@
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk
+import logging
+import os.path
import src.utils as utils
import src.models as models
from src.ui.entry_list import EntryList
from src.ui.book_entries import BookEntries
from src.ui.cover_entry import CoverEntry
+from src.remove_paths_dialog import RemovePathsDialog
import src.book_store as book_store
import src.book_files as book_files
import src.str_format as str_format
+logger = logging.getLogger(__name__)
+
class BookForm(Gtk.Window):
def __init__(self, parent_window, resources, library, conn, msg, book = None):
Gtk.Window.__init__(self)
+ self._parent_window = parent_window
self._book = book
self._library = library
self._conn = conn
@@ -74,9 +80,6 @@ class BookForm(Gtk.Window):
# Books
self._book_entries = BookEntries(self)
box.append(self._book_entries)
- self._remove_book_sources = Gtk.CheckButton.new_with_label(' Supprimer les sources')
- self._remove_book_sources.set_active(True)
- box.append(self._remove_book_sources)
# Init values
if book:
@@ -124,11 +127,17 @@ class BookForm(Gtk.Window):
cover = self._cover_entry.get_image()
books = self._book_entries.get_books()
- book_id = book_store.store(self._library, self._conn, data, cover, books, self._book, self._remove_book_sources.get_active())
+ book_id = book_store.store(self._library, self._conn, data, cover, books, self._book)
if book_id:
self.close()
self._msg(['book-saved', book_id, data])
+ # Ask whether to remove book sources
+ directory = f'{self._library}/{book_id}'
+ external_paths = [p for p in books.keys() if os.path.dirname(p) != directory]
+ if external_paths:
+ RemovePathsDialog(self._parent_window, 'Supprimer les sources', external_paths).present()
+
def non_empty(xs):
return [x.strip() for x in xs if x.strip()]
diff --git a/src/book_store.py b/src/book_store.py
index 1bc296f..687f01b 100644
--- a/src/book_store.py
+++ b/src/book_store.py
@@ -11,7 +11,7 @@ import src.book_files as book_files
logger = logging.getLogger(__name__)
-def store(library, conn, data, cover, books, book, remove_book_sources):
+def store(library, conn, data, cover, books, book):
book_id = book['id'] if book else nanoid.generate()
directory = f'{library}/{book_id}'
@@ -22,9 +22,9 @@ def store(library, conn, data, cover, books, book, remove_book_sources):
if book:
if not already_exist(directory, books) or has_delete(library, book_id, books):
- update_books(directory, books, remove_book_sources)
+ update_books(directory, books)
else:
- update_books(directory, books, remove_book_sources)
+ update_books(directory, books)
if book:
db.update_book(conn, book_id, data)
@@ -56,7 +56,7 @@ def has_delete(library, book_id, books):
return True
return False
-def update_books(directory, books, remove_book_sources):
+def update_books(directory, books):
try:
tmp_dir = f'{directory}/tmp'
os.makedirs(tmp_dir, exist_ok=True)
@@ -79,12 +79,6 @@ def update_books(directory, books, remove_book_sources):
dest = f'{directory}/{name}{ext}'
logger.info('Copying %s to %s', src, dest)
shutil.copyfile(src, dest)
- # Remove sources outside of book dir
- if remove_book_sources:
- for path in books.keys():
- if os.path.dirname(path) != directory:
- logger.info('Removing source: %s', path)
- pathlib.Path.unlink(path)
finally:
# Remove tmp
shutil.rmtree(f'{directory}/tmp', ignore_errors=True)
diff --git a/src/remove_paths_dialog.py b/src/remove_paths_dialog.py
new file mode 100644
index 0000000..2444067
--- /dev/null
+++ b/src/remove_paths_dialog.py
@@ -0,0 +1,45 @@
+import gi
+gi.require_version('Gtk', '4.0')
+from gi.repository import Gtk
+import os
+import logging
+import pathlib
+
+import src.utils as utils
+import src.book_files as book_files
+
+logger = logging.getLogger(__name__)
+
+class RemovePathsDialog(Gtk.Window):
+
+ def __init__(self, parent_window, title, paths):
+ Gtk.Window.__init__(self)
+
+ self._paths = paths
+
+ utils.configure_dialog(self, parent_window, title, width=None, height=None)
+
+ box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=20)
+ self.set_child(box)
+ utils.set_margin(box, 20)
+
+ for path in paths:
+ box.append(utils.label(path.as_posix()))
+
+ buttons_box = Gtk.Box(spacing=20)
+ buttons_box.set_halign(Gtk.Align.END)
+ box.append(buttons_box)
+
+ keep_button = Gtk.Button(label='Conserver')
+ keep_button.connect('clicked', lambda _: self.close())
+ buttons_box.append(keep_button)
+
+ delete_button = Gtk.Button(label='Supprimer')
+ delete_button.connect('clicked', lambda _: self._on_delete())
+ buttons_box.append(delete_button)
+
+ def _on_delete(self):
+ for path in self._paths:
+ logger.info('Removing source: %s', path)
+ pathlib.Path.unlink(path)
+ self.close()