Merge remote-tracking branch 'ryzomcore/develop' into ryzomclassic-develop
commit
31e1cd6feb
@ -1,17 +1,27 @@
|
||||
4eddbaff0c5e5d685db96ee3e8427aa0fd96ac83 ryzomcore/v0.8.0
|
||||
00d9b6e29e95f56785fbf85abe60afd34674f402 ryzomcore/v0.9.0
|
||||
79776c337176dd5b02e1a74fe5dfb703b91747aa ryzomcore/v0.9.1
|
||||
fedf2aa443d09707beed814b0f499c6a5519cc84 ryzomcore/v0.10.0
|
||||
edaa3624a56420b02ccc64c26059801a389927ee ryzomcore/v0.11.0
|
||||
e3fe4855f22c3e75722e015dc33c091c340b3ad7 ryzomcore/v0.11.1
|
||||
9e583b717fd63be0be9fd60b99087abf1691ea49 ryzomcore/v0.11.2
|
||||
bfe5628e14a024ba7ea32e4b326ae433a07856b9 ryzomcore/v0.11.3
|
||||
9a6120735daa97c96ac5d85ca35c7f21f607bd87 ryzomcore/v0.12.0
|
||||
3e17907af67e8d66d80e6b714707bbf912607f2a ryzom-patch-3.0.0
|
||||
153e0b605c9e0c83ba05b6428c62838b49cc84b2 ryzom-patch-3.0.1
|
||||
4300cc14aad098b1f86ea4c55577b7fa4a4cb5d2 ryzom-patch-3.1.0
|
||||
043aaeb3d8a2a54177581b57bda87a9deaad510e ryzom-patch-3.1.0-april_patch
|
||||
00dde390a394fce9da06c2f3264140282158d39f ryzom-patch-3.3.0
|
||||
dcd4c4d161ef775136e18c7e8f5072b75dede27e ryzom-patch-3.3.1
|
||||
8eb94c3549be898fdc4a7c6d791d2477bdc11a18 ryzomcore/v1.0.1
|
||||
3e92c7104c20d6bc6c2147b4b5fc289e8621d322 ryzomcore/v1.0.0
|
||||
4eddbaff0c5e5d685db96ee3e8427aa0fd96ac83 v0.8.0
|
||||
00d9b6e29e95f56785fbf85abe60afd34674f402 v0.9.0
|
||||
79776c337176dd5b02e1a74fe5dfb703b91747aa v0.9.1
|
||||
fedf2aa443d09707beed814b0f499c6a5519cc84 v0.10.0
|
||||
edaa3624a56420b02ccc64c26059801a389927ee v0.11.0
|
||||
e3fe4855f22c3e75722e015dc33c091c340b3ad7 v0.11.1
|
||||
9e583b717fd63be0be9fd60b99087abf1691ea49 v0.11.2
|
||||
bfe5628e14a024ba7ea32e4b326ae433a07856b9 v0.11.3
|
||||
9a6120735daa97c96ac5d85ca35c7f21f607bd87 v0.12.0
|
||||
3e92c7104c20d6bc6c2147b4b5fc289e8621d322 v1.0.0
|
||||
8eb94c3549be898fdc4a7c6d791d2477bdc11a18 v1.0.1
|
||||
3e17907af67e8d66d80e6b714707bbf912607f2a ryzom/3.0.0
|
||||
153e0b605c9e0c83ba05b6428c62838b49cc84b2 ryzom/3.0.1
|
||||
9d41f2994d44b9aad92b83f945f114e4b6bed44a ryzom/3.0.2
|
||||
4300cc14aad098b1f86ea4c55577b7fa4a4cb5d2 ryzom/3.1.0
|
||||
d4060f217f4f834cc62a33f2f1ccdf3c28298066 ryzom/3.1.0-hotfix
|
||||
043aaeb3d8a2a54177581b57bda87a9deaad510e ryzom/3.1.0-april_patch
|
||||
4036ecf59e83960f03acebc2089eb2ff5eeaed0a ryzom/3.2.0
|
||||
18403bb9485da3d9742c6f007a16d5619ebfb196 ryzom/3.2.1
|
||||
822ff8f8917ad66e09e2c21c983282f6f693b9f6 ryzom/3.3.0
|
||||
00dde390a394fce9da06c2f3264140282158d39f ryzom/3.3.0
|
||||
dcd4c4d161ef775136e18c7e8f5072b75dede27e ryzom/3.3.1
|
||||
fc4be8ebec5ca754ef4453bc6a9faef90837c674 ryzom/3.4.0
|
||||
70eba02e8eab6920586dbabf74e9e8180c729980 ryzom/3.4.0-steam_fix
|
||||
3941482843f9cd130cfc16634efc08d34a98ed35 ryzom/3.4.0-atysmas
|
||||
ecae9feb4cceb78103e5d7236caccaf450796cdb ryzom/3.5.0
|
||||
95783afa226f241062134eb62f4323295d29ac84 ryzom/3.5.0.9637
|
||||
|
@ -0,0 +1,44 @@
|
||||
// NeL - MMORPG Framework <https://wiki.ryzom.dev/>
|
||||
// Copyright (C) 2019 Jan BOON (jan.boon@kaetemi.be)
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// 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 Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#ifndef NLMISC_STREAMED_PACKAGE_PROVIDER_H
|
||||
#define NLMISC_STREAMED_PACKAGE_PROVIDER_H
|
||||
|
||||
#include <nel/misc/types_nl.h>
|
||||
#include <nel/misc/sha1.h>
|
||||
#include <string>
|
||||
|
||||
namespace NLMISC {
|
||||
|
||||
class IStreamedPackageProvider
|
||||
{
|
||||
public:
|
||||
IStreamedPackageProvider();
|
||||
virtual ~IStreamedPackageProvider();
|
||||
|
||||
/// Download a file. This call is blocking
|
||||
/// filePath: [out] ex. /games/nel/stream/00/00/000000000..
|
||||
/// hash: [in]
|
||||
/// name: [in] name for debugging purposes
|
||||
virtual bool getFile(std::string &filePath, const CHashKey &hash, const std::string &name = "") = 0;
|
||||
|
||||
}; /* class IStreamedPackageProvider */
|
||||
|
||||
} /* namespace NLMISC */
|
||||
|
||||
#endif /* #ifndef NLMISC_STREAMED_PACKAGE_PROVIDER_H */
|
||||
|
||||
/* end of file */
|
@ -0,0 +1,2 @@
|
||||
FILE(GLOB HEADERS *.h)
|
||||
INSTALL(FILES ${HEADERS} DESTINATION include/nel/web COMPONENT headers)
|
@ -0,0 +1,71 @@
|
||||
// NeL - MMORPG Framework <https://wiki.ryzom.dev/>
|
||||
// Copyright (C) 2019 Jan BOON (jan.boon@kaetemi.be)
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// 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 Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#ifndef NLWEB_HTTP_PACKAGE_PROVIDER_H
|
||||
#define NLWEB_HTTP_PACKAGE_PROVIDER_H
|
||||
|
||||
#include <nel/misc/types_nl.h>
|
||||
#include <nel/misc/i_streamed_package_provider.h>
|
||||
|
||||
/// NeL Streamed Packages are like NeL Big Packages, but storing only
|
||||
/// the file hash, allowing to load the file from a remote source instead.
|
||||
|
||||
/// Technically, this works, because NeL 3D already loads resources
|
||||
/// asynchronously. However, NeL 3D will not simultaneously load more
|
||||
/// than one file, so on connections with high latency a backlog builds up.
|
||||
/// It will need further changes in NeL 3D to be practical.
|
||||
|
||||
/// Alternatively, it could be modified to plug in dynamic data packages
|
||||
/// at runtime, for example to load in user models for Ring. It would
|
||||
/// need an adjustment to download all files as soon as the package is
|
||||
/// enabled. Advantage is that existing files are automatically matched
|
||||
/// by their hash, so will only be downloaded once, and that files are
|
||||
/// accessed in the same way as files inside bnp packages.
|
||||
|
||||
/// The extension `.snp` is used for streamed packages.
|
||||
|
||||
/// This class uses an HTTP server with LZMA compressed resources as
|
||||
/// the package data source.
|
||||
|
||||
namespace NLWEB {
|
||||
|
||||
class CHttpPackageProvider : public NLMISC::IStreamedPackageProvider
|
||||
{
|
||||
public:
|
||||
CHttpPackageProvider();
|
||||
virtual ~CHttpPackageProvider();
|
||||
|
||||
/// Download a file. This call is blocking
|
||||
/// filePath: [out] ex. /games/nel/stream/00/00/000000000..
|
||||
/// hash: [in]
|
||||
/// name: [in] name for debugging purposes
|
||||
virtual bool getFile(std::string &filePath, const NLMISC::CHashKey &hash, const std::string &name) NL_OVERRIDE;
|
||||
|
||||
public:
|
||||
/// Set storage path (ex. stream/)
|
||||
std::string Path;
|
||||
|
||||
/// Loads a package into the package manager (ex. http://cdn.ryzom.dev/open/stream/)
|
||||
typedef std::vector<std::string> THosts;
|
||||
THosts Hosts;
|
||||
|
||||
}; /* class CHttpPackageProvider */
|
||||
|
||||
} /* namespace NLMISC */
|
||||
|
||||
#endif /* #ifndef NLWEB_HTTP_PACKAGE_PROVIDER_H */
|
||||
|
||||
/* end of file */
|
@ -0,0 +1,37 @@
|
||||
// NeL - MMORPG Framework <https://wiki.ryzom.dev/>
|
||||
// Copyright (C) 2019 Jan BOON (jan.boon@kaetemi.be)
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// 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 Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "stdmisc.h"
|
||||
|
||||
// Project includes
|
||||
#include <nel/misc/i_streamed_package_provider.h>
|
||||
|
||||
namespace NLMISC
|
||||
{
|
||||
|
||||
IStreamedPackageProvider::IStreamedPackageProvider()
|
||||
{
|
||||
// init
|
||||
}
|
||||
|
||||
IStreamedPackageProvider::~IStreamedPackageProvider()
|
||||
{
|
||||
// release
|
||||
}
|
||||
|
||||
} /* namespace NLMISC */
|
||||
|
||||
/* end of file */
|
@ -0,0 +1,28 @@
|
||||
FILE(GLOB SRC *.cpp *.h)
|
||||
FILE(GLOB HEADERS ../../include/nel/web/*.h)
|
||||
|
||||
SOURCE_GROUP("" FILES ${SRC} ${HEADERS})
|
||||
|
||||
NL_TARGET_LIB(nelweb ${HEADERS} ${SRC})
|
||||
|
||||
INCLUDE_DIRECTORIES(../../3rdparty)
|
||||
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${CURL_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR})
|
||||
|
||||
TARGET_LINK_LIBRARIES(nelweb ${LIBXML2_LIBRARIES} ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES} nelmisc nel_sevenzip)
|
||||
|
||||
NL_DEFAULT_PROPS(nelweb "NeL, Library: NeL Web")
|
||||
NL_ADD_RUNTIME_FLAGS(nelweb)
|
||||
|
||||
NL_ADD_LIB_SUFFIX(nelweb)
|
||||
|
||||
ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} ${CURL_DEFINITIONS})
|
||||
|
||||
IF(WITH_PCH)
|
||||
ADD_NATIVE_PRECOMPILED_HEADER(nelweb ${CMAKE_CURRENT_SOURCE_DIR}/stdweb.h ${CMAKE_CURRENT_SOURCE_DIR}/stdweb.cpp)
|
||||
ENDIF()
|
||||
|
||||
NL_GEN_PC(nel-web.pc)
|
||||
|
||||
IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC)
|
||||
INSTALL(TARGETS nelweb LIBRARY DESTINATION ${NL_LIB_PREFIX} ARCHIVE DESTINATION ${NL_LIB_PREFIX} COMPONENT libraries)
|
||||
ENDIF()
|
@ -0,0 +1,146 @@
|
||||
// NeL - MMORPG Framework <https://wiki.ryzom.dev/>
|
||||
// Copyright (C) 2019 Jan BOON (jan.boon@kaetemi.be)
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// 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 Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "stdweb.h"
|
||||
#include <nel/web/http_package_provider.h>
|
||||
|
||||
// Project includes
|
||||
#include <nel/misc/streamed_package.h>
|
||||
#include <nel/misc/file.h>
|
||||
#include <nel/misc/path.h>
|
||||
#include <nel/misc/seven_zip.h>
|
||||
#include <nel/misc/sha1.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace NLMISC;
|
||||
using namespace NLWEB;
|
||||
|
||||
namespace NLWEB
|
||||
{
|
||||
|
||||
CHttpPackageProvider::CHttpPackageProvider()
|
||||
{
|
||||
// init
|
||||
}
|
||||
|
||||
CHttpPackageProvider::~CHttpPackageProvider()
|
||||
{
|
||||
// release
|
||||
}
|
||||
|
||||
bool CHttpPackageProvider::getFile(std::string &filePath, const CHashKey &hash, const std::string &name)
|
||||
{
|
||||
CStreamedPackage::makePath(filePath, hash);
|
||||
std::string downloadUrlFile = filePath + ".lzma";
|
||||
filePath = Path + filePath;
|
||||
std::string downloadPath = filePath + ".download." + toString(rand() * rand());
|
||||
|
||||
std::string storageDirectory = CFile::getPath(downloadPath);
|
||||
CFile::createDirectoryTree(storageDirectory);
|
||||
/*if (!CFile::isDirectory(storageDirectory) || !CFile::createDirectoryTree(storageDirectory))
|
||||
{
|
||||
nldebug("Unable to create directory '%s'", storageDirectory.c_str());
|
||||
return false;
|
||||
}*/
|
||||
|
||||
// download
|
||||
for (;;)
|
||||
{
|
||||
if (CFile::fileExists(filePath))
|
||||
return true;
|
||||
|
||||
std::string downloadUrl = Hosts[rand() % Hosts.size()] + downloadUrlFile;
|
||||
nldebug("Download streamed package '%s' from '%s'", name.c_str(), downloadUrl.c_str());
|
||||
|
||||
FILE *fp = fopen(downloadPath.c_str(), "wb");
|
||||
if (fp == NULL)
|
||||
{
|
||||
nldebug("Unable to create file '%s' for '%s'", downloadPath.c_str(), name.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
curl = curl_easy_init();
|
||||
if (curl)
|
||||
{
|
||||
curl_easy_setopt(curl, CURLOPT_URL, downloadUrl.c_str());
|
||||
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_FILE, fp);
|
||||
res = curl_easy_perform(curl);
|
||||
long r;
|
||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &r);
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
bool diskFull = ferror(fp) && errno == 28 /*ENOSPC*/;
|
||||
fclose(fp);
|
||||
|
||||
if (diskFull)
|
||||
{
|
||||
CFile::deleteFile(downloadPath);
|
||||
throw EDiskFullError(downloadPath);
|
||||
}
|
||||
|
||||
if (res != CURLE_OK || r < 200 || r >= 300)
|
||||
{
|
||||
CFile::deleteFile(downloadPath);
|
||||
nldebug("Download failed '%s', retry in 1s", downloadUrl.c_str());
|
||||
nlSleep(1000);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
nldebug("Curl initialize failed");
|
||||
fclose(fp);
|
||||
CFile::deleteFile(downloadPath);
|
||||
return false;
|
||||
}
|
||||
|
||||
// ok!
|
||||
break;
|
||||
}
|
||||
|
||||
// extract into file
|
||||
std::string unpackPath = filePath + ".extract." + toString(rand() * rand());
|
||||
|
||||
CHashKey outHash;
|
||||
if (!unpackLZMA(downloadPath, unpackPath, outHash))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(outHash == hash))
|
||||
{
|
||||
std::string wantHashS = hash.toString();
|
||||
std::string outHashS = outHash.toString();
|
||||
nlwarning("Invalid SHA1 hash for file '%s', download has hash '%s'", wantHashS.c_str(), outHashS.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!CFile::moveFile(filePath.c_str(), unpackPath.c_str()))
|
||||
{
|
||||
nldebug("Failed moving '%s' to '%s'", unpackPath.c_str(), filePath.c_str());
|
||||
// in case downloaded from another thread
|
||||
return CFile::fileExists(filePath);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
} /* namespace NLMISC */
|
||||
|
||||
/* end of file */
|
@ -0,0 +1,17 @@
|
||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// 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 Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "stdweb.h"
|
@ -0,0 +1,85 @@
|
||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// 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 Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#ifndef NL_STDWEB_H
|
||||
#define NL_STDWEB_H
|
||||
|
||||
#if defined(_MSC_VER) && defined(_DEBUG)
|
||||
#define _CRTDBG_MAP_ALLOC
|
||||
#include <stdlib.h>
|
||||
#include <malloc.h>
|
||||
#include <crtdbg.h>
|
||||
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
|
||||
#elif defined(_MSC_VER)
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <csignal>
|
||||
#include <cstdarg>
|
||||
#include <cstddef>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <ctime>
|
||||
#include <deque>
|
||||
#include <exception>
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <limits>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <numeric>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <typeinfo>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include <nel/misc/types_nl.h>
|
||||
|
||||
#ifdef NL_OS_WINDOWS
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# define _WIN32_WINDOWS 0x0500
|
||||
# ifndef _WIN32_WINNT
|
||||
# define _WIN32_WINNT 0x0500
|
||||
# endif
|
||||
# ifndef NL_COMP_MINGW
|
||||
# define WINVER 0x0500
|
||||
# define NOMINMAX
|
||||
# endif
|
||||
# include <WinSock2.h>
|
||||
# include <Windows.h>
|
||||
# include <wincrypt.h>
|
||||
# ifdef X509_NAME
|
||||
# undef X509_NAME
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include <libxml/parser.h>
|
||||
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/ssl.h>
|
||||
#include <openssl/err.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
#include <nel/misc/debug.h>
|
||||
|
||||
#endif // NL_STDWEB_H
|
@ -0,0 +1,11 @@
|
||||
#include "main.h"
|
||||
|
||||
int main(int argc, char * argv[])
|
||||
{
|
||||
QApplication application(argc, argv);
|
||||
MainWindow window;
|
||||
|
||||
window.show();
|
||||
|
||||
return application.exec();
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
#ifndef MAIN_H
|
||||
#define MAIN_H
|
||||
|
||||
#include <QApplication>
|
||||
|
||||
#include "mainwindow.h"
|
||||
|
||||
#endif // MAIN_H
|
@ -0,0 +1,253 @@
|
||||
#include "mainwindow.h"
|
||||
|
||||
MainWindow::MainWindow(QWidget * parent) :
|
||||
QMainWindow(parent),
|
||||
uiMainWindow_(new Ui::MainWindow),
|
||||
processList_(new QProcess(this)),
|
||||
processSearch_(new QProcess(this)),
|
||||
processPack_(new QProcess(this)),
|
||||
processUnpack_(new QProcess(this))
|
||||
{
|
||||
uiMainWindow_->setupUi(this);
|
||||
|
||||
settings_ = new QSettings("bnp_make_frontend.cfg", QSettings::IniFormat);
|
||||
bnpMakeBinary_ = settings_->value("BnpMakeBinary").toString();
|
||||
dataPath_ = settings_->value("DataPath").toString();
|
||||
|
||||
uiMainWindow_->lineEditSearchPath->setText(dataPath_);
|
||||
uiMainWindow_->lineEditBnpMake->setText(bnpMakeBinary_);
|
||||
uiMainWindow_->lineEditDataPath->setText(dataPath_);
|
||||
|
||||
connect(uiMainWindow_->pushButtonListBrowse, SIGNAL(clicked()), this, SLOT(onButtonListBrowseClicked()));
|
||||
connect(uiMainWindow_->pushButtonList, SIGNAL(clicked()), this, SLOT(onButtonListClicked()));
|
||||
connect(processList_, SIGNAL(finished(int)), this, SLOT(onProcessListComplete()));
|
||||
|
||||
connect(uiMainWindow_->pushButtonSearchBrowse, SIGNAL(clicked()), this, SLOT(onButtonSearchBrowseClicked()));
|
||||
connect(uiMainWindow_->pushButtonSearch, SIGNAL(clicked()), this, SLOT(onButtonSearchClicked()));
|
||||
connect(processSearch_, SIGNAL(finished(int)), this, SLOT(onProcessSearchComplete()));
|
||||
|
||||
connect(uiMainWindow_->pushButtonPackBrowse, SIGNAL(clicked()), this, SLOT(onButtonPackBrowseClicked()));
|
||||
connect(uiMainWindow_->pushButtonPack, SIGNAL(clicked()), this, SLOT(onButtonPackClicked()));
|
||||
connect(processPack_, SIGNAL(finished(int)), this, SLOT(onProcessPackComplete()));
|
||||
|
||||
connect(uiMainWindow_->pushButtonUnpackBrowse, SIGNAL(clicked()), this, SLOT(onButtonUnpackBrowseClicked()));
|
||||
connect(uiMainWindow_->pushButtonUnpack, SIGNAL(clicked()), this, SLOT(onButtonUnpackClicked()));
|
||||
connect(processUnpack_, SIGNAL(finished(int)), this, SLOT(onProcessUnpackComplete()));
|
||||
|
||||
connect(uiMainWindow_->pushButtonBnpMakeBrowse, SIGNAL(clicked()), this, SLOT(onButtonBnpMakeBrowseClicked()));
|
||||
connect(uiMainWindow_->pushButtonDataPathBrowse, SIGNAL(clicked()), this, SLOT(onButtonDataPathBrowseClicked()));
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
delete uiMainWindow_;
|
||||
}
|
||||
|
||||
void MainWindow::onButtonListBrowseClicked()
|
||||
{
|
||||
QString fileName;
|
||||
|
||||
fileName = QFileDialog::getOpenFileName(this, "Choose a BNP file", dataPath_, "BNP file (*.bnp)");
|
||||
uiMainWindow_->lineEditList->setText(fileName);
|
||||
}
|
||||
|
||||
void MainWindow::onButtonListClicked()
|
||||
{
|
||||
QStringList arguments;
|
||||
|
||||
uiMainWindow_->textEditList->clear();
|
||||
|
||||
if (bnpMakeBinary_ != "")
|
||||
if (uiMainWindow_->lineEditList->text() != "")
|
||||
{
|
||||
arguments << "/l" << uiMainWindow_->lineEditList->text();
|
||||
processList_->start(bnpMakeBinary_, arguments);
|
||||
}
|
||||
else
|
||||
uiMainWindow_->textEditList->append("Choose a BNP file.");
|
||||
else
|
||||
uiMainWindow_->textEditList->append("Check bnp_make path.");
|
||||
}
|
||||
|
||||
void MainWindow::onProcessListComplete()
|
||||
{
|
||||
QString output;
|
||||
|
||||
output = processList_->readAllStandardOutput();
|
||||
uiMainWindow_->textEditList->append(output);
|
||||
uiMainWindow_->textEditList->append("List complete.");
|
||||
}
|
||||
|
||||
void MainWindow::onButtonSearchBrowseClicked()
|
||||
{
|
||||
QString directory;
|
||||
|
||||
directory = QFileDialog::getExistingDirectory(this, tr("Choose a directory"), dataPath_, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
|
||||
uiMainWindow_->lineEditSearchPath->setText(directory);
|
||||
}
|
||||
|
||||
void MainWindow::onButtonSearchClicked()
|
||||
{
|
||||
QDir dir;
|
||||
QStringList nameFilters;
|
||||
|
||||
uiMainWindow_->textEditSearch->clear();
|
||||
|
||||
if (bnpMakeBinary_ != "")
|
||||
if (uiMainWindow_->lineEditSearchPath->text() != "")
|
||||
{
|
||||
dir.cd(uiMainWindow_->lineEditSearchPath->text());
|
||||
|
||||
nameFilters << "*.bnp";
|
||||
dir.setNameFilters(nameFilters);
|
||||
dir.setFilter(QDir::Files);
|
||||
|
||||
fileInfoList_ = dir.entryInfoList();
|
||||
fileInfoListIndex_ = 0;
|
||||
|
||||
onProcessSearchComplete();
|
||||
}
|
||||
else
|
||||
uiMainWindow_->textEditSearch->append("Choose a directory.");
|
||||
else
|
||||
uiMainWindow_->textEditSearch->append("Check bnp_make path.");
|
||||
}
|
||||
|
||||
void MainWindow::onProcessSearchComplete()
|
||||
{
|
||||
QFileInfo fileInfo;
|
||||
QStringList arguments;
|
||||
QString output;
|
||||
QStringList outputList;
|
||||
QString line;
|
||||
|
||||
if (fileInfoListIndex_ > 0)
|
||||
{
|
||||
output = processSearch_->readAllStandardOutput();
|
||||
|
||||
if (uiMainWindow_->lineEditSearchString->text() == "")
|
||||
uiMainWindow_->textEditSearch->append(output);
|
||||
else
|
||||
{
|
||||
outputList = output.split("\n");
|
||||
|
||||
foreach (line, outputList)
|
||||
if (line.contains(uiMainWindow_->lineEditSearchString->text()))
|
||||
uiMainWindow_->textEditSearch->append(line.trimmed());
|
||||
}
|
||||
}
|
||||
|
||||
if (fileInfoListIndex_ < fileInfoList_.count())
|
||||
{
|
||||
fileInfo = fileInfoList_.at(fileInfoListIndex_++);
|
||||
uiMainWindow_->textEditSearch->append("===> " + uiMainWindow_->lineEditSearchPath->text() + "/" + fileInfo.fileName() + ":");
|
||||
arguments << "/l" << uiMainWindow_->lineEditSearchPath->text() + "/" + fileInfo.fileName();
|
||||
processSearch_->start(bnpMakeBinary_, arguments);
|
||||
}
|
||||
else
|
||||
{
|
||||
uiMainWindow_->textEditSearch->append("Search complete.");
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::onButtonPackBrowseClicked()
|
||||
{
|
||||
QString directory;
|
||||
|
||||
directory = QFileDialog::getExistingDirectory(this, tr("Choose the source directory"), dataPath_, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
|
||||
uiMainWindow_->lineEditPack->setText(directory);
|
||||
}
|
||||
|
||||
void MainWindow::onButtonPackClicked()
|
||||
{
|
||||
QStringList arguments;
|
||||
|
||||
uiMainWindow_->textEditPack->clear();
|
||||
|
||||
if (bnpMakeBinary_ != "")
|
||||
if (uiMainWindow_->lineEditPack->text() != "")
|
||||
{
|
||||
uiMainWindow_->textEditPack->append("Pack in progress...");
|
||||
|
||||
arguments << "/p" << uiMainWindow_->lineEditPack->text();
|
||||
processPack_->start(bnpMakeBinary_, arguments);
|
||||
}
|
||||
else
|
||||
uiMainWindow_->textEditPack->append("Choose the source directory.");
|
||||
else
|
||||
uiMainWindow_->textEditPack->append("Check bnp_make path.");
|
||||
}
|
||||
|
||||
void MainWindow::onProcessPackComplete()
|
||||
{
|
||||
QString output;
|
||||
|
||||
output = processPack_->readAllStandardOutput();
|
||||
uiMainWindow_->textEditPack->append(output);
|
||||
uiMainWindow_->textEditPack->append("Pack complete.");
|
||||
}
|
||||
|
||||
void MainWindow::onButtonUnpackBrowseClicked()
|
||||
{
|
||||
QString fileName;
|
||||
|
||||
fileName = QFileDialog::getOpenFileName(this, "Choose a BNP file", dataPath_, "BNP file (*.bnp)");
|
||||
uiMainWindow_->lineEditUnpack->setText(fileName);
|
||||
}
|
||||
|
||||
void MainWindow::onButtonUnpackClicked()
|
||||
{
|
||||
QStringList arguments;
|
||||
|
||||
uiMainWindow_->textEditUnpack->clear();
|
||||
|
||||
if (bnpMakeBinary_ != "")
|
||||
if (uiMainWindow_->lineEditUnpack->text() != "")
|
||||
{
|
||||
uiMainWindow_->textEditUnpack->append("Unpack in progress...");
|
||||
|
||||
arguments << "/u" << uiMainWindow_->lineEditUnpack->text();
|
||||
processUnpack_->start(bnpMakeBinary_, arguments);
|
||||
}
|
||||
else
|
||||
uiMainWindow_->textEditUnpack->append("Choose a BNP file.");
|
||||
else
|
||||
uiMainWindow_->textEditUnpack->append("Check bnp_make path.");
|
||||
}
|
||||
|
||||
void MainWindow::onProcessUnpackComplete()
|
||||
{
|
||||
uiMainWindow_->textEditUnpack->append("Unpack complete.");
|
||||
}
|
||||
|
||||
void MainWindow::onButtonBnpMakeBrowseClicked()
|
||||
{
|
||||
QString fileName;
|
||||
|
||||
fileName = QFileDialog::getOpenFileName(this, "Locate the bnp_make binary", dataPath_);
|
||||
uiMainWindow_->lineEditBnpMake->setText(fileName);
|
||||
|
||||
bnpMakeBinary_ = fileName;
|
||||
settings_->setValue("BnpMakeBinary", fileName);
|
||||
|
||||
uiMainWindow_->textEditSettings->clear();
|
||||
if (fileName != "")
|
||||
uiMainWindow_->textEditSettings->append("bnp_make path changed.");
|
||||
else
|
||||
uiMainWindow_->textEditSettings->append("Locate the bnp_make binary.");
|
||||
}
|
||||
|
||||
void MainWindow::onButtonDataPathBrowseClicked()
|
||||
{
|
||||
QString directory;
|
||||
|
||||
directory = QFileDialog::getExistingDirectory(this, tr("Choose a directory"), dataPath_, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
|
||||
uiMainWindow_->lineEditDataPath->setText(directory);
|
||||
|
||||
dataPath_ = directory;
|
||||
settings_->setValue("DataPath", directory);
|
||||
uiMainWindow_->lineEditSearchPath->setText(directory);
|
||||
|
||||
uiMainWindow_->textEditSettings->clear();
|
||||
uiMainWindow_->textEditSettings->append("Data path changed.");
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include <QMainWindow>
|
||||
#include <QSettings>
|
||||
#include <QProcess>
|
||||
#include <QFileDialog>
|
||||
|
||||
#include "ui_mainwindow.h"
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class MainWindow;
|
||||
}
|
||||
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MainWindow(QWidget * parent = 0);
|
||||
~MainWindow();
|
||||
|
||||
public slots:
|
||||
void onButtonListBrowseClicked();
|
||||
void onButtonListClicked();
|
||||
void onProcessListComplete();
|
||||
|
||||
void onButtonSearchBrowseClicked();
|
||||
void onButtonSearchClicked();
|
||||
void onProcessSearchComplete();
|
||||
|
||||
void onButtonPackBrowseClicked();
|
||||
void onButtonPackClicked();
|
||||
void onProcessPackComplete();
|
||||
|
||||
void onButtonUnpackBrowseClicked();
|
||||
void onButtonUnpackClicked();
|
||||
void onProcessUnpackComplete();
|
||||
|
||||
void onButtonBnpMakeBrowseClicked();
|
||||
void onButtonDataPathBrowseClicked();
|
||||
|
||||
private:
|
||||
Ui::MainWindow * uiMainWindow_;
|
||||
QSettings * settings_;
|
||||
QString bnpMakeBinary_;
|
||||
QString dataPath_;
|
||||
|
||||
QProcess * processList_;
|
||||
|
||||
QProcess * processSearch_;
|
||||
int fileInfoListIndex_;
|
||||
QFileInfoList fileInfoList_;
|
||||
|
||||
QProcess * processPack_;
|
||||
|
||||
QProcess * processUnpack_;
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
@ -0,0 +1,322 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>600</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>bnp-make-frontend</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="bnp-make-frontend.qrc">
|
||||
<normaloff>:/images/bnp-make-frontend.ico</normaloff>:/images/bnp-make-frontend.ico</iconset>
|
||||
</property>
|
||||
<property name="tabShape">
|
||||
<enum>QTabWidget::Rounded</enum>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralWidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidgetMenu">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tabList">
|
||||
<attribute name="title">
|
||||
<string>List</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayoutList">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayoutList">
|
||||
<item>
|
||||
<widget class="QLabel" name="labelList">
|
||||
<property name="text">
|
||||
<string>BNP file:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEditList">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonListBrowse">
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonList">
|
||||
<property name="text">
|
||||
<string>List</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTextEdit" name="textEditList">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabSearch">
|
||||
<attribute name="title">
|
||||
<string>Search</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayoutSearch">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayoutSearchPath">
|
||||
<item>
|
||||
<widget class="QLabel" name="labelSearchPath">
|
||||
<property name="text">
|
||||
<string>Search path:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEditSearchPath">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonSearchBrowse">
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayoutSearchString">
|
||||
<item>
|
||||
<widget class="QLabel" name="labelSearchString">
|
||||
<property name="text">
|
||||
<string>Search string:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEditSearchString"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonSearch">
|
||||
<property name="text">
|
||||
<string>Search</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTextEdit" name="textEditSearch">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabPack">
|
||||
<attribute name="title">
|
||||
<string>Pack</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayoutPack">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayoutPack">
|
||||
<item>
|
||||
<widget class="QLabel" name="labelPack">
|
||||
<property name="text">
|
||||
<string>Source path:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEditPack">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonPackBrowse">
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonPack">
|
||||
<property name="text">
|
||||
<string>Pack</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTextEdit" name="textEditPack">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabUnpack">
|
||||
<attribute name="title">
|
||||
<string>Unpack</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayoutUnpack">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayoutUnpack">
|
||||
<item>
|
||||
<widget class="QLabel" name="labelUnpack">
|
||||
<property name="text">
|
||||
<string>BNP file:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEditUnpack">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonUnpackBrowse">
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonUnpack">
|
||||
<property name="text">
|
||||
<string>Unpack</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTextEdit" name="textEditUnpack">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabSettings">
|
||||
<attribute name="title">
|
||||
<string>Settings</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayoutSettings">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayoutBnpMake">
|
||||
<item>
|
||||
<widget class="QLabel" name="labelSettingsBnpMake">
|
||||
<property name="text">
|
||||
<string>bnp_make path:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEditBnpMake">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonBnpMakeBrowse">
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayoutDataPath">
|
||||
<item>
|
||||
<widget class="QLabel" name="labelDataPath">
|
||||
<property name="text">
|
||||
<string>Data path:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEditDataPath">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonDataPathBrowse">
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTextEdit" name="textEditSettings">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<resources>
|
||||
<include location="bnp-make-frontend.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
Loading…
Reference in New Issue