aboutsummaryrefslogtreecommitdiff
path: root/lib/python/Screens/PiPSetup.py
blob: d7d0e167f713f9890b212c23ca502cc2998dbca7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
from Screens.Screen import Screen
from Components.ActionMap import NumberActionMap
from Components.Label import Label

# this is not so great.
MAX_X = 720
MAX_Y = 576
MAX_W = MAX_X * 3 / 4
MAX_H = MAX_Y * 3 / 4
MIN_W = MAX_X / 8
MIN_H = MAX_Y / 8

def clip(val, min, max):
	if min <= val <= max:
		return val
	if min <= val:
		return max
	return min

class PiPSetup(Screen):
	def __init__(self, session, pip):
		Screen.__init__(self, session)
		
		self.pip = pip
		
		self.pos = (self.pip.instance.position().x(), self.pip.instance.position().y())
		self.size = self.pip.getSize()

		self.orgpos = self.pos
		self.orgsize = self.size
		
		self.resize = 100

		self["text"] = Label(_("Please use direction keys to move the PiP window.\nPress Bouquet +/- to resize the window.\nPress OK to go back to the TV mode or EXIT to cancel the moving."))

		self["actions"] = NumberActionMap(["PiPSetupActions", "NumberActions"], 
		{
			"ok": self.go,
			"cancel": self.cancel,
			"up": self.up,
			"down": self.down,
			"left": self.left,
			"right": self.right,
			"size+": self.bigger,
			"size-": self.smaller,
			"1": self.keyNumberGlobal,
			"2": self.keyNumberGlobal,
			"3": self.keyNumberGlobal,
			"4": self.keyNumberGlobal,
			"5": self.keyNumberGlobal,
			"6": self.keyNumberGlobal,
			"7": self.keyNumberGlobal,
			"8": self.keyNumberGlobal,
			"9": self.keyNumberGlobal,
			"0": self.keyNumberGlobal
		}, -1)
		
	def go(self):
		self.close()
	
	def cancel(self):
		self.pos = self.orgpos
		self.size = self.orgsize
		self.setPiPPosition()
		self.close()
	
	def setPiPPosition(self):
		self.pip.move(self.pos[0], self.pos[1])
		self.pip.resize(self.size[0], self.size[1])

	def resizePiP(self, resize):
		resize += 100 # resize is in percent, so resize=+20 means: 120%
		
		oldsize = self.size
		w = clip(self.size[0] * resize / 100, MIN_W, MAX_W)
		h = clip(self.size[1] * resize / 100, MIN_H, MAX_H)
		
		# calculate offset from center
		mx = (oldsize[0] - w) / 2
		my = (oldsize[1] - h) / 2
		
		self.size = (w, h)
		# reclip, account for new center
		self.moveRelative(x=mx, y=my)
	
	def moveRelative(self, x=0, y=0):
		self.pos = (clip(self.pos[0] + x, 0, MAX_X - self.size[0]), clip(self.pos[1] + y, 0, MAX_Y - self.size[1]))
		self.setPiPPosition()
	
	def up(self):
		self.moveRelative(y=-32)

	def down(self):
		self.moveRelative(y=+32)
	
	def left(self):
		self.moveRelative(x=-24)
	
	def right(self):
		self.moveRelative(x=+24)
	
	def bigger(self):
		self.resizePiP(+10)
	
	def smaller(self):
		self.resizePiP(-10)
	
	def keyNumberGlobal(self, number):
		
		if number > 0:
			colsize = MAX_X / 3
			rowsize = MAX_Y / 3
			col = (number-1) % 3
			row = (number-1) / 3

			self.size = (180, 135)

			# offset to keep center
			ox = (colsize - self.size[0]) / 2
			oy = (rowsize - self.size[1]) / 2

			self.pos = (col * colsize + ox, row * rowsize + oy)
		else:
			# restore old position
			self.pos = self.orgpos
			self.size = self.orgsize
		# reclip
		self.moveRelative()