From: Steinar H. Gunderson Date: Sun, 31 Jul 2016 11:25:07 +0000 (+0200) Subject: Make most of the input mapping dialog actually work. X-Git-Tag: 1.4.0~119 X-Git-Url: https://git.sesse.net/?p=nageru;a=commitdiff_plain;h=d7118c0e5e98ba5597e259018600ab712bf079a7 Make most of the input mapping dialog actually work. You can now add new mappings and edit them, but not delete existing ones or move them around. OK/Cancel works and actually sets the mapping in the AudioMixer, but the AudioMixer doesn't care (and neither does the UI). --- diff --git a/input_mapping_dialog.cpp b/input_mapping_dialog.cpp index e411318..424e320 100644 --- a/input_mapping_dialog.cpp +++ b/input_mapping_dialog.cpp @@ -5,18 +5,25 @@ #include using namespace std; +using namespace std::placeholders; InputMappingDialog::InputMappingDialog() - : ui(new Ui::InputMappingDialog) + : ui(new Ui::InputMappingDialog), + mapping(global_mixer->get_audio_mixer()->get_input_mapping()), + old_mapping(mapping), + card_names(global_mixer->get_audio_mixer()->get_names()) { ui->setupUi(this); - //connect(ui->button_box, &QDialogButtonBox::accepted, [this]{ this->close(); }); - vector card_names = global_mixer->get_audio_mixer()->get_names(); - fill_ui_from_mapping(global_mixer->get_audio_mixer()->get_input_mapping(), card_names); + fill_ui_from_mapping(mapping); + connect(ui->table, &QTableWidget::cellChanged, this, &InputMappingDialog::cell_changed); + connect(ui->ok_cancel_buttons, &QDialogButtonBox::accepted, this, &InputMappingDialog::ok_clicked); + connect(ui->ok_cancel_buttons, &QDialogButtonBox::rejected, this, &InputMappingDialog::cancel_clicked); + connect(ui->add_button, &QPushButton::clicked, this, &InputMappingDialog::add_clicked); + //connect(ui->add_button, &QPushButton::clicked, this, &InputMappingDialog::add_clicked); } -void InputMappingDialog::fill_ui_from_mapping(const InputMapping &mapping, const vector &card_names) +void InputMappingDialog::fill_ui_from_mapping(const InputMapping &mapping) { ui->table->verticalHeader()->hide(); ui->table->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents); @@ -26,35 +33,41 @@ void InputMappingDialog::fill_ui_from_mapping(const InputMapping &mapping, const ui->table->setRowCount(mapping.inputs.size()); for (unsigned row = 0; row < mapping.inputs.size(); ++row) { - // TODO: Mark as some sort of header (by means of background color, probably). - QString name(QString::fromStdString(mapping.inputs[row].name)); - ui->table->setItem(row, 0, new QTableWidgetItem(name)); - - // Card choices. - QComboBox *card_combo = new QComboBox; - card_combo->addItem(QString("(none) ")); - for (const string &name : card_names) { - card_combo->addItem(QString::fromStdString(name + " ")); - } - switch (mapping.inputs[row].input_source_type) { - case InputSourceType::SILENCE: - card_combo->setCurrentIndex(0); - break; - case InputSourceType::CAPTURE_CARD: - card_combo->setCurrentIndex(mapping.inputs[row].input_source_index + 1); - break; - default: - assert(false); - } - ui->table->setCellWidget(row, 1, card_combo); + fill_row_from_input(row, mapping.inputs[row]); + } +} - // Left and right channel. - fill_channel_ui_from_mapping(row, mapping.inputs[row]); +void InputMappingDialog::fill_row_from_input(unsigned row, const InputMapping::Input &input) +{ + QString name(QString::fromStdString(input.name)); + ui->table->setItem(row, 0, new QTableWidgetItem(name)); + + // Card choices. + QComboBox *card_combo = new QComboBox; + card_combo->addItem(QString("(none) ")); + for (const string &name : card_names) { + card_combo->addItem(QString::fromStdString(name + " ")); } + switch (input.input_source_type) { + case InputSourceType::SILENCE: + card_combo->setCurrentIndex(0); + break; + case InputSourceType::CAPTURE_CARD: + card_combo->setCurrentIndex(mapping.inputs[row].input_source_index + 1); + break; + default: + assert(false); + } + connect(card_combo, static_cast(&QComboBox::currentIndexChanged), + bind(&InputMappingDialog::card_selected, this, row, _1)); + ui->table->setCellWidget(row, 1, card_combo); + + setup_channel_choices_from_input(row, input); } -void InputMappingDialog::fill_channel_ui_from_mapping(unsigned row, const InputMapping::Input &input) +void InputMappingDialog::setup_channel_choices_from_input(unsigned row, const InputMapping::Input &input) { + // Left and right channel. for (unsigned channel = 0; channel < 2; ++channel) { QComboBox *channel_combo = new QComboBox; channel_combo->addItem(QString("(none)")); @@ -64,8 +77,62 @@ void InputMappingDialog::fill_channel_ui_from_mapping(unsigned row, const InputM snprintf(buf, sizeof(buf), "Channel %u ", source + 1); channel_combo->addItem(QString(buf)); } + channel_combo->setCurrentIndex(input.source_channel[channel] + 1); + } else { + channel_combo->setCurrentIndex(0); } - channel_combo->setCurrentIndex(input.source_channel[channel] + 1); + connect(channel_combo, static_cast(&QComboBox::currentIndexChanged), + bind(&InputMappingDialog::channel_selected, this, row, channel, _1)); ui->table->setCellWidget(row, 2 + channel, channel_combo); } } + +void InputMappingDialog::ok_clicked() +{ + global_mixer->get_audio_mixer()->set_input_mapping(mapping); + accept(); +} + +void InputMappingDialog::cancel_clicked() +{ + global_mixer->get_audio_mixer()->set_input_mapping(old_mapping); + reject(); +} + +void InputMappingDialog::cell_changed(int row, int column) +{ + if (column != 0) { + // Spurious; only really the name column should fire these. + return; + } + mapping.inputs[row].name = ui->table->item(row, column)->text().toStdString(); +} + +void InputMappingDialog::card_selected(unsigned row, int index) +{ + if (index == 0) { + mapping.inputs[row].input_source_type = InputSourceType::SILENCE; + } else { + mapping.inputs[row].input_source_type = InputSourceType::CAPTURE_CARD; + mapping.inputs[row].input_source_index = index - 1; + } + setup_channel_choices_from_input(row, mapping.inputs[row]); +} + +void InputMappingDialog::channel_selected(unsigned row, unsigned channel, int index) +{ + mapping.inputs[row].source_channel[channel] = index - 1; +} + +void InputMappingDialog::add_clicked() +{ + InputMapping::Input new_input; + new_input.name = "New input"; + new_input.input_source_type = InputSourceType::SILENCE; + mapping.inputs.push_back(new_input); + ui->table->setRowCount(mapping.inputs.size()); + + unsigned row = mapping.inputs.size() - 1; + fill_row_from_input(row, new_input); + ui->table->editItem(ui->table->item(row, 0)); // Start editing the name. +} diff --git a/input_mapping_dialog.h b/input_mapping_dialog.h index 4eb5e4c..91246f5 100644 --- a/input_mapping_dialog.h +++ b/input_mapping_dialog.h @@ -20,10 +20,25 @@ public: InputMappingDialog(); private: - void fill_ui_from_mapping(const InputMapping &mapping, const std::vector &card_names); - void fill_channel_ui_from_mapping(unsigned row, const InputMapping::Input &input); + void fill_ui_from_mapping(const InputMapping &mapping); + void fill_row_from_input(unsigned row, const InputMapping::Input &input); + void setup_channel_choices_from_input(unsigned row, const InputMapping::Input &input); + void cell_changed(int row, int column); + void card_selected(unsigned row, int index); + void channel_selected(unsigned row, unsigned channel, int index); + void ok_clicked(); + void cancel_clicked(); + void add_clicked(); Ui::InputMappingDialog *ui; + InputMapping mapping; // Under edit. Will be committed on OK. + + // The old mapping. Will be re-committed on cancel, so that we + // unhold all the unused devices (otherwise they would be + // held forever). + InputMapping old_mapping; + + const std::vector card_names; }; #endif // !defined(_INPUT_MAPPING_DIALOG_H) diff --git a/ui_input_mapping.ui b/ui_input_mapping.ui index f2c28ab..7b45338 100644 --- a/ui_input_mapping.ui +++ b/ui_input_mapping.ui @@ -41,7 +41,7 @@ - + 0 @@ -64,7 +64,7 @@ - + 0 @@ -100,7 +100,7 @@ - + 30 @@ -117,7 +117,7 @@ - + 30 @@ -147,7 +147,7 @@ - + Qt::Horizontal @@ -161,38 +161,5 @@ - - - buttonBox - accepted() - Dialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - Dialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - +