def _setupMenubar(self): """Make it so when we select units or click to open or save a recording or calibration, the right thing happens.""" self.menuBar.setNativeMenuBar(False) ag = QtGui.QActionGroup(self.mainwindow) ag.addAction(self.actionN) ag.addAction(self.actionKg) ag.addAction(self.actionLbs) ag.triggered.connect(self._unitsChanged) self.actionOpenCal.triggered.connect(self._openCalibration) self.actionSaveCalAs.triggered.connect(self._saveCalibration) self.actionOpenRec.triggered.connect(self._openRecording) self.actionSaveRecAs.triggered.connect(self._saveRecording)
def make_popup_menu(label, parent, menuList, selected, callBack): # Create popup menu aBar = QtGui.QToolBar() aButton = QtGui.QToolButton() aButton.setText(label) aButton.setPopupMode(QtGui.QToolButton.MenuButtonPopup) aMenu = QtGui.QMenu(parent) portMapping = QtCore.QSignalMapper(parent) portGroup = QtGui.QActionGroup(parent, exclusive=True) for i, item in enumerate(menuList): act = portGroup.addAction(QtGui.QAction(item, parent, checkable=True)) if i == selected: act.setChecked(True) aMenu.addAction(act) portMapping.setMapping(act, i) act.triggered.connect(portMapping.map) portMapping.mapped[int].connect(callBack) aButton.setMenu(aMenu) aBar.addWidget(aButton) return aBar
def getMenu(self): """ Create the menu """ if self.menu is None: self.menu = QtGui.QMenu() self.viewAll = QtGui.QAction("Vue d\'ensemble", self.menu) self.viewAll.triggered.connect(self.autoRange) self.menu.addAction(self.viewAll) self.leftMenu = QtGui.QMenu("Mode clic gauche") group = QtGui.QActionGroup(self) pan = QtGui.QAction(u'Déplacer', self.leftMenu) zoom = QtGui.QAction(u'Zoomer', self.leftMenu) self.leftMenu.addAction(pan) self.leftMenu.addAction(zoom) pan.triggered.connect(self.setPanMode) zoom.triggered.connect(self.setRectMode) pan.setCheckable(True) zoom.setCheckable(True) pan.setActionGroup(group) zoom.setActionGroup(group) self.menu.addMenu(self.leftMenu) self.menu.addSeparator() self.showT0 = QtGui.QAction(u'Afficher les marqueurs d\'amplitude', self.menu) self.showT0.triggered.connect(self.emitShowT0) self.showT0.setCheckable(True) self.showT0.setEnabled(False) self.menu.addAction(self.showT0) self.showS0 = QtGui.QAction( u'Afficher les marqueurs de Zone d\'intégration', self.menu) self.showS0.setCheckable(True) self.showS0.triggered.connect(self.emitShowS0) self.showS0.setEnabled(False) self.menu.addAction(self.showS0) return self.menu
def __init__(self, view): QtGui.QMenu.__init__(self) self.view = view self.valid = False ## tells us whether the ui needs to be updated self.setTitle("ViewBox options") self.viewAll = QtGui.QAction("View All", self) self.viewAll.triggered.connect(self.autoRange) self.addAction(self.viewAll) self.axes = [] self.ctrl = [] self.widgetGroups = [] self.dv = QtGui.QDoubleValidator(self) for axis in 'XY': m = QtGui.QMenu() m.setTitle("%s Axis" % axis) w = QtGui.QWidget() ui = AxisCtrlTemplate() ui.setupUi(w) a = QtGui.QWidgetAction(self) a.setDefaultWidget(w) m.addAction(a) self.addMenu(m) self.axes.append(m) self.ctrl.append(ui) wg = WidgetGroup(w) self.widgetGroups.append(w) connects = [ (ui.mouseCheck.toggled, 'MouseToggled'), (ui.manualRadio.clicked, 'ManualClicked'), (ui.minText.editingFinished, 'MinTextChanged'), (ui.maxText.editingFinished, 'MaxTextChanged'), (ui.autoRadio.clicked, 'AutoClicked'), (ui.autoPercentSpin.valueChanged, 'AutoSpinChanged'), (ui.linkCombo.currentIndexChanged, 'LinkComboChanged'), ] for sig, fn in connects: sig.connect(getattr(self, axis.lower()+fn)) ## exporting is handled by GraphicsScene now #self.export = QtGui.QMenu("Export") #self.setExportMethods(view.exportMethods) #self.addMenu(self.export) self.leftMenu = QtGui.QMenu("Mouse Mode") group = QtGui.QActionGroup(self) pan = self.leftMenu.addAction("3 button", self.set3ButtonMode) zoom = self.leftMenu.addAction("1 button", self.set1ButtonMode) pan.setCheckable(True) zoom.setCheckable(True) pan.setActionGroup(group) zoom.setActionGroup(group) self.mouseModes = [pan, zoom] self.addMenu(self.leftMenu) self.view.sigStateChanged.connect(self.viewStateChanged) self.updateState()
def initUI(self): #{ logging.debug('initUI()') ## Menubar menubar = self.menuBar() fMenu = menubar.addMenu('&File') aMenu = menubar.addMenu('&Actions') mMenu = menubar.addMenu('&Measurement') vMenu = menubar.addMenu('&View') menubar.addSeparator() hMenu = menubar.addMenu('&Help') # File menu fOpen = QtGui.QAction(QtGui.QIcon('open.wlz'), 'Open', self) fOpen.setShortcut('Ctrl+O') fOpen.setStatusTip('Open new Woolz file.') fOpen.triggered.connect(self.openFile) fMenu.addAction(fOpen) # fExit = QtGui.QAction(QtGui.QIcon('exit.png'), 'Exit', self) fExit.setShortcut('Ctrl+Q') fExit.setStatusTip('Exit Application') fExit.triggered.connect(self.quit) fMenu.addAction(fExit) # View menu vViewAll = QtGui.QAction('View All', self) vViewAll.setShortcut('Ctrl+A') vViewAll.setStatusTip('View All') vViewAll.triggered.connect(self.viewAll) vMenu.addAction(vViewAll) # Measurement menu curVal = mMenu.addAction('Value at cursor') curVal.setCheckable(True) curVal.triggered.connect(self.setTrackCurVal) roiMenu = mMenu.addMenu('&ROI') roiNone = roiMenu.addAction('None') roiLine = roiMenu.addAction('Line') roiRect = roiMenu.addAction('Rectangle') roiGrp = QtGui.QActionGroup(self) roiGrp.addAction(roiNone) roiGrp.addAction(roiLine) roiGrp.addAction(roiRect) roiNone.setCheckable(True) roiLine.setCheckable(True) roiRect.setCheckable(True) roiNone.setActionGroup(roiGrp) roiLine.setActionGroup(roiGrp) roiRect.setActionGroup(roiGrp) roiNone.triggered.connect(self.setROITypeNone) roiLine.triggered.connect(self.setROITypeLine) roiRect.triggered.connect(self.setROITypeRect) # Help menu self.about = AboutDialog(self.version) hAbout = QtGui.QAction('About', self) hAbout.setShortcut('Ctrl+b') hAbout.setStatusTip('About WlzView.') hAbout.triggered.connect(self.showAbout) hMenu.addAction(hAbout) # self.statusBar() self.setWindowTitle(self.prog) # w0 = QtGui.QWidget(self) self.setCentralWidget(w0) # grd0 = QtGui.QGridLayout(w0) grd0.setSpacing(8) gl0 = pg.GraphicsLayoutWidget() pw = pg.PlotWidget() ctl = QtGui.QFrame() grd0.addWidget(gl0, 0, 0, 8, 4) grd0.addWidget(pw, 0, 6, 2, 2) grd0.addWidget(ctl, 4, 6, 2, 2) # grd1 = QtGui.QGridLayout(ctl) grd1.setSpacing(8) gl1 = pg.GraphicsLayoutWidget() dst_lab = QtGui.QLabel('Distance') dst_sld = QtGui.QSlider(QtCore.Qt.Horizontal) dst_sld.setRange(0.0, 100.0) # TODO dst_sld.setValue(0.0) # TODO dst_val = QtGui.QLineEdit('0.0') pit_lab = QtGui.QLabel('Pitch') yaw_lab = QtGui.QLabel('Yaw') rol_lab = QtGui.QLabel('Roll') grd1.addWidget(dst_lab, 0, 0, 1, 1) dst_lab.setAlignment(QtCore.Qt.AlignLeft) grd1.addWidget(dst_sld, 0, 1, 1, 6) grd1.addWidget(dst_val, 0, 7, 1, 1) dst_val.setAlignment(QtCore.Qt.AlignRight) grd1.addWidget(pit_lab, 1, 0, 1, 1) grd1.addWidget(yaw_lab, 2, 0, 1, 1) grd1.addWidget(rol_lab, 3, 0, 1, 1) # self.img_view_box = gl0.addViewBox(0, 0) self.img_itm = pg.ImageItem() self.img_view_box.setAspectLocked() self.img_view_box.addItem(self.img_itm) self.img_view_box.invertY() # self.plt_itm = pw.getPlotItem() # if bool(self.args.infile): #{ logging.debug('file given on cmdline') self.addObjFromFile(self.args.infile) logging.debug('added file from cmdline') #} # self.show()
def __init__(self, view): QtGui.QMenu.__init__(self) self.view = weakref.ref( view ) ## keep weakref to view to avoid circular reference (don't know why, but this prevents the ViewBox from being collected) self.valid = False ## tells us whether the ui needs to be updated self.viewMap = weakref.WeakValueDictionary( ) ## weakrefs to all views listed in the link combos self.setTitle("ViewBox options") self.viewAll = QtGui.QAction("View All", self) self.viewAll.triggered.connect(self.autoRange) self.addAction(self.viewAll) self.axes = [] self.ctrl = [] self.widgetGroups = [] self.dv = QtGui.QDoubleValidator(self) for axis in 'XY': m = QtGui.QMenu() m.setTitle("%s Axis" % axis) w = QtGui.QWidget() ui = AxisCtrlTemplate() ui.setupUi(w) a = QtGui.QWidgetAction(self) a.setDefaultWidget(w) m.addAction(a) self.addMenu(m) self.axes.append(m) self.ctrl.append(ui) wg = WidgetGroup(w) self.widgetGroups.append(w) connects = [(ui.mouseCheck.toggled, 'MouseToggled'), (ui.manualRadio.clicked, 'ManualClicked'), (ui.minText.editingFinished, 'MinTextChanged'), (ui.maxText.editingFinished, 'MaxTextChanged'), (ui.autoRadio.clicked, 'AutoClicked'), (ui.autoPercentSpin.valueChanged, 'AutoSpinChanged'), (ui.linkCombo.currentIndexChanged, 'LinkComboChanged'), (ui.autoPanCheck.toggled, 'AutoPanToggled'), (ui.visibleOnlyCheck.toggled, 'VisibleOnlyToggled')] for sig, fn in connects: sig.connect(getattr(self, axis.lower() + fn)) self.ctrl[0].invertCheck.hide() ## no invert for x-axis self.ctrl[1].invertCheck.toggled.connect(self.yInvertToggled) ## exporting is handled by GraphicsScene now #self.export = QtGui.QMenu("Export") #self.setExportMethods(view.exportMethods) #self.addMenu(self.export) self.leftMenu = QtGui.QMenu("Mouse Mode") group = QtGui.QActionGroup(self) pan = self.leftMenu.addAction("3 button", self.set3ButtonMode) zoom = self.leftMenu.addAction("1 button", self.set1ButtonMode) pan.setCheckable(True) zoom.setCheckable(True) pan.setActionGroup(group) zoom.setActionGroup(group) self.mouseModes = [pan, zoom] self.addMenu(self.leftMenu) self.view().sigStateChanged.connect(self.viewStateChanged) self.updateState()
def __init__(self): QtGui.QMainWindow.__init__(self) #MGM(V0.2.1): This part is implementing multithreading techniques using Qtimer(0).In multithreaded applications, #you can use QTimer in any thread that has an event loop. A QTimer with a timeout of 0 will time out as soon as #all the events in the window system's event queue have been processed. This was used to do heavy work of #the annotations' calculations while providing a snappy user interface. Otherwise after printing is finished it #takes a couple of minutes to run QtGui.QApplication.instance().exec_() again. self.timer = QtCore.QTimer() #MGM(V0.2.1): To define a timer for using in self.print_plot() self.timer.timeout.connect(self.print_plot) #MGM(V0.2.1): To run self.print_plot() after timer emits timeout signal self.print_plot_Qtimer_Counter=0 #MGM(V0.2.1): This is a counter that is used in self.print_plot() to calculate the number of pages which have been printed. We can control Qtimer.stop by using this counter. #MGM(V0.2): These instance variables are defined for reading of the EDF files partially # self.timeaxis_start=0 #MGM(V0.2): The starting point on the time axis in the plot window self.timeaxis_end=10 #MGM(V0.2): The ending point on the time axis in the plot window self.time_readedf_start=0 #MGM(V0.2): The starting point for reading raw data records from EDF file. self.time_readedf_end=1 #MGM(V0.2): The ending point for reading raw data records from EDF file. In order than related function run for the first time, this value is chosen lesser than self.timeaxis_end. self._showLabels=False; self._needSave=False; self._script_dir=os.path.abspath(os.path.dirname(__file__)); # User Interface designed by designer # self.ui=Ui_MainWindow() self.ui.setupUi(self) # toolbar # MGM(V0.2.2): This part has been edited for creating the stand-alone executable. As after installing # setup.exe, the application can be lunched in every folder, we should use a address which # is not relative. self.viewGroup = QtGui.QActionGroup(self); self.panAction = QtGui.QAction(QtGui.QIcon(self._script_dir+'/resource/pan_mode.png'), 'Pan', self) self.zoomAction = QtGui.QAction(QtGui.QIcon(self._script_dir+'/resource/zoom_mode.png'), 'Zoom', self) self.editAction = QtGui.QAction(QtGui.QIcon(self._script_dir+'/resource/edit_mode.png'), 'Edit', self) self.nextAction = QtGui.QAction(QtGui.QIcon(self._script_dir+'/resource/next.png'), 'Next', self) self.backAction = QtGui.QAction(QtGui.QIcon(self._script_dir+'/resource/prev.png'), 'Back', self) self.nextAction.setShortcut('Right') self.backAction.setShortcut('Left') self.panAction.setCheckable(True) self.panAction.setChecked(True); self.zoomAction.setCheckable(True) self.editAction.setCheckable(True) self.panAction.setDisabled(True) self.zoomAction.setDisabled(True) self.editAction.setDisabled(True) self.nextAction.setDisabled(True) self.backAction.setDisabled(True) # connect to functions # self.panAction.triggered.connect(self.setPan) self.zoomAction.triggered.connect(self.setZoom) self.editAction.triggered.connect(self.setEdit) self.nextAction.triggered.connect(self.goNext); self.backAction.triggered.connect(self.goBack); self.ui.plotWidget.sigTimeRangeChanged.connect(self.EDFDynamicPlotter) #MGM(V0.2): When the time range in the plot window is changing by moving slider or changing other features this signal will emit. #connect changed signal from EditPlotWidget # self.ui.plotWidget.sigDocChanged.connect(self.onDocChange) self.ui.plotWidget.sigConfirmed.connect(self.onConfirm) self.ui.plotWidget.sigRightAnnotationExist.connect(self.manageNextAnnotationButton) self.ui.plotWidget.sigLeftAnnotationExist.connect(self.manageBackAnnotationButton) self.viewGroup.addAction(self.panAction) self.viewGroup.addAction(self.zoomAction) self.viewGroup.addAction(self.editAction) self.toolbar=QtGui.QToolBar() self.toolbar.addAction(self.panAction) self.toolbar.addAction(self.zoomAction) self.toolbar.addAction(self.editAction) spacer = QtGui.QWidget() spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) self.toolbar.addWidget(spacer) self.toolbar.addAction(self.backAction) self.toolbar.addAction(self.nextAction) # MGM(V0.2.2): This part has been edited for creating the stand-alone executable. As after installing # setup.exe, the application can be lunch in every folder, we should use a address which # is not relative. self.confirmAction = QtGui.QAction(QtGui.QIcon(self._script_dir+'/resource/confirm.png'), 'Confirm', self) self.confirmAction.setDisabled(True) self.cancelAction = QtGui.QAction(QtGui.QIcon(self._script_dir+'/resource/cancel.png'), 'Cancel', self) self.cancelAction.setDisabled(True) self.saveAction = QtGui.QAction(QtGui.QIcon(self._script_dir+'/resource/save.png'), 'Save', self) self.saveAction.setDisabled(True) self.saveAction.triggered.connect(self.savePressed) self.confirmAction.triggered.connect(self.confirmPressed) self.cancelAction.triggered.connect(self.cancelPressed) spacer = QtGui.QWidget() spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) self.toolbar.addWidget(spacer) self.toolbar.addAction(self.cancelAction) self.toolbar.addAction(self.confirmAction) self.toolbar.addAction(self.saveAction) self.addToolBar(self.toolbar) # Project manager : a class that contains all methods to manage(create,read,interpret) a project # self.pmanager = None; self.project_directory=[]; self.status="project_close" self.current_user=""; # current active username self.current_annotation_key=None; #connect signals to slots # # actionNew self.ui.actionNew.setDisabled(True) #actionOpen self.ui.actionOpen.triggered.connect(self.open_project) # MGM(V0.2.1 ): : When print option in menu is pressed by user, print_plot() will be called. self.ui.actionPrint.triggered.connect(self.print_plot) #MGM(V0.2.1) # actionExit self.ui.actionExit.triggered.connect(self.exit) #amplitude scale self.ui.amplitudeSpinBox.setValue(0.00) self.ui.amplitudeSpinBox.setMinimum(1) self.ui.amplitudeSpinBox.setMaximum(5000) self.ui.amplitudeSpinBox.valueChanged.connect(self.ui.plotWidget.changeAmplitudescale) self.ui.timeSpinBox.setValue(10.0) #MGM(V0.2): The parameter of setValue changed from 0 to 10.00 self.ui.timeSpinBox.setMinimum(1) self.ui.timeSpinBox.setMaximum(300) self.ui.timeSpinBox.valueChanged.connect(self.ui.plotWidget.setTimescale) self.ui.showLabelButton.pressed.connect(self.showLabelPressed) self.ui.markFinishButton.pressed.connect(self.markFinishPressed) self.ui.markFinishButton.setDisabled(True)
def __init__(self): """ Frame of GUI =========================== | ToolBar____ ____ | |_______|tab1|tab2|_______| | | | | |plot| | graph1 | |list| |------------------| |----|<| | |data| | graph2 | |list| | | =========================== """ super(MainWindow, self).__init__() self.log_data_list = None self.log_file_name = None self.data_dict = None self.log_info_data = None self.log_params_data = None self.log_changed_params = [] self.main_widget = QtGui.QWidget(self) self.mainlayout = QtGui.QHBoxLayout() self.main_widget.setLayout(self.mainlayout) # ToolBar self.toolbar = self.addToolBar('FileManager') self.basic_tool_group = QtGui.QActionGroup(self) ## load log file self.loadfile_action = QtGui.QAction( QtGui.QIcon(get_source_name('icons/open.gif')), 'Open log file', self) self.loadfile_action.setShortcut('Ctrl+O') self.loadfile_action.triggered.connect(self.callback_open_log_file) self.toolbar.addAction(self.loadfile_action) ## plot quadrotor in 3d graph self.show_quadrotor_3d = QtGui.QAction( QtGui.QIcon(get_source_name('icons/quadrotor.gif')), 'show 3d viewer', self) self.show_quadrotor_3d.setShortcut('Ctrl+Shift+Q') self.show_quadrotor_3d.triggered.connect(self.callback_show_quadrotor) self.toolbar.addAction(self.show_quadrotor_3d) ## show quadrotor info self.show_info = QtGui.QAction( QtGui.QIcon(get_source_name('icons/info.gif')), 'show log info', self) self.show_info.setShortcut('Ctrl+I') self.show_info.triggered.connect(self.callback_show_info_pane) self.toolbar.addAction(self.show_info) self.info_pane_showed = False ## show quadrotor param self.show_params = QtGui.QAction( QtGui.QIcon(get_source_name('icons/params.gif')), 'show params', self) self.show_params.setShortcut('Ctrl+P') self.show_params.triggered.connect(self.callback_show_parameters) self.toolbar.addAction(self.show_params) self.params_pane_showed = False self.basic_tool_group.addAction(self.loadfile_action) self.basic_tool_group.addAction(self.show_quadrotor_3d) self.basic_tool_group.addAction(self.show_info) self.basic_tool_group.addAction(self.show_params) ## show some analysis graph self.analysis_graph_list = QtGui.QComboBox() #### refer: flight review self.graph_predefined = [ 'XY_Estimation', 'Altitude Estimate', 'Roll Angle', 'Roll Angle Rate', 'Pitch Angle', 'Pitch Angle Rate', 'Yaw Angle', 'Yaw Angle Rate', 'Local Position X', 'Local Position Y', 'Local Position Z', 'Velocity', 'Manual Control Input', 'Actuator Controls 0', 'Actuation Outputs(Main)', 'Distance Sensor', 'GPS Uncertainty', 'CPU & RAM', 'Power' ] self.analysis_graph_list.addItems(self.graph_predefined) self.toolbar.addWidget(self.analysis_graph_list) # Left plot item widget self.plot_data_frame = QtGui.QFrame(self) self.plot_data_frame.setFrameShape(QtGui.QFrame.StyledPanel) # self.plot_data_layout_H = QtGui.QHBoxLayout(self.plot_data_frame) self.plot_data_layout_V = QtGui.QVBoxLayout(self.plot_data_frame) ## Data Plotting [id, filesystem, ] self.data_plotting = [] ### There exist a Default graph self.line_ID = 0 lbl_ploting_data = QtGui.QLabel('Data Plotting') self.plotting_data_tableView = TableView(self.plot_data_frame) self.plotting_data_tableView.setEditTriggers( QtGui.QAbstractItemView.DoubleClicked | QtGui.QAbstractItemView.SelectedClicked) self.plotting_data_tableView.setSortingEnabled(False) self.plotting_data_tableView.horizontalHeader().setStretchLastSection( True) self.plotting_data_tableView.resizeColumnsToContents() self.plotting_data_tableView.setColumnCount(4) self.plotting_data_tableView.setColumnWidth(0, 200) self.plotting_data_tableView.setColumnWidth(1, 40) self.plotting_data_tableView.setColumnWidth(2, 50) self.plotting_data_tableView.setHorizontalHeaderLabels( ['Label', 'Color', 'Visible', 'Marker']) self.id = 0 lbl_ploting_data.setBuddy(self.plotting_data_tableView) self.plot_data_layout_V.addWidget(lbl_ploting_data) self.plot_data_layout_V.addWidget(self.plotting_data_tableView) edit_layout = QtGui.QHBoxLayout() self.delete_btn = QtGui.QPushButton('Delete') self.delete_btn.clicked.connect(self.callback_del_plotting_data) self.clear_btn = QtGui.QPushButton('Clear') self.clear_btn.clicked.connect(self.callback_clear_plotting_data) edit_layout.addWidget(self.clear_btn) edit_layout.addWidget(self.delete_btn) self.plot_data_layout_V.addLayout(edit_layout) ## Data in the log file self.list_data_frame = QtGui.QFrame(self) self.list_data_frame.setMinimumWidth(400) self.list_data_frame.setMaximumWidth(600) self.list_data_frame.resize(400, 500) self.list_data_frame.setFrameShape(QtGui.QFrame.StyledPanel) self.list_data_layout = QtGui.QVBoxLayout(self.list_data_frame) ### line to search item self.choose_item_lineEdit = QtGui.QLineEdit(self.list_data_frame) self.choose_item_lineEdit.setPlaceholderText('filter by data name') self.choose_item_lineEdit.textChanged.connect(self.callback_filter) ### tree to show data to plot self.item_list_treeWidget = QtGui.QTreeWidget(self.list_data_frame) self.item_list_treeWidget.clear() self.item_list_treeWidget.setColumnCount(3) self.item_list_treeWidget.setColumnWidth(0, 160) self.item_list_treeWidget.setHeaderLabels( ['Flight Data', 'Type', 'Length']) self.item_list_treeWidget.itemDoubleClicked.connect( self.callback_tree_double_clicked) self.item_list_treeWidget.resizeColumnToContents(2) self.list_data_layout.addWidget(self.choose_item_lineEdit) self.list_data_layout.addWidget(self.item_list_treeWidget) # Right plot item self.graph_frame = QtGui.QFrame(self) self.default_tab = TabWidget(self.graph_frame) self.graph_frame.setFrameShape(QtGui.QFrame.StyledPanel) self.animation_layout = QtGui.QVBoxLayout(self.graph_frame) ## quadrotor 3d self.quadrotor_win = QuadrotorWin(self) self.quadrotor_win.closed.connect(self.quadrotor_win_closed_event) self.quadrotor_win.hide() self.first_load = True self.quadrotor_widget_isshowed = False ## default plot self.default_graph_widget = pg.GraphicsLayoutWidget() self.default_tab.addTab(self.default_graph_widget, 'custom') ### a hidable ROI region self.detail_graph = self.default_graph_widget.addPlot(row=0, col=0) self.detail_graph.setAutoVisible(True) self.detail_graph.hide() ### main graph to plot curves self.main_graph = self.default_graph_widget.addPlot(row=1, col=0) self.main_graph.showGrid(x=True, y=True) self.main_graph.keyPressEvent = self.keyPressed self.deletePressed.connect(self.callback_del_plotting_data) self.main_graph.scene().sigMouseClicked.connect( self.callback_graph_clicked) self.main_graph.addLegend() ROI_action = QtGui.QAction('show/hide ROI graph', self.main_graph) ROI_action.triggered.connect(self.callback_ROI_triggered) self.main_graph.scene().contextMenu.append(ROI_action) self.ROI_region = pg.LinearRegionItem() self.ROI_region.setZValue(10) self.ROI_region.hide() self.ROI_showed = False def update(): self.ROI_region.setZValue(10) minX, maxX = self.ROI_region.getRegion() self.detail_graph.setXRange(minX, maxX, padding=0) self.ROI_region.sigRegionChanged.connect(update) def updateRegion(window, viewRange): rgn = viewRange[0] self.ROI_region.setRegion(rgn) self.detail_graph.sigRangeChanged.connect(updateRegion) self.main_graph.addItem(self.ROI_region, ignoreBounds=True) ## vertical line self.vLine = pg.InfiniteLine(angle=90, movable=False) self.vLine.hide() self.main_graph.addItem(self.vLine, ignoreBounds=True) self.vLine_detail = pg.InfiniteLine(angle=90, movable=False) self.vLine_detail.hide() self.detail_graph.addItem(self.vLine_detail, ignoreBounds=True) ## flag whether there is a curve clicked after last clicked event self.curve_clicked = False self.curve_highlighted = [] self.animation_layout.addWidget(self.default_tab) ## time line self.time_line_frame = QtGui.QFrame(self) self.time_line_frame.setMaximumHeight(45) self.time_line_frame.setMinimumHeight(45) self.time_line_layout = QtGui.QHBoxLayout(self.time_line_frame) time_line_lbl = QtGui.QLabel('x') time_line_lbl.setToolTip('set play speed') speed_combo = QtGui.QComboBox() speed_combo.addItems(['1', '2', '4', '8']) self.speed_factor = 500 self.time_line_layout.addWidget(time_line_lbl) self.time_line_layout.addWidget(speed_combo) speed_combo.currentIndexChanged.connect( self.callback_speed_combo_indexChanged) self.current_factor = 500 / 1 self.time_line_button_play = QtGui.QPushButton(self.time_line_frame) self.time_line_button_play.setEnabled(False) self.time_line_button_play.setIcon( QtGui.QIcon(get_source_name("icons/play.jpg"))) self.time_line_play = False self.time_line_button_play.clicked.connect(self.callback_play_clicked) self.time_line_button_stop = QtGui.QPushButton(self.time_line_frame) self.time_line_button_stop.setEnabled(False) self.time_line_button_stop.setIcon( QtGui.QIcon(get_source_name("icons/stop.jpg"))) self.time_line_button_stop.clicked.connect(self.callback_stop_clicked) self.time_line_layout.addWidget(self.time_line_button_play) self.time_line_layout.addWidget(self.time_line_button_stop) self.time_slider = QtGui.QSlider(QtCore.Qt.Horizontal) self.time_slider.setRange(0, 100) #### index for time_stamp self.time_line_layout.addWidget(self.time_slider) ## timer self.timer = QtCore.QTimer() self.timer.timeout.connect(self.animation_update) self.current_time = 0 self.dt = 50 self.splitter1 = QtGui.QSplitter(QtCore.Qt.Vertical) self.splitter1.addWidget(self.plot_data_frame) self.splitter1.addWidget(self.list_data_frame) self.splitter2 = QtGui.QSplitter(QtCore.Qt.Vertical) self.splitter2.addWidget(self.graph_frame) self.splitter2.addWidget(self.time_line_frame) self.splitter3 = QtGui.QSplitter(QtCore.Qt.Horizontal) self.splitter3.addWidget(self.splitter1) self.splitter3.addWidget(self.splitter2) self.mainlayout.addWidget(self.splitter3) self.setCentralWidget(self.main_widget) self.setGeometry(200, 200, 1000, 800) self.setWindowTitle("pyFlightAnalysis") self.quadrotorStateChanged.connect( self.quadrotor_win.callback_update_quadrotor_pos) self.quadrotorStateReseted.connect( self.quadrotor_win.callback_quadrotor_state_reset)
def getMenu(self): """ Create the menu """ if self.menu is None: self.menu = QtGui.QMenu() settings = QtGui.QAction("Settings", self.menu) self.menu.addAction(settings) settings.triggered.connect(self.openSettings) self.zoomMenu = QtGui.QMenu("Zoom") zoomGroup = QtGui.QActionGroup(self) viewAll = QtGui.QAction("View all", self.zoomMenu) viewAll.triggered.connect(self.autoRange) zoomIn = QtGui.QAction(u'Zoom in', self.zoomMenu) zoomIn.triggered.connect(self.zoomIn) zoomOut = QtGui.QAction(u'Zoom out', self.zoomMenu) zoomOut.triggered.connect(self.zoomOut) self.zoomMenu.addAction(viewAll) self.zoomMenu.addAction(zoomIn) self.zoomMenu.addAction(zoomOut) self.LMBMenu = QtGui.QMenu("Left mouse button mode") lmbGroup = QtGui.QActionGroup(self) horizontalLine = QtGui.QAction(u'Line', self.LMBMenu) value = QtGui.QAction(u'Value', self.LMBMenu) pan = QtGui.QAction(u'Pan', self.LMBMenu) zoomBox = QtGui.QAction(u'Zoom box', self.LMBMenu) self.LMBMenu.addAction(horizontalLine) self.LMBMenu.addAction(value) self.LMBMenu.addAction(pan) self.LMBMenu.addAction(zoomBox) horizontalLine.triggered.connect(self.setLineMode) pan.triggered.connect(self.setPanMode) value.triggered.connect(self.setValueMode) zoomBox.triggered.connect(self.setRectMode) horizontalLine.setCheckable(True) pan.setCheckable(True) value.setCheckable(True) zoomBox.setCheckable(True) horizontalLine.setActionGroup(lmbGroup) pan.setActionGroup(lmbGroup) value.setActionGroup(lmbGroup) zoomBox.setActionGroup(lmbGroup) self.menu.addMenu(self.LMBMenu) self.menu.addMenu(self.zoomMenu) self.menu.addSeparator() self.showT0 = QtGui.QAction(u'Afficher les marqueurs d\'amplitude', self.menu) self.showT0.triggered.connect(self.emitShowT0) self.showT0.setCheckable(True) self.showT0.setEnabled(False) self.menu.addAction(self.showT0) self.showS0 = QtGui.QAction( u'Afficher les marqueurs de Zone d\'intégration', self.menu) self.showS0.setCheckable(True) self.showS0.triggered.connect(self.emitShowS0) self.showS0.setEnabled(False) self.menu.addAction(self.showS0) return self.menu