bugfix
This commit is contained in:
parent
0c616b2845
commit
1c17b6165c
124
kivyblocks/sizeposbehavior.py
Normal file
124
kivyblocks/sizeposbehavior.py
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
|
||||||
|
from kivy.clock import Clock
|
||||||
|
from kivy.properties import BooleanProperty, NumericProperty
|
||||||
|
from kivy.graphics import Color, Line
|
||||||
|
|
||||||
|
class SizePosBehavior(object):
|
||||||
|
resizable = BooleanProperty(False)
|
||||||
|
movable = BooleanProperty(False)
|
||||||
|
border_width = NumericProperty(8)
|
||||||
|
def __init__(self, **kw):
|
||||||
|
self.trigger_task = None
|
||||||
|
self.act_type = None
|
||||||
|
self.bind(on_touch_down, self.touchdown)
|
||||||
|
self.bind(on_touch_move, self.touchmove)
|
||||||
|
self.bind(on_touch_up, self.touchup)
|
||||||
|
self.sp_enable = kw.get('sp_enable', False)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def properties(self):
|
||||||
|
return [
|
||||||
|
'resizable',
|
||||||
|
'movable',
|
||||||
|
'border_width'
|
||||||
|
]
|
||||||
|
|
||||||
|
def enable_resize_move(self):
|
||||||
|
self.sp_enable = True
|
||||||
|
|
||||||
|
def disable_resize_move(self):
|
||||||
|
self.sp_enable = False
|
||||||
|
|
||||||
|
def identify_type(self):
|
||||||
|
x, y = self.start_touch_pos
|
||||||
|
minx, maxx = self.pos[0] + self.border_width, self.width - self.border_width
|
||||||
|
miny, maxy = self.pos[1] + self.border_width, self.height - self.border_width
|
||||||
|
self.act_type = 'resize'
|
||||||
|
if x >= minx and x < maxx:
|
||||||
|
if y >= miny and y <= maxy:
|
||||||
|
self.act_type = 'move'
|
||||||
|
return
|
||||||
|
if x - self.pos[0] < self.border_width:
|
||||||
|
self.lines.append('left')
|
||||||
|
if maxx - x < self.border_width:
|
||||||
|
self.lines.append('top')
|
||||||
|
if y - self.pos[1] < self.border_width:
|
||||||
|
self.lines.append('right')
|
||||||
|
if maxy - y < self.border_width:
|
||||||
|
self.lines.append('bottom')
|
||||||
|
|
||||||
|
def touchdown(self, o, touch):
|
||||||
|
if not self.collide_point(*touch.pos):
|
||||||
|
return
|
||||||
|
if not self.sp_eanble:
|
||||||
|
return
|
||||||
|
touch.grab(self)
|
||||||
|
self.start_touch_pos = touch.pos
|
||||||
|
self.start_offset = touch.pos[0] - self.pos[0], touch.pos[1] - self.pos[1]
|
||||||
|
self.act_type = None
|
||||||
|
self.lines = []
|
||||||
|
self.trigger_task = Clock.schedule_once(self.identify_type, 0.5)
|
||||||
|
|
||||||
|
def touchmove(self, o, touch):
|
||||||
|
if not self.parent.collide_point(*touch.pos):
|
||||||
|
return
|
||||||
|
if not self.sp_eanble:
|
||||||
|
return
|
||||||
|
if self.act_type is None:
|
||||||
|
return
|
||||||
|
if touch.grab_current != self:
|
||||||
|
return
|
||||||
|
if self.act_type == 'move':
|
||||||
|
pos = touch.pos
|
||||||
|
maxx = self.parent.width
|
||||||
|
maxy = self.parent.height
|
||||||
|
x = pos[0] - self.start_offset[0]
|
||||||
|
y = pos[1] - self.start_offset[1]
|
||||||
|
if x < 0:
|
||||||
|
x = 0
|
||||||
|
if x > maxx - self.width:
|
||||||
|
x = maxx - self.width
|
||||||
|
if y < 0:
|
||||||
|
y = 0
|
||||||
|
if y > maxy - self.height:
|
||||||
|
y = maxy - self.height
|
||||||
|
self.pos = x, y
|
||||||
|
self.pos_hint = {'x':x/maxx, 'y':y/maxy}
|
||||||
|
self.draw_box()
|
||||||
|
if self.act_type == 'resize':
|
||||||
|
pos = touch.pos
|
||||||
|
xoffset = pos[0] - self.start_touch_pos[0]
|
||||||
|
yoffset = pos[1] - self.start_touch_pos[1]
|
||||||
|
for l in self.lines:
|
||||||
|
if l == 'left':
|
||||||
|
self.width -= xoffset
|
||||||
|
self.x -= xoffset
|
||||||
|
elif l == 'top':
|
||||||
|
self.height -= yoffset
|
||||||
|
self.y -= yoffset
|
||||||
|
elif l == 'right':
|
||||||
|
self.width += xoffset
|
||||||
|
else:
|
||||||
|
self.heigth += yoffset
|
||||||
|
|
||||||
|
def touchup(self, o, touch):
|
||||||
|
if self.trigger_task:
|
||||||
|
self.trigger_task.cancel()
|
||||||
|
self.trigger_task = None
|
||||||
|
if touch.grab_current is self:
|
||||||
|
touch.ungrab(self)
|
||||||
|
if not self.sp_enable:
|
||||||
|
return
|
||||||
|
self.start_touch_pos = None
|
||||||
|
self.start_offset = None
|
||||||
|
|
||||||
|
def draw_border(self):
|
||||||
|
if not self.sp_eanble:
|
||||||
|
return
|
||||||
|
self.canvas.after.clear()
|
||||||
|
with self.canvas.after:
|
||||||
|
Color(1,0,0,1)
|
||||||
|
Line(rectangle=(*self.pos, *self.size), width=1)
|
||||||
|
|
||||||
|
def undraw_border(self):
|
||||||
|
self.canvas.after.clear()
|
Loading…
Reference in New Issue
Block a user