Woops silly me - I have indeed been using Eclipse, with some third-party SVN plugin. I just assumed it was doing things right - obviously not!
Anyway, here's a new patch with your suggestions duly noted and taken care of: 1) (I assume you meant EventLaneViewer.py for this - EventViewer does indeed have a lot of changes) No, nothing changed in EventLaneViewer.py, must have knocked return by mistake or something :P 2) Fixed! 3) I called it DummySplitEvent because it 'emulates' splitting, if you see what I mean. But you're right, it was a bad name, now it's called 'CopySelection'. 4) Done - now works rather well if I do say so myself :P I also included a few try...excepts in __UpdateFadeLevels, as I kept receiving exceptions and broken functionality caused by the iterFadePoints.next() bits when using the new copy functionality. It should work fine now :) Like I said in the last post - these things only work when you shift-select on an event, then right click. They don't currently work from the Edit menu. Tom On Wed, May 21, 2008 at 6:36 PM, Laszlo Pandy <[EMAIL PROTECTED]> wrote: > Hey, thanks Tom. It looks like a pretty good. Here are my comments: > > 1) Did anything change in EventViewer.py? It looks like just a space was > added. Maybe you should revert that file. > > 2) It looks like you are using Eclipse which has generated a patch with > absolute paths in it. This means when I try to apply it it cannot find > /home/tom/ and I have to type all the paths manually. In the default SVN > client doing an 'svn diff' will give you a patch with paths relative to the > current directory like "Jokosher/EventViewer.py". I'm not sure how to do > this in Eclipse, but it would be nice if you can. > > 3) What does the Dummy in DummySplitEvent() mean? Might consider changing > the name to make it more clear. Would SplitEventOnSelection() make more > sense? > > 4) In SplitEvent() there is some code for splitting the __fadePointsDict, > so that if you have fade points on either side of the split point they will > be transferred to the new events. I don't see any of that code in > DummySplitEvent(). Has this been overlooked or did I miss something? > > Thanks, Laszlo > > Tom Halligan wrote: > >> Posted this to Launchpad RE: Jokosher bug #85938 at >> https://bugs.launchpad.net/jokosher/+bug/85938 , thought I'd send to the >> mailing list too: >> >> Small patch going part of the way to resolving this bug - splitting, >> cutting, copying, and deleting now works on a selection of an event rather >> than the entire thing from the right-click context menu. >> >> These things still don't work from the edit menu, as Jokosher uses >> seperate code for the two and I haven't got round to coding the edit menu >> bits yet. >> >> Also, these things work on pretty much an aesthetic level only - copying >> does not trim an event down to size properly (Looks ok, but plays the whole >> event rather than the selected portion), and various other issues related to >> other Jokosher bugs abound. >> >> It looks nicer though :) >> >> This patch was developed against Jokosher SVN from Revision 1512. >> >> Still finding my way around the Jokosher code - lots of things seem kind >> of awkward, but that's for another discussion completely! >> >> Peace >> Tom >> >> >> ------------------------------------------------------------------------ >> >> _______________________________________________ >> jokosher-devel-list mailing list >> jokosher-devel-list@gnome.org >> http://mail.gnome.org/mailman/listinfo/jokosher-devel-list >> > >
Index: Jokosher/EventViewer.py =================================================================== --- Jokosher/EventViewer.py (revision 1512) +++ Jokosher/EventViewer.py (working copy) @@ -997,7 +997,7 @@ widget -- reserved for GTK callbacks, don't use it explicitly. mouse -- GTK mouse event that fired this method call. """ - if self.messageID: #clesr status bar if not already clear + if self.messageID: #clear status bar if not already clear self.mainview.ClearStatusBar(self.messageID) self.messageID = None self.highlightCursor = None @@ -1013,11 +1013,17 @@ gtkevent -- reserved for GTK callbacks, don't use it explicitly. position -- The position in the event to split """ - if pos == 0.0: - return - - pos /= float(self.project.viewScale) - self.event.SplitEvent(pos) + if self.event.selection != [0,0]: + self.event.SplitEvent(self.event.selection[1]) + self.event.SplitEvent(self.event.selection[0]) + self.event.selection = [0,0] + self.HideDrawer() + else: + if pos == 0.0: + return + else: + pos /= float(self.project.viewScale) + self.event.SplitEvent(pos) #_____________________________________________________________________ @@ -1028,8 +1034,16 @@ Parameters: gtkevent -- reserved for GTK callbacks, don't use it explicitly. """ - self.project.clipboardList = [self.event] - self.OnDelete() + if self.event.selection != [0,0]: + self.event.SplitEvent(self.event.selection[1]) + e = self.event.SplitEvent(self.event.selection[0]) + self.project.clipboardList = [e] + e.Delete() + self.event.selection = [0,0] + self.HideDrawer() + else: + self.project.clipboardList = [self.event] + self.OnDelete() #_____________________________________________________________________ @@ -1040,7 +1054,12 @@ Parameters: gtkevent -- reserved for GTK callbacks, don't use it explicitly. """ - self.project.clipboardList = [self.event] + if self.event.selection != [0,0]: + e = self.event.CopySelection() + self.project.clipboardList = [e] + #We shouldn't hide the drawer here, unfriendly behaviour + else: + self.project.clipboardList = [self.event] #_____________________________________________________________________ @@ -1052,7 +1071,14 @@ Parameters: event -- reserved for GTK callbacks, don't use it explicitly. """ - self.event.Delete() + if self.event.selection != [0,0]: + self.event.SplitEvent(self.event.selection[1]) + e = self.event.SplitEvent(self.event.selection[0]) + e.Delete() + self.event.selection = [0,0] + self.HideDrawer() + else: + self.event.Delete() #_____________________________________________________________________ Index: Jokosher/Event.py =================================================================== --- Jokosher/Event.py (revision 1512) +++ Jokosher/Event.py (working copy) @@ -312,6 +312,55 @@ #_____________________________________________________________________ + def CopySelection(self, eventID=-1): + """ + Only for use with a 2-point selection. + Essentially performs a 'fake split' and returns a new event + which would be the result of splitting an event at the 2 points. + + This is used when the user shift-drags an event to create a selection, + then chooses 'copy' from the context menu. The new event can be placed + wherever the user wishes by right-clicking and choosing 'paste'. + """ + if eventID >= 0: + e = [x for x in self.instrument.graveyard if x.id == eventID][0] + self.instrument.graveyard.remove(e) + else: + e = Event(self.instrument, self.file, self.levels_file) + e.name = self.name + + dur = self.selection[1] - self.selection[0] + + e.start = self.start + self.selection[0] + e.offset = self.selection[0] #+self.offset + e.duration = dur + + dictLeft = {} + dictRight = {} + for key, value in self.__fadePointsDict.iteritems(): + if key < self.selection[0]: + dictLeft[key] = value + if key > self.selection[0]: + dictRight[key - self.selection[0]] = value + #in case there is a fade passing through the split point, recreate half of it on either side + splitFadeLevel = self.GetFadeLevelAtPoint(self.selection[0]) + dictLeft[self.selection[0]] = splitFadeLevel + dictRight[0.0] = splitFadeLevel + + millis = int(self.selection[0] * 1000) + e.levels_list = self.levels_list.slice_by_endtime(millis) + e.__fadePointsDict = dictRight + + e.__UpdateAudioFadePoints() + e.SetProperties() + self.instrument.events.append(e) + e.emit("length") + e.emit("position") + + return e + + + @UndoSystem.UndoCommand("JoinEvent", "temp", "temp2") def SplitEvent(self, split_point, cutRightSide=True, eventID=-1): """ @@ -1040,31 +1089,42 @@ self.fadeLevels = LevelsList.LevelsList() iterFadePoints = iter(self.audioFadePoints) - firstFadeTime, firstFadeValue = iterFadePoints.next() - firstFadeTime = int(firstFadeTime * 1000) #convert to milliseconds - secondFadeTime, secondFadeValue = iterFadePoints.next() - secondFadeTime = int(secondFadeTime * 1000) #convert to milliseconds + try: + firstFadeTime, firstFadeValue = iterFadePoints.next() + firstFadeTime = int(firstFadeTime * 1000) #convert to milliseconds + except StopIteration: + pass + + try: + secondFadeTime, secondFadeValue = iterFadePoints.next() + secondFadeTime = int(secondFadeTime * 1000) #convert to milliseconds + except StopIteration: + pass + # if less than one percent difference, assume they are the same sameValues = abs(firstFadeValue - secondFadeValue) < 0.01 - + for endtime, peak in self.levels_list: # check if we have moved into the next fade point pair if (endtime - secondFadeTime) > 1: # don't care about 1 millisecond difference, its rounding error firstFadeTime = secondFadeTime firstFadeValue = secondFadeValue - secondFadeTime, secondFadeValue = iterFadePoints.next() - secondFadeTime = int(secondFadeTime * 1000) #convert to milliseconds - + try: + secondFadeTime, secondFadeValue = iterFadePoints.next() + secondFadeTime = int(secondFadeTime * 1000) #convert to milliseconds + except StopIteration: + pass #Anything else is pointless + # if less than one percent difference, assume they are the same sameValues = abs(firstFadeValue - secondFadeValue) < 0.01 if not sameValues: # the fade line is not flat, so calculate the slope of it slope = (secondFadeValue - firstFadeValue) / (secondFadeTime - firstFadeTime) - if sameValues: #no fade here, the same volume continues across self.fadeLevels.append(endtime, [int(peak * firstFadeValue)]) else: + slope = (secondFadeValue - firstFadeValue) / (secondFadeTime - firstFadeTime) rel_time = endtime - firstFadeTime peak_delta = slope * rel_time new_fade_value = firstFadeValue + peak_delta @@ -1072,7 +1132,6 @@ peak = int(peak * new_fade_value) self.fadeLevels.append(endtime, [peak]) - #_____________________________________________________________________ def GetFadeLevels(self):
_______________________________________________ jokosher-devel-list mailing list jokosher-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/jokosher-devel-list