def slot_open_file(self):
        # TODO: remove native directory
        all_types_filter = f'*{" *".join(Settings.video_exts + Settings.image_exts + Settings.plotting_exts)}'
        file_uri = CommonUnit.get_open_name(
            filter_=f"Media Files ({all_types_filter})")
        # got = '/Users/zdl/Downloads/下载-视频/poses.json'
        # got = '/Users/zdl/Downloads/下载-视频/金鞭溪-张家界.mp4'
        logger.info(file_uri)
        if not file_uri:
            return
        ext = os.path.splitext(file_uri)[1]
        if ext in Settings.video_exts:
            self.mw.tab_media.setCurrentIndex(0)
            video_model = Video(file_uri) \
                .set_viewer(self.mw.label_show)
            video_model.fps = video_model.get_info()['fps'] * float(
                self.mw.combo_speed.currentText())
            video_model.file = FileInfo(file_uri)
            self.video_model = video_model
            self.set_model(video_model)

            self.mw.table_timeline.set_column_num(
                video_model.get_info()['frame_c'])
            self.mw.video_textBrowser.append(file_uri)
        elif ext in Settings.plotting_exts:
            self.mw.tab_media.setCurrentIndex(2)
            file = JsonFilePoses.load(file_uri)
            plotter = self.mw.graphics_view.main_plotter
            plotter.set_range([0, int(file['video_info.w'])],
                              [0, int(file['video_info.h'])])
            pose_model = PosePlotting(file['info.pose_type']) \
                .set_data(file['poses']) \
                .set_viewer(plotter)
            pose_model.file = file
            self.pose_model = pose_model
            self.set_model(pose_model)

            self.mw.table_timeline.set_column_num(
                int(pose_model.indices[-1]) + 1)
            self.mw.plotting_textBrowser.append(file_uri)
        else:
            logger.warn(f'{file_uri} type {ext} not supported.')
            return
        self.media_model.signals.flushed.connect(
            self.mw.table_timeline.slot_follow_to)
        self.media_model.signals.flushed.connect(self.slot_follow_to)
        self.slot_start()
 def slot_import_labeled(self):
     logger.debug('')
     json_file_labels = JsonFileLabels.load(CommonUnit.get_open_name())
     existed_actions = {
         action.name: action
         for action in self.mw.table_action.get_all_actions()
     }
     for i, label in json_file_labels['labels'].items():
         action_name, begin, end, pose_index = ZDict(label)['action',
                                                            'begin', 'end',
                                                            ('pose_index',
                                                             -1)]
         if action_name not in existed_actions:
             action = self.mw.table_action.slot_insert_action(action_name)
             existed_actions[action_name] = action
         else:
             action = existed_actions[action_name]
         action_label = ActionLabel(action.name, action.id, action.color,
                                    begin, end, None, pose_index)
         logger.debug(action_label)
         self.mw.table_timeline.settle_label(action_label)
         self.mw.table_labeled.add_label(action_label)