From 14c4df8427bada81dc00d897d9b6c2fb6d5e6df6 Mon Sep 17 00:00:00 2001 From: janrupf Date: Mon, 17 Jun 2019 22:44:04 +0200 Subject: [PATCH] GH-336 New rename UI with optional folder rename --- application/CMakeLists.txt | 3 + application/MainWindow.cpp | 13 ++- application/dialogs/CheckableInputDialog.cpp | 41 +++++++++ application/dialogs/CheckableInputDialog.h | 26 ++++++ application/dialogs/CheckableInputDialog.ui | 94 ++++++++++++++++++++ application/groupview/InstanceDelegate.cpp | 78 ---------------- application/groupview/InstanceDelegate.h | 8 -- 7 files changed, 176 insertions(+), 87 deletions(-) create mode 100644 application/dialogs/CheckableInputDialog.cpp create mode 100644 application/dialogs/CheckableInputDialog.h create mode 100644 application/dialogs/CheckableInputDialog.ui diff --git a/application/CMakeLists.txt b/application/CMakeLists.txt index f8709cfd..6b821707 100644 --- a/application/CMakeLists.txt +++ b/application/CMakeLists.txt @@ -145,6 +145,8 @@ SET(MULTIMC_SOURCES # GUI - dialogs dialogs/AboutDialog.cpp dialogs/AboutDialog.h + dialogs/CheckableInputDialog.cpp + dialogs/CheckableInputDialog.h dialogs/ProfileSelectDialog.cpp dialogs/ProfileSelectDialog.h dialogs/CopyInstanceDialog.cpp @@ -258,6 +260,7 @@ SET(MULTIMC_UIS pages/modplatform/ImportPage.ui # Dialogs + dialogs/CheckableInputDialog.ui dialogs/CopyInstanceDialog.ui dialogs/NewComponentDialog.ui dialogs/NewInstanceDialog.ui diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp index 391e13ed..1ef0b698 100644 --- a/application/MainWindow.cpp +++ b/application/MainWindow.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -74,6 +75,7 @@ #include "groupview/InstanceDelegate.h" #include "widgets/LabeledToolButton.h" #include "widgets/ServerStatus.h" +#include "dialogs/CheckableInputDialog.h" #include "dialogs/NewInstanceDialog.h" #include "dialogs/ProgressDialog.h" #include "dialogs/AboutDialog.h" @@ -1364,6 +1366,7 @@ void MainWindow::finalizeInstance(InstancePtr inst) }); if(update) { + loadDialog.setSkipButton(true, tr("Abort")); loadDialog.setSkipButton(true, tr("Abort")); loadDialog.execWithTask(update.get()); } @@ -1691,7 +1694,15 @@ void MainWindow::on_actionRenameInstance_triggered() { if (m_selectedInstance) { - view->edit(view->currentIndex()); + CheckableInputDialog dialog(this); + dialog.setWindowTitle(tr("Rename")); + dialog.setText(tr("Enter new name for the instance:")); + dialog.setCheckboxText(tr("Rename instance folder")); + dialog.setExtraText(tr("WARNING: Renaming the instance folder may break shortcuts and automation you made!")); + if(dialog.exec() == QDialog::Accepted && !dialog.getInput().isEmpty()) + { + m_selectedInstance->setName(dialog.getInput(), dialog.checkboxChecked()); + } } } diff --git a/application/dialogs/CheckableInputDialog.cpp b/application/dialogs/CheckableInputDialog.cpp new file mode 100644 index 00000000..e4fe608c --- /dev/null +++ b/application/dialogs/CheckableInputDialog.cpp @@ -0,0 +1,41 @@ +#include "CheckableInputDialog.h" + +#include +#include + +#include "ui_CheckableInputDialog.h" + +CheckableInputDialog::CheckableInputDialog(QWidget *parent) : QDialog(parent), ui(new Ui::CheckableInputDialog) +{ + ui->setupUi(this); + + connect(ui->buttonBox->button(QDialogButtonBox::StandardButton::Ok), &QPushButton::clicked, this, &QDialog::accept); + connect(ui->buttonBox->button(QDialogButtonBox::StandardButton::Cancel), &QPushButton::clicked, this, + &QDialog::reject); +} + +void CheckableInputDialog::setText(QString text) +{ + ui->label->setText(text); +} + +void CheckableInputDialog::setExtraText(QString text) +{ + ui->extraText->setText(text); +} + + +void CheckableInputDialog::setCheckboxText(QString checkboxText) +{ + ui->checkBox->setText(checkboxText); +} + +bool CheckableInputDialog::checkboxChecked() +{ + return ui->checkBox->checkState(); +} + +QString CheckableInputDialog::getInput() +{ + return ui->lineEdit->text(); +} \ No newline at end of file diff --git a/application/dialogs/CheckableInputDialog.h b/application/dialogs/CheckableInputDialog.h new file mode 100644 index 00000000..c3d91e6e --- /dev/null +++ b/application/dialogs/CheckableInputDialog.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +namespace Ui +{ + class CheckableInputDialog; +} + +class CheckableInputDialog : public QDialog +{ + Q_OBJECT + +public: + CheckableInputDialog(QWidget *parent); + void setText(QString text); + void setExtraText(QString text); + void setCheckboxText(QString checkboxText); + + bool checkboxChecked(); + QString getInput(); + +private: + Ui::CheckableInputDialog *ui; + +}; diff --git a/application/dialogs/CheckableInputDialog.ui b/application/dialogs/CheckableInputDialog.ui new file mode 100644 index 00000000..975b7f46 --- /dev/null +++ b/application/dialogs/CheckableInputDialog.ui @@ -0,0 +1,94 @@ + + + CheckableInputDialog + + + + 0 + 0 + 186 + 112 + + + + + 0 + 0 + + + + Dialog + + + + + + TextLabel + + + + + + + + + + CheckBox + + + + + + + TextLabel + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + CheckableInputDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + CheckableInputDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/application/groupview/InstanceDelegate.cpp b/application/groupview/InstanceDelegate.cpp index 9774e5e9..7bb2fa82 100644 --- a/application/groupview/InstanceDelegate.cpp +++ b/application/groupview/InstanceDelegate.cpp @@ -341,82 +341,4 @@ QSize ListViewDelegate::sizeHint(const QStyleOptionViewItem &option, return sz; } -class NoReturnTextEdit: public QTextEdit -{ - Q_OBJECT -public: - explicit NoReturnTextEdit(QWidget *parent) : QTextEdit(parent) - { - setTextInteractionFlags(Qt::TextEditorInteraction); - setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff); - setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff); - } - bool event(QEvent * event) override - { - auto eventType = event->type(); - if(eventType == QEvent::KeyPress || eventType == QEvent::KeyRelease) - { - QKeyEvent *keyEvent = static_cast(event); - auto key = keyEvent->key(); - if (key == Qt::Key_Return || key == Qt::Key_Enter) - { - emit editingDone(); - return true; - } - if(key == Qt::Key_Tab) - { - return true; - } - } - return QTextEdit::event(event); - } -signals: - void editingDone(); -}; - -void ListViewDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const -{ - const int iconSize = 48; - QRect textRect = option.rect; - // QStyle *style = option.widget ? option.widget->style() : QApplication::style(); - textRect.adjust(0, iconSize + 5, 0, 0); - editor->setGeometry(textRect); -} - -void ListViewDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const -{ - auto text = index.data(Qt::EditRole).toString(); - QTextEdit * realeditor = qobject_cast(editor); - realeditor->setAlignment(Qt::AlignHCenter | Qt::AlignTop); - realeditor->append(text); - realeditor->selectAll(); - realeditor->document()->clearUndoRedoStacks(); -} - -void ListViewDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const -{ - QTextEdit * realeditor = qobject_cast(editor); - QString text = realeditor->toPlainText(); - text.replace(QChar('\n'), QChar(' ')); - text = text.trimmed(); - if(text.size() != 0) - { - model->setData(index, text); - } -} - -QWidget * ListViewDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const -{ - auto editor = new NoReturnTextEdit(parent); - connect(editor, &NoReturnTextEdit::editingDone, this, &ListViewDelegate::editingDone); - return editor; -} - -void ListViewDelegate::editingDone() -{ - NoReturnTextEdit *editor = qobject_cast(sender()); - emit commitData(editor); - emit closeEditor(editor); -} - #include "InstanceDelegate.moc" diff --git a/application/groupview/InstanceDelegate.h b/application/groupview/InstanceDelegate.h index be49f943..dd935f9f 100644 --- a/application/groupview/InstanceDelegate.h +++ b/application/groupview/InstanceDelegate.h @@ -28,12 +28,4 @@ public: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; - void updateEditorGeometry(QWidget * editor, const QStyleOptionViewItem & option, const QModelIndex & index) const override; - QWidget * createEditor(QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index) const override; - - void setEditorData(QWidget * editor, const QModelIndex & index) const override; - void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const override; - -private slots: - void editingDone(); };