From d7bd20dd266c1fec7f6ce591938cd6c6e7a22b4b Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 10 Jul 2015 01:31:29 +0200 Subject: [PATCH] refs #445, data entry GUI * component for main info area * component for data mapping * new subproject --- build.pri | 3 + config.pri | 3 + .../components/datamaininfoareacomponent.cpp | 75 ++++++++ .../components/datamaininfoareacomponent.h | 73 +++++++ .../components/datamaininfoareacomponent.ui | 178 ++++++++++++++++++ .../components/datamappingcomponent.cpp | 87 +++++++++ .../components/datamappingcomponent.h | 68 +++++++ .../components/datamappingcomponent.ui | 159 ++++++++++++++++ src/swiftdata/main.cpp | 37 ++++ src/swiftdata/swiftdata.cpp | 91 +++++++++ src/swiftdata/swiftdata.h | 58 ++++++ src/swiftdata/swiftdata.ico | Bin 0 -> 67646 bytes src/swiftdata/swiftdata.pro | 28 +++ src/swiftdata/swiftdata.rc | 1 + src/swiftdata/swiftdata.ui | 93 +++++++++ 15 files changed, 954 insertions(+) create mode 100644 src/blackgui/components/datamaininfoareacomponent.cpp create mode 100644 src/blackgui/components/datamaininfoareacomponent.h create mode 100644 src/blackgui/components/datamaininfoareacomponent.ui create mode 100644 src/blackgui/components/datamappingcomponent.cpp create mode 100644 src/blackgui/components/datamappingcomponent.h create mode 100644 src/blackgui/components/datamappingcomponent.ui create mode 100644 src/swiftdata/main.cpp create mode 100644 src/swiftdata/swiftdata.cpp create mode 100644 src/swiftdata/swiftdata.h create mode 100644 src/swiftdata/swiftdata.ico create mode 100644 src/swiftdata/swiftdata.pro create mode 100644 src/swiftdata/swiftdata.rc create mode 100644 src/swiftdata/swiftdata.ui diff --git a/build.pri b/build.pri index 1ef8dcf67..9dbb0ad9c 100644 --- a/build.pri +++ b/build.pri @@ -115,6 +115,9 @@ contains(BLACK_CONFIG, BlackInput) { DEFINES += WITH_BLACKINPUT } contains(BLACK_CONFIG, BlackSim) { DEFINES += WITH_BLACKSIM } contains(BLACK_CONFIG, BlackCore) { DEFINES += WITH_BLACKCORE } contains(BLACK_CONFIG, BlackGui) { DEFINES += WITH_BLACKGUI } +contains(BLACK_CONFIG, SwiftData) { DEFINES += WITH_SWIFTDATA } +contains(BLACK_CONFIG, SwiftGui) { DEFINES += WITH_SWIFTGUI } +contains(BLACK_CONFIG, SwiftCore) { DEFINES += WITH_SWIFTCORE } contains(BLACK_CONFIG, FSX) { DEFINES += WITH_FSX } contains(BLACK_CONFIG, FS9) { DEFINES += WITH_FS9 } contains(BLACK_CONFIG, XPlane) { DEFINES += WITH_XPLANE } diff --git a/config.pri b/config.pri index 09153816d..179229508 100644 --- a/config.pri +++ b/config.pri @@ -29,6 +29,9 @@ BLACK_CONFIG += BlackSound BLACK_CONFIG += BlackInput BLACK_CONFIG += Samples BLACK_CONFIG += Unittests +BLACK_CONFIG += SwiftData +BLACK_CONFIG += SwiftCore +BLACK_CONFIG += SwiftGui BLACK_CONFIG += FS9 BLACK_CONFIG += FSX BLACK_CONFIG += XPlane diff --git a/src/blackgui/components/datamaininfoareacomponent.cpp b/src/blackgui/components/datamaininfoareacomponent.cpp new file mode 100644 index 000000000..83a10aad7 --- /dev/null +++ b/src/blackgui/components/datamaininfoareacomponent.cpp @@ -0,0 +1,75 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift Project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "blackgui/components/logcomponent.h" +#include "blackgui/components/datamappingcomponent.h" +#include "blackgui/components/datamaininfoareacomponent.h" +#include "ui_datamaininfoareacomponent.h" +#include "blackmisc/icons.h" + +using namespace BlackMisc; +using namespace BlackGui; +using namespace BlackGui::Components; + +namespace BlackGui +{ + namespace Components + { + CDataMainInfoAreaComponent::CDataMainInfoAreaComponent(QWidget *parent) : + CInfoArea(parent), + ui(new Ui::CDataMainInfoAreaComponent) + { + ui->setupUi(this); + initInfoArea(); // init base class + this->setWindowIcon(CIcons::swiftDatabase24()); + } + + CDataMainInfoAreaComponent::~CDataMainInfoAreaComponent() + { } + + CLogComponent *CDataMainInfoAreaComponent::getLogComponent() const + { + return this->ui->comp_Log; + } + + CDataMappingComponent *CDataMainInfoAreaComponent::getMappingComponent() const + { + return this->ui->comp_Mapping; + } + + QSize CDataMainInfoAreaComponent::getPreferredSizeWhenFloating(int areaIndex) const + { + InfoArea area = static_cast(areaIndex); + switch (area) + { + case InfoAreaMapping: + case InfoAreaSettings: + case InfoAreaLog: + default: + return QSize(800, 600); + } + } + + const QPixmap &CDataMainInfoAreaComponent::indexToPixmap(int areaIndex) const + { + InfoArea area = static_cast(areaIndex); + switch (area) + { + case InfoAreaMapping: + return CIcons::appMappings16(); + case InfoAreaSettings: + return CIcons::appSettings16(); + case InfoAreaLog: + return CIcons::appLog16(); + default: + return CIcons::empty(); + } + } + } // ns +} // ns diff --git a/src/blackgui/components/datamaininfoareacomponent.h b/src/blackgui/components/datamaininfoareacomponent.h new file mode 100644 index 000000000..9ec3fbb74 --- /dev/null +++ b/src/blackgui/components/datamaininfoareacomponent.h @@ -0,0 +1,73 @@ +/* Copyright (C) 2014 + * swift project Community / Contributors + * + * This file is part of swift Project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKGUI_DATAMAININFOAREACOMPONENT_H +#define BLACKGUI_DATAMAININFOAREACOMPONENT_H + +#include "blackgui/blackguiexport.h" +#include "blackgui/infoarea.h" +#include +#include + +namespace Ui { class CDataMainInfoAreaComponent; } + +namespace BlackGui +{ + namespace Components + { + class CLogComponent; + class CDataMappingComponent; + + /** + * Main info area for data entry tool + */ + class BLACKGUI_EXPORT CDataMainInfoAreaComponent : public BlackGui::CInfoArea + { + Q_OBJECT + + public: + //! Info areas + enum InfoArea + { + // index must match tab index! + InfoAreaMapping = 0, + InfoAreaLog = 1, + InfoAreaSettings = 2, + InfoAreaNone = -1 + }; + + //! Constructor + explicit CDataMainInfoAreaComponent(QWidget *parent = nullptr); + + //! Destructor + ~CDataMainInfoAreaComponent(); + + //! Log component + BlackGui::Components::CLogComponent *getLogComponent() const; + + //! Model component + BlackGui::Components::CDataMappingComponent *getMappingComponent() const; + + protected: + //! \copydoc CInfoArea::getPreferredSizeWhenFloating + virtual QSize getPreferredSizeWhenFloating(int areaIndex) const override; + + //! \copydoc CInfoArea::indexToPixmap + virtual const QPixmap &indexToPixmap(int areaIndex) const override; + + private: + QScopedPointer ui; + }; + + } // ns +} // ns + +#endif // guard diff --git a/src/blackgui/components/datamaininfoareacomponent.ui b/src/blackgui/components/datamaininfoareacomponent.ui new file mode 100644 index 000000000..6c1a9b3af --- /dev/null +++ b/src/blackgui/components/datamaininfoareacomponent.ui @@ -0,0 +1,178 @@ + + + CDataMainInfoAreaComponent + + + + 500 + 400 + + + + MainWindow + + + + + Qt::TopDockWidgetArea + + + Models + + + 4 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 2 + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + + + + 80 + 400 + + + + Qt::TopDockWidgetArea + + + Logging + + + 4 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 2 + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + + + + BlackGui::CDockWidgetInfoArea + QDockWidget +
blackgui/dockwidgetinfoarea.h
+ 1 +
+ + BlackGui::Components::CLogComponent + QFrame +
blackgui/components/logcomponent.h
+ 1 +
+ + BlackGui::Components::CDataMappingComponent + QFrame +
blackgui/components/datamappingcomponent.h
+ 1 +
+
+ + +
diff --git a/src/blackgui/components/datamappingcomponent.cpp b/src/blackgui/components/datamappingcomponent.cpp new file mode 100644 index 000000000..78379b700 --- /dev/null +++ b/src/blackgui/components/datamappingcomponent.cpp @@ -0,0 +1,87 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift Project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "datamappingcomponent.h" +#include "ui_datamappingcomponent.h" +#include "blackcore/web_datareader.h" + +using namespace BlackGui::Views; +using namespace BlackCore; + +namespace BlackGui +{ + namespace Components + { + CDataMappingComponent::CDataMappingComponent(QWidget *parent) : + QFrame(parent), + ui(new Ui::CDataMappingComponent) + { + ui->setupUi(this); + connect(this->ui->tvp_Distributors, &CDistributorView::requestUpdate, this, &CDataMappingComponent::ps_requestModelDataUpdate); + connect(this->ui->tvp_Liveries, &CLiveryView::requestUpdate, this, &CDataMappingComponent::ps_requestModelDataUpdate); + connect(this->ui->tvp_Models, &CLiveryView::requestUpdate, this, &CDataMappingComponent::ps_requestModelDataUpdate); + } + + CDataMappingComponent::~CDataMappingComponent() + { } + + void CDataMappingComponent::readersInitialized(CWebDataReader *webReaders) + { + Q_ASSERT_X(webReaders, Q_FUNC_INFO, "Missing readers"); + if (this->m_webDataReader) { return; } + if (!this->m_webReaderSignalConnections.isEmpty()) { return; } + this->m_webDataReader = webReaders; + this->m_webReaderSignalConnections = this->m_webDataReader->connectSwiftDatabaseSignals( + this, // the object here must be the same as in the bind + std::bind(&CDataMappingComponent::ps_aircraftIcaoCodeRead, this, std::placeholders::_1), + std::bind(&CDataMappingComponent::ps_airlineIcaoCodeRead, this, std::placeholders::_1), + std::bind(&CDataMappingComponent::ps_liveriesRead, this, std::placeholders::_1), + std::bind(&CDataMappingComponent::ps_distributorsRead, this, std::placeholders::_1), + std::bind(&CDataMappingComponent::ps_modelsRead, this, std::placeholders::_1)); + } + + void CDataMappingComponent::ps_aircraftIcaoCodeRead(int number) + { + Q_UNUSED(number); + } + + void CDataMappingComponent::ps_airlineIcaoCodeRead(int number) + { + Q_UNUSED(number); + } + + void CDataMappingComponent::ps_liveriesRead(int number) + { + Q_ASSERT_X(this->m_webDataReader, Q_FUNC_INFO, "Missing reader"); + Q_UNUSED(number); + this->ui->tvp_Liveries->updateContainerMaybeAsync(this->m_webDataReader->getLiveries()); + } + + void CDataMappingComponent::ps_distributorsRead(int number) + { + Q_ASSERT_X(this->m_webDataReader, Q_FUNC_INFO, "Missing reader"); + Q_UNUSED(number); + this->ui->tvp_Distributors->updateContainerMaybeAsync(this->m_webDataReader->getDistributors()); + } + + void CDataMappingComponent::ps_modelsRead(int number) + { + Q_ASSERT_X(this->m_webDataReader, Q_FUNC_INFO, "Missing reader"); + Q_UNUSED(number); + this->ui->tvp_Models->updateContainerMaybeAsync(this->m_webDataReader->getModels()); + } + + void CDataMappingComponent::ps_requestModelDataUpdate() + { + Q_ASSERT_X(this->m_webDataReader, Q_FUNC_INFO, "Missing reader"); + this->m_webDataReader->readModelDataInBackground(); + } + + } // ns +} // ns diff --git a/src/blackgui/components/datamappingcomponent.h b/src/blackgui/components/datamappingcomponent.h new file mode 100644 index 000000000..1cb8f0e74 --- /dev/null +++ b/src/blackgui/components/datamappingcomponent.h @@ -0,0 +1,68 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift Project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#ifndef BLACKGUI_DATAMAPPINGCOMPONENT_H +#define BLACKGUI_DATAMAPPINGCOMPONENT_H + +#include "blackgui/blackguiexport.h" +#include + +namespace Ui { class CDataMappingComponent; } +namespace BlackCore { class CWebDataReader; } + +namespace BlackGui +{ + namespace Components + { + /** + * Mappings from/for the database + */ + class BLACKGUI_EXPORT CDataMappingComponent : public QFrame + { + Q_OBJECT + + public: + //! Contructor + explicit CDataMappingComponent(QWidget *parent = nullptr); + + //! Destructor + ~CDataMappingComponent(); + + //! Readers have been initialized + void readersInitialized(BlackCore::CWebDataReader *webReaders); + + private slots: + //! Aircraft ICAO codes read + void ps_aircraftIcaoCodeRead(int number); + + //! Airline ICAO codes read + void ps_airlineIcaoCodeRead(int number); + + //! Liveries read + void ps_liveriesRead(int number); + + //! Distributors read + void ps_distributorsRead(int number); + + //! Models read + void ps_modelsRead(int number); + + //! Request distributor update + void ps_requestModelDataUpdate(); + + private: + QScopedPointer ui; + BlackCore::CWebDataReader *m_webDataReader = nullptr; + QList m_webReaderSignalConnections; + }; + + } // ns +} // ns + +#endif // guard diff --git a/src/blackgui/components/datamappingcomponent.ui b/src/blackgui/components/datamappingcomponent.ui new file mode 100644 index 000000000..270d3a2e9 --- /dev/null +++ b/src/blackgui/components/datamappingcomponent.ui @@ -0,0 +1,159 @@ + + + CDataMappingComponent + + + + 0 + 0 + 400 + 300 + + + + Frame + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + + Models + + + + 0 + + + 2 + + + 0 + + + 0 + + + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + false + + + + + + + + Liveries + + + + 0 + + + 2 + + + 0 + + + 0 + + + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + false + + + + + + + + Distributors + + + + 0 + + + 2 + + + 0 + + + 0 + + + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + false + + + + + + + + + + + + BlackGui::Views::CAircraftModelView + QTableView +
blackgui/views/aircraftmodelview.h
+
+ + BlackGui::Views::CDistributorView + QTableView +
blackgui/views/distributorview.h
+
+ + BlackGui::Views::CLiveryView + QTableView +
blackgui/views/liveryview.h
+
+
+ + +
diff --git a/src/swiftdata/main.cpp b/src/swiftdata/main.cpp new file mode 100644 index 000000000..f416d3355 --- /dev/null +++ b/src/swiftdata/main.cpp @@ -0,0 +1,37 @@ +/* Copyright (C) 2013 + * swift Project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "swiftdata.h" +#include "blackmisc/icons.h" +#include "blackmisc/worker.h" +#include "blackmisc/networkutils.h" +#include "blackmisc/blackmiscfreefunctions.h" +#include "blackmisc/project.h" +#include "blackmisc/loghandler.h" +#include "blackmisc/filelogger.h" +#include "blackgui/guiutility.h" +#include "blackgui/stylesheetutility.h" + +#include +#include + +using namespace BlackMisc; +using namespace BlackCore; +using namespace BlackGui; + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + CGuiUtility::initSwiftGuiApplication(a, "swiftdata", CIcons::swiftDatabase24()); + + CSwiftData w; + w.show(); + int r = a.exec(); + return r; +} diff --git a/src/swiftdata/swiftdata.cpp b/src/swiftdata/swiftdata.cpp new file mode 100644 index 000000000..c339076e2 --- /dev/null +++ b/src/swiftdata/swiftdata.cpp @@ -0,0 +1,91 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "swiftdata.h" +#include "ui_swiftdata.h" +#include "blackgui/components/logcomponent.h" +#include "blackgui/components/datamaininfoareacomponent.h" +#include "blackgui/components/datamappingcomponent.h" +#include "blackgui/components/enableforruntime.h" +#include "blackgui/stylesheetutility.h" +#include "blackcore/web_datareader.h" +#include "blackmisc/icon.h" +#include "blackmisc/loghandler.h" +#include "blackmisc/project.h" +#include +#include +#include + +using namespace BlackMisc; +using namespace BlackCore; +using namespace BlackGui; +using namespace BlackGui::Components; + +CSwiftData::CSwiftData(QWidget *parent) : + QMainWindow(parent), CIdentifiable(this), ui(new Ui::CSwiftData), + m_webDataReader(new CWebDataReader(CWebDataReader::AllSwiftDbReaders)) +{ + ui->setupUi(this); + this->init(); +} + +void CSwiftData::initStyleSheet() +{ + const QString s = CStyleSheetUtility::instance().styles( + { + CStyleSheetUtility::fileNameFonts(), + CStyleSheetUtility::fileNameStandardWidget(), + CStyleSheetUtility::fileNameSwiftData() + } + ); + this->setStyleSheet(s); +} + +CSwiftData::~CSwiftData() +{ } + +void CSwiftData::ps_appendLogMessage(const CStatusMessage &message) +{ + ui->comp_MainInfoArea->getLogComponent()->appendStatusMessageToList(message); +} + +void CSwiftData::ps_onStyleSheetsChanged() +{ + this->initStyleSheet(); +} + +void CSwiftData::init() +{ + this->setWindowIcon(CIcons::swiftDatabase24()); + this->setWindowTitle(QString("swiftdata %1").arg(CProject::version())); + this->setObjectName("CSwiftData"); + this->initStyleSheet(); + connect(&CStyleSheetUtility::instance(), &CStyleSheetUtility::styleSheetsChanged, this, &CSwiftData::ps_onStyleSheetsChanged); + this->initReaders(); +} + +void CSwiftData::initLogDisplay() +{ + CLogHandler::instance()->install(true); + CLogHandler::instance()->enableConsoleOutput(false); // default disable + auto logHandler = CLogHandler::instance()->handlerForPattern( + CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityInfo) + ); + logHandler->subscribe(this, &CSwiftData::ps_appendLogMessage); +} + + +void CSwiftData::initReaders() +{ + CDataMappingComponent *mc = this->ui->comp_MainInfoArea->getMappingComponent(); + Q_ASSERT_X(mc, Q_FUNC_INFO, "Missing mapping component"); + Q_ASSERT_X(this->m_webDataReader, Q_FUNC_INFO, "Missing reader"); + mc->readersInitialized(this->m_webDataReader); + this->m_webDataReader->readAllInBackground(1000); // kick of readers +} diff --git a/src/swiftdata/swiftdata.h b/src/swiftdata/swiftdata.h new file mode 100644 index 000000000..83b86cc1f --- /dev/null +++ b/src/swiftdata/swiftdata.h @@ -0,0 +1,58 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef SWIFTDATA_H +#define SWIFTDATA_H + +#include "blackcore/context_runtime.h" +#include "blackgui/systemtraywindow.h" +#include "blackgui/components/enableforruntime.h" +#include "blackgui/managedstatusbar.h" +#include "blackmisc/statusmessage.h" +#include "blackmisc/identifiable.h" +#include + +namespace Ui { class CSwiftData; } +namespace BlackCore { class CWebDataReader; } + +//! swift data entry control +class CSwiftData : + public QMainWindow, + public BlackMisc::CIdentifiable, + public BlackGui::Components::CEnableForRuntime +{ + Q_OBJECT + +public: + //! Constructor + CSwiftData(QWidget *parent = nullptr); + + //! Destructor + ~CSwiftData(); + +private slots: + //! Append log message + void ps_appendLogMessage(const BlackMisc::CStatusMessage &message); + + //! Style sheet has changed + void ps_onStyleSheetsChanged(); + +private: + void init(); + void initLogDisplay(); + void initStyleSheet(); + void initReaders(); + QScopedPointer ui; + BlackGui::CManagedStatusBar m_statusBar; + BlackCore::CWebDataReader *m_webDataReader = nullptr; +}; + +#endif // guard diff --git a/src/swiftdata/swiftdata.ico b/src/swiftdata/swiftdata.ico new file mode 100644 index 0000000000000000000000000000000000000000..1ebc3a9687a0852116c41cbf610ae8c03db18df0 GIT binary patch literal 67646 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 literal 0 HcmV?d00001 diff --git a/src/swiftdata/swiftdata.pro b/src/swiftdata/swiftdata.pro new file mode 100644 index 000000000..4b3f8bc56 --- /dev/null +++ b/src/swiftdata/swiftdata.pro @@ -0,0 +1,28 @@ +include ($$SourceRoot/config.pri) +include ($$SourceRoot/build.pri) + +QT += core dbus network xml multimedia gui svg + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = swiftdata +TEMPLATE = app + +SOURCES += *.cpp +HEADERS += *.h +FORMS += *.ui +CONFIG += blackmisc blacksound blackinput blackcore blackgui + +DEPENDPATH += . $$SourceRoot/src/blackmisc \ + $$SourceRoot/src/blacksound \ + $$SourceRoot/src/blackcore \ + $$SourceRoot/src/blackgui \ + $$SourceRoot/src/blackinput + +INCLUDEPATH += . $$SourceRoot/src +DESTDIR = $$BuildRoot/bin +OTHER_FILES += *.qss *.ico *.rc +RC_FILE = swiftdata.rc +DISTFILES += swiftdata.rc + +include ($$SourceRoot/libraries.pri) diff --git a/src/swiftdata/swiftdata.rc b/src/swiftdata/swiftdata.rc new file mode 100644 index 000000000..c4ba8b6c3 --- /dev/null +++ b/src/swiftdata/swiftdata.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "swiftdata.ico" diff --git a/src/swiftdata/swiftdata.ui b/src/swiftdata/swiftdata.ui new file mode 100644 index 000000000..c306606f0 --- /dev/null +++ b/src/swiftdata/swiftdata.ui @@ -0,0 +1,93 @@ + + + CSwiftData + + + + 0 + 0 + 800 + 600 + + + + + 800 + 600 + + + + swiftdata + + + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + 0 + 0 + + + + 0 + + + + + + + + + + + + + + + + 0 + 0 + 800 + 21 + + + + + File + + + + + + + + + Exit + + + + + + + BlackGui::Components::CDataMainInfoAreaComponent + QWidget +
blackgui/components/datamaininfoareacomponent.h
+ 1 +
+
+ + +