File: entry4.py

package info (click to toggle)
squeekboard 1.43.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,284 kB
  • sloc: ansic: 2,730; xml: 1,247; python: 296; sh: 48; makefile: 10
file content (104 lines) | stat: -rwxr-xr-x 3,366 bytes parent folder | download | duplicates (3)
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
#!/usr/bin/env python3

import gi
import random
import sys
gi.require_version('Gtk', '4.0')
gi.require_version('GLib', '2.0')

from gi.repository import Gtk
from gi.repository import GLib


def new_grid(items, set_type):
    grid = Gtk.Grid(orientation='vertical', column_spacing=8, row_spacing=8)

    i = 0
    for text, value in items:
        label = Gtk.Label(label=text)
        label.props.margin_top = 6
        label.props.margin_start = 6
        entry = Gtk.Entry(hexpand=True)
        entry.props.margin_top = 6
        entry.props.margin_end = 6
        set_type(entry, value)
        grid.attach(label, 0, i, 1, 1)
        grid.attach(entry, 1, i, 1, 1)
        i += 1
    return grid


class App(Gtk.Application):

    purposes = [
        ("Free form", Gtk.InputPurpose.FREE_FORM),
        ("Alphabetical", Gtk.InputPurpose.ALPHA),
        ("Digits", Gtk.InputPurpose.DIGITS),
        ("Number", Gtk.InputPurpose.NUMBER),
        ("Phone", Gtk.InputPurpose.PHONE),
        ("URL", Gtk.InputPurpose.URL),
        ("E-mail", Gtk.InputPurpose.EMAIL),
        ("Name", Gtk.InputPurpose.NAME),
        ("Password", Gtk.InputPurpose.PASSWORD),
        ("PIN", Gtk.InputPurpose.PIN),
        ("Terminal", Gtk.InputPurpose.TERMINAL),
    ]

    hints = [
        ("OSK provided", Gtk.InputHints.INHIBIT_OSK)
    ]
    purpose_tick_id = 0

    def on_purpose_toggled(self, btn, entry):
        purpose = Gtk.InputPurpose.PIN if btn.get_active() else Gtk.InputPurpose.PASSWORD
        entry.set_input_purpose(purpose)

    def on_timeout(self, e):
        r = random.randint(0, len(self.purposes) - 1)
        (_, purpose) = self.purposes[r]
        print(f"Setting {purpose}")
        e.set_input_purpose(purpose)
        return True

    def on_random_enter(self, controller, entry):
        self.purpose_tick_id = GLib.timeout_add_seconds(3, self.on_timeout, entry)

    def on_random_leave(self, controller, entry):
        GLib.source_remove(self.purpose_tick_id)

    def add_random(self, grid):
        label = Gtk.Label(label="Random")
        entry = Gtk.Entry(hexpand=True)
        entry.set_input_purpose(Gtk.InputPurpose.FREE_FORM)
        grid.attach(label, 0, len(self.purposes), 1, 1)
        grid.attach(entry, 1, len(self.purposes), 1, 1)
        focus_controller = Gtk.EventControllerFocus()
        entry.add_controller(focus_controller)
        focus_controller.connect("enter", self.on_random_enter, entry)
        focus_controller.connect("leave", self.on_random_leave, entry)

    def do_activate(self):
        w = Gtk.ApplicationWindow(application=self)
        w.set_default_size(300, 500)
        notebook = Gtk.Notebook()

        def add_purpose(entry, purpose):
            entry.set_input_purpose(purpose)

        def add_hint(entry, hint):
            entry.set_input_hints(hint)
        purpose_grid = new_grid(self.purposes, add_purpose)
        self.add_random(purpose_grid)
        hint_grid = new_grid(self.hints, add_hint)

        purpose_scroll = Gtk.ScrolledWindow()
        purpose_scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
        purpose_scroll.set_child(purpose_grid)
        notebook.append_page(purpose_scroll, Gtk.Label(label="Purposes"))
        notebook.append_page(hint_grid, Gtk.Label(label="Hints"))
        w.set_child(notebook)
        w.present()


app = App()
app.run(sys.argv)