]> git.cworth.org Git - apitrace/blob - gui/settingsdialog.cpp
Implement showing only of events specified by a regexp.
[apitrace] / gui / settingsdialog.cpp
1 #include "settingsdialog.h"
2
3 #include <QMessageBox>
4
5 SettingsDialog::SettingsDialog(QWidget *parent)
6     : QDialog(parent),
7       m_filter(0)
8 {
9     setupUi(this);
10
11     m_showFilters.insert(
12         tr("Draw events"),
13         QRegExp("glDraw|glVertex|glBegin|glEnd"));
14     m_showFilters.insert(
15         tr("Texture events"),
16         QRegExp("glTex|glBindTex|glBegin|glEnd"));
17
18     QMap<QString, QRegExp>::const_iterator itr;
19     for (itr = m_showFilters.constBegin();
20          itr != m_showFilters.constEnd(); ++itr) {
21         showFilterCB->addItem(itr.key(), itr.value());
22     }
23     showFilterCB->addItem(tr("Custom"), QRegExp());
24
25     connect(showFilterCB, SIGNAL(currentIndexChanged(const QString &)),
26             SLOT(changeRegexp(const QString&)));
27     connect(showFilterEdit, SIGNAL(textEdited(const QString &)),
28             SLOT(regexpChanged(const QString&)));
29
30     showFilterCB->setCurrentIndex(0);
31     showFilterEdit->setText(m_showFilters.constBegin().value().pattern());
32 }
33
34 void SettingsDialog::filtersFromModel(const ApiTraceFilter *model)
35 {
36     ApiTraceFilter::FilterOptions opts = model->filterOptions();
37     extensionsBox->setChecked(opts & ApiTraceFilter::ExtensionsFilter);
38     functionsBox->setChecked(opts & ApiTraceFilter::ResolutionsFilter);
39     errorsBox->setChecked(opts & ApiTraceFilter::ErrorsQueryFilter);
40     statesBox->setChecked(opts & ApiTraceFilter::ExtraStateFilter);
41
42     QRegExp regexp = model->filterRegexp();
43     if (regexp.isEmpty()) {
44         showFilterBox->setChecked(false);
45     } else {
46         showFilterBox->setChecked(true);
47         QMap<QString, QRegExp>::const_iterator itr;
48         int i = 0;
49         for (itr = m_showFilters.constBegin();
50              itr != m_showFilters.constEnd(); ++itr, ++i) {
51             if (itr.value() == regexp) {
52                 showFilterCB->setCurrentIndex(i);
53                 showFilterEdit->setText(itr.value().pattern());
54                 return;
55             }
56         }
57         /* custom filter */
58         showFilterCB->setCurrentIndex(m_showFilters.count());
59         showFilterEdit->setText(regexp.pattern());
60     }
61 }
62
63 void SettingsDialog::filtersToModel(ApiTraceFilter *model)
64 {
65     ApiTraceFilter::FilterOptions opts = ApiTraceFilter::NullFilter;
66     if (extensionsBox->isChecked())
67         opts |= ApiTraceFilter::ExtensionsFilter;
68     if (functionsBox->isChecked())
69         opts |= ApiTraceFilter::ResolutionsFilter;
70     if (errorsBox->isChecked())
71         opts |= ApiTraceFilter::ErrorsQueryFilter;
72     if (statesBox->isChecked())
73         opts |= ApiTraceFilter::ExtraStateFilter;
74     m_filter->setFilterOptions(opts);
75     if (showFilterBox->isChecked()) {
76         m_filter->setFilterRegexp(QRegExp(showFilterEdit->text()));
77     } else {
78         m_filter->setFilterRegexp(QRegExp());
79     }
80 }
81
82 void SettingsDialog::accept()
83 {
84     if (showFilterBox->isChecked()) {
85         QRegExp regexp(showFilterEdit->text());
86         if (!regexp.isValid()) {
87             QMessageBox::warning(
88                 this,
89                 tr("Invalid Regexp"),
90                 tr("The currently set regular expression "
91                    "for filtering events is invalid."));
92             return;
93         }
94     }
95     filtersToModel(m_filter);
96     QDialog::accept();
97 }
98
99 void SettingsDialog::changeRegexp(const QString &name)
100 {
101     showFilterEdit->setText(m_showFilters[name].pattern());
102 }
103
104 void SettingsDialog::regexpChanged(const QString &pattern)
105 {
106     int customIndex = m_showFilters.count();
107     if (showFilterCB->currentIndex() != customIndex) {
108         showFilterCB->blockSignals(true);
109         showFilterCB->setCurrentIndex(customIndex);
110         showFilterCB->blockSignals(false);
111     }
112 }
113
114 void SettingsDialog::setFilterModel(ApiTraceFilter *filter)
115 {
116     m_filter = filter;
117     filtersFromModel(m_filter);
118 }
119
120 #include "settingsdialog.moc"