From 38693e1d6ca7f05d9488348ddf298488d1cc0995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 6 Sep 2015 23:35:58 +0200 Subject: GH-1047 parse world files and integrate MCEdit with world page --- application/pages/WorldListPage.cpp | 104 +++++++++++++++++- application/pages/WorldListPage.h | 6 ++ application/pages/WorldListPage.ui | 209 +++++++++++++++++++++--------------- 3 files changed, 225 insertions(+), 94 deletions(-) (limited to 'application') diff --git a/application/pages/WorldListPage.cpp b/application/pages/WorldListPage.cpp index de31f519..8b95b2b0 100644 --- a/application/pages/WorldListPage.cpp +++ b/application/pages/WorldListPage.cpp @@ -19,7 +19,12 @@ #include "dialogs/ModEditDialogCommon.h" #include #include +#include #include +#include + + +#include "MultiMC.h" WorldListPage::WorldListPage(BaseInstance *inst, std::shared_ptr worlds, QString id, QString iconName, QString displayName, QString helpPage, @@ -28,8 +33,20 @@ WorldListPage::WorldListPage(BaseInstance *inst, std::shared_ptr worl { ui->setupUi(this); ui->tabWidget->tabBar()->hide(); - ui->worldTreeView->setModel(m_worlds.get()); + QSortFilterProxyModel * proxy = new QSortFilterProxyModel(this); + proxy->setSourceModel(m_worlds.get()); + ui->worldTreeView->setSortingEnabled(true); + ui->worldTreeView->setModel(proxy); ui->worldTreeView->installEventFilter(this); + + auto head = ui->worldTreeView->header(); + + head->setSectionResizeMode(0, QHeaderView::Stretch); + head->setSectionResizeMode(1, QHeaderView::ResizeToContents); + connect(ui->worldTreeView->selectionModel(), + SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this, + SLOT(worldChanged(const QModelIndex &, const QModelIndex &))); + worldChanged(QModelIndex(), QModelIndex()); } void WorldListPage::opened() @@ -79,12 +96,12 @@ bool WorldListPage::eventFilter(QObject *obj, QEvent *ev) return worldListFilter(keyEvent); return QWidget::eventFilter(obj, ev); } + void WorldListPage::on_rmWorldBtn_clicked() { - int first, last; - auto list = ui->worldTreeView->selectionModel()->selectedRows(); + auto proxiedIndex = getSelectedWorld(); - if (!lastfirst(list, first, last)) + if(!proxiedIndex.isValid()) return; auto result = QMessageBox::question(this, @@ -98,7 +115,7 @@ void WorldListPage::on_rmWorldBtn_clicked() return; } m_worlds->stopWatching(); - m_worlds->deleteWorlds(first, last); + m_worlds->deleteWorld(proxiedIndex.row()); m_worlds->startWatching(); } @@ -106,3 +123,80 @@ void WorldListPage::on_viewFolderBtn_clicked() { openDirInDefaultProgram(m_worlds->dir().absolutePath(), true); } + +QModelIndex WorldListPage::getSelectedWorld() +{ + auto index = ui->worldTreeView->selectionModel()->currentIndex(); + + auto proxy = (QSortFilterProxyModel *) ui->worldTreeView->model(); + return proxy->mapToSource(index); +} + +void WorldListPage::on_copySeedBtn_clicked() +{ + QModelIndex index = getSelectedWorld(); + + if (!index.isValid()) + { + return; + } + int64_t seed = m_worlds->data(index, WorldList::SeedRole).toLongLong(); + MMC->clipboard()->setText(QString::number(seed)); +} + +void WorldListPage::on_mcEditBtn_clicked() +{ + const QString mceditPath = MMC->settings()->get("MCEditPath").toString(); + + QModelIndex index = getSelectedWorld(); + + if (!index.isValid()) + { + return; + } + + auto fullPath = m_worlds->data(index, WorldList::FolderRole).toString(); + +#ifdef Q_OS_OSX + QProcess *process = new QProcess(); + connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), process, SLOT(deleteLater())); + process->setProgram(mceditPath); + process->setArguments(QStringList() << fullPath); + process->start(); +#else + QDir mceditDir(mceditPath); + QString program; + #ifdef Q_OS_LINUX + if (mceditDir.exists("mcedit.py")) + { + program = mceditDir.absoluteFilePath("mcedit.py"); + } + else if (mceditDir.exists("mcedit.sh")) + { + program = mceditDir.absoluteFilePath("mcedit.sh"); + } + #elif defined(Q_OS_WIN32) + if (mceditDir.exists("mcedit.exe")) + { + program = mceditDir.absoluteFilePath("mcedit.exe"); + } + else if (mceditDir.exists("mcedit2.exe")) + { + program = mceditDir.absoluteFilePath("mcedit2.exe"); + } + #endif + if(program.size()) + { + QProcess::startDetached(program, QStringList() << fullPath, mceditPath); + } +#endif +} + +void WorldListPage::worldChanged(const QModelIndex ¤t, const QModelIndex &previous) +{ + QModelIndex index = getSelectedWorld(); + bool enable = index.isValid(); + ui->copySeedBtn->setEnabled(enable); + ui->mcEditBtn->setEnabled(enable); + ui->rmWorldBtn->setEnabled(enable); +} diff --git a/application/pages/WorldListPage.h b/application/pages/WorldListPage.h index d3de5d3c..c79f1be6 100644 --- a/application/pages/WorldListPage.h +++ b/application/pages/WorldListPage.h @@ -66,6 +66,9 @@ protected: protected: BaseInstance *m_inst; +private: + QModelIndex getSelectedWorld(); + private: Ui::WorldListPage *ui; std::shared_ptr m_worlds; @@ -75,6 +78,9 @@ private: QString m_helpName; private slots: + void on_copySeedBtn_clicked(); + void on_mcEditBtn_clicked(); void on_rmWorldBtn_clicked(); void on_viewFolderBtn_clicked(); + void worldChanged(const QModelIndex ¤t, const QModelIndex &previous); }; diff --git a/application/pages/WorldListPage.ui b/application/pages/WorldListPage.ui index b8100acd..9d396fa6 100644 --- a/application/pages/WorldListPage.ui +++ b/application/pages/WorldListPage.ui @@ -1,94 +1,125 @@ - WorldListPage - - - - 0 - 0 - 723 - 532 - - - - Mods - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 0 - - - - Tab 1 - - - - - - - 0 - 0 - - - - true - - - QAbstractItemView::DropOnly - - - - - - - - - &Remove - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - &View Folder - - - - - - - - - + WorldListPage + + + + 0 + 0 + 723 + 532 + + + + Mods + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + + Tab 1 + + + + + + + 0 + 0 + + + + true + + + QAbstractItemView::DropOnly + + + true + + + true + + + false + + + + + + + + + MCEdit + + + + + + + Copy Seed + + + + + + + &Remove + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + &View Folder + + + + + + - - + + + + + tabWidget + worldTreeView + mcEditBtn + copySeedBtn + rmWorldBtn + viewFolderBtn + + + -- cgit v1.2.3