Update settings category signals to be in line with variables and only fire once

Properly connect line labels to the category signals
This commit is contained in:
Dan Paulat 2024-09-26 04:41:56 -05:00
parent 20dbc7f5b7
commit 70cb3ab6d2
9 changed files with 252 additions and 117 deletions

View file

@ -18,12 +18,13 @@ static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
class LineLabel::Impl
{
public:
explicit Impl() {};
explicit Impl(LineLabel* self) : self_ {self} {};
~Impl() = default;
void ResetLineSettings();
QImage GenerateImage() const;
void UpdateLineLabel(const settings::LineSettings& lineSettings);
LineLabel* self_;
std::size_t borderWidth_ {1};
std::size_t highlightWidth_ {1};
@ -33,26 +34,18 @@ public:
boost::gil::rgba8_pixel_t highlightColor_ {255, 255, 0, 255};
boost::gil::rgba8_pixel_t lineColor_ {0, 0, 255, 255};
settings::LineSettings* lineSettings_ {nullptr};
QPixmap pixmap_ {};
bool pixmapDirty_ {true};
boost::signals2::scoped_connection settingsStaged_ {};
};
LineLabel::LineLabel(QWidget* parent) :
QFrame(parent), p {std::make_unique<Impl>()}
QFrame(parent), p {std::make_unique<Impl>(this)}
{
}
LineLabel::~LineLabel()
{
p->ResetLineSettings();
}
void LineLabel::Impl::ResetLineSettings()
{
lineSettings_ = nullptr;
}
LineLabel::~LineLabel() {}
boost::gil::rgba8_pixel_t LineLabel::border_color() const
{
@ -90,11 +83,6 @@ void LineLabel::set_border_width(std::size_t width)
p->pixmapDirty_ = true;
updateGeometry();
update();
if (p->lineSettings_ != nullptr)
{
p->lineSettings_->border_width().StageValue(width);
}
}
void LineLabel::set_highlight_width(std::size_t width)
@ -103,11 +91,6 @@ void LineLabel::set_highlight_width(std::size_t width)
p->pixmapDirty_ = true;
updateGeometry();
update();
if (p->lineSettings_ != nullptr)
{
p->lineSettings_->highlight_width().StageValue(width);
}
}
void LineLabel::set_line_width(std::size_t width)
@ -116,11 +99,6 @@ void LineLabel::set_line_width(std::size_t width)
p->pixmapDirty_ = true;
updateGeometry();
update();
if (p->lineSettings_ != nullptr)
{
p->lineSettings_->line_width().StageValue(width);
}
}
void LineLabel::set_border_color(boost::gil::rgba8_pixel_t color)
@ -128,12 +106,6 @@ void LineLabel::set_border_color(boost::gil::rgba8_pixel_t color)
p->borderColor_ = color;
p->pixmapDirty_ = true;
update();
if (p->lineSettings_ != nullptr)
{
p->lineSettings_->border_color().StageValue(
util::color::ToArgbString(color));
}
}
void LineLabel::set_highlight_color(boost::gil::rgba8_pixel_t color)
@ -141,12 +113,6 @@ void LineLabel::set_highlight_color(boost::gil::rgba8_pixel_t color)
p->highlightColor_ = color;
p->pixmapDirty_ = true;
update();
if (p->lineSettings_ != nullptr)
{
p->lineSettings_->highlight_color().StageValue(
util::color::ToArgbString(color));
}
}
void LineLabel::set_line_color(boost::gil::rgba8_pixel_t color)
@ -154,30 +120,30 @@ void LineLabel::set_line_color(boost::gil::rgba8_pixel_t color)
p->lineColor_ = color;
p->pixmapDirty_ = true;
update();
if (p->lineSettings_ != nullptr)
{
p->lineSettings_->line_color().StageValue(
util::color::ToArgbString(color));
}
}
void LineLabel::set_line_settings(settings::LineSettings& lineSettings)
{
p->ResetLineSettings();
p->settingsStaged_ = lineSettings.staged_signal().connect(
[this, &lineSettings]() { p->UpdateLineLabel(lineSettings); });
set_border_color(util::color::ToRgba8PixelT(
p->UpdateLineLabel(lineSettings);
}
void LineLabel::Impl::UpdateLineLabel(
const settings::LineSettings& lineSettings)
{
self_->set_border_color(util::color::ToRgba8PixelT(
lineSettings.border_color().GetStagedOrValue()));
set_highlight_color(util::color::ToRgba8PixelT(
self_->set_highlight_color(util::color::ToRgba8PixelT(
lineSettings.highlight_color().GetStagedOrValue()));
set_line_color(
self_->set_line_color(
util::color::ToRgba8PixelT(lineSettings.line_color().GetStagedOrValue()));
set_border_width(lineSettings.border_width().GetStagedOrValue());
set_highlight_width(lineSettings.highlight_width().GetStagedOrValue());
set_line_width(lineSettings.line_width().GetStagedOrValue());
p->lineSettings_ = &lineSettings;
self_->set_border_width(lineSettings.border_width().GetStagedOrValue());
self_->set_highlight_width(
lineSettings.highlight_width().GetStagedOrValue());
self_->set_line_width(lineSettings.line_width().GetStagedOrValue());
}
QSize LineLabel::minimumSizeHint() const

View file

@ -37,13 +37,7 @@ public:
SetupUi();
ConnectSignals();
}
~Impl()
{
for (auto& c : bs2Connections_)
{
c.disconnect();
}
};
~Impl() {};
void AddPhenomenonLine(const std::string& name,
settings::LineSettings& lineSettings,
@ -59,10 +53,8 @@ public:
QStackedWidget* phenomenonPagesWidget_;
QListWidget* phenomenonListView_;
EditLineDialog* editLineDialog_;
LineLabel* activeLineLabel_ {nullptr};
std::vector<boost::signals2::connection> bs2Connections_ {};
EditLineDialog* editLineDialog_;
settings::LineSettings* activeLineSettings_ {nullptr};
boost::unordered_flat_map<awips::Phenomenon, QWidget*> phenomenonPages_ {};
};
@ -147,30 +139,27 @@ void AlertPaletteSettingsWidget::Impl::ConnectSignals()
}
});
connect(
editLineDialog_,
&EditLineDialog::accepted,
self_,
[this]()
{
// If the active line label was set
if (activeLineLabel_ != nullptr)
{
// Update the active line label with selected line settings
activeLineLabel_->set_border_color(editLineDialog_->border_color());
activeLineLabel_->set_highlight_color(
editLineDialog_->highlight_color());
activeLineLabel_->set_line_color(editLineDialog_->line_color());
connect(editLineDialog_,
&EditLineDialog::accepted,
self_,
[this]()
{
// If the active line label was set
if (activeLineSettings_ != nullptr)
{
// Update the active line settings with selected line settings
activeLineSettings_->StageValues(
editLineDialog_->border_color(),
editLineDialog_->highlight_color(),
editLineDialog_->line_color(),
editLineDialog_->border_width(),
editLineDialog_->highlight_width(),
editLineDialog_->line_width());
activeLineLabel_->set_border_width(editLineDialog_->border_width());
activeLineLabel_->set_highlight_width(
editLineDialog_->highlight_width());
activeLineLabel_->set_line_width(editLineDialog_->line_width());
// Reset the active line label
activeLineLabel_ = nullptr;
}
});
// Reset the active line settings
activeLineSettings_ = nullptr;
}
});
}
void AlertPaletteSettingsWidget::Impl::SelectPhenomenon(
@ -260,19 +249,14 @@ void AlertPaletteSettingsWidget::Impl::AddPhenomenonLine(
self_->AddSettingsCategory(&lineSettings);
boost::signals2::connection c = lineSettings.RegisterResetCallback(
[lineLabel, &lineSettings]()
{ lineLabel->set_line_settings(lineSettings); });
bs2Connections_.push_back(c);
connect(
toolButton,
&QAbstractButton::clicked,
self_,
[this, lineLabel]()
[this, lineLabel, &lineSettings]()
{
// Set the active line label for when the dialog is finished
activeLineLabel_ = lineLabel;
activeLineSettings_ = &lineSettings;
// Initialize dialog with current line settings
editLineDialog_->set_border_color(lineLabel->border_color());