]> git.cworth.org Git - apitrace/blob - gui/settingsdialog.cpp
Use skiplist-based FastCallSet within trace::CallSet
[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     customBox->setChecked(opts & ApiTraceFilter::CustomFilter);
42     QString customFilter = model->customFilterRegexp();
43     if (!customFilter.isEmpty()) {
44         customEdit->setText(customFilter);
45     } else {
46         //Add a common default
47         QLatin1String str("glXMakeContextCurrent");
48         customEdit->setText(str);
49     }
50
51     QRegExp regexp = model->filterRegexp();
52     if (regexp.isEmpty()) {
53         showFilterBox->setChecked(false);
54     } else {
55         showFilterBox->setChecked(true);
56         QMap<QString, QRegExp>::const_iterator itr;
57         int i = 0;
58         for (itr = m_showFilters.constBegin();
59              itr != m_showFilters.constEnd(); ++itr, ++i) {
60             if (itr.value() == regexp) {
61                 showFilterCB->setCurrentIndex(i);
62                 showFilterEdit->setText(itr.value().pattern());
63                 return;
64             }
65         }
66         /* custom filter */
67         showFilterCB->setCurrentIndex(m_showFilters.count());
68         showFilterEdit->setText(regexp.pattern());
69     }
70 }
71
72 void SettingsDialog::filtersToModel(ApiTraceFilter *model)
73 {
74     ApiTraceFilter::FilterOptions opts = ApiTraceFilter::NullFilter;
75     if (extensionsBox->isChecked()) {
76         opts |= ApiTraceFilter::ExtensionsFilter;
77     }
78     if (functionsBox->isChecked()) {
79         opts |= ApiTraceFilter::ResolutionsFilter;
80     }
81     if (errorsBox->isChecked()) {
82         opts |= ApiTraceFilter::ErrorsQueryFilter;
83     }
84     if (statesBox->isChecked()) {
85         opts |= ApiTraceFilter::ExtraStateFilter;
86     }
87     if (customBox->isChecked()) {
88         opts |= ApiTraceFilter::CustomFilter;
89         m_filter->setCustomFilterRegexp(customEdit->text());
90     }
91     m_filter->setFilterOptions(opts);
92     if (showFilterBox->isChecked()) {
93         m_filter->setFilterRegexp(QRegExp(showFilterEdit->text()));
94     } else {
95         m_filter->setFilterRegexp(QRegExp());
96     }
97 }
98
99 void SettingsDialog::accept()
100 {
101     if (showFilterBox->isChecked()) {
102         QRegExp regexp(showFilterEdit->text());
103         if (!regexp.isValid()) {
104             QMessageBox::warning(
105                 this,
106                 tr("Invalid Regexp"),
107                 tr("The currently set regular expression "
108                    "for filtering events is invalid."));
109             return;
110         }
111     }
112     if (customBox->isChecked()) {
113         QRegExp regexp(customEdit->text());
114         if (!regexp.isValid()) {
115             QMessageBox::warning(
116                 this,
117                 tr("Invalid Regexp"),
118                 tr("The currently set regular expression "
119                    "for custom events is invalid."));
120             return;
121         }
122     }
123     filtersToModel(m_filter);
124     QDialog::accept();
125 }
126
127 void SettingsDialog::changeRegexp(const QString &name)
128 {
129     showFilterEdit->setText(m_showFilters[name].pattern());
130 }
131
132 void SettingsDialog::regexpChanged(const QString &pattern)
133 {
134     int customIndex = m_showFilters.count();
135     if (showFilterCB->currentIndex() != customIndex) {
136         showFilterCB->blockSignals(true);
137         showFilterCB->setCurrentIndex(customIndex);
138         showFilterCB->blockSignals(false);
139     }
140 }
141
142 void SettingsDialog::setFilterModel(ApiTraceFilter *filter)
143 {
144     m_filter = filter;
145     filtersFromModel(m_filter);
146 }
147
148 #include "settingsdialog.moc"