main.cpp 5.97 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt 3D Studio Demos.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of The Qt Company Ltd nor the names of its
**     contributors may be used to endorse or promote products derived
**     from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include <QtGui/QGuiApplication>
#include <QtCore/QDir>
#include <QtQuick/QQuickView>
#include <QtQml/QQmlEngine>
#include <QtQml/QQmlContext>
#include <QtGui/QScreen>
#include <QtQml/QQmlPropertyMap>
#include "housemodel.h"
59 60 61
#if defined(KNX_BACKEND)
#include "qmlknxdemo.h"
#endif
Laszlo Agocs's avatar
Laszlo Agocs committed
62
#include <q3dsruntimeglobal.h>
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80

// Uncomment for 1280x900 window
//#define FIXEDWINDOW

int applyFontRatio(const int value, const int ratioFont)
{
    return int(value * ratioFont);
}

int applyRatio(const int value, const int ratio)
{
    return qMax(2, int(value * ratio));
}

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

Laszlo Agocs's avatar
Laszlo Agocs committed
81 82
    QSurfaceFormat::setDefaultFormat(Q3DS::surfaceFormat());

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
    // Define size variants for scaling
    qreal refDpi = 96.;
    qreal refWidth = 1280.;
    qreal refHeight = 900.;
    QRect rect = QGuiApplication::primaryScreen()->geometry();
    qreal width = rect.width();
    qreal height = rect.height();
    qreal dpi = QGuiApplication::primaryScreen()->logicalDotsPerInch();
    qreal widthRatio = width / refWidth;
    qreal heightRatio = height / refHeight;
    qreal ratioFont = qMin(height * dpi / (refDpi * refHeight), width * dpi / (refDpi * refWidth));
    if (widthRatio < 1.)
        widthRatio = 1;
    if (heightRatio < 1.)
        heightRatio = 1;
    if (ratioFont < 1.)
        ratioFont = 1;

#ifdef FIXEDWINDOW
    width = refWidth;
    height = refHeight;
    widthRatio = 1;
    heightRatio = 1;
    ratioFont = 1;
#endif

    QQmlPropertyMap sizesMap;
    sizesMap.insert(QStringLiteral("screenHeight"), QVariant(height));
    sizesMap.insert(QStringLiteral("screenWidth"), QVariant(width));
    sizesMap.insert(QStringLiteral("fontSize"), QVariant(applyFontRatio(26, ratioFont)));
    sizesMap.insert(QStringLiteral("controlHeight"), QVariant(applyFontRatio(64, ratioFont)));
    sizesMap.insert(QStringLiteral("labelMouseMargin"), QVariant(applyRatio(20, widthRatio)));
    sizesMap.insert(QStringLiteral("controlMargin"), QVariant(applyRatio(20, widthRatio)));
    sizesMap.insert(QStringLiteral("controlBorderWidth"), QVariant(applyRatio(3, widthRatio)));
    sizesMap.insert(QStringLiteral("sliderMaxWidth"), QVariant(applyRatio(300, widthRatio)));

    QQuickView viewer;

    viewer.engine()->addImportPath(QStringLiteral(":/qml/imports"));

#ifndef Q_OS_ANDROID
    // Hack to get self build working.
    // Also needs the Qt3DStudio\bin directory in run environment path.
126
    //viewer.engine()->addImportPath(QStringLiteral("C:/Qt/Tools/Qt3DStudio/qml"));
127 128
#endif

129 130 131 132 133 134 135 136
#if defined(KNX_BACKEND)
    qmlRegisterUncreatableType<QmlKnxDemo>("QmlKnxDemo", 1, 0, "QmlKnxDemo", "Not instantiated from QML");
    QmlKnxDemo *m_knxBackend = new QmlKnxDemo;
    viewer.engine()->rootContext()->setContextProperty(QStringLiteral("knxBackend"), m_knxBackend);
#else
    viewer.engine()->rootContext()->setContextProperty(QStringLiteral("knxBackend"), nullptr);
#endif

137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
    HouseModel *m_houseModel = new HouseModel;
    viewer.engine()->rootContext()->setContextProperty(QStringLiteral("houseModel"), m_houseModel);

    viewer.engine()->rootContext()->setContextProperty(QStringLiteral("sizesMap"), &sizesMap);
    viewer.engine()->rootContext()->setContextProperty(QStringLiteral("heightRatio"), heightRatio);

    viewer.setSource(QUrl(QStringLiteral("qrc:/main.qml")));

    viewer.setTitle(QStringLiteral("Qt 3D Studio Home Automation Demo"));
    viewer.setResizeMode(QQuickView::SizeViewToRootObject);
#ifdef FIXEDWINDOW
    viewer.setMinimumSize(QSize(width, height));
    viewer.setMaximumSize(QSize(width, height));
    viewer.show();
#else
    viewer.showFullScreen();
#endif

    return app.exec();
}