Ejemplo n.º 1
0
class QLttngcAddChannelDialog(utils.QCommonDialog, utils.QtUiLoad,
                              utils.AcceptDialog):
    _UI_NAME = 'add-channel'
    _ACCEPT_ICON_NAME = 'add'

    def __init__(self, initial_domain, suggested_name):
        super().__init__()
        self._setup_ui()
        self._setup_signals()
        self._set_initial_config(initial_domain, suggested_name)

    def _set_initial_config(self, domain, name):
        default_channel_attr = model.ChannelAttributes.create_default(domain)
        self.set_domain_channel_attributes(domain, default_channel_attr)
        self._name_edit.setText(name)
        self._set_default_focus()

    def _setup_ui(self):
        self._load_ui()
        self._setup_spinbox()
        self._setup_icons()
        self._advanced_options_box.hide()
        self.layout().setSizeConstraint(Qt.QLayout.SetFixedSize);

    def _setup_spinbox(self):
        self._subbuf_count_spinbox = QLttngcPowerTwoSpinBox()
        self._subbuf_count_spinbox.setMinimum(1)
        self._subbuf_count_spinbox.setMaximum(1024 * 1024)
        self._subbuf_count_spinbox.setToolTip('Number of sub-buffers')
        self._subbuf_layout.insertWidget(0, self._subbuf_count_spinbox)

    def _set_default_focus(self):
        self._name_edit.setFocus()

    def _setup_icons(self):
        self._init_icons()
        utils.set_widget_icons([
            (self._kernel_radio, 'tux'),
            (self._user_radio, 'user'),
        ])

    def _set_kernel_visibility(self):
        self._kernel_radio.setChecked(True)
        self._mmap_radio.setVisible(True)
        self._splice_radio.setVisible(True)
        self._global_radio.setVisible(True)
        self._per_uid_radio.setVisible(False)
        self._per_pid_radio.setVisible(False)

    def _set_kernel_default_config(self):
        domain = model.Domain.KERNEL
        default_channel_attr = model.ChannelAttributes.create_default(domain)
        self.set_domain_channel_attributes(domain, default_channel_attr)
        self._set_default_focus()

    def _set_user_visibility(self):
        self._user_radio.setChecked(True)
        self._mmap_radio.setVisible(True)
        self._splice_radio.setVisible(False)
        self._global_radio.setVisible(False)
        self._per_uid_radio.setVisible(True)
        self._per_pid_radio.setVisible(True)

    def _set_user_default_config(self):
        domain = model.Domain.USER
        default_channel_attr = model.ChannelAttributes.create_default(domain)
        self.set_domain_channel_attributes(domain, default_channel_attr)
        self._set_default_focus()

    def _setup_signals(self):
        self._kernel_radio.clicked.connect(self._set_kernel_default_config)
        self._user_radio.clicked.connect(self._set_user_default_config)
        self._tracefile_ucount_usize_radio.clicked.connect(self._tracefile_ucount_usize_clicked)
        self._tracefile_ucount_msize_radio.clicked.connect(self._tracefile_ucount_msize_clicked)
        self._tracefile_mcount_msize_radio.clicked.connect(self._tracefile_mcount_msize_clicked)
        self._read_timer_stopped_check.clicked.connect(self._read_timer_stopped_check_clicked)
        self._switch_timer_stopped_check.clicked.connect(self._switch_timer_stopped_check_clicked)
        self._show_advanced_options_btn.clicked.connect(self._show_advanced_options)

    def _show_advanced_options(self):
        self._show_advanced_options_btn.hide()
        self._advanced_options_box.show()

    def _tracefile_ucount_usize_clicked(self):
        self._tracefile_count_edit.setEnabled(False)
        self._tracefile_size_edit.setEnabled(False)
        self._tracefile_b_lbl.setEnabled(False)

    def _tracefile_ucount_msize_clicked(self):
        self._tracefile_count_edit.setEnabled(False)
        self._tracefile_size_edit.setEnabled(True)
        self._tracefile_b_lbl.setEnabled(True)

    def _tracefile_mcount_msize_clicked(self):
        self._tracefile_count_edit.setEnabled(True)
        self._tracefile_size_edit.setEnabled(True)
        self._tracefile_b_lbl.setEnabled(True)

    def _read_timer_stopped_check_clicked(self, checked):
        self._read_timer_period_edit.setEnabled(not checked)
        self._read_timer_us_lbl.setEnabled(not checked)

    def _switch_timer_stopped_check_clicked(self, checked):
        self._switch_timer_period_edit.setEnabled(not checked)
        self._switch_timer_us_lbl.setEnabled(not checked)

    @property
    def domain(self):
        if self._kernel_radio.isChecked():
            return model.Domain.KERNEL
        else:
            return model.Domain.USER

    @property
    def output_type(self):
        if self._mmap_radio.isChecked():
            return model.ChannelOutputType.MMAP
        else:
            return model.ChannelOutputType.SPLICE

    @property
    def mode(self):
        if self._discard_radio.isChecked():
            return model.ChannelMode.DISCARD
        else:
            return model.ChannelMode.OVERWRITE

    @property
    def buffer_scheme(self):
        if self._global_radio.isChecked():
            return model.ChannelBufferScheme.GLOBAL
        elif self._per_uid_radio.isChecked():
            return model.ChannelBufferScheme.PER_UID
        else:
            return model.ChannelBufferScheme.PER_PID

    @property
    def channel_attributes(self):
        attr = model.ChannelAttributes()
        attr.mode = self.mode
        attr.subbuf_size = self._subbuf_size_edit.text()
        attr.subbuf_count = self._subbuf_count_spinbox.value()
        attr.output_type = self.output_type
        attr.buffer_scheme = self.buffer_scheme

        if self._tracefile_ucount_msize_radio.isChecked():
            attr.tracefile_size = self._tracefile_size_edit.text()
        elif self._tracefile_mcount_msize_radio.isChecked():
            attr.tracefile_count = self._tracefile_count_edit.value()
            attr.tracefile_size = self._tracefile_size_edit.text()

        if not self._read_timer_stopped_check.isChecked():
            sec = utils.usec_to_sec(int(self._read_timer_period_edit.text()))
            attr.read_timer_interval = sec

        if not self._switch_timer_stopped_check.isChecked():
            sec = utils.usec_to_sec(int(self._switch_timer_period_edit.text()))
            attr.switch_timer_interval = sec

        return attr

    def set_domain_channel_attributes(self, domain, attr):
        # domain
        if domain == model.Domain.KERNEL:
            self._set_kernel_visibility()
        else:
            self._set_user_visibility()

        # mode
        if attr.mode == model.ChannelMode.DISCARD:
            self._discard_radio.click()
        else:
            self._overwrite_radio.click()

        # sub-buffer count and size
        self._subbuf_count_spinbox.setValue(attr.subbuf_count)
        b, prefix = utils.bytes_to_human_prefix(attr.subbuf_size)

        if b == math.floor(b):
            txt = '{}{}'.format(math.floor(b), prefix)
        else:
            txt = str(attr.subbuf_size)

        self._subbuf_size_edit.setText(txt)

        # output type
        if attr.output_type == model.ChannelOutputType.MMAP:
            self._mmap_radio.setChecked(True)
        else:
            self._splice_radio.setChecked(True)

        # buffer scheme
        if attr.buffer_scheme == model.ChannelBufferScheme.GLOBAL:
            self._global_radio.setChecked(True)
        elif attr.buffer_scheme == model.ChannelBufferScheme.PER_UID:
            self._per_uid_radio.setChecked(True)
        else:
            self._per_pid_radio.setChecked(True)

        # read timer interval
        if attr.read_timer_interval is not None:
            usec = utils.sec_to_usec(attr.read_timer_interval)
            self._read_timer_period_edit.setText(str(usec))
            self._read_timer_stopped_check.setChecked(False)
            self._read_timer_period_edit.setEnabled(True)
        else:
            self._read_timer_period_edit.setText('')
            self._read_timer_stopped_check.setChecked(True)
            self._read_timer_period_edit.setEnabled(False)

        # switch timer interval
        if attr.switch_timer_interval is not None:
            usec = utils.sec_to_usec(attr.switch_timer_interval)
            self._switch_timer_period_edit.setText(str(usec))
            self._switch_timer_stopped_check.setChecked(False)
            self._switch_timer_period_edit.setEnabled(True)
        else:
            self._switch_timer_period_edit.setText('')
            self._switch_timer_stopped_check.setChecked(True)
            self._switch_timer_period_edit.setEnabled(False)

        # trace files
        if attr.tracefile_size is not None:
            self._tracefile_ucount_msize_radio.click()
            self._tracefile_size_edit.setText(str(attr.tracefile_size))

            if attr.tracefile_count is not None:
                self._tracefile_mcount_msize_radio.click()
                self._tracefile_count_edit.setText(str(attr.tracefile_count))
        else:
            self._tracefile_ucount_usize_radio.click()
Ejemplo n.º 2
0
 def _setup_spinbox(self):
     self._subbuf_count_spinbox = QLttngcPowerTwoSpinBox()
     self._subbuf_count_spinbox.setMinimum(1)
     self._subbuf_count_spinbox.setMaximum(1024 * 1024)
     self._subbuf_count_spinbox.setToolTip('Number of sub-buffers')
     self._subbuf_layout.insertWidget(0, self._subbuf_count_spinbox)