File: AptListChangesGtk.py

package info (click to toggle)
apt-listchanges 4.8
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,336 kB
  • sloc: python: 3,477; xml: 693; makefile: 167; sh: 71; perl: 61
file content (124 lines) | stat: -rw-r--r-- 4,744 bytes parent folder | download
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# vim:set fileencoding=utf-8 et ts=4 sts=4 sw=4:
import os
import time

# check if gtk is available
import gi
gi.require_version('Gtk', '3.0')

# This needs to be after the require_version so we get the correct version of
# Gtk # pylint: disable=wrong-import-position
from gi.repository import Gtk  # noqa

from apt_listchanges.frontends import Frontend  # noqa
from apt_listchanges.ALChacks import _  # noqa


class gtk_frd(Frontend):
    def flush_interface(self):
        while Gtk.events_pending():
            Gtk.main_iteration()

    def cb_close(self, widget):
        Gtk.main_quit()

    # pylint: disable=attribute-defined-outside-init
    def show_interface(self):
        """Instantiate and show the window
        Doesn't happen until we are confident we want it to pop up"""
        if self.interface_showing:
            return
        self.interface_showing = True
        self.builder.set_translation_domain("apt-listchanges")
        mydir = os.path.dirname(__file__)
        uipath = os.path.join(mydir, "apt-listchanges.ui")
        self.builder.add_from_file(uipath)
        self.window_main = self.builder.get_object("window_main")
        if self.hide:
            self.window_main.iconify()
        handlers = {
            "on_button_close_clicked": self.cb_close,
            "on_window_main_destroy": self.cb_close,
        }
        self.progressbar_main = self.builder.get_object("progressbar_main")
        self.button_close = self.builder.get_object("button_close")
        self.label_header = self.builder.get_object("label_header")
        self.label_header_descr = self.builder.get_object("label_header_descr")
        self.label_header_descr.hide()
        self.textview_buf = \
            self.builder.get_object("textview_main").get_buffer()

        self.set_title(_('apt-listchanges: Reading changelogs'))
        self.textview_buf.set_text(
            '\n  ' + _('Reading changelogs. Please wait.'))
        self.builder.connect_signals(handlers)
        self.flush_interface()

    def __init__(self, config, *args):
        super().__init__(config, *args)
        self.hide = config.hide
        self.start_time = time.time()
        self.interface_showing = False
        self.deferred_progress = 0.0
        self.builder = Gtk.Builder()

    def display_output(self, text):
        self.show_interface()
        self.label_header_descr.show()
        self.button_close.set_sensitive(True)
        self.textview_buf.set_text(self._render(text))
        self.window_main.set_urgency_hint(True)
        Gtk.main()

    def update_progress(self, diff=1):
        if not self.interface_showing:
            # If we end up not having any content to display, we don't want a
            # window to flash briefly and then disappear just to briefly
            # display a progress bar, so we wait to show the interface until
            # we've been working for a few seconds and it looks like it's
            # going to be at least a few seconds more.
            if time.time() - self.start_time < 2.5 and \
               self.deferred_progress + diff < self.packages_count / 2:
                self.deferred_progress += diff
                return
            self.show_interface()
            self.progress = self.deferred_progress
            self.deferred_progress = 0
        elif not diff:
            return
        if not hasattr(self, 'progress'):
            self.progress = 0.0
        self.progressbar_main.show()
        self.progress += diff
        self.progressbar_main.set_fraction(self.progress / self.packages_count)
        self.progressbar_main.set_text(
            f"{self.progress*100 / self.packages_count}%")
        self.flush_interface()

    def progress_done(self):
        if not self.interface_showing:
            return
        self.progressbar_main.hide()
        self.flush_interface()

    def confirm(self):
        self.show_interface()
        m = Gtk.MessageDialog(self.window_main,
                              Gtk.DialogFlags.MODAL,
                              Gtk.MessageType.QUESTION,
                              Gtk.ButtonsType.YES_NO)
        m.set_default_response(Gtk.ResponseType.YES)
        m.set_markup("<big><b>%s</b></big>\n\n%s" % (
            _("Continue Installation?"),
            _("Select <i>yes</i> to continue with the installation."
              "\nSelect <i>no</i> to abort the installation.",
              "The 'yes' and 'no' should be translated.")
            ))
        if m.run() == Gtk.ResponseType.NO:
            return False
        return True

    def set_title(self, title):
        self.show_interface()
        self.label_header.set_markup(f'<big><b>{title}</b></big>')
        self.window_main.set_title(title)