| 24 | using namespace KDevelop; |
| 25 | |
| 26 | ProjectFilterConfigPage::ProjectFilterConfigPage(ProjectFilterProvider* provider, const ProjectConfigOptions& options, QWidget* parent) |
| 27 | : ProjectConfigPage<ProjectFilterSettings>(provider, options, parent) |
| 28 | , m_model(new FilterModel(this)) |
| 29 | , m_projectFilterProvider(provider) |
| 30 | , m_ui(new Ui::ProjectFilterSettings) |
| 31 | { |
| 32 | m_ui->setupUi(this); |
| 33 | |
| 34 | m_ui->messageWidget->hide(); |
| 35 | |
| 36 | m_ui->filters->setSelectionMode(QAbstractItemView::SingleSelection); |
| 37 | m_ui->filters->setModel(m_model); |
| 38 | m_ui->filters->setRootIsDecorated(false); |
| 39 | m_ui->filters->header()->setSectionResizeMode(FilterModel::Pattern, QHeaderView::Stretch); |
| 40 | m_ui->filters->header()->setSectionResizeMode(FilterModel::Targets, QHeaderView::ResizeToContents); |
| 41 | m_ui->filters->header()->setSectionResizeMode(FilterModel::Inclusive, QHeaderView::ResizeToContents); |
| 42 | m_ui->filters->setItemDelegateForColumn(FilterModel::Targets, |
| 43 | new ComboBoxDelegate(QVector<ComboBoxDelegate::Item>{ |
| 44 | {i18nc("@item", "Files"), static_cast<int>(Filter::Files)}, |
| 45 | {i18nc("@item", "Folders"), static_cast<int>(Filter::Folders)}, |
| 46 | {i18nc("@item", "Files and Folders"), static_cast<int>(Filter::Folders | Filter::Files)}} |
| 47 | , this)); |
| 48 | m_ui->filters->setItemDelegateForColumn(FilterModel::Inclusive, |
| 49 | new ComboBoxDelegate(QVector<ComboBoxDelegate::Item>{ |
| 50 | {i18nc("@item", "Exclude"), false}, |
| 51 | {i18nc("@item", "Include"), true}} |
| 52 | , this)); |
| 53 | m_ui->filters->installEventFilter(this); |
| 54 | m_ui->filters->setDragEnabled(true); |
| 55 | m_ui->filters->setDragDropMode(QAbstractItemView::InternalMove); |
| 56 | m_ui->filters->setAutoScroll(true); |
| 57 | |
| 58 | reset(); |
| 59 | selectionChanged(); |
| 60 | |
| 61 | connect(m_ui->filters->selectionModel(), &QItemSelectionModel::currentChanged, |
| 62 | this, &ProjectFilterConfigPage::selectionChanged); |
| 63 | connect(this, &ProjectFilterConfigPage::changed, this, &ProjectFilterConfigPage::selectionChanged); |
| 64 | |
| 65 | connect(m_model, &FilterModel::modelReset, this, &ProjectFilterConfigPage::checkFiltersAndEmitChanged); |
| 66 | connect(m_model, &FilterModel::dataChanged, this, &ProjectFilterConfigPage::checkFiltersAndEmitChanged); |
| 67 | connect(m_model, &FilterModel::rowsRemoved, this, &ProjectFilterConfigPage::checkFiltersAndEmitChanged); |
| 68 | // Don't recheck filters when a row is: |
| 69 | // 1. Inserted - because existing errors remain. And if there were no errors, a new |
| 70 | // empty-pattern error would be shown - annoyingly and uselessly - on each insertion, before |
| 71 | // the user had a chance to enter a new pattern. |
| 72 | // 2. Moved - because neither existing errors disappear nor new ones appear after this operation. |
| 73 | // When there are multiple errors, the row order determines which error message is shown. |
| 74 | // But the message choice in this corner case is not important enough to recheck all filters. |
| 75 | connect(m_model, &FilterModel::rowsInserted, this, &ProjectFilterConfigPage::changed); |
| 76 | connect(m_model, &FilterModel::rowsMoved, this, &ProjectFilterConfigPage::changed); |
| 77 | |
| 78 | connect(m_ui->add, &QPushButton::clicked, this, &ProjectFilterConfigPage::add); |
| 79 | connect(m_ui->remove, &QPushButton::clicked, this, &ProjectFilterConfigPage::remove); |
| 80 | connect(m_ui->moveUp, &QPushButton::clicked, this, &ProjectFilterConfigPage::moveUp); |
| 81 | connect(m_ui->moveDown, &QPushButton::clicked, this, &ProjectFilterConfigPage::moveDown); |
| 82 | } |
| 83 | |