예제 #1
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(724, 558)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_10.setObjectName("horizontalLayout_10")
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setEnabled(True)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed,
                                           QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.groupBox.sizePolicy().hasHeightForWidth())
        self.groupBox.setSizePolicy(sizePolicy)
        self.groupBox.setMinimumSize(QtCore.QSize(267, 390))
        self.groupBox.setMaximumSize(QtCore.QSize(267, 16777215))
        self.groupBox.setObjectName("groupBox")
        self.verticalLayout_16 = QtWidgets.QVBoxLayout(self.groupBox)
        self.verticalLayout_16.setObjectName("verticalLayout_16")
        self.label = QtWidgets.QLabel(self.groupBox)
        self.label.setObjectName("label")
        self.verticalLayout_16.addWidget(self.label)
        self.cmbStyle = QtWidgets.QComboBox(self.groupBox)
        self.cmbStyle.setObjectName("cmbStyle")
        self.cmbStyle.addItem("")
        self.cmbStyle.addItem("")
        self.cmbStyle.addItem("")
        self.verticalLayout_16.addWidget(self.cmbStyle)
        spacerItem = QtWidgets.QSpacerItem(20, 40,
                                           QtWidgets.QSizePolicy.Minimum,
                                           QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout_16.addItem(spacerItem)
        self.verticalLayout_13 = QtWidgets.QVBoxLayout()
        self.verticalLayout_13.setObjectName("verticalLayout_13")
        self.horizontalLayout_11 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_11.setObjectName("horizontalLayout_11")
        self.verticalLayout_14 = QtWidgets.QVBoxLayout()
        self.verticalLayout_14.setObjectName("verticalLayout_14")
        self.label_11 = QtWidgets.QLabel(self.groupBox)
        self.label_11.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.label_11.setAlignment(QtCore.Qt.AlignRight
                                   | QtCore.Qt.AlignTrailing
                                   | QtCore.Qt.AlignVCenter)
        self.label_11.setObjectName("label_11")
        self.verticalLayout_14.addWidget(self.label_11)
        self.label_12 = QtWidgets.QLabel(self.groupBox)
        self.label_12.setAlignment(QtCore.Qt.AlignRight
                                   | QtCore.Qt.AlignTrailing
                                   | QtCore.Qt.AlignVCenter)
        self.label_12.setObjectName("label_12")
        self.verticalLayout_14.addWidget(self.label_12)
        self.horizontalLayout_11.addLayout(self.verticalLayout_14)
        self.dial_3 = QtWidgets.QDial(self.groupBox)
        self.dial_3.setMinimum(1)
        self.dial_3.setMaximum(4)
        self.dial_3.setPageStep(1)
        self.dial_3.setProperty("value", 3)
        self.dial_3.setObjectName("dial_3")
        self.horizontalLayout_11.addWidget(self.dial_3)
        self.verticalLayout_15 = QtWidgets.QVBoxLayout()
        self.verticalLayout_15.setObjectName("verticalLayout_15")
        self.label_13 = QtWidgets.QLabel(self.groupBox)
        self.label_13.setObjectName("label_13")
        self.verticalLayout_15.addWidget(self.label_13)
        self.label_14 = QtWidgets.QLabel(self.groupBox)
        self.label_14.setObjectName("label_14")
        self.verticalLayout_15.addWidget(self.label_14)
        self.horizontalLayout_11.addLayout(self.verticalLayout_15)
        self.verticalLayout_13.addLayout(self.horizontalLayout_11)
        self.horizontalLayout_12 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_12.setObjectName("horizontalLayout_12")
        self.btnSave = QtWidgets.QPushButton(self.groupBox)
        self.btnSave.setObjectName("btnSave")
        self.horizontalLayout_12.addWidget(self.btnSave)
        self.btnUndo_3 = QtWidgets.QPushButton(self.groupBox)
        self.btnUndo_3.setMouseTracking(False)
        self.btnUndo_3.setCheckable(False)
        self.btnUndo_3.setObjectName("btnUndo_3")
        self.horizontalLayout_12.addWidget(self.btnUndo_3)
        self.btnBrowse_3 = QtWidgets.QPushButton(self.groupBox)
        self.btnBrowse_3.setObjectName("btnBrowse_3")
        self.horizontalLayout_12.addWidget(self.btnBrowse_3)
        self.verticalLayout_13.addLayout(self.horizontalLayout_12)
        self.verticalLayout_16.addLayout(self.verticalLayout_13)
        spacerItem1 = QtWidgets.QSpacerItem(20, 40,
                                            QtWidgets.QSizePolicy.Minimum,
                                            QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout_16.addItem(spacerItem1)
        self.groupBox_4 = QtWidgets.QGroupBox(self.groupBox)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum,
                                           QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.groupBox_4.sizePolicy().hasHeightForWidth())
        self.groupBox_4.setSizePolicy(sizePolicy)
        self.groupBox_4.setMinimumSize(QtCore.QSize(25, 20))
        self.groupBox_4.setObjectName("groupBox_4")
        self.horizontalLayout_14 = QtWidgets.QHBoxLayout(self.groupBox_4)
        self.horizontalLayout_14.setObjectName("horizontalLayout_14")
        self.btnPrevFrame = QtWidgets.QPushButton(self.groupBox_4)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum,
                                           QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.btnPrevFrame.sizePolicy().hasHeightForWidth())
        self.btnPrevFrame.setSizePolicy(sizePolicy)
        self.btnPrevFrame.setMinimumSize(QtCore.QSize(25, 25))
        self.btnPrevFrame.setMaximumSize(QtCore.QSize(25, 25))
        self.btnPrevFrame.setAutoFillBackground(False)
        self.btnPrevFrame.setText("")
        self.btnPrevFrame.setObjectName("btnPrevFrame")
        self.horizontalLayout_14.addWidget(self.btnPrevFrame)
        self.btnPlay = QtWidgets.QPushButton(self.groupBox_4)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum,
                                           QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.btnPlay.sizePolicy().hasHeightForWidth())
        self.btnPlay.setSizePolicy(sizePolicy)
        self.btnPlay.setMinimumSize(QtCore.QSize(25, 25))
        self.btnPlay.setMaximumSize(QtCore.QSize(25, 25))
        self.btnPlay.setText("")
        self.btnPlay.setObjectName("btnPlay")
        self.horizontalLayout_14.addWidget(self.btnPlay)
        self.btnNextFrame = QtWidgets.QPushButton(self.groupBox_4)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum,
                                           QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.btnNextFrame.sizePolicy().hasHeightForWidth())
        self.btnNextFrame.setSizePolicy(sizePolicy)
        self.btnNextFrame.setMinimumSize(QtCore.QSize(25, 25))
        self.btnNextFrame.setMaximumSize(QtCore.QSize(25, 25))
        self.btnNextFrame.setText("")
        self.btnNextFrame.setObjectName("btnNextFrame")
        self.horizontalLayout_14.addWidget(self.btnNextFrame)
        self.videoSlider = QtWidgets.QSlider(self.groupBox_4)
        self.videoSlider.setOrientation(QtCore.Qt.Horizontal)
        self.videoSlider.setObjectName("videoSlider")
        self.horizontalLayout_14.addWidget(self.videoSlider)
        self.verticalLayout_16.addWidget(self.groupBox_4)
        self.horizontalLayout_10.addWidget(self.groupBox)
        self.groupBox_3 = QtWidgets.QGroupBox(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum,
                                           QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.groupBox_3.sizePolicy().hasHeightForWidth())
        self.groupBox_3.setSizePolicy(sizePolicy)
        self.groupBox_3.setMinimumSize(QtCore.QSize(431, 391))
        self.groupBox_3.setObjectName("groupBox_3")
        self.verticalLayout_12 = QtWidgets.QVBoxLayout(self.groupBox_3)
        self.verticalLayout_12.setObjectName("verticalLayout_12")
        self.wgt_player = QVideoWidget(self.groupBox_3)
        self.wgt_player.setCursor(QtGui.QCursor(QtCore.Qt.CrossCursor))
        self.wgt_player.setMouseTracking(False)
        self.wgt_player.setObjectName("wgt_player")
        self.verticalLayout_12.addWidget(self.wgt_player)
        self.horizontalLayout_10.addWidget(self.groupBox_3)
        self.verticalLayout_4.addLayout(self.horizontalLayout_10)
        self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred,
                                           QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.groupBox_2.sizePolicy().hasHeightForWidth())
        self.groupBox_2.setSizePolicy(sizePolicy)
        self.groupBox_2.setMinimumSize(QtCore.QSize(0, 120))
        self.groupBox_2.setMaximumSize(QtCore.QSize(16777215, 120))
        self.groupBox_2.setObjectName("groupBox_2")
        self.verticalLayout_11 = QtWidgets.QVBoxLayout(self.groupBox_2)
        self.verticalLayout_11.setObjectName("verticalLayout_11")
        self.textEdit = QtWidgets.QTextEdit(self.groupBox_2)
        self.textEdit.setReadOnly(True)
        self.textEdit.setOverwriteMode(False)
        self.textEdit.setObjectName("textEdit")
        self.verticalLayout_11.addWidget(self.textEdit)
        self.verticalLayout_4.addWidget(self.groupBox_2)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menuBar = QtWidgets.QMenuBar(MainWindow)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 724, 21))
        self.menuBar.setObjectName("menuBar")
        self.menuFile = QtWidgets.QMenu(self.menuBar)
        self.menuFile.setObjectName("menuFile")
        self.menuAbout = QtWidgets.QMenu(self.menuBar)
        self.menuAbout.setObjectName("menuAbout")
        self.menuSettings = QtWidgets.QMenu(self.menuBar)
        self.menuSettings.setObjectName("menuSettings")
        MainWindow.setMenuBar(self.menuBar)
        self.actionOpen = QtWidgets.QAction(MainWindow)
        self.actionOpen.setObjectName("actionOpen")
        self.actionSave_as = QtWidgets.QAction(MainWindow)
        self.actionSave_as.setObjectName("actionSave_as")
        self.actionAbout = QtWidgets.QAction(MainWindow)
        self.actionAbout.setObjectName("actionAbout")
        self.actionVideo_Analysis = QtWidgets.QAction(MainWindow)
        self.actionVideo_Analysis.setObjectName("actionVideo_Analysis")
        self.actionPaws_Analysis = QtWidgets.QAction(MainWindow)
        self.actionPaws_Analysis.setObjectName("actionPaws_Analysis")
        self.menuFile.addAction(self.actionOpen)
        self.menuFile.addAction(self.actionSave_as)
        self.menuAbout.addAction(self.actionAbout)
        self.menuSettings.addAction(self.actionVideo_Analysis)
        self.menuSettings.addAction(self.actionPaws_Analysis)
        self.menuBar.addAction(self.menuFile.menuAction())
        self.menuBar.addAction(self.menuSettings.menuAction())
        self.menuBar.addAction(self.menuAbout.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(
            _translate("MainWindow", "Rat Paws Detection"))
        self.groupBox.setTitle(_translate("MainWindow", "Панель управления"))
        self.label.setText(_translate("MainWindow", "Стиль:"))
        self.cmbStyle.setItemText(0, _translate("MainWindow", "windowsvista"))
        self.cmbStyle.setItemText(1, _translate("MainWindow", "Windows"))
        self.cmbStyle.setItemText(2, _translate("MainWindow", "Fusion"))
        self.label_11.setText(_translate("MainWindow", "Левая передняя"))
        self.label_12.setText(_translate("MainWindow", "Левая задняя"))
        self.label_13.setText(_translate("MainWindow", "Правая передняя"))
        self.label_14.setText(_translate("MainWindow", "Правая задняя"))
        self.btnSave.setText(_translate("MainWindow", "Извлечь"))
        self.btnUndo_3.setText(_translate("MainWindow", "Очистить"))
        self.btnBrowse_3.setText(_translate("MainWindow", "Выбрать файл"))
        self.groupBox_4.setTitle(_translate("MainWindow", "Проигрыватель"))
        self.groupBox_3.setTitle(_translate("MainWindow", "Область видоса"))
        self.groupBox_2.setTitle(_translate("MainWindow", "Log"))
        self.menuFile.setTitle(_translate("MainWindow", "File"))
        self.menuAbout.setTitle(_translate("MainWindow", "Info"))
        self.menuSettings.setTitle(_translate("MainWindow", "Settings"))
        self.actionOpen.setText(_translate("MainWindow", "Open"))
        self.actionOpen.setShortcut(_translate("MainWindow", "Ctrl+O"))
        self.actionSave_as.setText(_translate("MainWindow", "Save as"))
        self.actionSave_as.setShortcut(_translate("MainWindow", "Ctrl+S"))
        self.actionAbout.setText(_translate("MainWindow", "About"))
        self.actionVideo_Analysis.setText(
            _translate("MainWindow", "Video Analysis"))
        self.actionPaws_Analysis.setText(
            _translate("MainWindow", "Paws Analysis"))
예제 #2
0
class VideoWindow(QMainWindow):

    def __init__(self, parent=None):
        super(VideoWindow, self).__init__(parent)

        # Variables ########################
        self.marker_begin = None
        self.marker_end = None
        self.saved_markers = []
        self.current_pos = 0
        self.mouse_button_down = False

        # Stop playing when reaching marker end?
        self.stop_at_marker_end = False

        # Settings
        self.include_subdirs = False


        # Which video are currently playing
        self.index = 0
        ###################################

        # PyQt
        self.setWindowTitle("Play Extractor")


        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        self.videoWidget = QVideoWidget()
        self.videoWidget.setMouseTracking(True)
        self.videoWidget.installEventFilter(self)

        self.errorLabel = QLabel()
        self.errorLabel.setSizePolicy(QSizePolicy.Preferred,
                                      QSizePolicy.Maximum)

        # Create new action
        openAction = QAction(QIcon('icons/file.png'), '&Open', self)
        openAction.setShortcut('Ctrl+O')
        openAction.setStatusTip('Open movie')
        openAction.triggered.connect(self.openFile)

        # Create new action
        openDirAction = QAction(QIcon('icons/folder.png'), '&OpenDir', self)
        openDirAction.setShortcut('Ctrl+Shift+O')
        openDirAction.setStatusTip('Open Directory')
        openDirAction.triggered.connect(self.openDir)

        exportAction = QAction(QIcon('icons/play.png'), '&Export', self)
        exportAction.setShortcut('Ctrl+E')
        exportAction.setStatusTip('Export Files')
        exportAction.triggered.connect(self.convertToMp4)

        # Create exit action
        exitAction = QAction(QIcon('icons/cancel.png'), '&Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(self.exitCall)

        # Create settings actions
        settingsAction = QAction(QIcon('icons/settings.png'), '&Settings', self)
        settingsAction.setShortcut('Ctrl+P')
        settingsAction.setStatusTip("Settings")
        settingsAction.triggered.connect(self.settings)

        # Create menu bar and add action
        menuBar = self.menuBar()
        fileMenu = menuBar.addMenu('&File')
        fileMenu.addAction(openAction)
        fileMenu.addAction(openDirAction)
        fileMenu.addAction(exportAction)
        fileMenu.addAction(settingsAction)
        fileMenu.addAction(exitAction)

        # Create a widget for window contents
        wid = QWidget(self)
        self.setCentralWidget(wid)


        # Create layouts to place inside widget
        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        self.label = QLabel(self)
        controlLayout.addWidget(self.label)

        #List
        listlayout = QHBoxLayout()
        listlayout.setContentsMargins(0, 0, 0, 0)
        self.labellist = List()
        self.labellist.mousePressEvent = self.selectVidFromList
        listlayout.addWidget(self.labellist)


        
        #if os.path.isfile(".last_session.pickle"):
        if False:
            self.video_list = pickle.load( open( ".last_session.pickle", "rb" ) )
            # Load videos into the the side list view
            for vid in self.video_list:
                imgPath = vid.path
                item = QListWidgetItem(imgPath.split("/")[-1].split(".")[0])
                self.labellist.addItem(item)

        else:
            #Open the play_extractor folder
            #self.loadVideos("/home/jake/dev/play_extractor")
            pass

        #self.labellist.item(0).setSelected(True)
        #self.labellist.itemClicked.connect(self.itemActivated)

        layout = QVBoxLayout()
        layout.addWidget(self.videoWidget)
        layout.addLayout(controlLayout)
        layout.setStretchFactor(self.videoWidget, 20)
        layout.setStretchFactor(controlLayout, 1)
        layout.addWidget(self.errorLabel)

        top = QHBoxLayout()
        top.setContentsMargins(0, 0, 10, 0)
        top.addLayout(listlayout)
        top.addLayout(layout)
        top.setStretchFactor(listlayout, 1)
        top.setStretchFactor(layout, 5)
        # Set widget to contain window contents
        wid.setLayout(top)

        self.mediaPlayer.setVideoOutput(self.videoWidget)
        #self.mediaPlayer.positionChanged.connect(self.positionChanged)
        #self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)

        #self.loadVidIndex(self.index)

        self.qTimer = QTimer()
        # set interval to 1 s
        self.qTimer.setInterval(20)  # 1000 ms = 1 s
        # connect timeout signal to signal handler
        self.qTimer.timeout.connect(self.getSensorValue)
        # start timer
        self.qTimer.start()

    def selectVidFromList(self, event):
        itemat =  self.labellist.itemAt(event.pos())
        row = self.labellist.row(itemat)
        if row != -1: 
            self.loadVidIndex(row)
        

    def itemActivated(self, item):
        index = self.labellist.currentRow()
        self.loadVidIndex(index)

    def settings(self):
        raise NotImplementedError

    def loadVideos(self, path):
        self.mImgList = self.scanDir(path)
        self.video_list = []
        self.labellist.clear()
        for imgPath in self.mImgList:
            self.video_list.append(video_container(imgPath, "None", "None", []))
            item = QListWidgetItem(os.path.split(imgPath)[1])
            self.labellist.addItem(item)
        if(len(self.video_list) > 0):
            self.loadVidIndex(0)

    def scanAllDirs(self, folderPath):
        images = []
        extensions = [".mp4"]

        for root, dirs, files in os.walk(folderPath):
            for file in files:
                if file.lower().endswith(tuple(extensions)):
                    relativePath = os.path.join(root, file)
                    path = str(os.path.abspath(relativePath))
                    images.append(path)
        return images

    def scanDir(self, folderPath):
        files = os.path.join(folderPath, '*.mp4')
        files = glob.glob(files)
        print(files)
        return files

    def time_to_x(self, timepoint):
        return int(timepoint / self.mediaPlayer.duration() * self.videoWidget.width())

    def clipArea(self, marker_begin, position):
        # Clip the box so it doesn't overlap with previous clips
        if self.saved_markers:
            if position > marker_begin:
                beginning_markers = [x[0] for x in self.saved_markers]
                beginning_markers.append(position)
                beginning_markers = np.array(beginning_markers)
                beginning_markers = beginning_markers[beginning_markers > marker_begin]
                return(np.min(beginning_markers))
            else:
                ending_markers = np.array([x[1] for x in self.saved_markers].append(position))
                ending_markers = ending_markers[ending_markers < marker_begin]
                return(np.max(ending_markers))
        else:
            return position

    def updateImage(self, position=0):
        width = self.label.width()
        pixmap = QPixmap(width, 50)
        pixmap.fill(Qt.gray)

        painter = QPainter()
        painter.begin(pixmap)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(QPen(Qt.black, 1))

        # Draw markers and bars
        markerwidth = 10    
        try:
            for saved_marker in self.saved_markers:
                sm_begin, sm_end = saved_marker
                bar_width = self.time_to_x(sm_end - sm_begin)
                painter.setBrush(QBrush(Qt.yellow, Qt.SolidPattern))
                painter.drawRect(self.time_to_x(sm_begin), 0, bar_width, 50)
            
            if self.marker_begin:
                markerpos = self.time_to_x(self.marker_begin)
                if self.marker_end:
                    bar_width = self.time_to_x(self.marker_end) - markerpos
                elif markerpos < self.time_to_x(self.mediaPlayer.position()):
                    bar_width = self.time_to_x(self.clipArea(self.marker_begin, self.mediaPlayer.position())) - markerpos
                else:
                    bar_width = 0
                painter.setBrush(QBrush(Qt.blue, Qt.SolidPattern))
                painter.drawRect(markerpos, 0, bar_width, 50)

                if self.marker_end:
                    if self.mediaPlayer.position() > self.marker_end:
                        painter.setBrush(QBrush(QColor(171, 255, 158), Qt.SolidPattern))
                        bar_width = self.time_to_x(self.clipArea(self.marker_begin, self.mediaPlayer.position()) - self.marker_end)
                        painter.drawRect(self.time_to_x(self.marker_end), 0, bar_width, 50)

                    elif self.mediaPlayer.position() < self.marker_begin:
                        painter.setBrush(QBrush(QColor(171, 255, 158), Qt.SolidPattern))
                        bar_width = markerpos - self.time_to_x(self.mediaPlayer.position())
                        painter.drawRect(self.time_to_x(self.mediaPlayer.position()), 0, bar_width, 50)

                    elif abs(self.mediaPlayer.position() - self.marker_begin) < abs(self.mediaPlayer.position() - self.marker_end):
                        painter.setBrush(QBrush(QColor(255, 101, 84), Qt.SolidPattern))
                        bar_width = self.time_to_x(self.mediaPlayer.position()) - self.time_to_x(self.marker_begin)
                        painter.drawRect(self.time_to_x(self.marker_begin), 0, bar_width, 50)

                    else:
                        painter.setBrush(QBrush(QColor(255, 101, 84), Qt.SolidPattern))
                        bar_width = self.time_to_x(self.marker_end) - self.time_to_x(self.mediaPlayer.position())
                        painter.drawRect(self.time_to_x(self.mediaPlayer.position()), 0, bar_width, 50)

            for marker in [self.marker_begin, self.marker_end]:
                if marker != None:
                    painter.setBrush(QBrush(Qt.green, Qt.SolidPattern))
                    markerpos = int(marker / self.mediaPlayer.duration() * width)
                    painter.drawRect(min(markerpos, width - markerwidth), 0, markerwidth, 50)
        
        except Exception as e:
            print(e)

        # Draw video playback marker
        painter.setBrush(QBrush(Qt.white, Qt.SolidPattern))
        painter.drawRect(min(position, width - markerwidth), 0, markerwidth, 50)
        painter.end()
        pixmap.scaled(width, 50)
        self.label.setMinimumSize(1, 50)
        self.label.setPixmap(pixmap)
        self.label.setScaledContents(True)


    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            if event.button() == QtCore.Qt.LeftButton:
                self.mouse_button_down = True
                self.current_pos = int(event.x() / self.videoWidget.geometry().width() * self.mediaPlayer.duration())
                self.mediaPlayer.setPosition(self.current_pos)
                self.updateImage(event.x())
            elif event.button() == QtCore.Qt.RightButton:
                self.addMarker()
        elif event.type() == QtCore.QEvent.MouseButtonRelease:
            self.mouse_button_down = False
        elif event.type() == QtCore.QEvent.MouseMove and self.mouse_button_down:
            self.current_pos = int(event.x() / self.videoWidget.geometry().width() * self.mediaPlayer.duration())
            self.mediaPlayer.setPosition(self.current_pos)
            self.updateImage(event.x())


        # if event.type() == QtCore.QEvent.MouseMove:
        # elif event.type() == QtCore.QEvent.MouseButtonPress or event.type() == QtCore.QEvent.MouseButtonRelease:
        #     self.addMarker()
        return True


    def resizeEvent(self, event):
        QMainWindow.resizeEvent(self, event)
        # self.updateImage()


    def getSensorValue(self):
        position = self.mediaPlayer.position()
        duration = self.mediaPlayer.duration()
        if duration > 0:
            self.updateImage(int(position / self.mediaPlayer.duration() * self.videoWidget.geometry().width()))

        # Stop at marker end if flag is set
        if self.stop_at_marker_end and self.marker_end:
            if position >= self.marker_end:
                if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
                    self.play()


    def openFile(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Open Movie",
                                                  QDir.homePath())
        print(fileName)
        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))


    def openDefault(self):
        fileName = self.video_list[self.index].path
        self.mediaPlayer.setMedia(
            QMediaContent(QUrl.fromLocalFile(fileName)))
        self.play()
        self.play()
        self.mediaPlayer.setPosition(self.current_pos)
        self.updateImage()


    def openDir(self):
        targetDirPath = (str(QFileDialog.getExistingDirectory(self, "Select Directory", ".")))
        self.loadVideos(targetDirPath)


    def exitCall(self):
        sys.exit(app.exec_())


    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()


    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)


    def handleError(self):
        self.errorLabel.setText("Error: " + self.mediaPlayer.errorString())


    def index_next(self):
        self.index = (self.index + 1) % len(self.video_list)


    def index_prev(self):
        self.index = (self.index - 1) % len(self.video_list)


    def reset(self):
        self.marker_end = None
        self.marker_begin = None
        self.current_pos = 0


    def save(self):
        if self.marker_begin and self.marker_end:
            self.video_list[self.index] = video_container(self.video_list[self.index].path, self.marker_begin,
                                                          self.marker_end, self.saved_markers)

        #Save the video list to a file
        pickle.dump(self.video_list, open( ".last_session.pickle", "wb" ))

    def delete_marker(self):
        self.video_list[self.index] = self.video_list[self.index]._replace(marker_begin = "None", marker_end = "None")
        self.marker_end = None
        self.marker_begin = None


    def load(self):
        if self.video_list[self.index].marker_begin != "None" and self.video_list[self.index].marker_end != "None":
            print("loading")
            self.marker_begin = self.video_list[self.index].marker_begin
            self.marker_end = self.video_list[self.index].marker_end
            self.current_pos = self.marker_begin
            self.saved_markers = self.video_list[self.index].saved_markers
        else:
            self.reset()

    def nextVid(self):
        self.save()
        self.labellist.item(self.index).setSelected(False)
        if self.marker_begin and self.marker_end:
            self.labellist.item(self.index).setForeground(Qt.green)
        self.index_next()
        self.reset()
        self.load()
        self.openDefault()
        self.labellist.item(self.index).setSelected(True)


    def previousVid(self):
        self.save()
        self.labellist.item(self.index).setSelected(False)
        if self.marker_begin and self.marker_end:
            self.labellist.item(self.index).setForeground(Qt.green)
        self.index_prev()
        self.reset()
        self.load()
        self.openDefault()
        self.labellist.item(self.index).setSelected(True)


    def loadVidIndex(self, index):
        self.save()
        self.labellist.item(self.index).setSelected(False)
        if self.marker_begin and self.marker_end:
            self.labellist.item(self.index).setForeground(Qt.green)
        self.index = index
        self.reset()
        self.load()
        self.openDefault()
        self.labellist.item(self.index).setSelected(True)


    def toggleFileList(self):
        if self.labellist.isHidden():
            self.labellist.show()
        else:
            self.labellist.hide()

    def overlapsWithSavedClips(self, position):
        for saved_marker in self.saved_markers:
            if position > saved_marker[0] and position <= saved_marker[1]:
                return True
            if self.marker_begin != None:
                if self.marker_begin < saved_marker[0] and (position > saved_marker[0]):
                    return True 
                
        return False


    def convertToMp4(self):
        #TODO: MAKE THIS PARALLEL
        for video in self.video_list:
            if video.marker_begin != "None" and video.marker_end != "None":
                input_kwargs = {}
                start_time = video.marker_begin / 1000
                end_time = video.marker_end / 1000

                if start_time is not None:
                    input_kwargs['ss'] = start_time
                else:
                    start_time = 0.
                if end_time is not None:
                    input_kwargs['t'] = end_time - start_time

                output_path = os.path.split(video.path)[0] + "/output"
                Path(output_path).mkdir(parents=True, exist_ok=True)
                print(video.path)
                stream = ffmpeg.input(video.path, **input_kwargs)
                stream = ffmpeg.output(stream, output_path + '/{}.mp4'.format(os.path.split(video.path)[1]))
                ffmpeg.run(stream)
        

    def showShortcuts(self):
        MsgBox = QMessageBox()
        MsgBox.setText("<b>Shortcuts</b><br><br>"
                       "<b>mouse hover</b>: scrub <br>"
                       "<b>space</b>: play/pause <br>"
                       "<b>d</b>: next video <br>"
                       "<b>a</b>: previous video <br> "
                       "<b>w</b>: place marker <br>"
                       "<b>s</b>: delete selection <br>"
                       "<b>p</b>: play from first marker <br>")
        MsgBox.exec()
        #MsgBox.about(self, "Title", "Message")

    def addMarker(self):
        if not self.overlapsWithSavedClips(self.mediaPlayer.position()):
            if self.marker_begin == None:
                self.marker_begin = self.mediaPlayer.position()
            elif self.marker_end == None:
                if self.mediaPlayer.position() > self.marker_begin:
                    self.marker_end = self.mediaPlayer.position()
                else:
                    self.marker_begin = self.mediaPlayer.position()
            elif self.mediaPlayer.position() < self.marker_begin:
                self.marker_begin = self.mediaPlayer.position()
            elif self.mediaPlayer.position() > self.marker_end:
                self.marker_end = self.mediaPlayer.position()
            else:
                if abs(self.mediaPlayer.position() - self.marker_begin) > abs(self.mediaPlayer.position() - self.marker_end):
                    self.marker_end = self.mediaPlayer.position()
                else:
                    self.marker_begin = self.mediaPlayer.position()

            if self.marker_begin and self.marker_end:
                self.save()

        print(self.current_pos)
        print(self.mediaPlayer.position())


    def keyPressEvent(self, e):
        key = e.key()
        self.stop_at_marker_end = False

        # play/pause
        if key == Qt.Key_Space:
            self.play()


        # Play from marker begin
        elif key == Qt.Key_E and self.marker_begin != None:
            self.mediaPlayer.setPosition(self.marker_begin)
            if self.marker_end:
                self.stop_at_marker_end = True
            if self.mediaPlayer.state() != QMediaPlayer.PlayingState:
                self.play()

        # Add marker
        elif key == Qt.Key_W:
            self.addMarker()


        # Remove all markers
        elif key == Qt.Key_S:
            self.delete_marker()

        # elif key == Qt.Key_Q:
        #     if self.marker_begin != None and self.marker_end != None:
        #         self.saved_markers.append([self.marker_begin, self.marker_end])
        #     self.delete_marker()

        # Time skipping
        elif key == Qt.Key_Left:
            # Scrub right N miliseconds
            self.current_pos -= 30
            self.mediaPlayer.setPosition(self.current_pos)

        elif key == Qt.Key_Right:
            self.current_pos += 30
            self.mediaPlayer.setPosition(self.current_pos)

        elif key == Qt.Key_D:
            self.nextVid()

        elif key == Qt.Key_A:
            self.previousVid()

        elif key == Qt.Key_R:
            self.toggleFileList()

        elif key == Qt.Key_J:
            self.convertToMp4()

        elif key == Qt.Key_T:
            self.showShortcuts()