module Gtk::Editable

Overview

GtkEditable is an interface for text editing widgets.

Typical examples of editable widgets are Gtk#Entry and Gtk#SpinButton. It contains functions for generically manipulating an editable widget, a large number of action signals used for key bindings, and several signals that an application can connect to modify the behavior of a widget.

As an example of the latter usage, by connecting the following handler to [signal@Gtk.Editable::insert-text], an application can convert all entry into a widget into uppercase.

Forcing entry to uppercase.

WARNING ⚠️ The following code is in c ⚠️

#include <ctype.h>

void
insert_text_handler (GtkEditable *editable,
                     const char  *text,
                     int          length,
                     int         *position,
                     gpointer     data)
{
  char *result = g_utf8_strup (text, length);

  g_signal_handlers_block_by_func (editable,
                               (gpointer) insert_text_handler, data);
  gtk_editable_insert_text (editable, result, length, position);
  g_signal_handlers_unblock_by_func (editable,
                                     (gpointer) insert_text_handler, data);

  g_signal_stop_emission_by_name (editable, "insert_text");

  g_free (result);
}

Implementing GtkEditable

The most likely scenario for implementing GtkEditable on your own widget is that you will embed a GtkText inside a complex widget, and want to delegate the editable functionality to that text widget. GtkEditable provides some utility functions to make this easy.

In your class_init function, call Gtk::Editable#install_properties, passing the first available property ID:

WARNING ⚠️ The following code is in c ⚠️

static void
my_class_init (MyClass *class)
{
  ...
  g_object_class_install_properties (object_class, NUM_PROPERTIES, props);
  gtk_editable_install_properties (object_clas, NUM_PROPERTIES);
  ...
}

In your interface_init function for the GtkEditable interface, provide an implementation for the get_delegate vfunc that returns your text widget:

WARNING ⚠️ The following code is in c ⚠️

GtkEditable *
get_editable_delegate (GtkEditable *editable)
{
  return GTK_EDITABLE (MY_WIDGET (editable)->text_widget);
}

static void
my_editable_init (GtkEditableInterface *iface)
{
  iface->get_delegate = get_editable_delegate;
}

You don't need to provide any other vfuncs. The default implementations work by forwarding to the delegate that the GtkEditableInterface.get_delegate() vfunc returns.

In your instance_init function, create your text widget, and then call Gtk::Editable#init_delegate:

WARNING ⚠️ The following code is in c ⚠️

static void
my_widget_init (MyWidget *self)
{
  ...
  self->text_widget = gtk_text_new ();
  gtk_editable_init_delegate (GTK_EDITABLE (self));
  ...
}

In your dispose function, call Gtk::Editable#finish_delegate before destroying your text widget:

WARNING ⚠️ The following code is in c ⚠️

static void
my_widget_dispose (GObject *object)
{
  ...
  gtk_editable_finish_delegate (GTK_EDITABLE (self));
  g_clear_pointer (&self->text_widget, gtk_widget_unparent);
  ...
}

Finally, use Gtk::Editable#delegate_set_property in your set_property function (and similar for get_property), to set the editable properties:

WARNING ⚠️ The following code is in c ⚠️

  ...
  if (gtk_editable_delegate_set_property (object, prop_id, value, pspec))
    return;

  switch (prop_id)
  ...

It is important to note that if you create a GtkEditable that uses a delegate, the low level [signal@Gtk.Editable::insert-text] and [signal@Gtk.Editable::delete-text] signals will be propagated from the "wrapper" editable to the delegate, but they will not be propagated from the delegate to the "wrapper" editable, as they would cause an infinite recursion. If you wish to connect to the [signal@Gtk.Editable::insert-text] and [signal@Gtk.Editable::delete-text] signals, you will need to connect to them on the delegate obtained via Gtk::Editable#delegate.

Direct including types

Defined in:

lib/gi-crystal/src/auto/gtk-4.0/editable.cr

Class Method Summary

Instance Method Summary

Class Method Detail

def self.delegate_get_property(object : GObject::Object, prop_id : UInt32, value : _, pspec : GObject::ParamSpec) : Bool #

def self.delegate_set_property(object : GObject::Object, prop_id : UInt32, value : _, pspec : GObject::ParamSpec) : Bool #

def self.g_type : UInt64 #

def self.install_properties(object_class : GObject::ObjectClass, first_prop : UInt32) : UInt32 #

Instance Method Detail

def alignment : Float32 #

def alignment=(xalign : Float32) : Nil #

def changed_signal #

def chars(start_pos : Int32, end_pos : Int32) : String #

def cursor_position : Int32 #

def delegate : Gtk::Editable? #

def delete_selection : Nil #

def delete_text(start_pos : Int32, end_pos : Int32) : Nil #

def delete_text_signal #

def editable : Bool #

def editable=(is_editable : Bool) : Nil #

def editable? : Bool #

def enable_undo : Bool #

def enable_undo=(enable_undo : Bool) : Nil #

def enable_undo? : Bool #

def finish_delegate : Nil #

def init_delegate : Nil #

def insert_text(text : String, length : Int32, position : Int32) : Nil #

def insert_text_signal #

def max_width_chars : Int32 #

def max_width_chars=(n_chars : Int32) : Nil #

def position : Int32 #

def position=(position : Int32) : Nil #

def select_region(start_pos : Int32, end_pos : Int32) : Nil #

def selection_bound : Int32 #

def selection_bounds : Bool #

def text : String #

def text=(text : String) : Nil #

abstract def to_unsafe #

def width_chars : Int32 #

def width_chars=(n_chars : Int32) : Nil #

def xalign : Float32 #

def xalign=(value : Float32) : Float32 #