feat: 添加ElaWidgetTool库
This commit is contained in:
343
ElaWidgetTools/ElaColorDialog.cpp
Normal file
343
ElaWidgetTools/ElaColorDialog.cpp
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user