entry: Create entries for displaying specific types of values

I implement Integer, Float, and String entries that update their "value"
property based on the user-provided text when the Enter key is pressed.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2022-09-26 11:36:22 -04:00
parent 47d5f0c0c6
commit 5d3fb980af
2 changed files with 113 additions and 0 deletions

View File

@ -1,6 +1,7 @@
# Copyright 2022 (c) Anna Schumaker.
"""Customized Gtk.Entries for easier development."""
from gi.repository import Gtk
from gi.repository import GObject
from . import format
@ -18,3 +19,50 @@ class Filter(Gtk.SearchEntry):
def get_query(self) -> str | None:
"""Get the query string for the entered text."""
return format.search(self.get_text())
class ValueBase(Gtk.Entry):
"""Base class for value entries."""
def __init__(self, input_purpose: Gtk.InputPurpose, value, **kwargs):
"""Initialize a ValueBase Entry."""
super().__init__(input_purpose=input_purpose,
value=value, text=str(value), **kwargs)
self.connect("notify::value", self.__notify_value)
def __notify_value(self, entry: Gtk.Entry, param) -> None:
self.set_text(str(self.value))
def do_activate(self) -> None:
"""Handle the activate signal."""
self.value = type(self.value)(self.get_text())
class Integer(ValueBase):
"""Entry for Integers."""
value = GObject.Property(type=int)
def __init__(self, value: int = 0, **kwargs):
"""Initialize an Integer Entry."""
super().__init__(Gtk.InputPurpose.DIGITS, value, **kwargs)
class Float(ValueBase):
"""Entry for Floats."""
value = GObject.Property(type=float)
def __init__(self, value: float = 0.0, **kwargs):
"""Initialize a Float Entry."""
super().__init__(Gtk.InputPurpose.NUMBER, value, **kwargs)
class String(ValueBase):
"""Entry for Strings."""
value = GObject.Property(type=str)
def __init__(self, value: str = "", **kwargs):
"""Initialize a String Entry."""
super().__init__(Gtk.InputPurpose.FREE_FORM, value, **kwargs)

View File

@ -25,3 +25,68 @@ class TestFilterEntry(unittest.TestCase):
self.assertEqual(self.entry.get_query(), None)
self.entry.set_text("^test")
self.assertEqual(self.entry.get_query(), "test*")
class TestValueEntry(unittest.TestCase):
"""Test our custom Value Entries."""
def test_integer(self):
"""Test the Integer entry."""
entry = emmental.entry.Integer()
self.assertIsInstance(entry, emmental.entry.ValueBase)
self.assertIsInstance(entry, emmental.entry.Gtk.Entry)
self.assertEqual(entry.get_input_purpose(), Gtk.InputPurpose.DIGITS)
self.assertEqual(entry.value, 0)
self.assertEqual(entry.get_text(), "0")
entry.value = 42
self.assertEqual(entry.get_text(), "42")
entry.set_text("12345")
entry.emit("activate")
self.assertEqual(entry.value, 12345)
entry2 = emmental.entry.Integer(value=42)
self.assertEqual(entry2.value, 42)
self.assertEqual(entry2.get_text(), "42")
def test_float(self):
"""Test the Float entry."""
entry = emmental.entry.Float()
self.assertIsInstance(entry, emmental.entry.ValueBase)
self.assertEqual(entry.get_input_purpose(), Gtk.InputPurpose.NUMBER)
self.assertEqual(entry.value, 0.0)
self.assertEqual(entry.get_text(), "0.0")
entry.value = 4.2
self.assertEqual(entry.get_text(), "4.2")
entry.set_text("1.2345")
entry.emit("activate")
self.assertEqual(entry.value, 1.2345)
entry2 = emmental.entry.Float(value=4.2)
self.assertEqual(entry2.value, 4.2)
self.assertEqual(entry2.get_text(), "4.2")
def test_string(self):
"""Test the String entry."""
entry = emmental.entry.String()
self.assertIsInstance(entry, emmental.entry.ValueBase)
self.assertEqual(entry.get_input_purpose(), Gtk.InputPurpose.FREE_FORM)
self.assertEqual(entry.value, "")
self.assertEqual(entry.get_text(), "")
entry.value = "text"
self.assertEqual(entry.get_text(), "text")
entry.set_text("other text")
entry.emit("activate")
self.assertEqual(entry.value, "other text")
entry2 = emmental.entry.String(value="text")
self.assertEqual(entry2.value, "text")
self.assertEqual(entry2.get_text(), "text")