コード例 #1
0
ファイル: waveformeditor.py プロジェクト: datamail321/kunquat
class WarpEditor(QWidget, ProcessorUpdater):

    _ARG_SCALE = 1000

    def __init__(self, warp_type, index, get_base_wave,
                 get_update_signal_type):
        super().__init__()
        self._warp_type = warp_type
        self._index = index
        self._get_base_wave = get_base_wave
        self._get_update_signal_type = get_update_signal_type

        self._down_button = SmallButton()
        self._up_button = SmallButton()
        self._func_selector = KqtComboBox()
        self._slider = QSlider(Qt.Horizontal)
        self._slider.setSizePolicy(QSizePolicy.MinimumExpanding,
                                   QSizePolicy.Preferred)
        self._value_display = QLabel()
        self._remove_button = SmallButton()

        self._slider.setRange(-self._ARG_SCALE, self._ARG_SCALE)

        self._up_button.setEnabled(self._index != 0)

        fm = QFontMetrics(QFont())
        value_width = fm.boundingRect('{}'.format(-1.0 /
                                                  self._ARG_SCALE)).width()
        value_width += 10
        self._value_display.setFixedWidth(value_width)

        h = QHBoxLayout()
        h.setContentsMargins(0, 0, 0, 0)
        h.setSpacing(2)
        h.addWidget(self._down_button)
        h.addWidget(self._up_button)
        h.addWidget(self._func_selector)
        h.addWidget(self._slider)
        h.addWidget(self._value_display)
        h.addWidget(self._remove_button)
        self.setLayout(h)

    def _on_setup(self):
        self.register_action('signal_au', self._update_all)
        self.register_action(self._get_update_signal_type(), self._update_all)

        icon_bank = self._ui_model.get_icon_bank()
        self._down_button.setIcon(
            QIcon(icon_bank.get_icon_path('arrow_down_small')))
        self._up_button.setIcon(
            QIcon(icon_bank.get_icon_path('arrow_up_small')))
        self._remove_button.setIcon(
            QIcon(icon_bank.get_icon_path('delete_small')))

        base_wave = self._get_base_wave()

        func_names = base_wave.get_warp_func_names(self._warp_type)
        self._func_selector.set_items(name for name in func_names)

        self._update_all()

        self._down_button.clicked.connect(self._moved_down)
        self._up_button.clicked.connect(self._moved_up)
        self._func_selector.currentIndexChanged.connect(self._func_selected)
        self._slider.valueChanged.connect(self._slider_adjusted)
        self._remove_button.clicked.connect(self._removed)

    def _update_all(self):
        base_wave = self._get_base_wave()

        warp_func_count = base_wave.get_warp_func_count(self._warp_type)

        if self._index >= warp_func_count:
            # We have been removed
            return

        self._down_button.setEnabled(self._index < warp_func_count - 1)

        name, arg = base_wave.get_warp_func(self._warp_type, self._index)

        old_block = self._func_selector.blockSignals(True)
        for i in range(self._func_selector.count()):
            if self._func_selector.itemText(i) == name:
                self._func_selector.setCurrentIndex(i)
                break
        self._func_selector.blockSignals(old_block)

        old_block = self._slider.blockSignals(True)
        int_val = int(round(arg * self._ARG_SCALE))
        self._slider.setValue(int_val)
        self._slider.blockSignals(old_block)

        self._value_display.setText(str(float(arg)))

    def _moved_down(self):
        base_wave = self._get_base_wave()
        base_wave.move_warp_func(self._warp_type, self._index, self._index + 1)
        self._updater.signal_update(self._get_update_signal_type())

    def _moved_up(self):
        base_wave = self._get_base_wave()
        base_wave.move_warp_func(self._warp_type, self._index, self._index - 1)
        self._updater.signal_update(self._get_update_signal_type())

    def _set_warp(self):
        base_wave = self._get_base_wave()
        name = str(self._func_selector.currentText())
        arg = self._slider.value() / float(self._ARG_SCALE)
        base_wave.set_warp_func(self._warp_type, self._index, name, arg)
        self._updater.signal_update(self._get_update_signal_type())

    def _func_selected(self, index):
        self._set_warp()

    def _slider_adjusted(self, int_val):
        self._set_warp()

    def _removed(self):
        base_wave = self._get_base_wave()
        base_wave.remove_warp_func(self._warp_type, self._index)
        self._updater.signal_update(self._get_update_signal_type())
