Skip to content

Commit

Permalink
Add first time wizard so user can change/confirm the default locales
Browse files Browse the repository at this point in the history
  • Loading branch information
Stefan Dunca committed Apr 3, 2020
1 parent 2f827ad commit 5a9aaac
Show file tree
Hide file tree
Showing 11 changed files with 247 additions and 0 deletions.
3 changes: 3 additions & 0 deletions qgroundcontrol.pro
Original file line number Diff line number Diff line change
Expand Up @@ -1382,3 +1382,6 @@ contains (CONFIG, QGC_DISABLE_INSTALLER_SETUP) {
} else {
include(QGCInstaller.pri)
}

DISTFILES += \
src/QmlControls/QGroundControl/Specific/qmldir
4 changes: 4 additions & 0 deletions qgroundcontrol.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,10 @@
<file alias="VibrationPageWidget.qml">src/FlightMap/Widgets/VibrationPageWidget.qml</file>
<file alias="VideoPageWidget.qml">src/FlightMap/Widgets/VideoPageWidget.qml</file>
<file alias="VirtualJoystick.qml">src/FlightDisplay/VirtualJoystick.qml</file>
<file alias="QGroundControl/Specific/qmldir">src/QmlControls/QGroundControl/Specific/qmldir</file>
<file alias="QGroundControl/Specific/StartupWizard.qml">src/QmlControls/QGroundControl/Specific/StartupWizard.qml</file>
<file alias="QGroundControl/Specific/BaseStartupWizardPage.qml">src/QmlControls/QGroundControl/Specific/BaseStartupWizardPage.qml</file>
<file alias="QGroundControl/Specific/UnitsWizardPage.qml">src/QmlControls/QGroundControl/Specific/UnitsWizardPage.qml</file>
</qresource>
<qresource prefix="/json">
<file alias="ADSBVehicleManager.SettingsGroup.json">src/Settings/ADSBVehicleManager.SettingsGroup.json</file>
Expand Down
10 changes: 10 additions & 0 deletions src/QmlControls/QGroundControl/Specific/BaseStartupWizardPage.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import QtQuick 2.12

Item {
// `null` for default which makes the wizzard display one of the buttons: "Next" if more pages or "Done" if the last
property string doneText: null
// Blocks user from closing the wizard or going to the next page until this becomes true
property bool forceConfirmation: false

signal closeView()
}
71 changes: 71 additions & 0 deletions src/QmlControls/QGroundControl/Specific/StartupWizard.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import QtQuick 2.11
import QtQuick.Layouts 1.11

import QGroundControl.ScreenTools 1.0
import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0
import QGroundControl 1.0
import QGroundControl.Specific 1.0


Item {
id: _root
width: contentColumn.width
height: contentColumn.height

property bool forceKeepingOpen: _pageReady && pageLoader.item.forceConfirmation && !_armed

signal closeView()

property bool _pageReady: pageLoader.status === Loader.Ready
property int _currentIndex: 0
property int _pagesCount: QGroundControl.corePlugin.startupPages.length
property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
property bool _armed: _activeVehicle && _activeVehicle.armed

function doneOrJumpToNext() {
if(_currentIndex < _pagesCount - 1)
_currentIndex += 1
else {
_root.closeView()
QGroundControl.firstTimeStart = false
}
}

Column {
id: contentColumn
anchors.centerIn: parent
spacing: ScreenTools.defaultFontPixelHeight * 1
padding: spacing

QGCLabel {
text: qsTr("Welcome to " + QGroundControl.appName)
color: qgcPal.text
font.family: ScreenTools.demiboldFontFamily
font.pointSize: ScreenTools.mediumFontPointSize
}
Rectangle {
height: 1
color: qgcPal.windowShade
width: _pageReady ? pageLoader.item.width : 0
}

// Page content loader
Loader {
id: pageLoader
source: QGroundControl.corePlugin.startupPages[_currentIndex]
}

Connections {
target: _pageReady ? pageLoader.item : null
onCloseView: doneOrJumpToNext()
}

QGCButton {
property string _acknowledgeText: _pagesCount <= 1 ? qsTr("Next") : qsTr("Done")

text: (_pageReady && pageLoader.item && pageLoader.item.doneText) ? pageLoader.item.doneText : _acknowledgeText
onClicked: doneOrJumpToNext()
}
}
}
80 changes: 80 additions & 0 deletions src/QmlControls/QGroundControl/Specific/UnitsWizardPage.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import QtQuick 2.12
import QtQuick.Layouts 1.12

import QGroundControl 1.0
import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.SettingsManager 1.0
import QGroundControl.Controls 1.0
import QGroundControl.Specific 1.0

