summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/keyboard.py71
1 files changed, 39 insertions, 32 deletions
diff --git a/src/keyboard.py b/src/keyboard.py
index 741d07f..0c8dc2b 100644
--- a/src/keyboard.py
+++ b/src/keyboard.py
@@ -145,34 +145,33 @@ class CaribouHoverWindow(CaribouWindow):
def _update_position(self, placement=None):
placement = placement or self._default_placement
+
+ x = self._calculate_axis(placement.x)
+ y = self._calculate_axis(placement.y)
+
+ self.move(x, y)
+
+ def _calculate_axis(self, axis_placement):
root_bbox = self._get_root_bbox()
bbox = root_bbox
- if placement.stickto == placement.CURSOR:
+ if axis_placement.stickto == CaribouKeyboardPlacement.CURSOR:
bbox = self._cursor_location
- elif placement.stickto == placement.ENTRY:
+ elif axis_placement.stickto == CaribouKeyboardPlacement.ENTRY:
bbox = self._entry_location
- x = bbox.x
- y = bbox.y
-
- if placement.halign == placement.LEFT:
- x += bbox.width
- elif placement.halign == placement.CENTER:
- x += bbox.width/2
+ offset = axis_placement.get_offset(bbox)
- if placement.valign == placement.BOTTOM:
- y += bbox.height
- elif placement.halign == placement.CENTER:
- y += bbox.height/2
+ if axis_placement.align == CaribouKeyboardPlacement.END:
+ offset += axis_placement.get_length(bbox)
+ elif axis_placement.halign == CaribouKeyboardPlacement.CENTER:
+ offset += axis_placement.get_length(bbox)/2
- self.move(x, y)
+ return offset
class CaribouKeyboardPlacement(object):
- LEFT = 'left'
- RIGHT = 'right'
- TOP = 'top'
- BOTTOM = 'bottom'
+ START = 'start'
+ END = 'end'
CENTER = 'center'
SCREEN = 'screen'
@@ -182,20 +181,28 @@ class CaribouKeyboardPlacement(object):
INSIDE = 'inside'
OUTSIDE = 'outside'
- def __init__(self, halign=None, valign=None, stickto=None,
- hgravitate=None, vgravitate=None):
- self.halign = halign or self.LEFT
- self.valign = valign or self.BOTTOM
- self.stickto = stickto or self.CURSOR
- self.hgravitate = hgravitate or self.OUTSIDE
- self.vgravitate = vgravitate or self.OUTSIDE
-
- def copy(self, halign=None, valign=None, stickto=None, gravitate=None):
- return self.__class__(halign or self.halign,
- valign or self.valign,
- stickto or self.stickto,
- hgravitate or self.hgravitate,
- vgravitate or self.vgravitate)
+ class _AxisPlacement(object):
+ def __init__(self, axis, align=None, stickto=None, gravitate=None):
+ self.axis = axis
+ self.align = align or CaribouKeyboardPlacement.END
+ self.stickto = stickto or CaribouKeyboardPlacement.CURSOR
+ self.gravitate = gravitate or CaribouKeyboardPlacement.OUTSIDE
+
+ def copy(self, align=None, stickto=None, gravitate=None):
+ return self.__class__(self.axis,
+ align or self.align,
+ stickto or self.stickto,
+ gravitate or self.gravitate)
+
+ def get_offset(self, bbox):
+ return bbox.x if self.axis == 'x' else bbox.y
+
+ def get_length(self, bbox):
+ return bbox.width if self.axis == 'x' else bbox.height
+
+ def __init__(self, x=None, y=None):
+ self.x = x or self._AxisPlacement('x')
+ self.y = y or self._AxisPlacement('y')
if __name__ == "__main__":
ckbd = CaribouHoverWindow()