Esempio n. 1
0
    def __init__(self, main: AbstractMainWindow) -> None:
        super().__init__(main, 'Benchmark')

        self.setup_ui()

        self.running = False
        self.unsequenced = False
        self.buffer: Deque[Future] = deque()
        self.run_start_time = 0.0
        self.start_frame  = Frame(0)
        self.  end_frame  = Frame(0)
        self.total_frames = FrameInterval(0)
        self.frames_left  = FrameInterval(0)

        self.sequenced_timer = Qt.QTimer()
        self.sequenced_timer.setTimerType(Qt.Qt.PreciseTimer)
        self.sequenced_timer.setInterval(0)

        self.update_info_timer = Qt.QTimer()
        self.update_info_timer.setTimerType(Qt.Qt.PreciseTimer)
        self.update_info_timer.setInterval(
            self.main.BENCHMARK_REFRESH_INTERVAL)

        self. start_frame_control.valueChanged.connect(lambda value: self.update_controls(start=      value))
        self.  start_time_control.valueChanged.connect(lambda value: self.update_controls(start=Frame(value)))
        self.   end_frame_control.valueChanged.connect(lambda value: self.update_controls(  end=      value))
        self.    end_time_control.valueChanged.connect(lambda value: self.update_controls(  end=Frame(value)))
        self.total_frames_control.valueChanged.connect(lambda value: self.update_controls(total=              value))
        self.  total_time_control.valueChanged.connect(lambda value: self.update_controls(total=FrameInterval(value)))
        self.   prefetch_checkbox.stateChanged.connect(self.on_prefetch_changed)
        self.    run_abort_button.     clicked.connect(self.on_run_abort_pressed)
        self.     sequenced_timer.     timeout.connect(self._request_next_frame_sequenced)
        self.   update_info_timer.     timeout.connect(self.update_info)

        set_qobject_names(self)
Esempio n. 2
0
    def __init__(self, main: AbstractMainWindow) -> None:
        super().__init__(main, 'Misc')
        self.setup_ui()

        self.save_template_lineedit.setText(self.main.SAVE_TEMPLATE)

        self.autosave_timer = Qt.QTimer()
        self.autosave_timer.timeout.connect(self.save)

        self.save_file_types = {
            'Single Image (*.png)': self.save_as_png,
        }

        self.reload_script_button.     clicked.connect(lambda: self.main.reload_script())  # pylint: disable=unnecessary-lambda
        self.         save_button.     clicked.connect(lambda: self.save(manually=True))
        self.keep_on_top_checkbox.stateChanged.connect(        self.on_keep_on_top_changed)
        self.   copy_frame_button.     clicked.connect(        self.copy_frame_to_clipboard)
        self.save_frame_as_button.     clicked.connect(        self.on_save_frame_as_clicked)
        self. show_debug_checkbox.stateChanged.connect(        self.on_show_debug_changed)

        add_shortcut(Qt.Qt.CTRL + Qt.Qt.Key_R, self.reload_script_button.click)
        add_shortcut(Qt.Qt.CTRL + Qt.Qt.Key_S, self.         save_button.click)
        add_shortcut(Qt.Qt.ALT  + Qt.Qt.Key_S, self.   copy_frame_button.click)
        add_shortcut(Qt.Qt.CTRL + Qt.Qt.SHIFT + Qt.Qt.Key_S,
                     self.save_frame_as_button.click)

        set_qobject_names(self)
