#include "buttonmanageritems.h" #include #include #include "editsample.h" ButtonManagerItem::ButtonManagerItem(QTreeWidgetItem* parent, int type, uint8_t pos) : QTreeWidgetItem(parent, type), mparent(parent), pos(pos) { } ButtonManagerItem::~ButtonManagerItem() {} bool ButtonManagerItem::hasEdit() const { return false; } bool ButtonManagerItem::hasRemove() const { return false; } bool ButtonManagerItem::hasMoveUp() const { return false; } bool ButtonManagerItem::hasMoveDown() const { return false; } void ButtonManagerItem::edit() {} void ButtonManagerItem::remove() {} void ButtonManagerItem::moveUp() {} void ButtonManagerItem::moveDown() {} void ButtonManagerItem::updateAllPosBellow(int8_t diff, uint8_t size) { for(uint8_t i = pos+1; i <= size; ++i) { ButtonManagerItem* item = dynamic_cast(mparent->child(i)); if(item) { item->pos += diff; item->updatePosition(); } } } void ButtonManagerItem::updatePosition() {} RowItem::RowItem(QTreeWidgetItem* parent, uint8_t rownr, Config::RootConfig& conf) : ButtonManagerItem(parent, TYPE, rownr), conf(conf) { const std::vector& btnrow = conf.buttons.at(rownr); updatePosition(); setExpanded(true); // iterate buttons in a row for(uint8_t btnnr = 0; btnnr < btnrow.size(); btnnr++) { ButtonItem* btnItem = new ButtonItem(this, btnnr, conf); } } bool RowItem::hasRemove() const { return true; } bool RowItem::hasMoveUp() const { return pos > 0; } bool RowItem::hasMoveDown() const { return pos < conf.buttons.size()-1; } void RowItem::remove() { conf.buttons.erase(conf.buttons.begin() + pos); updateAllPosBellow(-1, conf.buttons.size()); } void RowItem::moveUp() { //apply change to config conf.buttons.at(pos-1).swap(conf.buttons.at(pos)); // apply change in GUI //get Child above RowItem* rowaboveItem = dynamic_cast(mparent->child(pos-1)); if(rowaboveItem) { rowaboveItem->pos++; rowaboveItem->updatePosition(); } else { Log::error << "row above could not be updated"; } bool wasexpanded = isExpanded(); mparent->removeChild(this); mparent->insertChild(pos-1, this); setExpanded(wasexpanded); pos--; updatePosition(); } void RowItem::moveDown() { // moving down is the same as moving the item below up RowItem* rowbelow = dynamic_cast(mparent->child(pos+1)); if(rowbelow) { rowbelow->moveUp(); } else { Log::error << "no item below"; } } uint8_t RowItem::getRow() const { return pos; } void RowItem::updatePosition() { setData(0, Qt::ItemDataRole::DisplayRole, QVariant((int) pos+1)); } std::vector& RowItem::getConfig() { return conf.buttons.at(pos); } RowItem* RowItem::getRowAbove() const { if(pos == 0) return nullptr; return dynamic_cast(mparent->child(pos-1)); } RowItem* RowItem::getRowBelow() const { if(pos == mparent->childCount() -1) return nullptr; return dynamic_cast(mparent->child(pos+1)); } ButtonItem::ButtonItem(RowItem* parent, uint8_t buttonnr, Config::RootConfig& conf) : ButtonManagerItem(parent, TYPE, buttonnr), conf(conf), row(parent) { Config::ButtonConfig& btn = getConfig(); setData(1, Qt::ItemDataRole::DisplayRole, QVariant(QString::fromStdString(btn.name))); setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); // | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled // iterate samples in a button for(uint8_t samplenr = 0; samplenr < btn.samples.size(); ++samplenr) { SampleItem* sample = new SampleItem(this, samplenr, conf); } } bool ButtonItem::hasRemove() const { return true; } bool ButtonItem::hasMoveUp() const { return pos > 0 || row->hasMoveUp(); } bool ButtonItem::hasMoveDown() const { return pos < row->getConfig().size()-1 || row->hasMoveDown(); } void ButtonItem::remove() { auto& rowconf = row->getConfig(); rowconf.erase(rowconf.begin() + pos); updateAllPosBellow(-1, rowconf.size()); } void ButtonItem::moveUp() { if(pos == 0) { moveToRowAbove(); return; } //apply change to config auto& rowconf = row->getConfig(); std::swap(rowconf.at(pos-1), rowconf.at(pos)); // apply change in GUI //get Child above ButtonItem* buttonaboveItem = dynamic_cast(mparent->child(pos-1)); if(buttonaboveItem) { buttonaboveItem->pos++; } else { Log::error << "button above could not be updated"; } bool wasexpanded = isExpanded(); mparent->removeChild(this); mparent->insertChild(pos-1, this); setExpanded(wasexpanded); pos--; } void ButtonItem::moveDown() { // moving down is the same as moving the item below up ButtonItem* rowbelow = dynamic_cast(mparent->child(pos+1)); if(rowbelow) { rowbelow->moveUp(); } else { Log::error << "no item below"; } } void ButtonItem::nameWasChanged() { std::string newName = data(1, Qt::ItemDataRole::DisplayRole).toString().toStdString(); getConfig().name = newName; } Config::ButtonConfig& ButtonItem::getConfig() { return row->getConfig().at(pos); } void ButtonItem::moveToRowAbove() { // get row above RowItem* rowabove = row->getRowAbove(); if(!rowabove) { Log::error << "no row above!"; return; } // apply change in config auto& rowconf = row->getConfig(); auto& newrowconf = rowabove->getConfig(); newrowconf.push_back(rowconf.front()); rowconf.erase(rowconf.begin()); // update buttons in old row updateAllPosBellow(-1, rowconf.size()); // remove button from this row and attach to other bool wasExpanded = isExpanded(); row->removeChild(this); rowabove->addChild(this); //update local parents row = rowabove; mparent = rowabove; //update local pos pos = newrowconf.size()-1; setExpanded(wasExpanded); } SampleItem::SampleItem(ButtonItem* parent, uint8_t samplenr, Config::RootConfig& conf) : ButtonManagerItem(parent, TYPE, samplenr), conf(conf), button(parent) { const Config::SampleConfig& sample = getConfig(); updatePosition(); setText(3, QString::fromStdString(sample.file)); setToolTip(2, "Doubleclick to play"); } bool SampleItem::hasEdit() const { return true; } bool SampleItem::hasRemove() const { return true; } void SampleItem::edit() { Config::SampleConfig& sammpleConf = getConfig(); EditSample editor(sammpleConf.file); editor.setStartTime(sammpleConf.offset); editor.setLength(sammpleConf.length); editor.exec(); if(editor.result() == 0) { Log::info << "Dialog failed"; return; } sammpleConf.offset = editor.getStartTime(); sammpleConf.length = editor.getLength(); } void SampleItem::remove() { auto& btnconf = button->getConfig().samples; btnconf.erase(btnconf.begin() + pos); updateAllPosBellow(-1, btnconf.size()); } Config::SampleConfig& SampleItem::getConfig() { return button->getConfig().samples.at(pos); } void SampleItem::updatePosition() { setData(2, Qt::ItemDataRole::DisplayRole, QVariant((int) pos+1)); }