From c52d18a3319956aea59dfa6648c56ddd1df9414f Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Mon, 11 Apr 2011 00:15:07 -0400 Subject: [PATCH] Implement jumping to a specific call. --- gui/CMakeLists.txt | 2 + gui/apitracefilter.cpp | 7 +++ gui/apitracefilter.h | 2 + gui/apitracemodel.cpp | 19 ++++++++ gui/apitracemodel.h | 2 + gui/jumpwidget.cpp | 37 +++++++++++++++ gui/jumpwidget.h | 29 ++++++++++++ gui/mainwindow.cpp | 26 +++++++++++ gui/mainwindow.h | 5 +++ gui/qapitrace.qrc | 1 + gui/resources/dialog-close.png | Bin 0 -> 2085 bytes gui/ui/jumpwidget.ui | 80 +++++++++++++++++++++++++++++++++ gui/ui/mainwindow.ui | 2 +- 13 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 gui/jumpwidget.cpp create mode 100644 gui/jumpwidget.h create mode 100644 gui/resources/dialog-close.png create mode 100644 gui/ui/jumpwidget.ui diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 068ffa3..1ed291f 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -9,6 +9,7 @@ set(qapitrace_SRCS apitracefilter.cpp apitracemodel.cpp imageviewer.cpp + jumpwidget.cpp loaderthread.cpp mainwindow.cpp main.cpp @@ -25,6 +26,7 @@ qt4_add_resources(qapitrace_SRCS qapitrace.qrc) set(qapitrace_UIS ui/imageviewer.ui + ui/jumpwidget.ui ui/mainwindow.ui ui/retracerdialog.ui ui/settings.ui diff --git a/gui/apitracefilter.cpp b/gui/apitracefilter.cpp index 98ee1db..5c80450 100644 --- a/gui/apitracefilter.cpp +++ b/gui/apitracefilter.cpp @@ -89,4 +89,11 @@ void ApiTraceFilter::setFilterOptions(ApiTraceFilter::FilterOptions opts) } } +QModelIndex ApiTraceFilter::callIndex(int callNum) const +{ + ApiTraceModel *model = static_cast(sourceModel()); + QModelIndex index = model->callIndex(callNum); + return mapFromSource(index); +} + #include "apitracefilter.moc" diff --git a/gui/apitracefilter.h b/gui/apitracefilter.h index fa59397..2bd8557 100644 --- a/gui/apitracefilter.h +++ b/gui/apitracefilter.h @@ -22,6 +22,8 @@ public: void setFilterOptions(FilterOptions opts); void setFilterString(const QString &text); + + QModelIndex callIndex(int callNum) const; protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; diff --git a/gui/apitracemodel.cpp b/gui/apitracemodel.cpp index 63e54cf..39459ce 100644 --- a/gui/apitracemodel.cpp +++ b/gui/apitracemodel.cpp @@ -251,4 +251,23 @@ void ApiTraceModel::stateSetOnEvent(ApiTraceEvent *event) } } +QModelIndex ApiTraceModel::callIndex(int callNum) const +{ + ApiTraceCall *call = m_trace->callAt(callNum); + + if (!call) { + return QModelIndex(); + } + + ApiTraceFrame *frame = call->parentFrame; + Q_ASSERT(frame); + + int row = frame->calls.indexOf(call); + if (row < 0) { + qDebug() << "Couldn't find call num "< + +JumpWidget::JumpWidget(QWidget *parent ) + : QWidget(parent) +{ + m_ui.setupUi(this); + + connect(m_ui.jumpButton, SIGNAL(clicked()), + SLOT(slotJump())); + connect(m_ui.spinBox, SIGNAL(editingFinished()), + SLOT(slotJump())); + connect(m_ui.cancelButton, SIGNAL(clicked()), + SLOT(slotCancel())); +} + +void JumpWidget::slotJump() +{ + if (isVisible()) { + emit jumpTo(m_ui.spinBox->value()); + } + hide(); +} + +void JumpWidget::slotCancel() +{ + hide(); +} + +void JumpWidget::showEvent(QShowEvent *event) +{ + m_ui.spinBox->setFocus(Qt::ShortcutFocusReason); + return QWidget::showEvent(event); +} + +#include "jumpwidget.moc" diff --git a/gui/jumpwidget.h b/gui/jumpwidget.h new file mode 100644 index 0000000..40f8b9d --- /dev/null +++ b/gui/jumpwidget.h @@ -0,0 +1,29 @@ +#ifndef JUMPWIDGET_H +#define JUMPWIDGET_H + +#include "ui_jumpwidget.h" +#include + +class QShowEvent; + +class JumpWidget : public QWidget +{ + Q_OBJECT +public: + JumpWidget(QWidget *parent = 0); + +signals: + void jumpTo(int callNumber); + +private slots: + void slotJump(); + void slotCancel(); + +protected: + virtual void showEvent(QShowEvent *event); + +private: + Ui_JumpWidget m_ui; +}; + +#endif diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index e2d58b6..0ca51b8 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -6,6 +6,7 @@ #include "apitracemodel.h" #include "apitracefilter.h" #include "imageviewer.h" +#include "jumpwidget.h" #include "retracer.h" #include "settingsdialog.h" #include "shaderssourcewidget.h" @@ -21,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -493,6 +495,14 @@ void MainWindow::initObjects() m_ui.detailsWebView->page()->setLinkDelegationPolicy( QWebPage::DelegateExternalLinks); + + m_jumpWidget = new JumpWidget(this); + m_ui.centralLayout->addWidget(m_jumpWidget); + m_jumpWidget->hide(); + + + new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_G), + this, SLOT(slotGoTo())); } void MainWindow::initConnections() @@ -551,6 +561,9 @@ void MainWindow::initConnections() connect(m_ui.detailsWebView, SIGNAL(linkClicked(const QUrl&)), this, SLOT(openHelp(const QUrl&))); + + connect(m_jumpWidget, SIGNAL(jumpTo(int)), + SLOT(slotJumpTo(int))); } void MainWindow::replayStateFound(const ApiTraceState &state) @@ -564,4 +577,17 @@ void MainWindow::replayStateFound(const ApiTraceState &state) } } +void MainWindow::slotGoTo() +{ + m_jumpWidget->show(); +} + +void MainWindow::slotJumpTo(int callNum) +{ + QModelIndex index = m_proxyModel->callIndex(callNum); + if (index.isValid()) { + m_ui.callView->setCurrentIndex(index); + } +} + #include "mainwindow.moc" diff --git a/gui/mainwindow.h b/gui/mainwindow.h index be0c415..88017f6 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -13,6 +13,7 @@ class ApiTraceFrame; class ApiTraceModel; class ApiTraceState; class ImageViewer; +class JumpWidget; class QLineEdit; class QModelIndex; class QProgressBar; @@ -48,6 +49,8 @@ private slots: void openHelp(const QUrl &url); void showSurfacesMenu(const QPoint &pos); void showSelectedSurface(); + void slotGoTo(); + void slotJumpTo(int callNum); private: void initObjects(); @@ -78,6 +81,8 @@ private: VertexDataInterpreter *m_vdataInterpreter; ImageViewer *m_imageViewer; + + JumpWidget *m_jumpWidget; }; diff --git a/gui/qapitrace.qrc b/gui/qapitrace.qrc index 10311a9..c5fc6f7 100644 --- a/gui/qapitrace.qrc +++ b/gui/qapitrace.qrc @@ -1,6 +1,7 @@ resources/application-exit.png + resources/dialog-close.png resources/dialog-information.png resources/document-new.png resources/document-open.png diff --git a/gui/resources/dialog-close.png b/gui/resources/dialog-close.png new file mode 100644 index 0000000000000000000000000000000000000000..b049b6886af97b3720f372ad573a3f69c1f12f88 GIT binary patch literal 2085 zcmV+=2-^3FP)Zm*P4U6w0xYjrCE)Zf4oAAD7VF9^(1p$br4$U4ww!+!+cGT_b4 z&jz#k5yg+l156t?4F0tR3~&W1mm@Z2-d2DrB)K=~Ea zhhcZYaR?|8WHtBP!?l5EVh?&cAdi!=dKKh73IWm{bml^+!2N+0okxh3A z4ZXNV-!L2jBb{WR`!Y_|80wyUlC0y9>gd1~q9!g~N+}SLgj=41vDYS`JP6|_!fT}v zC`TMDT7Xum(L0o6($~Jjo6PvT(#)F4%P*rBn*T!mGHPIxqOdsG>)28 zYbn;4xr>?k$Y$ER6C#ZSxonco?l?~MR2Kf^m#F>#06~%9j13z|CK4EZeMHBOWq54B z2kRF>aAX3()$l?Ts!J)T2vAa2iWb!Aj$a_z*+KQv1{6gBpkzWdk?QH3_}d=(2l~-! z7qI*nub>5j6f1eAmBWueLb;(6GHskx3UhD}6AFkEv;`+B>QJ;>s%`$|g-ES~H8TL^rFS-!+Q7>vRiyA6m;;Gesp9W?MT( zB8dxFfB`rV{|CI|1C&OX;{(3{8sLk9s#!QgorD!1GsXpIIkbcQhQXSjZ@VI*R-{tE z$m;y~6nh?AO|3G(Sk;CB9dJprYRB(Y| zqly$$Spjorz_C3$IJ|2+*Osa0+4{{jR0NYup8}C`IiHeTLRAEce`F9X3Q%k?qySm2 z12|sy%x3b?mVmltjV%A(!(3bbV2Fo*_a_F;5d8)a0xjYpEP?7JETJR4;-;Zj0~92o zlM^t(wL}-lq@ndZxSwfc!_KB*vg_5{hDO$IZQ|q35Xqd3RxJn-P_(ONJg%NA>%iM^ zRs|br93uyoE|79A#LEdxWB=7CqH0qwXLpx@2-QR$Oi=Z z`_DHpDb_>HWaz)pOsXrvgavE7I~U5uLRDHli;IU|Cy!2a+nQZyYdDM_#N8cX`;M-9ykWaHZ>47dx!=>alke~ z72RJTI^RsLH$klaOPttpAGy|lq9mky#Ri{@-}oy$b_&`7d*thNco}?dGwf3#W&kGO zhC!OrGczktAh9K>ZF$|0kF1#keE zWY5F7t?>Q*@Bxs%(L13mc`|nZT4V6(99R^ENT9fcx}exnjgtj8BcbJ`;}W10C`W$o zfPFs}X5NPuAOkozwJ!hyz?kVU^J!Q=3+`7SYDjL(;v_Qa4~CG}2jJA-;SVptTR=CE z1)N*j8F}MIfvOsq@&i~k6PCrGJ^+=@=t0a3T + + JumpWidget + + + + 0 + 0 + 345 + 35 + + + + + 0 + 0 + + + + Form + + + false + + + + + + + + + + + + :/resources/dialog-close.png:/resources/dialog-close.png + + + true + + + + + + + Jump to call: + + + + + + + + 0 + 0 + + + + 9999999 + + + + + + + Jump + + + true + + + + + + + + + + + + diff --git a/gui/ui/mainwindow.ui b/gui/ui/mainwindow.ui index 574bfa2..9bf4993 100644 --- a/gui/ui/mainwindow.ui +++ b/gui/ui/mainwindow.ui @@ -23,7 +23,7 @@ QMainWindow::AnimatedDocks|QMainWindow::ForceTabbedDocks - + -- 2.43.0