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
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
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
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
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()
self.__cursor_pos % self.__page_size,
self.__cursor_visible,
self.__round,
- candidates)
+ candidates,
+ self.__labels)
def deserialize(self, struct):
super(LookupTable, self).deserialize(struct)
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)
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
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);
}
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",
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;
}
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);
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;
}
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;
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;
}
gboolean round)
{
g_assert (page_size > 0);
+ g_assert (page_size <= 16);
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)
gboolean round;
GArray *candidates;
+ GArray *labels;
};
struct _IBusLookupTableClass {
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.
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)
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
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)
self.__lookup_table = lookup_table
self.__refresh_candidates()
+ self.__refresh_labels()
def show_lookup_table(self):
self.__lookup_table_visible = True