You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.5 KiB
C++
166 lines
4.5 KiB
C++
/*
|
|
* Copyright 2013 Canonical Ltd.
|
|
* Copyright 2011 Wolfgang Koller - http://www.gofg.at/
|
|
*
|
|
* 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 "cordova.h"
|
|
|
|
#include <QtGui>
|
|
|
|
#include <QApplication>
|
|
#include <QQuickView>
|
|
#include <QQuickItem>
|
|
#include <QQmlContext>
|
|
|
|
Cordova::Cordova(const QDir &wwwDir, QQuickItem *item, QObject *parent)
|
|
: QObject(parent), _item(item), _www(wwwDir),
|
|
_config(_www.absoluteFilePath("../config.xml")) {
|
|
|
|
qDebug() << "Work directory: " << _www.absolutePath();
|
|
|
|
if (_config.content().contains(QRegExp("^(http://)"))) {
|
|
_mainUrl = QString(_config.content());
|
|
} else if (!_www.exists(_config.content())) {
|
|
qCritical() << _config.content() << "does not exist";
|
|
} else {
|
|
_mainUrl = QUrl::fromLocalFile(_www.absoluteFilePath(_config.content()))
|
|
.toString();
|
|
}
|
|
|
|
qDebug() << "Main URL: " << _mainUrl;
|
|
}
|
|
|
|
void Cordova::appLoaded() {
|
|
initPlugins();
|
|
for (QSharedPointer<CPlugin> &plugin: _plugins) {
|
|
plugin->onAppLoaded();
|
|
}
|
|
}
|
|
|
|
QString Cordova::get_app_dir() {
|
|
return _www.absolutePath();
|
|
}
|
|
|
|
struct Splash {
|
|
double rating;
|
|
QString path;
|
|
};
|
|
|
|
QString Cordova::getSplashscreenPath() {
|
|
double ratio = (double)_item->width() / _item->height();
|
|
|
|
QDir dir(get_app_dir());
|
|
if (!dir.cd("splashscreen"))
|
|
return "";
|
|
|
|
QList<Splash> images;
|
|
for (QFileInfo info: dir.entryInfoList()) {
|
|
QImage image(info.absoluteFilePath());
|
|
if (image.isNull())
|
|
continue;
|
|
Splash t;
|
|
t.path = info.absoluteFilePath();
|
|
t.rating = std::abs((image.width() / (double)_item->width()) * ((image.width() / image.height()) / ratio) - 1);
|
|
images.push_back(t);
|
|
}
|
|
std::min_element(images.begin(), images.end(), [](Splash &f, Splash &s) {
|
|
return f.rating < s.rating;
|
|
});
|
|
if (!images.empty())
|
|
return images.first().path;
|
|
return "";
|
|
}
|
|
|
|
const CordovaInternal::Config& Cordova::config() const {
|
|
return _config;}
|
|
|
|
|
|
void Cordova::initPlugins() {
|
|
QList<QDir> searchPath = {get_app_dir()};
|
|
|
|
_plugins.clear();
|
|
for (QDir pluginsDir: searchPath) {
|
|
for (const QString &fileName: pluginsDir.entryList(QDir::Files)) {
|
|
QString path = pluginsDir.absoluteFilePath(fileName);
|
|
qDebug() << "Testing" << path;
|
|
|
|
if (!QLibrary::isLibrary(path))
|
|
continue;
|
|
|
|
CordovaGetPluginInstances loader = (CordovaGetPluginInstances) QLibrary::resolve(path, "cordovaGetPluginInstances");
|
|
if (!loader) {
|
|
qCritical() << "Missing cordovaGetPluginInstances symbol in" << path;
|
|
continue;
|
|
}
|
|
|
|
auto plugins = (*loader)(this);
|
|
|
|
for (QSharedPointer<CPlugin> plugin: plugins) {
|
|
qDebug() << "Enable plugin" << plugin->fullName();
|
|
emit pluginWantsToBeAdded(plugin->fullName(), plugin.data(), plugin->shortName());
|
|
}
|
|
_plugins += plugins;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Cordova::loadFinished(bool ok) {
|
|
Q_UNUSED(ok)
|
|
|
|
initPlugins();
|
|
}
|
|
|
|
void Cordova::execQML(const QString &src) {
|
|
emit qmlExecNeeded(src);
|
|
}
|
|
|
|
void Cordova::execJS(const QString &js) {
|
|
emit javaScriptExecNeeded(js);
|
|
}
|
|
|
|
QString Cordova::mainUrl() const {
|
|
return _mainUrl;
|
|
}
|
|
|
|
QObject *Cordova::topLevelEventsReceiver() {
|
|
return dynamic_cast<QQuickWindow*>(_item->window());
|
|
}
|
|
|
|
QQuickItem *Cordova::rootObject() {
|
|
return _item->parentItem();
|
|
}
|
|
|
|
void Cordova::setTitle(const QString &title) {
|
|
dynamic_cast<QQuickWindow*>(_item->window())->setTitle(title);
|
|
}
|
|
|
|
void Cordova::pushViewState(const QString &state) {
|
|
if (_states.empty()) {
|
|
rootObject()->setState(state);
|
|
}
|
|
_states.push_front(state);
|
|
}
|
|
|
|
void Cordova::popViewState(const QString &state) {
|
|
if (!_states.removeOne(state))
|
|
qDebug() << "WARNING: incorrect view states order";
|
|
|
|
if (_states.empty()) {
|
|
rootObject()->setState("main");
|
|
} else {
|
|
rootObject()->setState(_states.front());
|
|
}
|
|
}
|