| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 | /* * 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_MOBILEstatic QScrollerProperties generateScrollerProperties(){	QScrollerProperties result;	result.setScrollMetric(QScrollerProperties::OvershootDragResistanceFactor, 0.25);	result.setScrollMetric(QScrollerProperties::OvershootDragDistanceFactor, 0.25);	result.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff);	return result;}#endifnamespace 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);	};	// %-encode unencoded parts of string.	// This is needed because QT returns a mixed content url with %-encoded and unencoded parts. If Android > 13 this causes problems reading this files. E.g. when using spaces and unicode characters in folder or filename.	// Related, but seems not completly fixed (at least in our setup): https://bugreports.qt.io/browse/QTBUG-114435	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;}}
 |