Add show map center to settings

This commit is contained in:
Dan Paulat 2024-04-20 00:26:17 -05:00
parent 201010a5cc
commit 4424c19d7f
5 changed files with 333 additions and 295 deletions

View file

@ -58,6 +58,7 @@ public:
mapboxApiKey_.SetDefault("?"); mapboxApiKey_.SetDefault("?");
maptilerApiKey_.SetDefault("?"); maptilerApiKey_.SetDefault("?");
showMapAttribution_.SetDefault(true); showMapAttribution_.SetDefault(true);
showMapCenter_.SetDefault(false);
showMapLogo_.SetDefault(true); showMapLogo_.SetDefault(true);
theme_.SetDefault(defaultThemeValue); theme_.SetDefault(defaultThemeValue);
trackLocation_.SetDefault(false); trackLocation_.SetDefault(false);
@ -122,6 +123,7 @@ public:
SettingsVariable<std::string> mapboxApiKey_ {"mapbox_api_key"}; SettingsVariable<std::string> mapboxApiKey_ {"mapbox_api_key"};
SettingsVariable<std::string> maptilerApiKey_ {"maptiler_api_key"}; SettingsVariable<std::string> maptilerApiKey_ {"maptiler_api_key"};
SettingsVariable<bool> showMapAttribution_ {"show_map_attribution"}; SettingsVariable<bool> showMapAttribution_ {"show_map_attribution"};
SettingsVariable<bool> showMapCenter_ {"show_map_center"};
SettingsVariable<bool> showMapLogo_ {"show_map_logo"}; SettingsVariable<bool> showMapLogo_ {"show_map_logo"};
SettingsVariable<std::string> theme_ {"theme"}; SettingsVariable<std::string> theme_ {"theme"};
SettingsVariable<bool> trackLocation_ {"track_location"}; SettingsVariable<bool> trackLocation_ {"track_location"};
@ -147,6 +149,7 @@ GeneralSettings::GeneralSettings() :
&p->mapboxApiKey_, &p->mapboxApiKey_,
&p->maptilerApiKey_, &p->maptilerApiKey_,
&p->showMapAttribution_, &p->showMapAttribution_,
&p->showMapCenter_,
&p->showMapLogo_, &p->showMapLogo_,
&p->theme_, &p->theme_,
&p->trackLocation_, &p->trackLocation_,
@ -240,6 +243,11 @@ SettingsVariable<bool>& GeneralSettings::show_map_attribution() const
return p->showMapAttribution_; return p->showMapAttribution_;
} }
SettingsVariable<bool>& GeneralSettings::show_map_center() const
{
return p->showMapCenter_;
}
SettingsVariable<bool>& GeneralSettings::show_map_logo() const SettingsVariable<bool>& GeneralSettings::show_map_logo() const
{ {
return p->showMapLogo_; return p->showMapLogo_;
@ -297,6 +305,7 @@ bool operator==(const GeneralSettings& lhs, const GeneralSettings& rhs)
lhs.p->mapboxApiKey_ == rhs.p->mapboxApiKey_ && lhs.p->mapboxApiKey_ == rhs.p->mapboxApiKey_ &&
lhs.p->maptilerApiKey_ == rhs.p->maptilerApiKey_ && lhs.p->maptilerApiKey_ == rhs.p->maptilerApiKey_ &&
lhs.p->showMapAttribution_ == rhs.p->showMapAttribution_ && lhs.p->showMapAttribution_ == rhs.p->showMapAttribution_ &&
lhs.p->showMapCenter_ == rhs.p->showMapCenter_ &&
lhs.p->showMapLogo_ == rhs.p->showMapLogo_ && lhs.p->showMapLogo_ == rhs.p->showMapLogo_ &&
lhs.p->theme_ == rhs.p->theme_ && lhs.p->theme_ == rhs.p->theme_ &&
lhs.p->trackLocation_ == rhs.p->trackLocation_ && lhs.p->trackLocation_ == rhs.p->trackLocation_ &&

View file

@ -41,6 +41,7 @@ public:
SettingsVariable<std::string>& mapbox_api_key() const; SettingsVariable<std::string>& mapbox_api_key() const;
SettingsVariable<std::string>& maptiler_api_key() const; SettingsVariable<std::string>& maptiler_api_key() const;
SettingsVariable<bool>& show_map_attribution() const; SettingsVariable<bool>& show_map_attribution() const;
SettingsVariable<bool>& show_map_center() const;
SettingsVariable<bool>& show_map_logo() const; SettingsVariable<bool>& show_map_logo() const;
SettingsVariable<std::string>& theme() const; SettingsVariable<std::string>& theme() const;
SettingsVariable<bool>& track_location() const; SettingsVariable<bool>& track_location() const;

View file

@ -135,6 +135,7 @@ public:
&defaultTimeZone_, &defaultTimeZone_,
&antiAliasingEnabled_, &antiAliasingEnabled_,
&showMapAttribution_, &showMapAttribution_,
&showMapCenter_,
&showMapLogo_, &showMapLogo_,
&updateNotificationsEnabled_, &updateNotificationsEnabled_,
&debugEnabled_, &debugEnabled_,
@ -233,6 +234,7 @@ public:
settings::SettingsInterface<std::string> theme_ {}; settings::SettingsInterface<std::string> theme_ {};
settings::SettingsInterface<bool> antiAliasingEnabled_ {}; settings::SettingsInterface<bool> antiAliasingEnabled_ {};
settings::SettingsInterface<bool> showMapAttribution_ {}; settings::SettingsInterface<bool> showMapAttribution_ {};
settings::SettingsInterface<bool> showMapCenter_ {};
settings::SettingsInterface<bool> showMapLogo_ {}; settings::SettingsInterface<bool> showMapLogo_ {};
settings::SettingsInterface<bool> updateNotificationsEnabled_ {}; settings::SettingsInterface<bool> updateNotificationsEnabled_ {};
settings::SettingsInterface<bool> debugEnabled_ {}; settings::SettingsInterface<bool> debugEnabled_ {};
@ -666,6 +668,9 @@ void SettingsDialogImpl::SetupGeneralTab()
generalSettings.show_map_attribution()); generalSettings.show_map_attribution());
showMapAttribution_.SetEditWidget(self_->ui->showMapAttributionCheckBox); showMapAttribution_.SetEditWidget(self_->ui->showMapAttributionCheckBox);
showMapCenter_.SetSettingsVariable(generalSettings.show_map_center());
showMapCenter_.SetEditWidget(self_->ui->showMapCenterCheckBox);
showMapLogo_.SetSettingsVariable(generalSettings.show_map_logo()); showMapLogo_.SetSettingsVariable(generalSettings.show_map_logo());
showMapLogo_.SetEditWidget(self_->ui->showMapLogoCheckBox); showMapLogo_.SetEditWidget(self_->ui->showMapLogoCheckBox);

