From eda7751eb907be7269b94a1b4d1ba793bf644502 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Tue, 20 Aug 2024 23:58:14 -0500 Subject: [PATCH] Edit line dialog in-work --- scwx-qt/scwx-qt.cmake | 15 +- .../source/scwx/qt/ui/edit_line_dialog.cpp | 309 ++++++++++++++++++ .../source/scwx/qt/ui/edit_line_dialog.hpp | 59 ++++ scwx-qt/source/scwx/qt/ui/edit_line_dialog.ui | 306 +++++++++++++++++ 4 files changed, 683 insertions(+), 6 deletions(-) create mode 100644 scwx-qt/source/scwx/qt/ui/edit_line_dialog.cpp create mode 100644 scwx-qt/source/scwx/qt/ui/edit_line_dialog.hpp create mode 100644 scwx-qt/source/scwx/qt/ui/edit_line_dialog.ui diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index b300cd2a..a548b1f4 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -240,8 +240,8 @@ set(HDR_UI source/scwx/qt/ui/about_dialog.hpp source/scwx/qt/ui/animation_dock_widget.hpp source/scwx/qt/ui/collapsible_group.hpp source/scwx/qt/ui/county_dialog.hpp - source/scwx/qt/ui/wfo_dialog.hpp source/scwx/qt/ui/download_dialog.hpp + source/scwx/qt/ui/edit_line_dialog.hpp source/scwx/qt/ui/flow_layout.hpp source/scwx/qt/ui/gps_info_dialog.hpp source/scwx/qt/ui/hotkey_edit.hpp @@ -260,15 +260,16 @@ set(HDR_UI source/scwx/qt/ui/about_dialog.hpp source/scwx/qt/ui/radar_site_dialog.hpp source/scwx/qt/ui/serial_port_dialog.hpp source/scwx/qt/ui/settings_dialog.hpp - source/scwx/qt/ui/update_dialog.hpp) + source/scwx/qt/ui/update_dialog.hpp + source/scwx/qt/ui/wfo_dialog.hpp) set(SRC_UI source/scwx/qt/ui/about_dialog.cpp source/scwx/qt/ui/alert_dialog.cpp source/scwx/qt/ui/alert_dock_widget.cpp source/scwx/qt/ui/animation_dock_widget.cpp source/scwx/qt/ui/collapsible_group.cpp source/scwx/qt/ui/county_dialog.cpp - source/scwx/qt/ui/wfo_dialog.cpp source/scwx/qt/ui/download_dialog.cpp + source/scwx/qt/ui/edit_line_dialog.cpp source/scwx/qt/ui/flow_layout.cpp source/scwx/qt/ui/gps_info_dialog.cpp source/scwx/qt/ui/hotkey_edit.cpp @@ -287,14 +288,15 @@ set(SRC_UI source/scwx/qt/ui/about_dialog.cpp source/scwx/qt/ui/radar_site_dialog.cpp source/scwx/qt/ui/settings_dialog.cpp source/scwx/qt/ui/serial_port_dialog.cpp - source/scwx/qt/ui/update_dialog.cpp) + source/scwx/qt/ui/update_dialog.cpp + source/scwx/qt/ui/wfo_dialog.cpp) set(UI_UI source/scwx/qt/ui/about_dialog.ui source/scwx/qt/ui/alert_dialog.ui source/scwx/qt/ui/alert_dock_widget.ui source/scwx/qt/ui/animation_dock_widget.ui source/scwx/qt/ui/collapsible_group.ui source/scwx/qt/ui/county_dialog.ui - source/scwx/qt/ui/wfo_dialog.ui + source/scwx/qt/ui/edit_line_dialog.ui source/scwx/qt/ui/gps_info_dialog.ui source/scwx/qt/ui/imgui_debug_dialog.ui source/scwx/qt/ui/layer_dialog.ui @@ -305,7 +307,8 @@ set(UI_UI source/scwx/qt/ui/about_dialog.ui source/scwx/qt/ui/radar_site_dialog.ui source/scwx/qt/ui/settings_dialog.ui source/scwx/qt/ui/serial_port_dialog.ui - source/scwx/qt/ui/update_dialog.ui) + source/scwx/qt/ui/update_dialog.ui + source/scwx/qt/ui/wfo_dialog.ui) set(HDR_UI_SETTINGS source/scwx/qt/ui/settings/hotkey_settings_widget.hpp source/scwx/qt/ui/settings/settings_page_widget.hpp source/scwx/qt/ui/settings/unit_settings_widget.hpp) diff --git a/scwx-qt/source/scwx/qt/ui/edit_line_dialog.cpp b/scwx-qt/source/scwx/qt/ui/edit_line_dialog.cpp new file mode 100644 index 00000000..1aafffeb --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/edit_line_dialog.cpp @@ -0,0 +1,309 @@ +#include "edit_line_dialog.hpp" +#include "ui_edit_line_dialog.h" + +#include +#include +#include + +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace ui +{ + +static const std::string logPrefix_ = "scwx::qt::ui::edit_line_dialog"; +static const auto logger_ = scwx::util::Logger::Create(logPrefix_); + +class EditLineDialog::Impl +{ +public: + struct EditComponent + { + void ConnectSignals(EditLineDialog* self) + { + QObject::connect(colorLineEdit_, + &QLineEdit::textEdited, + self, + [=, this](const QString& text) + { + boost::gil::rgba8_pixel_t color = + util::color::ToRgba8PixelT(text.toStdString()); + self->p->set_color(*this, color); + }); + + QObject::connect(colorButton_, + &QAbstractButton::clicked, + self, + [=, this]() { self->p->ShowColorDialog(*this); }); + + QObject::connect(widthSpinBox_, + &QSpinBox::valueChanged, + self, + [=, this](int width) + { self->p->set_width(*this, width); }); + } + + boost::gil::rgba8_pixel_t color_; + std::size_t width_; + QFrame* colorFrame_ {nullptr}; + QLineEdit* colorLineEdit_ {nullptr}; + QToolButton* colorButton_ {nullptr}; + QSpinBox* widthSpinBox_ {nullptr}; + }; + + explicit Impl(EditLineDialog* self) : + self_ {self}, lineLabel_ {new LineLabel(self)} + { + } + ~Impl() = default; + + void SetDefaults(); + void ShowColorDialog(EditComponent& component); + void UpdateLineLabel(); + + void set_color(EditComponent& component, boost::gil::rgba8_pixel_t color); + void set_width(EditComponent& component, std::size_t width); + + static void SetBackgroundColor(const std::string& value, QFrame* frame); + + EditLineDialog* self_; + + LineLabel* lineLabel_; + + boost::gil::rgba8_pixel_t defaultBorderColor_ {0, 0, 0, 255}; + boost::gil::rgba8_pixel_t defaultHighlightColor_ {0, 0, 0, 0}; + boost::gil::rgba8_pixel_t defaultLineColor_ {255, 255, 255, 255}; + + std::size_t defaultBorderWidth_ {1u}; + std::size_t defaultHighlightWidth_ {0u}; + std::size_t defaultLineWidth_ {3u}; + + EditComponent borderComponent_ {}; + EditComponent highlightComponent_ {}; + EditComponent lineComponent_ {}; +}; + +EditLineDialog::EditLineDialog(QWidget* parent) : + QDialog(parent), + p {std::make_unique(this)}, + ui(new Ui::EditLineDialog) +{ + ui->setupUi(this); + + p->borderComponent_.colorFrame_ = ui->borderColorFrame; + p->borderComponent_.colorLineEdit_ = ui->borderColorLineEdit; + p->borderComponent_.colorButton_ = ui->borderColorButton; + p->borderComponent_.widthSpinBox_ = ui->borderWidthSpinBox; + + p->highlightComponent_.colorFrame_ = ui->highlightColorFrame; + p->highlightComponent_.colorLineEdit_ = ui->highlightColorLineEdit; + p->highlightComponent_.colorButton_ = ui->highlightColorButton; + p->highlightComponent_.widthSpinBox_ = ui->highlightWidthSpinBox; + + p->lineComponent_.colorFrame_ = ui->lineColorFrame; + p->lineComponent_.colorLineEdit_ = ui->lineColorLineEdit; + p->lineComponent_.colorButton_ = ui->lineColorButton; + p->lineComponent_.widthSpinBox_ = ui->lineWidthSpinBox; + + p->SetDefaults(); + + p->lineLabel_->setMinimumWidth(72); + + QHBoxLayout* lineLabelContainerLayout = + static_cast(ui->lineLabelContainer->layout()); + lineLabelContainerLayout->insertWidget(1, p->lineLabel_); + + p->borderComponent_.ConnectSignals(this); + p->highlightComponent_.ConnectSignals(this); + p->lineComponent_.ConnectSignals(this); + + QObject::connect(ui->buttonBox, + &QDialogButtonBox::clicked, + this, + [this](QAbstractButton* button) + { + QDialogButtonBox::ButtonRole role = + ui->buttonBox->buttonRole(button); + + switch (role) + { + case QDialogButtonBox::ButtonRole::ResetRole: // Reset + p->SetDefaults(); + break; + + default: + break; + } + }); +} + +EditLineDialog::~EditLineDialog() +{ + delete ui; +} + +boost::gil::rgba8_pixel_t EditLineDialog::border_color() const +{ + return p->borderComponent_.color_; +} + +boost::gil::rgba8_pixel_t EditLineDialog::highlight_color() const +{ + return p->highlightComponent_.color_; +} + +boost::gil::rgba8_pixel_t EditLineDialog::line_color() const +{ + return p->lineComponent_.color_; +} + +std::size_t EditLineDialog::border_width() const +{ + return p->borderComponent_.width_; +} + +std::size_t EditLineDialog::highlight_width() const +{ + return p->highlightComponent_.width_; +} + +std::size_t EditLineDialog::line_width() const +{ + return p->lineComponent_.width_; +} + +void EditLineDialog::set_border_color(boost::gil::rgba8_pixel_t color) +{ + p->set_color(p->borderComponent_, color); +} + +void EditLineDialog::set_highlight_color(boost::gil::rgba8_pixel_t color) +{ + p->set_color(p->highlightComponent_, color); +} + +void EditLineDialog::set_line_color(boost::gil::rgba8_pixel_t color) +{ + p->set_color(p->lineComponent_, color); +} + +void EditLineDialog::set_border_width(std::size_t width) +{ + p->set_width(p->borderComponent_, width); +} + +void EditLineDialog::set_highlight_width(std::size_t width) +{ + p->set_width(p->highlightComponent_, width); +} + +void EditLineDialog::set_line_width(std::size_t width) +{ + p->set_width(p->lineComponent_, width); +} + +void EditLineDialog::Impl::set_color(EditComponent& component, + boost::gil::rgba8_pixel_t color) +{ + const std::string argbString {util::color::ToArgbString(color)}; + + component.color_ = color; + component.colorLineEdit_->setText(QString::fromStdString(argbString)); + SetBackgroundColor(argbString, component.colorFrame_); + + UpdateLineLabel(); +} + +void EditLineDialog::Impl::set_width(EditComponent& component, + std::size_t width) +{ + component.width_ = width; + component.widthSpinBox_->setValue(static_cast(width)); + + UpdateLineLabel(); +} + +void EditLineDialog::Impl::UpdateLineLabel() +{ + lineLabel_->set_border_color(borderComponent_.color_); + lineLabel_->set_highlight_color(highlightComponent_.color_); + lineLabel_->set_line_color(lineComponent_.color_); + + lineLabel_->set_border_width(borderComponent_.width_); + lineLabel_->set_highlight_width(highlightComponent_.width_); + lineLabel_->set_line_width(lineComponent_.width_); +} + +void EditLineDialog::Initialize(boost::gil::rgba8_pixel_t borderColor, + boost::gil::rgba8_pixel_t highlightColor, + boost::gil::rgba8_pixel_t lineColor, + std::size_t borderWidth, + std::size_t highlightWidth, + std::size_t lineWidth) +{ + p->defaultBorderColor_ = borderColor; + p->defaultHighlightColor_ = highlightColor; + p->defaultLineColor_ = lineColor; + + p->defaultBorderWidth_ = borderWidth; + p->defaultHighlightWidth_ = highlightWidth; + p->defaultLineWidth_ = lineWidth; + + p->SetDefaults(); +} + +void EditLineDialog::Impl::SetDefaults() +{ + self_->set_border_color(defaultBorderColor_); + self_->set_highlight_color(defaultHighlightColor_); + self_->set_line_color(defaultLineColor_); + + self_->set_border_width(defaultBorderWidth_); + self_->set_highlight_width(defaultHighlightWidth_); + self_->set_line_width(defaultLineWidth_); +} + +void EditLineDialog::Impl::ShowColorDialog(EditComponent& component) +{ + QColorDialog* dialog = new QColorDialog(self_); + + dialog->setAttribute(Qt::WA_DeleteOnClose); + dialog->setOption(QColorDialog::ColorDialogOption::ShowAlphaChannel); + + QColor initialColor(component.colorLineEdit_->text()); + if (initialColor.isValid()) + { + dialog->setCurrentColor(initialColor); + } + + QObject::connect( + dialog, + &QColorDialog::colorSelected, + self_, + [this, &component](const QColor& qColor) + { + QString colorName = qColor.name(QColor::NameFormat::HexArgb); + boost::gil::rgba8_pixel_t color = + util::color::ToRgba8PixelT(colorName.toStdString()); + + logger_->info("Selected color: {}", colorName.toStdString()); + set_color(component, color); + }); + + dialog->open(); +} + +void EditLineDialog::Impl::SetBackgroundColor(const std::string& value, + QFrame* frame) +{ + frame->setStyleSheet( + QString::fromStdString(fmt::format("background-color: {}", value))); +} + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/edit_line_dialog.hpp b/scwx-qt/source/scwx/qt/ui/edit_line_dialog.hpp new file mode 100644 index 00000000..2f8ea3ce --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/edit_line_dialog.hpp @@ -0,0 +1,59 @@ +#pragma once + +#include + +#include + +namespace Ui +{ +class EditLineDialog; +} + +namespace scwx +{ +namespace qt +{ +namespace ui +{ + +class EditLineDialog : public QDialog +{ + Q_OBJECT + Q_DISABLE_COPY_MOVE(EditLineDialog) + +public: + explicit EditLineDialog(QWidget* parent = nullptr); + ~EditLineDialog(); + + boost::gil::rgba8_pixel_t border_color() const; + boost::gil::rgba8_pixel_t highlight_color() const; + boost::gil::rgba8_pixel_t line_color() const; + + std::size_t border_width() const; + std::size_t highlight_width() const; + std::size_t line_width() const; + + void set_border_color(boost::gil::rgba8_pixel_t color); + void set_highlight_color(boost::gil::rgba8_pixel_t color); + void set_line_color(boost::gil::rgba8_pixel_t color); + + void set_border_width(std::size_t width); + void set_highlight_width(std::size_t width); + void set_line_width(std::size_t width); + + void Initialize(boost::gil::rgba8_pixel_t borderColor, + boost::gil::rgba8_pixel_t highlightColor, + boost::gil::rgba8_pixel_t lineColor, + std::size_t borderWidth, + std::size_t highlightWidth, + std::size_t lineWidth); + +private: + class Impl; + std::unique_ptr p; + Ui::EditLineDialog* ui; +}; + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/edit_line_dialog.ui b/scwx-qt/source/scwx/qt/ui/edit_line_dialog.ui new file mode 100644 index 00000000..bc133bf9 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/edit_line_dialog.ui @@ -0,0 +1,306 @@ + + + EditLineDialog + + + + 0 + 0 + 350 + 225 + + + + Edit Line + + + + + + + true + + + + Component + + + + + + + #ff000000 + + + + + + + 0 + + + 9 + + + + + + + ... + + + + :/res/icons/font-awesome-6/palette-solid.svg:/res/icons/font-awesome-6/palette-solid.svg + + + + + + + ... + + + + :/res/icons/font-awesome-6/palette-solid.svg:/res/icons/font-awesome-6/palette-solid.svg + + + + + + + Border + + + + + + + #ff000000 + + + + + + + Line + + + + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok|QDialogButtonBox::StandardButton::Reset + + + + + + + + 24 + 24 + + + + QFrame::Shape::Box + + + QFrame::Shadow::Plain + + + + + + + 0 + + + 9 + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + 24 + 24 + + + + QFrame::Shape::Box + + + QFrame::Shadow::Plain + + + + + + + + true + + + + Color + + + + + + + #ff000000 + + + + + + + + 24 + 24 + + + + QFrame::Shape::Box + + + QFrame::Shadow::Plain + + + + + + + + true + + + + Width + + + + + + + 1 + + + 9 + + + + + + + Highlight + + + + + + + ... + + + + :/res/icons/font-awesome-6/palette-solid.svg:/res/icons/font-awesome-6/palette-solid.svg + + + + + + + + 0 + 45 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Orientation::Horizontal + + + + + + + Qt::Orientation::Horizontal + + + + + + + + + + + + + + buttonBox + accepted() + EditLineDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + EditLineDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + +