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,92 @@
#include "ElaMultiSelectComboBoxPrivate.h"
#include <QPropertyAnimation>
#include "ElaComboBoxView.h"
#include "ElaMultiSelectComboBox.h"
ElaMultiSelectComboBoxPrivate::ElaMultiSelectComboBoxPrivate(QObject* parent)
: QObject{parent}
{
}
ElaMultiSelectComboBoxPrivate::~ElaMultiSelectComboBoxPrivate()
{
}
void ElaMultiSelectComboBoxPrivate::onItemPressed(const QModelIndex& index)
{
Q_Q(ElaMultiSelectComboBox);
if (!_comboView->selectionModel()->isSelected(index))
{
_itemSelection[index.row()] = true;
}
else
{
_itemSelection[index.row()] = false;
}
_refreshCurrentIndexs();
QPropertyAnimation* markAnimation = new QPropertyAnimation(this, "pExpandMarkWidth");
connect(markAnimation, &QPropertyAnimation::valueChanged, this, [=](const QVariant& value) {
q->update();
});
markAnimation->setDuration(300);
markAnimation->setEasingCurve(QEasingCurve::InOutSine);
markAnimation->setStartValue(_pExpandMarkWidth);
qreal step = (q->width() / 2 - _pBorderRadius) / q->count();
markAnimation->setEndValue(step * _selectedTextList.count());
markAnimation->start(QAbstractAnimation::DeleteWhenStopped);
}
void ElaMultiSelectComboBoxPrivate::_refreshCurrentIndexs()
{
Q_Q(ElaMultiSelectComboBox);
QString str;
_adjustSelectedVector();
QVector<bool> selectedIndexVector;
for (int i = 0; i < q->count(); i++)
{
// 该位选中
QModelIndex index = q->model()->index(i, 0);
if (_itemSelection[i])
{
_comboView->selectionModel()->select(index, QItemSelectionModel::Select | QItemSelectionModel::Rows);
if (!str.isEmpty())
{
str.append(",");
}
str.append(q->itemText(i));
selectedIndexVector.append(true);
}
else
{
_comboView->selectionModel()->select(index, QItemSelectionModel::Deselect);
selectedIndexVector.append(false);
}
}
if (str != _currentText)
{
q->update();
_currentText = str;
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
_selectedTextList = _currentText.split(",", Qt::SkipEmptyParts);
#else
_selectedTextList = _currentText.split(",");
if (_selectedTextList.count() == 1 && _selectedTextList[0].isEmpty())
{
_selectedTextList.clear();
}
#endif
q->setCurrentIndex(-1);
Q_EMIT q->itemSelectionChanged(selectedIndexVector);
Q_EMIT q->currentTextListChanged(_selectedTextList);
}
}
void ElaMultiSelectComboBoxPrivate::_adjustSelectedVector()
{
Q_Q(ElaMultiSelectComboBox);
while (_itemSelection.count() < q->count())
{
_itemSelection.append(false);
}
}