View file

@ -118,302 +118,325 @@
<widget class="QWidget" name="general"> <widget class="QWidget" name="general">
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QFrame" name="frame_2"> <widget class="QScrollArea" name="scrollArea_2">
<property name="frameShape"> <property name="widgetResizable">
<enum>QFrame::StyledPanel</enum> <bool>true</bool>
</property> </property>
<property name="frameShadow"> <widget class="QWidget" name="scrollAreaWidgetContents_2">
<enum>QFrame::Raised</enum> <property name="geometry">
</property> <rect>
<layout class="QGridLayout" name="gridLayout_4"> <x>0</x>
<property name="leftMargin"> <y>0</y>
<number>0</number> <width>513</width>
<height>454</height>
</rect>
</property> </property>
<property name="topMargin"> <layout class="QVBoxLayout" name="verticalLayout">
<number>0</number> <item>
</property> <widget class="QFrame" name="frame_2">
<property name="rightMargin"> <property name="frameShape">
<number>0</number> <enum>QFrame::NoFrame</enum>
</property> </property>
<property name="bottomMargin"> <layout class="QGridLayout" name="gridLayout_4">
<number>0</number> <property name="leftMargin">
</property> <number>0</number>
<item row="8" column="0"> </property>
<widget class="QLabel" name="defaultAlertActionLabel"> <property name="topMargin">
<property name="text"> <number>0</number>
<string>Default Alert Action</string> </property>
</property> <property name="rightMargin">
</widget> <number>0</number>
</item> </property>
<item row="0" column="2"> <property name="bottomMargin">
<widget class="QComboBox" name="themeComboBox"/> <number>0</number>
</item> </property>
<item row="0" column="4"> <item row="1" column="0">
<widget class="QToolButton" name="resetThemeButton"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>...</string> <string>Default Radar Site</string>
</property> </property>
<property name="icon"> </widget>
<iconset resource="../../../../scwx-qt.qrc"> </item>
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> <item row="10" column="0">
</property> <widget class="QLabel" name="label_21">
</widget> <property name="text">
</item> <string>Default Time Zone</string>
<item row="8" column="2"> </property>
<widget class="QComboBox" name="defaultAlertActionComboBox"/> </widget>
</item> </item>
<item row="6" column="2"> <item row="5" column="0">
<widget class="QLineEdit" name="mapboxApiKeyLineEdit"> <widget class="QLabel" name="label_7">
<property name="echoMode"> <property name="text">
<enum>QLineEdit::Password</enum> <string>Map Provider</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="0"> <item row="0" column="4">
<widget class="QLabel" name="label_21"> <widget class="QToolButton" name="resetThemeButton">
<property name="text"> <property name="text">
<string>Default Time Zone</string> <string>...</string>
</property> </property>
</widget> <property name="icon">
</item> <iconset resource="../../../../scwx-qt.qrc">
<item row="2" column="0"> <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
<widget class="QLabel" name="label_2"> </property>
<property name="text"> </widget>
<string>Grid Width</string> </item>
</property> <item row="8" column="4">
</widget> <widget class="QToolButton" name="resetDefaultAlertActionButton">
</item> <property name="text">
<item row="0" column="0"> <string>...</string>
<widget class="QLabel" name="label_5"> </property>
<property name="text"> <property name="icon">
<string>Theme</string> <iconset resource="../../../../scwx-qt.qrc">
</property> <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</widget> </property>
</item> </widget>
<item row="5" column="0"> </item>
<widget class="QLabel" name="label_7"> <item row="9" column="2">
<property name="text"> <widget class="QComboBox" name="clockFormatComboBox"/>
<string>Map Provider</string> </item>
</property> <item row="6" column="0">
</widget> <widget class="QLabel" name="label_4">
</item> <property name="text">
<item row="7" column="0"> <string>Mapbox API Key</string>
<widget class="QLabel" name="label_6"> </property>
<property name="text"> </widget>
<string>MapTiler API Key</string> </item>
</property> <item row="2" column="0">
</widget> <widget class="QLabel" name="label_2">
</item> <property name="text">
<item row="3" column="4"> <string>Grid Width</string>
<widget class="QToolButton" name="resetGridHeightButton"> </property>
<property name="text"> </widget>
<string>...</string> </item>
</property> <item row="7" column="0">
<property name="icon"> <widget class="QLabel" name="label_6">
<iconset resource="../../../../scwx-qt.qrc"> <property name="text">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> <string>MapTiler API Key</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="2"> <item row="10" column="4">
<widget class="QComboBox" name="mapProviderComboBox"/> <widget class="QToolButton" name="resetDefaultTimeZoneButton">
</item> <property name="text">
<item row="10" column="2"> <string>...</string>
<widget class="QComboBox" name="defaultTimeZoneComboBox"/> </property>
</item> <property name="icon">
<item row="7" column="4"> <iconset resource="../../../../scwx-qt.qrc">
<widget class="QToolButton" name="resetMapTilerApiKeyButton"> <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
<property name="text"> </property>
<string>...</string> </widget>
</property> </item>
<property name="icon"> <item row="8" column="2">
<iconset resource="../../../../scwx-qt.qrc"> <widget class="QComboBox" name="defaultAlertActionComboBox"/>
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> </item>
</property> <item row="7" column="4">
</widget> <widget class="QToolButton" name="resetMapTilerApiKeyButton">
</item> <property name="text">
<item row="5" column="4"> <string>...</string>
<widget class="QToolButton" name="resetMapProviderButton"> </property>
<property name="text"> <property name="icon">
<string>...</string> <iconset resource="../../../../scwx-qt.qrc">
</property> <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
<property name="icon"> </property>
<iconset resource="../../../../scwx-qt.qrc"> </widget>
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> </item>
</property> <item row="3" column="4">
</widget> <widget class="QToolButton" name="resetGridHeightButton">
</item> <property name="text">
<item row="2" column="4"> <string>...</string>
<widget class="QToolButton" name="resetGridWidthButton"> </property>
<property name="text"> <property name="icon">
<string>...</string> <iconset resource="../../../../scwx-qt.qrc">
</property> <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
<property name="icon"> </property>
<iconset resource="../../../../scwx-qt.qrc"> </widget>
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> </item>
</property> <item row="1" column="2">
</widget> <widget class="QComboBox" name="radarSiteComboBox"/>
</item> </item>
<item row="9" column="0"> <item row="1" column="4">
<widget class="QLabel" name="label_20"> <widget class="QToolButton" name="resetRadarSiteButton">
<property name="text"> <property name="text">
<string>Clock Format</string> <string>...</string>
</property> </property>
</widget> <property name="icon">
</item> <iconset resource="../../../../scwx-qt.qrc">
<item row="9" column="4"> <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
<widget class="QToolButton" name="resetClockFormatButton"> </property>
<property name="text"> </widget>
<string>...</string> </item>
</property> <item row="6" column="2">
<property name="icon"> <widget class="QLineEdit" name="mapboxApiKeyLineEdit">
<iconset resource="../../../../scwx-qt.qrc"> <property name="echoMode">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> <enum>QLineEdit::Password</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="2"> <item row="0" column="0">
<widget class="QSpinBox" name="gridWidthSpinBox"/> <widget class="QLabel" name="label_5">
</item> <property name="text">
<item row="9" column="2"> <string>Theme</string>
<widget class="QComboBox" name="clockFormatComboBox"/> </property>
</item> </widget>
<item row="1" column="4"> </item>
<widget class="QToolButton" name="resetRadarSiteButton"> <item row="0" column="2">
<property name="text"> <widget class="QComboBox" name="themeComboBox"/>
<string>...</string> </item>
</property> <item row="10" column="2">
<property name="icon"> <widget class="QComboBox" name="defaultTimeZoneComboBox"/>
<iconset resource="../../../../scwx-qt.qrc"> </item>
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> <item row="1" column="3">
</property> <widget class="QToolButton" name="radarSiteSelectButton">
</widget> <property name="text">
</item> <string>...</string>
<item row="1" column="2"> </property>
<widget class="QComboBox" name="radarSiteComboBox"/> </widget>
</item> </item>
<item row="1" column="0"> <item row="7" column="2">
<widget class="QLabel" name="label"> <widget class="QLineEdit" name="mapTilerApiKeyLineEdit">
<property name="text"> <property name="echoMode">
<string>Default Radar Site</string> <enum>QLineEdit::Password</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0"> <item row="8" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="defaultAlertActionLabel">
<property name="text"> <property name="text">
<string>Mapbox API Key</string> <string>Default Alert Action</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="4"> <item row="2" column="4">
<widget class="QToolButton" name="resetMapboxApiKeyButton"> <widget class="QToolButton" name="resetGridWidthButton">
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>
<property name="icon"> <property name="icon">
<iconset resource="../../../../scwx-qt.qrc"> <iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="5" column="2">
<widget class="QLabel" name="label_3"> <widget class="QComboBox" name="mapProviderComboBox"/>
<property name="text"> </item>
<string>Grid Height</string> <item row="5" column="4">
</property> <widget class="QToolButton" name="resetMapProviderButton">
</widget> <property name="text">
</item> <string>...</string>
<item row="8" column="4"> </property>
<widget class="QToolButton" name="resetDefaultAlertActionButton"> <property name="icon">
<property name="text"> <iconset resource="../../../../scwx-qt.qrc">
<string>...</string> <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property> </property>
<property name="icon"> </widget>
<iconset resource="../../../../scwx-qt.qrc"> </item>
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> <item row="6" column="4">
</property> <widget class="QToolButton" name="resetMapboxApiKeyButton">
</widget> <property name="text">
</item> <string>...</string>
<item row="1" column="3"> </property>
<widget class="QToolButton" name="radarSiteSelectButton"> <property name="icon">
<property name="text"> <iconset resource="../../../../scwx-qt.qrc">
<string>...</string> <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="2"> <item row="9" column="4">
<widget class="QLineEdit" name="mapTilerApiKeyLineEdit"> <widget class="QToolButton" name="resetClockFormatButton">
<property name="echoMode"> <property name="text">
<enum>QLineEdit::Password</enum> <string>...</string>
</property> </property>
</widget> <property name="icon">
</item> <iconset resource="../../../../scwx-qt.qrc">
<item row="3" column="2"> <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
<widget class="QSpinBox" name="gridHeightSpinBox"/> </property>
</item> </widget>
<item row="10" column="4"> </item>
<widget class="QToolButton" name="resetDefaultTimeZoneButton"> <item row="3" column="2">
<property name="text"> <widget class="QSpinBox" name="gridHeightSpinBox"/>
<string>...</string> </item>
</property> <item row="2" column="2">
<property name="icon"> <widget class="QSpinBox" name="gridWidthSpinBox"/>
<iconset resource="../../../../scwx-qt.qrc"> </item>
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> <item row="9" column="0">
</property> <widget class="QLabel" name="label_20">
</widget> <property name="text">
</item> <string>Clock Format</string>
</layout> </property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Grid Height</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QCheckBox" name="antiAliasingEnabledCheckBox">
<property name="text">
<string>Anti-Aliasing Enabled</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showMapAttributionCheckBox">
<property name="text">
<string>Show Map Attribution</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showMapCenterCheckBox">
<property name="text">
<string>Show Map Center</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showMapLogoCheckBox">
<property name="text">
<string>Show Map Logo</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="enableUpdateNotificationsCheckBox">
<property name="text">
<string>Update Notifications Enabled</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="debugEnabledCheckBox">
<property name="text">
<string>Debug Enabled</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget> </widget>
</item> </item>
<item>
<widget class="QCheckBox" name="antiAliasingEnabledCheckBox">
<property name="text">
<string>Anti-Aliasing Enabled</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showMapAttributionCheckBox">
<property name="text">
<string>Show Map Attribution</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showMapLogoCheckBox">
<property name="text">
<string>Show Map Logo</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="enableUpdateNotificationsCheckBox">
<property name="text">
<string>Update Notifications Enabled</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="debugEnabledCheckBox">
<property name="text">
<string>Debug Enabled</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="palettes"> <widget class="QWidget" name="palettes">
@ -438,8 +461,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>498</width> <width>63</width>
<height>383</height> <height>18</height>
</rect> </rect>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QGridLayout" name="gridLayout_3">

@ -1 +1 @@
Subproject commit 260b340030487b01ce9aa37135d949008c972f27 Subproject commit ab32df5b0731d70aa5b977453c9aa4786eb0bd3f