示例#1
0
文件: gui.py 项目: NickCrews/boa
    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)
示例#2
0
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
示例#4
0
    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()
示例#5
0
 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()
示例#6
0
    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()
示例#7
0
 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)
示例#8
0
    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)
示例#9
0
    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