BaseStartupWizardPage {
width: settingsColumn.width
height: settingsColumn.height

property real _margins: ScreenTools.defaultFontPixelWidth
property real _comboFieldWidth: ScreenTools.defaultFontPixelWidth * 20

doneText: qsTr("Confirm")

ColumnLayout {
id: settingsColumn
anchors.horizontalCenter: parent.horizontalCenter

QGCLabel {
id: unitsSectionLabel
text: qsTr("Choose the measurement units you want to use in the application. You can change it later on in the Application Settings.")

Layout.preferredWidth: unitsGrid.width
wrapMode: Label.WordWrap
}

Rectangle {
Layout.preferredHeight: unitsGrid.height + (_margins * 2)
Layout.preferredWidth: unitsGrid.width + (_margins * 2)
color: qgcPal.windowShade
Layout.fillWidth: true

GridLayout {
id: unitsGrid
anchors.topMargin: _margins
anchors.top: parent.top
Layout.fillWidth: false
anchors.horizontalCenter: parent.horizontalCenter
flow: GridLayout.TopToBottom
rows: 5

QGCLabel { text: qsTr("System of units") }

Repeater {
model: [ qsTr("Distance"), qsTr("Area"), qsTr("Speed"), qsTr("Temperature") ]
QGCLabel { text: modelData }
}

QGCComboBox {
model: [qsTr("Metric System"), qsTr("Imperial System")]
Layout.preferredWidth: _comboFieldWidth

currentIndex: QGroundControl.settingsManager.unitsSettings.distanceUnits.value === UnitsSettings.DistanceUnitsMeters ? 0 : 1

onActivated: {
var metric = (currentIndex === 0);
QGroundControl.settingsManager.unitsSettings.distanceUnits.value = metric ? UnitsSettings.DistanceUnitsMeters : UnitsSettings.DistanceUnitsFeet
QGroundControl.settingsManager.unitsSettings.areaUnits.value = metric ? UnitsSettings.AreaUnitsSquareMeters : UnitsSettings.AreaUnitsSquareFeet
QGroundControl.settingsManager.unitsSettings.speedUnits.value = metric ? UnitsSettings.SpeedUnitsMetersPerSecond : UnitsSettings.SpeedUnitsFeetPerSecond
QGroundControl.settingsManager.unitsSettings.temperatureUnits.value = metric ? UnitsSettings.TemperatureUnitsCelsius : UnitsSettings.TemperatureUnitsFarenheit
}
}
Repeater {
model: [ QGroundControl.settingsManager.unitsSettings.distanceUnits, QGroundControl.settingsManager.unitsSettings.areaUnits, QGroundControl.settingsManager.unitsSettings.speedUnits, QGroundControl.settingsManager.unitsSettings.temperatureUnits ]
FactComboBox {
Layout.preferredWidth: _comboFieldWidth
fact: modelData
indexModel: false
}
}
}
}
}
}
5 changes: 5 additions & 0 deletions src/QmlControls/QGroundControl/Specific/qmldir
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module QGroundControl.Specific

BaseStartupWizardPage 1.0 BaseStartupWizardPage.qml
StartupWizard 1.0 StartupWizard.qml
UnitsWizardPage 1.0 UnitsWizardPage.qml
20 changes: 20 additions & 0 deletions src/QmlControls/QGroundControlQmlGlobal.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ const char* QGroundControlQmlGlobal::_flightMapPositionLatitudeSettingsKey =
const char* QGroundControlQmlGlobal::_flightMapPositionLongitudeSettingsKey = "Longitude";
const char* QGroundControlQmlGlobal::_flightMapZoomSettingsKey = "FlightMapZoom";

static const QString _genericSettingsGroup("Generic");
static const QString _firstTimeStartupSettingsKey("FirstTimeStartup");

QGeoCoordinate QGroundControlQmlGlobal::_coord = QGeoCoordinate(0.0,0.0);
double QGroundControlQmlGlobal::_zoom = 2;

Expand Down Expand Up @@ -217,6 +220,23 @@ bool QGroundControlQmlGlobal::apmFirmwareSupported()
return _firmwarePluginManager->supportedFirmwareTypes().contains(MAV_AUTOPILOT_ARDUPILOTMEGA);
}

bool
QGroundControlQmlGlobal::firstTimeStart()
{
QSettings settings;
settings.beginGroup(_genericSettingsGroup);
return settings.value(_firstTimeStartupSettingsKey, true).toBool();
}

void
QGroundControlQmlGlobal::setFirstTimeStart(bool firstTime)
{
QSettings settings;
settings.beginGroup(_genericSettingsGroup);
settings.setValue(_firstTimeStartupSettingsKey, QVariant(firstTime));
emit firstTimeStartChanged();
}