Esempio n. 3
0
    def __init__(self) -> None:
        from qdarkstyle import load_stylesheet_pyqt5

        super().__init__()

        # logging

        logging.basicConfig(format='{asctime}: {levelname}: {message}',
                            style='{',
                            level=self.LOG_LEVEL)
        logging.Formatter.default_msec_format = '%s.%03d'

        # ???

        self.app = Qt.QApplication.instance()
        if self.DARK_THEME:
            self.app.setStyleSheet(
                self.patch_dark_stylesheet(load_stylesheet_pyqt5()))
            self.ensurePolished()

        self.display_scale = self.app.primaryScreen().logicalDotsPerInch(
        ) / self.BASE_PPI
        self.setWindowTitle('VSPreview')
        self.move(400, 0)
        self.setup_ui()

        # global

        self.clipboard = self.app.clipboard()
        self.external_args: List[str] = []
        self.script_path = Path()
        self.save_on_exit = True
        self.script_exec_failed = False

        # graphics view

        self.graphics_scene = Qt.QGraphicsScene(self)
        self.graphics_view.setScene(self.graphics_scene)
        self.opengl_widget = None
        if self.OPENGL_RENDERING:
            self.opengl_widget = Qt.QOpenGLWidget()
            self.graphics_view.setViewport(self.opengl_widget)

        self.graphics_view.wheelScrolled.connect(self.on_wheel_scrolled)

        # timeline

        self.timeline.clicked.connect(self.switch_frame)

        # init toolbars and outputs

        self.toolbars = Toolbars(self)
        self.main_layout.addWidget(self.toolbars.main)
        for toolbar in self.toolbars:
            self.main_layout.addWidget(toolbar)
            self.toolbars.main.layout().addWidget(toolbar.toggle_button)

        set_qobject_names(self)
        self.setObjectName('MainWindow')
Esempio n. 4
0
    def __init__(self, main: AbstractMainWindow) -> None:
        from concurrent.futures import Future

        super().__init__(main, 'Playback')
        self.setup_ui()

        self.play_buffer: Deque[Future] = deque()
        self.play_timer = Qt.QTimer()
        self.play_timer.setTimerType(Qt.Qt.PreciseTimer)
        self.play_timer.timeout.connect(self._show_next_frame)

        self.fps_history: Deque[int] = deque(
            [],
            int(self.main.FPS_AVERAGING_WINDOW_SIZE) + 1)
        self.current_fps = 0.0
        self.fps_timer = Qt.QTimer()
        self.fps_timer.setTimerType(Qt.Qt.PreciseTimer)
        self.fps_timer.timeout.connect(
            lambda: self.fps_spinbox.setValue(self.current_fps))

        self.play_start_time: Optional[int] = None
        self.play_start_frame = Frame(0)
        self.play_end_time = 0
        self.play_end_frame = Frame(0)

        self.play_pause_button.clicked.connect(self.on_play_pause_clicked)
        self.seek_to_prev_button.clicked.connect(self.seek_to_prev)
        self.seek_to_next_button.clicked.connect(self.seek_to_next)
        self.seek_n_frames_b_button.clicked.connect(self.seek_n_frames_b)
        self.seek_n_frames_f_button.clicked.connect(self.seek_n_frames_f)
        self.seek_to_start_button.clicked.connect(self.seek_to_start)
        self.seek_to_end_button.clicked.connect(self.seek_to_end)
        self.seek_frame_control.valueChanged.connect(
            self.on_seek_frame_changed)
        self.seek_time_control.valueChanged.connect(self.on_seek_time_changed)
        self.fps_spinbox.valueChanged.connect(self.on_fps_changed)
        self.fps_reset_button.clicked.connect(self.reset_fps)
        self.fps_unlimited_checkbox.stateChanged.connect(
            self.on_fps_unlimited_changed)

        add_shortcut(Qt.Qt.Key_Space, self.play_pause_button.click)
        add_shortcut(Qt.Qt.Key_Left, self.seek_to_prev_button.click)
        add_shortcut(Qt.Qt.Key_Right, self.seek_to_next_button.click)
        add_shortcut(Qt.Qt.SHIFT + Qt.Qt.Key_Left,
                     self.seek_n_frames_b_button.click)
        add_shortcut(Qt.Qt.SHIFT + Qt.Qt.Key_Right,
                     self.seek_n_frames_f_button.click)
        add_shortcut(Qt.Qt.Key_Home, self.seek_to_start_button.click)
        add_shortcut(Qt.Qt.Key_End, self.seek_to_end_button.click)

        set_qobject_names(self)
