diff --git a/src/Gui/DlgMacroExecute.ui b/src/Gui/DlgMacroExecute.ui index ed756ca81c..6ecd00c072 100644 --- a/src/Gui/DlgMacroExecute.ui +++ b/src/Gui/DlgMacroExecute.ui @@ -166,9 +166,6 @@ Qt::StrongFocus - - Gui::FileChooser::Directory - @@ -264,6 +261,16 @@ + + + + Duplicate + + + false + + + @@ -309,9 +316,9 @@ deleteButton editButton renameButton + duplicateButton addonsButton fileChooser - diff --git a/src/Gui/DlgMacroExecuteImp.cpp b/src/Gui/DlgMacroExecuteImp.cpp index 1a46a96e6b..5d4c7e3c32 100644 --- a/src/Gui/DlgMacroExecuteImp.cpp +++ b/src/Gui/DlgMacroExecuteImp.cpp @@ -139,6 +139,7 @@ void DlgMacroExecuteImp::on_userMacroListBox_currentItemChanged(QTreeWidgetItem* createButton->setEnabled(true); editButton->setEnabled(true); renameButton->setEnabled(true); + duplicateButton->setEnabled(true); } else { executeButton->setEnabled(false); @@ -146,6 +147,7 @@ void DlgMacroExecuteImp::on_userMacroListBox_currentItemChanged(QTreeWidgetItem* createButton->setEnabled(true); editButton->setEnabled(false); renameButton->setEnabled(false); + duplicateButton->setEnabled(false); } } @@ -159,6 +161,7 @@ void DlgMacroExecuteImp::on_systemMacroListBox_currentItemChanged(QTreeWidgetIte createButton->setEnabled(false); editButton->setEnabled(true); //look but don't touch renameButton->setEnabled(false); + duplicateButton->setEnabled(false); } else { executeButton->setEnabled(false); @@ -166,6 +169,7 @@ void DlgMacroExecuteImp::on_systemMacroListBox_currentItemChanged(QTreeWidgetIte createButton->setEnabled(false); editButton->setEnabled(false); renameButton->setEnabled(false); + duplicateButton->setEnabled(false); } } @@ -181,6 +185,7 @@ void DlgMacroExecuteImp::on_tabMacroWidget_currentChanged(int index) createButton->setEnabled(true); editButton->setEnabled(true); renameButton->setEnabled(true); + duplicateButton->setEnabled(true); } else { executeButton->setEnabled(false); @@ -188,6 +193,7 @@ void DlgMacroExecuteImp::on_tabMacroWidget_currentChanged(int index) createButton->setEnabled(true); editButton->setEnabled(false); renameButton->setEnabled(false); + duplicateButton->setEnabled(false); } } else { //index==1 system-wide @@ -199,6 +205,7 @@ void DlgMacroExecuteImp::on_tabMacroWidget_currentChanged(int index) createButton->setEnabled(false); editButton->setEnabled(true); //but you can't save it renameButton->setEnabled(false); + duplicateButton->setEnabled(false); } else { executeButton->setEnabled(false); @@ -206,6 +213,7 @@ void DlgMacroExecuteImp::on_tabMacroWidget_currentChanged(int index) createButton->setEnabled(false); editButton->setEnabled(false); renameButton->setEnabled(false); + duplicateButton->setEnabled(false); } } @@ -438,6 +446,93 @@ void DlgMacroExecuteImp::on_renameButton_clicked() } } } +/**Duplicates selected macro + * New file has same name as original but with "@" and 3-digit number appended + * Begins with "@001" and increments until available name is found + * "MyMacro.FCMacro" becomes "MyMacro@001.FCMacro" + * "MyMacro@002.FCMacro.py" becomes "MyMacro@003.FCMacro.py" unless there is + * no already existing "MyMacro@001.FCMacro.py" + */ +void DlgMacroExecuteImp::on_duplicateButton_clicked() +{ + QDir dir; + QTreeWidgetItem* item = 0; + + int index = tabMacroWidget->currentIndex(); + if (index == 0) { //user-specific + item = userMacroListBox->currentItem(); + dir.setPath(this->macroPath); + } + + if (!item){ + return; + } + + QString oldName = item->text(0); + QFileInfo oldfi(dir, oldName); + QFile oldfile(oldfi.absoluteFilePath()); + QString completeSuffix = oldfi.completeSuffix(); //everything after the first "." + QString baseName = oldfi.baseName(); //everything before first "." + QString neutralSymbol = QString::fromStdString("@"); + QString last3 = baseName.right(3); + bool ok = true; //was conversion to int successful? + int nLast3 = last3.toInt(&ok); + last3 = QString::fromStdString("001"); //increment beginning with 001 no matter what + if (ok ){ + //last3 were all digits, so we strip them from the base name + if (baseName.size()>3){ //if <= 3 leave be (e.g. 2.py becomes 2@001.py) + baseName = baseName.left(baseName.size()-3); //strip digits + if (baseName.endsWith(neutralSymbol)){ + baseName = baseName.left(baseName.size()-1); //trim the "@", will be added back later + } + } + } + //at this point baseName = the base name without any digits, e.g. "MyMacro" + //neutralSymbol = "@" + //last3 is a string representing 3 digits, always "001" at this time + //completeSuffix = FCMacro or py or FCMacro.py or else suffix will become FCMacro below + + QString oldNameDigitized = baseName+neutralSymbol+last3+QString::fromStdString(".")+completeSuffix; + QFileInfo fi(dir, oldNameDigitized); + // increment until we find available name with smallest digits + // test from "001" through "999", then give up and let user enter name of choice + while (fi.exists()) { + nLast3 = last3.toInt()+1; + if (nLast3 >=1000){ //avoid infinite loop, 999 files will have to be enough + break; + } + last3 = QString::number(nLast3); + while (last3.size()<3){ + last3.prepend(QString::fromStdString("0")); //pad 0's if needed + } + oldNameDigitized = baseName+neutralSymbol+last3+QString::fromStdString(".")+completeSuffix; + fi = QFileInfo(dir,oldNameDigitized); + } + + // give user a chance to pick a different name from digitized name suggested + QString fn = QInputDialog::getText(this, tr("Duplicate Macro"), + tr("Enter new name:"), QLineEdit::Normal, oldNameDigitized, 0); + if (!fn.isEmpty() && fn != oldName) { + QString suffix = QFileInfo(fn).suffix().toLower(); + if (suffix != QLatin1String("fcmacro") && suffix != QLatin1String("py")){ + fn += QLatin1String(".FCMacro"); + } + QFileInfo fi(dir, fn); + // check again if new name exists in case user changed it + if (fi.exists()) { + QMessageBox::warning(this, tr("Existing file"), + tr("'%1'\n already exists.").arg(fi.absoluteFilePath())); + } + else if (!oldfile.copy(fi.absoluteFilePath())) { + QMessageBox::warning(this, tr("Duplicate Failed"), + tr("Failed to duplicate to '%1'.\nPerhaps a file permission error?").arg(fi.absoluteFilePath())); + } + + this->fillUpList(); //repopulate list to show new file + } + +} + /** * convenience link button to open tools -> addon manager * from within macro dialog diff --git a/src/Gui/DlgMacroExecuteImp.h b/src/Gui/DlgMacroExecuteImp.h index 0f0f3fe0d3..83be29f994 100644 --- a/src/Gui/DlgMacroExecuteImp.h +++ b/src/Gui/DlgMacroExecuteImp.h @@ -51,6 +51,7 @@ public Q_SLOTS: void on_deleteButton_clicked(); void on_editButton_clicked(); void on_renameButton_clicked(); + void on_duplicateButton_clicked(); void on_addonsButton_clicked(); protected Q_SLOTS: