aboutsummaryrefslogtreecommitdiff
path: root/application/pages/instance/WorldListPage.cpp
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2020-08-22 01:34:55 +0200
committerPetr Mrázek <peterix@gmail.com>2020-08-22 01:34:55 +0200
commit8a0027c73a755849bf5b58c1509c71a543ddb982 (patch)
treef4c87ea06b753d771015f444bc1ff68a624c782e /application/pages/instance/WorldListPage.cpp
parentc6c9feb3a2006f0b37736799f003a0fb87f68b18 (diff)
downloadPrismLauncher-8a0027c73a755849bf5b58c1509c71a543ddb982.tar.gz
PrismLauncher-8a0027c73a755849bf5b58c1509c71a543ddb982.tar.bz2
PrismLauncher-8a0027c73a755849bf5b58c1509c71a543ddb982.zip
NOISSUE Add world icons and world icon reset button
Diffstat (limited to 'application/pages/instance/WorldListPage.cpp')
-rw-r--r--application/pages/instance/WorldListPage.cpp47
1 files changed, 46 insertions, 1 deletions
diff --git a/application/pages/instance/WorldListPage.cpp b/application/pages/instance/WorldListPage.cpp
index 8358a0f1..75741d22 100644
--- a/application/pages/instance/WorldListPage.cpp
+++ b/application/pages/instance/WorldListPage.cpp
@@ -31,6 +31,33 @@
#include <QProcess>
#include <FileSystem.h>
+class WorldListProxyModel : public QSortFilterProxyModel
+{
+ Q_OBJECT
+
+public:
+ WorldListProxyModel(QObject *parent) : QSortFilterProxyModel(parent) {}
+
+ virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
+ {
+ QModelIndex sourceIndex = mapToSource(index);
+
+ if (index.column() == 0 && role == Qt::DecorationRole)
+ {
+ WorldList *worlds = qobject_cast<WorldList *>(sourceModel());
+ auto iconFile = worlds->data(sourceIndex, WorldList::IconFileRole).toString();
+ if(iconFile.isNull()) {
+ // NOTE: Minecraft uses the same placeholder for servers AND worlds
+ return MMC->getThemedIcon("unknown_server");
+ }
+ return QIcon(iconFile);
+ }
+
+ return sourceIndex.data(role);
+ }
+};
+
+
WorldListPage::WorldListPage(BaseInstance *inst, std::shared_ptr<WorldList> worlds, QWidget *parent)
: QMainWindow(parent), m_inst(inst), ui(new Ui::WorldListPage), m_worlds(worlds)
{
@@ -38,13 +65,14 @@ WorldListPage::WorldListPage(BaseInstance *inst, std::shared_ptr<WorldList> worl
ui->toolBar->insertSpacer(ui->actionRefresh);
- QSortFilterProxyModel * proxy = new QSortFilterProxyModel(this);
+ WorldListProxyModel * proxy = new WorldListProxyModel(this);
proxy->setSortCaseSensitivity(Qt::CaseInsensitive);
proxy->setSourceModel(m_worlds.get());
ui->worldTreeView->setSortingEnabled(true);
ui->worldTreeView->setModel(proxy);
ui->worldTreeView->installEventFilter(this);
ui->worldTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
+ ui->worldTreeView->setIconSize(QSize(64,64));
connect(ui->worldTreeView, &QTreeView::customContextMenuRequested, this, &WorldListPage::ShowContextMenu);
auto head = ui->worldTreeView->header();
@@ -142,6 +170,19 @@ void WorldListPage::on_actionView_Folder_triggered()
DesktopServices::openDirectory(m_worlds->dir().absolutePath(), true);
}
+void WorldListPage::on_actionReset_Icon_triggered()
+{
+ auto proxiedIndex = getSelectedWorld();
+
+ if(!proxiedIndex.isValid())
+ return;
+
+ if(m_worlds->resetIcon(proxiedIndex.row())) {
+ ui->actionReset_Icon->setEnabled(false);
+ }
+}
+
+
QModelIndex WorldListPage::getSelectedWorld()
{
auto index = ui->worldTreeView->selectionModel()->currentIndex();
@@ -255,6 +296,8 @@ void WorldListPage::worldChanged(const QModelIndex &current, const QModelIndex &
ui->actionRemove->setEnabled(enable);
ui->actionCopy->setEnabled(enable);
ui->actionRename->setEnabled(enable);
+ bool hasIcon = !index.data(WorldList::IconFileRole).isNull();
+ ui->actionReset_Icon->setEnabled(enable && hasIcon);
}
void WorldListPage::on_actionAdd_triggered()
@@ -342,3 +385,5 @@ void WorldListPage::on_actionRefresh_triggered()
{
m_worlds->update();
}
+
+#include "WorldListPage.moc"