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()