Esempio n. 5
0
    def __init__(self, main_window: AbstractMainWindow) -> None:
        from vspreview.models import ZoomLevels

        super().__init__(main_window, 'Main')
        self.setup_ui()

        self.outputs = Outputs()

        self.outputs_combobox.setModel(self.outputs)
        self.zoom_levels = ZoomLevels(
            [0.25, 0.5, 0.75, 1.0, 1.5, 2.0, 4.0, 8.0])
        self.zoom_combobox.setModel(self.zoom_levels)
        self.zoom_combobox.setCurrentIndex(3)

        self.save_file_types = {'Single Image (*.png)': self.save_as_png}

        self.outputs_combobox.currentIndexChanged.connect(
            self.main.switch_output)
        self.frame_control.valueChanged.connect(self.main.switch_frame)
        self.time_control.valueChanged.connect(
            lambda t: self.main.switch_frame(time=t))
        self.frame_control.editingFinished.connect(
            self.frame_control.clearFocus)  # type: ignore
        self.time_control.editingFinished.connect(
            self.time_control.clearFocus)  # type: ignore
        self.copy_frame_button.clicked.connect(
            self.on_copy_frame_button_clicked)
        self.copy_timestamp_button.clicked.connect(
            self.on_copy_timestamp_button_clicked)
        self.sync_outputs_checkbox.stateChanged.connect(
            self.on_sync_outputs_changed)
        self.zoom_combobox.currentTextChanged.connect(self.on_zoom_changed)
        self.save_as_button.clicked.connect(self.on_save_as_clicked)
        self.switch_timeline_mode_button.clicked.connect(
            self.on_switch_timeline_mode_clicked)

        add_shortcut(Qt.Qt.Key_1, lambda: self.main.switch_output(0))
        add_shortcut(Qt.Qt.Key_2, lambda: self.main.switch_output(1))
        add_shortcut(Qt.Qt.Key_3, lambda: self.main.switch_output(2))
        add_shortcut(Qt.Qt.Key_4, lambda: self.main.switch_output(3))
        add_shortcut(Qt.Qt.Key_5, lambda: self.main.switch_output(4))
        add_shortcut(Qt.Qt.Key_6, lambda: self.main.switch_output(5))
        add_shortcut(Qt.Qt.Key_7, lambda: self.main.switch_output(6))
        add_shortcut(Qt.Qt.Key_8, lambda: self.main.switch_output(7))
        add_shortcut(Qt.Qt.Key_9, lambda: self.main.switch_output(8))
        add_shortcut(Qt.Qt.Key_0, lambda: self.main.switch_output(9))
        add_shortcut(Qt.Qt.Key_S, self.sync_outputs_checkbox.click)
        add_shortcut(Qt.Qt.CTRL + Qt.Qt.SHIFT + Qt.Qt.Key_S,
                     self.save_as_button.click)

        set_qobject_names(self)
Esempio n. 6
0
    def __init__(self, main: AbstractMainWindow) -> None:
        super().__init__(main, 'Pipette')

        self.setup_ui()
        self.main.graphics_view.mouseMoved.connect(self.mouse_moved)

        self.pos_fmt = '{},{}'
        self.src_hex_fmt = '{:2X}'
        self.src_max_val: Union[int, float] = 2**8 - 1
        self.src_dec_fmt = '{:3d}'
        self.src_norm_fmt = '{:0.5f}'
        self.outputs: Dict[Output, vs.VideoNode] = {}

        set_qobject_names(self)
Esempio n. 7
0
    def __init__(self, main: AbstractMainWindow) -> None:
        super().__init__(main, 'Pipette')

        self.setup_ui()

        self.pos_fmt = '{},{}'
        self.src_hex_fmt = '{:2X}'
        self.src_max_val: Union[int, float] = 2**8 - 1
        self.src_dec_fmt = '{:3d}'
        self.src_norm_fmt = '{:0.5f}'
        self.outputs = WeakKeyDictionary[Output, vs.VideoNode]()
        self.tracking = False

        set_qobject_names(self)
Esempio n. 8
0
    def __init__(self, main_window: AbstractMainWindow) -> None:
        super().__init__(main_window, Qt.Qt.Dialog)
        self.main = main_window

        self.setWindowTitle('Script Loading Error')
        self.setModal(True)

        self.setup_ui()

        self.reload_button.clicked.connect(self.on_reload_clicked)
        self.exit_button.clicked.connect(self.on_exit_clicked)

        add_shortcut(Qt.Qt.CTRL + Qt.Qt.Key_R, self.reload_button.click, self)

        set_qobject_names(self)
Esempio n. 9
0
    def __init__(self, main: AbstractMainWindow) -> None:
        super().__init__(main, 'Debug')

        self.setup_ui()

        self.test_button.clicked.connect(self.test_button_clicked)
        self.exec_button.clicked.connect(self.exec_button_clicked)
        self.exec_lineedit.editingFinished.connect(self.exec_button_clicked)

        if self.main.DEBUG_TOOLBAR_BUTTONS_PRINT_STATE:
            self.filter = debug.EventFilter(self)
            self.main.toolbars.main.widget.installEventFilter(self.filter)
            for toolbar in self.main.toolbars:
                toolbar.widget.installEventFilter(self.filter)

        set_qobject_names(self)