コード例 #2
0
class WarpEditor(QWidget):

    _ARG_SCALE = 1000

    def __init__(self, warp_type, index, get_base_wave, get_update_signal_type):
        super().__init__()
        self._au_id = None
        self._proc_id = None
        self._ui_model = None
        self._updater = None

        self._warp_type = warp_type
        self._index = index
        self._get_base_wave = get_base_wave
        self._get_update_signal_type = get_update_signal_type

        self._down_button = SmallButton()
        self._up_button = SmallButton()
        self._func_selector = KqtComboBox()
        self._slider = QSlider(Qt.Horizontal)
        self._slider.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
        self._value_display = QLabel()
        self._remove_button = SmallButton()

        self._slider.setRange(-self._ARG_SCALE, self._ARG_SCALE)

        self._up_button.setEnabled(self._index != 0)

        fm = QFontMetrics(QFont())
        value_width = fm.boundingRect('{}'.format(-1.0 / self._ARG_SCALE)).width()
        value_width += 10
        self._value_display.setFixedWidth(value_width)

        h = QHBoxLayout()
        h.setContentsMargins(0, 0, 0, 0)
        h.setSpacing(2)
        h.addWidget(self._down_button)
        h.addWidget(self._up_button)
        h.addWidget(self._func_selector)
        h.addWidget(self._slider)
        h.addWidget(self._value_display)
        h.addWidget(self._remove_button)
        self.setLayout(h)

    def set_au_id(self, au_id):
        self._au_id = au_id

    def set_proc_id(self, proc_id):
        self._proc_id = proc_id

    def set_ui_model(self, ui_model):
        self._ui_model = ui_model
        self._updater = ui_model.get_updater()
        self._updater.register_updater(self._perform_updates)

        icon_bank = self._ui_model.get_icon_bank()
        self._down_button.setIcon(QIcon(icon_bank.get_icon_path('arrow_down_small')))
        self._up_button.setIcon(QIcon(icon_bank.get_icon_path('arrow_up_small')))
        self._remove_button.setIcon(QIcon(icon_bank.get_icon_path('delete_small')))

        base_wave = self._get_base_wave()

        func_names = base_wave.get_warp_func_names(self._warp_type)
        self._func_selector.set_items(name for name in func_names)

        self._update_all()

        QObject.connect(self._down_button, SIGNAL('clicked()'), self._moved_down)
        QObject.connect(self._up_button, SIGNAL('clicked()'), self._moved_up)
        QObject.connect(
                self._func_selector,
                SIGNAL('currentIndexChanged(int)'),
                self._func_selected)
        QObject.connect(self._slider, SIGNAL('valueChanged(int)'), self._slider_adjusted)
        QObject.connect(self._remove_button, SIGNAL('clicked()'), self._removed)

    def unregister_updaters(self):
        self._updater.unregister_updater(self._perform_updates)

    def _perform_updates(self, signals):
        update_signals = set(['signal_au', self._get_update_signal_type()])
        if not signals.isdisjoint(update_signals):
            self._update_all()

    def _update_all(self):
        base_wave = self._get_base_wave()

        warp_func_count = base_wave.get_warp_func_count(self._warp_type)

        if self._index >= warp_func_count:
            # We have been removed
            return

        self._down_button.setEnabled(self._index < warp_func_count - 1)

        name, arg = base_wave.get_warp_func(self._warp_type, self._index)

        old_block = self._func_selector.blockSignals(True)
        for i in range(self._func_selector.count()):
            if self._func_selector.itemText(i) == name:
                self._func_selector.setCurrentIndex(i)
                break
        self._func_selector.blockSignals(old_block)

        old_block = self._slider.blockSignals(True)
        int_val = int(round(arg * self._ARG_SCALE))
        self._slider.setValue(int_val)
        self._slider.blockSignals(old_block)

        self._value_display.setText(str(float(arg)))

    def _moved_down(self):
        base_wave = self._get_base_wave()
        base_wave.move_warp_func(self._warp_type, self._index, self._index + 1)
        self._updater.signal_update(set([self._get_update_signal_type()]))

    def _moved_up(self):
        base_wave = self._get_base_wave()
        base_wave.move_warp_func(self._warp_type, self._index, self._index - 1)
        self._updater.signal_update(set([self._get_update_signal_type()]))

    def _set_warp(self):
        base_wave = self._get_base_wave()
        name = str(self._func_selector.currentText())
        arg = self._slider.value() / float(self._ARG_SCALE)
        base_wave.set_warp_func(self._warp_type, self._index, name, arg)
        self._updater.signal_update(set([self._get_update_signal_type()]))

    def _func_selected(self, index):
        self._set_warp()

    def _slider_adjusted(self, int_val):
        self._set_warp()

    def _removed(self):
        base_wave = self._get_base_wave()
        base_wave.remove_warp_func(self._warp_type, self._index)
        self._updater.signal_update(set([self._get_update_signal_type()]))
