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