def __init__(self, parent=None): """ Constructor """ super(LtMainWindow, self).__init__(parent) self.setProjectName() self.setObjectName("ltMainWindow") # ==== Creating core functional units ==== self.cvProcessor = CvProcessor(self) # ==== Creating GUI ==== # status = self.statusBar() # status.setSizeGripEnabled(False) # ---- Creating main video widget ---- self.cvGraphics = CvGraphics(self) self.cvGraphics.setAlignment(QtCore.Qt.AlignCenter) self.cvGraphics.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) self.cvGraphics.setObjectName("cvGraphics") self.setCentralWidget(self.cvGraphics) self.cvProcessor.signalNextFrame.connect(self.cvGraphics.putImage) self.cvProcessor.signalClearFrame.connect(self.cvGraphics.setNullImage) self.cvProcessor.project.signalProjectOpened.connect(self.setProjectName) self.cvProcessor.project.signalProjectClosed.connect(self.setProjectName) # ---- Creating dock panel for video player ---- videoDockPanel = QtGui.QDockWidget("Video Control", self) videoDockPanel.setObjectName("videoDockWidget") videoDockPanel.setAllowedAreas(QtCore.Qt.BottomDockWidgetArea) videoDockPanel.setFeatures(QtGui.QDockWidget.DockWidgetMovable | QtGui.QDockWidget.DockWidgetFloatable) self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, videoDockPanel) self.videoWidget = VideoWidget(self.cvProcessor.cvPlayer) videoDockPanel.setWidget(self.videoWidget) # ---- Creating dock panel for project ---- projectDockPanel = QtGui.QDockWidget("Project", self) # Created and set caption projectDockPanel.setObjectName("projectDockWidget") projectDockPanel.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea) projectDockPanel.setFeatures(QtGui.QDockWidget.DockWidgetMovable | QtGui.QDockWidget.DockWidgetFloatable) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, projectDockPanel) self.projectWidget = ProjectWidget(self.cvProcessor.project) projectDockPanel.setWidget(self.projectWidget) # ---- Creating dock panel for chambers ---- chambersDockPanel = QtGui.QDockWidget("Chambers", self) # Created and set caption chambersDockPanel.setObjectName("chambersDockWidget") chambersDockPanel.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea) chambersDockPanel.setFeatures(QtGui.QDockWidget.DockWidgetMovable | QtGui.QDockWidget.DockWidgetFloatable) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, chambersDockPanel) self.chambersWidget = ChambersWidget() # self.chambersWidget.analysisMethod.stateChanged.connect(self.cvProcessor.setAnalysisMethod) chambersDockPanel.setWidget(self.chambersWidget) # ---- chambersWidget ---- self.chambersWidget.signalScaleSelect.connect(self.cvGraphics.selectScale) self.chambersWidget.signalChamberSelect.connect(self.cvGraphics.selectChamber) self.cvGraphics.signalChamberSetted.connect(self.chambersWidget.chamberSetted) self.cvGraphics.signalScaleSetted.connect(self.chambersWidget.scaleSetted) self.chambersWidget.signalChamberSelected.connect(self.cvGraphics.selectChamberGui) self.cvGraphics.signalChamberSelected.connect(self.chambersWidget.selectChamber) self.cvProcessor.project.signalChamberAdded.connect(self.chambersWidget.addChamber) self.cvProcessor.project.signalChamberAdded.connect(self.cvGraphics.addChamberGui) self.cvProcessor.project.signalChamberDeleted.connect(self.chambersWidget.removeChamber) self.cvProcessor.project.signalChamberDeleted.connect(self.cvGraphics.delChamberGui) self.cvProcessor.project.signalChambersMangerChanged.connect(self.chambersWidget.setChambersManager) self.cvProcessor.project.signalChambersMangerChanged.connect(self.cvGraphics.delScaleGui) # ---- Creating dock panel for image processing ---- cvProcessorDockPanel = QtGui.QDockWidget("Image processor", self) # Created and set caption cvProcessorDockPanel.setObjectName("chambersDockWidget") cvProcessorDockPanel.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) cvProcessorDockPanel.setFeatures(QtGui.QDockWidget.DockWidgetMovable | QtGui.QDockWidget.DockWidgetFloatable) self.addDockWidget(QtCore.Qt.RightDockWidgetArea, cvProcessorDockPanel) self.cvProcessorWidget = CvProcessorWidget(self.cvProcessor) cvProcessorDockPanel.setWidget(self.cvProcessorWidget) # ---- Creating dock panel for image processing ---- cvPreProcessorDockPanel = QtGui.QDockWidget("Preprocessor", self) # Created and set caption cvPreProcessorDockPanel.setObjectName("PreDockWidget") cvPreProcessorDockPanel.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) cvPreProcessorDockPanel.setFeatures(QtGui.QDockWidget.DockWidgetMovable | QtGui.QDockWidget.DockWidgetFloatable) self.addDockWidget(QtCore.Qt.RightDockWidgetArea, cvPreProcessorDockPanel) self.cvPreProcessorWidget = PreprocessorWidget(self.cvProcessor.preprocessor) cvPreProcessorDockPanel.setWidget(self.cvPreProcessorWidget) # ---- Creating dock panel for trajectory Widget cvTrajectoryDockPanel = QtGui.QDockWidget("Trajectory", self) # Created and set caption cvTrajectoryDockPanel.setObjectName("TrajectoryDockWidget") cvTrajectoryDockPanel.setAllowedAreas(QtCore.Qt.RightDockWidgetArea) cvTrajectoryDockPanel.setFeatures(QtGui.QDockWidget.DockWidgetMovable | QtGui.QDockWidget.DockWidgetFloatable) self.addDockWidget(QtCore.Qt.RightDockWidgetArea, cvTrajectoryDockPanel) self.trajectoryWidget = TrajectoryWidget(self.cvProcessor.project.trajectoryAnalysis) cvTrajectoryDockPanel.setWidget(self.trajectoryWidget) self.presetsWidget = PresetsWidget(self) # ==== Creating menu ==== projectMenu = self.menuBar().addMenu("&Project") setPresetAction = createAction(self, "Set preset...", "", "", "") projectMenu.addAction(setPresetAction) setPresetAction.triggered.connect(self.presetDialogDisplay) self.presetsWidget.signalSetPreset.connect(self.cvProcessorWidget.setPreset) self.presetsWidget.signalSetPreset.connect(self.trajectoryWidget.setPreset) self.quitAction = createAction(self, "Exit...", QtGui.QKeySequence.Quit, "application-exit", "Exit program") addActions(projectMenu, self.projectWidget.actions) projectMenu.addSeparator() projectMenu.addAction(self.quitAction) """ projectToolbar = self.addToolBar("Project") projectToolbar.setObjectName("projectToolBar") addActions(projectToolbar, (self.quitAction,)) """ videoMenu = self.menuBar().addMenu("&Video") addActions(videoMenu, self.videoWidget.actions) chamberMenu = self.menuBar().addMenu("&Chamber") # addActions(chamberMenu, self.chambersWidget.actions) trajectoryMenu = self.menuBar().addMenu("&Trajectory") # addActions(trajectoryMenu, self.trajectoryWidget.actions) helpMenu = self.menuBar().addMenu("&Help") helpAboutAction = createAction(self, "&About LocoTrack", "", "help-about", "") helpAboutAction.triggered.connect(self.helpAbout) helpHelpAction = createAction(self, "&Help", QtGui.QKeySequence.HelpContents, "help-contents") helpHelpAction.triggered.connect(self.helpHelp) addActions(helpMenu, (helpAboutAction, helpHelpAction)) # ---- cvProcessorWidget ---- self.cvProcessorWidget.showProcessedChechBox.stateChanged.connect(self.cvProcessor.setShowProcessed) self.cvProcessorWidget.showContourChechBox.stateChanged.connect(self.cvProcessor.setShowContour) self.cvProcessorWidget.thresholdSlider.valueChanged.connect(self.cvProcessor.setTreshold) self.cvProcessorWidget.ellipseCropCheckBox.stateChanged.connect(self.cvProcessor.setEllipseCrop) # ---- Main menu ---- # Project menu self.quitAction.triggered.connect(self.close) # Restore window settings settings = QtCore.QSettings() self.restoreGeometry(settings.value("ltMainWindow/Geometry").toByteArray()) self.restoreState(settings.value("ltMainWindow/State").toByteArray()) preset, isInt = settings.value("ltMainWindow/Preset").toInt() self.trajectoryWidget.analyseDialog.lastDirectory = settings.value( "ltTrajectoryWidget/lastDirectory" ).toString() self.projectWidget.lastDirectory = settings.value("ltProjectWidget/lastDirectory").toString() print "load preset", preset self.presetsWidget.setPreset(preset)
def __init__(self, player, parent=None): ''' player is an cvPlayer object to construct all signals ''' super(VideoWidget, self).__init__(parent) self.player = player player.videoSourceOpened.connect(self.videoSourceOpen) player.videoSourceClosed.connect(self.videoSourceClose) player.nextFrame.connect(self.nextFrame) self.signalCaptureFromFile.connect(player.captureFromFile) self.signalCaptureFromCam.connect(player.captureFromCam) # Actions self.actionPlay = createAction(self,"&Play", "", "media-playback-start", "", True) self.actionPlay.toggled.connect(player.play) player.playing.connect(self.actionPlay.setChecked) self.actionRun = createAction(self,"&Run", "", "fork", "", True) self.actionRun.toggled.connect(player.runTrough) player.running.connect(self.actionRun.setChecked) self.actionSeekToBegin= createAction(self,"To &begin", "", "media-skip-backward", "") self.actionSeekToBegin.triggered.connect(player.seekToBegin) self.actionSeekToEnd= createAction(self,"&To end", "", "media-skip-forward", "") self.actionSeekToEnd.triggered.connect(player.seekToEnd) self.actionRew = createAction(self,"&Rewind", "", "media-seek-backward", "") self.actionRew.triggered.connect(player.seekRew) self.actionFwd = createAction(self,"&Forward", "", "media-seek-forward", "") self.actionFwd.triggered.connect(player.seekFwd) self.actions = (self.actionPlay,self.actionRun,None, self.actionRew, self.actionFwd, self.actionSeekToBegin,self.actionSeekToEnd) # Video slider and position label layout1 = QtGui.QHBoxLayout() self.setLeftButton = QtGui.QPushButton('Set Left') layout1.addWidget(self.setLeftButton) self.setLeftButton.clicked.connect(player.setCurrentToLeftBorder) self.startFrameSpinBox = QtGui.QSpinBox() player.leftBorderSetted.connect(self.startFrameSpinBox.setValue) layout1.addWidget(self.startFrameSpinBox) self.startFrameSpinBox.valueChanged.connect(player.setLeftBorder) self.videoSlider = QtGui.QSlider(QtCore.Qt.Horizontal) layout1.addWidget(self.videoSlider) self.timeLabel = QtGui.QLabel('0') layout1.addWidget(self.timeLabel) self.endFrameSpinBox = QtGui.QSpinBox() layout1.addWidget(self.endFrameSpinBox) self.endFrameSpinBox.valueChanged.connect(player.setRightBorder) self.videoSlider.valueChanged.connect(self.videoSliderMove) self.videoSlider.sliderMoved.connect(player.seek) self.setRightButton = QtGui.QPushButton('Set Right') layout1.addWidget(self.setRightButton) self.setRightButton.clicked.connect(player.setCurrentToRightBorder) player.rightBorderSetted.connect(self.endFrameSpinBox.setValue) # layout2 = QtGui.QHBoxLayout() seekToBeginButton = ActionButton(self.actionSeekToBegin) layout2.addWidget(seekToBeginButton) rewButton = ActionButton(self.actionRew) layout2.addWidget(rewButton) playButton = ActionButton(self.actionPlay) layout2.addWidget(playButton) fwdButton = ActionButton(self.actionFwd) layout2.addWidget(fwdButton) seekToEndButton = ActionButton(self.actionSeekToEnd) layout2.addWidget(seekToEndButton) runTroughButton = ActionButton(self.actionRun) layout2.addWidget(runTroughButton) # Speed self.speedLabel = QtGui.QLabel('Speed:') layout2.addWidget(self.speedLabel) self.speedSpinBox = QtGui.QDoubleSpinBox() layout2.addWidget(self.speedSpinBox) self.speedLabel.setBuddy(self.speedSpinBox) self.speedSpinBox.valueChanged.connect(player.setSpeed) self.speedSpinBox.setMinimum(0.2) self.speedSpinBox.setMaximum(2.0) self.speedSpinBox.setValue(1.0) resetBordersButton = QtGui.QPushButton('Reset borders') resetBordersButton.clicked.connect(player.resetBorders) layout2.addWidget(resetBordersButton) layout2.addStretch() # Main Layout layout = QtGui.QVBoxLayout() layout.addLayout(layout1) layout.addLayout(layout2) self.setLayout(layout) # Creating sets to enable/disable GUI elements self.playSet = set([self.videoSlider, self.actionPlay, self.actionRew, self.actionFwd, self.actionRun, self.actionSeekToBegin, self.actionSeekToEnd]) self.setGuiEnabled(False)
def __init__(self, project, parent=None): ''' Constructor ''' super(ProjectWidget, self).__init__(parent) self.project = project self.lastDirectory = '.' self.videoList = QtGui.QTreeWidget() self.videoList.setColumnCount(1) self.videoList.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) layout1 = QtGui.QVBoxLayout() layout1.addWidget(self.videoList) self.setLayout(layout1) self.actionOpenProject = createAction(self,"&Open...", "", "project-open", "Open project") self.actionOpenProject.triggered.connect(self.openProject) self.actionSaveProject = createAction(self,"&Save", "", "document-save", "Save project") self.actionSaveProject.triggered.connect(self.saveProject) self.actionSaveProjectAs = createAction(self,"Save &as...", "", "document-save-as", "Save project as") self.actionSaveProjectAs.triggered.connect(self.saveProjectAs) self.actionCloseProject = createAction(self,"&Close", "", "project-development-close", "Close project") self.actionCloseProject.triggered.connect(self.closeProject) self.actionAddVideo = createAction(self,"&Add video...", "", "document-open", "Add video file to project") self.actionAddVideo.triggered.connect(self.addVideo) self.actionCaptureVideo = createAction(self,"&Capture video...", "", "camera-web", "") #self.actionCaptureVideo.triggered.connect(self.captureVideo) self.actionRemoveVideo = createAction(self,"Remove video", "", "dialog-close", "") self.actionRemoveVideo.triggered.connect(self.removeVideo) self.actionAnalyseProject = createAction(self, "&Analyse project", "", "", "Analyse whole files in project and make statistics") self.actionAnalyseProject.triggered.connect(self.analyseProject) self.actions = (self.actionOpenProject,self.actionSaveProject,self.actionSaveProjectAs,self.actionCloseProject,None, self.actionAddVideo,self.actionRemoveVideo,None,self.actionAnalyseProject) self.videoList.setHeaderLabel('Video Files') self.videoItems = {} self.project.signalVideoAdded.connect(self.videoAdded) self.project.signalVideoRemoved.connect(self.videoRemoved) #self.project.signalProjectUpdated.connect(self.updateProject) self.project.signalVideoSelected.connect(self.selectVideo) self.videoList.itemClicked.connect(self.changeItem) # Open and capture video buttons layout2=QtGui.QHBoxLayout() videoAddButton = ActionButton(self.actionAddVideo) layout2.addWidget(videoAddButton) #videoCaptureButton = ActionButton(self.actionCaptureVideo) #layout2.addWidget(videoCaptureButton) videoRemoveButton = ActionButton(self.actionRemoveVideo) layout2.addWidget(videoRemoveButton) layout1.addLayout(layout2)
def __init__(self, parent=None): ''' Constructor ''' super(ChambersWidget, self).__init__(parent) self.chambersManager = None # self.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) # Creating GUI elements layout = QtGui.QGridLayout() #chambersLabel = QtGui.QLabel('Chambers') #chambersLabel.setBuddy(self.chambersList) #layout.addWidget(chambersLabel, 0, 0, 1, 2) # list of chambers self.chamberWidgets = {} # self.selectedChamber = None self.chambersList = QtGui.QTableWidget() self.chambersList.horizontalHeader().setResizeMode(QtGui.QHeaderView.ResizeToContents); self.chambersList.setColumnCount(2) self.chambersList.setHorizontalHeaderLabels(['Sample name', 'Threshold']) self.chambersList.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) header = self.chambersList.verticalHeader() header.setClickable(True) header.sectionClicked.connect(self.chamberSelectionChanged) layout.addWidget(self.chambersList, 1, 0, 1, 2) # Actions self.actionSetChamber = createAction(self, "Set chamber", "", "distribute-horizontal-center", "", True) self.actionSetChamber.toggled.connect(self.setChamber) self.actionClearChamber = createAction(self, "Clear chamber", "", "process-stop", "") self.actionSetScale = createAction(self, "Set scale", "", "measure", "", True) self.actionSetScale.toggled.connect(self.setScale) self.actionRecordTrajectory = createAction(self, "&Record trajectory", "", "media-record", "", True) self.actionRecordTrajectory.toggled.connect(self.setRecordTrajectory) self.actions = (self.actionSetChamber, self.actionClearChamber, None, self.actionSetScale, None, self.actionRecordTrajectory) # Sample name label and edit sampleNameLabel = QtGui.QLabel('Sample name:') self.sampleNameEdit = QtGui.QLineEdit() sampleNameLabel.setBuddy(self.sampleNameEdit) layout.addWidget(sampleNameLabel, 2, 0) layout.addWidget(self.sampleNameEdit, 2, 1) # Add chamber button self.setChamberButton = ActionButton(self.actionSetChamber) layout.addWidget(self.setChamberButton, 3, 0) # Clear chamber button self.clearChamberButton = ActionButton(self.actionClearChamber) layout.addWidget(self.clearChamberButton, 3, 1) self.clearChamberButton.clicked.connect(self.chamberClear) # Set scale button self.scaleButton = ActionButton(self.actionSetScale) layout.addWidget(self.scaleButton, 4, 0) self.recordTrajectoryButton = ActionButton(self.actionRecordTrajectory) layout.addWidget(self.recordTrajectoryButton, 5, 0) ''' self.saveTrajectoryButton = ActionButton(self.actionSaveTrajectory) layout.addWidget(self.saveTrajectoryButton, 5, 1) ''' self.setLayout(layout) self.setEnabledActions()