mirror of
https://github.com/QuasarApp/QtDeployer.git
synced 2025-04-28 14:34:35 +00:00
Added the already written project
This commit is contained in:
parent
48e18074cc
commit
e284be3811
21
CPP/baseclass.cpp
Executable file
21
CPP/baseclass.cpp
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#include "baseclass.h"
|
||||||
|
|
||||||
|
QString BaseClass::m_qtdir = QString();
|
||||||
|
QString BaseClass::m_outputdir = QString();
|
||||||
|
QString BaseClass::m_projectdir = QString();
|
||||||
|
QString BaseClass::m_executablepath = QString();
|
||||||
|
|
||||||
|
QStringList BaseClass::findFilesInsideDir(const QString &name, const QString &dirpath)
|
||||||
|
{
|
||||||
|
QStringList files;
|
||||||
|
|
||||||
|
QDir dir(dirpath);
|
||||||
|
dir.setNameFilters(QStringList(name));
|
||||||
|
|
||||||
|
QDirIterator it(dir, QDirIterator::Subdirectories);
|
||||||
|
while (it.hasNext()) files << it.next();
|
||||||
|
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseClass::BaseClass(QObject *parent) : QObject(parent) {}
|
29
CPP/baseclass.h
Executable file
29
CPP/baseclass.h
Executable file
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef BASECLASS_H
|
||||||
|
#define BASECLASS_H
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QDirIterator>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QObject>
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
class BaseClass : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static QString m_qtdir;
|
||||||
|
static QString m_outputdir;
|
||||||
|
static QString m_projectdir;
|
||||||
|
static QString m_executablepath;
|
||||||
|
|
||||||
|
QStringList findFilesInsideDir(const QString &name, const QString &dirpath);
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit BaseClass(QObject *parent = nullptr);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // BASECLASS_H
|
118
CPP/cppmanager.cpp
Executable file
118
CPP/cppmanager.cpp
Executable file
@ -0,0 +1,118 @@
|
|||||||
|
#include "cppmanager.h"
|
||||||
|
|
||||||
|
void CppManager::setQtLibraries(const QStringList &qtLibraries)
|
||||||
|
{
|
||||||
|
if (m_qtLibraries == qtLibraries) return;
|
||||||
|
|
||||||
|
m_qtLibraries = qtLibraries;
|
||||||
|
emit qtLibrariesChanged(m_qtLibraries);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CppManager::setCppLibraries(const QStringList &cppLibraries)
|
||||||
|
{
|
||||||
|
if (m_cppLibraries == cppLibraries) return;
|
||||||
|
|
||||||
|
m_cppLibraries = cppLibraries;
|
||||||
|
emit cppLibrariesChanged(m_cppLibraries);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CppManager::setNotFoundLibs(const QStringList ¬FoundLibs)
|
||||||
|
{
|
||||||
|
if (m_notFoundLibs == notFoundLibs) return;
|
||||||
|
|
||||||
|
m_notFoundLibs = notFoundLibs;
|
||||||
|
emit notFoundLibsChanged(m_notFoundLibs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CppManager::extractAllLibs(const QStringList &execfiles)
|
||||||
|
{
|
||||||
|
for (const QString &execfile : execfiles)
|
||||||
|
for (const QString &lib : extractLibsFromExecutable(execfile))
|
||||||
|
if (!m_cppLibraries.contains(lib))
|
||||||
|
{
|
||||||
|
m_cppLibraries << lib;
|
||||||
|
extractAllLibs(QStringList(lib));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList CppManager::extractLibsFromExecutable(const QString &execpath)
|
||||||
|
{
|
||||||
|
QProcess P;
|
||||||
|
P.start("ldd " + execpath, QProcess::ReadOnly);
|
||||||
|
|
||||||
|
if (!P.waitForStarted()) return QStringList();
|
||||||
|
if (!P.waitForFinished()) return QStringList();
|
||||||
|
|
||||||
|
auto data = QString(P.readAll());
|
||||||
|
QStringList libs;
|
||||||
|
|
||||||
|
for (QString &line : data.split("\n", QString::SkipEmptyParts))
|
||||||
|
{
|
||||||
|
line = line.simplified();
|
||||||
|
auto innerlist = line.split(" ");
|
||||||
|
|
||||||
|
if (innerlist.count() < 3) continue;
|
||||||
|
line = innerlist[2];
|
||||||
|
|
||||||
|
if (!line.startsWith("/"))
|
||||||
|
m_notFoundLibs << innerlist[0];
|
||||||
|
else
|
||||||
|
libs << line;
|
||||||
|
}
|
||||||
|
|
||||||
|
return libs;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CppManager::divideLibraries()
|
||||||
|
{
|
||||||
|
for (const QString &lib : m_cppLibraries)
|
||||||
|
{
|
||||||
|
QString name;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
name = QFileInfo(lib).fileName();
|
||||||
|
}
|
||||||
|
catch (std::exception E)
|
||||||
|
{
|
||||||
|
qDebug() << E.what();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!name.isEmpty() && name.startsWith("libQt"))
|
||||||
|
{
|
||||||
|
m_qtLibraries << name;
|
||||||
|
m_cppLibraries.removeOne(lib);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CppManager::start(const QStringList &executables)
|
||||||
|
{
|
||||||
|
m_qtLibraries.clear();
|
||||||
|
m_cppLibraries.clear();
|
||||||
|
m_notFoundLibs.clear();
|
||||||
|
|
||||||
|
extractAllLibs(executables);
|
||||||
|
divideLibraries();
|
||||||
|
|
||||||
|
m_notFoundLibs.removeDuplicates();
|
||||||
|
|
||||||
|
emit qtLibrariesChanged(m_qtLibraries);
|
||||||
|
emit cppLibrariesChanged(m_cppLibraries);
|
||||||
|
emit notFoundLibsChanged(m_notFoundLibs);
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList CppManager::getQtLibrariesFullPaths()
|
||||||
|
{
|
||||||
|
QStringList paths;
|
||||||
|
|
||||||
|
auto dir = m_qtdir + "/lib";
|
||||||
|
for (const QString &qtlib : m_qtLibraries) paths << dir + "/" + qtlib;
|
||||||
|
|
||||||
|
return paths;
|
||||||
|
}
|
||||||
|
|
||||||
|
CppManager::CppManager(QObject *parent) : BaseClass(parent) {}
|
||||||
|
QStringList CppManager::qtLibraries() const { return m_qtLibraries; }
|
||||||
|
QStringList CppManager::cppLibraries() const { return m_cppLibraries; }
|
||||||
|
QStringList CppManager::notFoundLibs() const { return m_notFoundLibs; }
|
50
CPP/cppmanager.h
Executable file
50
CPP/cppmanager.h
Executable file
@ -0,0 +1,50 @@
|
|||||||
|
#ifndef CPPMANAGER_H
|
||||||
|
#define CPPMANAGER_H
|
||||||
|
|
||||||
|
#include "baseclass.h"
|
||||||
|
|
||||||
|
class CppManager : public BaseClass
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QStringList qtLibraries READ qtLibraries WRITE setQtLibraries
|
||||||
|
NOTIFY qtLibrariesChanged)
|
||||||
|
|
||||||
|
Q_PROPERTY(QStringList cppLibraries READ cppLibraries WRITE setCppLibraries
|
||||||
|
NOTIFY cppLibrariesChanged)
|
||||||
|
|
||||||
|
Q_PROPERTY(QStringList notFoundLibs READ notFoundLibs WRITE setNotFoundLibs
|
||||||
|
NOTIFY notFoundLibsChanged)
|
||||||
|
|
||||||
|
QStringList m_qtLibraries;
|
||||||
|
QStringList m_cppLibraries;
|
||||||
|
QStringList m_notFoundLibs;
|
||||||
|
|
||||||
|
public: // TODO remove this line
|
||||||
|
void extractAllLibs(const QStringList &execfiles);
|
||||||
|
QStringList extractLibsFromExecutable(const QString &execpath);
|
||||||
|
|
||||||
|
void divideLibraries();
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit CppManager(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
QStringList qtLibraries() const;
|
||||||
|
QStringList cppLibraries() const;
|
||||||
|
QStringList notFoundLibs() const;
|
||||||
|
|
||||||
|
QStringList getQtLibrariesFullPaths();
|
||||||
|
|
||||||
|
void start(const QStringList &executables);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void setQtLibraries(const QStringList &qtLibraries);
|
||||||
|
void setCppLibraries(const QStringList &cppLibraries);
|
||||||
|
void setNotFoundLibs(const QStringList ¬FoundLibs);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void qtLibrariesChanged(QStringList qtLibraries);
|
||||||
|
void cppLibrariesChanged(QStringList cppLibraries);
|
||||||
|
void notFoundLibsChanged(QStringList notFoundLibs);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CPPMANAGER_H
|
78
CPP/mainmanager.cpp
Executable file
78
CPP/mainmanager.cpp
Executable file
@ -0,0 +1,78 @@
|
|||||||
|
#include "mainmanager.h"
|
||||||
|
|
||||||
|
QStringList MainManager::getAllExecutables()
|
||||||
|
{
|
||||||
|
QStringList list = m_qml->getAllSoFiles();
|
||||||
|
list << m_plg->getAllSoFiles();
|
||||||
|
list << m_executablepath;
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
MainManager::MainManager(CppManager *cpp, QmlManager *qml, OutputManager *out,
|
||||||
|
PluginManager *plg, QObject *parent)
|
||||||
|
: BaseClass(parent)
|
||||||
|
{
|
||||||
|
setState(0);
|
||||||
|
|
||||||
|
m_cpp = cpp;
|
||||||
|
m_qml = qml;
|
||||||
|
m_out = out;
|
||||||
|
m_plg = plg;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainManager::prepare(const QString &qtdir, const QString &execpath,
|
||||||
|
const QString &projectdir, const QString &outdir)
|
||||||
|
{
|
||||||
|
QStringList list;
|
||||||
|
list << qtdir << execpath << projectdir << outdir;
|
||||||
|
|
||||||
|
for (QString &S : list)
|
||||||
|
if (S[S.count() - 1] == "/") S.remove(S.count() - 1, 1);
|
||||||
|
|
||||||
|
m_qtdir = list[0];
|
||||||
|
m_executablepath = list[1];
|
||||||
|
m_projectdir = list[2];
|
||||||
|
m_outputdir = list[3];
|
||||||
|
|
||||||
|
m_qml->start();
|
||||||
|
m_plg->start();
|
||||||
|
m_cpp->start(getAllExecutables());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainManager::start(bool erase)
|
||||||
|
{
|
||||||
|
setState(1);
|
||||||
|
|
||||||
|
m_out->copyAll(m_cpp->getQtLibrariesFullPaths(), m_cpp->cppLibraries(),
|
||||||
|
m_qml->foundImports(), m_plg->neededPlugins(), erase);
|
||||||
|
|
||||||
|
setState(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MainManager::hasPrems(const QString &path)
|
||||||
|
{
|
||||||
|
QFileInfo info(path);
|
||||||
|
return (info.isReadable() && info.isWritable());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString MainManager::stringFromUrl(QString url)
|
||||||
|
{
|
||||||
|
return url.remove("file://");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MainManager::pathExists(bool isdir, const QString &path)
|
||||||
|
{
|
||||||
|
if (isdir) return QDir(path).exists();
|
||||||
|
return QFile(path).exists();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainManager::setState(int state)
|
||||||
|
{
|
||||||
|
if (m_state == state) return;
|
||||||
|
|
||||||
|
m_state = state;
|
||||||
|
emit stateChanged(m_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
int MainManager::state() const { return m_state; }
|
47
CPP/mainmanager.h
Executable file
47
CPP/mainmanager.h
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
#ifndef MAINMANAGER_H
|
||||||
|
#define MAINMANAGER_H
|
||||||
|
|
||||||
|
#include "baseclass.h"
|
||||||
|
#include "cppmanager.h"
|
||||||
|
#include "outputmanager.h"
|
||||||
|
#include "pluginmanager.h"
|
||||||
|
#include "qmlmanager.h"
|
||||||
|
|
||||||
|
class MainManager : public BaseClass
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(int state READ state WRITE setState NOTIFY stateChanged)
|
||||||
|
|
||||||
|
CppManager *m_cpp;
|
||||||
|
QmlManager *m_qml;
|
||||||
|
PluginManager *m_plg;
|
||||||
|
OutputManager *m_out;
|
||||||
|
|
||||||
|
int m_state;
|
||||||
|
|
||||||
|
QStringList getAllExecutables();
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MainManager(CppManager *cpp, QmlManager *qml, OutputManager *out,
|
||||||
|
PluginManager *plg, QObject *parent = nullptr);
|
||||||
|
|
||||||
|
int state() const;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void prepare(const QString &qtdir, const QString &execpath,
|
||||||
|
const QString &projectdir, const QString &outdir);
|
||||||
|
|
||||||
|
void start(bool erase);
|
||||||
|
|
||||||
|
bool hasPrems(const QString &path);
|
||||||
|
QString stringFromUrl(QString url);
|
||||||
|
bool pathExists(bool isdir, const QString &path);
|
||||||
|
|
||||||
|
void setState(int state);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void stateChanged(int state);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MAINMANAGER_H
|
154
CPP/outputmanager.cpp
Executable file
154
CPP/outputmanager.cpp
Executable file
@ -0,0 +1,154 @@
|
|||||||
|
#include "outputmanager.h"
|
||||||
|
|
||||||
|
void OutputManager::setPathsToCopy(const QStringList &pathsToCopy)
|
||||||
|
{
|
||||||
|
if (m_pathsToCopy == pathsToCopy) return;
|
||||||
|
|
||||||
|
m_pathsToCopy = pathsToCopy;
|
||||||
|
emit pathsToCopyChanged(m_pathsToCopy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputManager::setCopySuccess(const QList<bool> ©Success)
|
||||||
|
{
|
||||||
|
if (m_copySuccess == copySuccess) return;
|
||||||
|
|
||||||
|
m_copySuccess = copySuccess;
|
||||||
|
emit copySuccessChanged(m_copySuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OutputManager::copyDir(const QString &source, const QString &destin)
|
||||||
|
{
|
||||||
|
QDir().mkpath(destin);
|
||||||
|
|
||||||
|
QProcess P;
|
||||||
|
P.start(QString("cp -a %1/. %2/").arg(source, destin));
|
||||||
|
|
||||||
|
P.waitForStarted(1000);
|
||||||
|
P.waitForFinished();
|
||||||
|
|
||||||
|
return P.exitStatus() == QProcess::NormalExit;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputManager::copyCpp(const QStringList &libs)
|
||||||
|
{
|
||||||
|
auto libdir = m_outputdir + "/lib";
|
||||||
|
|
||||||
|
for (const QString &S : libs)
|
||||||
|
{
|
||||||
|
auto path = libdir + "/" + QFileInfo(S).fileName();
|
||||||
|
m_pathsToCopy << path;
|
||||||
|
m_copySuccess << copyFile(S, path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputManager::copyAll(const QStringList &qtlibs, const QStringList &libs,
|
||||||
|
const QStringList &dirs, const QStringList &plugins,
|
||||||
|
bool erase)
|
||||||
|
{
|
||||||
|
m_pathsToCopy.clear();
|
||||||
|
m_copySuccess.clear();
|
||||||
|
|
||||||
|
if (erase)
|
||||||
|
{
|
||||||
|
QDir(m_outputdir).removeRecursively();
|
||||||
|
QDir dir(m_outputdir);
|
||||||
|
dir.cdUp();
|
||||||
|
dir.mkdir(QDir(m_outputdir).dirName());
|
||||||
|
}
|
||||||
|
|
||||||
|
createDirectories();
|
||||||
|
|
||||||
|
if (libs.count() != 0) copyCpp(libs);
|
||||||
|
copyCpp(qtlibs);
|
||||||
|
copyQml(dirs);
|
||||||
|
copyPlugins(plugins);
|
||||||
|
copyExec();
|
||||||
|
createRunFile();
|
||||||
|
|
||||||
|
emit pathsToCopyChanged(m_pathsToCopy);
|
||||||
|
emit copySuccessChanged(m_copySuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputManager::copyQml(const QStringList &dirs)
|
||||||
|
{
|
||||||
|
auto qmldir = m_outputdir + "/qml";
|
||||||
|
|
||||||
|
for (const QString &S : dirs)
|
||||||
|
{
|
||||||
|
QString path = qmldir + "/" + S;
|
||||||
|
m_pathsToCopy << path + "/";
|
||||||
|
m_copySuccess << copyDir(m_qtdir + "/qml/" + S, path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputManager::copyPlugins(const QStringList &plugins)
|
||||||
|
{
|
||||||
|
QString qtpath = m_qtdir + "/plugins/";
|
||||||
|
QString path = m_outputdir + "/plugins/";
|
||||||
|
|
||||||
|
for (const QString &plugin : plugins)
|
||||||
|
{
|
||||||
|
m_pathsToCopy << path + plugin + "/";
|
||||||
|
m_copySuccess << copyDir(qtpath + plugin, path + plugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputManager::copyExec()
|
||||||
|
{
|
||||||
|
auto path = m_outputdir + "/bin/" + QFileInfo(m_executablepath).fileName();
|
||||||
|
|
||||||
|
m_pathsToCopy << path;
|
||||||
|
m_copySuccess << copyFile(m_executablepath, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputManager::createRunFile()
|
||||||
|
{
|
||||||
|
QString content =
|
||||||
|
"#!/bin/sh\n"
|
||||||
|
"export LD_LIBRARY_PATH=`pwd`/lib\n"
|
||||||
|
"export QML_IMPORT_PATH=`pwd`/qml\n"
|
||||||
|
"export QML2_IMPORT_PATH=`pwd`/qml\n"
|
||||||
|
"export QT_PLUGIN_PATH=`pwd`/plugins\n"
|
||||||
|
"export QT_QPA_PLATFORM_PLUGIN_PATH=`pwd`/plugins/platforms\n"
|
||||||
|
"./bin/%1";
|
||||||
|
|
||||||
|
content = content.arg(QFileInfo(m_executablepath).completeBaseName());
|
||||||
|
|
||||||
|
QString fname = m_outputdir + QDir::separator() +
|
||||||
|
QFileInfo(m_executablepath).completeBaseName() + ".sh";
|
||||||
|
|
||||||
|
QFile F(fname);
|
||||||
|
m_pathsToCopy << fname;
|
||||||
|
m_copySuccess << F.open(QIODevice::WriteOnly);
|
||||||
|
|
||||||
|
F.write(content.toUtf8());
|
||||||
|
F.flush();
|
||||||
|
F.close();
|
||||||
|
|
||||||
|
F.setPermissions(QFileDevice::ExeUser | QFileDevice::WriteUser |
|
||||||
|
QFileDevice::ReadUser);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputManager::createDirectories()
|
||||||
|
{
|
||||||
|
m_pathsToCopy << m_outputdir + "/bin/";
|
||||||
|
m_copySuccess << QDir(m_outputdir).mkdir("bin");
|
||||||
|
|
||||||
|
m_pathsToCopy << m_outputdir + "/qml/";
|
||||||
|
m_copySuccess << QDir(m_outputdir).mkdir("qml");
|
||||||
|
|
||||||
|
m_pathsToCopy << m_outputdir + "/lib/";
|
||||||
|
m_copySuccess << QDir(m_outputdir).mkdir("lib");
|
||||||
|
|
||||||
|
m_pathsToCopy << m_outputdir + "/plugins/";
|
||||||
|
m_copySuccess << QDir(m_outputdir).mkdir("plugins");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OutputManager::copyFile(const QString &source, const QString &destin)
|
||||||
|
{
|
||||||
|
return QFile::copy(source, destin);
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputManager::OutputManager(QObject *parent) : BaseClass(parent) {}
|
||||||
|
QStringList OutputManager::pathsToCopy() const { return m_pathsToCopy; }
|
||||||
|
QList<bool> OutputManager::copySuccess() const { return m_copySuccess; }
|
49
CPP/outputmanager.h
Executable file
49
CPP/outputmanager.h
Executable file
@ -0,0 +1,49 @@
|
|||||||
|
#ifndef OUTPUTMANAGER_H
|
||||||
|
#define OUTPUTMANAGER_H
|
||||||
|
|
||||||
|
#include "baseclass.h"
|
||||||
|
|
||||||
|
class OutputManager : public BaseClass
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(QStringList pathsToCopy READ pathsToCopy WRITE setPathsToCopy
|
||||||
|
NOTIFY pathsToCopyChanged)
|
||||||
|
|
||||||
|
Q_PROPERTY(QList<bool> copySuccess READ copySuccess WRITE setCopySuccess
|
||||||
|
NOTIFY copySuccessChanged)
|
||||||
|
|
||||||
|
QStringList m_pathsToCopy;
|
||||||
|
QList<bool> m_copySuccess;
|
||||||
|
|
||||||
|
bool copyDir(const QString &source, const QString &destin);
|
||||||
|
bool copyFile(const QString &source, const QString &destin);
|
||||||
|
|
||||||
|
void copyCpp(const QStringList &libs);
|
||||||
|
void copyQml(const QStringList &dirs);
|
||||||
|
void copyPlugins(const QStringList &plugins);
|
||||||
|
|
||||||
|
void createDirectories();
|
||||||
|
void createRunFile();
|
||||||
|
void copyExec();
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit OutputManager(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
QStringList pathsToCopy() const;
|
||||||
|
QList<bool> copySuccess() const;
|
||||||
|
|
||||||
|
void copyAll(const QStringList &qtlibs, const QStringList &libs,
|
||||||
|
const QStringList &dirs, const QStringList &plugins,
|
||||||
|
bool erase);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void setPathsToCopy(const QStringList &pathsToCopy);
|
||||||
|
void setCopySuccess(const QList<bool> ©Success);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void pathsToCopyChanged(QStringList pathsToCopy);
|
||||||
|
void copySuccessChanged(QList<bool> copySuccess);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // OUTPUTMANAGER_H
|
102
CPP/pluginmanager.cpp
Executable file
102
CPP/pluginmanager.cpp
Executable file
@ -0,0 +1,102 @@
|
|||||||
|
#include "pluginmanager.h"
|
||||||
|
|
||||||
|
void PluginManager::setNeededPlugins(const QStringList &neededPlugins)
|
||||||
|
{
|
||||||
|
if (m_neededPlugins == neededPlugins) return;
|
||||||
|
|
||||||
|
m_neededPlugins = neededPlugins;
|
||||||
|
emit neededPluginsChanged(m_neededPlugins);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PluginManager::start()
|
||||||
|
{
|
||||||
|
m_neededPlugins.clear();
|
||||||
|
|
||||||
|
m_neededPlugins << "xcbglintegrations"
|
||||||
|
<< "platforms"
|
||||||
|
<< "imageformats"
|
||||||
|
<< "iconengines";
|
||||||
|
|
||||||
|
m_neededPlugins << findPluginsFromModules();
|
||||||
|
|
||||||
|
emit neededPluginsChanged(m_neededPlugins);
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList PluginManager::getAllSoFiles()
|
||||||
|
{
|
||||||
|
QStringList sofiles;
|
||||||
|
|
||||||
|
for (const QString &plugindir : m_neededPlugins)
|
||||||
|
sofiles << findFilesInsideDir("*.so",
|
||||||
|
m_qtdir + "/plugins/" + plugindir);
|
||||||
|
|
||||||
|
return sofiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList PluginManager::findPluginsFromModules()
|
||||||
|
{
|
||||||
|
QStringList plugins;
|
||||||
|
|
||||||
|
QStringList modules = extractModules();
|
||||||
|
|
||||||
|
if (modules.contains("sql")) plugins << "sqldrivers";
|
||||||
|
if (modules.contains("gamepad")) plugins << "gamepads";
|
||||||
|
if (modules.contains("printsupport")) plugins << "printsupport";
|
||||||
|
|
||||||
|
if (modules.contains("sensors"))
|
||||||
|
plugins << "sensors"
|
||||||
|
<< "sensorgestures";
|
||||||
|
|
||||||
|
if (modules.contains("positioning"))
|
||||||
|
plugins << "geoservices"
|
||||||
|
<< "position"
|
||||||
|
<< "geometryloaders";
|
||||||
|
|
||||||
|
if (modules.contains("multimedia"))
|
||||||
|
plugins << "audio"
|
||||||
|
<< "mediaservice"
|
||||||
|
<< "playlistformats";
|
||||||
|
|
||||||
|
return plugins;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList PluginManager::extractModules()
|
||||||
|
{
|
||||||
|
QStringList proandprifiles = findFilesInsideDir("*.pro", m_projectdir);
|
||||||
|
proandprifiles << findFilesInsideDir("*.pri", m_projectdir);
|
||||||
|
|
||||||
|
QStringList modules;
|
||||||
|
for (const QString &file : proandprifiles)
|
||||||
|
modules << extractMudoulesFromFile(file);
|
||||||
|
|
||||||
|
modules.removeDuplicates();
|
||||||
|
return modules;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList PluginManager::extractMudoulesFromFile(const QString &filepath)
|
||||||
|
{
|
||||||
|
QStringList modules;
|
||||||
|
QFile F(filepath);
|
||||||
|
if (!F.open(QIODevice::ReadOnly)) return QStringList();
|
||||||
|
|
||||||
|
QString temp;
|
||||||
|
QTextStream S(&F);
|
||||||
|
|
||||||
|
while (S.readLineInto(&temp))
|
||||||
|
{
|
||||||
|
temp = temp.simplified();
|
||||||
|
if (temp.startsWith("#")) continue;
|
||||||
|
if (!temp.startsWith("QT")) continue;
|
||||||
|
|
||||||
|
QStringList list = temp.split("+=", QString::SkipEmptyParts);
|
||||||
|
if (list.count() != 2) list = temp.split("=", QString::SkipEmptyParts);
|
||||||
|
if (list.count() != 2) continue;
|
||||||
|
|
||||||
|
modules << list[1].split(" ", QString::SkipEmptyParts);
|
||||||
|
}
|
||||||
|
|
||||||
|
return modules;
|
||||||
|
}
|
||||||
|
|
||||||
|
PluginManager::PluginManager(QObject *parent) : BaseClass(parent) {}
|
||||||
|
QStringList PluginManager::neededPlugins() const { return m_neededPlugins; }
|
34
CPP/pluginmanager.h
Executable file
34
CPP/pluginmanager.h
Executable file
@ -0,0 +1,34 @@
|
|||||||
|
#ifndef PLUGINMANAGER_H
|
||||||
|
#define PLUGINMANAGER_H
|
||||||
|
|
||||||
|
#include "baseclass.h"
|
||||||
|
|
||||||
|
class PluginManager : public BaseClass
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(QStringList neededPlugins READ neededPlugins WRITE
|
||||||
|
setNeededPlugins NOTIFY neededPluginsChanged)
|
||||||
|
|
||||||
|
QStringList m_neededPlugins;
|
||||||
|
|
||||||
|
QStringList extractModules();
|
||||||
|
QStringList findPluginsFromModules();
|
||||||
|
QStringList extractMudoulesFromFile(const QString &filepath);
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit PluginManager(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
QStringList neededPlugins() const;
|
||||||
|
|
||||||
|
void start();
|
||||||
|
QStringList getAllSoFiles();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void setNeededPlugins(const QStringList &neededPlugins);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void neededPluginsChanged(QStringList neededPlugins);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PLUGINMANAGER_H
|
147
CPP/qmlmanager.cpp
Executable file
147
CPP/qmlmanager.cpp
Executable file
@ -0,0 +1,147 @@
|
|||||||
|
#include "qmlmanager.h"
|
||||||
|
|
||||||
|
void QmlManager::extractImportsFromDir(const QString &dirpath)
|
||||||
|
{
|
||||||
|
for (const QString &filepath : findFilesInsideDir("*.qml", dirpath))
|
||||||
|
for (QString &import : extractImportsFromFile(filepath))
|
||||||
|
{
|
||||||
|
QStringList list = import.split("#");
|
||||||
|
import = list[1];
|
||||||
|
|
||||||
|
if (list[0] == "2" &&
|
||||||
|
m_secondVersionImports.contains(import.split("/").last()))
|
||||||
|
import += ".2";
|
||||||
|
|
||||||
|
if (!m_foundImports.contains(import))
|
||||||
|
{
|
||||||
|
m_foundImports << import;
|
||||||
|
extractImportsFromDir(m_qtdir + "/qml/" + import);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList QmlManager::extractImportsFromFile(const QString &filepath)
|
||||||
|
{
|
||||||
|
QStringList imports;
|
||||||
|
QFile F(filepath);
|
||||||
|
if (!F.open(QIODevice::ReadOnly)) return QStringList();
|
||||||
|
|
||||||
|
QString content = F.readAll();
|
||||||
|
content.remove(QRegExp("\\{(.*)\\}"));
|
||||||
|
content.remove(QRegExp("/\\*(.*)\\*/"));
|
||||||
|
|
||||||
|
for (const QString &line : content.split("\n"))
|
||||||
|
for (QString &word : line.split(";", QString::SkipEmptyParts))
|
||||||
|
{
|
||||||
|
word = word.simplified();
|
||||||
|
if (word.startsWith("//")) continue;
|
||||||
|
if (!word.startsWith("import")) continue;
|
||||||
|
|
||||||
|
QStringList list = word.split(" ", QString::SkipEmptyParts);
|
||||||
|
if (list.count() != 3)
|
||||||
|
{
|
||||||
|
if (list.count() == 5)
|
||||||
|
{
|
||||||
|
if (list[3] != "as") continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
imports << (list[2][0] + "#" + list[1].replace(".", "/"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return imports;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList QmlManager::getAllQtQmlImports()
|
||||||
|
{
|
||||||
|
QStringList dirs;
|
||||||
|
|
||||||
|
QString dir = m_qtdir + "/qml";
|
||||||
|
|
||||||
|
QDir qdir(dir);
|
||||||
|
qdir.setFilter(QDir::Dirs | QDir::NoSymLinks | QDir::NoDotAndDotDot);
|
||||||
|
|
||||||
|
QDirIterator it(qdir, QDirIterator::Subdirectories);
|
||||||
|
while (it.hasNext()) dirs << it.next().remove(0, dir.count() + 1);
|
||||||
|
|
||||||
|
return dirs;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QmlManager::removeInnerImports()
|
||||||
|
{
|
||||||
|
for (const QString &import : m_foundImports)
|
||||||
|
{
|
||||||
|
bool contains = false;
|
||||||
|
|
||||||
|
for (const QString &S : m_foundImports)
|
||||||
|
if (import.startsWith(S + "/")) contains = true;
|
||||||
|
|
||||||
|
if (contains) m_foundImports.removeOne(import);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QmlManager::divideFoundAndNotFound()
|
||||||
|
{
|
||||||
|
QStringList dirs = getAllQtQmlImports();
|
||||||
|
|
||||||
|
for (const QString &S : m_foundImports)
|
||||||
|
if (!dirs.contains(S))
|
||||||
|
{
|
||||||
|
m_notFoundImports << S;
|
||||||
|
m_foundImports.removeOne(S);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QmlManager::QmlManager(QObject *parent) : BaseClass(parent)
|
||||||
|
{
|
||||||
|
m_secondVersionImports << "QtQuick"
|
||||||
|
<< "Models"
|
||||||
|
<< "Window"
|
||||||
|
<< "Controls"
|
||||||
|
<< "Particles"
|
||||||
|
<< "Templates";
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList QmlManager::getAllSoFiles()
|
||||||
|
{
|
||||||
|
QStringList sofiles;
|
||||||
|
|
||||||
|
for (const QString &dirpath : m_foundImports)
|
||||||
|
sofiles << findFilesInsideDir("*.so", m_qtdir + "/qml/" + dirpath);
|
||||||
|
|
||||||
|
return sofiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QmlManager::start()
|
||||||
|
{
|
||||||
|
m_foundImports.clear();
|
||||||
|
m_notFoundImports.clear();
|
||||||
|
|
||||||
|
extractImportsFromDir(m_projectdir);
|
||||||
|
removeInnerImports();
|
||||||
|
divideFoundAndNotFound();
|
||||||
|
|
||||||
|
emit foundImportsChanged(m_foundImports);
|
||||||
|
emit notFoundImportsChanged(m_notFoundImports);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QmlManager::setFoundImports(const QStringList &foundImports)
|
||||||
|
{
|
||||||
|
if (m_foundImports == foundImports) return;
|
||||||
|
|
||||||
|
m_foundImports = foundImports;
|
||||||
|
emit foundImportsChanged(m_foundImports);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QmlManager::setNotFoundImports(const QStringList &nonFoundImports)
|
||||||
|
{
|
||||||
|
if (m_notFoundImports == nonFoundImports) return;
|
||||||
|
|
||||||
|
m_notFoundImports = nonFoundImports;
|
||||||
|
emit notFoundImportsChanged(m_notFoundImports);
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList QmlManager::foundImports() const { return m_foundImports; }
|
||||||
|
QStringList QmlManager::notFoundImports() const { return m_notFoundImports; }
|
47
CPP/qmlmanager.h
Executable file
47
CPP/qmlmanager.h
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
#ifndef QMLMANAGER_H
|
||||||
|
#define QMLMANAGER_H
|
||||||
|
|
||||||
|
#include "baseclass.h"
|
||||||
|
|
||||||
|
class QmlManager : public BaseClass
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(QStringList foundImports READ foundImports WRITE setFoundImports
|
||||||
|
NOTIFY foundImportsChanged)
|
||||||
|
|
||||||
|
Q_PROPERTY(QStringList notFoundImports READ notFoundImports WRITE
|
||||||
|
setNotFoundImports NOTIFY notFoundImportsChanged)
|
||||||
|
|
||||||
|
QStringList m_foundImports;
|
||||||
|
QStringList m_notFoundImports;
|
||||||
|
|
||||||
|
QStringList m_secondVersionImports;
|
||||||
|
|
||||||
|
public: // TODO remove
|
||||||
|
void extractImportsFromDir(const QString &dirpath);
|
||||||
|
QStringList extractImportsFromFile(const QString &filepath);
|
||||||
|
|
||||||
|
QStringList getAllQtQmlImports();
|
||||||
|
void removeInnerImports();
|
||||||
|
void divideFoundAndNotFound();
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit QmlManager(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
QStringList foundImports() const;
|
||||||
|
QStringList notFoundImports() const;
|
||||||
|
|
||||||
|
void start();
|
||||||
|
QStringList getAllSoFiles();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void setFoundImports(const QStringList &foundImports);
|
||||||
|
void setNotFoundImports(const QStringList ¬FoundImports);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void foundImportsChanged(QStringList foundImports);
|
||||||
|
void notFoundImportsChanged(QStringList notFoundImports);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // QMLMANAGER_H
|
87
QML/ExtendableView.qml
Executable file
87
QML/ExtendableView.qml
Executable file
@ -0,0 +1,87 @@
|
|||||||
|
import QtQuick 2.7
|
||||||
|
import QtQuick.Controls 2.0
|
||||||
|
import QtQuick.Controls.Material 2.0
|
||||||
|
import QtQuick.Layouts 1.3
|
||||||
|
|
||||||
|
Page {
|
||||||
|
id: page
|
||||||
|
clip: true
|
||||||
|
width: listview.width
|
||||||
|
|
||||||
|
property var model
|
||||||
|
property bool checkable
|
||||||
|
property bool expanded
|
||||||
|
|
||||||
|
height: expanded ? implicitHeight:header.height
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
color: "#eee"
|
||||||
|
}
|
||||||
|
|
||||||
|
Behavior on height {
|
||||||
|
SmoothedAnimation {
|
||||||
|
velocity: page.implicitHeight*2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
header: AbstractButton {
|
||||||
|
id: head
|
||||||
|
padding: 6
|
||||||
|
onClicked: expanded = !expanded
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
color: Material.background
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
height: 1
|
||||||
|
width: parent.width
|
||||||
|
color: Material.accent
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: RowLayout {
|
||||||
|
Label {
|
||||||
|
text: "▶"
|
||||||
|
rotation: expanded ? 90:0
|
||||||
|
font.pointSize: mediumFont
|
||||||
|
|
||||||
|
Behavior on rotation {
|
||||||
|
NumberAnimation {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
leftPadding: 6
|
||||||
|
text: page.title
|
||||||
|
Layout.fillWidth: true
|
||||||
|
elide: Text.ElideRight
|
||||||
|
font.pointSize: mediumFont
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: Column {
|
||||||
|
Repeater {
|
||||||
|
model: page.model
|
||||||
|
|
||||||
|
delegate: Label {
|
||||||
|
id: label
|
||||||
|
padding: 10
|
||||||
|
width: parent.width
|
||||||
|
elide: Text.ElideRight
|
||||||
|
|
||||||
|
text: (page.checkable ? (OutputManager.copySuccess[index]
|
||||||
|
? "✔ ":"🞪 "):"") + modelData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
height: 1
|
||||||
|
parent: page
|
||||||
|
width: parent.width
|
||||||
|
color: Material.primary
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
}
|
||||||
|
}
|
70
QML/PathChooser.qml
Executable file
70
QML/PathChooser.qml
Executable file
@ -0,0 +1,70 @@
|
|||||||
|
import QtQuick 2.7
|
||||||
|
import QtQuick.Controls 2.0
|
||||||
|
import QtQuick.Controls.Material 2.0
|
||||||
|
import QtQuick.Layouts 1.3
|
||||||
|
import QtQuick.Dialogs 1.2
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
id: root
|
||||||
|
Layout.fillHeight: false
|
||||||
|
|
||||||
|
property string title
|
||||||
|
property bool isdir: true
|
||||||
|
property bool confirmed: false
|
||||||
|
property alias content: field.text
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: title
|
||||||
|
elide: Text.ElideRight
|
||||||
|
Layout.fillWidth: true
|
||||||
|
font.pointSize: mediumFont
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillHeight: false
|
||||||
|
|
||||||
|
TextField {
|
||||||
|
id: field
|
||||||
|
Layout.fillWidth: true
|
||||||
|
placeholderText: "Enter path or browse"
|
||||||
|
|
||||||
|
onTextChanged: {
|
||||||
|
if (!MainManager.pathExists(isdir, text))
|
||||||
|
{
|
||||||
|
wlabel.text = "Path doesn't exist"
|
||||||
|
confirmed = false
|
||||||
|
}
|
||||||
|
else if (!MainManager.hasPrems(text))
|
||||||
|
{
|
||||||
|
wlabel.text = "I don't have permission to access this path"
|
||||||
|
confirmed = false
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wlabel.text = "This path is OK"
|
||||||
|
confirmed = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: "Browse"
|
||||||
|
onClicked: fd.open()
|
||||||
|
Material.background: buttonColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: wlabel
|
||||||
|
elide: Text.ElideRight
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
|
||||||
|
FileDialog {
|
||||||
|
id: fd
|
||||||
|
selectFolder: isdir
|
||||||
|
selectMultiple: false
|
||||||
|
|
||||||
|
onAccepted: field.text = MainManager.stringFromUrl(isdir ? folder:fileUrl)
|
||||||
|
}
|
||||||
|
}
|
114
QML/PreparePage.qml
Executable file
114
QML/PreparePage.qml
Executable file
@ -0,0 +1,114 @@
|
|||||||
|
import QtQuick 2.7
|
||||||
|
import QtQuick.Controls 2.0
|
||||||
|
import QtQuick.Controls.Material 2.0
|
||||||
|
import QtQuick.Layouts 1.3
|
||||||
|
import Qt.labs.settings 1.0
|
||||||
|
|
||||||
|
Page {
|
||||||
|
id: page
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
header: TopBar {
|
||||||
|
text: "Prepare"
|
||||||
|
|
||||||
|
ToolButton {
|
||||||
|
text: "➔"
|
||||||
|
rotation: 180
|
||||||
|
font.pointSize: largeFont
|
||||||
|
anchors.right: parent.right
|
||||||
|
onClicked: swipeview.currentIndex = 0
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
property string outdir
|
||||||
|
property var cpplibs: []
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
spacing: 15
|
||||||
|
anchors.margins: 15
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Label {
|
||||||
|
elide: Text.ElideRight
|
||||||
|
Layout.fillWidth: true
|
||||||
|
font.pointSize: mediumFont
|
||||||
|
text: "Choose Non-Qt Libraries To Copy"
|
||||||
|
}
|
||||||
|
|
||||||
|
Flickable {
|
||||||
|
id: flick
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
contentWidth: width
|
||||||
|
contentHeight: column.height
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
ScrollBar.vertical: ScrollBar { }
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
parent: flick
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "transparent"
|
||||||
|
border.color: Material.accent
|
||||||
|
}
|
||||||
|
|
||||||
|
Column {
|
||||||
|
id: column
|
||||||
|
width: parent.width
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: CppManager.cppLibraries
|
||||||
|
|
||||||
|
delegate: CheckDelegate {
|
||||||
|
id: del
|
||||||
|
text: modelData
|
||||||
|
width: parent.width
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: checkAll
|
||||||
|
onCheckedChanged: del.checked = checkAll.checked
|
||||||
|
}
|
||||||
|
|
||||||
|
onCheckedChanged: {
|
||||||
|
var place = cpplibs.indexOf(del.text)
|
||||||
|
|
||||||
|
if (checked && place < 0)
|
||||||
|
cpplibs.push(del.text)
|
||||||
|
else if (place > -1)
|
||||||
|
cpplibs.splice(place, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckBox {
|
||||||
|
id: checkAll
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "Check All The Above"
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckBox {
|
||||||
|
id: erase
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: "Erase Everything In: " + outdir
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: "Next"
|
||||||
|
Material.background: buttonColor
|
||||||
|
Layout.alignment: Qt.AlignRight
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
pp.erase = erase.checked
|
||||||
|
swipeview.currentIndex = 2
|
||||||
|
CppManager.cppLibraries = cpplibs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Settings {
|
||||||
|
property alias erase: erase.checked
|
||||||
|
}
|
||||||
|
}
|
40
QML/ProcessPage.qml
Executable file
40
QML/ProcessPage.qml
Executable file
@ -0,0 +1,40 @@
|
|||||||
|
import QtQuick 2.7
|
||||||
|
import QtQuick.Controls 2.0
|
||||||
|
import QtQuick.Controls.Material 2.0
|
||||||
|
import QtQuick.Layouts 1.3
|
||||||
|
|
||||||
|
Page {
|
||||||
|
id: page
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
property bool erase
|
||||||
|
property int state: MainManager.state
|
||||||
|
|
||||||
|
header: TopBar {
|
||||||
|
text: "Qt Linux Deployer"
|
||||||
|
|
||||||
|
ToolButton {
|
||||||
|
text: "➔"
|
||||||
|
rotation: 180
|
||||||
|
font.pointSize: largeFont
|
||||||
|
anchors.right: parent.right
|
||||||
|
onClicked: swipeview.currentIndex = 0
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
width: 200
|
||||||
|
padding: 18
|
||||||
|
anchors.centerIn: parent
|
||||||
|
Material.background: buttonColor
|
||||||
|
text: page.state == 0 ? "Go!":(page.state == 1 ? "Wait!":"Done!")
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
if (page.state == 0)
|
||||||
|
MainManager.start(erase)
|
||||||
|
else if (page.state == 2)
|
||||||
|
swipeview.currentIndex = 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
63
QML/ResultPage.qml
Executable file
63
QML/ResultPage.qml
Executable file
@ -0,0 +1,63 @@
|
|||||||
|
import QtQuick 2.7
|
||||||
|
import QtQuick.Controls 2.0
|
||||||
|
|
||||||
|
Page {
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
header: TopBar {
|
||||||
|
text: "Result"
|
||||||
|
|
||||||
|
ToolButton {
|
||||||
|
text: "➔"
|
||||||
|
rotation: 180
|
||||||
|
font.pointSize: largeFont
|
||||||
|
anchors.right: parent.right
|
||||||
|
onClicked: swipeview.currentIndex = 0
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
id: listview
|
||||||
|
anchors.fill: parent
|
||||||
|
ScrollBar.vertical: ScrollBar {}
|
||||||
|
|
||||||
|
model: VisualItemModel {
|
||||||
|
ExtendableView {
|
||||||
|
checkable: false
|
||||||
|
title: "Qt Libraries"
|
||||||
|
model: CppManager.qtLibraries
|
||||||
|
}
|
||||||
|
|
||||||
|
ExtendableView {
|
||||||
|
checkable: false
|
||||||
|
title: "Non-Qt Libraries"
|
||||||
|
model: CppManager.cppLibraries
|
||||||
|
}
|
||||||
|
|
||||||
|
ExtendableView {
|
||||||
|
checkable: false
|
||||||
|
title: "Unknown Libraries"
|
||||||
|
model: CppManager.notFoundLibs
|
||||||
|
}
|
||||||
|
|
||||||
|
ExtendableView {
|
||||||
|
checkable: false
|
||||||
|
title: "Qml Imports"
|
||||||
|
model: QmlManager.foundImports
|
||||||
|
}
|
||||||
|
|
||||||
|
ExtendableView {
|
||||||
|
checkable: false
|
||||||
|
title: "Failed Qml Imports"
|
||||||
|
model: QmlManager.notFoundImports
|
||||||
|
}
|
||||||
|
|
||||||
|
ExtendableView {
|
||||||
|
checkable: true
|
||||||
|
title: "Copied Paths"
|
||||||
|
model: OutputManager.pathsToCopy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
69
QML/StartPage.qml
Executable file
69
QML/StartPage.qml
Executable file
@ -0,0 +1,69 @@
|
|||||||
|
import QtQuick 2.7
|
||||||
|
import QtQuick.Controls 2.0
|
||||||
|
import QtQuick.Controls.Material 2.0
|
||||||
|
import QtQuick.Layouts 1.3
|
||||||
|
import Qt.labs.settings 1.0
|
||||||
|
|
||||||
|
Page {
|
||||||
|
id: page
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
header: TopBar {
|
||||||
|
text: "Qt Linux Deployer"
|
||||||
|
}
|
||||||
|
|
||||||
|
Settings {
|
||||||
|
property alias qtdir: qtdir.content
|
||||||
|
property alias outdir: outdir.content
|
||||||
|
property alias execpath: execpath.content
|
||||||
|
property alias projectdir: projectdir.content
|
||||||
|
}
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
spacing: 15
|
||||||
|
anchors.margins: 15
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
PathChooser {
|
||||||
|
id: qtdir
|
||||||
|
title: "Qt Build Directory"
|
||||||
|
}
|
||||||
|
|
||||||
|
PathChooser {
|
||||||
|
id: execpath
|
||||||
|
isdir: false
|
||||||
|
title: "Executable File Path"
|
||||||
|
}
|
||||||
|
|
||||||
|
PathChooser {
|
||||||
|
id: projectdir
|
||||||
|
title: "Project Directory"
|
||||||
|
}
|
||||||
|
|
||||||
|
PathChooser {
|
||||||
|
id: outdir
|
||||||
|
title: "Final Output Directory"
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: "Next"
|
||||||
|
Material.background: buttonColor
|
||||||
|
Layout.alignment: Qt.AlignRight
|
||||||
|
enabled: qtdir.confirmed && execpath.confirmed
|
||||||
|
&& projectdir.confirmed && outdir.confirmed
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
MainManager.prepare(qtdir.content, execpath.content,
|
||||||
|
projectdir.content, outdir.content)
|
||||||
|
|
||||||
|
prp.outdir = outdir.content
|
||||||
|
swipeview.currentIndex = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
QML/TopBar.qml
Executable file
14
QML/TopBar.qml
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
import QtQuick 2.7
|
||||||
|
import QtQuick.Controls 2.0
|
||||||
|
|
||||||
|
ToolBar {
|
||||||
|
id: control
|
||||||
|
|
||||||
|
property string text
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: control.text
|
||||||
|
anchors.centerIn: parent
|
||||||
|
font.pointSize: control.font.pointSize + 3
|
||||||
|
}
|
||||||
|
}
|
43
QML/main.qml
Executable file
43
QML/main.qml
Executable file
@ -0,0 +1,43 @@
|
|||||||
|
import QtQuick 2.7
|
||||||
|
import QtQuick.Controls 2.0
|
||||||
|
import QtQuick.Controls.Material 2.0
|
||||||
|
|
||||||
|
ApplicationWindow {
|
||||||
|
id: window
|
||||||
|
visible: true
|
||||||
|
title: qsTr("Qt Linux Deployer")
|
||||||
|
|
||||||
|
width: 600
|
||||||
|
height: sp.implicitHeight + 30
|
||||||
|
|
||||||
|
property real smallFont: window.font.pointSize
|
||||||
|
property real mediumFont: window.font.pointSize + 2
|
||||||
|
property real largeFont: window.font.pointSize + 4
|
||||||
|
|
||||||
|
Material.accent: Material.Red
|
||||||
|
Material.primary: Material.Red
|
||||||
|
|
||||||
|
property var buttonColor: Material.accent
|
||||||
|
|
||||||
|
SwipeView {
|
||||||
|
id: swipeview
|
||||||
|
interactive: false
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
StartPage {
|
||||||
|
id: sp
|
||||||
|
}
|
||||||
|
|
||||||
|
PreparePage {
|
||||||
|
id: prp
|
||||||
|
}
|
||||||
|
|
||||||
|
ProcessPage {
|
||||||
|
id: pp
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultPage {
|
||||||
|
id: rp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
44
QtLinuxDeployer.pro
Executable file
44
QtLinuxDeployer.pro
Executable file
@ -0,0 +1,44 @@
|
|||||||
|
QT += qml quick
|
||||||
|
|
||||||
|
CONFIG += c++11
|
||||||
|
|
||||||
|
RESOURCES += qml.qrc
|
||||||
|
|
||||||
|
# Additional import path used to resolve QML modules in Qt Creator's code model
|
||||||
|
QML_IMPORT_PATH =
|
||||||
|
|
||||||
|
# Additional import path used to resolve QML modules just for Qt Quick Designer
|
||||||
|
QML_DESIGNER_IMPORT_PATH =
|
||||||
|
|
||||||
|
# The following define makes your compiler emit warnings if you use
|
||||||
|
# any feature of Qt which as been marked deprecated (the exact warnings
|
||||||
|
# depend on your compiler). Please consult the documentation of the
|
||||||
|
# deprecated API in order to know how to port your code away from it.
|
||||||
|
DEFINES += QT_DEPRECATED_WARNINGS
|
||||||
|
|
||||||
|
# You can also make your code fail to compile if you use deprecated APIs.
|
||||||
|
# In order to do so, uncomment the following line.
|
||||||
|
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||||
|
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||||
|
|
||||||
|
# Default rules for deployment.
|
||||||
|
qnx: target.path = /tmp/$${TARGET}/bin
|
||||||
|
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||||
|
!isEmpty(target.path): INSTALLS += target
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
main.cpp \
|
||||||
|
CPP/baseclass.cpp \
|
||||||
|
CPP/cppmanager.cpp \
|
||||||
|
CPP/mainmanager.cpp \
|
||||||
|
CPP/outputmanager.cpp \
|
||||||
|
CPP/pluginmanager.cpp \
|
||||||
|
CPP/qmlmanager.cpp
|
||||||
|
|
||||||
|
HEADERS += \
|
||||||
|
CPP/baseclass.h \
|
||||||
|
CPP/cppmanager.h \
|
||||||
|
CPP/mainmanager.h \
|
||||||
|
CPP/outputmanager.h \
|
||||||
|
CPP/pluginmanager.h \
|
||||||
|
CPP/qmlmanager.h
|
35
main.cpp
Executable file
35
main.cpp
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QQmlApplicationEngine>
|
||||||
|
#include <QQmlContext>
|
||||||
|
|
||||||
|
#include <CPP/cppmanager.h>
|
||||||
|
#include <CPP/mainmanager.h>
|
||||||
|
#include <CPP/outputmanager.h>
|
||||||
|
#include <CPP/pluginmanager.h>
|
||||||
|
#include <CPP/qmlmanager.h>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||||
|
QGuiApplication app(argc, argv);
|
||||||
|
|
||||||
|
CppManager C;
|
||||||
|
QmlManager Q;
|
||||||
|
PluginManager P;
|
||||||
|
OutputManager O;
|
||||||
|
MainManager M(&C, &Q, &O, &P);
|
||||||
|
|
||||||
|
QQmlApplicationEngine engine;
|
||||||
|
|
||||||
|
auto *R = engine.rootContext();
|
||||||
|
R->setContextProperty("CppManager", &C);
|
||||||
|
R->setContextProperty("QmlManager", &Q);
|
||||||
|
R->setContextProperty("PluginManager", &P);
|
||||||
|
R->setContextProperty("MainManager", &M);
|
||||||
|
R->setContextProperty("OutputManager", &O);
|
||||||
|
|
||||||
|
engine.load(QUrl(QLatin1String("qrc:/QML/main.qml")));
|
||||||
|
if (engine.rootObjects().isEmpty()) return -1;
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
13
qml.qrc
Executable file
13
qml.qrc
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>qtquickcontrols2.conf</file>
|
||||||
|
<file>QML/ExtendableView.qml</file>
|
||||||
|
<file>QML/main.qml</file>
|
||||||
|
<file>QML/PathChooser.qml</file>
|
||||||
|
<file>QML/PreparePage.qml</file>
|
||||||
|
<file>QML/ProcessPage.qml</file>
|
||||||
|
<file>QML/ResultPage.qml</file>
|
||||||
|
<file>QML/StartPage.qml</file>
|
||||||
|
<file>QML/TopBar.qml</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
15
qtquickcontrols2.conf
Executable file
15
qtquickcontrols2.conf
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
; This file can be edited to change the style of the application
|
||||||
|
; See Styling Qt Quick Controls 2 in the documentation for details:
|
||||||
|
; http://doc.qt.io/qt-5/qtquickcontrols2-styles.html
|
||||||
|
|
||||||
|
[Controls]
|
||||||
|
Style=Material
|
||||||
|
|
||||||
|
[Universal]
|
||||||
|
Theme=Light
|
||||||
|
;Accent=Steel
|
||||||
|
|
||||||
|
[Material]
|
||||||
|
Theme=Light
|
||||||
|
;Accent=BlueGrey
|
||||||
|
;Primary=BlueGray
|
Loading…
x
Reference in New Issue
Block a user