summaryrefslogtreecommitdiff
path: root/meshmc/launcher/ui/GuiUtil.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'meshmc/launcher/ui/GuiUtil.cpp')
-rw-r--r--meshmc/launcher/ui/GuiUtil.cpp154
1 files changed, 154 insertions, 0 deletions
diff --git a/meshmc/launcher/ui/GuiUtil.cpp b/meshmc/launcher/ui/GuiUtil.cpp
new file mode 100644
index 0000000000..eef8514767
--- /dev/null
+++ b/meshmc/launcher/ui/GuiUtil.cpp
@@ -0,0 +1,154 @@
+/* SPDX-FileCopyrightText: 2026 Project Tick
+ * SPDX-FileContributor: Project Tick
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * MeshMC - A Custom Launcher for Minecraft
+ * Copyright (C) 2026 Project Tick
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "GuiUtil.h"
+
+#include <QClipboard>
+#include <QApplication>
+#include <QFileDialog>
+
+#include "ui/dialogs/ProgressDialog.h"
+#include "ui/dialogs/CustomMessageBox.h"
+#include "net/PasteUpload.h"
+
+#include "Application.h"
+#include <settings/SettingsObject.h>
+#include <DesktopServices.h>
+#include <BuildConfig.h>
+
+QString GuiUtil::uploadPaste(const QString& text, QWidget* parentWidget)
+{
+ ProgressDialog dialog(parentWidget);
+ auto APIKeySetting =
+ APPLICATION->settings()->get("PasteEEAPIKey").toString();
+ if (APIKeySetting == "meshmc") {
+ APIKeySetting = BuildConfig.PASTE_EE_KEY;
+ }
+ std::unique_ptr<PasteUpload> paste(
+ new PasteUpload(parentWidget, text, APIKeySetting));
+
+ if (!paste->validateText()) {
+ CustomMessageBox::selectable(
+ parentWidget, QObject::tr("Upload failed"),
+ QObject::tr(
+ "The log file is too big. You'll have to upload it manually."),
+ QMessageBox::Warning)
+ ->exec();
+ return QString();
+ }
+
+ dialog.execWithTask(paste.get());
+ if (!paste->wasSuccessful()) {
+ CustomMessageBox::selectable(parentWidget, QObject::tr("Upload failed"),
+ paste->failReason(), QMessageBox::Critical)
+ ->exec();
+ return QString();
+ } else {
+ const QString link = paste->pasteLink();
+ setClipboardText(link);
+ CustomMessageBox::selectable(
+ parentWidget, QObject::tr("Upload finished"),
+ QObject::tr("The <a href=\"%1\">link to the uploaded log</a> has "
+ "been placed in your clipboard.")
+ .arg(link),
+ QMessageBox::Information)
+ ->exec();
+ return link;
+ }
+}
+
+void GuiUtil::setClipboardText(const QString& text)
+{
+ QApplication::clipboard()->setText(text);
+}
+
+static QStringList BrowseForFileInternal(QString context, QString caption,
+ QString filter, QString defaultPath,
+ QWidget* parentWidget, bool single)
+{
+ static QMap<QString, QString> savedPaths;
+
+ QFileDialog w(parentWidget, caption);
+ QSet<QString> locations;
+ auto f = [&](QStandardPaths::StandardLocation l) {
+ QString location = QStandardPaths::writableLocation(l);
+ QFileInfo finfo(location);
+ if (!finfo.exists()) {
+ return;
+ }
+ locations.insert(location);
+ };
+ f(QStandardPaths::DesktopLocation);
+ f(QStandardPaths::DocumentsLocation);
+ f(QStandardPaths::DownloadLocation);
+ f(QStandardPaths::HomeLocation);
+ QList<QUrl> urls;
+ for (auto location : locations) {
+ urls.append(QUrl::fromLocalFile(location));
+ }
+ urls.append(QUrl::fromLocalFile(defaultPath));
+
+ w.setFileMode(single ? QFileDialog::ExistingFile
+ : QFileDialog::ExistingFiles);
+ w.setAcceptMode(QFileDialog::AcceptOpen);
+ w.setNameFilter(filter);
+
+ QString pathToOpen;
+ if (savedPaths.contains(context)) {
+ pathToOpen = savedPaths[context];
+ } else {
+ pathToOpen = defaultPath;
+ }
+ if (!pathToOpen.isEmpty()) {
+ QFileInfo finfo(pathToOpen);
+ if (finfo.exists() && finfo.isDir()) {
+ w.setDirectory(finfo.absoluteFilePath());
+ }
+ }
+
+ w.setSidebarUrls(urls);
+
+ if (w.exec()) {
+ savedPaths[context] = w.directory().absolutePath();
+ return w.selectedFiles();
+ }
+ savedPaths[context] = w.directory().absolutePath();
+ return {};
+}
+
+QString GuiUtil::BrowseForFile(QString context, QString caption, QString filter,
+ QString defaultPath, QWidget* parentWidget)
+{
+ auto resultList = BrowseForFileInternal(context, caption, filter,
+ defaultPath, parentWidget, true);
+ if (resultList.size()) {
+ return resultList[0];
+ }
+ return QString();
+}
+
+QStringList GuiUtil::BrowseForFiles(QString context, QString caption,
+ QString filter, QString defaultPath,
+ QWidget* parentWidget)
+{
+ return BrowseForFileInternal(context, caption, filter, defaultPath,
+ parentWidget, false);
+}