bool QGroundControlQmlGlobal::linesIntersect(QPointF line1A, QPointF line1B, QPointF line2A, QPointF line2B)
{
QPointF intersectPoint;
Expand Down
5 changes: 5 additions & 0 deletions src/QmlControls/QGroundControlQmlGlobal.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ class QGroundControlQmlGlobal : public QGCTool
Q_PROPERTY(QString qgcVersion READ qgcVersion CONSTANT)
Q_PROPERTY(bool skipSetupPage READ skipSetupPage WRITE setSkipSetupPage NOTIFY skipSetupPageChanged)

Q_PROPERTY(bool firstTimeStart READ firstTimeStart WRITE setFirstTimeStart NOTIFY firstTimeStartChanged)

Q_INVOKABLE void saveGlobalSetting (const QString& key, const QString& value);
Q_INVOKABLE QString loadGlobalSetting (const QString& key, const QString& defaultValue);
Q_INVOKABLE void saveBoolGlobalSetting (const QString& key, bool value);
Expand Down Expand Up @@ -236,6 +238,8 @@ class QGroundControlQmlGlobal : public QGCTool
bool apmFirmwareSupported ();
bool skipSetupPage () { return _skipSetupPage; }
void setSkipSetupPage (bool skip);
bool firstTimeStart();
void setFirstTimeStart(bool firstTime);

void setIsVersionCheckEnabled (bool enable);
void setMavlinkSystemID (int id);
Expand Down Expand Up @@ -264,6 +268,7 @@ class QGroundControlQmlGlobal : public QGCTool
void flightMapPositionChanged (QGeoCoordinate flightMapPosition);
void flightMapZoomChanged (double flightMapZoom);
void skipSetupPageChanged ();
void firstTimeStartChanged ();

private:
double _flightMapInitialZoom = 17.0;
Expand Down
6 changes: 6 additions & 0 deletions src/api/QGCCorePlugin.cc
Original file line number Diff line number Diff line change
Expand Up @@ -476,3 +476,9 @@ QString QGCCorePlugin::stableVersionCheckFileUrl() const
return QString("https://s3-us-west-2.amazonaws.com/qgroundcontrol/latest/QGC.version.txt");
#endif
}

QStringList
QGCCorePlugin::startupPages()
{
return { "/qml/QGroundControl/Specific/UnitsWizardPage.qml" };
}
5 changes: 5 additions & 0 deletions src/api/QGCCorePlugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ class QGCCorePlugin : public QGCTool
Q_PROPERTY(QString brandImageIndoor READ brandImageIndoor CONSTANT)
Q_PROPERTY(QString brandImageOutdoor READ brandImageOutdoor CONSTANT)
Q_PROPERTY(QmlObjectListModel* customMapItems READ customMapItems CONSTANT)
Q_PROPERTY(QStringList startupPages READ startupPages NOTIFY startupPagesChanged)


Q_INVOKABLE bool guidedActionsControllerLogging() const;

Expand Down Expand Up @@ -157,6 +159,8 @@ class QGCCorePlugin : public QGCTool
/// @return Complex items to be made available to user
virtual QStringList complexMissionItemNames(Vehicle* /*vehicle*/, const QStringList& complexMissionItemNames) { return complexMissionItemNames; }

virtual QStringList startupPages();

bool showTouchAreas() const { return _showTouchAreas; }
bool showAdvancedUI() const { return _showAdvancedUI; }
void setShowTouchAreas(bool show);
Expand All @@ -171,6 +175,7 @@ class QGCCorePlugin : public QGCTool
void instrumentPagesChanged ();
void showTouchAreasChanged (bool showTouchAreas);
void showAdvancedUIChanged (bool showAdvancedUI);
void startupPagesChanged ();

protected slots:
void _activeVehicleChanged (Vehicle* activeVehicle);
Expand Down
38 changes: 38 additions & 0 deletions src/ui/MainRootWindow.qml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,20 @@ ApplicationWindow {
width = ScreenTools.isMobile ? Screen.width : Math.min(250 * Screen.pixelDensity, Screen.width)
height = ScreenTools.isMobile ? Screen.height : Math.min(150 * Screen.pixelDensity, Screen.height)
}

// Startup experience wizard and provide the source using QGCCorePlugin
if(QGroundControl.firstTimeStart) {
startupPopup.open()
}
}

// TODO: dev remove it
Shortcut {
sequence: "Ctrl+s"
onActivated: {
QGroundControl.firstTimeStart = true
startupPopup.open()
}
}

property var _rgPreventViewSwitch: [ false ]
Expand Down Expand Up @@ -677,4 +691,28 @@ ApplicationWindow {
}
}

//-- Startup PopUp wizard
Popup {
id: startupPopup
x: Math.max(Math.round((mainWindow.width - width) * 0.5), ScreenTools.defaultFontPixelWidth * 5)
y: Math.max(Math.round((mainWindow.height - height) * 0.5), ScreenTools.defaultFontPixelHeight * 2)

modal: true
focus: true
closePolicy: (startupLoader.item && startupLoader.item.forceKeepingOpen !== undefined && startupLoader.item.forceKeepingOpen) ? Popup.NoAutoClose : Popup.CloseOnEscape | Popup.CloseOnPressOutside

Connections {
target: startupLoader.item
onCloseView: startupPopup.close()
}

background: Rectangle {
radius: ScreenTools.defaultFontPixelHeight * 0.5
color: qgcPal.window
}
Loader {
id: startupLoader
source: "/qml/QGroundControl/Specific/StartupWizard.qml"
}
}
}

0 comments on commit 5a9aaac

Please sign in to comment.