1# Copyright (c) 2017-2021 Cedric Bellegarde <cedric.bellegarde@adishatz.org>
2# This program is free software: you can redistribute it and/or modify
3# it under the terms of the GNU General Public License as published by
4# the Free Software Foundation, either version 3 of the License, or
5# (at your option) any later version.
6# This program is distributed in the hope that it will be useful,
7# but WITHOUT ANY WARRANTY; without even the implied warranty of
8# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9# GNU General Public License for more details.
10# You should have received a copy of the GNU General Public License
11# along with this program. If not, see <http://www.gnu.org/licenses/>.
12
13from gi.repository import Gtk, Pango
14
15from eolie.define import App
16
17
18class ModifyUADialog:
19    """
20        Modify user agent for uri
21    """
22
23    def __init__(self, uri, window):
24        """
25            Init widget
26            @param uri as str
27            @param window as Gtk.Window
28        """
29        self.__uri = uri
30        self.__window = window
31        builder = Gtk.Builder()
32        builder.add_from_resource("/org/gnome/Eolie/DialogModifyUA.ui")
33        builder.connect_signals(self)
34        self.__dialog = builder.get_object("dialog")
35        self.__dialog.set_transient_for(window)
36        headerbar = builder.get_object("headerbar")
37        view = builder.get_object("view")
38        self.__model = builder.get_object("model")
39        self.__selection = builder.get_object("selection")
40        self.__entry = builder.get_object("entry")
41        self.__entry.connect("changed", self.__on_entry_changed)
42        self.__dialog.set_titlebar(headerbar)
43        renderer0 = Gtk.CellRendererText()
44        renderer0.set_property("ellipsize-set", True)
45        renderer0.set_property("ellipsize", Pango.EllipsizeMode.END)
46        column = Gtk.TreeViewColumn("")
47        column.set_expand(True)
48        column.pack_start(renderer0, True)
49        column.add_attribute(renderer0, "text", 0)
50        view.append_column(column)
51        user_agent = App().websettings.get("user_agent", self.__uri)
52        if user_agent is not None:
53            self.__select_matching(user_agent)
54            self.__entry.set_text(user_agent)
55
56    def run(self):
57        """
58            Run dialog
59        """
60        self.__dialog.run()
61        self.__dialog.destroy()
62
63#######################
64# PROTECTED           #
65#######################
66    def _on_selection_changed(self, selection):
67        """
68            Update entry
69            @param selection as Gtk.TreeSelection
70        """
71        (model, items) = selection.get_selected_rows()
72        if items:
73            value = model[items[0]][1]
74            # Can't set a null value in glade :-/
75            if value == "None":
76                value = ""
77            self.__entry.disconnect_by_func(self.__on_entry_changed)
78            self.__entry.set_text(value)
79            self.__entry.connect("changed", self.__on_entry_changed)
80
81    def _on_dialog_response(self, dialog, response_id):
82        """
83            Save user agent
84            @param dialog as Gtk.Dialog
85            @param response_id as int
86        """
87        if response_id != Gtk.ResponseType.DELETE_EVENT:
88            user_agent = self.__entry.get_text()
89            App().websettings.set("user_agent", self.__uri, user_agent)
90
91#######################
92# PRIVATE             #
93#######################
94    def __select_matching(self, user_agent):
95        """
96            Select matching element
97            @param user_agent as str
98        """
99        for item in self.__model:
100            value = "" if item[1] == "None" else item[1]
101            if value == user_agent:
102                self.__selection.select_iter(item.iter)
103                return
104        self.__selection.unselect_all()
105
106    def __on_entry_changed(self, entry):
107        """
108            Update matching
109            @param entry as Gtk.Entry
110        """
111        self.__select_matching(entry.get_text())
112