def ask_new_partition(song): next_strophe_number = len([lyrics for lyrics in song.partitions if isinstance(lyrics, model.Lyrics) and _(u"Strophe #%s").replace(u"%s", u"") in lyrics.header]) + 1 categories = [] for category in model.VIEW_CATEGORIES: view_types = model.VIEWS[category] categories.append( PartitionCategory(_(category), u"", [model.Partition(None, view_type.default_instrument, view_type) for view_type in view_types]) ) categories.append(PartitionCategory(_(u"Lyrics"), u"", [ model.Lyrics(None, header = _(u"Chorus")), model.Lyrics(None, header = _(u"Strophe #%s") % next_strophe_number), ])) categories = PartitionCategory(_(u"__add_partition__"), _(u"__add_partition_details__"), categories) r = [None] def on_validate(choice): if choice: if isinstance(choice, introsp.ObjectPack): r[0] = choice.objects[0] else: r[0] = choice if not isinstance(r[0], model.TemporalData): r[0] = None else: r[0].song = song editobj2.edit(categories, on_validate = on_validate, height = 680, expand_tree_at_level = 2) return r[0]
def edit(self): import songwrite2.__editobj2__, editobj2 def on_validate(obj): self.MIDI_USE_TEMP_FILE = self.MIDI_COMMAND.find("%s") != -1 self.save() editobj2.edit(self, on_validate)
def ask_dirname(on_validate, path = "/"): filename = os.path.basename(path) path = os.path.dirname(path) file = File(path, 1, 1) for f in file.get_children(): if f.filename == filename: break def _on_validate(o): if isinstance(o, File): on_validate(o.result()) editobj2.edit(file, _on_validate, "v", selected = f)
def on_click(self, *args): p = self while p: p = p.get_parent() if isinstance(p, gtk.Window) and p.get_modal(): editobj2.edit(self.get_value(), undo_stack = self.undo_stack, on_validate = lambda obj: None) return editobj2.edit(self.get_value(), undo_stack = self.undo_stack)
def on_insert_times(self, *args): class InsertTimesOptions(object): def __init__(self): self.nb_time = 1 self.details = _(u"""Use negative values for deleting beats.""") self.icon_filename = os.path.join(globdef.DATADIR, "song.png") def __unicode__(self): return _(u"Insert/remove beats...") o = InsertTimesOptions() def on_validate(o): if (not o) or (not o.nb_time): return at = self.canvas.get_selected_time() delta = o.nb_time * 96 removed = [] def shift(delta): old_removed = removed[:] del removed[:] for partition in self.song.partitions: if isinstance(partition, model.Partition): i = 0 while i < len(partition.notes): note = partition.notes[i] if note.time >= at: if (delta < 0) and note.time < at - delta: #del partition.notes[i] partition.remove(partition.notes[i]) removed.append((partition, note)) continue else: note.time += delta i += 1 for partition, note in old_removed: partition.add_note(note) self.song.rythm_changed() self.canvas.render_all() self.canvas.update_time() def do_it (): shift( delta) def undo_it(): shift(-delta) if o.nb_time > 0: name = _(u"insert %s beat(s)") % o.nb_time else: name = _(u"delete %s beat(s)") % -o.nb_time undoredo.UndoableOperation(do_it, undo_it, name, self.undo_stack) editobj2.edit(o, on_validate = on_validate)
def on_note_arrange(self, *args): class ArrangeAtFretOptions(object): def __init__(self): self.fret = 0 self.details = _(u"Arrange selected notes at fret?") self.icon_filename = os.path.join(globdef.DATADIR, "song.png") def __unicode__(self): return _(u"Arrange notes at fret...") o = ArrangeAtFretOptions() def on_validate(o): if o: self.canvas.arrange_selection_at_fret(o.fret) editobj2.edit(o, on_validate = on_validate)
def open_filename(self, filename, do_check_save = 1): globdef.config.LAST_DIR = os.path.dirname(filename) if do_check_save and self.check_save(): return if not os.path.exists(filename): editobj2.edit(_(u"File does not exist!"), on_validate = lambda o: None) else: self.filename = filename song = model.get_song(filename) if isinstance(song, model.Song): self.set_songbook(None) self.set_song (song) else: self.set_songbook(song) self.on_songbook_prop() globdef.config.add_previous_file(filename)
def _treat_export_error(self): error_class, error, trace = sys.exc_info() sys.excepthook(error_class, error, trace) print if isinstance(error, model.SongwriteError): editobj2.edit(error) if isinstance(error, model.TimeError): self.canvas.deselect_all() if error.note: self.canvas.partition_2_drawer[error.note.partition].select_note(error.note) elif error.partition and error.time: self.canvas.partition_2_drawer[error.partition].select_at(error.time, 0, 0) elif error.time: self.canvas.partition_2_drawer[self.song.partitions[0]].select_at(error.time, 0, 0) else: editobj2.edit(_(error.__class__.__name__) + "\n\n" + unicode(error))
def send_edition(self): editobj2.GUI = "Html" form = editobj2.edit(self.edition.root) form.edit_child(self.edition.current, self.edition) self.send_html(u""" <form name="editobj2" method="POST" action="%s"> %s <input name="EDITOBJ2_obj" type="hidden" value="%s"/> <br/> <input type="submit" value="%s"/> </form> """ % ( os.path.basename(sys.argv[0]), form.get_html(), self.edition.dumps(), self.ok_label, ))
def on_click(self, *args): editobj2.edit(self.get_value(), undo_stack = self.undo_stack)
descr = introsp.description(Sum) descr.set_label("Sum") descr = introsp.description(Substract) descr.set_label("Substract") descr = introsp.description(Multiply) descr.set_label("Multiply") descr = introsp.description(Divide) descr.set_label("Divide") # Hint: descr = introsp.description(Calculator) descr.set_children_getter(lambda calculator: tuple(calculator.operations)) descr.set_label("Calculator") descr.set_details("A calculator in EditObj2!") calculator = Calculator() if "--gtk" in sys.argv: editobj2.GUI = "Gtk" elif "--tk" in sys.argv: editobj2.GUI = "Tk" elif "--qt" in sys.argv: editobj2.GUI = "Qt" elif "--qtopia" in sys.argv: editobj2.GUI = "Qtopia" editobj2.edit(calculator).main()
def on_insert_bars(self, *args): class InsertBarsOptions(object): def __init__(self): self.nb_bar = 1 self.details = _(u"""Use negative values for deleting bars.""") self.icon_filename = os.path.join(globdef.DATADIR, "song.png") def __unicode__(self): return _(u"Insert/remove bars...") o = InsertBarsOptions() def on_validate(o): if (not o) or (not o.nb_bar): return mesures = self.canvas.get_selected_mesures() if mesures: mesure = mesures[0] else: mesure = self.song.mesures[0] mesure_pos = self.song.mesures.index(mesure) at = mesure.time removed = [] playlist_items_values = [] def shift(nb_bar): # Add / remove mesures time = self.song.mesures[mesure_pos].time if nb_bar > 0: for i in range(mesure_pos, mesure_pos + nb_bar): self.song.mesures.insert(i, model.Mesure(self.song, time, mesure.tempo, mesure.rythm1, mesure.rythm2, mesure.syncope)) time += mesure.duration else: del self.song.mesures[mesure_pos : mesure_pos - nb_bar] i = mesure_pos # Shift playlist if playlist_items_values: for item, from_mesure, to_mesure in playlist_items_values: item.from_mesure = from_mesure item.to_mesure = to_mesure del playlist_items_values[:] else: for item in self.song.playlist.playlist_items: playlist_items_values.append((item, item.from_mesure, item.to_mesure)) if item.from_mesure >= mesure_pos: if item.from_mesure < mesure_pos - nb_bar: item.from_mesure = mesure_pos else: item.from_mesure += nb_bar if item.to_mesure >= mesure_pos - 1: if item.to_mesure < mesure_pos-1-nb_bar: item.to_mesure = mesure_pos - 1 else: item.to_mesure += nb_bar # Shift notes old_removed = removed[:] del removed[:] delta = nb_bar * mesure.duration for partition in self.song.partitions: if isinstance(partition, model.Partition): i = 0 while i < len(partition.notes): note = partition.notes[i] if note.time >= at: if (delta < 0) and note.time < at - delta: partition.remove(partition.notes[i]) removed.append((partition, note)) continue else: note.time += delta i += 1 for partition, note in old_removed: partition.add_note(note) self.song.rythm_changed() # AFTER moving the notes !!! self.canvas.render_all() self.canvas.update_time() def do_it (): shift( o.nb_bar) def undo_it(): shift(-o.nb_bar) if o.nb_bar > 0: name = _(u"insert %s bar(s)") % o.nb_bar else: name = _(u"delete %s bar(s)") % -o.nb_bar undoredo.UndoableOperation(do_it, undo_it, name, self.undo_stack) editobj2.edit(o, on_validate = on_validate)
descr.set_children_getter( "downloads", # Children None, # Has children method lambda download_manager: Download("http://", ""), # New children method "insert", # Add method "remove", # Remove method 1, # Reorderable ) descr.add_action(introsp.Action("Undo", lambda undo_stack, o: undo_stack.undo())) descr.add_action(introsp.Action("Redo", lambda undo_stack, o: undo_stack.redo())) if "--gtk" in sys.argv: editobj2.GUI = "Gtk" elif "--tk" in sys.argv: editobj2.GUI = "Tk" elif "--qt" in sys.argv: editobj2.GUI = "Qt" elif "--qtopia" in sys.argv: editobj2.GUI = "Qtopia" w = editobj2.edit(dm, direction = "v") if editobj2.GUI == "Gtk": import gobject gobject.timeout_add(200, downloader) # Gtk / PyGtk does not like being used along with Python thread module else: import thread; thread.start_new_thread(run_downloader, ()) observe.start_scanning_gui() w.main()
else: return os.path.join(os.path.dirname(sys.argv[0]), "./file.png") def has_children(self): return os.path.isdir(self.path) def get_children(self): if self.children is None: if os.path.isdir(self.path): self.children = [File(os.path.join(self.path, filename)) for filename in os.listdir(self.path) if not filename.startswith(".")] #self.children = range(10) else: self.children = [] return self.children descr = introsp.description(File) descr.set_icon_filename(lambda o: o.get_icon_filename()) descr.set_field_for_attr("icon_filename", None) descr.set_field_for_attr("size", field.IntField, unit = "Ko") descr.set_children_getter("children", None, "has_children") file = File(os.path.join("..")) if "--gtk" in sys.argv: editobj2.GUI = "Gtk" elif "--tk" in sys.argv: editobj2.GUI = "Tk" elif "--qt" in sys.argv: editobj2.GUI = "Qt" elif "--qtopia" in sys.argv: editobj2.GUI = "Qtopia" editobj2.edit(file).main()
mod.submodules.append(Module(introsp)) mod.submodules.append(Module(observe)) mod.submodules.append(Module(undoredo)) mod.submodules.append(Module(editor)) mod.submodules.append(Module(field)) # mod.submodules.append(Module(treewidget)) descr = introsp.description(Module) descr.set_field_for_attr("details", None) descr.set_field_for_attr("icon_filename", None) descr.set_children_getter("submodules") # The following are not needed because EditObj2 is smart enough to guess them; # they are kept only for documentation purpose. # descr.set_field_for_attr("submodules", None) # descr.set_details(lambda o: o.details) # descr.set_label (lambda o: unicode(o)) if "--gtk" in sys.argv: editobj2.GUI = "Gtk" elif "--tk" in sys.argv: editobj2.GUI = "Tk" elif "--qt" in sys.argv: editobj2.GUI = "Qt" elif "--qtopia" in sys.argv: editobj2.GUI = "Qtopia" editobj2.edit(mod).main()
descr = introsp.description(Security) descr.set_label("Security") descr.set_field_for_attr("level" , field.EnumField({"low":0, "medium":1, "high":2, "paranoid":3})) descr.set_field_for_attr("allow_javascript", field.BoolField) descr.set_field_for_attr("block_popup" , field.BoolField) descr = introsp.description(Plugin) descr.set_field_for_attr("active", field.BoolField) descr = introsp.description(Config) descr.set_label("Configuration") descr.set_children_getter("plugins") # The following are not needed because EditObj2 is smart enough to guess them; # they are kept only for documentation purpose. #descr.set_field_for_attr("identification", field.ObjectAttributeField) #descr.set_field_for_attr("connection" , field.ObjectAttributeField) #descr.set_field_for_attr("security" , field.ObjectAttributeField) #descr.set_label (lambda o: unicode(o)) if "--gtk" in sys.argv: editobj2.GUI = "Gtk" elif "--tk" in sys.argv: editobj2.GUI = "Tk" elif "--qt" in sys.argv: editobj2.GUI = "Qt" elif "--qtopia" in sys.argv: editobj2.GUI = "Qtopia" editobj2.edit(config).main()
def edit(self, o, *args, **kargs): editobj2.edit(o, undo_stack = self.undo_stack, *args, **kargs)
self.children = l def __unicode__(self): return "Tests" cerealizer.register(Test) cerealizer.register(Tests) descr = introsp.description(Test) descr.set_field_for_attr("nom", field.StringField) descr.set_field_for_attr("age", field.StringField) descr.set_field_for_attr("language", field.StringField) descr.set_details(u"Test EditObj2 en HTML") test1 = Test("Jiba", 29) test2 = Test("Blam", 28) tests = Tests([test1, test2]) editobj2.GUI = "Html" form = editobj2.edit(tests) s = form.get_html() print s open("/tmp/t.html", "w").write(s)
def _edit_in_new_window_action(undo_stack, o): import editobj2.editor editobj2.edit(o, undo_stack = undo_stack)
descr = introsp.description(User) descr.set_field_for_attr("icon_filename", None) descr.set_field_for_attr("session", field.EnumField([u"WindowMaker", u"FluxBox", u"MacOS X", u"Gnome", u"KDE"])) descr.set_field_for_attr("language", field.EnumField([u"Français", u"Italiano", u"English", u"Esperanto"], long_list = 1)) # The following are not needed because EditObj2 is smart enough to guess them; # they are kept only for example purpose. #descr.set_field_for_attr("password", field.PasswordField) #descr.set_icon_filename(lambda o: o.icon_filename) descr = introsp.description(UserSelection) descr.set_children_getter("users") descr.set_details(u"1) Choose a user\n2) Type a valid password\n3) Login!") descr.add_action(introsp.Action("Undo", lambda o: undoredo.stack.undo())) descr.add_action(introsp.Action("Redo", lambda o: undoredo.stack.redo())) def on_validate(user): if isinstance(user, User): print "%s has loged in in with password '%s', language '%s' and session type '%s'." % (user.login, user.password, user.language, user.session) else: print "User has canceled." if "--gtk" in sys.argv: editobj2.GUI = "Gtk" elif "--tk" in sys.argv: editobj2.GUI = "Tk" elif "--qt" in sys.argv: editobj2.GUI = "Qt" elif "--qtopia" in sys.argv: editobj2.GUI = "Qtopia" editobj2.edit(user_selection, on_validate = on_validate).main()