def getDisplay(self): displayservice = PygameDisplay.getDisplayService() self.link((self, "display_signal"), displayservice) self.send(self.disprequest, "display_signal") while not self.dataReady("callback"): self.pause() yield 1 self.display = self.recv("callback")
def __init__(self): super(dummy, self).__init__() width = 400 height = 200 displayservice = PygameDisplay.getDisplayService() disprequest = {"DISPLAYREQUEST" : True, "size" : (width,height), # pixels size for the new surface "callback" : (self, "inbox"), # to send the new surface object to "events" : (self, "events") } self.link((self, 'outbox'), displayservice) self.send(disprequest, 'outbox')
def main(self): """Main loop.""" displayservice = PygameDisplay.getDisplayService() self.link((self,"display_signal"), displayservice) self.send( self.dispRequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") # tool buttons circleb = ImageButton(caption=(os.path.join('icons', 'EllipseToolIcon.png')),position=(10,10), bgcolour = (235,235,235), msg = (("Tool", "Circle"),)).activate() eraseb = ImageButton(caption=(os.path.join('icons', 'EraserToolIcon.png')),position=(100,10), bgcolour = (235,235,235), msg = (("Tool", "Eraser"),)).activate() lineb = ImageButton(caption=(os.path.join('icons', 'PaintBrushToolIcon.png')),position=(10,50), bgcolour = (235,235,235), msg = (("Tool", "Line"),)).activate() bucketb = ImageButton(caption=(os.path.join('icons', 'PaintBucketIcon.png')),position=(10,90), bgcolour = (235,235,235), msg = (("Tool", "Bucket"),)).activate() eyeb = ImageButton(caption=(os.path.join('icons', 'ColorPickerToolIcon.png')),position=(10,130), bgcolour = (235,235,235), msg = (("Tool", "Eyedropper"),)).activate() addlayerb = ImageButton(caption=(os.path.join('icons', 'PlusButtonIcon.png')),position=(10,540), bgcolour = (235,235,235), msg = (("Layer", "Add"),)).activate() prevlayerb = ImageButton(caption=(os.path.join('icons', 'MenuLayersMoveLayerDownIcon.png')),position=(80,540), bgcolour = (235,235,235), msg = (("Layer", "Prev"),)).activate() nextlayerb = ImageButton(caption=(os.path.join('icons', 'MenuLayersMoveLayerUpIcon.png')),position=(110,540), bgcolour = (235,235,235), msg = (("Layer", "Next"),)).activate() dellayerb = ImageButton(caption=(os.path.join('icons', 'MinusButtonIcon.png')),position=(35,540), bgcolour = (235,235,235), msg = (("Layer", "Delete"),)).activate() saveb = ImageButton(caption=(os.path.join('icons', 'MenuFileSaveIcon.png')),position=(100,130), bgcolour = (235,235,235), msg = (("Save", "Test"),)).activate() self.link( (circleb,"outbox"), (self,"outbox"), passthrough = 2 ) self.link( (eraseb,"outbox"), (self,"outbox"), passthrough = 2 ) self.link( (lineb,"outbox"), (self,"outbox"), passthrough = 2 ) self.link( (bucketb,"outbox"), (self,"outbox"), passthrough = 2 ) self.link( (eyeb,"outbox"), (self,"outbox"), passthrough = 2 ) self.link( (addlayerb,"outbox"), (self,"outbox"), passthrough = 2 ) self.link( (prevlayerb,"outbox"), (self,"outbox"), passthrough = 2 ) self.link( (nextlayerb,"outbox"), (self,"outbox"), passthrough = 2 ) self.link( (dellayerb,"outbox"), (self,"outbox"), passthrough = 2 ) self.link( (saveb,"outbox"), (self,"outbox"), passthrough = 2 ) colSel = ColourSelector(position = (10,170), size = (255,255)).activate() self.link( (colSel,"outbox"), (self,"outbox"), passthrough = 2 ) SizeSlider = Slider(size=(255, 50), messagePrefix = "Size", position = (10, 460), default = 9).activate() self.link( (SizeSlider,"outbox"), (self,"outbox"), passthrough = 2 ) AlphaSlider = Slider(size=(255, 10), messagePrefix = "Alpha", position = (10, 515), default = 255).activate() self.link( (AlphaSlider,"outbox"), (self,"outbox"), passthrough = 2 ) self.drawBG() done = False while not done: if not self.anyReady(): self.pause() yield 1
def initPygame(self, **argd): displayservice = PygameDisplay.getDisplayService() self.link((self, "_pygame"), displayservice) self.send(argd, "_pygame") while not self.dataReady("_surface"): yield 1 self.screen = self.recv("_surface") self.screen.fill(self.background_color) self.scratch = self.screen.copy() self.send({"REDRAW": True, "surface": self.screen}, "_pygame") yield 1 h = self.screen_height w = self.screen_width th = self.text_height self.font = pygame.font.Font(None, th) self.linelen = w / self.font.size('a')[0] self.keepRect = pygame.Rect((0, th), (w, h - th)) self.scrollingRect = pygame.Rect((0, 0), (w, h - th)) self.writeRect = pygame.Rect((0, h - th), (w, th))
def initPygame(self, **argd): """requests a display surface from the PygameDisplay service, fills the color in, and copies it""" displayservice = PygameDisplay.getDisplayService() self.link((self, "_pygame"), displayservice) if self.transparent: argd["transparency"] = self.bgcolour self.send(argd, "_pygame") while not self.dataReady("_surface"): yield 1 self.screen = self.recv("_surface") self.clear() self.scratch = self.screen.copy() self.send({"REDRAW": True, "surface": self.screen}, "_pygame") yield 1 h = self.screen_height w = self.screen_width th = self.text_height # Text height self.font = pygame.font.Font(self.font_file, th) th = ( self.text_height ) = self.font.get_linesize() # Adjust the rendering of text inside, such that it renders nicer self.linelen = w / self.font.size("a")[0] # First pass approach at adding basic padding into the model pad = self.padding padtop = self.padding padbottom = self.padding padleft = self.padding padright = self.padding self.keepRect = pygame.Rect((0 + padleft, th + padtop), (w - padleft - padright, h - th - padtop - padbottom)) self.scrollingRect = pygame.Rect( (0 + padleft, 0 + padtop), (w - padleft - padright, h - th - padtop - padbottom) ) self.writeRect = pygame.Rect((0 + padleft, h - th - padbottom), (w - pad - pad, th))
def initPygame(self, **argd): displayservice = PygameDisplay.getDisplayService() self.link((self, "_pygame"), displayservice) self.send(argd, "_pygame") while not self.dataReady("_surface"): yield 1 self.screen = self.recv("_surface") self.screen.fill(self.background_color) self.scratch = self.screen.copy() self.send({"REDRAW" : True, "surface" : self.screen}, "_pygame") yield 1 h = self.screen_height w = self.screen_width th = self.text_height self.font = pygame.font.Font(None, th) self.linelen = w/self.font.size('a')[0] self.keepRect = pygame.Rect((0, th),(w, h - th)) self.scrollingRect = pygame.Rect((0, 0), (w, h - th)) self.writeRect = pygame.Rect((0, h - th), (w, th))
def main(self): """Main loop.""" displayservice = PygameDisplay.getDisplayService() self.link((self, "display_signal"), displayservice) self.send(self.dispRequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") # tool buttons circleb = Button(caption="Circle", position=(10, 10), msg=(("Tool", "Circle"),)).activate() eraseb = Button(caption="Eraser", position=(100, 10), msg=(("Tool", "Eraser"),)).activate() lineb = Button(caption="Line", position=(10, 50), msg=(("Tool", "Line"),)).activate() bucketb = Button(caption="Bucket", position=(10, 90), msg=(("Tool", "Bucket"),)).activate() eyeb = Button(caption="Eyedropper", position=(10, 130), msg=(("Tool", "Eyedropper"),)).activate() addlayerb = Button(caption="Add Layer", position=(10, 540), msg=(("Layer", "Add"),)).activate() prevlayerb = Button(caption="<-", position=(80, 540), msg=(("Layer", "Prev"),)).activate() nextlayerb = Button(caption="->", position=(110, 540), msg=(("Layer", "Next"),)).activate() dellayerb = Button(caption="Delete", position=(140, 540), msg=(("Layer", "Delete"),)).activate() self.link((circleb, "outbox"), (self, "outbox"), passthrough=2) self.link((eraseb, "outbox"), (self, "outbox"), passthrough=2) self.link((lineb, "outbox"), (self, "outbox"), passthrough=2) self.link((bucketb, "outbox"), (self, "outbox"), passthrough=2) self.link((eyeb, "outbox"), (self, "outbox"), passthrough=2) self.link((addlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((prevlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((nextlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((dellayerb, "outbox"), (self, "outbox"), passthrough=2) colSel = ColourSelector(position=(10, 170), size=(255, 255)).activate() self.link((colSel, "outbox"), (self, "outbox"), passthrough=2) SizeSlider = Slider(size=(255, 50), messagePrefix="Size", position=(10, 460), default=9).activate() self.link((SizeSlider, "outbox"), (self, "outbox"), passthrough=2) AlphaSlider = Slider(size=(255, 10), messagePrefix="Alpha", position=(10, 515), default=255).activate() self.link((AlphaSlider, "outbox"), (self, "outbox"), passthrough=2) self.drawBG() done = False while not done: if not self.anyReady(): self.pause() yield 1
def initPygame(self, **argd): """requests a display surface from the PygameDisplay service, fills the color in, and copies it""" displayservice = PygameDisplay.getDisplayService() self.link((self, "_pygame"), displayservice) if self.transparent: argd["transparency"] = self.bgcolour self.send(argd, "_pygame") while not self.dataReady("_surface"): yield 1 self.screen = self.recv("_surface") self.clear() self.scratch = self.screen.copy() self.send({"REDRAW" : True, "surface" : self.screen}, "_pygame") yield 1 h = self.screen_height w = self.screen_width th = self.text_height # Text height self.font = pygame.font.Font(self.font_file, th) th = self.text_height = self.font.get_linesize() # Adjust the rendering of text inside, such that it renders nicer self.linelen = w/self.font.size('a')[0] # First pass approach at adding basic padding into the model pad = self.padding padtop = self.padding padbottom = self.padding padleft = self.padding padright = self.padding self.keepRect = pygame.Rect((0+padleft, th+padtop),(w - padleft - padright, h - th - padtop - padbottom)) self.scrollingRect = pygame.Rect((0+padleft, 0+padtop), (w - padleft - padright, h - th - padtop - padbottom)) self.writeRect = pygame.Rect((0+padleft, h - th - padbottom), (w - pad - pad, th))
def main(self): """Main event loop, also handles input from other components""" displayservice = PygameDisplay.getDisplayService() self.link((self,"display_signal"), displayservice) self.send( self.disprequest,"display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") self.layers.append(self.display) # f = os.path.join('', "pennyarcade.gif") # x = pygame.image.load(f) # colorkey = x.get_at((0, 0)) # if colorkey is True: # x.set_colorkey(colorkey, pygame.RLEACCEL) # self.layers.append(x) # self.display = x # self.activeLayIn = len(self.layers)-1 # self.activeLayer = self.layers[self.activeLayIn] # self.display.blit( x, (0,0) ) layerDisp = TextDisplayer(size = (20, 20),position = (520,10)).activate() self.link( (self,"laynum"), (layerDisp,"inbox") ) self.send({ "ADDLISTENEVENT" : pygame.MOUSEBUTTONDOWN, "surface" : self.display}, "display_signal") self.send({ "ADDLISTENEVENT" : pygame.MOUSEBUTTONUP, "surface" : self.display}, "display_signal") self.send({ "ADDLISTENEVENT" : pygame.MOUSEMOTION, "surface" : self.display}, "display_signal") self.send({ "ADDLISTENEVENT" : pygame.KEYDOWN, "surface" : self.display}, "display_signal") self.activeLayer = self.layers[self.activeLayIn] self.send( self.activeLayIn, "laynum" ) image = pygame.Surface((20, 20)) pygame.draw.circle(image, (1, 1, 1), (10, 10), self.toolSize, 0) # pygame.draw.circle(image, self.selectedColour, (10, 10), 8, 2) image.set_at((9, 9), (255,255,255)) image.set_colorkey(0, pygame.RLEACCEL) cursor = GfxCursor(self.display, image, (10, 10)) self.drawBG(True) self.blitToSurface() FPS = 1 clock = Clock(float(1)/FPS).activate() clock.link((clock, "outbox"), (self, "newframe")) done = False while not done: dirtyrects = [] dirtyrects.extend([cursor.hide()]) if not self.anyReady(): self.pause() yield 1 while self.dataReady("control"): cmsg = self.recv("control") if isinstance(cmsg, producerFinished) or isinstance(cmsg, shutdownMicroprocess): self.send(cmsg, "signal") done = True while self.dataReady("newframe") and self.playing: self.recv("newframe") if self.currentFrame != 0: self.layers[self.currentFrame].set_alpha(0) self.currentFrame = self.currentFrame + 1 if self.currentFrame == len(self.layers)-1: self.playing = False self.layers[self.currentFrame].set_alpha(255) self.blitToSurface() while self.dataReady("inbox"): for event in self.recv("inbox"): if isinstance(event, tuple): self.send((event,),"outbox") if event[0] == "Layer": if event[1] == "Add": yield WaitComplete( self.addLayer() ) self.activeLayIn = len(self.layers)-1 self.activeLayer = self.layers[self.activeLayIn] self.drawBG() if self.animator and len(self.layers)-2 >= 1: for x in self.layers: s.set_alpha = 0 self.activeLayer.blit(self.layers[len(self.layers)-2],(0,0)) self.blitToSurface() elif event[1] == "Delete": self.send( producerFinished(message=self.activeLayer),"display_signal") self.layers.remove(self.activeLayer) self.activeLayIn = 0 self.activeLayer = self.layers[self.activeLayIn] # print (self.layers) if event[1] == "Next": if self.animator and self.activeLayIn != 0: self.activeLayer.set_alpha(0) if self.activeLayIn == len(self.layers)-1: self.activeLayIn = 0 self.activeLayer = self.layers[self.activeLayIn] else: self.activeLayIn += 1 self.activeLayer = self.layers[self.activeLayIn] if self.animator: self.activeLayer.set_alpha(255) elif event[1] == "Prev": if self.animator and self.activeLayIn != 0: self.activeLayer.set_alpha(0) if self.activeLayIn == 0: self.activeLayIn = len(self.layers)-1 self.activeLayer = self.layers[self.activeLayIn] else: self.activeLayIn -= 1 self.activeLayer = self.layers[self.activeLayIn] if self.animator: self.activeLayer.set_alpha(255) self.send( self.activeLayIn, "laynum" ) elif event[0] == "Tool": self.tool = event[1] elif event[0] == "Size": self.toolSize = event[1]/3 pygame.draw.circle(image, self.selectedColour, (10, 10), self.toolSize/3, 0) image.set_at((9, 9), (255,255,255)) image.set_colorkey(0, pygame.RLEACCEL) cursor = GfxCursor(self.display, image, (10, 10)) elif event[0] == "Alpha": self.layers[self.activeLayIn].set_alpha(event[1]) self.blitToSurface() # print (self.activeLayer.get_alpha()) elif event[0] == 'Colour': self.selectedColour = event[1] pygame.draw.circle(image, self.selectedColour, (10, 10), self.toolSize/3, 0) image.set_at((9, 9), (255,255,255)) image.set_colorkey(0, pygame.RLEACCEL) cursor = GfxCursor(self.display, image, (10, 10)) elif event[0] == 'Save': self.save(event[1]) break if event.type == pygame.MOUSEBUTTONDOWN: cursor.disable() if self.tool == "Circle": if event.button == 1: self.oldpos = event.pos self.drawing = True if self.tool == "Eraser": self.selectedColour = self.backgroundColour self.tool = "Line" if self.tool == "Line": if event.button == 1: self.drawing = True if self.tool == "Bucket": self.floodFill(event.pos[0],event.pos[1],self.selectedColour,self.activeLayer.get_at(event.pos)) if self.tool == "Eyedropper": self.selectedColour = self.activeLayer.get_at(event.pos) if event.button == 3: self.addLayer() #self.oldpos = None #self.drawBG() #self.blitToSurface() #self.send(("clear",), "outbox") elif event.type == (pygame.KEYDOWN): if event.key == pygame.K_c: image = pygame.image.load(os.path.join('', 'pennyarcade.gif')) yield WaitComplete( self.addLayer() ) self.activeLayIn = len(self.layers)-1 self.activeLayer = self.layers[self.activeLayIn] self.drawBG() self.activeLayer.blit( image, (10,10) ) self.blitToSurface() self.send( self.activeLayIn, "laynum" ) elif event.key == pygame.K_s: """Testing a different brushing technique, bliting a brush""" print (self.size, self.toolSize) yield WaitComplete( self.addBrush() ) self.activeBrush = self.brushes[len(self.brushes)-1] self.activeBrush.fill( self.backgroundColour ) pygame.draw.circle(self.activeBrush, self.selectedColour, (self.toolSize/2,self.toolSize/2), self.toolSize, 0) elif event.key == pygame.K_a: self.animator = True elif event.key == pygame.K_l: self.layers[1].blit( self.layers[1], (100,100) ) # temp = self.layers[1] # self.layers[1].fill(self.backgroundColour) # self.layers[1].blit( temp, (100,100) ) elif event.key == pygame.K_o: for x in self.layers: x.set_alpha(0) self.layers[0].set_alpha(255) self.currentFrame = 0 while self.dataReady("newframe"): # empty if there's anything there self.recv("newframe") self.playing = True self.blitToSurface() elif event.type == pygame.MOUSEBUTTONUP and event.button == 1: cursor.enable() if self.tool == "Circle": rad = int(math.sqrt(((event.pos[0]-self.oldpos[0])**2)+((event.pos[1]-self.oldpos[1])**2))) pygame.draw.circle(self.activeLayer, self.selectedColour, self.oldpos, rad, 0) circle = ("circle", self.oldpos, rad) # self.send((circle,), "outbox") self.blitToSurface() self.drawing = False self.oldpos = None elif event.type == pygame.MOUSEMOTION: cursor.update(event) if self.tool == "Line": if self.drawing and self.innerRect.collidepoint(*event.pos): if self.oldpos == None: self.oldpos = event.pos else: # pygame.draw.circle(self.activeLayer, self.selectedColour, self.oldpos, self.toolSize, 0) r = pygame.draw.line(self.activeLayer, self.selectedColour, self.oldpos, event.pos, self.toolSize) dirtyrects.append(r) # self.activeLayer.blit(self.activeBrush, event.pos) FAILED TECHNIQUE line = ("line", self.oldpos, event.pos) self.send((line,), "outbox") self.oldpos = event.pos self.blitToSurface() self.pause() pygame.time.delay(5) dirtyrects.extend([cursor.show()]) pygame.display.update(dirtyrects) yield 1
def main(self): """Main loop.""" displayservice = PygameDisplay.getDisplayService() self.link((self,"display_signal"), displayservice) self.send( self.disprequest,"display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") self.layers.append(self.display) # f = os.path.join('', "pennyarcade.gif") # x = pygame.image.load(f) # colorkey = x.get_at((0, 0)) # if colorkey is True: # x.set_colorkey(colorkey, pygame.RLEACCEL) # self.layers.append(x) # self.display = x # self.activeLayIn = len(self.layers)-1 # self.activeLayer = self.layers[self.activeLayIn] # self.display.blit( x, (0,0) ) layerDisp = TextDisplayer(size = (20, 20),position = (520,10)).activate() self.link( (self,"laynum"), (layerDisp,"inbox") ) self.send({ "ADDLISTENEVENT" : pygame.MOUSEBUTTONDOWN, "surface" : self.display}, "display_signal") self.send({ "ADDLISTENEVENT" : pygame.MOUSEBUTTONUP, "surface" : self.display}, "display_signal") self.send({ "ADDLISTENEVENT" : pygame.MOUSEMOTION, "surface" : self.display}, "display_signal") self.send({ "ADDLISTENEVENT" : pygame.KEYDOWN, "surface" : self.display}, "display_signal") self.activeLayer = self.layers[self.activeLayIn] self.send( self.activeLayIn, "laynum" ) self.drawBG(True) self.blitToSurface() done = False while not done: if not self.anyReady(): self.pause() yield 1 while self.dataReady("control"): cmsg = self.recv("control") if isinstance(cmsg, producerFinished) or isinstance(cmsg, shutdownMicroprocess): self.send(cmsg, "signal") done = True while self.dataReady("inbox"): for event in self.recv("inbox"): if isinstance(event, tuple): if event[0] == "Layer": if event[1] == "Add": yield WaitComplete( self.addLayer() ) self.activeLayIn = len(self.layers)-1 self.activeLayer = self.layers[self.activeLayIn] # self.send( self.activeLayIn, "laynum" ) self.drawBG() self.blitToSurface() elif event[1] == "Delete": self.send( producerFinished(message=self.activeLayer),"display_signal") self.layers.remove(self.activeLayer) self.activeLayIn = 0 self.activeLayer = self.layers[self.activeLayIn] # print self.layers if event[1] == "Next": if self.activeLayIn == len(self.layers)-1: self.activeLayIn = 0 self.activeLayer = self.layers[self.activeLayIn] else: self.activeLayIn += 1 self.activeLayer = self.layers[self.activeLayIn] elif event[1] == "Prev": if self.activeLayIn == 0: self.activeLayIn = len(self.layers)-1 self.activeLayer = self.layers[self.activeLayIn] else: self.activeLayIn -= 1 self.activeLayer = self.layers[self.activeLayIn] self.send( self.activeLayIn, "laynum" ) elif event[0] == "Tool": self.tool = event[1] elif event[0] == "Size": self.toolSize = event[1]/3 elif event[0] == "Alpha": self.layers[self.activeLayIn].set_alpha(event[1]) self.blitToSurface() # print self.activeLayer.get_alpha() elif event[0] == 'Colour': self.selectedColour = event[1] break if event.type == pygame.MOUSEBUTTONDOWN: if self.tool == "Circle": if event.button == 1: self.oldpos = event.pos self.drawing = True if self.tool == "Eraser": self.selectedColour = self.backgroundColour self.tool = "Line" if self.tool == "Line": if event.button == 1: self.drawing = True if self.tool == "Bucket": self.floodFill(event.pos[0],event.pos[1],self.selectedColour,self.activeLayer.get_at(event.pos)) if self.tool == "Eyedropper": self.selectedColour = self.activeLayer.get_at(event.pos) if event.button == 3: self.addLayer() #self.oldpos = None #self.drawBG() #self.blitToSurface() #self.send(("clear",), "outbox") elif event.type == (pygame.KEYDOWN): if event.key == pygame.K_c: image = pygame.image.load(os.path.join('', 'pennyarcade.gif')) yield WaitComplete( self.addLayer() ) self.activeLayIn = len(self.layers)-1 self.activeLayer = self.layers[self.activeLayIn] self.drawBG() self.activeLayer.blit( image, (10,10) ) self.blitToSurface() self.send( self.activeLayIn, "laynum" ) elif event.key == pygame.K_s: # temp = self.layers[0] self.save("tgfdg") # self.layers.insert(0,temp) # self.drawBG() elif event.key == pygame.K_l: self.layers[1].blit( self.layers[1], (100,100) ) # temp = self.layers[1] # self.layers[1].fill(self.backgroundColour) # self.layers[1].blit( temp, (100,100) ) elif event.key == pygame.K_o: move = { "CHANGEDISPLAYGEO" : True, "surface" : self.layers[1], "position" : (100,100) } self.send(move, "display_signal") elif event.type == pygame.MOUSEBUTTONUP and event.button == 1: if self.tool == "Circle": rad = math.sqrt(((event.pos[0]-self.oldpos[0])**2)+((event.pos[1]-self.oldpos[1])**2)) pygame.draw.circle(self.activeLayer, self.selectedColour, self.oldpos, rad, 0) circle = ("circle", self.oldpos, rad) self.send((circle,), "outbox") self.blitToSurface() self.drawing = False self.oldpos = None elif event.type == pygame.MOUSEMOTION: if self.tool == "Line": if self.drawing and self.innerRect.collidepoint(*event.pos): if self.oldpos == None: self.oldpos = event.pos else: # pygame.draw.circle(self.activeLayer, self.selectedColour, self.oldpos, self.toolSize, 0) pygame.draw.line(self.activeLayer, self.selectedColour, self.oldpos, event.pos, self.toolSize) line = ("line", self.oldpos, event.pos) self.send((line,), "outbox") self.oldpos = event.pos self.blitToSurface() self.pause() yield 1
# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import pygame from Kamaelia.UI.Pygame.Display import PygameDisplay from Kamaelia.Chassis.Graphline import Graphline from Kamaelia.Util.Console import ConsoleEchoer from Kamaelia.UI.Pygame.KeyEvent import KeyEvent from pygame.locals import * width = 400 height = 200 displayservice = PygameDisplay.getDisplayService() g = Graphline(displayservice=displayservice, linkages={ ("self", "outbox"): displayservice, }) disprequest = { "DISPLAYREQUEST": True, "size": (width, height), # pixels size for the new surface "callback": (g, "inbox"), # to send the new surface object to "events": (g, "events") }
def main(self): """Main loop.""" displayservice = PygameDisplay.getDisplayService() self.link((self, "display_signal"), displayservice) self.send(self.disprequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") self.layers.append(self.display) # f = os.path.join('', "pennyarcade.gif") # x = pygame.image.load(f) # colorkey = x.get_at((0, 0)) # if colorkey is True: # x.set_colorkey(colorkey, pygame.RLEACCEL) # self.layers.append(x) # self.display = x # self.activeLayIn = len(self.layers)-1 # self.activeLayer = self.layers[self.activeLayIn] # self.display.blit( x, (0,0) ) layerDisp = TextDisplayer(size=(20, 20), position=(520, 10)).activate() self.link((self, "laynum"), (layerDisp, "inbox")) self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONDOWN, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONUP, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEMOTION, "surface": self.display }, "display_signal") self.send({ "ADDLISTENEVENT": pygame.KEYDOWN, "surface": self.display }, "display_signal") self.activeLayer = self.layers[self.activeLayIn] self.send(self.activeLayIn, "laynum") self.drawBG(True) self.blitToSurface() done = False while not done: if not self.anyReady(): self.pause() yield 1 while self.dataReady("control"): cmsg = self.recv("control") if isinstance(cmsg, producerFinished) or isinstance( cmsg, shutdownMicroprocess): self.send(cmsg, "signal") done = True while self.dataReady("inbox"): for event in self.recv("inbox"): if isinstance(event, tuple): if event[0] == "Layer": if event[1] == "Add": yield WaitComplete(self.addLayer()) self.activeLayIn = len(self.layers) - 1 self.activeLayer = self.layers[ self.activeLayIn] # self.send( self.activeLayIn, "laynum" ) self.drawBG() self.blitToSurface() elif event[1] == "Delete": self.send( producerFinished(message=self.activeLayer), "display_signal") self.layers.remove(self.activeLayer) self.activeLayIn = 0 self.activeLayer = self.layers[ self.activeLayIn] # print self.layers if event[1] == "Next": if self.activeLayIn == len(self.layers) - 1: self.activeLayIn = 0 self.activeLayer = self.layers[ self.activeLayIn] else: self.activeLayIn += 1 self.activeLayer = self.layers[ self.activeLayIn] elif event[1] == "Prev": if self.activeLayIn == 0: self.activeLayIn = len(self.layers) - 1 self.activeLayer = self.layers[ self.activeLayIn] else: self.activeLayIn -= 1 self.activeLayer = self.layers[ self.activeLayIn] self.send(self.activeLayIn, "laynum") elif event[0] == "Tool": self.tool = event[1] elif event[0] == "Size": self.toolSize = event[1] / 3 elif event[0] == "Alpha": self.layers[self.activeLayIn].set_alpha(event[1]) self.blitToSurface() # print self.activeLayer.get_alpha() elif event[0] == 'Colour': self.selectedColour = event[1] break if event.type == pygame.MOUSEBUTTONDOWN: if self.tool == "Circle": if event.button == 1: self.oldpos = event.pos self.drawing = True if self.tool == "Eraser": self.selectedColour = self.backgroundColour self.tool = "Line" if self.tool == "Line": if event.button == 1: self.drawing = True if self.tool == "Bucket": self.floodFill(event.pos[0], event.pos[1], self.selectedColour, self.activeLayer.get_at(event.pos)) if self.tool == "Eyedropper": self.selectedColour = self.activeLayer.get_at( event.pos) if event.button == 3: self.addLayer() #self.oldpos = None #self.drawBG() #self.blitToSurface() #self.send(("clear",), "outbox") elif event.type == (pygame.KEYDOWN): if event.key == pygame.K_c: image = pygame.image.load( os.path.join('', 'pennyarcade.gif')) yield WaitComplete(self.addLayer()) self.activeLayIn = len(self.layers) - 1 self.activeLayer = self.layers[self.activeLayIn] self.drawBG() self.activeLayer.blit(image, (10, 10)) self.blitToSurface() self.send(self.activeLayIn, "laynum") elif event.key == pygame.K_s: # temp = self.layers[0] self.save("tgfdg") # self.layers.insert(0,temp) # self.drawBG() elif event.key == pygame.K_l: self.layers[1].blit(self.layers[1], (100, 100)) # temp = self.layers[1] # self.layers[1].fill(self.backgroundColour) # self.layers[1].blit( temp, (100,100) ) elif event.key == pygame.K_o: move = { "CHANGEDISPLAYGEO": True, "surface": self.layers[1], "position": (100, 100) } self.send(move, "display_signal") elif event.type == pygame.MOUSEBUTTONUP and event.button == 1: if self.tool == "Circle": rad = math.sqrt(( (event.pos[0] - self.oldpos[0])**2) + ( (event.pos[1] - self.oldpos[1])**2)) pygame.draw.circle(self.activeLayer, self.selectedColour, self.oldpos, rad, 0) circle = ("circle", self.oldpos, rad) self.send((circle, ), "outbox") self.blitToSurface() self.drawing = False self.oldpos = None elif event.type == pygame.MOUSEMOTION: if self.tool == "Line": if self.drawing and self.innerRect.collidepoint( *event.pos): if self.oldpos == None: self.oldpos = event.pos else: # pygame.draw.circle(self.activeLayer, self.selectedColour, self.oldpos, self.toolSize, 0) pygame.draw.line(self.activeLayer, self.selectedColour, self.oldpos, event.pos, self.toolSize) line = ("line", self.oldpos, event.pos) self.send((line, ), "outbox") self.oldpos = event.pos self.blitToSurface() self.pause() yield 1
def main(self): """Main loop.""" displayservice = PygameDisplay.getDisplayService() self.link((self, "display_signal"), displayservice) self.send(self.dispRequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") # Initial render so we don't see a blank screen self.sliderPos = self.default self.drawBG() self.render() self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONDOWN, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONUP, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEMOTION, "surface": self.display }, "display_signal") done = False while not done: if not self.anyReady(): self.pause() yield 1 while self.dataReady("control"): cmsg = self.recv("control") if (isinstance(cmsg, producerFinished)): self.send(cmsg, "signal") done = True while self.dataReady("colours"): msg = self.recv("colours") if msg[0] == "ColourCombi": self.colourCombi = msg[1] else: if self.colourCombi == 'RG': self.selectedColour = (msg[1][0], msg[1][1], self.sliderPos) elif self.colourCombi == 'RB': self.selectedColour = (msg[1][0], self.sliderPos, msg[1][2]) elif self.colourCombi == 'GB': self.selectedColour = (self.sliderPos, msg[1][1], msg[1][2]) self.bgcolour = self.selectedColour # self.display.fill( self.selectedColour) self.drawBG() self.render() while self.dataReady("inbox"): for event in self.recv("inbox"): if event.type == pygame.MOUSEBUTTONDOWN: if self.display.get_rect().collidepoint(*event.pos): if self.vertical: self.sliderPos = event.pos[1] else: self.sliderPos = event.pos[0] self.drawBG() self.render() self.mouseDown = True if event.type == pygame.MOUSEBUTTONUP: if self.mouseDown: if self.vertical: self.sliderPos = event.pos[1] else: self.sliderPos = event.pos[0] self.drawBG() self.render() self.mouseDown = False if event.type == pygame.MOUSEMOTION and self.mouseDown: if self.display.get_rect().collidepoint(*event.pos): if self.vertical: self.sliderPos = event.pos[1] else: self.sliderPos = event.pos[0] self.drawBG() self.render() else: self.mouseDown = False
def main(self): """Main loop.""" displayservice = PygameDisplay.getDisplayService() self.link((self,"display_signal"), displayservice) self.send( self.dispRequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") # Initial render so we don't see a blank screen self.sliderPos = self.default self.drawBG() self.render() self.send({"ADDLISTENEVENT" : pygame.MOUSEBUTTONDOWN, "surface" : self.display}, "display_signal") self.send({"ADDLISTENEVENT" : pygame.MOUSEBUTTONUP, "surface" : self.display}, "display_signal") self.send({"ADDLISTENEVENT" : pygame.MOUSEMOTION, "surface" : self.display}, "display_signal") done = False while not done: if not self.anyReady(): self.pause() yield 1 while self.dataReady("control"): cmsg = self.recv("control") if (isinstance(cmsg, producerFinished)): self.send(cmsg, "signal") done = True while self.dataReady("colours"): msg = self.recv("colours") if msg[0] == "ColourCombi": self.colourCombi = msg[1] else: if self.colourCombi == 'RG': self.selectedColour = (msg[1][0],msg[1][1],self.sliderPos) elif self.colourCombi == 'RB': self.selectedColour = (msg[1][0],self.sliderPos,msg[1][2]) elif self.colourCombi == 'GB': self.selectedColour = (self.sliderPos,msg[1][1],msg[1][2]) self.bgcolour = self.selectedColour # self.display.fill( self.selectedColour) self.drawBG() self.render() while self.dataReady("inbox"): for event in self.recv("inbox"): if event.type == pygame.MOUSEBUTTONDOWN: if self.display.get_rect().collidepoint(*event.pos): if self.vertical: self.sliderPos = event.pos[1] else: self.sliderPos = event.pos[0] self.drawBG() self.render() self.mouseDown = True if event.type == pygame.MOUSEBUTTONUP: if self.mouseDown: if self.vertical: self.sliderPos = event.pos[1] else: self.sliderPos = event.pos[0] self.drawBG() self.render() self.mouseDown = False if event.type == pygame.MOUSEMOTION and self.mouseDown: if self.display.get_rect().collidepoint(*event.pos): if self.vertical: self.sliderPos = event.pos[1] else: self.sliderPos = event.pos[0] self.drawBG() self.render() else: self.mouseDown = False
def main(self): """Main loop.""" # pgd = PygameDisplay( width=300, height=550 ).activate() # PygameDisplay.setDisplayService(pgd) displayservice = PygameDisplay.getDisplayService() self.link((self, "display_signal"), displayservice) self.send(self.dispRequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") # colour buttons if self.colourSelector: rgbutton = Button(caption="Red/Green", position=(10, 170), msg=("Colour", "RG")).activate() rbbutton = Button(caption="Red/Blue", position=(80, 170), msg=("Colour", "RB")).activate() gbbutton = Button(caption="Green/Blue", position=(145, 170), msg=("Colour", "GB")).activate() self.link((rgbutton, "outbox"), (self, "buttons")) self.link((rbbutton, "outbox"), (self, "buttons")) self.link((gbbutton, "outbox"), (self, "buttons")) # tool buttons circleb = Button(caption="Circle", position=(10, 10), msg=(("Tool", "Circle"), )).activate() eraseb = Button(caption="Eraser", position=(100, 10), msg=(("Tool", "Eraser"), )).activate() lineb = Button(caption="Line", position=(10, 50), msg=(("Tool", "Line"), )).activate() bucketb = Button(caption="Bucket", position=(10, 90), msg=(("Tool", "Bucket"), )).activate() eyeb = Button(caption="Eyedropper", position=(10, 130), msg=(("Tool", "Eyedropper"), )).activate() addlayerb = Button(caption="Add Layer", position=(10, 540), msg=(("Layer", "Add"), )).activate() prevlayerb = Button(caption="<-", position=(80, 540), msg=(("Layer", "Prev"), )).activate() nextlayerb = Button(caption="->", position=(110, 540), msg=(("Layer", "Next"), )).activate() dellayerb = Button(caption="Delete", position=(140, 540), msg=(("Layer", "Delete"), )).activate() self.link((circleb, "outbox"), (self, "outbox"), passthrough=2) self.link((eraseb, "outbox"), (self, "outbox"), passthrough=2) self.link((lineb, "outbox"), (self, "outbox"), passthrough=2) self.link((bucketb, "outbox"), (self, "outbox"), passthrough=2) self.link((eyeb, "outbox"), (self, "outbox"), passthrough=2) self.link((addlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((prevlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((nextlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((dellayerb, "outbox"), (self, "outbox"), passthrough=2) SizePicker = XYPad(size=(255, 50), bouncingPuck=False, position=(10, 480), bgcolour=(0, 0, 0), fgcolour=(255, 255, 255), slider=True).activate() self.link((SizePicker, "outbox"), (self, "outbox"), passthrough=2) AlphaPicker = XYPad(size=(255, 20), bouncingPuck=False, position=(10, 575), bgcolour=(0, 0, 0), fgcolour=(255, 255, 255), slider=True, alpha=True).activate() self.link((AlphaPicker, "outbox"), (self, "outbox"), passthrough=2) #clock - don't really need this FPS = 60 clock = Clock(float(1) / FPS).activate() self.link((clock, "outbox"), (self, "newframe")) # Initial render so we don't see a blank screen self.drawBG() # self.render() if self.editable: self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONDOWN, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONUP, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEMOTION, "surface": self.display }, "display_signal") done = False while not done: if not self.anyReady(): self.pause() yield 1 while self.dataReady("buttons"): bmsg = self.recv("buttons") if bmsg[0] == "Colour": self.colours = bmsg[1] self.drawBG() while self.dataReady("control"): cmsg = self.recv("control") if (isinstance(cmsg, producerFinished)): self.send(cmsg, "signal") done = True while self.dataReady("inbox"): for event in self.recv("inbox"): if event.type == pygame.MOUSEBUTTONDOWN: self.clickTime = time.time() if self.slider: self.sliderPos = event.pos[0] self.drawBG() if self.display.get_rect().collidepoint(*event.pos): self.mouseDown = True self.isBouncing = False self.mousePositions = [] self.puckVel = [0, 0] self.puckPos = list(event.pos) self.lastMousePos = event.pos self.send( (self.messagePrefix + self.positionMsg, (float(self.puckPos[0]) / self.size[0], float(self.puckPos[1]) / self.size[1])), "localChanges") self.send((self.messagePrefix + "Velocity", self.puckVel), "localChanges") if event.type == pygame.MOUSEBUTTONUP: if self.mouseDown: if self.slider: self.sliderPos = event.pos[0] self.drawBG() if (self.bouncingPuck and time.time() - self.clickTime > 0.1): # Click and drag self.isBouncing = True if len(self.mousePositions): for i in xrange(2): # Use the average of the last 50 # relative mouse positions positions = [ x[i] for x in self.mousePositions ] self.puckVel[i] = sum(positions) self.puckVel[i] /= float( len(positions)) else: # Just a click self.puckVel = [0, 0] self.render() self.send((self.messagePrefix + "Velocity", self.puckVel), "localChanges") self.mouseDown = False if event.type == pygame.MOUSEMOTION and self.mouseDown: if self.slider: self.sliderPos = event.pos[0] self.drawBG() if self.display.get_rect().collidepoint(*event.pos): # We are dragging inside the display # Keep a buffer of 50 mouse positions if len(self.mousePositions) > 50: del self.mousePositions[0] relPos = [] for i in xrange(2): relPos.append(event.pos[i] - self.lastMousePos[i]) self.mousePositions.append(relPos) # Move the puck to where the mouse is and remember # where it is self.puckPos = list(event.pos) self.lastMousePos = event.pos self.send( (self.messagePrefix + self.positionMsg, (float(self.puckPos[0]) / self.size[0], float(self.puckPos[1]) / self.size[1])), "localChanges") self.render() if self.dataReady("remoteChanges"): bundle = self.recv("remoteChanges") # The action to take is given by the last section of the # OSC address - this should maybe be done by a component and # we just listen for ("Velocity", (xVel, yVel)) tuples action = bundle[0].split("/")[-1] if action == "Velocity": if self.bouncingPuck: self.puckVel = bundle[1] self.isBouncing = 1 elif action == "Position": for i in xrange(2): self.puckPos[i] = self.size[i] * bundle[1][i] self.render() if self.dataReady("newframe"): # Time to render a new frame # Clear any backlog of render messages while self.dataReady("newframe"): self.recv("newframe") # Change the direction of the puck if it hits a wall if self.isBouncing: self.processCollisions() if self.isBouncing: # Update the position for i in xrange(2): self.puckPos[i] += self.puckVel[i] self.render()
def main(self): """Main loop.""" # pgd = PygameDisplay( width=300, height=550 ).activate() # PygameDisplay.setDisplayService(pgd) displayservice = PygameDisplay.getDisplayService() self.link((self,"display_signal"), displayservice) self.send( self.dispRequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") # colour buttons rgbutton = Button(caption="Red/Green",position=(self.position[0],self.position[1]+self.size[1]+5), msg = ("Colour", "RG")).activate() rbbutton = Button(caption="Red/Blue",position=(self.position[0]+70,self.position[1]+self.size[1]+5), msg = ("Colour", "RB")).activate() gbbutton = Button(caption="Green/Blue",position=(self.position[0]+140,self.position[1]+self.size[1]+5), msg = ("Colour", "GB")).activate() self.link( (rgbutton,"outbox"), (self,"buttons") ) self.link( (rbbutton,"outbox"), (self,"buttons") ) self.link( (gbbutton,"outbox"), (self,"buttons") ) # Initial render so we don't see a blank screen self.drawBG() # self.render() if self.editable: self.send({"ADDLISTENEVENT" : pygame.MOUSEBUTTONDOWN, "surface" : self.display}, "display_signal") self.send({"ADDLISTENEVENT" : pygame.MOUSEBUTTONUP, "surface" : self.display}, "display_signal") self.send({"ADDLISTENEVENT" : pygame.MOUSEMOTION, "surface" : self.display}, "display_signal") done = False while not done: if not self.anyReady(): self.pause() yield 1 while self.dataReady("buttons"): bmsg = self.recv("buttons") if bmsg[0]=="Colour": self.colours = bmsg[1] self.drawBG() while self.dataReady("control"): cmsg = self.recv("control") if (isinstance(cmsg, producerFinished)): self.send(cmsg, "signal") done = True while self.dataReady("inbox"): for event in self.recv("inbox"): if event.type == pygame.MOUSEBUTTONDOWN: if self.display.get_rect().collidepoint(*event.pos): self.mouseDown = True self.puckPos = event.pos self.render() if event.type == pygame.MOUSEBUTTONUP: if self.mouseDown: self.puckPos = event.pos self.render() self.mouseDown = False if event.type == pygame.MOUSEMOTION and self.mouseDown: if self.display.get_rect().collidepoint(*event.pos): self.puckPos = event.pos self.render()
# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import pygame from Kamaelia.UI.Pygame.Display import PygameDisplay from Kamaelia.Chassis.Graphline import Graphline from Kamaelia.Util.Console import ConsoleEchoer from Kamaelia.UI.Pygame.KeyEvent import KeyEvent from pygame.locals import * width = 400 height = 200 displayservice = PygameDisplay.getDisplayService() g = Graphline(displayservice = displayservice, linkages = {("self", "outbox") : displayservice, } ) disprequest = {"DISPLAYREQUEST" : True, "size" : (width,height), # pixels size for the new surface "callback" : (g, "inbox"), # to send the new surface object to "events" : (g, "events") }
def main(self): """Main event loop, also handles input from other components""" displayservice = PygameDisplay.getDisplayService() self.link((self, "display_signal"), displayservice) self.send(self.disprequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") self.layers.append(self.display) # f = os.path.join('', "pennyarcade.gif") # x = pygame.image.load(f) # colorkey = x.get_at((0, 0)) # if colorkey is True: # x.set_colorkey(colorkey, pygame.RLEACCEL) # self.layers.append(x) # self.display = x # self.activeLayIn = len(self.layers)-1 # self.activeLayer = self.layers[self.activeLayIn] # self.display.blit( x, (0,0) ) layerDisp = TextDisplayer(size=(20, 20), position=(520, 10)).activate() self.link((self, "laynum"), (layerDisp, "inbox")) self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONDOWN, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONUP, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEMOTION, "surface": self.display }, "display_signal") self.send({ "ADDLISTENEVENT": pygame.KEYDOWN, "surface": self.display }, "display_signal") self.activeLayer = self.layers[self.activeLayIn] self.send(self.activeLayIn, "laynum") image = pygame.Surface((20, 20)) pygame.draw.circle(image, (1, 1, 1), (10, 10), self.toolSize, 0) # pygame.draw.circle(image, self.selectedColour, (10, 10), 8, 2) image.set_at((9, 9), (255, 255, 255)) image.set_colorkey(0, pygame.RLEACCEL) cursor = GfxCursor(self.display, image, (10, 10)) self.drawBG(True) self.blitToSurface() FPS = 1 clock = Clock(float(1) / FPS).activate() clock.link((clock, "outbox"), (self, "newframe")) done = False while not done: dirtyrects = [] dirtyrects.extend([cursor.hide()]) if not self.anyReady(): self.pause() yield 1 while self.dataReady("control"): cmsg = self.recv("control") if isinstance(cmsg, producerFinished) or isinstance( cmsg, shutdownMicroprocess): self.send(cmsg, "signal") done = True while self.dataReady("newframe") and self.playing: self.recv("newframe") if self.currentFrame != 0: self.layers[self.currentFrame].set_alpha(0) self.currentFrame = self.currentFrame + 1 if self.currentFrame == len(self.layers) - 1: self.playing = False self.layers[self.currentFrame].set_alpha(255) self.blitToSurface() while self.dataReady("inbox"): for event in self.recv("inbox"): if isinstance(event, tuple): self.send((event, ), "outbox") if event[0] == "Layer": if event[1] == "Add": yield WaitComplete(self.addLayer()) self.activeLayIn = len(self.layers) - 1 self.activeLayer = self.layers[ self.activeLayIn] self.drawBG() if self.animator and len(self.layers) - 2 >= 1: for x in self.layers: s.set_alpha = 0 self.activeLayer.blit( self.layers[len(self.layers) - 2], (0, 0)) self.blitToSurface() elif event[1] == "Delete": self.send( producerFinished(message=self.activeLayer), "display_signal") self.layers.remove(self.activeLayer) self.activeLayIn = 0 self.activeLayer = self.layers[ self.activeLayIn] # print (self.layers) if event[1] == "Next": if self.animator and self.activeLayIn != 0: self.activeLayer.set_alpha(0) if self.activeLayIn == len(self.layers) - 1: self.activeLayIn = 0 self.activeLayer = self.layers[ self.activeLayIn] else: self.activeLayIn += 1 self.activeLayer = self.layers[ self.activeLayIn] if self.animator: self.activeLayer.set_alpha(255) elif event[1] == "Prev": if self.animator and self.activeLayIn != 0: self.activeLayer.set_alpha(0) if self.activeLayIn == 0: self.activeLayIn = len(self.layers) - 1 self.activeLayer = self.layers[ self.activeLayIn] else: self.activeLayIn -= 1 self.activeLayer = self.layers[ self.activeLayIn] if self.animator: self.activeLayer.set_alpha(255) self.send(self.activeLayIn, "laynum") elif event[0] == "Tool": self.tool = event[1] elif event[0] == "Size": self.toolSize = event[1] / 3 pygame.draw.circle(image, self.selectedColour, (10, 10), self.toolSize / 3, 0) image.set_at((9, 9), (255, 255, 255)) image.set_colorkey(0, pygame.RLEACCEL) cursor = GfxCursor(self.display, image, (10, 10)) elif event[0] == "Alpha": self.layers[self.activeLayIn].set_alpha(event[1]) self.blitToSurface() # print (self.activeLayer.get_alpha()) elif event[0] == 'Colour': self.selectedColour = event[1] pygame.draw.circle(image, self.selectedColour, (10, 10), self.toolSize / 3, 0) image.set_at((9, 9), (255, 255, 255)) image.set_colorkey(0, pygame.RLEACCEL) cursor = GfxCursor(self.display, image, (10, 10)) elif event[0] == 'Save': self.save(event[1]) break if event.type == pygame.MOUSEBUTTONDOWN: cursor.disable() if self.tool == "Circle": if event.button == 1: self.oldpos = event.pos self.drawing = True if self.tool == "Eraser": self.selectedColour = self.backgroundColour self.tool = "Line" if self.tool == "Line": if event.button == 1: self.drawing = True if self.tool == "Bucket": self.floodFill(event.pos[0], event.pos[1], self.selectedColour, self.activeLayer.get_at(event.pos)) if self.tool == "Eyedropper": self.selectedColour = self.activeLayer.get_at( event.pos) if event.button == 3: self.addLayer() #self.oldpos = None #self.drawBG() #self.blitToSurface() #self.send(("clear",), "outbox") elif event.type == (pygame.KEYDOWN): if event.key == pygame.K_c: image = pygame.image.load( os.path.join('', 'pennyarcade.gif')) yield WaitComplete(self.addLayer()) self.activeLayIn = len(self.layers) - 1 self.activeLayer = self.layers[self.activeLayIn] self.drawBG() self.activeLayer.blit(image, (10, 10)) self.blitToSurface() self.send(self.activeLayIn, "laynum") elif event.key == pygame.K_s: """Testing a different brushing technique, bliting a brush""" print(self.size, self.toolSize) yield WaitComplete(self.addBrush()) self.activeBrush = self.brushes[len(self.brushes) - 1] self.activeBrush.fill(self.backgroundColour) pygame.draw.circle( self.activeBrush, self.selectedColour, (self.toolSize / 2, self.toolSize / 2), self.toolSize, 0) elif event.key == pygame.K_a: self.animator = True elif event.key == pygame.K_l: self.layers[1].blit(self.layers[1], (100, 100)) # temp = self.layers[1] # self.layers[1].fill(self.backgroundColour) # self.layers[1].blit( temp, (100,100) ) elif event.key == pygame.K_o: for x in self.layers: x.set_alpha(0) self.layers[0].set_alpha(255) self.currentFrame = 0 while self.dataReady( "newframe" ): # empty if there's anything there self.recv("newframe") self.playing = True self.blitToSurface() elif event.type == pygame.MOUSEBUTTONUP and event.button == 1: cursor.enable() if self.tool == "Circle": rad = int( math.sqrt(( (event.pos[0] - self.oldpos[0])**2) + ( (event.pos[1] - self.oldpos[1])**2))) pygame.draw.circle(self.activeLayer, self.selectedColour, self.oldpos, rad, 0) circle = ("circle", self.oldpos, rad) # self.send((circle,), "outbox") self.blitToSurface() self.drawing = False self.oldpos = None elif event.type == pygame.MOUSEMOTION: cursor.update(event) if self.tool == "Line": if self.drawing and self.innerRect.collidepoint( *event.pos): if self.oldpos == None: self.oldpos = event.pos else: # pygame.draw.circle(self.activeLayer, self.selectedColour, self.oldpos, self.toolSize, 0) r = pygame.draw.line( self.activeLayer, self.selectedColour, self.oldpos, event.pos, self.toolSize) dirtyrects.append(r) # self.activeLayer.blit(self.activeBrush, event.pos) FAILED TECHNIQUE line = ("line", self.oldpos, event.pos) self.send((line, ), "outbox") self.oldpos = event.pos self.blitToSurface() self.pause() pygame.time.delay(5) dirtyrects.extend([cursor.show()]) pygame.display.update(dirtyrects) yield 1
def main(self): """Main loop.""" displayservice = PygameDisplay.getDisplayService() self.link((self, "display_signal"), displayservice) self.send(self.dispRequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") # tool buttons circleb = Button(caption="Circle", position=(10, 10), msg=(("Tool", "Circle"), )).activate() eraseb = Button(caption="Eraser", position=(100, 10), msg=(("Tool", "Eraser"), )).activate() lineb = Button(caption="Line", position=(10, 50), msg=(("Tool", "Line"), )).activate() bucketb = Button(caption="Bucket", position=(10, 90), msg=(("Tool", "Bucket"), )).activate() eyeb = Button(caption="Eyedropper", position=(10, 130), msg=(("Tool", "Eyedropper"), )).activate() addlayerb = Button(caption="Add Layer", position=(10, 540), msg=(("Layer", "Add"), )).activate() prevlayerb = Button(caption="<-", position=(80, 540), msg=(("Layer", "Prev"), )).activate() nextlayerb = Button(caption="->", position=(110, 540), msg=(("Layer", "Next"), )).activate() dellayerb = Button(caption="Delete", position=(140, 540), msg=(("Layer", "Delete"), )).activate() self.link((circleb, "outbox"), (self, "outbox"), passthrough=2) self.link((eraseb, "outbox"), (self, "outbox"), passthrough=2) self.link((lineb, "outbox"), (self, "outbox"), passthrough=2) self.link((bucketb, "outbox"), (self, "outbox"), passthrough=2) self.link((eyeb, "outbox"), (self, "outbox"), passthrough=2) self.link((addlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((prevlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((nextlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((dellayerb, "outbox"), (self, "outbox"), passthrough=2) colSel = ColourSelector(position=(10, 170), size=(255, 255)).activate() self.link((colSel, "outbox"), (self, "outbox"), passthrough=2) SizeSlider = Slider(size=(255, 50), messagePrefix="Size", position=(10, 460), default=9).activate() self.link((SizeSlider, "outbox"), (self, "outbox"), passthrough=2) AlphaSlider = Slider(size=(255, 10), messagePrefix="Alpha", position=(10, 515), default=255).activate() self.link((AlphaSlider, "outbox"), (self, "outbox"), passthrough=2) self.drawBG() done = False while not done: if not self.anyReady(): self.pause() yield 1
def main(self): """Main loop.""" displayservice = PygameDisplay.getDisplayService() self.link((self,"display_signal"), displayservice) self.send( self.dispRequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") # colour buttons # Initial render so we don't see a blank screen self.sliderPos = self.default self.drawBG() self.render() self.send({"ADDLISTENEVENT" : pygame.MOUSEBUTTONDOWN, "surface" : self.display}, "display_signal") self.send({"ADDLISTENEVENT" : pygame.MOUSEBUTTONUP, "surface" : self.display}, "display_signal") self.send({"ADDLISTENEVENT" : pygame.MOUSEMOTION, "surface" : self.display}, "display_signal") done = False while not done: if not self.anyReady(): self.pause() yield 1 while self.dataReady("control"): cmsg = self.recv("control") if (isinstance(cmsg, producerFinished)): self.send(cmsg, "signal") done = True while self.dataReady("inbox"): for event in self.recv("inbox"): if event.type == pygame.MOUSEBUTTONDOWN: if self.display.get_rect().collidepoint(*event.pos): self.sliderPos = event.pos[0] self.drawBG() self.render() self.mouseDown = True if event.type == pygame.MOUSEBUTTONUP: if self.mouseDown: self.sliderPos = event.pos[0] self.drawBG() self.render() self.mouseDown = False if event.type == pygame.MOUSEMOTION and self.mouseDown: if self.display.get_rect().collidepoint(*event.pos): if event.pos[0] > self.size[0] or event.pos[0] < 0: self.mouseDown = False break self.sliderPos = event.pos[0] self.drawBG() self.render()
def main(self): """Main loop.""" # pgd = PygameDisplay( width=300, height=550 ).activate() # PygameDisplay.setDisplayService(pgd) displayservice = PygameDisplay.getDisplayService() self.link((self, "display_signal"), displayservice) self.send(self.dispRequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") # colour buttons if self.colourSelector: rgbutton = Button(caption="Red/Green", position=(10, 170), msg=("Colour", "RG")).activate() rbbutton = Button(caption="Red/Blue", position=(80, 170), msg=("Colour", "RB")).activate() gbbutton = Button(caption="Green/Blue", position=(145, 170), msg=("Colour", "GB")).activate() self.link((rgbutton, "outbox"), (self, "buttons")) self.link((rbbutton, "outbox"), (self, "buttons")) self.link((gbbutton, "outbox"), (self, "buttons")) # tool buttons circleb = Button(caption="Circle", position=(10, 10), msg=(("Tool", "Circle"),)).activate() eraseb = Button(caption="Eraser", position=(100, 10), msg=(("Tool", "Eraser"),)).activate() lineb = Button(caption="Line", position=(10, 50), msg=(("Tool", "Line"),)).activate() bucketb = Button(caption="Bucket", position=(10, 90), msg=(("Tool", "Bucket"),)).activate() eyeb = Button(caption="Eyedropper", position=(10, 130), msg=(("Tool", "Eyedropper"),)).activate() addlayerb = Button(caption="Add Layer", position=(10, 540), msg=(("Layer", "Add"),)).activate() prevlayerb = Button(caption="<-", position=(80, 540), msg=(("Layer", "Prev"),)).activate() nextlayerb = Button(caption="->", position=(110, 540), msg=(("Layer", "Next"),)).activate() dellayerb = Button(caption="Delete", position=(140, 540), msg=(("Layer", "Delete"),)).activate() self.link((circleb, "outbox"), (self, "outbox"), passthrough=2) self.link((eraseb, "outbox"), (self, "outbox"), passthrough=2) self.link((lineb, "outbox"), (self, "outbox"), passthrough=2) self.link((bucketb, "outbox"), (self, "outbox"), passthrough=2) self.link((eyeb, "outbox"), (self, "outbox"), passthrough=2) self.link((addlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((prevlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((nextlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((dellayerb, "outbox"), (self, "outbox"), passthrough=2) SizePicker = XYPad( size=(255, 50), bouncingPuck=False, position=(10, 480), bgcolour=(0, 0, 0), fgcolour=(255, 255, 255), slider=True, ).activate() self.link((SizePicker, "outbox"), (self, "outbox"), passthrough=2) AlphaPicker = XYPad( size=(255, 20), bouncingPuck=False, position=(10, 575), bgcolour=(0, 0, 0), fgcolour=(255, 255, 255), slider=True, alpha=True, ).activate() self.link((AlphaPicker, "outbox"), (self, "outbox"), passthrough=2) # clock - don't really need this FPS = 60 clock = Clock(float(1) / FPS).activate() self.link((clock, "outbox"), (self, "newframe")) # Initial render so we don't see a blank screen self.drawBG() # self.render() if self.editable: self.send({"ADDLISTENEVENT": pygame.MOUSEBUTTONDOWN, "surface": self.display}, "display_signal") self.send({"ADDLISTENEVENT": pygame.MOUSEBUTTONUP, "surface": self.display}, "display_signal") self.send({"ADDLISTENEVENT": pygame.MOUSEMOTION, "surface": self.display}, "display_signal") done = False while not done: if not self.anyReady(): self.pause() yield 1 while self.dataReady("buttons"): bmsg = self.recv("buttons") if bmsg[0] == "Colour": self.colours = bmsg[1] self.drawBG() while self.dataReady("control"): cmsg = self.recv("control") if isinstance(cmsg, producerFinished): self.send(cmsg, "signal") done = True while self.dataReady("inbox"): for event in self.recv("inbox"): if event.type == pygame.MOUSEBUTTONDOWN: self.clickTime = time.time() if self.slider: self.sliderPos = event.pos[0] self.drawBG() if self.display.get_rect().collidepoint(*event.pos): self.mouseDown = True self.isBouncing = False self.mousePositions = [] self.puckVel = [0, 0] self.puckPos = list(event.pos) self.lastMousePos = event.pos self.send( ( self.messagePrefix + self.positionMsg, (float(self.puckPos[0]) / self.size[0], float(self.puckPos[1]) / self.size[1]), ), "localChanges", ) self.send((self.messagePrefix + "Velocity", self.puckVel), "localChanges") if event.type == pygame.MOUSEBUTTONUP: if self.mouseDown: if self.slider: self.sliderPos = event.pos[0] self.drawBG() if self.bouncingPuck and time.time() - self.clickTime > 0.1: # Click and drag self.isBouncing = True if len(self.mousePositions): for i in xrange(2): # Use the average of the last 50 # relative mouse positions positions = [x[i] for x in self.mousePositions] self.puckVel[i] = sum(positions) self.puckVel[i] /= float(len(positions)) else: # Just a click self.puckVel = [0, 0] self.render() self.send((self.messagePrefix + "Velocity", self.puckVel), "localChanges") self.mouseDown = False if event.type == pygame.MOUSEMOTION and self.mouseDown: if self.slider: self.sliderPos = event.pos[0] self.drawBG() if self.display.get_rect().collidepoint(*event.pos): # We are dragging inside the display # Keep a buffer of 50 mouse positions if len(self.mousePositions) > 50: del self.mousePositions[0] relPos = [] for i in xrange(2): relPos.append(event.pos[i] - self.lastMousePos[i]) self.mousePositions.append(relPos) # Move the puck to where the mouse is and remember # where it is self.puckPos = list(event.pos) self.lastMousePos = event.pos self.send( ( self.messagePrefix + self.positionMsg, (float(self.puckPos[0]) / self.size[0], float(self.puckPos[1]) / self.size[1]), ), "localChanges", ) self.render() if self.dataReady("remoteChanges"): bundle = self.recv("remoteChanges") # The action to take is given by the last section of the # OSC address - this should maybe be done by a component and # we just listen for ("Velocity", (xVel, yVel)) tuples action = bundle[0].split("/")[-1] if action == "Velocity": if self.bouncingPuck: self.puckVel = bundle[1] self.isBouncing = 1 elif action == "Position": for i in xrange(2): self.puckPos[i] = self.size[i] * bundle[1][i] self.render() if self.dataReady("newframe"): # Time to render a new frame # Clear any backlog of render messages while self.dataReady("newframe"): self.recv("newframe") # Change the direction of the puck if it hits a wall if self.isBouncing: self.processCollisions() if self.isBouncing: # Update the position for i in xrange(2): self.puckPos[i] += self.puckVel[i] self.render()
def main(self): """Main loop.""" displayservice = PygameDisplay.getDisplayService() self.link((self, "display_signal"), displayservice) self.send(self.dispRequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") # tool buttons circleb = ImageButton( caption=(os.path.join("icons", "EllipseToolIcon.png")), position=(10, 10), bgcolour=(235, 235, 235), msg=(("Tool", "Circle"),), ).activate() eraseb = ImageButton( caption=(os.path.join("icons", "EraserToolIcon.png")), position=(100, 10), bgcolour=(235, 235, 235), msg=(("Tool", "Eraser"),), ).activate() lineb = ImageButton( caption=(os.path.join("icons", "PaintBrushToolIcon.png")), position=(10, 50), bgcolour=(235, 235, 235), msg=(("Tool", "Line"),), ).activate() bucketb = ImageButton( caption=(os.path.join("icons", "PaintBucketIcon.png")), position=(10, 90), bgcolour=(235, 235, 235), msg=(("Tool", "Bucket"),), ).activate() eyeb = ImageButton( caption=(os.path.join("icons", "ColorPickerToolIcon.png")), position=(10, 130), bgcolour=(235, 235, 235), msg=(("Tool", "Eyedropper"),), ).activate() addlayerb = ImageButton( caption=(os.path.join("icons", "PlusButtonIcon.png")), position=(10, 540), bgcolour=(235, 235, 235), msg=(("Layer", "Add"),), ).activate() prevlayerb = ImageButton( caption=(os.path.join("icons", "MenuLayersMoveLayerDownIcon.png")), position=(80, 540), bgcolour=(235, 235, 235), msg=(("Layer", "Prev"),), ).activate() nextlayerb = ImageButton( caption=(os.path.join("icons", "MenuLayersMoveLayerUpIcon.png")), position=(110, 540), bgcolour=(235, 235, 235), msg=(("Layer", "Next"),), ).activate() dellayerb = ImageButton( caption=(os.path.join("icons", "MinusButtonIcon.png")), position=(35, 540), bgcolour=(235, 235, 235), msg=(("Layer", "Delete"),), ).activate() saveb = ImageButton( caption=(os.path.join("icons", "MenuFileSaveIcon.png")), position=(100, 130), bgcolour=(235, 235, 235), msg=(("Save", "Test"),), ).activate() self.link((circleb, "outbox"), (self, "outbox"), passthrough=2) self.link((eraseb, "outbox"), (self, "outbox"), passthrough=2) self.link((lineb, "outbox"), (self, "outbox"), passthrough=2) self.link((bucketb, "outbox"), (self, "outbox"), passthrough=2) self.link((eyeb, "outbox"), (self, "outbox"), passthrough=2) self.link((addlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((prevlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((nextlayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((dellayerb, "outbox"), (self, "outbox"), passthrough=2) self.link((saveb, "outbox"), (self, "outbox"), passthrough=2) colSel = ColourSelector(position=(10, 170), size=(255, 255)).activate() self.link((colSel, "outbox"), (self, "outbox"), passthrough=2) SizeSlider = Slider(size=(255, 50), messagePrefix="Size", position=(10, 460), default=9).activate() self.link((SizeSlider, "outbox"), (self, "outbox"), passthrough=2) AlphaSlider = Slider(size=(255, 10), messagePrefix="Alpha", position=(10, 515), default=255).activate() self.link((AlphaSlider, "outbox"), (self, "outbox"), passthrough=2) self.drawBG() done = False while not done: if not self.anyReady(): self.pause() yield 1
def main(self): """Main loop.""" # pgd = PygameDisplay( width=300, height=550 ).activate() # PygameDisplay.setDisplayService(pgd) displayservice = PygameDisplay.getDisplayService() self.link((self, "display_signal"), displayservice) self.send(self.dispRequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") # colour buttons rgbutton = Button(caption="Red/Green", position=(self.position[0], self.position[1] + self.size[1] + 5), msg=("Colour", "RG")).activate() rbbutton = Button(caption="Red/Blue", position=(self.position[0] + 70, self.position[1] + self.size[1] + 5), msg=("Colour", "RB")).activate() gbbutton = Button(caption="Green/Blue", position=(self.position[0] + 140, self.position[1] + self.size[1] + 5), msg=("Colour", "GB")).activate() self.link((rgbutton, "outbox"), (self, "buttons")) self.link((rbbutton, "outbox"), (self, "buttons")) self.link((gbbutton, "outbox"), (self, "buttons")) # Initial render so we don't see a blank screen self.drawBG() # self.render() if self.editable: self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONDOWN, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONUP, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEMOTION, "surface": self.display }, "display_signal") done = False while not done: if not self.anyReady(): self.pause() yield 1 while self.dataReady("buttons"): bmsg = self.recv("buttons") if bmsg[0] == "Colour": self.colours = bmsg[1] self.drawBG() while self.dataReady("control"): cmsg = self.recv("control") if (isinstance(cmsg, producerFinished)): self.send(cmsg, "signal") done = True while self.dataReady("inbox"): for event in self.recv("inbox"): if event.type == pygame.MOUSEBUTTONDOWN: if self.display.get_rect().collidepoint(*event.pos): self.mouseDown = True self.puckPos = event.pos self.render() if event.type == pygame.MOUSEBUTTONUP: if self.mouseDown: self.puckPos = event.pos self.render() self.mouseDown = False if event.type == pygame.MOUSEMOTION and self.mouseDown: if self.display.get_rect().collidepoint(*event.pos): self.puckPos = event.pos self.render()
def main(self): """Main loop.""" # pgd = PygameDisplay( width=300, height=550 ).activate() # PygameDisplay.setDisplayService(pgd) displayservice = PygameDisplay.getDisplayService() self.link((self,"display_signal"), displayservice) self.send( self.dispRequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") # colour buttons rgbutton = ImageButton(caption=(os.path.join('icons', 'RedGreenIcon.png')),position=(self.position[0],self.position[1]+self.size[1]+5), msg = ("ColourCombi", "RG"), size = (20,20)).activate() rbbutton = ImageButton(caption=(os.path.join('icons', 'RedBlueIcon.png')),position=(self.position[0]+35,self.position[1]+self.size[1]+5), msg = ("ColourCombi", "RB"), size = (20,20)).activate() gbbutton = ImageButton(caption=(os.path.join('icons', 'GreenBlueIcon.png')),position=(self.position[0]+70,self.position[1]+self.size[1]+5), msg = ("ColourCombi", "GB"), size = (20,20)).activate() self.link( (rgbutton,"outbox"), (self,"buttons") ) self.link( (rbbutton,"outbox"), (self,"buttons") ) self.link( (gbbutton,"outbox"), (self,"buttons") ) # saturator saturator = Slider(vertical = True, saturator = True, messagePrefix= "Colour", size=(10,255), position=(self.position[0]+self.size[0]+5,self.position[1] )).activate() self.link( (self,"saturator"), (saturator,"colours") ) self.link( (saturator,"outbox"), (self,"outbox"), passthrough = 2 ) # Initial render so we don't see a blank screen self.drawBG() # self.render() if self.editable: self.send({"ADDLISTENEVENT" : pygame.MOUSEBUTTONDOWN, "surface" : self.display}, "display_signal") self.send({"ADDLISTENEVENT" : pygame.MOUSEBUTTONUP, "surface" : self.display}, "display_signal") self.send({"ADDLISTENEVENT" : pygame.MOUSEMOTION, "surface" : self.display}, "display_signal") done = False while not done: if not self.anyReady(): self.pause() yield 1 while self.dataReady("buttons"): bmsg = self.recv("buttons") if bmsg[0]=="ColourCombi": self.colours = bmsg[1] self.send(bmsg, "saturator") self.drawBG() while self.dataReady("control"): cmsg = self.recv("control") if (isinstance(cmsg, producerFinished)): self.send(cmsg, "signal") done = True while self.dataReady("inbox"): for event in self.recv("inbox"): if event.type == pygame.MOUSEBUTTONDOWN: if self.display.get_rect().collidepoint(*event.pos): self.mouseDown = True self.puckPos = event.pos self.render() if event.type == pygame.MOUSEBUTTONUP and self.mouseDown: if self.mouseDown: self.puckPos = event.pos self.render() self.mouseDown = False if event.type == pygame.MOUSEMOTION and self.mouseDown: if self.display.get_rect().collidepoint(*event.pos): self.puckPos = event.pos self.render() else: self.mouseDown = False
def main(self): """Main loop.""" # pgd = PygameDisplay( width=300, height=550 ).activate() # PygameDisplay.setDisplayService(pgd) displayservice = PygameDisplay.getDisplayService() self.link((self, "display_signal"), displayservice) self.send(self.dispRequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") # colour buttons rgbutton = ImageButton(caption=(os.path.join('icons', 'RedGreenIcon.png')), position=(self.position[0], self.position[1] + self.size[1] + 5), msg=("ColourCombi", "RG"), size=(20, 20)).activate() rbbutton = ImageButton(caption=(os.path.join('icons', 'RedBlueIcon.png')), position=(self.position[0] + 35, self.position[1] + self.size[1] + 5), msg=("ColourCombi", "RB"), size=(20, 20)).activate() gbbutton = ImageButton(caption=(os.path.join('icons', 'GreenBlueIcon.png')), position=(self.position[0] + 70, self.position[1] + self.size[1] + 5), msg=("ColourCombi", "GB"), size=(20, 20)).activate() self.link((rgbutton, "outbox"), (self, "buttons")) self.link((rbbutton, "outbox"), (self, "buttons")) self.link((gbbutton, "outbox"), (self, "buttons")) # saturator saturator = Slider(vertical=True, saturator=True, messagePrefix="Colour", size=(10, 255), position=(self.position[0] + self.size[0] + 5, self.position[1])).activate() self.link((self, "saturator"), (saturator, "colours")) self.link((saturator, "outbox"), (self, "outbox"), passthrough=2) # Initial render so we don't see a blank screen self.drawBG() # self.render() if self.editable: self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONDOWN, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONUP, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEMOTION, "surface": self.display }, "display_signal") done = False while not done: if not self.anyReady(): self.pause() yield 1 while self.dataReady("buttons"): bmsg = self.recv("buttons") if bmsg[0] == "ColourCombi": self.colours = bmsg[1] self.send(bmsg, "saturator") self.drawBG() while self.dataReady("control"): cmsg = self.recv("control") if (isinstance(cmsg, producerFinished)): self.send(cmsg, "signal") done = True while self.dataReady("inbox"): for event in self.recv("inbox"): if event.type == pygame.MOUSEBUTTONDOWN: if self.display.get_rect().collidepoint(*event.pos): self.mouseDown = True self.puckPos = event.pos self.render() if event.type == pygame.MOUSEBUTTONUP and self.mouseDown: if self.mouseDown: self.puckPos = event.pos self.render() self.mouseDown = False if event.type == pygame.MOUSEMOTION and self.mouseDown: if self.display.get_rect().collidepoint(*event.pos): self.puckPos = event.pos self.render() else: self.mouseDown = False