def on_new(self, *args): if self.check_save(): return self.set_songbook(None) if self.instrument_chooser_pane: self.scrolled.remove(self.instrument_chooser_pane) self.instrument_chooser_pane = None if getattr(self, "canvas", None): self.canvas.destroy() self.canvas = Canvas(self, model.Song(), self.scrolled) self.instrument_chooser_pane = InstrumentChooserPane(self) self.scrolled.add(self.instrument_chooser_pane) self.instrument_chooser_pane.show_all() self.set_title(u"Songwrite2")
class App(BaseApp, gtk.Window): def menu_image(self, filename): image = editobj2.editor_gtk.load_big_icon(os.path.join(globdef.DATADIR, filename)) return image def append_to_menu(self, menu, has_submenu, label, command = None, arg = None, accel = "", accel_enabled = 1, image = None, type = u"button"): if isinstance(menu, gtk.MenuItem): m = menu.get_submenu() if not m: m = gtk.Menu() menu.set_submenu(m) menu = m stock = MENU_LABEL_2_IMAGE.get(label) if stock: menu_item = gtk.ImageMenuItem(stock) elif image: gtk.stock_add([(label, _(label).replace("_", "__"), gtk.gdk.SHIFT_MASK, 46, "")]) icon_factory.add(label, gtk.IconSet(image)) menu_item = gtk.ImageMenuItem(label) elif type == "check": menu_item = gtk.CheckMenuItem(_(label).replace("_", "__")) elif type == "radio": menu_item = gtk.RadioMenuItem(self.current_radio_group, _(label).replace("_", "__")) self.current_radio_group = menu_item else: menu_item = gtk.MenuItem(_(label).replace("_", "__")) if command: if arg: menu_item.connect("activate", command, arg) else: menu_item.connect("activate", command) menu.append(menu_item) if accel: mod = 0 if isinstance(accel, basestring): if u"C-" in accel: mod |= gtk.gdk.CONTROL_MASK if u"S-" in accel: mod |= gtk.gdk.SHIFT_MASK key = ord(accel[-1]) else: key = accel menu_item.add_accelerator("activate", self.accel_group, key, mod, gtk.ACCEL_VISIBLE) if not accel_enabled: menu_item.connect("can-activate-accel", self.can_activate_accel) return menu_item def can_activate_accel(self, widget, signal): widget.stop_emission("can-activate-accel") return False def append_separator_to_menu(self, menu): menu.get_submenu().append(gtk.SeparatorMenuItem()) self.current_radio_group = None def create_menubar(self): return gtk.MenuBar() def __init__(self, song = None): gtk.Window.__init__(self) self.instrument_chooser_pane = None self.current_radio_group = None self.set_icon(editobj2.editor_gtk.load_big_icon(os.path.join(globdef.DATADIR, "songwrite2_64x64.png"))) self.accel_group = gtk.AccelGroup() self.add_accel_group(self.accel_group) self.set_role("main") self.vbox = gtk.VBox() self.add(self.vbox) BaseApp.__init__(self, None) toolbar = self.toolbar = gtk.Toolbar() toolbar.set_style(gtk.TOOLBAR_ICONS) toolbar.set_show_arrow(0) def add_toolbar_button(label, command, image = None, ButtonClass = gtk.ToolButton): if image: gtk.stock_add([(label, _(label).replace("_", "__"), gtk.gdk.SHIFT_MASK, 46, "")]) icon_factory.add(label, gtk.IconSet(self.menu_image(image))) if ButtonClass is gtk.RadioToolButton: b = ButtonClass(add_toolbar_button.radio_group, label) add_toolbar_button.radio_group = b else: b = ButtonClass(label) tooltip = _(label) tooltip = tooltip[0].upper() + tooltip[1:] b.set_tooltip_text(tooltip) b.connect("clicked", command) toolbar.insert(b, -1) return b def add_toolbar_separator(): toolbar.insert(gtk.SeparatorToolItem(), -1) add_toolbar_button.radio_group = None add_toolbar_button(gtk.STOCK_SAVE , self.on_save) add_toolbar_button(gtk.STOCK_PRINT , self.on_preview_print) add_toolbar_button(gtk.STOCK_MEDIA_PLAY, self.on_play_from_here) add_toolbar_button(gtk.STOCK_MEDIA_STOP, self.on_stop_playing) add_toolbar_separator() for duration in [384, 192, 96, 48, 24, 12]: setattr(self, "toolbar_duration_%s" % duration, add_toolbar_button(model.DURATIONS[duration], getattr(self, "set_duration_%s" % duration), "note_%s.png" % duration, ButtonClass = gtk.RadioToolButton)) self.toolbar_dotted = add_toolbar_button(u"Dotted" , self.toggle_dotted , "note_144.png" , ButtonClass = gtk.ToggleToolButton) self.toolbar_triplet = add_toolbar_button(u"Triplet" , self.toggle_triplet, "note_64.png" , ButtonClass = gtk.ToggleToolButton) add_toolbar_separator() self.toolbar_accent = add_toolbar_button(u"Accentuated", self.toggle_accent , "effet_accent.png", ButtonClass = gtk.ToggleToolButton) self.toolbar_buttons = {} for type, fxs in model.ALL_FXS: for fx in fxs: if not fx: continue if fx == u"bend": func = self.set_fx_bend05 else: func = getattr(self, "set_fx_%s" % fx) self.toolbar_buttons[fx] = add_toolbar_button(fx, func, "effet_%s.png" % fx, ButtonClass = gtk.ToggleToolButton) zoom_menubar = gtk.MenuBar() def change_zoom(menu_item, incr): gobject.timeout_add(100, zoom_menubar.cancel) self.canvas.change_zoom(incr) def set_zoom(menu_item, zoom): self.canvas.set_zoom(zoom) zoom_out_menu = self.append_to_menu(zoom_menubar, 0, u" ‒ ") zoom_menu = self.zoom_menu = self.append_to_menu(zoom_menubar, 1, u"100%") for zoom in songwrite2.canvas.zoom_levels: self.append_to_menu(zoom_menu, 0, u"%s%%" % int(zoom * 100.0), set_zoom, arg = zoom) zoom_in_menu = self.append_to_menu(zoom_menubar, 0, u" + ") zoom_out_menu.connect("select", change_zoom, -1) zoom_in_menu .connect("select", change_zoom, 1) menu_box = gtk.HBox() self.vbox.pack_start(menu_box, 0, 1) menu_box.pack_start(self.menubar, 1, 1) menu_box.pack_end (zoom_menubar, 0, 1) self.vbox.pack_start(toolbar, 0, 1) self.connect("delete-event", self.on_close) if song: self.set_song(song) self.show_all() observe(globdef.config, self.config_listener) def set_selected_note(self, note): BaseApp.set_selected_note(self, note) if isinstance(note, introsp.ObjectPack): mesure_ids = set([self.song.mesure_at(n).get_number() + 1 for n in note.objects]) if len(mesure_ids) == 1: mesure_label = self.song.mesure_at(note.objects[0]) else: mesure_label = _(u"Bars #%s to #%s") % (min(mesure_ids), max(mesure_ids)) if len(note.objects) == 2: delta = abs(note.objects[0].value - note.objects[1].value) note_label = _(u"__interval__%s" % delta) if note_label.startswith(u"_"): note_label = u"2 %s" % _("notes") else: note_label = unicode(len(note.objects)) + u" " + _("notes") note = note.objects[-1] else: mesure_label = self.song.mesure_at(note) note_label = unicode(note) self.updating_duration = 1 self.updating_volume_fx = 1 getattr(self, "toolbar_duration_%s" % note.base_duration()).set_active(1) self.toolbar_dotted .set_active(note.is_dotted()) self.toolbar_triplet.set_active(note.is_triplet()) self.toolbar_accent .set_active(note.volume == 255) fxs = set([note.fx, note.link_fx, note.duration_fx, note.strum_dir_fx]) for key, button in self.toolbar_buttons.iteritems(): button.set_active(key in fxs) self.updating_duration = 0 self.updating_volume_fx = 0 self.set_title(u"Songwrite2 -- %s -- %s -- %s" % (self.song.title, mesure_label, note_label)) def config_listener(self, obj, type, new, old): self.canvas.config_listener(obj, type, new, old) #if type is object: # if new["SIDE_BAR_POSITION"] != old["SIDE_BAR_POSITION"]: self.create_content() pass def create_content(self): if self.floating: self.floating.destroy() if self.paned: self.paned .destroy() elif self.scrolled: self.scrolled.destroy() # if (globdef.config.SIDE_BAR_POSITION == "left") or (globdef.config.SIDE_BAR_POSITION == "right") or (globdef.config.SIDE_BAR_POSITION == "floating_vertical"): # self.notebook = EditNotebook(self.undo_stack, gtk.POS_TOP) # self.notebook.set_current_page(self.notebook.get_n_pages() - 1) # elif (globdef.config.SIDE_BAR_POSITION == "top") or (globdef.config.SIDE_BAR_POSITION == "bottom") or (globdef.config.SIDE_BAR_POSITION == "floating_horizontal"): # self.notebook = EditNotebook(self.undo_stack, gtk.POS_LEFT) # self.notebook.set_size_request(-1, 310) # else: # self.notebook = None # if (globdef.config.SIDE_BAR_POSITION == "left") or (globdef.config.SIDE_BAR_POSITION == "right"): # self.paned = gtk.HPaned() # self.floating = None # elif (globdef.config.SIDE_BAR_POSITION == "top") or (globdef.config.SIDE_BAR_POSITION == "bottom"): # self.paned = gtk.VPaned() # self.floating = None # elif (globdef.config.SIDE_BAR_POSITION == "floating_horizontal") or (globdef.config.SIDE_BAR_POSITION == "floating_vertical"): # self.paned = None # self.floating = gtk.Window() # self.floating.set_role("toolbox") # self.floating.set_transient_for(self) # self.floating.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_UTILITY) # self.floating.set_destroy_with_parent(1) # else: # self.paned = None # self.floating = None self.paned = None self.floating = None self.notebook = None if self.notebook: if self.songbook: self.songbook_pane = SongbookPane(self, self.undo_stack) self.notebook.add_tab(self.songbook, self.songbook_pane) self.songbook_pane.set_songbook(self.songbook) self.notebook.add_tab(self.song) self.partitions_pane = PartitionsPane(self, self.undo_stack) self.notebook.add_tab(self.song.partitions[0], self.partitions_pane, 0) self.playlist_pane = PlaylistPane(self, self.undo_stack) self.playlist_pane.set_playlist(self.song.playlist) self.notebook.add_tab(self.song.mesures[0], self.playlist_pane) self.notebook.add_tab(None) self.notebook.show_all() self.notebook.set_current_page(-1) self.scrolled = gtk.ScrolledWindow() self.scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.scrolled.set_size_request(800, 400) self.canvas = Canvas(self, model.Song(), self.scrolled) self.instrument_chooser_pane = InstrumentChooserPane(self) self.scrolled.add(self.instrument_chooser_pane) self.set_title(u"Songwrite2") # if globdef.config.SIDE_BAR_POSITION == "left": # self.paned.pack1(self.notebook, 0, 1) # self.paned.pack2(self.scrolled, 1, 1) # elif globdef.config.SIDE_BAR_POSITION == "right": # self.paned.pack2(self.notebook, 0, 1) # self.paned.pack1(self.scrolled, 1, 1) # elif globdef.config.SIDE_BAR_POSITION == "top": # self.paned.pack1(self.notebook, 0, 1) # self.paned.pack2(self.scrolled, 1, 1) # elif globdef.config.SIDE_BAR_POSITION == "bottom": # self.paned.pack2(self.notebook, 0, 1) # self.paned.pack1(self.scrolled, 1, 1) # elif (globdef.config.SIDE_BAR_POSITION == "floating_horizontal") or (globdef.config.SIDE_BAR_POSITION == "floating_vertical"): # self.floating.add(self.notebook) # self.floating.show_all() # self.vbox.pack_end(self.scrolled, 1, 1) # else: # self.vbox.pack_end(self.scrolled, 1, 1) self.vbox.pack_end(self.scrolled, 1, 1) #if self.paned: # self.paned.set_border_width(3) # self.vbox.pack_end(self.paned, 1, 1) self.show_all() def on_new(self, *args): if self.check_save(): return self.set_songbook(None) if self.instrument_chooser_pane: self.scrolled.remove(self.instrument_chooser_pane) self.instrument_chooser_pane = None if getattr(self, "canvas", None): self.canvas.destroy() self.canvas = Canvas(self, model.Song(), self.scrolled) self.instrument_chooser_pane = InstrumentChooserPane(self) self.scrolled.add(self.instrument_chooser_pane) self.instrument_chooser_pane.show_all() self.set_title(u"Songwrite2") def set_song(self, song): BaseApp.set_song(self, song) zoom = 1.0 if self.instrument_chooser_pane: self.scrolled.remove(self.instrument_chooser_pane) self.instrument_chooser_pane = None elif getattr(self, "canvas", None): zoom = self.canvas.zoom self.canvas.destroy() self.canvas = songwrite2.canvas.Canvas(self, self.song, self.scrolled, zoom) self.scrolled.add(self.canvas) self.set_focus(self.canvas.canvas) #self.set_title(u"Songwrite2 -- %s" % song.title) if hasattr(self, "notebook"): self.show_all() def set_menu_enable(self, menu, enable): menu.set_sensitive(enable) def set_menu_label (self, menu, label ): menu.get_child().set_text(label) def prompt_open_filename(self, exts, format = u""): if exts == "sw.xml": filter = sw_xml_filter else: filter = gtk.FileFilter() filter.set_name(format) if isinstance(exts, basestring): exts = [exts] for ext in exts: filter.add_pattern(u"*" + ext) dialog = gtk.FileChooserDialog(_(u"Open..."), self, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) dialog.add_filter(filter) dialog.set_filename(os.path.join(globdef.config.LAST_DIR, u"DOES_NOT_EXIST")) response = dialog.run() filename = dialog.get_filename() dialog.destroy() if response != gtk.RESPONSE_OK: return return filename def prompt_save_filename(self, exts, format = u""): if not self.filename: self.filename = self.song.title.lower().replace(u" ", u"_").replace(u"'", u"").replace(u"/", u"_").replace(u"é", u"e").replace(u"è", u"e").replace(u"ê", u"e").replace(u"ë", u"e").replace(u"à", u"a").replace(u"â", u"a").replace(u"ù", u"u").replace(u"û", u"u").replace(u"î", u"i").replace(u"ï", u"i") if exts == "sw.xml": filter = sw_xml_filter else: filter = gtk.FileFilter() filter.set_name(format) if isinstance(exts, basestring): exts = [exts] for ext in exts: filter.add_pattern(u"*" + ext) dialog = gtk.FileChooserDialog(_(u"Save as..."), self, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) dialog.set_property("do-overwrite-confirmation", 1) dialog.set_default_response(gtk.RESPONSE_OK) if isinstance(exts, basestring): ext0 = exts else: ext0 = exts[0] dialog.add_filter(filter) dialog.set_current_folder(os.path.dirname(self.filename) or globdef.config.LAST_DIR) dialog.set_current_name(os.path.basename(self.filename).replace("sw.xml", ext0)) response = dialog.run() filename = dialog.get_filename() dialog.destroy() if response != gtk.RESPONSE_OK: return return filename def on_open(self, event = None): if self.check_save(): return filename = self.prompt_open_filename("sw.xml") if not filename: return self.open_filename(filename, do_check_save = 0) # check_save has already been done before asking the filename def check_save(self): if not self.song: return 0 if self.undo_stack.undoables != self.last_undoables: # The undoable actions have changed => the song need to be saved. dialog = gtk.MessageDialog(self, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, message_format = _(u"Save the modification before closing?")) dialog.add_buttons( _(u"Close without saving"), 0, gtk.STOCK_CANCEL, 1, gtk.STOCK_SAVE, 2, ) dialog.set_default_response(1) response = dialog.run() dialog.destroy() if response == 0: return 0 if response == 1: return 1 elif response == 2: self.on_save() return self.check_save() # The user may have canceled the save as dialog box ! else: return 0
def create_content(self): if self.floating: self.floating.destroy() if self.paned: self.paned .destroy() elif self.scrolled: self.scrolled.destroy() # if (globdef.config.SIDE_BAR_POSITION == "left") or (globdef.config.SIDE_BAR_POSITION == "right") or (globdef.config.SIDE_BAR_POSITION == "floating_vertical"): # self.notebook = EditNotebook(self.undo_stack, gtk.POS_TOP) # self.notebook.set_current_page(self.notebook.get_n_pages() - 1) # elif (globdef.config.SIDE_BAR_POSITION == "top") or (globdef.config.SIDE_BAR_POSITION == "bottom") or (globdef.config.SIDE_BAR_POSITION == "floating_horizontal"): # self.notebook = EditNotebook(self.undo_stack, gtk.POS_LEFT) # self.notebook.set_size_request(-1, 310) # else: # self.notebook = None # if (globdef.config.SIDE_BAR_POSITION == "left") or (globdef.config.SIDE_BAR_POSITION == "right"): # self.paned = gtk.HPaned() # self.floating = None # elif (globdef.config.SIDE_BAR_POSITION == "top") or (globdef.config.SIDE_BAR_POSITION == "bottom"): # self.paned = gtk.VPaned() # self.floating = None # elif (globdef.config.SIDE_BAR_POSITION == "floating_horizontal") or (globdef.config.SIDE_BAR_POSITION == "floating_vertical"): # self.paned = None # self.floating = gtk.Window() # self.floating.set_role("toolbox") # self.floating.set_transient_for(self) # self.floating.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_UTILITY) # self.floating.set_destroy_with_parent(1) # else: # self.paned = None # self.floating = None self.paned = None self.floating = None self.notebook = None if self.notebook: if self.songbook: self.songbook_pane = SongbookPane(self, self.undo_stack) self.notebook.add_tab(self.songbook, self.songbook_pane) self.songbook_pane.set_songbook(self.songbook) self.notebook.add_tab(self.song) self.partitions_pane = PartitionsPane(self, self.undo_stack) self.notebook.add_tab(self.song.partitions[0], self.partitions_pane, 0) self.playlist_pane = PlaylistPane(self, self.undo_stack) self.playlist_pane.set_playlist(self.song.playlist) self.notebook.add_tab(self.song.mesures[0], self.playlist_pane) self.notebook.add_tab(None) self.notebook.show_all() self.notebook.set_current_page(-1) self.scrolled = gtk.ScrolledWindow() self.scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.scrolled.set_size_request(800, 400) self.canvas = Canvas(self, model.Song(), self.scrolled) self.instrument_chooser_pane = InstrumentChooserPane(self) self.scrolled.add(self.instrument_chooser_pane) self.set_title(u"Songwrite2") # if globdef.config.SIDE_BAR_POSITION == "left": # self.paned.pack1(self.notebook, 0, 1) # self.paned.pack2(self.scrolled, 1, 1) # elif globdef.config.SIDE_BAR_POSITION == "right": # self.paned.pack2(self.notebook, 0, 1) # self.paned.pack1(self.scrolled, 1, 1) # elif globdef.config.SIDE_BAR_POSITION == "top": # self.paned.pack1(self.notebook, 0, 1) # self.paned.pack2(self.scrolled, 1, 1) # elif globdef.config.SIDE_BAR_POSITION == "bottom": # self.paned.pack2(self.notebook, 0, 1) # self.paned.pack1(self.scrolled, 1, 1) # elif (globdef.config.SIDE_BAR_POSITION == "floating_horizontal") or (globdef.config.SIDE_BAR_POSITION == "floating_vertical"): # self.floating.add(self.notebook) # self.floating.show_all() # self.vbox.pack_end(self.scrolled, 1, 1) # else: # self.vbox.pack_end(self.scrolled, 1, 1) self.vbox.pack_end(self.scrolled, 1, 1) #if self.paned: # self.paned.set_border_width(3) # self.vbox.pack_end(self.paned, 1, 1) self.show_all()