Esempio n. 10
0
    def __init__(self, main: AbstractMainWindow) -> None:
        super().__init__(main, 'Pipette')

        self.setup_ui()
        self.main.graphics_view.mouseMoved.connect(self.mouse_moved)
        self.main.graphics_view.mousePressed.connect(self.mouse_pressed)
        self.main.graphics_view.mouseReleased.connect(self.mouse_released)

        self.pos_fmt = '{},{}'
        self.src_hex_fmt = '{:2X}'
        self.src_max_val: Union[int, float] = 2**8 - 1
        self.src_dec_fmt = '{:3d}'
        self.src_norm_fmt = '{:0.5f}'
        self.outputs = WeakKeyDictionary[Output, vs.VideoNode]()
        self.tracking = False

        set_qobject_names(self)
Esempio n. 11
0
    def __init__(self, main: AbstractMainWindow) -> None:
        super().__init__(main)

        self.main = main
        self.scening_list = SceningList()

        self.setWindowTitle('Scening List View')
        self.setup_ui()

        self.end_frame_control  .valueChanged.connect(self.on_end_frame_changed)
        self.end_time_control   .valueChanged.connect(self.on_end_time_changed)
        self.label_lineedit      .textChanged.connect(self.on_label_changed)
        self.name_lineedit       .textChanged.connect(self.on_name_changed)
        self.start_frame_control.valueChanged.connect(self.on_start_frame_changed)
        self.start_time_control .valueChanged.connect(self.on_start_time_changed)
        self.tableview         .doubleClicked.connect(self.on_tableview_clicked)
        self.delete_button           .clicked.connect(self.on_delete_clicked)

        add_shortcut(Qt.Qt.Key_Delete, self.delete_button.click, self.tableview)
        set_qobject_names(self)
Esempio n. 12
0
    def __init__(self, main: AbstractMainWindow) -> None:
        super().__init__(main, 'Misc')
        self.setup_ui()

        self.save_template_lineedit.setText(self.main.SAVE_TEMPLATE)

        self.autosave_enabled: bool = self.main.AUTOSAVE_ENABLED
        self.autosave_timer = Qt.QTimer()
        self.autosave_timer.timeout.connect(self.save)

        self.reload_script_button.clicked.connect(
            lambda: self.main.reload_script())  # pylint: disable=unnecessary-lambda
        self.save_button.clicked.connect(lambda: self.save(manually=True))
        self.autosave_checkbox.stateChanged.connect(self.on_autosave_changed)
        self.keep_on_top_checkbox.stateChanged.connect(
            self.on_keep_on_top_changed)
        self.show_debug_checkbox.stateChanged.connect(
            self.on_show_debug_changed)

        add_shortcut(Qt.Qt.CTRL + Qt.Qt.Key_R, self.reload_script_button.click)
        add_shortcut(Qt.Qt.CTRL + Qt.Qt.Key_S, self.save_button.click)

        set_qobject_names(self)
