feat: 添加ElaWidgetTool库

This commit is contained in:
sleepwithoutbz
2025-09-19 22:40:52 +08:00
parent 5f93e8caf6
commit 4eef5c7fd5
407 changed files with 36325 additions and 7 deletions

View File

@@ -0,0 +1,343 @@
#include "ElaColorDialog.h"
#include <QHBoxLayout>
#include <QPainter>
#include <QVBoxLayout>
#include <utility>
#include "ElaBaseListView.h"
#include "ElaColorDialogPrivate.h"
#include "ElaColorDisplayDelegate.h"
#include "ElaColorDisplayModel.h"
#include "ElaColorPicker.h"
#include "ElaColorPreview.h"
#include "ElaColorValueSliderStyle.h"
#include "ElaComboBox.h"
#include "ElaIntValidator.h"
#include "ElaLineEdit.h"
#include "ElaPushButton.h"
#include "ElaText.h"
#include "ElaTheme.h"
#include "ElaToolButton.h"
Q_TAKEOVER_NATIVEEVENT_CPP(ElaColorDialog, d_func()->_appBar);
ElaColorDialog::ElaColorDialog(QWidget* parent)
: QDialog{parent}, d_ptr(new ElaColorDialogPrivate())
{
Q_D(ElaColorDialog);
d->q_ptr = this;
setFixedSize(600, 600); // 默认宽高
setObjectName("ElaColorDialog");
setWindowTitle("ElaColorDialog");
setWindowModality(Qt::ApplicationModal);
// 自定义AppBar
d->_appBar = new ElaAppBar(this);
d->_appBar->setAppBarHeight(30);
d->_appBar->setIsFixedSize(true);
d->_appBar->setIsStayTop(true);
d->_appBar->setWindowButtonFlags(ElaAppBarType::CloseButtonHint);
d->_appBar->setIsDefaultClosed(false);
connect(d->_appBar, &ElaAppBar::closeButtonClicked, this, [=]() {
close();
});
// 颜色选择器
ElaText* colorPickerText = new ElaText("编辑颜色", this);
colorPickerText->setTextPixelSize(17);
QHBoxLayout* colorPickerTextLayout = new QHBoxLayout();
colorPickerTextLayout->setContentsMargins(0, 0, 0, 0);
colorPickerTextLayout->addSpacing(3);
colorPickerTextLayout->addWidget(colorPickerText);
d->_colorPicker = new ElaColorPicker(this);
connect(d->_colorPicker, &ElaColorPicker::selectedColorChanged, d, &ElaColorDialogPrivate::onColorPickerColorChanged);
QVBoxLayout* colorPickerLayout = new QVBoxLayout();
colorPickerLayout->setContentsMargins(0, 0, 0, 0);
colorPickerLayout->addWidget(d->_colorPicker);
colorPickerLayout->addStretch();
// 颜色预览
d->_colorPreview = new ElaColorPreview(this);
QVBoxLayout* colorPreviewLayout = new QVBoxLayout();
colorPreviewLayout->setContentsMargins(0, 0, 0, 0);
colorPreviewLayout->addWidget(d->_colorPreview);
colorPreviewLayout->addStretch();
// 颜色value控制
d->_colorValueSlider = new QSlider(this);
d->_colorValueSlider->setFixedHeight(257);
d->_colorValueSlider->setOrientation(Qt::Vertical);
d->_colorValueSlider->setRange(0, 255);
d->_colorValueSlider->setValue(255);
d->_colorValueSliderStyle = new ElaColorValueSliderStyle();
d->_colorValueSlider->setStyle(d->_colorValueSliderStyle);
connect(d->_colorValueSlider, &QSlider::valueChanged, d, &ElaColorDialogPrivate::onColorValueSliderChanged);
QVBoxLayout* colorValueSliderLayout = new QVBoxLayout();
colorValueSliderLayout->setContentsMargins(0, 0, 0, 0);
colorValueSliderLayout->addWidget(d->_colorValueSlider);
colorValueSliderLayout->addStretch();
// 颜色控制器
d->_htmlEdit = new ElaLineEdit(this);
d->_htmlEdit->setText("#000000");
ElaIntValidator* htmlValidator = new ElaIntValidator(0x000000, 0xFFFFFF, this);
htmlValidator->setIsHexMode(true);
d->_htmlEdit->setValidator(htmlValidator);
d->_htmlEdit->setFixedSize(120, 33);
connect(d->_htmlEdit, &ElaLineEdit::focusOut, d, &ElaColorDialogPrivate::onHtmlEditFocusOut);
connect(d->_htmlEdit, &ElaLineEdit::textEdited, d, &ElaColorDialogPrivate::onHtmlEditChanged);
// 数值预览
QHBoxLayout* htmlEditLayout = new QHBoxLayout();
htmlEditLayout->setContentsMargins(0, 0, 0, 0);
htmlEditLayout->addSpacing(6);
htmlEditLayout->addWidget(d->_htmlEdit);
htmlEditLayout->addStretch();
d->_modeComboBox = new ElaComboBox(this);
d->_modeComboBox->setFixedSize(132, 33);
d->_modeComboBox->addItem("RGB");
d->_modeComboBox->addItem("HSV");
d->_modeComboBox->setCurrentIndex(0);
connect(d->_modeComboBox, QOverload<int>::of(&ElaComboBox::currentIndexChanged), d, &ElaColorDialogPrivate::onColorModeChanged);
// R或H
d->_firstEdit = new ElaLineEdit(this);
d->_firstEdit->setText("0");
d->_firstEdit->setFixedSize(120, 33);
d->_firstEdit->setValidator(new ElaIntValidator(0, 255, this));
d->_firstText = new ElaText("红色", this);
d->_firstText->setTextPixelSize(13);
connect(d->_firstEdit, &ElaLineEdit::textEdited, d, &ElaColorDialogPrivate::onColorEditChanged);
QHBoxLayout* firstEditLayout = new QHBoxLayout();
firstEditLayout->setContentsMargins(0, 0, 0, 0);
firstEditLayout->addSpacing(6);
firstEditLayout->addWidget(d->_firstEdit);
firstEditLayout->addWidget(d->_firstText);
firstEditLayout->addStretch();
// G或S
d->_secondEdit = new ElaLineEdit(this);
d->_secondEdit->setText("0");
d->_secondEdit->setFixedSize(120, 33);
d->_secondEdit->setValidator(new ElaIntValidator(0, 255, this));
d->_secondText = new ElaText("绿色", this);
d->_secondText->setTextPixelSize(13);
connect(d->_secondEdit, &ElaLineEdit::textEdited, d, &ElaColorDialogPrivate::onColorEditChanged);
QHBoxLayout* secondEditLayout = new QHBoxLayout();
secondEditLayout->setContentsMargins(0, 0, 0, 0);
secondEditLayout->addSpacing(6);
secondEditLayout->addWidget(d->_secondEdit);
secondEditLayout->addWidget(d->_secondText);
secondEditLayout->addStretch();
// B或V
d->_thridEdit = new ElaLineEdit(this);
d->_thridEdit->setText("0");
d->_thridEdit->setFixedSize(120, 33);
d->_thridEdit->setValidator(new ElaIntValidator(0, 255, this));
d->_thridText = new ElaText("蓝色", this);
d->_thridText->setTextPixelSize(13);
connect(d->_thridEdit, &ElaLineEdit::textEdited, d, &ElaColorDialogPrivate::onColorEditChanged);
QHBoxLayout* thridEditLayout = new QHBoxLayout();
thridEditLayout->setContentsMargins(0, 0, 0, 0);
thridEditLayout->addSpacing(6);
thridEditLayout->addWidget(d->_thridEdit);
thridEditLayout->addWidget(d->_thridText);
thridEditLayout->addStretch();
QVBoxLayout* paramControlLayout = new QVBoxLayout();
paramControlLayout->setContentsMargins(0, 0, 0, 0);
paramControlLayout->setSpacing(10);
paramControlLayout->addLayout(htmlEditLayout);
paramControlLayout->addWidget(d->_modeComboBox);
paramControlLayout->addLayout(firstEditLayout);
paramControlLayout->addLayout(secondEditLayout);
paramControlLayout->addLayout(thridEditLayout);
paramControlLayout->addStretch();
QHBoxLayout* colorControlLayout = new QHBoxLayout();
colorControlLayout->setSpacing(0);
colorControlLayout->setContentsMargins(0, 0, 0, 0);
colorControlLayout->addLayout(colorPickerLayout);
colorControlLayout->addSpacing(5);
colorControlLayout->addLayout(colorPreviewLayout);
colorControlLayout->addSpacing(20);
colorControlLayout->addLayout(colorValueSliderLayout);
colorControlLayout->addSpacing(10);
colorControlLayout->addLayout(paramControlLayout);
colorControlLayout->addStretch();
// 基本颜色
d->_basicColorView = new ElaBaseListView(this);
d->_basicColorView->setFixedSize(380, 170);
d->_basicColorView->setSelectionMode(QListView::NoSelection);
d->_basicColorView->setFlow(QListView::LeftToRight);
d->_basicColorView->setViewMode(QListView::IconMode);
d->_basicColorView->setResizeMode(QListView::Adjust);
d->_basicColorModel = new ElaColorDisplayModel(this);
d->_basicColorView->setModel(d->_basicColorModel);
d->_basicColorDelegate = new ElaColorDisplayDelegate(this);
d->_basicColorView->setItemDelegate(d->_basicColorDelegate);
d->_initBasicColor();
connect(d->_basicColorView, &ElaBaseListView::clicked, d, &ElaColorDialogPrivate::onBasicColorViewClicked);
ElaText* basicColorViewText = new ElaText("基本颜色", this);
basicColorViewText->setTextPixelSize(14);
QVBoxLayout* basicColorLayout = new QVBoxLayout();
basicColorLayout->setContentsMargins(3, 0, 0, 0);
basicColorLayout->addWidget(basicColorViewText);
basicColorLayout->addSpacing(15);
basicColorLayout->addWidget(d->_basicColorView);
basicColorLayout->addStretch();
// 自定义颜色
d->_customColorView = new ElaBaseListView(this);
d->_customColorView->setFixedSize(200, 170);
d->_customColorView->setSelectionMode(QListView::SingleSelection);
d->_customColorView->setFlow(QListView::LeftToRight);
d->_customColorView->setViewMode(QListView::IconMode);
d->_customColorView->setResizeMode(QListView::Adjust);
d->_customColorModel = new ElaColorDisplayModel(this);
d->_customColorView->setModel(d->_customColorModel);
d->_customColorDelegate = new ElaColorDisplayDelegate(this);
d->_customColorView->setItemDelegate(d->_customColorDelegate);
d->_initCustomColor();
connect(d->_customColorView, &ElaBaseListView::clicked, d, &ElaColorDialogPrivate::onCustomColorViewClicked);
// 增加移除按钮
d->_addCustomColorButton = new ElaToolButton(this);
d->_addCustomColorButton->setIsTransparent(false);
d->_addCustomColorButton->setElaIcon(ElaIconType::Plus);
connect(d->_addCustomColorButton, &ElaToolButton::clicked, d, &ElaColorDialogPrivate::onAddCustomColorButtonClicked);
d->_removeCustomColorButton = new ElaToolButton(this);
d->_removeCustomColorButton->setIsTransparent(false);
d->_removeCustomColorButton->setElaIcon(ElaIconType::Minus);
connect(d->_removeCustomColorButton, &ElaToolButton::clicked, d, &ElaColorDialogPrivate::onRemoveCustomColorButtonClicked);
ElaText* customColorViewText = new ElaText("自定义颜色", this);
customColorViewText->setTextPixelSize(14);
QHBoxLayout* customButtonLayout = new QHBoxLayout();
customButtonLayout->setContentsMargins(0, 0, 0, 0);
customButtonLayout->addWidget(customColorViewText);
customButtonLayout->addSpacing(35);
customButtonLayout->addWidget(d->_addCustomColorButton);
customButtonLayout->addWidget(d->_removeCustomColorButton);
customButtonLayout->addStretch();
QVBoxLayout* customColorLayout = new QVBoxLayout();
customColorLayout->setContentsMargins(3, 0, 0, 0);
customColorLayout->addLayout(customButtonLayout);
customColorLayout->addSpacing(5);
customColorLayout->addWidget(d->_customColorView);
customColorLayout->addStretch();
QHBoxLayout* colorDisplayLayout = new QHBoxLayout();
colorDisplayLayout->setContentsMargins(0, 0, 0, 0);
colorDisplayLayout->addLayout(basicColorLayout);
colorDisplayLayout->addLayout(customColorLayout);
colorDisplayLayout->addStretch();
// 确定取消按钮
d->_overButton = new ElaPushButton("确定", this);
d->_overButton->setBorderRadius(6);
d->_overButton->setLightDefaultColor(ElaThemeColor(ElaThemeType::Light, PrimaryNormal));
d->_overButton->setLightHoverColor(ElaThemeColor(ElaThemeType::Light, PrimaryHover));
d->_overButton->setLightPressColor(ElaThemeColor(ElaThemeType::Light, PrimaryPress));
d->_overButton->setLightTextColor(Qt::white);
d->_overButton->setDarkDefaultColor(ElaThemeColor(ElaThemeType::Dark, PrimaryNormal));
d->_overButton->setDarkHoverColor(ElaThemeColor(ElaThemeType::Dark, PrimaryHover));
d->_overButton->setDarkPressColor(ElaThemeColor(ElaThemeType::Dark, PrimaryPress));
d->_overButton->setDarkTextColor(Qt::white);
connect(d->_overButton, &ElaPushButton::clicked, this, [=]() {
Q_EMIT colorSelected(d->_pCurrentColor);
close();
});
d->_cancelButton = new ElaPushButton("取消", this);
d->_cancelButton->setBorderRadius(6);
connect(d->_cancelButton, &ElaPushButton::clicked, this, [=]() {
close();
});
QHBoxLayout* buttonLayout = new QHBoxLayout();
buttonLayout->setContentsMargins(0, 0, 0, 0);
buttonLayout->addWidget(d->_overButton);
buttonLayout->addWidget(d->_cancelButton);
QVBoxLayout* mainLayout = new QVBoxLayout(this);
mainLayout->setContentsMargins(20, 10, 11, 20);
mainLayout->addLayout(colorPickerTextLayout);
mainLayout->addSpacing(3);
mainLayout->addLayout(colorControlLayout);
mainLayout->addSpacing(80);
mainLayout->addLayout(colorDisplayLayout);
mainLayout->addLayout(buttonLayout);
mainLayout->addStretch();
d->_themeMode = eTheme->getThemeMode();
connect(eTheme, &ElaTheme::themeModeChanged, this, [=](ElaThemeType::ThemeMode themeMode) {
d->_themeMode = themeMode;
});
setCurrentColor(QColor(0x80, 0xFF, 0xEF));
}
ElaColorDialog::~ElaColorDialog()
{
Q_D(ElaColorDialog);
delete d->_colorValueSlider->style();
}
void ElaColorDialog::setCurrentColor(QColor currentColor)
{
Q_D(ElaColorDialog);
d->_pCurrentColor = currentColor.toHsv();
d->_updateHtmlEditValue();
d->_updateEditValue();
d->_updateColorPreview();
d->_updateColorValueSlider();
d->_colorPicker->setSelectedColor(d->_pCurrentColor);
Q_EMIT pCurrentColorChanged();
}
QColor ElaColorDialog::getCurrentColor() const
{
Q_D(const ElaColorDialog);
return d->_pCurrentColor;
}
QList<QColor> ElaColorDialog::getCustomColorList() const
{
Q_D(const ElaColorDialog);
return d->_customColorModel->getDisplayColorList();
}
QColor ElaColorDialog::getCustomColor(int index) const
{
Q_D(const ElaColorDialog);
return d->_customColorModel->getDisplayColor(index);
}
QString ElaColorDialog::getCurrentColorRGB() const
{
Q_D(const ElaColorDialog);
return d->_getHexRgbValue();
}
void ElaColorDialog::paintEvent(QPaintEvent* event)
{
Q_D(ElaColorDialog);
QPainter painter(this);
painter.save();
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::NoPen);
// 背景绘制
painter.setBrush(ElaThemeColor(d->_themeMode, DialogBase));
painter.drawRect(rect());
// 按钮背景绘制
painter.setBrush(ElaThemeColor(d->_themeMode, DialogLayoutArea));
painter.drawRect(QRect(0, height() - 78, width(), 78));
painter.restore();
QDialog::paintEvent(event);
}