File: CheckableItemComboBox.cpp

package info (click to toggle)
wsjtx 2.3.0%2Brepack-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 63,524 kB
  • sloc: cpp: 59,051; f90: 34,130; python: 27,241; ansic: 11,205; fortran: 2,051; sh: 132; makefile: 109
file content (93 lines) | stat: -rw-r--r-- 2,718 bytes parent folder | download | duplicates (2)
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
83
84
85
86
87
88
89
90
91
92
93
#include "CheckableItemComboBox.hpp"

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

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 "widgets/moc_CheckableItemComboBox.cpp"