1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00
Files
vcmi/launcher/helper.cpp
Laserlicht 5344fdae91 review
2025-08-31 11:22:44 +02:00

147 lines
3.7 KiB
C++

/*
* helper.cpp, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#include "StdInc.h"
#include "helper.h"
#include "mainwindow_moc.h"
#include "settingsView/csettingsview_moc.h"
#include "modManager/cmodlistview_moc.h"
#include "../lib/CConfigHandler.h"
#include <QObject>
#include <QScroller>
#ifdef VCMI_ANDROID
#include <QAndroidJniObject>
#include <QtAndroid>
#endif
#ifdef VCMI_IOS
#include "ios/revealdirectoryinfiles.h"
#endif
#ifdef VCMI_MOBILE
static QScrollerProperties generateScrollerProperties()
{
QScrollerProperties result;
result.setScrollMetric(QScrollerProperties::OvershootDragResistanceFactor, 0.25);
result.setScrollMetric(QScrollerProperties::OvershootDragDistanceFactor, 0.25);
result.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff);
return result;
}
#endif
namespace Helper
{
void loadSettings()
{
settings.init("config/settings.json", "vcmi:settings");
persistentStorage.init("config/persistentStorage.json", "");
}
void reLoadSettings()
{
loadSettings();
for(const auto widget : qApp->allWidgets())
if(auto settingsView = qobject_cast<CSettingsView *>(widget))
{
settingsView->loadSettings();
break;
}
getMainWindow()->updateTranslation();
getMainWindow()->getModView()->reload();
}
void enableScrollBySwiping(QObject * scrollTarget)
{
#ifdef VCMI_MOBILE
QScroller::grabGesture(scrollTarget, QScroller::LeftMouseButtonGesture);
QScroller * scroller = QScroller::scroller(scrollTarget);
scroller->setScrollerProperties(generateScrollerProperties());
#endif
}
QString getRealPath(QString path)
{
#ifdef VCMI_ANDROID
if(path.contains("content://", Qt::CaseInsensitive))
{
auto str = QAndroidJniObject::fromString(path);
return QAndroidJniObject::callStaticObjectMethod("eu/vcmi/vcmi/util/FileUtil", "getFilenameFromUri", "(Ljava/lang/String;Landroid/content/Context;)Ljava/lang/String;", str.object<jstring>(), QtAndroid::androidContext().object()).toString();
}
else
return path;
#else
return path;
#endif
}
void performNativeCopy(QString src, QString dst)
{
#ifdef VCMI_ANDROID
auto percentEncodeNonAscii = [](const QString &input) -> QString
{
QByteArray utf8 = input.toUtf8();
QByteArray encoded;
for(unsigned char c : utf8)
{
// If ASCII (0x00 to 0x7F), keep as is
if(c < 0x80)
encoded.append(c);
else
{
// Non-ASCII: encode as %HH
encoded.append('%');
encoded.append(QByteArray::number(static_cast<uint>(c), 16).toUpper().rightJustified(2, '0'));
}
}
return QString::fromUtf8(encoded);
};
auto safeEncode = [&](QString uri) -> QString
{
if(!uri.startsWith("content://", Qt::CaseInsensitive))
return uri;
uri.replace(" ", "%20");
return percentEncodeNonAscii(uri);
};
auto srcStr = QAndroidJniObject::fromString(safeEncode(src));
auto dstStr = QAndroidJniObject::fromString(safeEncode(dst));
QAndroidJniObject::callStaticObjectMethod("eu/vcmi/vcmi/util/FileUtil", "copyFileFromUri", "(Ljava/lang/String;Ljava/lang/String;Landroid/content/Context;)V", srcStr.object<jstring>(), dstStr.object<jstring>(), QtAndroid::androidContext().object());
#else
QFile::copy(src, dst);
#endif
}
void revealDirectoryInFileBrowser(QString path)
{
const auto dirUrl = QUrl::fromLocalFile(QFileInfo{path}.absoluteFilePath());
#ifdef VCMI_IOS
iOS_utils::revealDirectoryInFiles(dirUrl);
#else
QDesktopServices::openUrl(dirUrl);
#endif
}
MainWindow * getMainWindow()
{
foreach(QWidget *w, qApp->allWidgets())
if(auto mainWin = qobject_cast<MainWindow*>(w))
return mainWin;
return nullptr;
}
}