soundboard/src/buttonmanager.cpp

161 lines
4.1 KiB
C++

#include "buttonmanager.h"
#include "ui_buttonmanager.h"
#include "addnewwhat.h"
#include <Log.h>
ButtonManager::ButtonManager(Config& conf, MainWindow* parent) : QDialog(parent), ui(new Ui::ButtonManager), mainW(parent), mainConfig(conf) {
ui->setupUi(this);
loadConfig();
QStringList labels;
labels.push_back("Row");
labels.push_back("Button");
labels.push_back("Sample");
labels.push_back("File");
ui->buttonTreeWidget->setHeaderLabels(labels);
}
ButtonManager::~ButtonManager() {
delete ui;
}
void ButtonManager::accept() {
saveChanges();
QDialog::accept();
}
void ButtonManager::reject() {
// nothing?
QDialog::reject();
}
void ButtonManager::addButton() {
AddNewWhat whatshouldbeadded(this);
whatshouldbeadded.exec();
AddNewWhat::ReturnCode type = whatshouldbeadded.returnCode;
if(type == AddNewWhat::ReturnCode::Row) {
// create new row
//TODO: when a row is selected: add after the selected row
workingConfig.buttons.push_back({}); // create a empty vector
RowItem* row = new RowItem(ui->buttonTreeWidget->invisibleRootItem(), workingConfig.buttons.size()-1, workingConfig);
return;
}
if(type == AddNewWhat::ReturnCode::Button) {
// create new button
return;
}
if(type == AddNewWhat::ReturnCode::Sample) {
// create new sample
return;
}
}
void ButtonManager::editButton() {
perform<&ButtonManagerItem::edit>();
}
void ButtonManager::deleteButton() {
QTreeWidgetItem* currentSelectedItem = getSelectedItem();
perform<&ButtonManagerItem::remove>();
delete currentSelectedItem;
}
void ButtonManager::upButton() {
QTreeWidgetItem* currentSelectedItem = getSelectedItem();
perform<&ButtonManagerItem::moveUp>();
select(currentSelectedItem);
}
void ButtonManager::downButton() {
QTreeWidgetItem* currentSelectedItem = getSelectedItem();
perform<&ButtonManagerItem::moveDown>();
select(currentSelectedItem);
}
void ButtonManager::itemSelected() {
Log::debug << "item selected";
ButtonManagerItem* item = dynamic_cast<ButtonManagerItem*>(getSelectedItem());
if(item) {
// set buttons
// ui->addButton->setEnabled(item->hasAdd());
ui->editButton->setEnabled(item->hasEdit());
ui->deleteButton->setEnabled(item->hasRemove());
ui->moveUpButton->setEnabled(item->hasMoveUp());
ui->moveDownButton->setEnabled(item->hasMoveDown());
} else {
Log::info << "no valid item selected";
// ui->addButton->setEnabled(false);
ui->editButton->setEnabled(false);
ui->deleteButton->setEnabled(false);
ui->moveUpButton->setEnabled(false);
ui->moveDownButton->setEnabled(false);
}
}
void ButtonManager::dialogButtonPressed(QAbstractButton* btn) {
QDialogButtonBox::ButtonRole role = ui->buttonBox->buttonRole(btn);
if(role == QDialogButtonBox::ButtonRole::ResetRole) {
// reset
loadConfig();
} else if(role == QDialogButtonBox::ButtonRole::ApplyRole) {
// apply
saveChanges();
}
}
void ButtonManager::loadConfig() {
workingConfig = mainConfig.rootConfig;
while(ui->buttonTreeWidget->invisibleRootItem()->childCount()) {
auto kid = ui->buttonTreeWidget->invisibleRootItem()->takeChild(0);
delete kid;
}
QTreeWidgetItem* root = ui->buttonTreeWidget->invisibleRootItem();
for(uint8_t rownr = 0; rownr < workingConfig.buttons.size(); ++rownr) {
RowItem* row = new RowItem(root, rownr, workingConfig);
}
}
void ButtonManager::saveChanges() {
// store working config to main config and save
mainConfig.rootConfig = workingConfig;
mainConfig.save();
mainW->reloadButtonConfig();
}
void ButtonManager::select(QTreeWidgetItem* item) {
QList<QTreeWidgetItem*> selected = ui->buttonTreeWidget->selectedItems();
for(QTreeWidgetItem* selectedItem : selected) {
ui->buttonTreeWidget->setItemSelected(selectedItem, false);
}
ui->buttonTreeWidget->setItemSelected(item, true);
}
QTreeWidgetItem* ButtonManager::getSelectedItem() const {
QList items = ui->buttonTreeWidget->selectedItems();
if(items.size() != 1) {
return nullptr; // not exectly one selected
}
return items.at(0);
}
template<void (ButtonManagerItem::*T)()>
void ButtonManager::perform() {
ButtonManagerItem* item = dynamic_cast<ButtonManagerItem*>(getSelectedItem());
if(item) {
(item->*T)();
} else {
Log::info << "no valid item selected";
}
}