Example #1
0
    def _handle_record_clicked(self):
        if self._recording:
            self._timeline.toggle_recording()
            return
        # TODO verify master is still running
        filename = QFileDialog.getSaveFileName(
            self, self.tr('Select prefix for new Bag File'), '.',
            self.tr('Bag files {.bag} (*.bag)'))
        if filename[0] != '':
            prefix = filename[0].strip()

            # Get filename to record to
            record_filename = time.strftime('%Y-%m-%d-%H-%M-%S.bag',
                                            time.localtime(time.time()))
            if prefix.endswith('.bag'):
                prefix = prefix[:-len('.bag')]
            if prefix:
                record_filename = '%s_%s' % (prefix, record_filename)

            rospy.loginfo('Recording to %s.' % record_filename)

            #TODO Implement recording of topic subsets, regex limiting and by number of messages per topic
            self.load_button.setEnabled(False)
            self._recording = True
            self._timeline.record_bag(record_filename)
Example #2
0
 def saveDatabaseAs(self, unused=None):
     self.databaseFilename = QFileDialog.getSaveFileName(self.widget, caption="Save track database", filter="*.tracks", directory=self.defaultDatabaseDirectory)[0]
     if self.databaseFilename:
         if not self.databaseFilename.endswith(".tracks"):
             self.databaseFilename += ".tracks"
         self._onDatabaseFilenameChanged()
         self.saveDatabase()
Example #3
0
    def _on_record_settings_selected(self, all_topics, selected_topics,
                                     selected_scenario):
        # TODO verify master is still running
        import inspect
        filepath = os.path.dirname(
            os.path.abspath(inspect.getfile(
                inspect.currentframe()))) + "/log/save_record.log"
        current_directory = self.get_current_opened_directory(filepath)
        filename = QFileDialog.getSaveFileName(
            self, self.tr('Select prefix for new Bag File'), current_directory,
            self.tr('Bag files {.bag} (*.bag)'))
        if filename[0] != '':
            with open(filepath, "w") as f:
                f.write(filename[0])
            record_filename = filename[0].strip()
            if not record_filename.endswith('.bag'):
                record_filename = record_filename + ".bag"
            # # Get filename to record to
            # record_filename = time.strftime('%Y-%m-%d-%H-%M-%S.bag', time.localtime(time.time()))
            # if prefix.endswith('.bag'):
            #     prefix = prefix[:-len('.bag')]
            # if prefix:
            #     record_filename = prefix

            rospy.loginfo('Recording to %s.' % record_filename)
            self.start_recording(record_filename, selected_scenario,
                                 selected_topics)
