}
}
bitmasks.clear();
+
+ next_call_no = 0;
}
std::cerr << "error: unknown event " << c << "\n";
exit(1);
case -1:
- for (CallList::iterator it = calls.begin(); it != calls.end(); ++it) {
- std::cerr << "warning: incomplete call " << (*it)->name() << "\n";
- std::cerr << **it << "\n";
+ if (!calls.empty()) {
+ Call *call = calls.front();
+ std::cerr << call->no << ": warning: incomplete call " << call->name() << "\n";
+ calls.pop_front();
+ return call;
}
return NULL;
}
{
if (m_fileName != name) {
m_fileName = name;
+ m_tempFileName = QString();
m_frames.clear();
m_errors.clear();
m_editedCalls.clear();
+ m_queuedErrors.clear();
m_needsSaving = false;
emit invalidated();
QString m_tempFileName;
QList<ApiTraceFrame*> m_frames;
- QVector<ApiTraceCall*> m_calls;
FrameMarker m_frameMarker;
return false;
}
+ if (m_filters & CustomFilter) {
+ return !function.contains(m_customRegexp);
+ }
+
return true;
}
return m_regexp;
}
+void ApiTraceFilter::setCustomFilterRegexp(const QString &str)
+{
+ m_customRegexp = QRegExp(str);
+}
+
+QString ApiTraceFilter::customFilterRegexp() const
+{
+ return m_customRegexp.pattern();
+}
+
#include "apitracefilter.moc"
Q_OBJECT
public:
enum FilterOption {
- NullFilter = 0,
+ NullFilter = 0,
ExtensionsFilter = 1 << 0,
ResolutionsFilter = 1 << 1,
ErrorsQueryFilter = 1 << 2,
ExtraStateFilter = 1 << 3,
+ CustomFilter = 1 << 4,
};
Q_DECLARE_FLAGS(FilterOptions, FilterOption)
public:
void setFilterRegexp(const QRegExp ®exp);
QRegExp filterRegexp() const;
+ void setCustomFilterRegexp(const QString &str);
+ QString customFilterRegexp() const;
+
QModelIndex indexForCall(ApiTraceCall *call) const;
protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
private:
QRegExp m_regexp;
FilterOptions m_filters;
+ QRegExp m_customRegexp;
};
#endif
d_ptr->highlighter->mark(str, sens);
}
+void GLSLEdit::indent()
+{
+ QTemporaryFile file(QLatin1String("shader.glsl"));
+ if (!file.open()) {
+ qDebug()<<"Couldn't create temporary file "<<file.fileName();
+ return;
+ }
+ file.write(toPlainText().toUtf8());
+ file.flush();
+
+ QString tempFileName =
+ QDir::toNativeSeparators(QFileInfo(file).canonicalFilePath());
+
+ QProcess astyle;
+ astyle.setStandardInputFile(tempFileName);
+ astyle.start("astyle");
+ if (!astyle.waitForStarted()) {
+ qDebug()<<"Couldn't start the 'astyle' process!";
+ return;
+ }
+
+ if (!astyle.waitForFinished()) {
+ qDebug()<<"Couldn't finish the 'astyle' process";
+ return;
+ }
+
+ QByteArray result = astyle.readAll();
+ setPlainText(QString::fromUtf8(result));
+}
+
+void GLSLEdit::contextMenuEvent(QContextMenuEvent *e)
+{
+ QMenu *menu = createStandardContextMenu();
+
+ menu->addAction(tr("Indent Code"), this, SLOT(indent()));
+
+ menu->exec(e->globalPos());
+ delete menu;
+}
+
#include "glsledit.moc"
void fold(int line);
void unfold(int line);
void toggleFold(int line);
+ void indent();
protected:
- void resizeEvent(QResizeEvent *e);
- void wheelEvent(QWheelEvent *e);
+ virtual void resizeEvent(QResizeEvent *e);
+ virtual void wheelEvent(QWheelEvent *e);
+ virtual void contextMenuEvent(QContextMenuEvent *e);
+
private slots:
void updateCursor();
#include "imageviewer.h"
+#include <QDesktopWidget>
#include <QPainter>
#include <QPixmap>
+#include <QScrollBar>
ImageViewer::ImageViewer(QWidget *parent)
: QDialog(parent)
void ImageViewer::setImage(const QImage &image)
{
+ m_image = image;
QPixmap px = QPixmap::fromImage(image);
imageLabel->setPixmap(px);
+ updateGeometry();
+}
+
+QSize ImageViewer::sizeHint() const
+{
+ QSize size;
+
+ int vScrollWidth = scrollArea->verticalScrollBar() ?
+ scrollArea->verticalScrollBar()->width() : 0;
+ int hScrollHeight = scrollArea->horizontalScrollBar() ?
+ scrollArea->horizontalScrollBar()->height() : 0;
+ QSize optimalWindowSize(m_image.width() + vScrollWidth,
+ m_image.height() + hScrollHeight);
+
+ QRect screenRect = QApplication::desktop()->availableGeometry();
+ const float maxPercentOfDesktopSpace = 0.8;
+ QSize maxAvailableSize(maxPercentOfDesktopSpace * screenRect.width(),
+ maxPercentOfDesktopSpace * screenRect.height());
+
+ return QSize(qMin(optimalWindowSize.width(), maxAvailableSize.width()),
+ qMin(optimalWindowSize.height(), maxAvailableSize.height()));
}
#include "imageviewer.moc"
ImageViewer(QWidget *parent = 0);
void setImage(const QImage &image);
+
+ QSize sizeHint() const;
+private:
+ QImage m_image;
};
QImage img = var.value<QImage>();
viewer->setImage(img);
- QRect screenRect = QApplication::desktop()->availableGeometry();
- viewer->resize(qMin(int(0.75 * screenRect.width()), img.width()) + 40,
- qMin(int(0.75 * screenRect.height()), img.height()) + 40);
viewer->show();
viewer->raise();
viewer->activateWindow();
functionsBox->setChecked(opts & ApiTraceFilter::ResolutionsFilter);
errorsBox->setChecked(opts & ApiTraceFilter::ErrorsQueryFilter);
statesBox->setChecked(opts & ApiTraceFilter::ExtraStateFilter);
+ customBox->setChecked(opts & ApiTraceFilter::CustomFilter);
+ QString customFilter = model->customFilterRegexp();
+ if (!customFilter.isEmpty()) {
+ customEdit->setText(customFilter);
+ } else {
+ //Add a common default
+ QLatin1String str("glXMakeContextCurrent");
+ customEdit->setText(str);
+ }
QRegExp regexp = model->filterRegexp();
if (regexp.isEmpty()) {
void SettingsDialog::filtersToModel(ApiTraceFilter *model)
{
ApiTraceFilter::FilterOptions opts = ApiTraceFilter::NullFilter;
- if (extensionsBox->isChecked())
+ if (extensionsBox->isChecked()) {
opts |= ApiTraceFilter::ExtensionsFilter;
- if (functionsBox->isChecked())
+ }
+ if (functionsBox->isChecked()) {
opts |= ApiTraceFilter::ResolutionsFilter;
- if (errorsBox->isChecked())
+ }
+ if (errorsBox->isChecked()) {
opts |= ApiTraceFilter::ErrorsQueryFilter;
- if (statesBox->isChecked())
+ }
+ if (statesBox->isChecked()) {
opts |= ApiTraceFilter::ExtraStateFilter;
+ }
+ if (customBox->isChecked()) {
+ opts |= ApiTraceFilter::CustomFilter;
+ m_filter->setCustomFilterRegexp(customEdit->text());
+ }
m_filter->setFilterOptions(opts);
if (showFilterBox->isChecked()) {
m_filter->setFilterRegexp(QRegExp(showFilterEdit->text()));
return;
}
}
+ if (customBox->isChecked()) {
+ QRegExp regexp(customEdit->text());
+ if (!regexp.isValid()) {
+ QMessageBox::warning(
+ this,
+ tr("Invalid Regexp"),
+ tr("The currently set regular expression "
+ "for custom events is invalid."));
+ return;
+ }
+ }
filtersToModel(m_filter);
QDialog::accept();
}
loadHelpFile();
}
+ if (!m_frameBookmarks.isEmpty()) {
+ qDeleteAll(m_signatures);
+ qDeleteAll(m_enumSignatures);
+ m_signatures.clear();
+ m_enumSignatures.clear();
+ m_frameBookmarks.clear();
+ m_createdFrames.clear();
+ m_parser.close();
+ }
+
if (!m_parser.open(filename.toLatin1())) {
qDebug() << "error: failed to open " << filename;
return;
//Load the entire file into memory
parseTrace();
}
-
emit finishedParsing();
}
private:
Trace::Parser m_parser;
- QString m_fileName;
ApiTrace::FrameMarker m_frameMarker;
typedef QMap<int, FrameBookmark> FrameBookmarks;
<ui version="4.0">
<class>Settings</class>
<widget class="QDialog" name="Settings">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
- <width>438</width>
- <height>333</height>
+ <width>571</width>
+ <height>334</height>
</rect>
</property>
<property name="windowTitle">
<property name="title">
<string>Hidden Events</string>
</property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QCheckBox" name="extensionsBox">
- <property name="text">
- <string>Extension queries</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QCheckBox" name="functionsBox">
- <property name="text">
- <string>Function resolution</string>
- </property>
- </widget>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QCheckBox" name="extensionsBox">
+ <property name="text">
+ <string>Extension queries</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="functionsBox">
+ <property name="text">
+ <string>Function resolution</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
- <item row="1" column="0">
- <widget class="QCheckBox" name="errorsBox">
- <property name="text">
- <string>Error queries</string>
- </property>
- </widget>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QCheckBox" name="errorsBox">
+ <property name="text">
+ <string>Error queries</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="statesBox">
+ <property name="text">
+ <string>Extra state queries</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
- <item row="1" column="1">
- <widget class="QCheckBox" name="statesBox">
- <property name="text">
- <string>Extra state queries</string>
- </property>
- </widget>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QCheckBox" name="customBox">
+ <property name="text">
+ <string>Custom</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="customEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
</layout>
</widget>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
+ <x>252</x>
+ <y>329</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
+ <x>320</x>
+ <y>329</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
</hint>
</hints>
</connection>
+ <connection>
+ <sender>customBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>customEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>63</x>
+ <y>151</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>107</x>
+ <y>151</y>
+ </hint>
+ </hints>
+ </connection>
</connections>
</ui>