File: CheckableItemComboBox.cpp

package info (click to toggle)
js8call 2.5.2%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 24,720 kB
  • sloc: cpp: 562,651; sh: 898; python: 132; ansic: 102; makefile: 4
file content (82 lines) | stat: -rw-r--r-- 2,864 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "CheckableItemComboBox.h"

#include <QEvent>
#include <QLineEdit>
#include <QListView>
#include <QStandardItem>
#include <QStandardItemModel>
#include <QStyledItemDelegate>

class CheckableItemComboBoxStyledItemDelegate : public QStyledItemDelegate {
  public:
    explicit CheckableItemComboBoxStyledItemDelegate(QObject *parent = nullptr)
        : QStyledItemDelegate{parent} {}

    void paint(QPainter *painter, QStyleOptionViewItem const &option,
               QModelIndex const &index) const override {
        QStyleOptionViewItem &mutable_option =
            const_cast<QStyleOptionViewItem &>(option);
        mutable_option.showDecorationSelected = false;
        QStyledItemDelegate::paint(painter, mutable_option, index);
    }
};

CheckableItemComboBox::CheckableItemComboBox(QWidget *parent)
    : LazyFillComboBox{parent}, model_{new QStandardItemModel()} {
    setModel(model_.data());

    setEditable(true);
    lineEdit()->setReadOnly(true);
    lineEdit()->installEventFilter(this);
    setItemDelegate(new CheckableItemComboBoxStyledItemDelegate{this});

    connect(lineEdit(), &QLineEdit::selectionChanged, lineEdit(),
            &QLineEdit::deselect);
    connect(static_cast<QListView *>(view()), &QListView::pressed, this,
            &CheckableItemComboBox::item_pressed);
    connect(model_.data(), &QStandardItemModel::dataChanged, this,
            &CheckableItemComboBox::model_data_changed);
}

QStandardItem *CheckableItemComboBox::addCheckItem(QString const &label,
                                                   QVariant const &data,
                                                   Qt::CheckState checkState) {
    auto *item = new QStandardItem{label};
    item->setCheckState(checkState);
    item->setData(data);
    item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
    model_->appendRow(item);
    update_text();
    return item;
}

bool CheckableItemComboBox::eventFilter(QObject *object, QEvent *event) {
    if (object == lineEdit() && event->type() == QEvent::MouseButtonPress) {
        showPopup();
        return true;
    }
    return false;
}

void CheckableItemComboBox::update_text() {
    QString text;
    for (int i = 0; i < model_->rowCount(); ++i) {
        if (model_->item(i)->checkState() == Qt::Checked) {
            if (text.size()) {
                text += ", ";
            }
            text += model_->item(i)->data().toString();
        }
    }
    lineEdit()->setText(text);
}

void CheckableItemComboBox::model_data_changed() { update_text(); }

void CheckableItemComboBox::item_pressed(QModelIndex const &index) {
    QStandardItem *item = model_->itemFromIndex(index);
    item->setCheckState(item->checkState() == Qt::Checked ? Qt::Unchecked
                                                          : Qt::Checked);
}

#include "moc_CheckableItemComboBox.cpp"