Add labels attribute in LookupTable object.
authorPeng Huang <shawn.p.huang@gmail.com>
Thu, 4 Jun 2009 02:04:16 +0000 (10:04 +0800)
committerPeng Huang <shawn.p.huang@gmail.com>
Thu, 4 Jun 2009 02:06:13 +0000 (10:06 +0800)
ibus/lookuptable.py
src/ibuslookuptable.c
src/ibuslookuptable.h
ui/gtk/candidatepanel.py

index 8eb4480..13c9a9f 100644 (file)
@@ -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)
index 5e1bc81..d928898 100644 (file)
@@ -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)
index ae20382..47f2a17 100644 (file)
@@ -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.
index 05c4e71..dd1564a 100644 (file)
@@ -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