|
Packit Service |
1d8f1c |
# vim:set et sts=4 sw=4:
|
|
Packit Service |
1d8f1c |
#
|
|
Packit Service |
1d8f1c |
# ibus - The Input Bus
|
|
Packit Service |
1d8f1c |
#
|
|
Packit Service |
1d8f1c |
# Copyright (c) 2007-2010 Peng Huang <shawn.p.huang@gmail.com>
|
|
Packit Service |
1d8f1c |
# Copyright (c) 2007-2010 Red Hat, Inc.
|
|
Packit Service |
1d8f1c |
#
|
|
Packit Service |
1d8f1c |
# This library is free software; you can redistribute it and/or
|
|
Packit Service |
1d8f1c |
# modify it under the terms of the GNU Lesser General Public
|
|
Packit Service |
1d8f1c |
# License as published by the Free Software Foundation; either
|
|
Packit Service |
1d8f1c |
# version 2.1 of the License, or (at your option) any later version.
|
|
Packit Service |
1d8f1c |
#
|
|
Packit Service |
1d8f1c |
# This library is distributed in the hope that it will be useful,
|
|
Packit Service |
1d8f1c |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
1d8f1c |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
1d8f1c |
# Lesser General Public License for more details.
|
|
Packit Service |
1d8f1c |
#
|
|
Packit Service |
1d8f1c |
# You should have received a copy of the GNU Lesser General Public
|
|
Packit Service |
1d8f1c |
# License along with this library; if not, write to the Free Software
|
|
Packit Service |
1d8f1c |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
|
Packit Service |
1d8f1c |
# USA
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
__all__ = (
|
|
Packit Service |
1d8f1c |
"LookupTable",
|
|
Packit Service |
1d8f1c |
)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
import dbus
|
|
Packit Service |
1d8f1c |
from common import *
|
|
Packit Service |
1d8f1c |
from serializable import *
|
|
Packit Service |
1d8f1c |
from exception import *
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
class LookupTable(Serializable):
|
|
Packit Service |
1d8f1c |
__gtype_name__ = "PYIBusLookupTable"
|
|
Packit Service |
1d8f1c |
__NAME__ = "IBusLookupTable"
|
|
Packit Service |
1d8f1c |
def __init__(self, page_size=5, cursor_pos=0, coursor_visible=True, round=False,
|
|
Packit Service |
1d8f1c |
orientation=ORIENTATION_SYSTEM, candidates=None, labels=None):
|
|
Packit Service |
1d8f1c |
super(LookupTable, self).__init__()
|
|
Packit Service |
1d8f1c |
self.__cursor_pos = cursor_pos
|
|
Packit Service |
1d8f1c |
self.__cursor_visible = True
|
|
Packit Service |
1d8f1c |
self.__round = round
|
|
Packit Service |
1d8f1c |
self.__orientation = orientation
|
|
Packit Service |
1d8f1c |
if candidates == None:
|
|
Packit Service |
1d8f1c |
self.__candidates = list()
|
|
Packit Service |
1d8f1c |
else:
|
|
Packit Service |
1d8f1c |
self.__candidates = candidates
|
|
Packit Service |
1d8f1c |
self.set_page_size(page_size)
|
|
Packit Service |
1d8f1c |
self.set_labels(labels)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def set_page_size(self, page_size):
|
|
Packit Service |
1d8f1c |
self.__page_size = page_size
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_page_size(self):
|
|
Packit Service |
1d8f1c |
return self.__page_size
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_current_page_size(self):
|
|
Packit Service |
1d8f1c |
nr_candidate = len(self.__candidates)
|
|
Packit Service |
1d8f1c |
nr_page, last_page_size = divmod(nr_candidate, self.__page_size)
|
|
Packit Service |
1d8f1c |
if self.__cursor_pos / self.__page_size == nr_page:
|
|
Packit Service |
1d8f1c |
return last_page_size
|
|
Packit Service |
1d8f1c |
else:
|
|
Packit Service |
1d8f1c |
return self.__page_size
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def set_labels(self, labels):
|
|
Packit Service |
1d8f1c |
if labels == None:
|
|
Packit Service |
1d8f1c |
self.__labels = list()
|
|
Packit Service |
1d8f1c |
else:
|
|
Packit Service |
1d8f1c |
self.__labels = labels
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_labels(self):
|
|
Packit Service |
1d8f1c |
return self.__labels
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def show_cursor(self, show=True):
|
|
Packit Service |
1d8f1c |
self.__cursor_visible = show
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def is_cursor_visible(self):
|
|
Packit Service |
1d8f1c |
return self.__cursor_visible
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_current_page_start(self):
|
|
Packit Service |
1d8f1c |
return (self.__cursor_pos / self.__page_size) * self.__page_size
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def set_cursor_pos(self, pos):
|
|
Packit Service |
1d8f1c |
if pos >= len(self.__candidates) or pos < 0:
|
|
Packit Service |
1d8f1c |
return False
|
|
Packit Service |
1d8f1c |
self.__cursor_pos = pos
|
|
Packit Service |
1d8f1c |
return True
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_cursor_pos(self):
|
|
Packit Service |
1d8f1c |
return self.__cursor_pos
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_cursor_pos_in_current_page(self):
|
|
Packit Service |
1d8f1c |
page, pos_in_page = divmod(self.__cursor_pos, self.__page_size)
|
|
Packit Service |
1d8f1c |
return pos_in_page
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def set_cursor_pos_in_current_page(self, pos):
|
|
Packit Service |
1d8f1c |
if pos < 0 or pos >= self.__page_size:
|
|
Packit Service |
1d8f1c |
return False
|
|
Packit Service |
1d8f1c |
pos += self.get_current_page_start()
|
|
Packit Service |
1d8f1c |
if pos >= len(self.__candidates):
|
|
Packit Service |
1d8f1c |
return False
|
|
Packit Service |
1d8f1c |
self.__cursor_pos = pos
|
|
Packit Service |
1d8f1c |
return True
|
|
Packit Service |
1d8f1c |
def set_orientation(self, orientation):
|
|
Packit Service |
1d8f1c |
self.__orientation = orientation
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_orientation(self):
|
|
Packit Service |
1d8f1c |
return self.__orientation
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def page_up(self):
|
|
Packit Service |
1d8f1c |
if self.__cursor_pos < self.__page_size:
|
|
Packit Service |
1d8f1c |
if self.__round:
|
|
Packit Service |
1d8f1c |
nr_candidates = len(self.__candidates)
|
|
Packit Service |
1d8f1c |
max_page = nr_candidates / self.__page_size
|
|
Packit Service |
1d8f1c |
self.__cursor_pos += max_page * self.__page_size
|
|
Packit Service |
1d8f1c |
if self.__cursor_pos > nr_candidates - 1:
|
|
Packit Service |
1d8f1c |
self.__cursor_pos = nr_candidates - 1
|
|
Packit Service |
1d8f1c |
return True
|
|
Packit Service |
1d8f1c |
else:
|
|
Packit Service |
1d8f1c |
return False
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
self.__cursor_pos -= self.__page_size
|
|
Packit Service |
1d8f1c |
return True
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def page_down(self):
|
|
Packit Service |
1d8f1c |
current_page = self.__cursor_pos / self.__page_size
|
|
Packit Service |
1d8f1c |
nr_candidates = len(self.__candidates)
|
|
Packit Service |
1d8f1c |
max_page = nr_candidates / self.__page_size
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
if current_page >= max_page:
|
|
Packit Service |
1d8f1c |
if self.__round:
|
|
Packit Service |
1d8f1c |
self.__cursor_pos %= self.__page_size
|
|
Packit Service |
1d8f1c |
return True
|
|
Packit Service |
1d8f1c |
else:
|
|
Packit Service |
1d8f1c |
return False
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
pos = self.__cursor_pos + self.__page_size
|
|
Packit Service |
1d8f1c |
if pos >= nr_candidates:
|
|
Packit Service |
1d8f1c |
pos = nr_candidates - 1
|
|
Packit Service |
1d8f1c |
self.__cursor_pos = pos
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
return True
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def cursor_up(self):
|
|
Packit Service |
1d8f1c |
if self.__cursor_pos == 0:
|
|
Packit Service |
1d8f1c |
if self.__round:
|
|
Packit Service |
1d8f1c |
self.__cursor_pos = len(self.__candidates) - 1
|
|
Packit Service |
1d8f1c |
return True
|
|
Packit Service |
1d8f1c |
else:
|
|
Packit Service |
1d8f1c |
return False
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
self.__cursor_pos -= 1
|
|
Packit Service |
1d8f1c |
return True
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def cursor_down(self):
|
|
Packit Service |
1d8f1c |
if self.__cursor_pos == len(self.__candidates) - 1:
|
|
Packit Service |
1d8f1c |
if self.__round:
|
|
Packit Service |
1d8f1c |
self.__cursor_pos = 0
|
|
Packit Service |
1d8f1c |
return True
|
|
Packit Service |
1d8f1c |
else:
|
|
Packit Service |
1d8f1c |
return False
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
self.__cursor_pos += 1
|
|
Packit Service |
1d8f1c |
return True
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def clean(self):
|
|
Packit Service |
1d8f1c |
self.__candidates = list()
|
|
Packit Service |
1d8f1c |
self.__cursor_pos = 0
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def append_candidate(self, text):
|
|
Packit Service |
1d8f1c |
self.__candidates.append(text)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_candidate(self, index):
|
|
Packit Service |
1d8f1c |
return self.__candidates[index]
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def append_label(self, text):
|
|
Packit Service |
1d8f1c |
self.__labels.append(text)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_label(self, index):
|
|
Packit Service |
1d8f1c |
return self.__labels[index]
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_candidates_in_current_page(self):
|
|
Packit Service |
1d8f1c |
page = self.__cursor_pos / self.__page_size
|
|
Packit Service |
1d8f1c |
start_index = page * self.__page_size
|
|
Packit Service |
1d8f1c |
end_index = min((page + 1) * self.__page_size, len(self.__candidates))
|
|
Packit Service |
1d8f1c |
return self.__candidates[start_index:end_index]
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_current_candidate(self):
|
|
Packit Service |
1d8f1c |
return self.__candidates [self.__cursor_pos]
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_number_of_candidates(self):
|
|
Packit Service |
1d8f1c |
return len(self.__candidates)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def __len__(self):
|
|
Packit Service |
1d8f1c |
return self.get_number_of_candidates()
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def serialize(self, struct):
|
|
Packit Service |
1d8f1c |
super(LookupTable, self).serialize(struct)
|
|
Packit Service |
1d8f1c |
struct.append(dbus.UInt32(self.__page_size))
|
|
Packit Service |
1d8f1c |
struct.append(dbus.UInt32(self.__cursor_pos))
|
|
Packit Service |
1d8f1c |
struct.append(dbus.Boolean(self.__cursor_visible))
|
|
Packit Service |
1d8f1c |
struct.append(dbus.Boolean(self.__round))
|
|
Packit Service |
1d8f1c |
struct.append(dbus.Int32(self.__orientation))
|
|
Packit Service |
1d8f1c |
candidates = map(lambda c: serialize_object(c), self.__candidates)
|
|
Packit Service |
1d8f1c |
struct.append(dbus.Array(candidates, signature="v"))
|
|
Packit Service |
1d8f1c |
labels = map(lambda c: serialize_object(c), self.__labels)
|
|
Packit Service |
1d8f1c |
struct.append(dbus.Array(labels, signature="v"))
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def get_current_page_as_lookup_table(self):
|
|
Packit Service |
1d8f1c |
candidates = self.get_candidates_in_current_page()
|
|
Packit Service |
1d8f1c |
return LookupTable(self.__page_size,
|
|
Packit Service |
1d8f1c |
self.__cursor_pos % self.__page_size,
|
|
Packit Service |
1d8f1c |
self.__cursor_visible,
|
|
Packit Service |
1d8f1c |
self.__round,
|
|
Packit Service |
1d8f1c |
self.__orientation,
|
|
Packit Service |
1d8f1c |
candidates,
|
|
Packit Service |
1d8f1c |
self.__labels)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def deserialize(self, struct):
|
|
Packit Service |
1d8f1c |
super(LookupTable, self).deserialize(struct)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
self.__page_size = struct.pop(0)
|
|
Packit Service |
1d8f1c |
self.__cursor_pos = struct.pop(0)
|
|
Packit Service |
1d8f1c |
self.__cursor_visible = struct.pop(0)
|
|
Packit Service |
1d8f1c |
self.__round = struct.pop(0)
|
|
Packit Service |
1d8f1c |
self.__orientation = struct.pop(0)
|
|
Packit Service |
1d8f1c |
self.__candidates = map(deserialize_object, struct.pop(0))
|
|
Packit Service |
1d8f1c |
self.__labels = map(deserialize_object, struct.pop(0))
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
def test():
|
|
Packit Service |
1d8f1c |
t = LookupTable()
|
|
Packit Service |
1d8f1c |
# attrs = AttrList()
|
|
Packit Service |
1d8f1c |
# attrs.append(AttributeBackground(RGB(233, 0,1), 0, 3))
|
|
Packit Service |
1d8f1c |
# attrs.append(AttributeUnderline(1, 3, 5))
|
|
Packit Service |
1d8f1c |
t.append_candidate("Hello")
|
|
Packit Service |
1d8f1c |
value = serialize_object(t)
|
|
Packit Service |
1d8f1c |
t = deserialize_object(value)
|
|
Packit Service |
1d8f1c |
t = t.get_current_page_as_lookup_table()
|
|
Packit Service |
1d8f1c |
value = serialize_object(t)
|
|
Packit Service |
1d8f1c |
t = deserialize_object(value)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
if __name__ == "__main__":
|
|
Packit Service |
1d8f1c |
test()
|