Guest User

Untitled

a guest
Jun 19th, 2018
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.48 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import sys
  5. import clutter
  6. import logging
  7.  
  8. from math import ceil
  9. from time import time
  10.  
  11.  
  12. logging.basicConfig()
  13.  
  14. log = logging.getLogger(__name__)
  15. log.setLevel(logging.DEBUG)
  16.  
  17.  
  18. class Slider(object):
  19. def __init__(self, bg, container, width=None, height=None,
  20. stepx=None, stepy=None,
  21. x=0, y=0):
  22. self.container = container
  23. self.pressed = False
  24. self.x = x
  25. self.y = y
  26.  
  27. if stepx:
  28. width = int(ceil(width / float(stepx)) * stepx)
  29. if stepy:
  30. height = int(ceil(height / float(stepy)) * stepy)
  31.  
  32. self.width = width
  33. self.height = height
  34. self.stepx = stepx
  35. self.stepy = stepy
  36.  
  37. self.timeline = clutter.Timeline(duration=True)
  38. self.timeline.set_duration(200)
  39. self.timeline.set_loop(False)
  40.  
  41. alpha = clutter.Alpha(self.timeline, clutter.sine_inc_func)
  42. self.behaviour = clutter.BehaviourPath(alpha)
  43. self.behaviour.apply(container)
  44.  
  45. w, h = bg.get_size()
  46. if width:
  47. self.minleft = w - width
  48. self.maxright = 0
  49. if height:
  50. self.mintop = h - height
  51. self.maxbottom = 0
  52.  
  53. bg.connect("button-press-event", self.press, self)
  54. bg.connect("button-release-event", self.release, self)
  55. bg.connect("motion-event", self.motion, self)
  56.  
  57. @staticmethod
  58. def leave(actor, event, self):
  59. log.info("left")
  60.  
  61. @staticmethod
  62. def press(actor, event, self):
  63. self.pressed = True
  64. if self.width:
  65. self._x = event.x
  66. if self.height:
  67. self._y = event.y
  68. self._time = time()
  69.  
  70. @staticmethod
  71. def release(actor, event, self):
  72. self.pressed = False
  73. x, y = 0, 0
  74. diffx, diffy = 0, 0
  75.  
  76. if self.width:
  77. diffx = event.x - self._x
  78. if self.height:
  79. diffy = event.y - self._y
  80. diffy = event.y - self._y
  81.  
  82. delta = time() - self._time
  83. dist = (diffx**2 + diffy**2)**.5
  84. speed = int((dist/float(delta)) / 1000)
  85.  
  86. if diffx:
  87. self.x += diffx
  88. x = self.x + diffx*speed
  89. x = max(self.minleft, min(self.maxright, x))
  90. if diffy:
  91. self.y += diffy
  92. y = self.y + diffy*speed
  93. y = max(self.mintop, min(self.maxbottom, y))
  94.  
  95. if self.stepx:
  96. x = int(round(x / float(self.stepx)) * self.stepx)
  97. if self.stepy:
  98. y = int(round(y / float(self.stepy)) * self.stepy)
  99. pass
  100.  
  101. self.container.set_position(self.x, self.y)
  102.  
  103. if self.x != x or self.y != y:
  104. self.behaviour.clear()
  105. self.behaviour.append_knots((self.x, self.y))
  106. self.behaviour.append_knots((x, y))
  107. self.timeline.start()
  108.  
  109. self.x = x
  110. self.y = y
  111.  
  112. @staticmethod
  113. def motion(actor, event, self):
  114. if self.pressed:
  115. x = self.x
  116. y = self.y
  117. if self.width:
  118. x = self.x + event.x - self._x
  119. if self.height:
  120. y = self.y + event.y - self._y
  121. self.container.set_position(x, y)
  122.  
  123.  
  124. def main(argv):
  125. clutter.init()
  126.  
  127. width, height = 800, 600
  128.  
  129. stage = clutter.stage_get_default()
  130. stage.set_size(width, height)
  131. stage.set_color(clutter.color_parse("#000"))
  132.  
  133. mask = clutter.Group()
  134. mask.set_clip(0, 0, width, height)
  135. mask.show()
  136.  
  137. container = clutter.Group()
  138.  
  139. label = clutter.Label()
  140. label.set_text(" “The quick brown fox jumps over the lazy dog” ")
  141. label.set_position(0, 200)
  142. label.set_font_name("Droid Serif 100")
  143. label.set_color(clutter.color_parse("#ddd"))
  144. label.show()
  145.  
  146. label2 = clutter.Label()
  147. label2.set_text(" “The quick brown fox jumps over the lazy dog” ")
  148. label2.set_position(0, height + 200)
  149. label2.set_font_name("Droid Sans 100")
  150. label2.set_color(clutter.color_parse("#ddd"))
  151. label2.show()
  152.  
  153. label3 = clutter.Label()
  154. label3.set_text(" “The quick brown fox jumps over the lazy dog” ")
  155. label3.set_position(0, 2*height + 200)
  156. label3.set_font_name("Arial Narrow 100")
  157. label3.set_color(clutter.color_parse("#ddd"))
  158. label3.show()
  159.  
  160.  
  161. color = clutter.color_parse("#fff")
  162. for j in xrange(6):
  163. for i in xrange(label.get_size()[0] / (width/2) + 1):
  164. r = clutter.Rectangle()
  165. r.set_size(width/2, height/2)
  166. r.set_position(i * (width/2), j * (height / 2))
  167. c = color.from_hls(i * 20, (j+1)*32, 255)
  168. c.alpha = 255
  169. r.set_color(c)
  170. container.add(r)
  171.  
  172. container.add(label)
  173. container.add(label2)
  174. container.add(label3)
  175.  
  176. bg = clutter.Rectangle()
  177. bg.set_size(width, height)
  178. bg.set_color(clutter.color_parse("#00000000"))
  179. bg.set_reactive(True)
  180.  
  181. mask.add(bg)
  182. mask.add(container)
  183.  
  184. stage.add(mask)
  185. stage.show_all()
  186.  
  187. slide = Slider(bg, container,
  188. width=label.get_size()[0],
  189. height=3*height,
  190. stepx=width/2,
  191. stepy=height/2)
  192.  
  193. stage.connect("key-press-event", clutter.main_quit)
  194.  
  195. clutter.main()
  196. return 0
  197.  
  198.  
  199. if __name__ == "__main__":
  200. sys.exit(main(sys.argv))
Add Comment
Please, Sign In to add comment