mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-11-04 01:00:05 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			316 lines
		
	
	
	
		
			9.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			316 lines
		
	
	
	
		
			9.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "edit_line_dialog.hpp"
 | 
						|
#include "ui_edit_line_dialog.h"
 | 
						|
 | 
						|
#include <scwx/qt/ui/line_label.hpp>
 | 
						|
#include <scwx/qt/util/color.hpp>
 | 
						|
#include <scwx/util/logger.hpp>
 | 
						|
 | 
						|
#include <fmt/format.h>
 | 
						|
#include <QColorDialog>
 | 
						|
 | 
						|
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, false);
 | 
						|
                          });
 | 
						|
 | 
						|
         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,
 | 
						|
                  bool                      updateLineEdit = true);
 | 
						|
   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<Impl>(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<QHBoxLayout*>(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,
 | 
						|
                                     bool                      updateLineEdit)
 | 
						|
{
 | 
						|
   const std::string argbString {util::color::ToArgbString(color)};
 | 
						|
 | 
						|
   component.color_ = color;
 | 
						|
   SetBackgroundColor(argbString, component.colorFrame_);
 | 
						|
 | 
						|
   if (updateLineEdit)
 | 
						|
   {
 | 
						|
      component.colorLineEdit_->setText(QString::fromStdString(argbString));
 | 
						|
   }
 | 
						|
 | 
						|
   UpdateLineLabel();
 | 
						|
}
 | 
						|
 | 
						|
void EditLineDialog::Impl::set_width(EditComponent& component,
 | 
						|
                                     std::size_t    width)
 | 
						|
{
 | 
						|
   component.width_ = width;
 | 
						|
   component.widthSpinBox_->setValue(static_cast<int>(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
 |