--- blender_listview_audio.py 2018-09-09 17:23:00.000000000 +0200 +++ blender_listview_new.py 2018-09-09 22:12:41.000000000 +0200 @@ -38,6 +38,7 @@ from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtMultimedia import * +from PyQt5.QtMultimediaWidgets import * from classes import info from classes.logger import log @@ -95,7 +96,7 @@ self.left = 300 self.top = 300 self.width = 500 - self.height = 150 + self.height = 70 self.color = 0 # 0- toggle to dark 1- toggle to light self.userAction = -1 # 0- stopped, 1- playing 2-paused self.initUI() @@ -180,6 +181,7 @@ self.eraseBtn.setEnabled(True) self.volumeslider.show() self.playsoundframe.show() + self.setFixedSize(500, 150) else: self.playBtn.setEnabled(False) self.stopBtn.setEnabled(False) @@ -233,6 +235,7 @@ self.player.play() self.stopBtn.setEnabled(True) self.userAction = 1 + self.setFixedSize(500, 150) log.info(_("Selected file: %s") % song) def playhandler(self): @@ -278,6 +281,7 @@ self.volumeslider.hide() self.playsoundframe.hide() self.urlSong = None + self.setFixedSize(500, 100) self.statusBar().showMessage(_("Cleared")) def changeVolume(self, value): @@ -327,6 +331,7 @@ self.parentWindow.soundwidget.insertItem(0, item) # Add path with filename to tooltip widget self.parentWindow.soundwidget.setToolTip(self.urlSong.path()) + self.setFixedSize(500, 150) log.info(_("Selected sound file: %s") % self.urlSong.fileName()) else: # add value to dictionary @@ -355,13 +360,325 @@ #self.playBtn.hide() self.playBtn.setEnabled(False) self.stopBtn.setEnabled(False) - self.playsoundframe.hide() + self.playmovieframe.hide() + self.volumeslider.hide() + self.setFixedSize(500, 100) + self.statusBar().showMessage(_("Error: ") + self.player.errorString()) + +class OpenMovieFile(QMainWindow): + """Open movie file widget with test player""" + def __init__(self, parentWindow): + super(OpenMovieFile, self).__init__(parentWindow) + self.app = get_app() + # Get translation object + _ = self.app._tr + self.parentWindow = parentWindow + #centralWidgetself.playmovieframe + self.movieArea = QHBoxLayout() + # Add player widgets movie controls + self.player = QMediaPlayer(None, QMediaPlayer.VideoSurface) + self.playlist = QMediaPlaylist() + self.playBtn = QPushButton() + self.stopBtn = QPushButton() + self.eraseBtn = QPushButton() + self.positionSlider = QSlider(Qt.Horizontal) + self.playmovieframe = QFrame() + self.volumeslider = QSlider(Qt.Vertical) + # Add buttons movie choose controls + self.chooseBtn = QPushButton(_('OK')) + self.cancelBtn = QPushButton(_('Cancel')) + self.title = _('Choose a movie file') + self.urlMovie = None + self.defaultPlay = True + # Get file movie preview selected for default folder looking for + if self.parentWindow.moviewidget.toolTip() == '' : + self.defaultFolder = QDir.homePath() + self.initialFolder = False + else: + self.defaultFolder = self.parentWindow.moviewidget.toolTip() + self.initialFolder = True + self.left = 300 + self.top = 300 + self.width = 500 + self.height = 100 + self.color = 0 # 0- toggle to dark 1- toggle to light + self.userAction = -1 # 0- stopped, 1- playing 2-paused + self.initUI() + + def initUI(self): + """Add menu bar and defaults sets to QMainWindow object""" + # Get translation object + _ = self.app._tr + # Add file menu + menubar = self.menuBar() + filemenu = menubar.addMenu(self.style().standardIcon(QStyle.SP_DirIcon), _('File')) + + fileAct = QAction(self.style().standardIcon(QStyle.SP_DirOpenIcon), _('&Open File'), self) + + fileAct.setShortcut(_('Ctrl+O')) + + fileAct.setStatusTip(_('Open movie file')) + + filemenu.addAction(fileAct) + + fileAct.triggered.connect(self.openFile) + + self.addControls() + + self.setWindowTitle(self.title) + self.setGeometry(self.left, self.top, self.width, self.height) + self.show() + + def addControls(self): + """Add widgets to QMainWindow object""" + # Get translation object + _ = self.app._tr + wid = QWidget(self) + videoWidget = QVideoWidget() + self.setCentralWidget(wid) + # Add movie position controls + self.positionSlider.setRange(0, 0) + self.positionSlider.setEnabled(False) + # Add movie volume controls + self.volumeslider.setFocusPolicy(Qt.NoFocus) + self.volumeslider.setValue(100) + self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay)) + self.stopBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaStop)) + self.eraseBtn.setIcon(self.style().standardIcon(QStyle.SP_TrashIcon)) + # Add layouts + # Movie panel + panelMovieArea = QVBoxLayout() + #Choose actions + chooseLayout = QHBoxLayout() + #Player movie + playvideoLayout = QVBoxLayout() + playlistCtrlLayout = QHBoxLayout() + playmovielayout = QHBoxLayout() + # Add widgets to playmovieframe + playvideoLayout.addWidget(videoWidget) + playvideoLayout.addLayout(playlistCtrlLayout) + self.playmovieframe.setLayout(playvideoLayout) + # Add play movie buttons to movie controls layout + playmovielayout.addWidget(self.playBtn) + playmovielayout.addWidget(self.stopBtn) + # Add buttons to playlist controls layout + playlistCtrlLayout.addLayout(playmovielayout) + playlistCtrlLayout.addWidget(self.positionSlider) + playlistCtrlLayout.addWidget(self.eraseBtn) + # Add button to choose action layout + chooseLayout.addWidget(self.chooseBtn) + chooseLayout.addWidget(self.cancelBtn) + # Add to layouts to panelMovieArea + panelMovieArea.addWidget(self.playmovieframe) + panelMovieArea.addLayout(chooseLayout) + # Add to horizontal layout + self.movieArea.addLayout(panelMovieArea) + self.movieArea.addWidget(self.volumeslider) + wid.setLayout(self.movieArea) + # Set initial widget state + if self.initialFolder: + # Get movie selected + self.urlMovie = QUrl.fromLocalFile(self.defaultFolder) + # Set default file for player + self.playlist.clear() + self.playlist.addMedia(QMediaContent(self.urlMovie)) + self.player.setPlaylist(self.playlist) + self.playBtn.setEnabled(True) + self.stopBtn.setEnabled(True) + self.eraseBtn.setEnabled(True) + self.volumeslider.show() + self.playmovieframe.show() + self.setFixedSize(1024, 780) + else: + self.playBtn.setEnabled(False) + self.stopBtn.setEnabled(False) + self.eraseBtn.setEnabled(False) + self.volumeslider.hide() + self.playmovieframe.hide() + # Connect each signal to their appropriate function + self.playBtn.clicked.connect(self.playhandler) + self.stopBtn.clicked.connect(self.stophandler) + self.eraseBtn.clicked.connect(self.clearhandler) + + self.player.setVideoOutput(videoWidget) + + self.player.stateChanged.connect(self.playStateChanged) + self.player.positionChanged.connect(self.positionChanged) + self.player.durationChanged.connect(self.durationChanged) + self.player.error.connect(self.handleError) + + self.positionSlider.sliderMoved.connect(self.setPosition) + self.volumeslider.valueChanged[int].connect(self.changeVolume) + + self.chooseBtn.clicked.connect(self.chooseMovie) + self.cancelBtn.clicked.connect(self.close) + + self.statusBar() + self.playlist.currentMediaChanged.connect(self.movieChanged) + + def openFile(self): + """Open file movie""" + # Get translation object + _ = self.app._tr + # Open file movie + options = QFileDialog.Options() + options |= QFileDialog.DontUseNativeDialog + titlefiledialog = _("Open movie file") + extensionfiledialog = _("Movies Files (*.avi *.mpeg *.mpg *.ts *.vob *.mp4 *.mov *.moov *.qt *.qtvr *.webm *.flv *.mkv *.ogm *.ogg *.ogv *.mjpeg *.mjpg *.divx *.avf *.dv)") + movie, filterselect = QFileDialog.getOpenFileName(self, titlefiledialog, self.defaultFolder, extensionfiledialog, options=options) + # File movie statement + if movie != '': + # Get movie selected + self.urlMovie = QUrl.fromLocalFile(movie) + # Set default file for next open + self.defaultFolder = self.urlMovie.path() + self.playlist.clear() + self.playlist.addMedia(QMediaContent(self.urlMovie)) + self.player.setPlaylist(self.playlist) + self.playBtn.setEnabled(True) + self.eraseBtn.setEnabled(True) + self.positionSlider.setEnabled(True) + self.volumeslider.show() + self.playmovieframe.show() + if self.defaultPlay: + self.player.play() + self.stopBtn.setEnabled(True) + self.userAction = 1 + self.setFixedSize(1024, 780) + log.info(_("Selected file: %s") % movie) + + def playhandler(self): + """Play or pause movie if playing""" + # Get translation object + _ = self.app._tr + if self.playlist.mediaCount() == 0: + self.openFile() + elif self.playlist.mediaCount() != 0: + self.stopBtn.setEnabled(True) + if self.player.state() == QMediaPlayer.PlayingState: + self.player.pause() + self.userAction = 2 + self.setWindowTitle(self.urlMovie.fileName()) + self.statusBar().showMessage(_("Pause")) + else: + self.player.play() + self.userAction = 1 + self.setWindowTitle(self.urlMovie.fileName()) + self.statusBar().showMessage(_("Play")) + + def stophandler(self): + """Stop play movie""" + # Get translation object + _ = self.app._tr + self.userAction = 0 + self.player.stop() + self.stopBtn.setEnabled(False) + self.setWindowTitle(self.urlMovie.fileName()) + self.statusBar().showMessage(_("Stopped")) + + def clearhandler(self): + """Stop play movie""" + # Get translation object + _ = self.app._tr + self.userAction = 0 + self.player.stop() + self.setWindowTitle(self.urlMovie.fileName()) + self.playlist.clear() + self.player.setPlaylist(self.playlist) + self.playBtn.setEnabled(False) + self.positionSlider.setEnabled(False) self.volumeslider.hide() + self.playmovieframe.hide() + self.urlMovie = None + self.setFixedSize(500, 100) + self.statusBar().showMessage(_("Cleared")) + + def changeVolume(self, value): + """Set volume player from slider volume""" + self.player.setVolume(value) + + def movieChanged(self, media): + """Set select movie, and display into status bar to OpenMovieFile widget""" + if not media.isNull(): + self.urlMovie = media.canonicalUrl() + self.statusBar().showMessage(self.urlMovie.fileName()) + + def setPosition(self, position): + """Set position movie play from slider""" + self.player.setPosition(position) + + def playStateChanged(self, state): + """Set state of play movie : play or pause""" + if self.player.state() == QMediaPlayer.PlayingState: + self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPause)) + else: + self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay)) + + def positionChanged(self, position): + """Set position slider from movie position play""" + self.positionSlider.setValue(position) + + def durationChanged(self, duration): + """Update range from media duration movie""" + self.positionSlider.setRange(0, duration) + + def chooseMovie(self): + """Return selected file movie""" + # Get translation object + _ = self.app._tr + if self.urlMovie: + (dirName, fileName) = os.path.split(self.urlMovie.fileName()) + # set path to file for blender + self.parentWindow.params[self.parentWindow.movieparam["name"]] = self.urlMovie.path() + # Delete old storage file + self.parentWindow.movieparam["values"] = {} + # Add new file path for openshot + self.parentWindow.movieparam["values"][fileName] = self.urlMovie.fileName() + # Add file name for list widget + self.parentWindow.moviewidget.clear() + item = QListWidgetItem(fileName) + self.parentWindow.moviewidget.insertItem(0, item) + # Add path with filename to tooltip widget + self.parentWindow.moviewidget.setToolTip(self.urlMovie.path()) + log.info(_("Selected movie file: %s") % self.urlMovie.fileName()) + else: + # add value to dictionary + self.parentWindow.params[self.parentWindow.movieparam["name"]] = '' + # Delete old storage file + self.parentWindow.movieparam["values"] = {} + # Add file name for list widget + self.parentWindow.moviewidget.clear() + item = QListWidgetItem(_("No File Selected")) + self.parentWindow.moviewidget.insertItem(0, item) + # Add text to tooltip widget + self.parentWindow.moviewidget.setToolTip('') + log.info(_("No File selected")) + + #exit OpenMovieFile Window + self.close() + + def closeEvent(self, event): + #Stop the player when exit + self.player.stop() + event.accept() + + def handleError(self): + # Get translation object + _ = self.app._tr + #self.playBtn.hide() + self.playBtn.setEnabled(False) + self.stopBtn.setEnabled(False) + self.playmovieframe.hide() + self.volumeslider.hide() + self.setFixedSize(500, 100) self.statusBar().showMessage(_("Error: ") + self.player.errorString()) + + + class BlenderListView(QListView): """ A TreeView QWidget used on the animated title window """ @@ -643,6 +960,92 @@ widget.insertItem(0, item) widget.setMinimumHeight(widget.sizeHintForRow(0)) + elif param["type"] == "movie": + # create list for select file + widget = QListWidget() + widget.itemClicked.connect(functools.partial(self.movie_index_Activated, widget, param)) + # set default file from config pluqin + if param["default"]: + log.info(_("Try to get file %s from default set config") % param["default"]) + try: + with open(param["default"]): pass + except IOError: + if param["values"].items() and param["values"] != {'': ''}: + log.info(_("Try to get a file from values configured list %s") % str(param["values"])) + # add item list widget + flag = True + for chosefile in param["values"]: + try: + with open(chosefile): pass + except IOError: + continue + else: + (dirName, fileName) = os.path.split(os.path.realpath(chosefile)) + # add value to dictionary + self.params[param["name"]] = os.path.realpath(chosefile) + # add icon of picture to item + item = QListWidgetItem(fileName) + # add value to tooltip widget + widget.setToolTip(os.path.realpath(chosefile)) + flag = False + log.info(_("File loaded %s") % os.path.realpath(chosefile)) + break + if flag: + # add value to dictionary + self.params[param["name"]] = '' + item = QListWidgetItem(_("No File Selected")) + log.info(_("Default File %s Not Found and no files found from configured list of files") % param["default"]) + else: + # add value to dictionary + self.params[param["name"]] = '' + item = QListWidgetItem(_("No File Selected")) + log.info(_("Default File %s Not Found") % param["default"]) + else: + (dirName, fileName) = os.path.split(os.path.realpath(param["default"])) + # add value to dictionary + self.params[param["name"]] = os.path.realpath(param["default"]) + # add item list widget + item = QListWidgetItem(fileName) + # add value to list widget + widget.setToolTip(os.path.realpath(param["default"])) + log.info(_("File loaded %s") % os.path.realpath(param["default"])) + widget.insertItem(0, item) + # set default find file from values list + elif param["values"].items() and param["values"] != {'': ''}: + log.info(_("Try to get a file from values configured list %s") % str(param["values"])) + # add item list widget + flag = True + for chosefile in param["values"]: + try: + with open(chosefile): pass + except IOError: + continue + else: + (dirName, fileName) = os.path.split(os.path.realpath(chosefile)) + # add value to dictionary + self.params[param["name"]] = os.path.realpath(chosefile) + # add item list widget + item = QListWidgetItem(fileName) + # add value to tooltip widget + widget.setToolTip(os.path.realpath(chosefile)) + flag = False + log.info(_("File loaded %s") % os.path.realpath(chosefile)) + break + if flag: + # add value to dictionary + self.params[param["name"]] = '' + item = QListWidgetItem(_("No File Selected")) + log.info(_("No Files found from configured list of files")) + # add value to list widget + else: + # add value to dictionary + self.params[param["name"]] = '' + item = QListWidgetItem(_("No File Selected")) + # add value to list widget + log.info(_("No File detected from config")) + widget.insertItem(0, item) + widget.setMinimumHeight(widget.sizeHintForRow(0)) + elif param["type"] == "color": # add value to dictionary color = QColor(param["default"]) @@ -722,6 +1125,15 @@ sounddialog = OpenSoundFile(self) sounddialog.show() + def movie_index_Activated(self, widget, param): + """Load new movie file""" + _ = self.app._tr + # Create instance of moviefile load + self.moviewidget = widget + self.movieparam = param + moviedialog = OpenMovieFile(self) + moviedialog.show() + def color_button_clicked(self, widget, param, index): # Show color dialog log.info('Animation param being changed: %s' % param["name"])