annotate CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/lib/python3.8/idlelib/percolator.py @ 69:33d812a61356

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 17:55:14 -0400
parents
children
rev   line source
jpayne@69 1 from idlelib.delegator import Delegator
jpayne@69 2 from idlelib.redirector import WidgetRedirector
jpayne@69 3
jpayne@69 4
jpayne@69 5 class Percolator:
jpayne@69 6
jpayne@69 7 def __init__(self, text):
jpayne@69 8 # XXX would be nice to inherit from Delegator
jpayne@69 9 self.text = text
jpayne@69 10 self.redir = WidgetRedirector(text)
jpayne@69 11 self.top = self.bottom = Delegator(text)
jpayne@69 12 self.bottom.insert = self.redir.register("insert", self.insert)
jpayne@69 13 self.bottom.delete = self.redir.register("delete", self.delete)
jpayne@69 14 self.filters = []
jpayne@69 15
jpayne@69 16 def close(self):
jpayne@69 17 while self.top is not self.bottom:
jpayne@69 18 self.removefilter(self.top)
jpayne@69 19 self.top = None
jpayne@69 20 self.bottom.setdelegate(None)
jpayne@69 21 self.bottom = None
jpayne@69 22 self.redir.close()
jpayne@69 23 self.redir = None
jpayne@69 24 self.text = None
jpayne@69 25
jpayne@69 26 def insert(self, index, chars, tags=None):
jpayne@69 27 # Could go away if inheriting from Delegator
jpayne@69 28 self.top.insert(index, chars, tags)
jpayne@69 29
jpayne@69 30 def delete(self, index1, index2=None):
jpayne@69 31 # Could go away if inheriting from Delegator
jpayne@69 32 self.top.delete(index1, index2)
jpayne@69 33
jpayne@69 34 def insertfilter(self, filter):
jpayne@69 35 # Perhaps rename to pushfilter()?
jpayne@69 36 assert isinstance(filter, Delegator)
jpayne@69 37 assert filter.delegate is None
jpayne@69 38 filter.setdelegate(self.top)
jpayne@69 39 self.top = filter
jpayne@69 40
jpayne@69 41 def removefilter(self, filter):
jpayne@69 42 # XXX Perhaps should only support popfilter()?
jpayne@69 43 assert isinstance(filter, Delegator)
jpayne@69 44 assert filter.delegate is not None
jpayne@69 45 f = self.top
jpayne@69 46 if f is filter:
jpayne@69 47 self.top = filter.delegate
jpayne@69 48 filter.setdelegate(None)
jpayne@69 49 else:
jpayne@69 50 while f.delegate is not filter:
jpayne@69 51 assert f is not self.bottom
jpayne@69 52 f.resetcache()
jpayne@69 53 f = f.delegate
jpayne@69 54 f.setdelegate(filter.delegate)
jpayne@69 55 filter.setdelegate(None)
jpayne@69 56
jpayne@69 57
jpayne@69 58 def _percolator(parent): # htest #
jpayne@69 59 import tkinter as tk
jpayne@69 60
jpayne@69 61 class Tracer(Delegator):
jpayne@69 62 def __init__(self, name):
jpayne@69 63 self.name = name
jpayne@69 64 Delegator.__init__(self, None)
jpayne@69 65
jpayne@69 66 def insert(self, *args):
jpayne@69 67 print(self.name, ": insert", args)
jpayne@69 68 self.delegate.insert(*args)
jpayne@69 69
jpayne@69 70 def delete(self, *args):
jpayne@69 71 print(self.name, ": delete", args)
jpayne@69 72 self.delegate.delete(*args)
jpayne@69 73
jpayne@69 74 box = tk.Toplevel(parent)
jpayne@69 75 box.title("Test Percolator")
jpayne@69 76 x, y = map(int, parent.geometry().split('+')[1:])
jpayne@69 77 box.geometry("+%d+%d" % (x, y + 175))
jpayne@69 78 text = tk.Text(box)
jpayne@69 79 p = Percolator(text)
jpayne@69 80 pin = p.insertfilter
jpayne@69 81 pout = p.removefilter
jpayne@69 82 t1 = Tracer("t1")
jpayne@69 83 t2 = Tracer("t2")
jpayne@69 84
jpayne@69 85 def toggle1():
jpayne@69 86 (pin if var1.get() else pout)(t1)
jpayne@69 87 def toggle2():
jpayne@69 88 (pin if var2.get() else pout)(t2)
jpayne@69 89
jpayne@69 90 text.pack()
jpayne@69 91 var1 = tk.IntVar(parent)
jpayne@69 92 cb1 = tk.Checkbutton(box, text="Tracer1", command=toggle1, variable=var1)
jpayne@69 93 cb1.pack()
jpayne@69 94 var2 = tk.IntVar(parent)
jpayne@69 95 cb2 = tk.Checkbutton(box, text="Tracer2", command=toggle2, variable=var2)
jpayne@69 96 cb2.pack()
jpayne@69 97
jpayne@69 98 if __name__ == "__main__":
jpayne@69 99 from unittest import main
jpayne@69 100 main('idlelib.idle_test.test_percolator', verbosity=2, exit=False)
jpayne@69 101
jpayne@69 102 from idlelib.idle_test.htest import run
jpayne@69 103 run(_percolator)