]> git.sesse.net Git - nageru/blob - input_mapping_dialog.cpp
Store an input mapping, and show it in the UI.
[nageru] / input_mapping_dialog.cpp
1 #include "input_mapping_dialog.h"
2
3 #include "ui_input_mapping.h"
4
5 #include <QComboBox>
6
7 using namespace std;
8
9 InputMappingDialog::InputMappingDialog()
10         : ui(new Ui::InputMappingDialog)
11 {
12         ui->setupUi(this);
13
14         //connect(ui->button_box, &QDialogButtonBox::accepted, [this]{ this->close(); });
15         vector<string> card_names = global_mixer->get_audio_mixer()->get_names();
16         fill_ui_from_mapping(global_mixer->get_audio_mixer()->get_input_mapping(), card_names);
17 }
18
19 void InputMappingDialog::fill_ui_from_mapping(const InputMapping &mapping, const vector<string> &card_names)
20 {
21         ui->table->verticalHeader()->hide();
22
23         ui->table->setRowCount(mapping.inputs.size());
24         for (unsigned row = 0; row < mapping.inputs.size(); ++row) {
25                 // TODO: Mark as some sort of header (by means of background color, probably).
26                 QString name(QString::fromStdString(mapping.inputs[row].name));
27                 ui->table->setItem(row, 0, new QTableWidgetItem(name));
28
29                 // Card choices.
30                 QComboBox *card_combo = new QComboBox;
31                 card_combo->addItem(QString("(none)"));
32                 for (const string &name : card_names) {
33                         card_combo->addItem(QString::fromStdString(name));
34                 }
35                 switch (mapping.inputs[row].input_source_type) {
36                 case InputSourceType::SILENCE:
37                         card_combo->setCurrentIndex(0);
38                         break;
39                 case InputSourceType::CAPTURE_CARD:
40                         card_combo->setCurrentIndex(mapping.inputs[row].input_source_index + 1);
41                         break;
42                 default:
43                         assert(false);
44                 }
45                 ui->table->setCellWidget(row, 1, card_combo);
46
47                 // Left and right channel.
48                 fill_channel_ui_from_mapping(row, mapping.inputs[row]);
49         }
50 }
51
52 void InputMappingDialog::fill_channel_ui_from_mapping(unsigned row, const InputMapping::Input &input)
53 {
54         for (unsigned channel = 0; channel < 2; ++channel) {
55                 QComboBox *channel_combo = new QComboBox;
56                 channel_combo->addItem(QString("(none)"));
57                 if (input.input_source_type == InputSourceType::CAPTURE_CARD) {
58                         for (unsigned source = 0; source < 8; ++source) {  // TODO: Ask the card about number of channels, and names.
59                                 char buf[256];
60                                 snprintf(buf, sizeof(buf), "Channel %u", source + 1);
61                                 channel_combo->addItem(QString(buf));
62                         }
63                 }
64                 channel_combo->setCurrentIndex(input.source_channel[channel] + 1);
65                 ui->table->setCellWidget(row, 2 + channel, channel_combo);
66         }
67 }