diff options
Diffstat (limited to 'ToolbarArea.py')
-rw-r--r-- | ToolbarArea.py | 549 |
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) |