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)