::of(&QSpinBox::valueChanged), this, &PlanesDialog::setFetchInterval);
+ connect(ui->refreshButton, &QPushButton::clicked, this, &PlanesDialog::triggerRefresh);
+
+ connect(planes, &Planes::enabledChanged, this, &PlanesDialog::updateFromPlugin);
+ connect(planes, &Planes::showLabelsChanged, this, &PlanesDialog::updateFromPlugin);
+ connect(planes, &Planes::showButtonChanged, this, &PlanesDialog::updateFromPlugin);
+ connect(planes, &Planes::labelModeChanged, this, &PlanesDialog::updateFromPlugin);
+ connect(planes, &Planes::providerChanged, this, &PlanesDialog::updateFromPlugin);
+ connect(planes, &Planes::radiusChanged, this, &PlanesDialog::updateFromPlugin);
+ connect(planes, &Planes::fetchIntervalChanged, this, &PlanesDialog::updateFromPlugin);
+ connect(planes, &Planes::statusChanged, this, &PlanesDialog::setStatus);
+
+ updateFromPlugin();
+ setAboutHtml();
+}
+
+void PlanesDialog::updateFromPlugin()
+{
+ if (!planes)
+ return;
+
+ ui->enabledCheckBox->blockSignals(true);
+ ui->showLabelsCheckBox->blockSignals(true);
+ ui->showButtonCheckBox->blockSignals(true);
+ ui->labelModeComboBox->blockSignals(true);
+ ui->providerComboBox->blockSignals(true);
+ ui->radiusSpinBox->blockSignals(true);
+ ui->refreshIntervalSpinBox->blockSignals(true);
+
+ ui->enabledCheckBox->setChecked(planes->isEnabled());
+ ui->showLabelsCheckBox->setChecked(planes->getFlagShowLabels());
+ ui->showButtonCheckBox->setChecked(planes->getFlagShowButton());
+ ui->labelModeComboBox->setCurrentIndex(planes->getLabelMode());
+ ui->providerComboBox->setCurrentText(planes->getProviderDisplayName());
+ ui->radiusSpinBox->setMaximum(planes->getProviderMaxRadiusNm());
+ ui->radiusSpinBox->setValue(planes->getRadiusNm());
+ ui->refreshIntervalSpinBox->setValue(planes->getFetchIntervalSec());
+ ui->providerValueLabel->setText(providerWebsiteLink(planes->getProviderDisplayName(), planes->getProviderWebsiteUrl()));
+ ui->lastUpdateValueLabel->setText(planes->getLastSuccessfulUpdate());
+ ui->statusValueLabel->setText(planes->getLastStatus());
+ ui->statusValueLabel->setWordWrap(true);
+ ui->refreshButton->setEnabled(planes->isEnabled());
+
+ ui->enabledCheckBox->blockSignals(false);
+ ui->showLabelsCheckBox->blockSignals(false);
+ ui->showButtonCheckBox->blockSignals(false);
+ ui->labelModeComboBox->blockSignals(false);
+ ui->providerComboBox->blockSignals(false);
+ ui->radiusSpinBox->blockSignals(false);
+ ui->refreshIntervalSpinBox->blockSignals(false);
+}
+
+void PlanesDialog::setStatus(const QString& status)
+{
+ ui->statusValueLabel->setText(status);
+}
+
+void PlanesDialog::setEnabledFlag(bool enabled)
+{
+ if (planes)
+ planes->setEnabled(enabled);
+}
+
+void PlanesDialog::setShowLabels(bool enabled)
+{
+ if (planes)
+ planes->setFlagShowLabels(enabled);
+}
+
+void PlanesDialog::setShowButton(bool enabled)
+{
+ if (planes)
+ planes->setFlagShowButton(enabled);
+}
+
+void PlanesDialog::setLabelMode(int index)
+{
+ if (!planes)
+ return;
+
+ if (index >= 0)
+ planes->setLabelMode(ui->labelModeComboBox->itemData(index).toInt());
+}
+
+void PlanesDialog::setProvider(int index)
+{
+ if (!planes)
+ return;
+
+ if (index >= 0)
+ planes->setProviderId(ui->providerComboBox->itemData(index).toString());
+}
+
+void PlanesDialog::setRadius(int radiusNm)
+{
+ if (planes)
+ planes->setRadiusNm(radiusNm);
+}
+
+void PlanesDialog::setFetchInterval(int seconds)
+{
+ if (planes)
+ planes->setFetchIntervalSec(seconds);
+}
+
+void PlanesDialog::triggerRefresh()
+{
+ if (planes)
+ planes->refreshNow();
+}
+
+void PlanesDialog::openExternalLink(const QString& url)
+{
+ QDesktopServices::openUrl(QUrl(url));
+}
+
+void PlanesDialog::setAboutHtml()
+{
+ QString html = "";
+ html += "" + q_("Planes Plug-in") + "
";
+ html += "| " + q_("Version") + ": | 0.1.0 |
";
+ html += "| " + q_("License") + ": | GPL v2 or later |
";
+ html += "| " + q_("Authors") + ": | Felix Zeltner, Georg Zotti, Kamil Zaraś (astronow.pl) |
";
+ html += "
";
+ html += "" + q_("This plug-in shows live ADS-B aircraft as native Stellarium objects.") + "
";
+ html += "" + q_("It provides basic visibility, label, and refresh controls for a live aircraft feed around the current observer location.") + "
";
+ html += "" + q_("Live requests remain disabled until you enable aircraft display. When enabled, the plugin sends the current observer latitude, longitude, and search radius to the configured data source.") + "
";
+ html += "" + q_("The plugin is not loaded at Stellarium startup unless you explicitly enable it in the plug-in manager.") + "
";
+ html += "";
+
+ StelGui* gui = dynamic_cast(StelApp::getInstance().getGui());
+ if (gui)
+ {
+ QString htmlStyleSheet(gui->getStelStyle().htmlStyleSheet);
+ ui->aboutTextBrowser->document()->setDefaultStyleSheet(htmlStyleSheet);
+ }
+ ui->aboutTextBrowser->setHtml(html);
+}
diff --git a/plugins/Planes/src/gui/PlanesDialog.hpp b/plugins/Planes/src/gui/PlanesDialog.hpp
new file mode 100644
index 0000000000000..f858524e66ebc
--- /dev/null
+++ b/plugins/Planes/src/gui/PlanesDialog.hpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2013 Felix Zeltner
+ * Copyright (C) 2026 Kamil Zaraś (astronow.pl)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
+ */
+
+#ifndef PLANESDIALOG_HPP
+#define PLANESDIALOG_HPP
+
+#include "StelDialog.hpp"
+
+class Ui_planesDialog;
+class Planes;
+
+class PlanesDialog : public StelDialog
+{
+ Q_OBJECT
+
+public:
+ PlanesDialog();
+ ~PlanesDialog() override;
+
+public slots:
+ void retranslate() override;
+ void updateFromPlugin();
+ void setStatus(const QString& status);
+
+protected:
+ void createDialogContent() override;
+
+private slots:
+ void setEnabledFlag(bool enabled);
+ void setShowLabels(bool enabled);
+ void setShowButton(bool enabled);
+ void setLabelMode(int index);
+ void setProvider(int index);
+ void setRadius(int radiusNm);
+ void setFetchInterval(int seconds);
+ void triggerRefresh();
+ void openExternalLink(const QString& url);
+
+private:
+ void updateComboTexts();
+ void setAboutHtml();
+
+ Planes* planes;
+ Ui_planesDialog* ui;
+};
+
+#endif
diff --git a/plugins/Planes/src/gui/planesDialog.ui b/plugins/Planes/src/gui/planesDialog.ui
new file mode 100644
index 0000000000000..de72d7dc240ab
--- /dev/null
+++ b/plugins/Planes/src/gui/planesDialog.ui
@@ -0,0 +1,260 @@
+
+
+ planesDialog
+
+
+
+ 0
+ 0
+ 700
+ 480
+
+
+
+ Planes Plug-in Configuration
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+ Planes Plug-in Configuration
+
+
+
+ -
+
+
+ 0
+
+
+
+ Settings
+
+
+
-
+
+
+ General
+
+
+
-
+
+
+ Show live aircraft
+
+
+
+ -
+
+
+ true
+
+
+ When enabled, Stellarium requests live ADS-B positions around the current observer location.
+
+
+
+ -
+
+
+ Show aircraft labels
+
+
+
+ -
+
+
-
+
+
+ Label content
+
+
+
+ -
+
+
+
+
+ -
+
+
+ Show toolbar button
+
+
+
+
+
+
+ -
+
+
+ Live Data
+
+
+
-
+
+
+ Search radius
+
+
+
+ -
+
+
+ -
+
+
+ Refresh interval
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ true
+
+
+ Intervals below 15 seconds are disabled to reduce the risk of provider rate limits.
+
+
+
+ -
+
+
+ Provider
+
+
+
+ -
+
+
+ -
+
+
+ Provider website
+
+
+
+ -
+
+
+ true
+
+
+ true
+
+
+
+
+
+
+ -
+
+
+ Last successful update
+
+
+
+ -
+
+
+ true
+
+
+ Never
+
+
+
+ -
+
+
+ Status
+
+
+
+ -
+
+
+ idle
+
+
+
+
+
+
+ -
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+ Update now
+
+
+
+
+
+
+
+
+
+ About
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ TitleBar
+ QFrame
+
+ 1
+
+
+
+
diff --git a/po/stellarium/POTFILES.in b/po/stellarium/POTFILES.in
index 06605f58eb47e..33414519f1e00 100644
--- a/po/stellarium/POTFILES.in
+++ b/po/stellarium/POTFILES.in
@@ -265,6 +265,10 @@ plugins/OnlineQueries/src/HipOnlineQuery.cpp
plugins/OnlineQueries/src/OnlineQueries.cpp
plugins/OnlineQueries/src/gui/OnlineQueriesDialog.cpp
plugins/OnlineQueries/src/ui_onlineQueriesDialog.h
+plugins/Planes/src/AircraftObject.cpp
+plugins/Planes/src/Planes.cpp
+plugins/Planes/src/gui/PlanesDialog.cpp
+plugins/Planes/src/ui_planesDialog.h
plugins/LensDistortionEstimator/src/LensDistortionEstimator.cpp
plugins/LensDistortionEstimator/src/gui/LensDistortionEstimatorDialog.cpp
plugins/LensDistortionEstimator/src/ui_lensDistortionEstimatorDialog.h
diff --git a/src/core/StelApp.cpp b/src/core/StelApp.cpp
index 7d72a781314d8..154c4bd8360f6 100644
--- a/src/core/StelApp.cpp
+++ b/src/core/StelApp.cpp
@@ -224,6 +224,10 @@ Q_IMPORT_PLUGIN(VtsStelPluginInterface)
Q_IMPORT_PLUGIN(OnlineQueriesPluginInterface)
#endif
+#ifdef USE_STATIC_PLUGIN_PLANES
+Q_IMPORT_PLUGIN(PlanesStelPluginInterface)
+#endif
+
#ifdef USE_STATIC_PLUGIN_NEBULATEXTURES
Q_IMPORT_PLUGIN(NebulaTexturesStelPluginInterface)
#endif