diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..f096edf --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,20 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/include", + "${workspaceFolder}/Log/", + "${workspaceFolder}/miniaudio", + "${workspaceFolder}/QxtGlobalShortcut/src/", + "${workspaceFolder}/ui", + "/usr/include/x86_64-linux-gnu/qt5/**" + ], + "defines": [], + "compilerPath": "/usr/bin/g++", + "cStandard": "c11", + "cppStandard": "c++17" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/include/buttonmanager.h b/include/buttonmanager.h new file mode 100644 index 0000000..6c256ed --- /dev/null +++ b/include/buttonmanager.h @@ -0,0 +1,26 @@ +#ifndef BUTTONMANAGER_H +#define BUTTONMANAGER_H + +#include + +#include "config.h" + +namespace Ui { + class ButtonManager; +} + +class ButtonManager : public QDialog +{ + Q_OBJECT + +public: + explicit ButtonManager(const Config& conf, QWidget *parent = nullptr); + ~ButtonManager(); + +private: + Ui::ButtonManager *ui; + + const Config& mainConfig; +}; + +#endif // BUTTONMANAGER_H diff --git a/include/mainwindow.h b/include/mainwindow.h index 2099aaf..abad3e7 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -36,6 +36,7 @@ private slots: void alwaysOnTopSettingChange(int status); void addSample(); void saveConfig(); + void openButtonManager(); signals: void newStatusMessage(const QString&); diff --git a/soundboard.pro b/soundboard.pro index 919427d..8ef5f61 100644 --- a/soundboard.pro +++ b/soundboard.pro @@ -27,6 +27,7 @@ SOURCES += \ src/editsample.cpp \ src/soundview.cpp \ src/samplereader.cpp \ + src/buttonmanager.cpp \ Log/Log.cpp HEADERS += \ @@ -34,11 +35,12 @@ HEADERS += \ include/sound.h \ include/sounddevice.h \ include/soundbutton.h \ - miniaudio/miniaudio.h \ include/config.h \ include/editsample.h \ include/soundview.h \ include/samplereader.h \ + include/buttonmanager.h \ + miniaudio/miniaudio.h \ Log/Log.h MOC_DIR = generated/ @@ -46,6 +48,7 @@ UI_DIR = ui/ OBJECTS_DIR = obj/ FORMS += \ + ui/buttonmanager.ui \ ui/editsample.ui \ ui/mainwindow.ui diff --git a/src/buttonmanager.cpp b/src/buttonmanager.cpp new file mode 100644 index 0000000..463e5ec --- /dev/null +++ b/src/buttonmanager.cpp @@ -0,0 +1,43 @@ +#include "buttonmanager.h" +#include "ui_buttonmanager.h" + +ButtonManager::ButtonManager(const Config& conf, QWidget *parent) : QDialog(parent), ui(new Ui::ButtonManager), mainConfig(conf) { + ui->setupUi(this); + + + QList items; + for(uint8_t rownr = 0; rownr < conf.rootConfig.buttons.size(); ++rownr) { + const std::vector& btnrow = conf.rootConfig.buttons.at(rownr); + QTreeWidgetItem* row = new QTreeWidgetItem(1000); + row->setData(0, 0, QVariant((int) rownr+1)); + items.push_back(row); + + // iterate buttons in a row + for(const Config::ButtonConfig& btn : btnrow) { + QTreeWidgetItem* qbtn = new QTreeWidgetItem(1001); + qbtn->setData(1, 0, QVariant(QString::fromStdString(btn.name))); + qbtn->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable); + row->addChild(qbtn); + + // iterate samples in a button + for(uint8_t samplenr = 0; samplenr < btn.samples.size(); ++samplenr) { + const Config::SampleConfig& sample = btn.samples.at(samplenr); + QTreeWidgetItem* qsample = new QTreeWidgetItem(1002); + qsample->setData(2, 0, QVariant((int) samplenr+1)); + qbtn->addChild(qsample); + } + } + } + + QStringList labels; + labels.push_back("Row"); + labels.push_back("Button"); + labels.push_back("Sample"); + + ui->buttonTreeWidget->addTopLevelItems(items); + ui->buttonTreeWidget->setHeaderLabels(labels); +} + +ButtonManager::~ButtonManager() { + delete ui; +} diff --git a/src/config_json.cpp b/src/config_json.cpp index 5779c6a..3ef6e3f 100644 --- a/src/config_json.cpp +++ b/src/config_json.cpp @@ -92,7 +92,8 @@ void to_json(json& j, const Config::ButtonConfig& bc) { if(bc.samples.size() == 1) { //dont use a json array when only one sample is present (inline instead) - to_json(j, bc.samples.at(0)); + if(bc.samples.at(0).isValid()) + to_json(j, bc.samples.at(0)); } else if(!bc.samples.empty()) { json samples = json::array(); writeVector(samples, bc.samples); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 971e772..ab962ae 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1,6 +1,7 @@ #include "mainwindow.h" #include "ui_mainwindow.h" +#include "buttonmanager.h" #include "editsample.h" #include @@ -28,6 +29,7 @@ MainWindow::MainWindow(const std::string& binary, QWidget* parent) : QMainWindow QObject::connect(ui->stopButton, SIGNAL( clicked() ), this, SLOT( stop() )); QObject::connect(ui->actionAddButton, SIGNAL( triggered() ), this, SLOT( addSample() )); QObject::connect(ui->actionSaveConfig, SIGNAL( triggered() ), this, SLOT( saveConfig() )); + QObject::connect(ui->actionButtonManager, SIGNAL( triggered() ), this, SLOT( openButtonManager() )); QObject::connect(ui->allwaysOnTop, SIGNAL( stateChanged(int) ), this, SLOT( alwaysOnTopSettingChange(int) )); QObject::connect(stopGlobal, SIGNAL( activated() ), this, SLOT( stop() )); QObject::connect(this, SIGNAL(newStatusMessage(const QString&)), ui->statusbar, SLOT(showMessage(const QString&))); @@ -37,7 +39,6 @@ MainWindow::MainWindow(const std::string& binary, QWidget* parent) : QMainWindow QObject::connect(left, SIGNAL( activated() ), this, SLOT( moveLeft() )); QObject::connect(right, SIGNAL( activated() ), this, SLOT( moveRight() )); QObject::connect(play, SIGNAL( activated() ), this, SLOT( playCurrent() )); - } MainWindow::~MainWindow() { @@ -164,6 +165,13 @@ void MainWindow::saveConfig() { config.save(); } +void MainWindow::openButtonManager() { + Log::info << "openButtonManager"; + + ButtonManager buttonManager(config, this); + buttonManager.exec(); +} + void MainWindow::loadSoundFromConfig() { Sound& sound = Sound::instance(); // init sound sound.reset(); diff --git a/ui/buttonmanager.ui b/ui/buttonmanager.ui new file mode 100644 index 0000000..586d473 --- /dev/null +++ b/ui/buttonmanager.ui @@ -0,0 +1,76 @@ + + + ButtonManager + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + + 1 + + + + 1 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + ButtonManager + accept() + + + 227 + 278 + + + 157 + 274 + + + + + buttonBox + rejected() + ButtonManager + reject() + + + 295 + 284 + + + 286 + 274 + + + + + diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index d0ae413..3d411dd 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -85,6 +85,7 @@ Edit + @@ -106,6 +107,14 @@ Ctrl+S + + + ButtonManager + + + Ctrl+B + +