multiple selection
This commit is contained in:
parent
0fe82c1006
commit
fcd15da3f3
61
cross.py
61
cross.py
@ -2,6 +2,7 @@ import math
|
||||
import sys
|
||||
from kivy.graphics import Color,Line,Rectangle
|
||||
from kivy.uix.widget import Widget
|
||||
from kivy.core.window import Window
|
||||
|
||||
from point import Point
|
||||
from tools import isint_nonzero,sgn
|
||||
@ -223,12 +224,22 @@ class Cross_painter(Widget):
|
||||
# cross under mouse
|
||||
self.undermouse=None
|
||||
|
||||
# list of selected crosses
|
||||
self.selected=[]
|
||||
|
||||
# app is used to share information between widgets
|
||||
self.app=app
|
||||
|
||||
# modifiers
|
||||
self.modifiers=[]
|
||||
|
||||
# init Widget
|
||||
super(Cross_painter,self).__init__(**kwargs)
|
||||
|
||||
# init keyboard
|
||||
self.keyboard = Window.request_keyboard(None,self,"text")
|
||||
self.keyboard.bind(on_key_down=self.on_key_down,on_key_up=self.on_key_up)
|
||||
|
||||
|
||||
def reset(self):
|
||||
self.crosses=[]
|
||||
@ -244,29 +255,63 @@ class Cross_painter(Widget):
|
||||
cross.draw()
|
||||
|
||||
|
||||
# respond to keyboard
|
||||
def on_key_down(self, keyboard, keycode, text, modifiers):
|
||||
# check that command_prompt is not focused
|
||||
if not self.app.command_prompt.insert:
|
||||
if keycode[1]=="shift":
|
||||
if not 's' in self.modifiers:
|
||||
self.modifiers.append('s')
|
||||
self.modifiers.sort()
|
||||
|
||||
def on_key_up(self, keyboard, keycode):
|
||||
if keycode[1]=="shift":
|
||||
if 's' in self.modifiers:
|
||||
# remove
|
||||
self.modifiers[self.modifiers.index('s')]=self.modifiers[len(self.modifiers)-1]
|
||||
self.modifiers=self.modifiers[:len(self.modifiers)-1]
|
||||
self.modifiers.sort()
|
||||
|
||||
|
||||
# respond to mouse down
|
||||
def on_touch_down(self,touch):
|
||||
# only respond to touch in area
|
||||
if self.collide_point(*touch.pos):
|
||||
|
||||
# unselect
|
||||
if touch.button!="left" or self.modifiers!=['s']:
|
||||
for sel in self.selected:
|
||||
sel.selected=False
|
||||
self.selected=[]
|
||||
|
||||
# create new cross
|
||||
if touch.button=="right":
|
||||
if self.check_interaction_any(Point(touch.x/Cross.size,touch.y/Cross.size),None):
|
||||
new=Cross(touch.x/Cross.size,touch.y/Cross.size)
|
||||
with self.canvas:
|
||||
new.draw()
|
||||
# add to list
|
||||
self.crosses.append(new)
|
||||
self.draw()
|
||||
|
||||
# select cross
|
||||
if touch.button=="left":
|
||||
# unselect
|
||||
if self.undermouse!=None:
|
||||
self.undermouse.selected=False
|
||||
|
||||
# no modifiers
|
||||
if self.modifiers==[]:
|
||||
# find cross under touch
|
||||
self.undermouse=self.find_cross(Point(touch.x/Cross.size,touch.y/Cross.size))
|
||||
if self.undermouse!=None:
|
||||
self.undermouse.selected=True
|
||||
|
||||
# shift-click
|
||||
elif self.modifiers==['s']:
|
||||
clicked=self.find_cross(Point(touch.x/Cross.size,touch.y/Cross.size))
|
||||
if clicked!=None:
|
||||
if clicked not in self.selected:
|
||||
self.selected.append(clicked)
|
||||
clicked.selected=True
|
||||
else:
|
||||
# remove
|
||||
self.selected[self.selected.index(clicked)]=self.selected[len(self.selected)-1]
|
||||
self.selected=self.selected[:len(self.selected)-1]
|
||||
clicked.selected=False
|
||||
|
||||
self.draw()
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user