From: Peng Huang Date: Thu, 4 Jun 2009 02:04:16 +0000 (+0800) Subject: Add labels attribute in LookupTable object. X-Git-Tag: 1.1.0.20090609~13 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b3691888a8686f53529f4faa66d8f51c2a89b98d;p=platform%2Fupstream%2Fibus.git Add labels attribute in LookupTable object. --- diff --git a/ibus/lookuptable.py b/ibus/lookuptable.py index 8eb4480..13c9a9f 100644 --- a/ibus/lookuptable.py +++ b/ibus/lookuptable.py @@ -29,7 +29,7 @@ from exception import * class LookupTable(Serializable): __NAME__ = "IBusLookupTable" - def __init__(self, page_size=5, cursor_pos=0, coursor_visible=True, round=False, candidates=None): + def __init__(self, page_size=5, cursor_pos=0, coursor_visible=True, round=False, candidates=None, labels=None): super(LookupTable, self).__init__() self.__cursor_pos = cursor_pos self.__cursor_visible = True @@ -39,7 +39,7 @@ class LookupTable(Serializable): else: self.__candidates = candidates self.set_page_size(page_size) - self.set_labels(None) + self.set_labels(labels) def set_page_size(self, page_size): self.__page_size = page_size @@ -56,7 +56,10 @@ class LookupTable(Serializable): return self.__page_size def set_labels(self, labels): - self.__labels = labels + if labels == None: + self.__labels = list() + else: + self.__labels = labels def get_labels(self): return self.__labels @@ -159,6 +162,12 @@ class LookupTable(Serializable): def get_candidate(self, index): return self.__candidates[index] + def append_label(self, text): + self.__labels.append(text) + + def get_label(self, index): + return self.__labels[index] + def get_candidates_in_current_page(self): page = self.__cursor_pos / self.__page_size start_index = page * self.__page_size @@ -182,6 +191,9 @@ class LookupTable(Serializable): struct.append(dbus.Boolean(self.__round)) candidates = map(lambda c: serialize_object(c), self.__candidates) struct.append(dbus.Array(candidates, signature="v")) + labels = map(lambda c: serialize_object(c), self.__labels) + struct.append(dbus.Array(labels, signature="v")) + def get_current_page_as_lookup_table(self): candidates = self.get_candidates_in_current_page() @@ -189,7 +201,8 @@ class LookupTable(Serializable): self.__cursor_pos % self.__page_size, self.__cursor_visible, self.__round, - candidates) + candidates, + self.__labels) def deserialize(self, struct): super(LookupTable, self).deserialize(struct) @@ -199,6 +212,7 @@ class LookupTable(Serializable): self.__cursor_visible = struct.pop(0) self.__round = struct.pop(0) self.__candidates = map(deserialize_object, struct.pop(0)) + self.__labels = map(deserialize_object, struct.pop(0)) serializable_register(LookupTable) diff --git a/src/ibuslookuptable.c b/src/ibuslookuptable.c index 5e1bc81..d928898 100644 --- a/src/ibuslookuptable.c +++ b/src/ibuslookuptable.c @@ -73,13 +73,14 @@ ibus_lookup_table_class_init (IBusLookupTableClass *klass) serializable_class->deserialize = (IBusSerializableDeserializeFunc) ibus_lookup_table_deserialize; serializable_class->copy = (IBusSerializableCopyFunc) ibus_lookup_table_copy; - g_string_append (serializable_class->signature, "uubbav"); + g_string_append (serializable_class->signature, "uubbavav"); } static void ibus_lookup_table_init (IBusLookupTable *table) { table->candidates = g_array_new (TRUE, TRUE, sizeof (IBusText *)); + table->labels = g_array_new (TRUE, TRUE, sizeof (IBusText *)); } static void @@ -97,6 +98,16 @@ ibus_lookup_table_destroy (IBusLookupTable *table) g_free (sp); } + if (table->labels != NULL) { + p = sp = (IBusText **) g_array_free (table->labels, FALSE); + table->labels = NULL; + while (*p != NULL) { + g_object_unref (*p); + p ++; + } + g_free (sp); + } + IBUS_OBJECT_CLASS (parent_class)->destroy ((IBusObject *) table); } @@ -125,6 +136,7 @@ ibus_lookup_table_serialize (IBusLookupTable *table, retval = ibus_message_iter_append (iter, G_TYPE_BOOLEAN, &table->round); g_return_val_if_fail (retval, FALSE); + // append candidates retval = ibus_message_iter_open_container (iter, IBUS_TYPE_ARRAY, "v", @@ -145,6 +157,27 @@ ibus_lookup_table_serialize (IBusLookupTable *table, retval = ibus_message_iter_close_container (iter, &array_iter); g_return_val_if_fail (retval, FALSE); + // append labels + retval = ibus_message_iter_open_container (iter, + IBUS_TYPE_ARRAY, + "v", + &array_iter); + g_return_val_if_fail (retval, FALSE); + + for (i = 0;; i++) { + IBusText *text; + + text = ibus_lookup_table_get_label (table, i); + if (text == NULL) + break; + + retval = ibus_message_iter_append (&array_iter, IBUS_TYPE_TEXT, &text); + g_return_val_if_fail (retval, FALSE); + } + + retval = ibus_message_iter_close_container (iter, &array_iter); + g_return_val_if_fail (retval, FALSE); + return TRUE; } @@ -172,6 +205,7 @@ ibus_lookup_table_deserialize (IBusLookupTable *table, retval = ibus_message_iter_get (iter, G_TYPE_BOOLEAN, &table->round); g_return_val_if_fail (retval, FALSE); + // deserialize candidates retval = ibus_message_iter_recurse (iter, IBUS_TYPE_ARRAY, &array_iter); g_return_val_if_fail (retval, FALSE); @@ -185,6 +219,20 @@ ibus_lookup_table_deserialize (IBusLookupTable *table, ibus_message_iter_next (iter); + // deserialize labels + retval = ibus_message_iter_recurse (iter, IBUS_TYPE_ARRAY, &array_iter); + g_return_val_if_fail (retval, FALSE); + + while (ibus_message_iter_get_arg_type (&array_iter) != G_TYPE_INVALID) { + IBusText *text; + retval = ibus_message_iter_get (&array_iter, IBUS_TYPE_TEXT, &text); + g_return_val_if_fail (retval, FALSE); + + ibus_lookup_table_append_label (table, text); + } + + ibus_message_iter_next (iter); + return TRUE; } @@ -201,6 +249,7 @@ ibus_lookup_table_copy (IBusLookupTable *dest, g_return_val_if_fail (IBUS_IS_LOOKUP_TABLE (dest), FALSE); g_return_val_if_fail (IBUS_IS_LOOKUP_TABLE (src), FALSE); + // copy candidates for (i = 0;; i++) { IBusText *text; @@ -214,6 +263,20 @@ ibus_lookup_table_copy (IBusLookupTable *dest, g_object_unref (text); } + // copy labels + for (i = 0;; i++) { + IBusText *text; + + text = ibus_lookup_table_get_label (src, i); + if (text == NULL) + break; + + text = (IBusText *) ibus_serializable_copy ((IBusSerializable *) text); + + ibus_lookup_table_append_label (dest, text); + g_object_unref (text); + } + return TRUE; } @@ -224,6 +287,7 @@ ibus_lookup_table_new (guint page_size, gboolean round) { g_assert (page_size > 0); + g_assert (page_size <= 16); IBusLookupTable *table; @@ -260,6 +324,28 @@ ibus_lookup_table_get_candidate (IBusLookupTable *table, return g_array_index (table->candidates, IBusText *, index); } +void +ibus_lookup_table_append_label (IBusLookupTable *table, + IBusText *text) +{ + g_return_if_fail (IBUS_IS_LOOKUP_TABLE (table)); + g_return_if_fail (IBUS_IS_TEXT (text)); + + g_object_ref (text); + g_array_append_val (table->labels, text); +} + +IBusText * +ibus_lookup_table_get_label (IBusLookupTable *table, + guint index) +{ + g_return_val_if_fail (IBUS_IS_LOOKUP_TABLE (table), NULL); + + if (index >= table->labels->len) + return NULL; + + return g_array_index (table->labels, IBusText *, index); +} void ibus_lookup_table_clear (IBusLookupTable *table) diff --git a/src/ibuslookuptable.h b/src/ibuslookuptable.h index ae20382..47f2a17 100644 --- a/src/ibuslookuptable.h +++ b/src/ibuslookuptable.h @@ -78,6 +78,7 @@ struct _IBusLookupTable { gboolean round; GArray *candidates; + GArray *labels; }; struct _IBusLookupTableClass { @@ -126,6 +127,30 @@ IBusText *ibus_lookup_table_get_candidate guint index); /** + * ibus_lookup_table_append_label: + * @table: An IBusLookupTable. + * @text: candidate word/phrase to be appended (in IBusText format). + * + * Append a candidate word/phrase to IBusLookupTable. + */ +void ibus_lookup_table_append_label + (IBusLookupTable *table, + IBusText *text); + +/** + * ibus_lookup_table_get_label: + * @table: An IBusLookupTable. + * @index: Index in the Lookup table. + * @returns: IBusText at the given index; NULL if no such IBusText. + * + * Return IBusText at the given index. + */ +IBusText *ibus_lookup_table_get_label + (IBusLookupTable *table, + guint index); + + +/** * ibus_lookup_table_set_cursor_pos: * @table: An IBusLookupTable. * @cursor_pos: The position of cursor. diff --git a/ui/gtk/candidatepanel.py b/ui/gtk/candidatepanel.py index 05c4e71..dd1564a 100644 --- a/ui/gtk/candidatepanel.py +++ b/ui/gtk/candidatepanel.py @@ -56,7 +56,7 @@ class CandidateArea(gtk.HBox): self.pack_start(VSeparator(), False, False, 0) self.pack_start(self.__vbox2, True, True, 4) - for i in xrange(1, 11): + for i in xrange(1, 17): label1 = Label("%d." % (i % 10)) label1.set_alignment(0.0, 0.5) label1.set_no_show_all(True) @@ -81,6 +81,21 @@ class CandidateArea(gtk.HBox): self.__labels[0][0].show() self.__labels[0][1].show() + def set_labels(self, labels): + if not labels: + for i in xrange(0, 16): + self.__labels[i][0].set_text("%d." % ((i +1) % 10)) + self.__labels[i][0].set_property("attributes", None) + return + + i = 0 + for text, attrs in labels: + self.__labels[i][0].set_text(text) + self.__labels[i][0].set_property("attributes", attrs) + i += 1 + if i >= 16: + break + def set_candidates(self, candidates, focus_candidate = 0, show_cursor = True): assert len(candidates) <= len(self.__labels) i = 0 @@ -304,6 +319,15 @@ class CandidatePanel(gtk.VBox): self.__aux_attrs = attrs self.__aux_label.set_attributes(attrs) + def __refresh_labels(self): + labels = self.__lookup_table.get_labels() + if labels: + labels = map(lambda x: (x.text, PangoAttrList(x.attributes, x.text)), labels) + else: + labels = None + self.__candidate_area.set_labels(labels) + + def __refresh_candidates(self): candidates = self.__lookup_table.get_candidates_in_current_page() candidates = map(lambda x: (x.text, PangoAttrList(x.attributes, x.text)), candidates) @@ -323,6 +347,7 @@ class CandidatePanel(gtk.VBox): self.__lookup_table = lookup_table self.__refresh_candidates() + self.__refresh_labels() def show_lookup_table(self): self.__lookup_table_visible = True