Example #4
0
 def _handle_save_clicked(self, checked):
     filename = QFileDialog.getSaveFileName(
         self, 'Save to File', '.', self.tr('rqt_console msg file {.csv} (*.csv)'))
     if filename[0] != '':
         filename = filename[0]
         if filename[-4:] != '.csv':
             filename += '.csv'
         try:
             handle = open(filename, 'w')
         except IOError as e:
             qWarning(str(e))
             return
         try:
             handle.write(';'.join(MessageDataModel.columns) + '\n')
             for index in range(self._proxy_model.rowCount()):
                 row = self._proxy_model.mapToSource(self._proxy_model.index(index, 0)).row()
                 msg = self._model._messages[row]
                 data = {}
                 data['message'] = msg.message.replace('"', '\\"')
                 data['severity'] = str(msg.severity)
                 data['node'] = msg.node
                 data['stamp'] = str(msg.stamp[0]) + '.' + str(msg.stamp[1]).zfill(9)
                 data['topics'] = ','.join(msg.topics)
                 data['location'] = msg.location
                 line = []
                 for column in MessageDataModel.columns:
                     line.append('"%s"' % data[column])
                 handle.write(';'.join(line) + '\n')
         except Exception as e:
             qWarning('File save failed: %s' % str(e))
             return False
         finally:
             handle.close()
         return True
 def _handle_save(self):
     """Callback for when the save button is pressed."""
     result = QFileDialog.getSaveFileName(self, "Save File", ".",
                                          "Minute files (*.txt)")
     file_name = result[0]
     if file_name:
         self._save(file_name)
 def _handle_save_clicked(self, checked):
     filename = QFileDialog.getSaveFileName(self, 'Save to File', '.', self.tr('rqt_console msg file {.csv} (*.csv)'))
     if filename[0] != '':
         filename = filename[0]
         if filename[-4:] != '.csv':
             filename += '.csv'
         try:
             handle = open(filename, 'w')
         except IOError as e:
             qWarning(str(e))
             return
         try:
             handle.write(';'.join(MessageDataModel.columns) + '\n')
             for index in range(self._proxy_model.rowCount()):
                 row = self._proxy_model.mapToSource(self._proxy_model.index(index, 0)).row()
                 msg = self._model._messages[row]
                 data = {}
                 data['message'] = msg.message.replace('"', '\\"')
                 data['severity'] = str(msg.severity)
                 data['node'] = msg.node
                 data['stamp'] = str(msg.stamp[0]) + '.' + str(msg.stamp[1]).zfill(9)
                 data['topics'] = ','.join(msg.topics)
                 data['location'] = msg.location
                 line = []
                 for column in MessageDataModel.columns:
                     line.append('"%s"' % data[column])
                 handle.write(';'.join(line) + '\n')
         except Exception as e:
             qWarning('File save failed: %s' % str(e))
             return False
         finally:
             handle.close()
         return True
Example #7
0
	def button_save_as_pressed(self):
		(name,filt) = QFileDialog.getSaveFileName(caption='Save Movement',filter="YAML (*.yaml)")
		self.loaded_movement.filename = name

		if self.loaded_movement.filename:
			self.button_save_pressed()
		else:
			rospy.logerr("No filename specified")
    def _save_image(self):
        file_name, _ = QFileDialog.getSaveFileName(self._widget, self.tr('Save as image'), 'rospackgraph.png', self.tr('Image (*.bmp *.jpg *.png *.tiff)'))
        if file_name is None or file_name == '':
            return

        img = QImage((self._scene.sceneRect().size() * 2.0).toSize(), QImage.Format_ARGB32_Premultiplied)
        painter = QPainter(img)
        painter.setRenderHint(QPainter.Antialiasing)
        self._scene.render(painter)
        painter.end()
        img.save(file_name)
    def _save_dot(self):
        file_name, _ = QFileDialog.getSaveFileName(self._widget, self.tr('Save as DOT'), 'rosgraph.dot', self.tr('DOT graph (*.dot)'))
        if file_name is None or file_name == '':
            return

        handle = QFile(file_name)
        if not handle.open(QIODevice.WriteOnly | QIODevice.Text):
            return

        handle.write(self._current_dotcode)
        handle.close()
    def _save_image(self):
        file_name, _ = QFileDialog.getSaveFileName(self._widget, self.tr('Save as image'), 'rosgraph.png', self.tr('Image (*.bmp *.jpg *.png *.tiff)'))
        if file_name is None or file_name == '':
            return

        img = QImage((self._scene.sceneRect().size() * 2.0).toSize(), QImage.Format_ARGB32_Premultiplied)
        painter = QPainter(img)
        painter.setRenderHint(QPainter.Antialiasing)
        self._scene.render(painter)
        painter.end()
        img.save(file_name)
    def _save_dot(self):
        file_name, _ = QFileDialog.getSaveFileName(self._widget, self.tr('Save as DOT'), 'rospackgraph.dot', self.tr('DOT graph (*.dot)'))
        if file_name is None or file_name == '':
            return

        handle = QFile(file_name)
        if not handle.open(QIODevice.WriteOnly | QIODevice.Text):
            return

        handle.write(self._current_dotcode)
        handle.close()