Esempio n. 13
0
    def __init__(self, main: AbstractMainWindow) -> None:
        super().__init__(main, 'Scening')
        self.setup_ui()

        self.lists = SceningLists()

        self.first_frame : Optional[Frame] = None
        self.second_frame: Optional[Frame] = None
        self.export_template_pattern  = re.compile(
            r'.*(?:{start}|{end}|{label}).*')
        self.export_template_scenes_pattern = re.compile(r'.+')

        self.items_combobox.setModel(self.lists)
        self.scening_update_status_label()
        self.scening_list_dialog = SceningListDialog(self.main)

        self.supported_file_types = {
            'Aegisub Project (*.ass)'       : self.import_ass,
            'AvsP Session (*.ses)'          : self.import_ses,
            'CUE Sheet (*.cue)'             : self.import_cue,
            'DGIndex Project (*.dgi)'       : self.import_dgi,
            'IfoEdit Celltimes (*.txt)'     : self.import_celltimes,
            'L-SMASH Works Index (*.lwi)'   : self.import_lwi,
            'Matroska Timestamps v1 (*.txt)': self.import_matroska_timestamps_v1,
            'Matroska Timestamps v2 (*.txt)': self.import_matroska_timestamps_v2,
            'Matroska Timestamps v3 (*.txt)': self.import_matroska_timestamps_v3,
            'Matroska XML Chapters (*.xml)' : self.import_matroska_xml_chapters,
            'OGM Chapters (*.txt)'          : self.import_ogm_chapters,
            'TFM Log (*.txt)'               : self.import_tfm,
            'VSEdit Bookmarks (*.bookmarks)': self.import_vsedit,
            'x264/x265 2 Pass Log (*.log)'  : self.import_x264_2pass_log,
            'x264/x265 QP File (*.qp *.txt)': self.import_qp,
            'XviD Log (*.txt)'              : self.import_xvid,
        }

        self.add_list_button               .clicked.connect(self.on_add_list_clicked)
        self.add_single_frame_button       .clicked.connect(self.on_add_single_frame_clicked)
        self.add_to_list_button            .clicked.connect(self.on_add_to_list_clicked)
        self.export_multiline_button       .clicked.connect(self.export_multiline)
        self.export_single_line_button     .clicked.connect(self.export_single_line)
        self.export_template_lineedit  .textChanged.connect(self.check_remove_export_possibility)
        self.import_file_button            .clicked.connect(self.on_import_file_clicked)
        self.items_combobox           .valueChanged.connect(self.on_current_list_changed)
        self.remove_at_current_frame_button.clicked.connect(self.on_remove_at_current_frame_clicked)
        self.remove_last_from_list_button  .clicked.connect(self.on_remove_last_from_list_clicked)
        self.remove_list_button            .clicked.connect(self.on_remove_list_clicked)
        self.seek_to_next_button           .clicked.connect(self.on_seek_to_next_clicked)
        self.seek_to_prev_button           .clicked.connect(self.on_seek_to_prev_clicked)
        self.toggle_first_frame_button     .clicked.connect(self.on_first_frame_clicked)
        self.toggle_second_frame_button    .clicked.connect(self.on_second_frame_clicked)
        self.view_list_button              .clicked.connect(self.on_view_list_clicked)

        add_shortcut(Qt.Qt.SHIFT + Qt.Qt.Key_1, lambda: self.switch_list(0))
        add_shortcut(Qt.Qt.SHIFT + Qt.Qt.Key_2, lambda: self.switch_list(1))
        add_shortcut(Qt.Qt.SHIFT + Qt.Qt.Key_3, lambda: self.switch_list(2))
        add_shortcut(Qt.Qt.SHIFT + Qt.Qt.Key_4, lambda: self.switch_list(3))
        add_shortcut(Qt.Qt.SHIFT + Qt.Qt.Key_5, lambda: self.switch_list(4))
        add_shortcut(Qt.Qt.SHIFT + Qt.Qt.Key_6, lambda: self.switch_list(5))
        add_shortcut(Qt.Qt.SHIFT + Qt.Qt.Key_7, lambda: self.switch_list(6))
        add_shortcut(Qt.Qt.SHIFT + Qt.Qt.Key_8, lambda: self.switch_list(7))
        add_shortcut(Qt.Qt.SHIFT + Qt.Qt.Key_9, lambda: self.switch_list(8))

        add_shortcut(Qt.Qt.CTRL  + Qt.Qt.Key_Space, self.on_toggle_single_frame)
        add_shortcut(Qt.Qt.CTRL  + Qt.Qt.Key_Left,  self.seek_to_prev_button         .click)
        add_shortcut(Qt.Qt.CTRL  + Qt.Qt.Key_Right, self.seek_to_next_button         .click)
        add_shortcut(              Qt.Qt.Key_Q,     self.toggle_first_frame_button   .click)
        add_shortcut(              Qt.Qt.Key_W,     self.toggle_second_frame_button  .click)
        add_shortcut(              Qt.Qt.Key_E,     self.add_to_list_button          .click)
        add_shortcut(              Qt.Qt.Key_R,     self.remove_last_from_list_button.click)

        # FIXME: get rid of workaround
        self._on_list_items_changed = lambda *arg: self.on_list_items_changed(*arg)  # pylint: disable=unnecessary-lambda, no-value-for-parameter

        set_qobject_names(self)