Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Jam/Block.py
diff options
context:
space:
mode:
authoramartin <olpc@xo-05-28-21.localdomain>2007-08-01 11:26:00 (GMT)
committer amartin <olpc@xo-05-28-21.localdomain>2007-08-01 11:26:00 (GMT)
commit29e22f05090827be14e2d9cfd29c73a5d0ec9239 (patch)
treeae55826ea3c9c0ee0d09a96a7bde00e865e0fa18 /Jam/Block.py
parent65f1c3491a68fcf892987d8cba6485054694f4f7 (diff)
Jam Desktop
Diffstat (limited to 'Jam/Block.py')
-rw-r--r--Jam/Block.py207
1 files changed, 207 insertions, 0 deletions
diff --git a/Jam/Block.py b/Jam/Block.py
new file mode 100644
index 0000000..907ed3d
--- /dev/null
+++ b/Jam/Block.py
@@ -0,0 +1,207 @@
+
+import pygtk
+pygtk.require( '2.0' )
+import gtk
+
+import Config
+
+import random
+
+class Block():
+
+ WIDTH = 100
+ HEIGHT = 100
+
+ WIDTH_DIV2 = WIDTH//2
+ HEIGHT_DIV2 = HEIGHT//2
+
+ def __init__( self, owner, graphics_context ):
+ self.owner = owner
+ self.gc = graphics_context
+
+ self.type = Block
+
+ self.parent = None
+ self.canChild = False
+ self.child = None
+ self.canParent = False
+
+ self.dragging = False
+
+ self.placed = False
+ self.x = -1
+ self.y = -1
+
+ # TEMP
+ self.color = random.choice( [ "tempBlock1", "tempBlock2", "tempBlock3", "tempBlock4", "tempBlock5" ] )
+
+ def destroy( self ):
+ if self.child:
+ self.child.destroy()
+ self.child = None
+
+ def getLoc( self ):
+ return ( self.x, self.y )
+
+ def setLoc( self, x, y ):
+ if x == self.x and y == self.y: return
+
+ if self.placed:
+ self.invalidate_rect( not self.dragging )
+ else:
+ self.placed = True
+
+ self.x = x
+ self.y = y
+ self.endX = x + self.type.WIDTH
+ self.endY = y + self.type.HEIGHT
+
+ self.invalidate_rect( not self.dragging )
+
+ if self.child:
+ self.child.setLoc( self.endX, y )
+
+ def testChild( self, loc ):
+
+ if not self.canParent:
+ return False
+
+ if self.child:
+ handled = self.child.testChild( loc )
+ if handled: return handled
+ elif abs( self.endX - loc[0] ) < 10 and abs( self.y - loc[1] ) < 10:
+ return self
+
+ return False
+
+ def addChild( self, child ):
+ self.child = child
+ child._addParent( self )
+ child.setLoc( self.endX, self.y )
+
+ def removeChild( self ):
+ self.child._removeParent()
+ self.child = None
+
+ def _addParent( self, parent ):
+ self.parent = parent
+
+ def _removeParent( self ):
+ self.parent = None
+
+ def getRoot( self ):
+ if self.parent: return self.parent.getRoot()
+ return self
+
+ def button_press( self, event ):
+
+ if event.y < self.y or event.y > self.endY:
+ return False
+
+ return self._button_pressB( event )
+
+ def _button_pressB( self, event ):
+
+ if event.x < self.x:
+ return False
+
+ if self.child:
+ handled = self.child._button_pressB( event )
+ if handled: return handled
+
+ if event.x > self.endX:
+ return False
+
+ self.dragOffset = ( event.x - self.x, event.y - self.y )
+
+ self._doButtonPress( event )
+
+ return self
+
+ def _doButtonPress( self, event ):
+ pass # override in subclasses
+
+ def button_release( self, event ):
+ if self.dragging:
+ self.dragging = False
+ self.invalidateBranch()
+
+ def motion_notify( self, event ):
+
+ removeFromBlocks = not self.dragging and not self.parent
+
+ if not self.dragging:
+ self.dragging = True
+ self.invalidate_rect()
+
+ if self.parent:
+ self.parent.removeChild()
+
+ self.setLoc( event.x - self.dragOffset[0], event.y - self.dragOffset[1] )
+
+ return removeFromBlocks
+
+ def _beginDrag( self ):
+ self.dragging = True
+ self.dragOffset = ( self.type.WIDTH_DIV2, self.type.HEIGHT_DIV2 )
+
+ def invalidateBranch( self, base = True ):
+ self.invalidate_rect( base )
+ if self.child:
+ self.child.invalidateBranch( base )
+
+ def invalidate_rect( self, base = True ):
+ self.owner.invalidate_rect( self.x, self.y, self.type.WIDTH, self.type.HEIGHT, base )
+
+ def draw( self, startX, startY, stopX, stopY, pixmap ):
+ if stopY < self.y or startY > self.endY:
+ return False
+
+ self._drawB( startX, startY, stopX, stopY, pixmap )
+
+ def _drawB( self, startX, startY, stopX, stopY, pixmap ):
+
+ if stopX < self.x:
+ return False
+
+ if self.child:
+ self.child._drawB( startX, startY, stopX, stopX, pixmap )
+
+ if startX > self.endX:
+ return False
+
+ self._doDraw( startX, startY, stopX, stopY, pixmap )
+
+ return True
+
+ def _doDraw( self, startX, startY, stopX, stopY, pixmap ):
+ # TEMP
+ self.gc.foreground = self.owner.colors[self.color]
+ pixmap.draw_rectangle( self.gc, True, self.x, self.y, self.type.WIDTH, self.type.HEIGHT )
+ pass # override in subclasses
+
+ def drawHighlight( self, startX, startY, stopX, stopY, pixmap ):
+ # TEMP
+ self.gc.foreground = self.owner.colors["tempWhite"]
+ pixmap.draw_rectangle( self.gc, False, self.x, self.y, self.type.WIDTH-1, self.type.HEIGHT-1 )
+
+
+class Instrument(Block):
+
+ WIDTH = Block.WIDTH
+ HEIGHT = Block.HEIGHT
+
+ WIDTH_DIV2 = WIDTH//2
+ HEIGHT_DIV2 = HEIGHT//2
+
+ def __init__( self, owner, graphics_context ):
+ Block.__init__( self, owner, graphics_context )
+
+ self.type = Instrument
+
+ self.canParent = True
+ self.canChild = True
+
+ def _doButtonPress( self, event ): # we were hit with a button press
+ pass
+