1#!/usr/bin/env python3
2# coding: utf-8
3
4# Copyright (C) 2017, 2018 Robert Griesel
5# This program is free software: you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation, either version 3 of the License, or
8# (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program. If not, see <http://www.gnu.org/licenses/>
17
18import gi
19gi.require_version('Gtk', '3.0')
20from gi.repository import Gtk
21
22
23class ContextMenuPresenter(object):
24
25    def __init__(self, context_menu, scbar_view):
26        self.context_menu = context_menu
27        self.context_menu.document_view.source_view.connect('populate-popup', self.on_populate_popup)
28        self.scbar_view = scbar_view
29
30        self.context_menu.document.source_buffer.connect('mark-set', self.on_mark_set)
31
32        undo_manager = self.context_menu.document.source_buffer.get_undo_manager()
33        undo_manager.connect('can-undo-changed', self.on_can_undo_changed)
34        undo_manager.connect('can-redo-changed', self.on_can_redo_changed)
35
36        self.on_can_undo_changed(undo_manager)
37        self.on_can_redo_changed(undo_manager)
38
39    def set_zoom_level(self, zoom_level):
40        self.scbar_view.model_button_reset_zoom.set_label("{:.0%}".format(zoom_level))
41
42    def on_can_sync_changed(self, can_sync):
43        self.scbar_view.model_button_show_in_preview.set_sensitive(can_sync)
44
45    def on_mark_set(self, buffer, location, mark):
46        has_selection = self.context_menu.document.source_buffer.get_has_selection()
47        self.scbar_view.model_button_cut.set_sensitive(has_selection)
48        self.scbar_view.model_button_copy.set_sensitive(has_selection)
49        self.scbar_view.model_button_delete.set_sensitive(has_selection)
50
51    def on_can_undo_changed(self, undo_manager):
52        if undo_manager.can_undo():
53            self.scbar_view.model_button_undo.set_sensitive(True)
54        else:
55            self.scbar_view.model_button_undo.set_sensitive(False)
56
57    def on_can_redo_changed(self, undo_manager):
58        if undo_manager.can_redo():
59            self.scbar_view.model_button_redo.set_sensitive(True)
60        else:
61            self.scbar_view.model_button_redo.set_sensitive(False)
62
63    def on_populate_popup(self, view, menu):
64        for item in menu.get_children():
65            menu.remove(item)
66
67        menu_item_cut = Gtk.MenuItem.new_with_label(_('Cut'))
68        menu_item_copy = Gtk.MenuItem.new_with_label(_('Copy'))
69        menu_item_paste = Gtk.MenuItem.new_with_label(_('Paste'))
70        menu_item_delete = Gtk.MenuItem.new_with_label(_('Delete'))
71        menu_item_select_all = Gtk.MenuItem.new_with_label(_('Select All'))
72
73        menu.append(menu_item_cut)
74        menu.append(menu_item_copy)
75        menu.append(menu_item_paste)
76        menu.append(menu_item_delete)
77        menu.append(Gtk.SeparatorMenuItem())
78        menu.append(menu_item_select_all)
79
80        menu_item_cut.connect('activate', self.context_menu.on_cut)
81        menu_item_copy.connect('activate', self.context_menu.on_copy)
82        menu_item_paste.connect('activate', self.context_menu.on_paste)
83        menu_item_delete.connect('activate', self.context_menu.on_delete)
84        menu_item_select_all.connect('activate', self.context_menu.on_select_all)
85
86        has_selection = self.context_menu.document.source_buffer.get_has_selection()
87        menu_item_cut.set_sensitive(has_selection)
88        menu_item_copy.set_sensitive(has_selection)
89        menu_item_delete.set_sensitive(has_selection)
90
91        if self.context_menu.document.is_latex_document():
92            menu_item_comment = Gtk.MenuItem.new_with_label(_('Toggle Comment'))
93            menu_item_comment.connect('activate', self.context_menu.on_toggle_comment)
94            menu_item_show_in_preview = Gtk.MenuItem.new_with_label(_('Show in Preview'))
95            menu_item_show_in_preview.set_sensitive(self.context_menu.can_sync)
96            menu_item_show_in_preview.connect('activate', self.context_menu.on_show_in_preview)
97            menu.append(Gtk.SeparatorMenuItem())
98            menu.append(menu_item_comment)
99            menu.append(menu_item_show_in_preview)
100        menu.show_all()
101
102
103