summaryrefslogtreecommitdiffstats
path: root/itemselectionwidget.cpp
blob: 08904f7fdade1b2de6a3b7234abe4c468ba2f921 (plain)
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
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
#include <QStandardItemModel>
#include <QSortFilterProxyModel>
#include <QTreeView>
#include <QFileDialog>
#include <QDir>

#include "itemselectionwidget.h"

ItemSelectionWidget::ItemSelectionWidget(int mode, QString labelText, QWidget *parent) : QWidget(parent) {
    QHBoxLayout *newItemL = new QHBoxLayout;
    newItemL->addWidget(new QLabel(labelText));
    mItem = new QLineEdit;
    newItemL->addWidget(mItem);
    mModel = new QStandardItemModel;
    QSortFilterProxyModel *proxy = new QSortFilterProxyModel(this);
    proxy->setSourceModel(mModel);
    mView = new QTreeView;
    mView->setModel(proxy);
    mView->setSortingEnabled(true);
    mView->sortByColumn(0, Qt::AscendingOrder);
    mView->setHeaderHidden(true);
    if(mode == Directories){
        QPushButton *browseBtn = new QPushButton(tr("Browse..."));
        connect(browseBtn, &QPushButton::clicked, this, &ItemSelectionWidget::browseDir);
        newItemL->addWidget(browseBtn);
        mIcon = QIcon(":/folder.png");
    }else{
        mIcon = QIcon(":/curlybrackets.png");
    }
    QPushButton *addBtn = new QPushButton(tr("Add"));
    connect(addBtn, &QPushButton::clicked, this, &ItemSelectionWidget::addItem);
    QPushButton *removeBtn = new QPushButton(tr("Remove"));
    connect(removeBtn, &QPushButton::clicked, this, &ItemSelectionWidget::removeItem);
    QHBoxLayout *addRemL = new QHBoxLayout;
    addRemL->addStretch();
    addRemL->addWidget(addBtn);
    addRemL->addWidget(removeBtn);
    connect(mView->selectionModel(), &QItemSelectionModel::currentChanged, this, [=](const QModelIndex &cur) { mItem->setText(cur.data().toString()); });
    QVBoxLayout *newDirTabL = new QVBoxLayout;
    newDirTabL->addLayout(newItemL);
    newDirTabL->addLayout(addRemL);
    newDirTabL->addWidget(mView);
    setLayout(newDirTabL);
}

const QStringList ItemSelectionWidget::items() const {
    QStringList retval;
    for(int i = 0; i < mModel->rowCount(); ++i){
        QStandardItem *item = mModel->item(i, 0);
        retval << item->text();
    }
    return retval;
}

void ItemSelectionWidget::setItems(const QStringList &items){
    mModel->clear();
    for(const QString &d : items){
        QStandardItem *newDir = new QStandardItem(mIcon, d);
        mModel->appendRow(newDir);
    }
}

void ItemSelectionWidget::browseDir(){
    QString dir = QFileDialog::getExistingDirectory(this, tr("Select Directory"), QDir::homePath());
    mItem->setText(QDir::toNativeSeparators(dir));
}

void ItemSelectionWidget::addItem(){
    QString item = mItem->text();
    QList<QStandardItem*> search = mModel->findItems(item);
    if(search.isEmpty()){
        QStandardItem *newDir = new QStandardItem(mIcon, item);
        mModel->appendRow(newDir);
    }
}

void ItemSelectionWidget::removeItem(){
    QString item = mItem->text();
    QList<QStandardItem*> search = mModel->findItems(item);
    if(!search.isEmpty()){
        mModel->removeRow(search.first()->row());
    }
}