Files
xed/plugins/textsize/textsize/documenthelper.py
JosephMcc 33d035aac7 textsize plugin: Zoom text regardless of selection
Currently when zooming text with something selected, only the selected
text is zoomed. There doesn't seem to be any real use for this behavior.
Instead just zoom the full document regardless of selection. This also
simplifies the plugin a good bit.

Closes: https://github.com/linuxmint/xed/issues/327
2020-09-22 09:44:23 -04:00

120 lines
3.6 KiB
Python

# -*- coding: utf-8 -*-
#
# documenthelper.py - Document helper
#
# Copyright (C) 2010 - Jesse van den Kieboom
# Copyright (C) 2017 - Linux Mint team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
from .signals import Signals
from gi.repository import Gtk, Gdk, Pango
MAX_FONT_SIZE = 30
MIN_FONT_SIZE = 5
class DocumentHelper(Signals):
def __init__(self, view):
Signals.__init__(self)
self._view = view
self.connect_signal(self._view, 'scroll-event', self.on_scroll_event)
self.connect_signal(self._view, 'button-press-event', self.on_button_press_event)
self._view.textsize_document_helper = self
self._default_font = None
self._last_font = None
def stop(self):
if self._default_font:
self._view.override_font(self._default_font)
self.disconnect_signals(self._view)
self._view.textsize_document_helper = None
def update_default_font(self):
context = self._view.get_style_context()
description = context.get_font(context.get_state()).copy()
if not self._last_font or description.hash() != self._last_font.hash():
self._default_font = description
def set_font_size(self, amount):
self.update_default_font()
context = self._view.get_style_context()
description = context.get_font(context.get_state()).copy()
buf = self._view.get_buffer()
size = description.get_size() / Pango.SCALE
if size >= MAX_FONT_SIZE and amount == 1:
return;
if size <= MIN_FONT_SIZE and amount == -1:
return;
description.set_size(max(1, (size + amount)) * Pango.SCALE)
self._view.override_font(description)
self._last_font = description
def larger_text(self):
self.set_font_size(1)
def smaller_text(self):
self.set_font_size(-1)
def normal_size(self):
self.update_default_font()
buf = self._view.get_buffer()
self._view.override_font(self._default_font)
self._last_font = self._default_font
def on_scroll_event(self, view, event):
state = event.state & Gtk.accelerator_get_default_mod_mask()
if state != Gdk.ModifierType.CONTROL_MASK:
return False
if event.direction == Gdk.ScrollDirection.UP:
self.larger_text()
return True
elif event.direction == Gdk.ScrollDirection.DOWN:
self.smaller_text()
return True
elif event.direction == Gdk.ScrollDirection.SMOOTH:
if event.delta_y > 0:
self.smaller_text()
elif event.delta_y < 0:
self.larger_text()
return False
def on_button_press_event(self, view, event):
state = event.state & Gtk.accelerator_get_default_mod_mask()
if state == Gdk.ModifierType.CONTROL_MASK and event.button == 2:
self.normal_size()
return True
else:
return False