コード例 #3
0
ファイル: waveformeditor.py プロジェクト: kagu/kunquat
class WarpEditor(QWidget, ProcessorUpdater):

    _ARG_SCALE = 1000

    def __init__(self, warp_type, index, get_base_wave, get_update_signal_type):
        super().__init__()
        self._warp_type = warp_type
        self._index = index
        self._get_base_wave = get_base_wave
        self._get_update_signal_type = get_update_signal_type

        self._down_button = ProcessorIconButton()
        self._up_button = ProcessorIconButton()
        self._func_selector = KqtComboBox()
        self._slider = QSlider(Qt.Horizontal)
        self._slider.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
        self._value_display = QLabel()
        self._remove_button = ProcessorIconButton()

        self.add_to_updaters(self._down_button, self._up_button, self._remove_button)

        self._slider.setRange(-self._ARG_SCALE, self._ARG_SCALE)

        self._up_button.setEnabled(self._index != 0)

        fm = QFontMetrics(QFont())
        value_width = fm.boundingRect('{}'.format(-1.0 / self._ARG_SCALE)).width()
        value_width += 10
        self._value_display.setFixedWidth(value_width)

        h = QHBoxLayout()
        h.setContentsMargins(0, 0, 0, 0)
        h.setSpacing(2)
        h.addWidget(self._down_button)
        h.addWidget(self._up_button)
        h.addWidget(self._func_selector)
        h.addWidget(self._slider)
        h.addWidget(self._value_display)
        h.addWidget(self._remove_button)
        self.setLayout(h)

    def _on_setup(self):
        self.register_action('signal_au', self._update_all)
        self.register_action(self._get_update_signal_type(), self._update_all)
        self.register_action('signal_style_changed', self._update_style)

        self._down_button.set_icon('arrow_down_small')
        self._up_button.set_icon('arrow_up_small')
        self._remove_button.set_icon('delete_small')

        style_mgr = self._ui_model.get_style_manager()
        for button in (self._down_button, self._up_button, self._remove_button):
            button.set_sizes(
                    style_mgr.get_style_param('list_button_size'),
                    style_mgr.get_style_param('list_button_padding'))

        base_wave = self._get_base_wave()

        func_names = base_wave.get_warp_func_names(self._warp_type)
        self._func_selector.set_items(name for name in func_names)

        self._update_style()
        self._update_all()

        self._down_button.clicked.connect(self._moved_down)
        self._up_button.clicked.connect(self._moved_up)
        self._func_selector.currentIndexChanged.connect(self._func_selected)
        self._slider.valueChanged.connect(self._slider_adjusted)
        self._remove_button.clicked.connect(self._removed)

    def _update_style(self):
        style_mgr = self._ui_model.get_style_manager()
        self.layout().setSpacing(style_mgr.get_scaled_size_param('small_padding'))

    def _update_all(self):
        base_wave = self._get_base_wave()

        warp_func_count = base_wave.get_warp_func_count(self._warp_type)

        if self._index >= warp_func_count:
            # We have been removed
            return

        self._down_button.setEnabled(self._index < warp_func_count - 1)

        name, arg = base_wave.get_warp_func(self._warp_type, self._index)

        old_block = self._func_selector.blockSignals(True)
        for i in range(self._func_selector.count()):
            if self._func_selector.itemText(i) == name:
                self._func_selector.setCurrentIndex(i)
                break
        self._func_selector.blockSignals(old_block)

        old_block = self._slider.blockSignals(True)
        int_val = int(round(arg * self._ARG_SCALE))
        self._slider.setValue(int_val)
        self._slider.blockSignals(old_block)

        self._value_display.setText(str(float(arg)))

    def _moved_down(self):
        base_wave = self._get_base_wave()
        base_wave.move_warp_func(self._warp_type, self._index, self._index + 1)
        self._updater.signal_update(self._get_update_signal_type())

    def _moved_up(self):
        base_wave = self._get_base_wave()
        base_wave.move_warp_func(self._warp_type, self._index, self._index - 1)
        self._updater.signal_update(self._get_update_signal_type())

    def _set_warp(self):
        base_wave = self._get_base_wave()
        name = str(self._func_selector.currentText())
        arg = self._slider.value() / float(self._ARG_SCALE)
        base_wave.set_warp_func(self._warp_type, self._index, name, arg)
        self._updater.signal_update(self._get_update_signal_type())

    def _func_selected(self, index):
        self._set_warp()

    def _slider_adjusted(self, int_val):
        self._set_warp()

    def _removed(self):
        base_wave = self._get_base_wave()
        base_wave.remove_warp_func(self._warp_type, self._index)
        self._updater.signal_update(self._get_update_signal_type())