- There's now a notice reminding people to change the base URL if they had a custom base URL and change the paste type (that was something I personally had problems with when I was testing, so a reminder was helpful for me). - Broke down some of the long lines on APIPage.cpp to be more readable. - Added copyright headers where they were missing. - Changed the paste service display names to the names they are more commonly known by. - Changed the default hastebin base URL to https://hst.sh due to the acquisition of https://hastebin.com by Toptal.
		
			
				
	
	
		
			160 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-3.0-only
 | 
						|
/*
 | 
						|
 *  PolyMC - Minecraft Launcher
 | 
						|
 *  Copyright (C) 2022 Lenny McLennington <lenny@sneed.church>
 | 
						|
 *
 | 
						|
 *  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, version 3.
 | 
						|
 *
 | 
						|
 *  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/>.
 | 
						|
 *
 | 
						|
 * This file incorporates work covered by the following copyright and
 | 
						|
 * permission notice:
 | 
						|
 *
 | 
						|
 *      Copyright 2013-2021 MultiMC Contributors
 | 
						|
 *
 | 
						|
 *      Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 *      you may not use this file except in compliance with the License.
 | 
						|
 *      You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 *          http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 *      Unless required by applicable law or agreed to in writing, software
 | 
						|
 *      distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 *      See the License for the specific language governing permissions and
 | 
						|
 *      limitations under the License.
 | 
						|
 */
 | 
						|
 | 
						|
#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 pasteTypeSetting = static_cast<PasteUpload::PasteType>(APPLICATION->settings()->get("PastebinType").toInt());
 | 
						|
    auto pasteCustomAPIBaseSetting = APPLICATION->settings()->get("PastebinCustomAPIBase").toString();
 | 
						|
    std::unique_ptr<PasteUpload> paste(new PasteUpload(parentWidget, text, pasteCustomAPIBaseSetting, pasteTypeSetting));
 | 
						|
 | 
						|
    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);
 | 
						|
}
 |