/usr/share/pyshared/quodlibet/qltk/textedit.py is in exfalso 3.0.2-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 125 126 127 128 129 130 131 132 133 134 | # -*- coding: utf-8 -*-
# Copyright 2004-2005 Joe Wreschnig, Michael Urman, IƱigo Serna
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation
from gi.repository import Gtk, GLib, Pango
from quodlibet import qltk
from quodlibet import util
from quodlibet.formats._audio import AudioFile
from quodlibet.parse import XMLFromPattern
try:
import gi
gi.require_version("GtkSource", "3.0")
from gi.repository import GtkSource
except (ValueError, ImportError):
TextView = Gtk.TextView
TextBuffer = Gtk.TextBuffer
else:
TextView = GtkSource.View
class TextBuffer(GtkSource.Buffer):
def __init__(self, *args):
super(TextBuffer, self).__init__(*args)
self.set_highlight_matching_brackets(False)
self.set_highlight_syntax(False)
def set_text(self, *args):
self.begin_not_undoable_action()
super(TextBuffer, self).set_text(*args)
self.end_not_undoable_action()
class TextEditBox(Gtk.HBox):
"""A simple text editing area with a default value, a revert button,
and an apply button. The 'buffer' attribute is the text buffer, the
'apply' attribute is the apply button.
FIXME: Button text should changable (without poking the buttons directly).
"""
def __init__(self, default=""):
super(TextEditBox, self).__init__(spacing=6)
sw = Gtk.ScrolledWindow()
sw.set_shadow_type(Gtk.ShadowType.IN)
sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
sw.add(TextView(buffer=TextBuffer()))
self.pack_start(sw, True, True, 0)
self.buffer = sw.get_child().get_buffer()
box = Gtk.VBox(spacing=6)
rev = Gtk.Button(stock=Gtk.STOCK_REVERT_TO_SAVED)
app = Gtk.Button(stock=Gtk.STOCK_APPLY)
box.pack_start(rev, False, True, 0)
box.pack_start(app, False, True, 0)
self.pack_start(box, False, True, 0)
rev.connect_object('clicked', self.buffer.set_text, default)
self.revert = rev
self.apply = app
def __get_text(self):
start, end = self.buffer.get_bounds()
return self.buffer.get_text(start, end, True).decode('utf-8')
text = property(__get_text,
lambda s, v: s.buffer.set_text(v, -1))
class PatternEditBox(TextEditBox):
"""A TextEditBox that stops the apply button's clicked signal if
the pattern is invalid. You need to use connect_after to connect to
it, to get this feature."""
def __init__(self, default=""):
super(PatternEditBox, self).__init__(default)
self.apply.connect('clicked', self.__check_markup)
def __check_markup(self, apply):
try:
f = AudioFile({"~filename": "dummy"})
Pango.parse_markup(XMLFromPattern(self.text) % f, -1, u"\u0000")
except (ValueError, GLib.GError), e:
qltk.ErrorMessage(
self, _("Invalid pattern"),
_("The pattern you entered was invalid. Make sure you enter "
"< and > as \\< and \\> and that your tags are "
"balanced.\n\n%s") % util.escape(str(e))).run()
apply.stop_emission('clicked')
return False
class TextEdit(qltk.UniqueWindow):
"""A window with a text editing box in it."""
Box = TextEditBox
def __init__(self, parent, default=""):
if self.is_not_unique():
return
super(TextEdit, self).__init__()
self.set_title(_("Edit Display"))
self.set_transient_for(qltk.get_top_parent(parent))
self.set_border_width(12)
self.set_default_size(420, 190)
vbox = Gtk.VBox(spacing=12)
close = Gtk.Button(stock=Gtk.STOCK_CLOSE)
close.connect('clicked', lambda *x: self.destroy())
b = Gtk.HButtonBox()
b.set_layout(Gtk.ButtonBoxStyle.END)
b.pack_start(close, True, True, 0)
self.box = box = self.Box(default)
vbox.pack_start(box, True, True, 0)
vbox.pack_start(b, False, True, 0)
self.add(vbox)
self.apply = box.apply
self.revert = box.revert
close.grab_focus()
self.show_all()
text = property(lambda s: s.box.text,
lambda s, v: setattr(s.box, 'text', v))
class PatternEdit(TextEdit):
"""A window with a pattern editing box in it."""
Box = PatternEditBox
|