Example #12
0
    def _handle_save_clicked(self):
        # Get the bag name to record to, prepopulating with a file name based on the current date/time
        proposed_filename = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time()))
        filename = QFileDialog.getSaveFileName(
            self, self.tr('Save selected region...'), proposed_filename, self.tr('Bag files {.bag} (*.bag)'))[0]
        if filename != '':
            filename = filename.strip()
            if not filename.endswith('.bag'):
                filename += '.bag'

            # Copy the highlighted region
            self._timeline.copy_region_to_bag(filename)
    def save_svg_to_file(self):
        file_name, _ = QFileDialog.getSaveFileName(self._widget, self.tr("Save as SVG"), "stackmachine.svg",
                                                   self.tr("Scalable Vector Graphic (*.svg)"))

        if file_name is not None and file_name != "":
            generator = QSvgGenerator()
            generator.setFileName(file_name)
            generator.setSize((self._scene.sceneRect().size() * 2.0).toSize())

            painter = QPainter(generator)
            painter.setRenderHint(QPainter.Antialiasing)
            self._scene.render(painter)
            painter.end()
Example #14
0
    def _on_export_perspective(self):
        file_name, _ = QFileDialog.getSaveFileName(
            self._menu_manager.menu, self.tr('Export perspective to file'),
            self._current_perspective + '.perspective',
            self.tr('Perspectives (*.perspective)'))
        if file_name is None or file_name == '':
            return

        # trigger save of perspective before export
        self._callback = self._on_export_perspective_continued
        self._callback_args = [file_name]
        self.save_settings_signal.emit(self._global_settings,
                                       self._perspective_settings)
    def _save_svg(self):
        file_name, _ = QFileDialog.getSaveFileName(self._widget, self.tr('Save as SVG'), 'rosgraph.svg', self.tr('Scalable Vector Graphic (*.svg)'))
        if file_name is None or file_name == '':
            return

        generator = QSvgGenerator()
        generator.setFileName(file_name)
        generator.setSize((self._scene.sceneRect().size() * 2.0).toSize())

        painter = QPainter(generator)
        painter.setRenderHint(QPainter.Antialiasing)
        self._scene.render(painter)
        painter.end()
    def _save_svg(self):
        file_name, _ = QFileDialog.getSaveFileName(self._widget, self.tr('Save as SVG'), 'rospackgraph.svg', self.tr('Scalable Vector Graphic (*.svg)'))
        if file_name is None or file_name == '':
            return

        generator = QSvgGenerator()
        generator.setFileName(file_name)
        generator.setSize((self._scene.sceneRect().size() * 2.0).toSize())

        painter = QPainter(generator)
        painter.setRenderHint(QPainter.Antialiasing)
        self._scene.render(painter)
        painter.end()
Example #17
0
 def _handle_save(self):
     result = QFileDialog.getSaveFileName(self, 'Save File', '.', 'Minute files (*.txt)')
     file_name = result[0]
     if file_name:
         if file_name[-4:] != '.txt':
             file_name += '.txt'
         try:
             with open(file_name, 'w') as f:
                 f.write(str(self._model))
         except IOError as e:
             rospy.logwarn('Failed to open file: {0}'.format(e))
             return
         else:
             rospy.loginfo('Successfully written to file {0}'.format(file_name))
Example #18
0
 def press_select_yaml(self):
     options = QFileDialog.Options()
     options |= QFileDialog.DontConfirmOverwrite
     select_yaml_caption = "Select YAML configuration file"
     select_yaml_directory = ""
     select_yaml_file_filter = "YAML Files (*.yaml);;All Files (*)"
     yaml_file, file_filter = QFileDialog.getSaveFileName(
         self._widget,
         caption=select_yaml_caption,
         directory=select_yaml_directory,
         filter=select_yaml_file_filter,
         options=options)
     # yaml_file, file_filter = QFileDialog.getOpenFileName(self._widget, caption=select_yaml_caption, directory=select_yaml_directory, filter=select_yaml_file_filter, options=options)
     rospy.loginfo('%s::%s: selected file %s' %
                   (self._name, self.get_function_name(), yaml_file))
     self.set_yaml(yaml_file)
