File: animationicon.py

package info (click to toggle)
fife 0.4.2-10
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 25,204 kB
  • sloc: cpp: 42,642; xml: 18,881; python: 13,521; makefile: 23
file content (234 lines) | stat: -rw-r--r-- 6,780 bytes parent folder | download | duplicates (3)
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# -*- coding: utf-8 -*-

# ####################################################################
#  Copyright (C) 2005-2013 by the FIFE team
#  http://www.fifengine.net
#  This file is part of FIFE.
#
#  FIFE is free software; you can redistribute it and/or
#  modify it under the terms of the GNU Lesser General Public
#  License as published by the Free Software Foundation; either
#  version 2.1 of the License, or (at your option) any later version.
#
#  This library is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with this library; if not, write to the
#  Free Software Foundation, Inc.,
#  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
# ####################################################################

from __future__ import absolute_import
from fife import fife
from fife import fifechan

from fife.extensions.pychan.internal import get_manager
from fife.extensions.pychan.attrs import Attr, BoolAttr
from fife.extensions.serializers.xmlanimation import loadXMLAnimation

from .widget import Widget


class AnimationIcon(Widget):
	"""
	An animation icon.

	New Attributes
	==============

	  - animation: String : The source location of the Animation xml.
	  - scale: Boolean: True if the image should be scaled to widget size, false otherwise.
	  - tile: Boolean: True if the image should be tiled to widget size, false otherwise.
	  - opaque: Boolean: True if the background of the icon should be drawn, false otherwise.
	"""
	ATTRIBUTES = Widget.ATTRIBUTES + [ Attr('animation'),
									   BoolAttr('scale'),
									   BoolAttr('tile'),
									   BoolAttr('opaque'),
									   BoolAttr('repeating'),
									   BoolAttr('play')
									 ]
	DEFAULT_MARGINS = 0, 0
	DEFAULT_PADDING = 0

	DEFAULT_SCALE = False
	DEFAULT_TILE = False
	DEFAULT_OPAQUE = False
	DEFAULT_REPEATING = True
	DEFAULT_PLAY = True
	
	def __init__(self, 
				 parent = None,
				 name = None,
				 size = None,
				 min_size = None,
				 max_size = None,
				 fixed_size = None,
				 margins = None,
				 padding = None,
				 helptext = None,
				 position = None,
				 style = None,
				 hexpand = None,
				 vexpand = None,
				 font = None,
				 base_color = None,
				 background_color = None,
				 foreground_color = None,
				 selection_color = None,
				 border_color = None,
				 outline_color = None,
				 border_size = None,
				 outline_size = None,
				 position_technique = None,
				 is_focusable = None,
				 comment = None,
				 animation = None,
				 scale = None,
				 tile = None,
				 opaque = None,
				 repeating = None,
				 play = None):
				 
		self.real_widget = fifechan.AnimationIcon()
		self._anim = None
		
		super(AnimationIcon,self).__init__(parent=parent,
								  name=name,
								  size=size,
								  min_size=min_size,
								  max_size=max_size,
								  fixed_size=fixed_size,
								  margins=margins,
								  padding=padding,
								  helptext=helptext,
								  position=position,
								  style=style,
								  hexpand=hexpand,
								  vexpand=vexpand,
								  font=font,
								  base_color=base_color,
								  background_color=background_color,
								  foreground_color=foreground_color,
								  selection_color=selection_color,
								  border_color=border_color,
								  outline_color=outline_color,
								  border_size=border_size,
								  outline_size=outline_size,
								  position_technique=position_technique,
								  is_focusable=is_focusable,
								  comment=comment)

		# set provided attributes or defaults
		if scale is not None: self.scale = scale
		else: self.scale = self.DEFAULT_SCALE

		if tile is not None: self.tile = tile
		else: self.tile = self.DEFAULT_TILE

		if opaque is not None: self.opaque = opaque
		else: self.opaque = self.DEFAULT_OPAQUE

		# for the case that animation can not be found, e.g. invalid path
		# the AnimationIcon is removed from the manager
		try:
			self.animation = animation
		except Exception:
			get_manager().removeWidget(self)
			raise

		if repeating is not None: self.repeating = repeating
		else: self.repeating = self.DEFAULT_REPEATING

		if play is not None: self.play = play
		else: self.play = self.DEFAULT_PLAY
		
		#if the size parameter is specified set it (again) to override
		#the icons size. That works only without layouting.
		if size is not None: self.size = size

	def clone(self, prefix):
		iconClone = AnimationIcon(None,
				self._createNameWithPrefix(prefix),
				self.size,
				self.min_size, 
				self.max_size,
				self.fixed_size,
				self.margins,
				self.padding,
				self.helptext, 
				self.position, 
				self.style, 
				self.hexpand,
				self.vexpand,
				self.font,
				self.base_color,
				self.background_color,
				self.foreground_color,
				self.selection_color,
				self.border_color,
				self.outline_color,
				self.border_size,
				self.outline_size,
				self.position_technique,
				self.is_focusable,
				self.comment,
				self.animation,
				self.scale,
				self.tile,
				self.opaque,
				self.repeating,
				self.play)
						
		return iconClone

	def _setAnimation(self, anim):
		if anim is not None:
			if isinstance(anim, fife.Animation):
				self._anim = anim
			else:
				if anim != "":
					# use xml loader
					self._anim = loadXMLAnimation(get_manager().hook.engine, anim)
			self.real_widget.setAnimation(self._anim)
	def _getAnimation(self):
		return self._anim
	animation = property(_getAnimation, _setAnimation)

	def _setScaling(self, val):	self.real_widget.setScaling(val)
	def _getScaling(self): return self.real_widget.isScaling()
	scale = property(_getScaling, _setScaling)

	def _setTiling(self, val):	self.real_widget.setTiling(val)
	def _getTiling(self): return self.real_widget.isTiling()
	tile = property(_getTiling, _setTiling)

	def _setOpaque(self, val):	self.real_widget.setOpaque(val)
	def _getOpaque(self): return self.real_widget.isOpaque()
	opaque = property(_getOpaque, _setOpaque)

	def _setRepeating(self, repeat): self.real_widget.setRepeating(repeat)
	def _getRepeating(self): return self.real_widget.isRepeating()
	repeating = property(_getRepeating, _setRepeating)
	
	def startPlaying(self):
		self.real_widget.play()

	def isPlaying(self):
		return self.real_widget.isPlaying()

	def pausePlaying(self):
		self.real_widget.pause()

	def stopPlaying(self):
		self.real_widget.stop()

	def _setPlaying(self, play):
		if play is True: self.startPlaying()
		else: self.stopPlaying()
	def _getPlaying(self): return self.isPlaying()
	play = property(_getPlaying, _setPlaying)