Files
cbh/ElaWidgetTools/private/ElaMultiSelectComboBoxPrivate.cpp
2025-09-20 01:41:33 +08:00

72 lines
2.6 KiB
C++

#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);
}
}