aboutsummaryrefslogtreecommitdiff
path: root/src/main_window.py
blob: 5053a818391487f5c6c50c5c1426aa3e56e7576d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# To add CSS
# https://github.com/Taiko2k/GTK4PythonTutorial/blob/main/README.md#adding-your-custom-css-stylesheet

import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk

from src.book_flow import BookFlow
from src.filters import Filters
from src.book_form import BookForm
import src.utils as utils
import src.db as db
import src.models as models

class MainWindow(Gtk.ApplicationWindow):
    def __init__(self, resources, library, ereader, conn, *args, **kwargs):
        super().__init__(*args, **kwargs)

        utils.set_header_bar(self, 'Books')

        # State
        self._books = db.get_books(conn)
        self._progress = 'Reading'
        self._genres = models.get_genres(self._books)
        self._genre = models.all_genres

        add_book_button = Gtk.Button(label='Ajouter un livre')
        add_book_button.connect('clicked', lambda _: BookForm(self, resources, library, conn, self._progress, self._msg).present())

        header = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
        utils.set_margin(header, 20)
        self._filters = Filters(self._books, self._progress, self._genres, self._genre, self._msg)
        self._filters.set_hexpand(True)
        header.append(self._filters)
        header.append(add_book_button)

        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
        box.append(header)
        self._book_flow = BookFlow(self, resources, library, ereader, conn, self._books, self._progress, self._genre, self._msg)
        box.append(self._book_flow)
        self.set_child(box)

    def _msg(self, msg):
        match msg:
            case ['progress-selected', progress]:
                self._progress = progress
                self._book_flow.reset(self._books, self._progress, self._genre)
            case ['genre-selected', genre]:
                self._genre = genre
                self._book_flow.reset(self._books, self._progress, self._genre)
            case ['book-saved', book_id, data]:
                self._books[book_id] = data
                self._progress = data['progress']
                self._filters.select_progress(data['progress'])
                if not self._genre in data['genres']:
                    self._genre = models.all_genres
                self._actualize_genres()
                self._book_flow.reset(self._books, self._progress, self._genre, book_id)
                self._book_flow.select_book(book_id)
            case ['book-deleted', book_id, data]:
                del self._books[book_id]
                self._actualize_genres()
                self._book_flow.reset(self._books, self._progress, self._genre)

    def _actualize_genres(self):
        self._genres = models.get_genres(self._books)
        self._genre = self._genre if self._genre in self._genres else models.all_genres
        self._filters.actualize_genres(self._genres, self._genre)