Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/ToolbarArea.py
diff options
context:
space:
mode:
Diffstat (limited to 'ToolbarArea.py')
-rw-r--r--ToolbarArea.py549
1 files changed, 549 insertions, 0 deletions
diff --git a/ToolbarArea.py b/ToolbarArea.py
new file mode 100644
index 0000000..2e3cf00
--- /dev/null
+++ b/ToolbarArea.py
@@ -0,0 +1,549 @@
+import gtk
+import math
+import cairo
+
+_showDebugMsg = False
+
+class ToolbarArea(gtk.DrawingArea):
+
+ def __init__(self, wid, hei, platform, mp):
+
+ self.platform = platform
+
+ self.main = mp
+ self.width, self.height = wid, hei
+ self.init_data()
+ self.init_graphics()
+
+ gtk.DrawingArea.__init__(self)
+
+ self.set_size_request(self.width, self.height)
+
+ # Event signals
+ self.connect("expose_event", self.expose_event)
+ self.connect("configure_event", self.configure_event)
+ self.connect("enter_notify_event", self.enter_notify_event)
+ self.connect("leave_notify_event", self.leave_notify_event)
+ self.connect("motion_notify_event", self.motion_notify_event)
+ self.connect("button_press_event", self.button_press_event)
+ self.connect("button_release_event", self.button_release_event)
+
+ self.set_events(gtk.gdk.EXPOSURE_MASK
+ | gtk.gdk.ENTER_NOTIFY_MASK
+ | gtk.gdk.LEAVE_NOTIFY_MASK
+ | gtk.gdk.BUTTON_PRESS_MASK
+ | gtk.gdk.BUTTON_RELEASE_MASK
+ | gtk.gdk.POINTER_MOTION_MASK
+ | gtk.gdk.POINTER_MOTION_HINT_MASK)
+
+ def init_data(self):
+
+ canvas_width = self.main.canvas.gridw * self.main.canvas.ngrid_h
+
+ if self.height == 56:
+ self.toolbarw = 44
+ self.icon_set = 40
+# elif self.height == 64:
+# self.toolbarw = 44
+# self.icon_set = 40
+ else:
+ self.toolbarw = 54
+ self.icon_set = 48
+
+ self.cx = (int)(0.09 * self.width)
+ self.cy = 12
+
+ if self.width <= 1199:
+ self.toolbarw = 36
+ self.icon_set = 32
+ self.div1 = 18
+ self.div2 = 24
+ self.div3 = 24
+ self.div4 = 8
+ self.sw = 128
+ self.cy = 16
+ elif self.width <= 1440:
+ self.toolbarw = 44
+ self.icon_set = 40
+ self.div1 = 12
+ self.div2 = 20
+ self.div3 = 20
+ self.div4 = 8
+ self.sw = 128
+ else:
+ self.div1 = 36
+ self.div2 = 36
+ self.div3 = 36
+ self.div4 = 12
+ self.sw = 150
+
+ m = canvas_width - self.div1 - self.div2 - self.div3 - self.div4 - self.sw - self.toolbarw * (8+6+5)
+ if m >= 0:
+ if m < 20:
+ v = (int)(m / 4)
+ self.div1 = self.div1 + v
+ self.div2 = self.div2 + v
+ self.div3 = self.div3 + v
+ self.sw = self.sw + v
+ else:
+ v = (int)(m / 4 - 1)
+ self.div1 = self.div1 + v
+ self.div2 = self.div2 + v
+ self.div3 = self.div3 + v
+ self.div4 = 12
+ self.sw = self.sw + v
+
+# self.div1 = 24
+# self.div2 = 24
+# if self.platform == "windows-1024":
+# self.toolbarw = 44
+# self.cy = 12
+# elif self.platform == "sugar-xo":
+# self.toolbarw = 54
+# self.cy = 6
+# self.div1 = 36
+# self.div2 = 36
+# else: # default
+# self.toolbarw = 36
+# self.cy = 12
+
+ # self.cx = 92
+ self.load_icon = 0
+ self.toolsel = 2
+ self.colorsel = 0
+ self.is_dragging = 0
+
+ self.fix_button = 0
+
+ self.sx = self.cx + self.toolbarw*14 + self.div1 + self.div2 # slider
+ self.sy = self.cy + self.toolbarw/2 + 6
+ self.sval = 0.5
+
+ self.pstate = 0
+ self.fstate = 0
+
+ self.from_start = 0
+ self.loop = 0
+ self.record = 0
+
+ def get_color_attr(self, c):
+ if c == 0: # red
+ return (1, 0.225, 0.225)
+ elif c == 1: # orange
+ return (1, 0.5, 0)
+ elif c == 2: # yellow
+ return (0.975, 0.99, 0.01)
+ elif c == 3: # light green
+ return (0.635, 0.97, 0.01)
+ elif c == 4: # dark green
+ return (0.15, 0.6, 0.07)
+ elif c == 5: # light blue
+ return (0, 1, 1)
+ elif c == 6: # blue
+ return (0, 0.02, 0.875)
+ else: # purple
+ return (0.6, 0.15, 1)
+
+ def init_graphics(self):
+ self.light_grey = gtk.gdk.Color(58112,58112,58112)
+ self.dark_grey = gtk.gdk.Color(40960,40960,40960)
+ self.white = gtk.gdk.color_parse('white')
+ self.black = gtk.gdk.color_parse('black')
+ self.blue = gtk.gdk.Color(0,1280,57600)
+ self.green = gtk.gdk.Color(9728,38912,4608)
+ self.red = gtk.gdk.Color(65535,15000,15000)
+ self.yellow = gtk.gdk.Color(64000, 65000, 500)
+ self.purple = gtk.gdk.color_parse('purple')
+ self.orange = gtk.gdk.color_parse('orange')
+ self.lblue = gtk.gdk.Color(0, 65535, 65535)
+ self.grass = gtk.gdk.Color(41728, 63744, 512)
+
+ self.color_list = [self.red,self.orange,self.yellow,self.grass,self.green,self.lblue,self.blue,self.purple]
+
+ def request_tempo_change(self):
+ self.main.score.tempoChange(self.sval)
+
+ def enter_notify_event(self, widget, event):
+ if _showDebugMsg:
+ print "toolbar.enter"
+ self.main.cursor_area = 1
+ self.main.grab_focus()
+
+ def leave_notify_event(self, widget, event):
+ if _showDebugMsg:
+ print "toolbar.leave"
+ if self.main.cursor_area == 1:
+ self.main.cursor_area = 0
+
+ def button_press_event(self, widget, event):
+ if _showDebugMsg:
+ print "toolbar.mouse_btn_press (%d,%d)" % (event.x, event.y)
+ self.fix_button = self.fix_button + 1
+ if self.fix_button != 1:
+ return
+ if event.button == 1:
+ t = self.toolbar_sel(event.x, event.y)
+ if t == -1:
+ t = self.is_dragging_slider(event.x, event.y)
+ if t != -1:
+ self.is_dragging = 1
+ if self.update_slider_val(event.x):
+ self.request_tempo_change()
+ return
+ elif t < 6:
+ flag = 0
+ if self.toolsel == t - 1:
+ if self.toolsel == -1:
+ self.pstate = (self.pstate + 1)%3
+ flag = 1
+ elif self.toolsel == 0:
+ self.fstate = (self.fstate + 1)%3
+ flag = 1
+ else:
+ self.toolsel = t - 1
+ flag = 1
+ if self.toolsel != 1 and self.main.score.select_state == 1:
+ self.main.score.de_selection()
+ self.main.canvas.draw_deselection()
+ if flag == 1:
+ cr = self.pixmap.cairo_create()
+ self.update_toolsel(widget, cr)
+ self.gupdate(widget)
+ elif t < 14:
+ self.select_instrument(t-6)
+ else:
+ if t == 14:
+ self.from_start = (self.from_start + 1) % 2
+ elif t == 15:
+ self.loop = (self.loop + 1) % 2
+ elif t == 16:
+ self.record = (self.record + 1) % 2
+ if self.record == 1 and self.from_start == 0:
+ self.from_start = 1
+ elif t == 17:
+ self.main.score.stop_music(self.main.csound)
+ elif t == 18:
+ self.main.score.play_music(self.main.csound)
+ self.update()
+
+ def select_instrument(self, sel):
+
+ self.main.score.keyboard_change_instrument(self.main.csound, self.colorsel)
+ self.colorsel = sel
+ self.toolsel = 2
+ self.update()
+
+ if not self.main.canvas.is_rec():
+ self.main.score.note_on(self.main.csound, self.colorsel+1, 60, 1)
+ self.main.canvas.update_top()
+
+ def update(self):
+ cr = self.pixmap.cairo_create()
+ widget = self.widget
+ self.update_toolsel(widget, cr)
+ widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, 0, 0, 0, 0, self.width, self.height)
+
+ def button_release_event(self, widget, event):
+ if _showDebugMsg:
+ print "toolbar.mouse_btn_release (%d,%d)" % (event.x, event.y)
+ self.fix_button = 0
+ if self.is_dragging == 1:
+ self.is_dragging = 0
+ if self.update_slider_val(event.x):
+ self.request_tempo_change()
+ self.deactiviate_slider_btn()
+ return
+
+ def configure_event(self, widget, event):
+ x, y, width, height = widget.get_allocation()
+ self.pixmap = gtk.gdk.Pixmap(widget.window, width, height)
+ return True
+
+ def motion_notify_event(self, widget, event):
+# print "toolbar.mouse_move (%d,%d)" % (event.x, event.y)
+ if self.is_dragging == 1:
+ if self.update_slider_val(event.x):
+ self.request_tempo_change()
+ return
+
+ def expose_event(self, widget, event):
+ cr = self.pixmap.cairo_create()
+ self.widget = widget
+
+ # set a clip region for the expose event
+ x , y, width, height = event.area
+ cr.rectangle(x, y, width, height)
+ cr.clip()
+ self.draw(widget, cr)
+
+ widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, x, y, x, y, width, height)
+
+ return False
+
+ def gupdate(self, widget):
+ widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, 0, 0, 0, 0, self.width, self.height)
+
+ def draw_toolbar_frame(self, widget, x, y):
+
+ self.pixmap.draw_rectangle(widget.get_style().white_gc,False,x,y,self.toolbarw,self.toolbarw)
+ gc = self.pixmap.new_gc()
+ gc.set_rgb_fg_color(self.dark_grey)
+ self.pixmap.draw_line(gc, x+1, y+1, x+self.toolbarw-1, y+1)
+ self.pixmap.draw_line(gc, x+1, y+1, x+1, y+self.toolbarw-1)
+ gc.set_rgb_fg_color(self.light_grey)
+ self.pixmap.draw_line(gc, x+self.toolbarw-1, y+2, x+self.toolbarw-1, y+self.toolbarw-1)
+ self.pixmap.draw_line(gc, x+2, y+self.toolbarw-1, x+self.toolbarw-1, y+self.toolbarw-1)
+ self.pixmap.draw_line(widget.get_style().black_gc, x+2, y+2, x+self.toolbarw-2, y+2)
+ self.pixmap.draw_line(widget.get_style().black_gc, x+2, y+2, x+2, y+self.toolbarw-2)
+
+ def load_icons(self, cr):
+ if self.icon_set == 48:
+ self.iconff = cairo.ImageSurface.create_from_png("icon/forte48.png");
+ self.iconpp = cairo.ImageSurface.create_from_png("icon/piano48.png");
+ self.iconf = cairo.ImageSurface.create_from_png("icon/frame48.png");
+ self.icone = cairo.ImageSurface.create_from_png("icon/eraser48.png");
+ self.iconp = cairo.ImageSurface.create_from_png("icon/pencil48.png");
+ self.iconh = cairo.ImageSurface.create_from_png("icon/hand48.png");
+ self.icons = cairo.ImageSurface.create_from_png("icon/scissor48.png");
+ self.iconcresc = cairo.ImageSurface.create_from_png("icon/cresc48.png");
+ self.icondim = cairo.ImageSurface.create_from_png("icon/dim48.png");
+ self.iconfff = cairo.ImageSurface.create_from_png("icon/fortef48.png");
+ self.iconppf = cairo.ImageSurface.create_from_png("icon/pianof48.png");
+ self.iconfst = cairo.ImageSurface.create_from_png("icon/fstart48.png");
+ self.iconpl = cairo.ImageSurface.create_from_png("icon/play48.png");
+ self.iconpla = cairo.ImageSurface.create_from_png("icon/play48g.png");
+ self.iconst = cairo.ImageSurface.create_from_png("icon/stop48.png");
+ self.iconlp = cairo.ImageSurface.create_from_png("icon/loop48.png");
+ self.iconre = cairo.ImageSurface.create_from_png("icon/metro48.png");
+# self.iconre = cairo.ImageSurface.create_from_png("icon/record48.png");
+ elif self.icon_set == 40:
+ self.iconff = cairo.ImageSurface.create_from_png("icon/forte40.png");
+ self.iconpp = cairo.ImageSurface.create_from_png("icon/piano40.png");
+ self.iconf = cairo.ImageSurface.create_from_png("icon/frame40.png");
+ self.icone = cairo.ImageSurface.create_from_png("icon/eraser40.png");
+ self.iconp = cairo.ImageSurface.create_from_png("icon/pencil40.png");
+ self.iconh = cairo.ImageSurface.create_from_png("icon/hand40.png");
+ self.icons = cairo.ImageSurface.create_from_png("icon/scissor40.png");
+ self.iconcresc = cairo.ImageSurface.create_from_png("icon/cresc40.png");
+ self.icondim = cairo.ImageSurface.create_from_png("icon/dim40.png");
+ self.iconfff = cairo.ImageSurface.create_from_png("icon/fortef40.png");
+ self.iconppf = cairo.ImageSurface.create_from_png("icon/pianof40.png");
+ self.iconfst = cairo.ImageSurface.create_from_png("icon/fstart40.png");
+ self.iconpl = cairo.ImageSurface.create_from_png("icon/play40.png");
+ self.iconpla = cairo.ImageSurface.create_from_png("icon/play40g.png");
+ self.iconst = cairo.ImageSurface.create_from_png("icon/stop40.png");
+ self.iconlp = cairo.ImageSurface.create_from_png("icon/loop40.png");
+ self.iconre = cairo.ImageSurface.create_from_png("icon/metro40.png");
+# self.iconre = cairo.ImageSurface.create_from_png("icon/record40.png");
+ else: # icon_set = 32
+ self.iconff = cairo.ImageSurface.create_from_png("icon/forte.png");
+ self.iconpp = cairo.ImageSurface.create_from_png("icon/piano.png");
+ self.iconf = cairo.ImageSurface.create_from_png("icon/frame.png");
+ self.icone = cairo.ImageSurface.create_from_png("icon/eraser.png");
+ self.iconp = cairo.ImageSurface.create_from_png("icon/pencil.png");
+ self.iconh = cairo.ImageSurface.create_from_png("icon/hand.png");
+ self.icons = cairo.ImageSurface.create_from_png("icon/scissor.png");
+ self.iconcresc = cairo.ImageSurface.create_from_png("icon/cresc.png");
+ self.icondim = cairo.ImageSurface.create_from_png("icon/dim.png");
+ self.iconfff = cairo.ImageSurface.create_from_png("icon/fortef.png");
+ self.iconppf = cairo.ImageSurface.create_from_png("icon/pianof.png");
+ self.iconfst = cairo.ImageSurface.create_from_png("icon/fstart32.png");
+ self.iconpl = cairo.ImageSurface.create_from_png("icon/play32.png");
+ self.iconpla = cairo.ImageSurface.create_from_png("icon/play32g.png");
+ self.iconst = cairo.ImageSurface.create_from_png("icon/stop32.png");
+ self.iconlp = cairo.ImageSurface.create_from_png("icon/loop32.png");
+ self.iconre = cairo.ImageSurface.create_from_png("icon/metro32.png");
+# self.iconre = cairo.ImageSurface.create_from_png("icon/record32.png");
+
+
+ self.iconlist = [self.iconf, self.iconp, self.icone, self.icons]
+ self.piconlist = [self.iconpp, self.iconppf, self.icondim]
+ self.ficonlist = [self.iconff, self.iconfff, self.iconcresc]
+ self.pb_iconlist = [self.iconfst, self.iconlp, self.iconre, self.iconst, self.iconpl]
+
+ self.load_icon = 1
+
+ def draw_toolbar_icon(self, widget, cr, x, y, img):
+ self.draw_toolbar_frame(widget, x, y)
+ cr.set_source_surface(img, x+3, y+3)
+ cr.paint()
+
+ def draw_toolbar_colorgrid(self, widget, cr, x, y, color, icon = 0):
+ if icon == 1:
+ if self.toolsel >= 1:
+ self.draw_toolbar_icon(widget, cr, x, y, self.iconlist[self.toolsel-1])
+ elif self.toolsel == 0:
+ self.draw_toolbar_icon(widget, cr, x, y, self.ficonlist[self.fstate])
+ else:
+ self.draw_toolbar_icon(widget, cr, x, y, self.piconlist[self.pstate])
+ else:
+ self.draw_toolbar_frame(widget, x, y)
+
+ c1, c2, c3 = self.get_color_attr(color)
+ if icon == 1:
+ cr.set_source_rgba(c1, c2, c3, 0.6)
+ else:
+ cr.set_source_rgb(c1, c2, c3)
+ cr.rectangle(x+3, y+3, self.toolbarw-4, self.toolbarw-4)
+ cr.fill()
+
+ def draw_slider_btn(self, cr, x, y, len, v):
+ xc = v * (len-10) + x + 5
+ if self.is_dragging:
+ cr.set_source_rgb(0.95, 0.33, 0.33)
+ else:
+ cr.set_source_rgb(0.9, 0.9, 0.9)
+ cr.rectangle(xc - 5, y - 8, 10, 20)
+ cr.fill_preserve()
+
+ cr.set_source_rgb(0.2, 0.7, 0.1)
+ cr.set_line_width(1.2)
+ cr.stroke()
+
+ def draw_slider(self, cr, x, y, len, v):
+ cr.set_source_rgb(0.84, 0.84, 1)
+ cr.rectangle(x-2, y-24, len + 4, 38)
+ cr.fill()
+
+ cr.set_source_rgb(0.7, 0.7, 0.7)
+ cr.rectangle(x, y, len, 5)
+ cr.fill_preserve()
+
+ cr.set_source_rgb(0, 0, 0)
+ cr.set_line_width(0.5)
+ cr.stroke()
+
+ self.draw_slider_btn(cr, x, y, len, v)
+ self.draw_slider_text(cr, x, y, len)
+
+ def draw_slider_text(self, cr, x, y, len):
+ if self.platform == "sugar-xo":
+ cr.set_font_size(16)
+ cr.set_source_rgb(0.4, 0.4, 0.4)
+ cr.move_to(x, y - 14)
+ cr.show_text("Slow")
+ cr.move_to(x + len - 30, y - 14)
+ cr.show_text("Fast")
+ else:
+ cr.set_font_size(12)
+ cr.set_source_rgb(0.4, 0.4, 0.4)
+ cr.move_to(x, y - 12)
+ cr.show_text("Slow")
+ cr.move_to(x + len - 25, y - 12)
+ cr.show_text("Fast")
+
+ def is_dragging_slider(self, x, y):
+ x0 = self.sval * (self.sw-10) + self.sx
+ y0 = self.sy - 8
+ x1 = x0 + 10
+ y1 = y0 + 20
+
+ if y0 > y or y >= y1 or self.sx > x or x >= self.sx + self.sw:
+ return -1
+ if y0 <= y and y < y1 and x0 <= x and x < x1:
+ return 1
+ return 0
+
+ def deactiviate_slider_btn(self):
+ cr = self.pixmap.cairo_create()
+ self.draw_slider(cr, self.sx, self.sy, self.sw, self.sval)
+ self.gupdate(self.widget)
+
+ def change_slider_val(self, d):
+ ov = self.sval
+ self.sval = self.sval + d
+ if self.sval < 0:
+ self.sval = 0
+ elif self.sval > 1:
+ self.sval = 1
+ if ov == self.sval:
+ return False
+
+ if _showDebugMsg:
+ print "slider value = %.2f" % self.sval
+ cr = self.pixmap.cairo_create()
+ self.draw_slider(cr, self.sx, self.sy, self.sw, self.sval)
+ self.gupdate(self.widget)
+ return True
+
+ def update_slider_val(self, x):
+ x0 = self.sx + 5
+ x1 = self.sx + self.sw - 5
+ ov = self.sval
+ if x > x1:
+ self.sval = 1
+ elif x < x0:
+ self.sval = 0
+ else:
+ self.sval = 1.0*(x - x0)/(x1 - x0)
+ if ov == self.sval:
+ return False
+
+ if _showDebugMsg:
+ print "slider value = %.2f" % self.sval
+ cr = self.pixmap.cairo_create()
+ self.draw_slider(cr, self.sx, self.sy, self.sw, self.sval)
+ self.gupdate(self.widget)
+ return True
+
+ def toolbar_sel(self, x, y):
+ if y < self.cy or y >= self.cy + self.toolbarw:
+ return -1
+ if x >= self.cx and x < self.cx + self.toolbarw*6:
+ return (int)((x-self.cx)/self.toolbarw)
+ if x < self.cx + self.toolbarw*6 + self.div1:
+ return -1
+ t = (int)((x-self.cx-self.toolbarw*6-self.div1)/self.toolbarw)
+ if t >= 8:
+ if x < self.cx + self.toolbarw*14 + self.div1 + self.div2 + self.sw + self.div3:
+ return -1
+ t = (int)((x-self.cx-self.toolbarw*14-self.div1-self.div2-self.div3-self.sw)/self.toolbarw)
+ if t >= 3:
+ t = (int)((x-self.cx-self.toolbarw*17-self.div1-self.div2-self.div3-self.sw-self.div4)/self.toolbarw)
+ if t >= 2:
+ return -1
+ return t + 17
+ return t+14
+ return t+6
+
+ def update_toolsel(self, widget, cr):
+ for i in range(8):
+ self.draw_toolbar_colorgrid(widget, cr, self.cx + self.toolbarw*(i+6) + self.div1, self.cy, i, (i == self.colorsel and self.toolsel == 2))
+
+ for i in range(6):
+ if i == 0:
+ self.draw_toolbar_icon(widget, cr, self.cx + self.toolbarw*i, self.cy, self.piconlist[self.pstate])
+ elif i == 1:
+ self.draw_toolbar_icon(widget, cr, self.cx + self.toolbarw*i, self.cy, self.ficonlist[self.fstate])
+ else:
+ self.draw_toolbar_icon(widget, cr, self.cx + self.toolbarw*i, self.cy, self.iconlist[i-2])
+
+ c1, c2, c3 = self.get_color_attr(0)
+ for i in range(5):
+ x = self.cx + self.toolbarw*14 + self.div1 + self.div2 + self.sw + self.div3 + i*self.toolbarw
+ if i >= 3:
+ x += self.div4
+ if i == 4 and self.main.score.play_state != -2:
+ self.draw_toolbar_icon(widget, cr, x, self.cy, self.iconpla)
+ else:
+ self.draw_toolbar_icon(widget, cr, x, self.cy, self.pb_iconlist[i])
+ if i == 0 and self.from_start == 1 or i == 1 and self.loop == 1 or i == 2 and self.record == 1:
+ cr.set_source_rgba(c1, c2, c3, 0.4)
+ cr.rectangle(x+3, self.cy+3, self.toolbarw-6, self.toolbarw-6)
+ cr.fill()
+
+ c1, c2, c3 = self.get_color_attr(self.colorsel)
+ cr.set_source_rgba(c1, c2, c3, 0.4)
+ cr.rectangle(self.cx + self.toolbarw*(self.toolsel+1) +3, self.cy +3, self.toolbarw-6, self.toolbarw-6)
+ cr.fill()
+
+ def draw(self, widget, cr):
+ cr.set_source_rgb(0.84,0.84,1)
+ cr.rectangle(0, 0, self.width, self.height)
+ cr.fill()
+
+ if self.load_icon == 0:
+ self.load_icons(cr)
+ self.update_toolsel(widget, cr)
+
+ self.draw_slider(cr, self.sx, self.sy, self.sw, self.sval)