From 157500e20a9e5ac09e78c3c2285afa9fe2fc02a4 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sat, 22 Jul 2023 21:17:09 -0500 Subject: [PATCH] Add open URL dialog to add a placefile --- scwx-qt/scwx-qt.cmake | 3 + scwx-qt/source/scwx/qt/ui/open_url_dialog.cpp | 103 +++++++++++++++ scwx-qt/source/scwx/qt/ui/open_url_dialog.hpp | 40 ++++++ scwx-qt/source/scwx/qt/ui/open_url_dialog.ui | 118 ++++++++++++++++++ .../scwx/qt/ui/placefile_settings_widget.cpp | 28 +++++ 5 files changed, 292 insertions(+) create mode 100644 scwx-qt/source/scwx/qt/ui/open_url_dialog.cpp create mode 100644 scwx-qt/source/scwx/qt/ui/open_url_dialog.hpp create mode 100644 scwx-qt/source/scwx/qt/ui/open_url_dialog.ui diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 691741a9..a2c758bd 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -160,6 +160,7 @@ set(HDR_UI source/scwx/qt/ui/about_dialog.hpp source/scwx/qt/ui/level2_products_widget.hpp source/scwx/qt/ui/level2_settings_widget.hpp source/scwx/qt/ui/level3_products_widget.hpp + source/scwx/qt/ui/open_url_dialog.hpp source/scwx/qt/ui/placefile_settings_widget.hpp source/scwx/qt/ui/radar_site_dialog.hpp source/scwx/qt/ui/settings_dialog.hpp @@ -175,6 +176,7 @@ set(SRC_UI source/scwx/qt/ui/about_dialog.cpp source/scwx/qt/ui/level2_products_widget.cpp source/scwx/qt/ui/level2_settings_widget.cpp source/scwx/qt/ui/level3_products_widget.cpp + source/scwx/qt/ui/open_url_dialog.cpp source/scwx/qt/ui/placefile_settings_widget.cpp source/scwx/qt/ui/radar_site_dialog.cpp source/scwx/qt/ui/settings_dialog.cpp @@ -185,6 +187,7 @@ set(UI_UI source/scwx/qt/ui/about_dialog.ui source/scwx/qt/ui/animation_dock_widget.ui source/scwx/qt/ui/collapsible_group.ui source/scwx/qt/ui/imgui_debug_dialog.ui + source/scwx/qt/ui/open_url_dialog.ui source/scwx/qt/ui/placefile_settings_widget.ui source/scwx/qt/ui/radar_site_dialog.ui source/scwx/qt/ui/settings_dialog.ui diff --git a/scwx-qt/source/scwx/qt/ui/open_url_dialog.cpp b/scwx-qt/source/scwx/qt/ui/open_url_dialog.cpp new file mode 100644 index 00000000..0019a472 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/open_url_dialog.cpp @@ -0,0 +1,103 @@ +#include "open_url_dialog.hpp" +#include "ui_open_url_dialog.h" + +#include + +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace ui +{ + +static const std::string logPrefix_ = "scwx::qt::ui::open_url_dialog"; +static const auto logger_ = scwx::util::Logger::Create(logPrefix_); + +class OpenUrlDialogImpl +{ +public: + explicit OpenUrlDialogImpl(OpenUrlDialog* self) : self_ {self} {} + ~OpenUrlDialogImpl() = default; + + void ConnectSignals(); + void SelectFile(); + + OpenUrlDialog* self_; +}; + +OpenUrlDialog::OpenUrlDialog(const QString& title, QWidget* parent) : + QDialog(parent), + p {std::make_unique(this)}, + ui(new Ui::OpenUrlDialog) +{ + ui->setupUi(this); + + setWindowTitle(title); + + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + + p->ConnectSignals(); +} + +OpenUrlDialog::~OpenUrlDialog() +{ + delete ui; +} + +void OpenUrlDialogImpl::ConnectSignals() +{ + QObject::connect(self_->ui->urlEdit, + &QLineEdit::textChanged, + self_, + [this](const QString& text) + { + QUrl url(text); + self_->ui->buttonBox->button(QDialogButtonBox::Ok) + ->setEnabled(url.isValid()); + }); + + QObject::connect(self_->ui->fileButton, + &QToolButton::clicked, + self_, + [this]() { SelectFile(); }); +} + +void OpenUrlDialog::showEvent(QShowEvent* event) +{ + ui->urlEdit->setText(QString()); + QDialog::showEvent(event); +} + +QString OpenUrlDialog::url() const +{ + return ui->urlEdit->text(); +} + +void OpenUrlDialogImpl::SelectFile() +{ + static const std::string placefileFilter = "Placefiles (*)"; + + QFileDialog* dialog = new QFileDialog(self_); + + dialog->setFileMode(QFileDialog::ExistingFile); + dialog->setNameFilter(QObject::tr(placefileFilter.c_str())); + dialog->setAttribute(Qt::WA_DeleteOnClose); + + QObject::connect(dialog, + &QFileDialog::fileSelected, + self_, + [this](const QString& file) + { + logger_->debug("Selected: {}", file.toStdString()); + self_->ui->urlEdit->setText(file); + }); + + dialog->open(); +} + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/open_url_dialog.hpp b/scwx-qt/source/scwx/qt/ui/open_url_dialog.hpp new file mode 100644 index 00000000..ef7666e7 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/open_url_dialog.hpp @@ -0,0 +1,40 @@ +#pragma once + +#include + +namespace Ui +{ +class OpenUrlDialog; +} + +namespace scwx +{ +namespace qt +{ +namespace ui +{ + +class OpenUrlDialogImpl; + +class OpenUrlDialog : public QDialog +{ + Q_OBJECT + +public: + explicit OpenUrlDialog(const QString& title, QWidget* parent = nullptr); + ~OpenUrlDialog(); + + QString url() const; + +protected: + void showEvent(QShowEvent* event); + +private: + friend class OpenUrlDialogImpl; + std::unique_ptr p; + Ui::OpenUrlDialog* ui; +}; + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/open_url_dialog.ui b/scwx-qt/source/scwx/qt/ui/open_url_dialog.ui new file mode 100644 index 00000000..a796d20d --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/open_url_dialog.ui @@ -0,0 +1,118 @@ + + + OpenUrlDialog + + + + 0 + 0 + 400 + 80 + + + + Dialog + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + URL: + + + + + + + + + + ... + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + OpenUrlDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + OpenUrlDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/scwx-qt/source/scwx/qt/ui/placefile_settings_widget.cpp b/scwx-qt/source/scwx/qt/ui/placefile_settings_widget.cpp index c8578c78..420f915a 100644 --- a/scwx-qt/source/scwx/qt/ui/placefile_settings_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/placefile_settings_widget.cpp @@ -1,6 +1,9 @@ #include "placefile_settings_widget.hpp" #include "ui_placefile_settings_widget.h" +#include +#include + namespace scwx { namespace qt @@ -8,6 +11,9 @@ namespace qt namespace ui { +static const std::string logPrefix_ = "scwx::qt::ui::placefile_settings_widget"; +static const auto logger_ = scwx::util::Logger::Create(logPrefix_); + class PlacefileSettingsWidgetImpl { public: @@ -17,7 +23,10 @@ public: } ~PlacefileSettingsWidgetImpl() = default; + void ConnectSignals(); + PlacefileSettingsWidget* self_; + OpenUrlDialog* openUrlDialog_ {nullptr}; }; PlacefileSettingsWidget::PlacefileSettingsWidget(QWidget* parent) : @@ -26,6 +35,10 @@ PlacefileSettingsWidget::PlacefileSettingsWidget(QWidget* parent) : ui(new Ui::PlacefileSettingsWidget) { ui->setupUi(this); + + p->openUrlDialog_ = new OpenUrlDialog("Add Placefile", this); + + p->ConnectSignals(); } PlacefileSettingsWidget::~PlacefileSettingsWidget() @@ -33,6 +46,21 @@ PlacefileSettingsWidget::~PlacefileSettingsWidget() delete ui; } +void PlacefileSettingsWidgetImpl::ConnectSignals() +{ + QObject::connect(self_->ui->addButton, + &QPushButton::clicked, + self_, + [this]() { openUrlDialog_->open(); }); + + QObject::connect( + openUrlDialog_, + &OpenUrlDialog::accepted, + self_, + [this]() + { logger_->info("Add URL: {}", openUrlDialog_->url().toStdString()); }); +} + } // namespace ui } // namespace qt } // namespace scwx