Example #19
0
 def handle_select(self):
     # TODO(lucasw) have a parameter define which kind of dialog to use
     file_dir = self.current_line_edit.text()
     new_file_dir = None
     if self.mode == "file_save":
         new_file_dir, tmp = QFileDialog.getSaveFileName(caption="Select a save file",
                                                         directory=os.path.dirname(file_dir))
     elif self.mode == "file_open":
         new_file_dir, tmp = QFileDialog.getOpenFileName(caption="Select a file",
                                                         directory=os.path.dirname(file_dir))
     else:  # elif mode == "dir":
         new_file_dir = QFileDialog.getExistingDirectory(caption="Select a directory",
                                                         directory=os.path.dirname(file_dir))
     if new_file_dir is not None and new_file_dir != "":
         self.current_line_edit.setText(new_file_dir)
         self.publish()
Example #20
0
    def _on_record_settings_selected(self, all_topics, selected_topics):
        # TODO verify master is still running

        # Get the bag name to record to, prepopulating with a file name based on the current date/time
        proposed_filename = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time()))
        filename = QFileDialog.getSaveFileName(
            self, self.tr('Select name for new bag'), proposed_filename, self.tr('Bag files {.bag} (*.bag)'))[0]

        if filename != '':
            filename = filename.strip()
            if not filename.endswith('.bag'):
                filename += ".bag"

            # Begin recording
            self.load_button.setEnabled(False)
            self._recording = True
            self._timeline.record_bag(filename, all_topics, selected_topics)
    def _on_record_settings_selected(self, all_topics, selected_topics):
        # TODO verify master is still running
        filename = QFileDialog.getSaveFileName(self, self.tr('Select prefix for new Bag File'), '.', self.tr('Bag files {.bag} (*.bag)'))
        if filename[0] != '':
            prefix = filename[0].strip()

            # Get filename to record to
            record_filename = time.strftime('%Y-%m-%d-%H-%M-%S.bag', time.localtime(time.time()))
            if prefix.endswith('.bag'):
                prefix = prefix[:-len('.bag')]
            if prefix:
                record_filename = '%s_%s' % (prefix, record_filename)

            rospy.loginfo('Recording to %s.' % record_filename)

            self.load_button.setEnabled(False)
            self._recording = True
            self._timeline.record_bag(record_filename, all_topics, selected_topics)
Example #22
0
    def save_graph(self):
        """Save the current dot graph as an image."""
        if self.graph is None:
            return

        ret = QFileDialog.getSaveFileName(self._widget, "Save graph as",
                                          "untitled.png", self.image_filter,
                                          "*.png")
        if ret[0]:
            _, extension = os.path.splitext(ret[0])
            if extension == ".svg":
                gen = QSvgGenerator()
                gen.setFileName(ret[0])
                gen.setSize(self._widget.xdot_widget.size())
                gen.setViewBox(self._widget.xdot_widget.rect())
                self._widget.xdot_widget.grab().save(ret[0])
                self._widget.xdot_widget.render(gen)
            else:
                self._widget.xdot_widget.grab().save(ret[0])
Example #23
0
    def _on_export_perspective(self):
        save_file_name = os.path.join(
            self._file_path,
            self._current_perspective.lstrip(self.HIDDEN_PREFIX))
        suffix = '.perspective'
        if not save_file_name.endswith(suffix):
            save_file_name += suffix
        file_name, _ = QFileDialog.getSaveFileName(
            self._menu_manager.menu, self.tr('Export perspective to file'),
            save_file_name, self.tr('Perspectives (*.perspective)'))
        if file_name is None or file_name == '':
            return
        self._file_path = os.path.dirname(file_name)

        # trigger save of perspective before export
        self._callback = self._on_export_perspective_continued
        self._callback_args = [file_name]
        self.save_settings_signal.emit(self._global_settings,
                                       self._perspective_settings)
