Commit acfd2758 authored by Gus Grubba's avatar Gus Grubba

Users can select multiple rules concurrently. In addition, some are mutually...

Users can select multiple rules concurrently. In addition, some are mutually exclusive. Add logic to handle this.
parent 04307f7b
...@@ -39,8 +39,6 @@ void AirMapRulesetsManager::setROI(const QGeoCoordinate& center) ...@@ -39,8 +39,6 @@ void AirMapRulesetsManager::setROI(const QGeoCoordinate& center)
return; return;
} }
qCDebug(AirMapManagerLog) << "Setting ROI for Rulesets"; qCDebug(AirMapManagerLog) << "Setting ROI for Rulesets";
_defaultIndex = 0;
_currentIndex = 0;
_valid = false; _valid = false;
_rules.clearAndDeleteContents(); _rules.clearAndDeleteContents();
_state = State::RetrieveItems; _state = State::RetrieveItems;
...@@ -56,16 +54,16 @@ void AirMapRulesetsManager::setROI(const QGeoCoordinate& center) ...@@ -56,16 +54,16 @@ void AirMapRulesetsManager::setROI(const QGeoCoordinate& center)
qCDebug(AirMapManagerLog) << "Successful rulesets search. Items:" << rules.size(); qCDebug(AirMapManagerLog) << "Successful rulesets search. Items:" << rules.size();
for (const auto& ruleset : rules) { for (const auto& ruleset : rules) {
AirMapRule* pRule = new AirMapRule(this); AirMapRule* pRule = new AirMapRule(this);
connect(pRule, &AirspaceRule::selectedChanged, this, &AirMapRulesetsManager::_selectedChanged);
pRule->_id = QString::fromStdString(ruleset.id); pRule->_id = QString::fromStdString(ruleset.id);
pRule->_name = QString::fromStdString(ruleset.name); pRule->_name = QString::fromStdString(ruleset.name);
pRule->_shortName = QString::fromStdString(ruleset.short_name); pRule->_shortName = QString::fromStdString(ruleset.short_name);
pRule->_description = QString::fromStdString(ruleset.description); pRule->_description = QString::fromStdString(ruleset.description);
pRule->_isDefault = ruleset.is_default; pRule->_isDefault = ruleset.is_default;
//-- TODO: This should be persistent and if the new incoming set has the
// same, previosuly selected rules, it should "remember".
if(pRule->_isDefault) { if(pRule->_isDefault) {
_defaultIndex = _rules.count(); pRule->_selected = true;
//-- TODO: This should be persistent and if the new incoming set has this
// rule, it should point to it.
_currentIndex = _defaultIndex;
} }
switch(ruleset.selection_type) { switch(ruleset.selection_type) {
case RuleSet::SelectionType::pickone: case RuleSet::SelectionType::pickone:
...@@ -115,29 +113,32 @@ void AirMapRulesetsManager::setROI(const QGeoCoordinate& center) ...@@ -115,29 +113,32 @@ void AirMapRulesetsManager::setROI(const QGeoCoordinate& center)
} }
_state = State::Idle; _state = State::Idle;
emit rulesChanged(); emit rulesChanged();
emit selectedRulesChanged();
}); });
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
QString QString
AirMapRulesetsManager::defaultRule() AirMapRulesetsManager::selectedRules()
{ {
if(_defaultIndex < _rules.count()) { QString selection;
AirMapRule* rule = qobject_cast<AirMapRule*>(_rules.get(_defaultIndex)); for(int i = 0; i < _rules.count(); i++) {
if(rule) { AirMapRule* rule = qobject_cast<AirMapRule*>(_rules.get(i));
return rule->name(); if(rule && rule->selected()) {
selection += rule->shortName() + ", ";
} }
} }
return QString(); int idx = selection.lastIndexOf(", ");
if(idx >= 0) {
selection = selection.left(idx);
}
return selection;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void void
AirMapRulesetsManager::setCurrentIndex(int index) AirMapRulesetsManager::_selectedChanged()
{ {
_currentIndex = index; emit selectedRulesChanged();
//-- TODO: Do whatever it is you do to select a rule //-- TODO: Do whatever it is you do to select a rule
emit currentIndexChanged();
} }
...@@ -56,23 +56,21 @@ public: ...@@ -56,23 +56,21 @@ public:
bool valid () override { return _valid; } bool valid () override { return _valid; }
QmlObjectListModel* rules () override { return &_rules; } QmlObjectListModel* rules () override { return &_rules; }
QString defaultRule () override; QString selectedRules() override;
int defaultIndex() override { return _defaultIndex; }
int currentIndex() override { return _currentIndex; }
void setCurrentIndex(int index) override;
void setROI (const QGeoCoordinate& center) override; void setROI (const QGeoCoordinate& center) override;
signals: signals:
void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails);
private slots:
void _selectedChanged ();
private: private:
enum class State { enum class State {
Idle, Idle,
RetrieveItems, RetrieveItems,
}; };
int _defaultIndex;
int _currentIndex;
bool _valid; bool _valid;
State _state = State::Idle; State _state = State::Idle;
AirMapSharedState& _shared; AirMapSharedState& _shared;
......
...@@ -279,16 +279,21 @@ Item { ...@@ -279,16 +279,21 @@ Item {
} }
Rectangle { Rectangle {
id: regButton id: regButton
height: regLabel.height + ScreenTools.defaultFontPixelHeight * 0.5 height: ScreenTools.defaultFontPixelHeight * 1.5
radius: 2 radius: 2
color: _colorMidBrown color: _colorMidBrown
Layout.fillWidth: true Layout.fillWidth: true
QGCLabel { QGCLabel {
id: regLabel id: regLabel
text: _validRules ? _activeVehicle.airspaceController.rulesets.rules.get(currentIndex).name : qsTr("None") text: _validRules ? _activeVehicle.airspaceController.rulesets.selectedRules : qsTr("None")
color: _colorWhite elide: Text.ElideRight
anchors.centerIn: parent horizontalAlignment: Text.AlignHCenter
property int currentIndex: _validRules ? _activeVehicle.airspaceController.rulesets.currentIndex : 0 color: _colorWhite
anchors.left: parent.left
anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.5
anchors.right: parent.right
anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 0.5
anchors.verticalCenter: parent.verticalCenter
} }
} }
} }
...@@ -408,6 +413,7 @@ Item { ...@@ -408,6 +413,7 @@ Item {
width: 1 width: 1
height: 1 height: 1
} }
ExclusiveGroup { id: rulesGroup }
QGCLabel { QGCLabel {
text: qsTr("PICK ONE REGULATION") text: qsTr("PICK ONE REGULATION")
font.pointSize: ScreenTools.smallFontPointSize font.pointSize: ScreenTools.smallFontPointSize
...@@ -418,6 +424,7 @@ Item { ...@@ -418,6 +424,7 @@ Item {
delegate: RuleSelector { delegate: RuleSelector {
visible: object.selectionType === AirspaceRule.Pickone visible: object.selectionType === AirspaceRule.Pickone
rule: object rule: object
exclusiveGroup: rulesGroup
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: ScreenTools.defaultFontPixelWidth anchors.rightMargin: ScreenTools.defaultFontPixelWidth
anchors.left: parent.left anchors.left: parent.left
...@@ -479,7 +486,7 @@ Item { ...@@ -479,7 +486,7 @@ Item {
} }
DropShadow { DropShadow {
anchors.fill: arrowIconShadow anchors.fill: arrowIconShadow
visible: ruleSelectorRect.visible visible: ruleSelectorRect.visible && qgcPal.globalTheme === QGCPalette.Dark
horizontalOffset: 4 horizontalOffset: 4
verticalOffset: 4 verticalOffset: 4
radius: 32.0 radius: 32.0
......
...@@ -12,9 +12,28 @@ import QGroundControl.Airmap 1.0 ...@@ -12,9 +12,28 @@ import QGroundControl.Airmap 1.0
import QGroundControl.SettingsManager 1.0 import QGroundControl.SettingsManager 1.0
Rectangle { Rectangle {
height: ScreenTools.defaultFontPixelHeight * 1.25 id: _root
color: rule && rule.selected ? qgcPal.windowShadeDark : qgcPal.window height: ScreenTools.defaultFontPixelHeight
property var rule: null color: _selected ? qgcPal.windowShade : qgcPal.window
property var rule: null
property bool checked: false
property bool _selected: {
if (exclusiveGroup) {
return checked
} else {
return rule ? rule.selected : false
}
}
property ExclusiveGroup exclusiveGroup: null
onExclusiveGroupChanged: {
if (exclusiveGroup) {
checked = rule.selected
exclusiveGroup.bindCheckable(_root)
}
}
onCheckedChanged: {
rule.selected = checked
}
QGCPalette { QGCPalette {
id: qgcPal id: qgcPal
colorGroupEnabled: enabled colorGroupEnabled: enabled
...@@ -28,7 +47,7 @@ Rectangle { ...@@ -28,7 +47,7 @@ Rectangle {
Rectangle { Rectangle {
width: ScreenTools.defaultFontPixelWidth * 0.75 width: ScreenTools.defaultFontPixelWidth * 0.75
height: ScreenTools.defaultFontPixelHeight height: ScreenTools.defaultFontPixelHeight
color: rule.selected ? qgcPal.colorGreen : qgcPal.window color: _selected ? qgcPal.colorGreen : qgcPal.window
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
} }
QGCLabel { QGCLabel {
...@@ -40,7 +59,11 @@ Rectangle { ...@@ -40,7 +59,11 @@ Rectangle {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
rule.selected = !rule.selected if (exclusiveGroup) {
checked = true
} else {
rule.selected = !rule.selected
}
} }
} }
} }
...@@ -66,17 +66,12 @@ public: ...@@ -66,17 +66,12 @@ public:
~AirspaceRulesetsProvider () = default; ~AirspaceRulesetsProvider () = default;
Q_PROPERTY(bool valid READ valid NOTIFY rulesChanged) Q_PROPERTY(bool valid READ valid NOTIFY rulesChanged)
Q_PROPERTY(QString defaultRule READ defaultRule NOTIFY rulesChanged) Q_PROPERTY(QString selectedRules READ selectedRules NOTIFY selectedRulesChanged)
Q_PROPERTY(int defaultIndex READ defaultIndex NOTIFY rulesChanged)
Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
Q_PROPERTY(QmlObjectListModel* rules READ rules NOTIFY rulesChanged) Q_PROPERTY(QmlObjectListModel* rules READ rules NOTIFY rulesChanged)
virtual bool valid () = 0; ///< Current ruleset is valid virtual bool valid () = 0; ///< Current ruleset is valid
virtual QmlObjectListModel* rules () = 0; ///< List of AirspaceRule virtual QmlObjectListModel* rules () = 0; ///< List of AirspaceRule
virtual QString defaultRule () = 0; ///< AirspaceRule::name virtual QString selectedRules() = 0; ///< All selected rules concatenated into a string
virtual int defaultIndex() = 0; ///< Index into rules (QmlObjectListModel)
virtual int currentIndex() = 0; ///< User selected index into rules (QmlObjectListModel)
virtual void setCurrentIndex(int index) = 0; ///< Select a rule
/** /**
* Set region of interest that should be queried. When finished, the rulesChanged() signal will be emmited. * Set region of interest that should be queried. When finished, the rulesChanged() signal will be emmited.
* @param center Center coordinate for ROI * @param center Center coordinate for ROI
...@@ -85,6 +80,6 @@ public: ...@@ -85,6 +80,6 @@ public:
signals: signals:
void rulesChanged (); void rulesChanged ();
void currentIndexChanged (); void selectedRulesChanged ();
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment