Re: GtkEntry right aligned/justified
- From: Olexiy Avramchenko <olexiy irtech cn ua>
- To: Steffen Gutmann <gutmann ieee org>
- Cc: gtk-list gnome org
- Subject: Re: GtkEntry right aligned/justified
- Date: Fri, 20 Feb 2004 12:36:33 +0200
Steffen Gutmann wrote:
Hello Olexiy!
Well, your respose is for a GtkLabel which can surely be aligned in
many ways.
Oops, my fault :(
But my question was for a GtkEntry and I get the believe that for this
class there is no other way than having it left aligned. I didn't try
the other poster's answer yet (using gtk_widget_set_direction) but to
me it seems chaning the direction is something completely different
(reading from right to left) than alignment.
Yes, I'm also unsure about the results.
So, there is no right (or center)-justified/aligned GtkEntry, is there?
There's no way to do this with GtkEntry/GtkEditable API.
It's possible via PangoLayout, with pango_layout_set_alignment(pl,
PANGO_ALIGN_RIGHT). The problem is that GtkEntry always sets the size of
layout when text is changed, so alignment just dont working. I solve
this with connecting to GtkEntry' "expose-event" :
static gboolean set_layout_align(GtkEntry *entry)
{
PangoLayout *pl;
pl = gtk_entry_get_layout(entry);
pango_layout_set_width(pl,
GTK_WIDGET(entry)->allocation.width*PANGO_SCALE);
pango_layout_set_alignment(pl, PANGO_ALIGN_RIGHT);
return FALSE;
}
It sets layout width equal width of GtkEntry every time before real
expose handler pops up.
Modified "entry" sample from GTK+ tarball coming attached.
PS: excuse for my previous post ;)
Olexiy
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
void enter_callback( GtkWidget *widget,
GtkWidget *entry )
{
const gchar *entry_text;
entry_text = gtk_entry_get_text (GTK_ENTRY (entry));
printf("Entry contents: %s\n", entry_text);
}
void entry_toggle_editable( GtkWidget *checkbutton,
GtkWidget *entry )
{
gtk_editable_set_editable (GTK_EDITABLE (entry),
GTK_TOGGLE_BUTTON (checkbutton)->active);
}
void entry_toggle_visibility( GtkWidget *checkbutton,
GtkWidget *entry )
{
gtk_entry_set_visibility (GTK_ENTRY (entry),
GTK_TOGGLE_BUTTON (checkbutton)->active);
}
static gboolean set_layout_align(GtkEntry *entry)
{
PangoLayout *pl;
pl = gtk_entry_get_layout(entry);
pango_layout_set_width(pl, GTK_WIDGET(entry)->allocation.width*PANGO_SCALE);
pango_layout_set_alignment(pl, PANGO_ALIGN_RIGHT);
return FALSE;
}
int main( int argc,
char *argv[] )
{
GtkWidget *window;
GtkWidget *vbox, *hbox;
GtkWidget *entry;
GtkWidget *button;
GtkWidget *check;
gint tmp_pos;
gtk_init (&argc, &argv);
/* create a new window */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (GTK_WIDGET (window), 200, 100);
gtk_window_set_title (GTK_WINDOW (window), "GTK Entry");
g_signal_connect (G_OBJECT (window), "destroy",
G_CALLBACK (gtk_main_quit), NULL);
g_signal_connect_swapped (G_OBJECT (window), "delete_event",
G_CALLBACK (gtk_widget_destroy),
G_OBJECT (window));
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_widget_show (vbox);
entry = gtk_entry_new ();
g_signal_connect(entry, "expose-event", G_CALLBACK(set_layout_align), entry);
gtk_entry_set_max_length (GTK_ENTRY (entry), 50);
g_signal_connect (G_OBJECT (entry), "activate",
G_CALLBACK (enter_callback),
(gpointer) entry);
gtk_entry_set_text (GTK_ENTRY (entry), "hello");
tmp_pos = GTK_ENTRY (entry)->text_length;
gtk_editable_insert_text (GTK_EDITABLE (entry), " world", -1, &tmp_pos);
gtk_editable_select_region (GTK_EDITABLE (entry),
0, GTK_ENTRY (entry)->text_length);
gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
gtk_widget_show (entry);
hbox = gtk_hbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (vbox), hbox);
gtk_widget_show (hbox);
check = gtk_check_button_new_with_label ("Editable");
gtk_box_pack_start (GTK_BOX (hbox), check, TRUE, TRUE, 0);
g_signal_connect (G_OBJECT (check), "toggled",
G_CALLBACK (entry_toggle_editable), (gpointer) entry);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
gtk_widget_show (check);
check = gtk_check_button_new_with_label ("Visible");
gtk_box_pack_start (GTK_BOX (hbox), check, TRUE, TRUE, 0);
g_signal_connect (G_OBJECT (check), "toggled",
G_CALLBACK (entry_toggle_visibility), (gpointer) entry);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
gtk_widget_show (check);
button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
g_signal_connect_swapped (G_OBJECT (button), "clicked",
G_CALLBACK (gtk_widget_destroy),
G_OBJECT (window));
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_widget_grab_default (button);
gtk_widget_show (button);
gtk_widget_show (window);
gtk_main();
return 0;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]