Example #24
0
    def _on_record_settings_selected(self, all_topics, selected_topics):
        # TODO verify master is still running
        filename = QFileDialog.getSaveFileName(
            self, self.tr('Select prefix for new Bag File'), '.',
            self.tr('Bag files {.bag} (*.bag)'))
        if filename[0] != '':
            prefix = filename[0].strip()

            # Get filename to record to
            record_filename = time.strftime('%Y-%m-%d-%H-%M-%S.bag',
                                            time.localtime(time.time()))
            if prefix.endswith('.bag'):
                prefix = prefix[:-len('.bag')]
            if prefix:
                record_filename = '%s_%s' % (prefix, record_filename)

            rospy.loginfo('Recording to %s.' % record_filename)

            self.load_button.setEnabled(False)
            self._recording = True
            self._timeline.record_bag(record_filename, all_topics,
                                      selected_topics)
Example #25
0
 def _handle_save_clicked(self):
     filename = QFileDialog.getSaveFileName(
         self, self.tr('Save selected region to file...'), '.',
         self.tr('Bag files {.bag} (*.bag)'))
     if filename[0] != '':
         self._timeline.copy_region_to_bag(filename[0])
Example #26
0
    def _save_dataset(self):

        formats = ['CSV', 'PKL', 'H5', 'DLS', 'FANN']
        supported_formats = ''
        for f in formats:
            supported_formats += f + ';;'

        self._data_filename, self._data_format = QFileDialog.getSaveFileName(
            self._widget, self.tr('Save dataset'), 'dataset_name',
            self.tr(supported_formats[:-2]))

        if self._data_filename is None or self._data_filename == '':
            return

        self._data_filename += '.' + self._data_format.lower()

        if self._data_format == 'CSV':

            # fill up the list of selected data leaves
            self._fill_selected_leaves_list()

            # create new stream file
            data_file = QFile(self._data_filename)
            if not data_file.open(QIODevice.WriteOnly | QIODevice.Text):
                return
            self._file_stream = QTextStream(data_file)

            # fill up single line record dictionary with topic keys
            self._line_record['timestamp'] = 0
            for leaf in self._selected_leaves:  #self._get_selected_items_list():
                self._line_record[leaf] = 0

            # write out header
            for key in self._line_record:
                self._file_stream << key << ','
            self._file_stream << '\n'

            # open bag file
            bag = rosbag.Bag(self._bag_filename)
            # cycle through selected base topics
            for topic, message, time in bag.read_messages(
                    self._get_selected_topics()):
                # traverse down the message slots
                # print('Traversing: ' + topic)
                self._line_record['timestamp'] = str(time)
                self._export_leaf_instance(message, '', '', topic, [])

            data_file.close()
            print('File saved: ' + self._data_filename)

        elif self._data_format == 'PKL':
            df = rosbag_pandas.bag_to_dataframe(self._bag_filename,
                                                self._get_selected_topics())
            df.to_pickle(self._data_filename)
            print('File saved: ' + self._data_filename)

        elif self._data_format == 'H5':
            df = rosbag_pandas.bag_to_dataframe(self._bag_filename,
                                                self._get_selected_topics())
            hdf_store = HDFStore(self._data_filename)
            hdf_store['df'] = df
            hdf_store.close()
            print('File saved: ' + self._data_filename)

        elif self._data_format == 'DLS':
            self._no_support_warning()

        elif self._data_format == 'FANN':
            self._no_support_warning()

        else:
            self._no_support_warning()
 def _handle_save_clicked(self):
     filename = QFileDialog.getSaveFileName(
         self, self.tr('Save parameters to file...'), '.',
         self.tr('YAML files {.yaml} (*.yaml)'))
     if filename[0] != '':
         self.save_param(filename[0])
Example #28
0
 def _handle_save(self):
     result = QFileDialog.getSaveFileName(self, 'Save File', '.',
                                          'Minute files (*.txt)')
     file_name = result[0]
     if file_name:
         self._save(file_name)
