#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (C) 2012 S. Daniel Francis # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. # This code is from an abandoned musical editor from gi.repository import Gtk from gi.repository import Gdk from track import Track class StaffArea(Gtk.DrawingArea): height = 0 width = 0 tracks = [] selected = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] def __init__(self): Gtk.DrawingArea.__init__(self) self.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse('#FFF')) self.connect('draw', self._draw_cb) self.connect('size-allocate', self.__allocate_cb) self.track = Track() self.tracks.append(self.track) def __allocate_cb(self, widget, rect): self.width = rect.width self.height = rect.height def _draw_cb(self, widget, ctx): window = widget.get_window() context = widget.create_pango_context() width = self.width height = self.height for track in self.tracks: track.linespacing = height * 0.03 track.draw(window, width, context) for i in self.selected: self._draw_note(ctx, i) def get_note_position(self, note): ymax = self.track.piano.ymax linespacing = self.track.linespacing noteincrement = linespacing / 2.0 rmargin = self.track.piano.staffx + linespacing * 2 lmargin = self.track.piano.staffx * 0.1 return (rmargin + ((self.width - (rmargin + lmargin)) / 16) * note, ymax - noteincrement * (note + 6), noteincrement) def select_note(self, note): self.selected.append(note) def _draw_note(self, ctx, note): x, y, radius = self.get_note_position(note) ctx.arc(x, y, radius, 0, 180) ctx.fill() ctx.stroke() if note == 8: ctx.set_line_width(3) ctx.move_to(x - radius * 1.5, y) ctx.line_to(x + radius * 1.5, y) ctx.stroke()