def mousePressEvent(self, event): GLView.mousePressEvent(self, event) p = self.camera.qt_to_opengl(event.pos()) if event.buttons() & QtCore.Qt.LeftButton: for c in self.scene.clips: c._selected = c.inside(p.x(), p.y()) #self.update() selectedClips = filter(lambda i: i._selected, self.scene.clips) for c in selectedClips: k, v = c.getData() self.parameters.setData(c, k, v) self.setUpdatesEnabled(False) self.setCursor(QtCore.Qt.ArrowCursor) for c in selectedClips: if c.inside(p.x(), p.y()): if p.x()-c.start_frame in range(0, 15): self.extendLeft = c self.setCursor(self.cursorLeft) elif c.end_frame-p.x() in range(0, 15): self.extendRight = c self.setCursor(self.cursorRight) else: self.setCursor(QtCore.Qt.ArrowCursor) self.setUpdatesEnabled(True) self.update()
def dropEvent(self, event): GLView.dropEvent(self, event) if event.mimeData().hasUrls(): p = self.camera.qt_to_opengl(event.pos()) current_x = p.x() for url in event.mimeData().urls(): filename = str(url.toString(QtCore.QUrl.RemoveScheme)) filename = os.path.normpath(filename) hue = random.random() color = QtGui.QColor.fromHsvF(hue, 0.5, 0.75) r, g, b = color.redF(), color.greenF(), color.blueF() clip = Clip() clip._color = (r, g, b, 1) clip.name = os.path.basename(filename) clip.producer = mlt.Producer(mlt_profile, filename) clip.start_frame = current_x cpgl = clip.producer.get_length() if cpgl == 15000: # some hardcoded value? cpgl = 25 clip.end_frame = clip.start_frame+cpgl current_x = clip.end_frame+1 clip.producer.set("in", 0) clip.producer.set("out", cpgl) clip.track = self.scene.tracks clip.path = filename self.scene.clips.append(clip) self.scene.generate_mlt() self.updateImage()
def resizeEvent(self, event): GLView.resizeEvent(self, event) self.parameters.setGeometry(self.geometry().left()+5, self.geometry().top()+25, self.parameters.width(), self.parameters.height()) w = 1280/2 h = 720/2 x1 = self.width()-w y1 = 0 x2 = x1+w y2 = y1+h self.pointVertices = numpy.array([ x1, y1, x1, y2, x2, y2, x2, y1 ], dtype=numpy.float32) x1 = 0 y1 = 0 x2 = w*2 y2 = h*2 self.textureCoordinates = numpy.array([ 0, 0, 0, y2, x2, y2, x2, 0 ], dtype=numpy.float32)
def keyPressEvent(self, event): GLView.keyPressEvent(self, event) if event.key() == QtCore.Qt.Key_Space: self.play = not self.play if self.play: self.scene.consumer.purge() self.playbackTimer.start() self.scene.consumer.start() else: self.playbackTimer.stop() self.scene.consumer.stop() self.scene.consumer.purge() elif event.key() == QtCore.Qt.Key_Left: if event.modifiers() & QtCore.Qt.ShiftModifier: for clip in self.scene.clips: if clip._selected: clip.start_frame -= 1 clip.end_frame -= 1 self.scene.generate_mlt() self.updateImage() else: self.playhead -= 1 self.updateImage() self.update() elif event.key() == QtCore.Qt.Key_Right: if event.modifiers() & QtCore.Qt.ShiftModifier: for clip in self.scene.clips: if clip._selected: clip.start_frame += 1 clip.end_frame += 1 self.scene.generate_mlt() self.updateImage() else: self.playhead += 1 self.updateImage() self.update() elif event.key() == QtCore.Qt.Key_1: # view 1:1 self.camera.identity() self.camera.translate(100, self.height()-50) self.update() elif event.key() == QtCore.Qt.Key_R: # render parameters = "f=avi acodec=pcm_s16le ac=2 vcodec=huffyuv" consumer = mlt.Consumer(mlt_profile, "avformat", "output.avi") consumer.set("rescale", "none") data = parameters.split(" ") for l in data: k, v = l.split("=") consumer.set(k, v) consumer.connect(self.scene.tractor) self.scene.tractor.set_speed(0) self.scene.tractor.seek(0) self.scene.tractor.set_speed(1) print "starting rendering" consumer.start() import time while consumer.is_stopped() == 0: progress = int(100.0*self.scene.tractor.frame()/self.scene.tractor.get_length()) print "%3d" % progress, print "[%s%s]" % ( "#"*progress, " "*(100-progress) ) time.sleep(1) progress = 100 print "%3d" % progress, print "[%s%s]" % ( "#"*progress, " "*(100-progress) ) print "finished" elif event.key() == QtCore.Qt.Key_A: # analyze for count, pl in enumerate(self.scene.playlists): print "---"*10 print "Playlist #%d" % count for c in range(pl.count()): info = pl.clip_info(c) print info.start, info.frame_in, info.frame_out, info.length, info.frame_count, info.resource elif event.key() == QtCore.Qt.Key_C: # compact self.empty_frames = [] max_frame = 0 for c in self.scene.clips: max_frame = max(max_frame, int(c.end_frame)) for f in range(max_frame+1): blanks = [] for c, pl in enumerate(self.scene.playlists): producer = pl.get_clip_at(f) if producer is None: blanks.append(True) else: blanks.append(producer.is_blank()) if sum(blanks) == len(self.scene.playlists): self.empty_frames.append(f) for clip in self.scene.clips: ef = filter(lambda i: i < clip.start_frame, self.empty_frames) clip.start_frame -= len(ef) clip.end_frame -= len(ef) self.scene.generate_mlt() self.updateImage() self.update() elif event.key() == QtCore.Qt.Key_Delete: for clip in self.scene.clips: if clip._selected: self.scene.clips.remove(clip) self.scene.generate_mlt() self.updateImage() elif event.key() == QtCore.Qt.Key_B: # split selectedClips = filter(lambda i: i._selected, self.scene.clips) sc2 = [] for c in selectedClips: if c.inside(self.playhead, -50*c.track+10): sc2.append(c) if sc2: clip = sc2[0] del clip.producer import copy c1 = copy.deepcopy(clip) c2 = copy.deepcopy(clip) c1.end_frame = self.playhead c1.out_frame = c1.in_frame + (c1.end_frame-c1.start_frame) c2.in_frame = c2.in_frame + (self.playhead-c2.start_frame) + 1 c2.start_frame = self.playhead+1 self.scene.clips.remove(clip) self.scene.clips.append(c1) self.scene.clips.append(c2) self.scene.generate_mlt() self.updateImage() elif event.key() == QtCore.Qt.Key_I: # move in point selectedClips = filter(lambda i: i._selected, self.scene.clips) if selectedClips: c = selectedClips[0] dx = self.playhead-c.start_frame c.in_frame += dx c.start_frame += dx self.scene.generate_mlt() self.updateImage() elif event.key() == QtCore.Qt.Key_O: # move out point selectedClips = filter(lambda i: i._selected, self.scene.clips) if selectedClips: c = selectedClips[0] dx = self.playhead-c.end_frame c.out_frame -= dx c.end_frame -= dx self.scene.generate_mlt() self.updateImage() elif event.key() == QtCore.Qt.Key_F2: # rename selectedClips = filter(lambda i: i._selected, self.scene.clips) if selectedClips: c = selectedClips[0] new_name, ok = QtGui.QInputDialog.getText(self, "Rename clip", "Rename clip to", text = c.name) if ok: c.name = str(new_name) self.update()
def mouseMoveEvent(self, event): dx = 1.0*(event.x() - self._mousePos.x())/self.camera.m[0] dy = 1.0*(event.y() - self._mousePos.y())/self.camera.m[0] GLView.mouseMoveEvent(self, event) if event.buttons() & QtCore.Qt.LeftButton: nodesMoved = False # move selected nodes... selectedClips = filter(lambda i: i._selected, self.scene.clips) nodesMoved = bool(selectedClips) if (self.extendLeft is None) and (self.extendRight is None): for n in selectedClips: n.start_frame = int(n.start_frame+dx) n.end_frame = int(n.end_frame+dx) else: if self.extendLeft: sel = self.extendLeft sel.start_frame += dx sel.in_frame += dx if sel.in_frame < 0: ddx = sel.in_frame sel.in_frame = 0 sel.end_frame += ddx #elif self.start_frame > self.stop_frame: self.playhead = int(sel.start_frame) elif self.extendRight: sel = self.extendRight sel.end_frame += dx sel.out_frame += dx if sel.out_frame > sel.producer.get_length()-sel.in_frame: sel.end_frame -= dx sel.out_frame -= dx self.playhead = int(sel.end_frame) if nodesMoved: c = selectedClips[0] k, v = c.getData() self.parameters.setData(c, k, v) self.scene.generate_mlt() self.updateImage() if not nodesMoved: if (self.extendLeft is None) and (self.extendRight is None): ph = self.camera.qt_to_opengl(event.pos()) self.playhead = ph.x() self.updateImage() else: self.setCursor(QtCore.Qt.ArrowCursor) p = self.camera.qt_to_opengl(event.pos()) selectedClips = filter(lambda i: i._selected, self.scene.clips) for c in selectedClips: if c.inside(p.x(), p.y()): if p.x()-c.start_frame in range(0, 15): self.setCursor(self.cursorLeft) elif c.end_frame-p.x() in range(0, 15): self.setCursor(self.cursorRight) else: self.setCursor(QtCore.Qt.ArrowCursor)
def closeEvent(self, event): self.parameters.close() GLView.closeEvent(self, event) self.scene.save()
def moveEvent(self, event): GLView.moveEvent(self, event) self.parameters.setGeometry(self.geometry().left()+5, self.geometry().top()+25, self.parameters.width(), self.parameters.height())
def __init__(self, parent=None): GLView.__init__(self, parent) self.setWindowTitle("very-simple-nle") self.setAcceptDrops(True) self.scene = Scene() self.parameters = ParameterWindow(main_window=self, parent=None) self.parameters.show() self.parameters.raise_() self.setAutoFillBackground(False) self.setAttribute(QtCore.Qt.WA_StaticContents, True) self.setAttribute(QtCore.Qt.WA_OpaquePaintEvent, True) self.setAttribute(QtCore.Qt.WA_NoSystemBackground, True) self.setAttribute(QtCore.Qt.WA_PaintOnScreen, True) self.playhead = 0 self.texture = -1 self.texture_data = None self.tc = tc(25) self.playbackTimer = QtCore.QTimer(self) self.playbackTimer.setInterval(1000/25) self.connect(self.playbackTimer, QtCore.SIGNAL("timeout()"), self.onPlaybackTimer) self.play = False if os.path.exists("test.scene"): self.scene.load("test.scene") else: for c in range(10): hue = random.random() color = QtGui.QColor.fromHsvF(hue, 0.5, 0.75) r, g, b = color.redF(), color.greenF(), color.blueF() clip = Clip() clip._color = (r, g, b, 1) clip.name = "clip%d" % c clip.start_frame = c*120 clip.end_frame = c*120+119 clip.track = random.randint(0, 1) clip.path = "../media/output%d.mov" % (clip.track+1) self.scene.clips.append(clip) self.scene.save_as("test.scene") self.scene.generate_mlt() self.camera.translate(100, self.height()-50) self.updateImage() self.extendLeft = None self.extendRight = None self.cursorLeft = QtGui.QCursor(QtGui.QPixmap("img/trim_left.png")) self.cursorRight = QtGui.QCursor(QtGui.QPixmap("img/trim_right.png")) self.gl_font = QtGui.QFont("Tahoma", 9) self.pointVertices = [] self.textureCoordinates = []