Example #29
0
class JointStatePublisherGui(QWidget):
    def __init__(self, title, jsp, num_rows=0):
        super(JointStatePublisherGui, self).__init__()
        font = QFont("Helvetica", 9, QFont.Bold)
        self.hlayout = QHBoxLayout(self)
        vlayout = QVBoxLayout()
        glayout = QGridLayout()
        right_l_lauout = QVBoxLayout()
        self.listVeiw = QListWidget()
        self.checkbox = []
        self.value_line_edit = []
        self.sliders = []
        self.positions = []
        self.progressbars = []

        self.value_last = []

        speed_max = enviromnt_conf['joint_speed']
        slider_max = speed_max * 1000

        position_max = enviromnt_conf['joint_max_position']
        progress_max = position_max * 1000

        #create joints widget
        for i in range(0, num_rows):
            if config[i][0]:
                g_in_g = QGridLayout()
                checkbox = QCheckBox(config[i][1])
                checkbox.setFont(font)

                self.checkbox.append(checkbox)

                value_line_edit = QLineEdit()
                value_line_edit.setFont(font)
                value_line_edit.setText("0.0")

                self.value_line_edit.append(value_line_edit)

                display_lable = QLabel()
                display_lable.setFont(font)
                display_lable.setText("Position:")

                position_label = QLabel()
                position_label.setFont(font)
                position_label.setText("0.0")

                self.positions.append(position_label)

                position_progress_bar = QProgressBar()
                position_progress_bar.setMaximum(progress_max)
                position_progress_bar.setMinimum(-progress_max)
                position_progress_bar.setValue(0)

                self.progressbars.append(position_progress_bar)

                slider = QSlider()
                slider.setMaximum(slider_max)
                slider.setMinimum(-slider_max)
                slider.setOrientation(Qt.Horizontal)
                slider.valueChanged.connect(self.slider_value_changed)
                self.sliders.append(slider)

                g_in_g.addWidget(checkbox, 0, 0)
                g_in_g.addWidget(value_line_edit, 0, 1)
                g_in_g.addWidget(display_lable, 0, 2)
                g_in_g.addWidget(position_label, 0, 3)
                g_in_g.addWidget(slider, 1, 0, 1, 2)
                g_in_g.addWidget(position_progress_bar, 1, 2, 1, 2)

                glayout.addLayout(g_in_g, i, 0)

        #create v layout
        self.import_Btn = QPushButton('Import')
        self.import_Btn.setFont(font)
        self.import_Btn.clicked.connect(self.import_Btn_clecked)

        self.export_Btn = QPushButton('Export')
        self.export_Btn.setFont(font)
        self.export_Btn.clicked.connect(self.export_Btn_clicked)

        self.start_Btn = QPushButton("Start")
        self.start_Btn.setFont(font)
        self.start_Btn.clicked.connect(self.start_Btn_clicked)

        self.reset_Btn = QPushButton('Reset')
        self.reset_Btn.setFont(font)
        self.reset_Btn.clicked.connect(self.reset_Btn_clicked)

        self.record_Btn = QPushButton('Record')
        self.record_Btn.setFont(font)
        self.record_Btn.clicked.connect(self.record_Btn_clicked)

        self.replay_Btn = QPushButton('Repaly')
        self.replay_Btn.setFont(font)
        self.replay_Btn.clicked.connect(self.replay_Btn_clicked)

        self.delete_Btn = QPushButton("Delete")
        self.delete_Btn.setFont(font)
        self.delete_Btn.clicked.connect(self.delete_Btn_clicked)

        self.debug_Btn = QPushButton("Debug")
        self.debug_Btn.setFont(font)
        self.debug_Btn.clicked.connect(self.debug_Btn_clicked)

        vlayout.addWidget(self.import_Btn)
        vlayout.addWidget(self.export_Btn)
        vlayout.addWidget(self.start_Btn)
        vlayout.addWidget(self.reset_Btn)
        vlayout.addWidget(self.record_Btn)
        vlayout.addWidget(self.delete_Btn)
        vlayout.addWidget(self.replay_Btn)
        vlayout.addWidget(self.debug_Btn)

        self.master_url = QLineEdit("http://192.168.0.91:11311")
        self.master_url.setFont(font)

        self.master_ip = QLineEdit("192.168.0.91")
        self.master_ip.setFont(font)

        self.listVeiw.clicked.connect(self.listVeiw_clicked)
        self.listVeiw.currentRowChanged.connect(
            self.listVeiw_itemSelectionChanged)

        self.description = QTextEdit("")
        self.description.setFont(font)

        #self.description.setGeometry(0,100,100,500)

        right_l_lauout.addWidget(self.master_url)
        right_l_lauout.addWidget(self.master_ip)
        right_l_lauout.addWidget(self.listVeiw)
        right_l_lauout.addWidget(self.description)

        right_l_lauout.setStretch(0, 1)
        right_l_lauout.setStretch(1, 1)
        right_l_lauout.setStretch(2, 3)
        right_l_lauout.setStretch(3, 1)

        self.num_rows = len(self.checkbox)
        self.hlayout.addLayout(glayout)
        self.hlayout.addLayout(vlayout)
        self.hlayout.addLayout(right_l_lauout)
        self.setLayout(self.hlayout)

        self.callback_start = None
        self.callback_pause = None
        self.callback_record = None
        self.callback_reset = None
        self.callback_replay = None
        self.callback_replay_stop = None
        self.callback_delete = None
        self.callback_debug = None
        self.callback_import = None
        self.callback_export = None
        self.callback_list_clicked = None

        self.listVeiw_isClicked = False
        self.listVeiw_current_item = 0
        self.listVeiw_len = 0
        self.f = QFileDialog()

    def who_data_changed(self):
        for i in range(0, self.num_rows):
            value_last = self.value_line_edit[i].text()
            value_last = float(value_last) * 1000
            value = self.sliders[i].value()
            if value != value_last:
                return i

    def change_line_edit(self, change_index):
        value = self.sliders[change_index].value()
        value = float(value) / 1000
        value = str(value)
        self.value_line_edit[change_index].setText(value)

    def change_position_edit(self, change_index):
        value = self.progressbars[change_index].value()
        value += self.sliders[change_index].value()
        self.progressbars[change_index].setValue(value)

        self.positions[change_index].setText(str(float(value) / 1000))

    def reset_speed(self, change_index):
        self.sliders[change_index].setValue(0)

    def reset_speed_all(self):
        for i in range(0, self.num_rows):
            self.reset_speed(i)

    def set_speed(self, index, data):
        self.sliders[index].setValue(data)

    def import_Btn_clecked(self):
        self.file_path = self.f.getOpenFileName(caption='Import excel data',
                                                directory='',
                                                filter='*.xlsx',
                                                initialFilter='')
        self.file_path = self.file_path[0]
        if self.callback_import:
            self.callback_import()
        pass

    def export_Btn_clicked(self):
        self.file_path = self.f.getSaveFileName(caption='Save as excel data',
                                                directory='',
                                                filter='*.xlsx',
                                                initialFilter='')
        self.file_path = self.file_path[0]
        if self.callback_export:
            self.callback_export()
        pass

    def set_callback_start(self, func):
        self.callback_start = func

    def start_Btn_clicked(self):
        if self.start_Btn.text() == "Start":
            if self.callback_start:
                self.callback_start()
            self.start_Btn.setText("Pause")
        else:
            if self.callback_pause:
                self.callback_pause()
            self.start_Btn.setText("Start")

    def reset_Btn_clicked(self):
        self.reset_speed_all()
        self.reset_postion_all()

        if self.callback_reset:
            self.callback_reset()

    def replay_Btn_clicked(self):
        if self.replay_Btn.text() == "Replay":
            self.replay_Btn.setText("Stop")
            if self.callback_replay:
                self.callback_replay()
        else:
            self.replay_Btn.setText("Replay")
            if self.callback_replay_stop:
                self.callback_replay_stop()

    def debug_Btn_clicked(self):
        if self.callback_debug:
            self.callback_debug()

    def record_Btn_clicked(self):
        self.set_postion()
        self.listVeiw_len += 1
        if self.callback_record:
            self.callback_record()
        self.reset_speed_all()

    def listVeiw_itemSelectionChanged(self, index):
        self.listVeiw_isClicked = True
        self.listVeiw_current_item = index
        if self.callback_list_clicked:
            self.callback_list_clicked()

    def listVeiw_clicked(self, index):
        #print "index", index.row()
        if self.listVeiw_current_item != index.row():
            description_text = self.description.toPlainText()
            #self.listVeiw.item(self.listVeiw_current_item).setData(1,"123")
            #print self.listVeiw.item(self.listVeiw_current_item).data
        self.listVeiw_isClicked = True
        self.listVeiw_current_item = index.row()
        if self.callback_list_clicked:
            self.callback_list_clicked()

    def update_listView(self):
        print "update", self.listVeiw_len
        for i in range(0, self.listVeiw_len):
            view = self.listVeiw.item(i)
            view.setText(str(i))

    def get_listVeiw_current_item(self):
        return self.listVeiw_current_item

    def delete_Btn_clicked(self):
        if self.listVeiw_isClicked:
            print self.listVeiw_current_item
            self.listVeiw.removeItemWidget(
                self.listVeiw.takeItem(self.listVeiw_current_item))
            self.listVeiw_len -= 1
            if self.listVeiw_current_item != self.listVeiw_len:
                self.update_listView()
            if self.callback_delete:
                self.callback_delete()
            if self.listVeiw_current_item == 0:
                self.listVeiw_current_item = 0
            else:
                self.listVeiw_current_item -= 1

            self.listVeiw.setCurrentRow(self.listVeiw_current_item)
            if self.listVeiw_len == 0:
                self.listVeiw_isClicked = False

    def listView_add_item(self, index):
        self.listVeiw.addItem(str(index))

    def listView_inset_item(self, index, label):
        self.listVeiw.insertItem(index, str(label))

    def slider_value_changed(self, data):
        change_index = self.who_data_changed()
        self.change_line_edit(change_index)

    def get_speed(self):
        speed = []
        for i in range(0, self.num_rows):
            value = self.sliders[i].value()
            value = float(value) / 1000
            speed.append(value)
        return speed

    def get_position(self):
        position = []
        for i in range(0, self.num_rows):
            value = self.progressbars[i].value()
            value += self.sliders[i].value()
            value = float(value) / 1000
            position.append(value)
        return position

    def set_postion(self):
        for i in range(0, self.num_rows):
            self.change_position_edit(i)

    def set_positions(self, data):
        print len(data)
        for i in range(0, len(data)):
            self.progressbars[i].setValue(data[i] * 1000)
            self.positions[i].setText(str(data[i]))

    def reset_position(self, change_index):
        value = 0
        self.progressbars[change_index].setValue(value)

        self.positions[change_index].setText(str(float(value) / 1000))

    def reset_postion_all(self):
        for i in range(0, self.num_rows):
            self.reset_position(i)
 def _handle_save_clicked(self):
     filename = QFileDialog.getSaveFileName(self, self.tr('Save selected region to file...'), '.', self.tr('Bag files {.bag} (*.bag)'))
     if filename[0] != '':
         self._timeline.copy_region_to_bag(filename[0])
 def _handle_save_clicked(self):
     filename = QFileDialog.getSaveFileName(
             self, self.tr('Save parameters to file...'), '.',
             self.tr('YAML files {.yaml} (*.yaml)'))
     if filename[0] != '':
         self.save_param(filename[0])