| 276 | } |
| 277 | |
| 278 | void MidiMappingDialog::refreshBindingTable() |
| 279 | { |
| 280 | const auto& bindings = m_manager->bindings(); |
| 281 | m_bindingTable->setRowCount(bindings.size()); |
| 282 | |
| 283 | for (int i = 0; i < bindings.size(); ++i) { |
| 284 | const auto& b = bindings[i]; |
| 285 | |
| 286 | // Parameter name |
| 287 | const MidiParam* p = m_manager->findParam(b.paramId); |
| 288 | QString paramName = p ? QString("[%1] %2").arg(p->category, p->displayName) : b.paramId; |
| 289 | m_bindingTable->setItem(i, 0, new QTableWidgetItem(paramName)); |
| 290 | |
| 291 | // MIDI source |
| 292 | m_bindingTable->setItem(i, 1, new QTableWidgetItem(b.sourceDisplayName())); |
| 293 | |
| 294 | // Channel |
| 295 | m_bindingTable->setItem(i, 2, new QTableWidgetItem( |
| 296 | b.channel >= 0 ? QString::number(b.channel + 1) : "Any")); |
| 297 | |
| 298 | // Invert checkbox |
| 299 | auto* invertCheck = new QCheckBox; |
| 300 | invertCheck->setChecked(b.inverted); |
| 301 | invertCheck->setStyleSheet("QCheckBox { padding-left: 10px; }"); |
| 302 | connect(invertCheck, &QCheckBox::toggled, this, [this, i](bool on) { |
| 303 | if (i < m_manager->bindings().size()) { |
| 304 | m_manager->bindings()[i].inverted = on; |
| 305 | m_manager->rebuildIndex(); |
| 306 | MidiSettings::instance().saveBindings(m_manager->bindings()); |
| 307 | } |
| 308 | }); |
| 309 | m_bindingTable->setCellWidget(i, 3, invertCheck); |
| 310 | |
| 311 | // Relative checkbox (CC sends delta, not absolute position) |
| 312 | auto* relCheck = new QCheckBox; |
| 313 | relCheck->setChecked(b.relative); |
| 314 | relCheck->setStyleSheet("QCheckBox { padding-left: 10px; }"); |
| 315 | connect(relCheck, &QCheckBox::toggled, this, [this, i](bool on) { |
| 316 | if (i < m_manager->bindings().size()) { |
| 317 | m_manager->bindings()[i].relative = on; |
| 318 | m_manager->rebuildIndex(); |
| 319 | MidiSettings::instance().saveBindings(m_manager->bindings()); |
| 320 | } |
| 321 | }); |
| 322 | m_bindingTable->setCellWidget(i, 4, relCheck); |
| 323 | |
| 324 | // Delete button |
| 325 | auto* delBtn = new QPushButton("×"); |
| 326 | delBtn->setFixedSize(24, 24); |
| 327 | delBtn->setStyleSheet( |
| 328 | "QPushButton { background: #602020; color: #ff6060; font-weight: bold; " |
| 329 | "border: 1px solid #803030; border-radius: 3px; }"); |
| 330 | connect(delBtn, &QPushButton::clicked, this, [this, paramId = b.paramId] { |
| 331 | m_manager->removeBinding(paramId); |
| 332 | refreshBindingTable(); |
| 333 | MidiSettings::instance().saveBindings(m_manager->bindings()); |
| 334 | }); |
| 335 | m_bindingTable->setCellWidget(i, 5, delBtn); |
nothing calls this directly
no test coverage detected