]> git.cworth.org Git - apitrace/blobdiff - gui/apitrace.h
Use skiplist-based FastCallSet within trace::CallSet
[apitrace] / gui / apitrace.h
index 036a84cdd0b14f150560570c6104b8c543772169..04e295cd7e39470476990d834b5085be7bf77997 100644 (file)
@@ -3,24 +3,50 @@
 
 #include "apitracecall.h"
 
+#include "trace_api.hpp"
+
 #include <QObject>
 #include <QSet>
 
-class LoaderThread;
+class TraceLoader;
 class SaverThread;
+class QThread;
 
 class ApiTrace : public QObject
 {
     Q_OBJECT
 public:
-    enum FrameMarker {
-        FrameMarker_SwapBuffers,
-        FrameMarker_Flush,
-        FrameMarker_Finish,
-        FrameMarker_Clear
+    enum SearchResult {
+        SearchResult_NotFound,
+        SearchResult_Found,
+        SearchResult_Wrapped
+    };
+    struct SearchRequest {
+        enum Direction {
+            Next,
+            Prev
+        };
+        SearchRequest()
+            : direction(Next)
+        {}
+        SearchRequest(Direction dir,
+                      ApiTraceFrame *f,
+                      ApiTraceCall *call,
+                      QString str,
+                      Qt::CaseSensitivity caseSens)
+            : direction(dir),
+              frame(f),
+              from(call),
+              text(str),
+              cs(caseSens)
+        {}
+        Direction direction;
+        ApiTraceFrame *frame;
+        ApiTraceCall *from;
+        QString text;
+        Qt::CaseSensitivity cs;
     };
-    static bool isCallAFrameMarker(const ApiTraceCall *call,
-                                   FrameMarker marker);
+
 public:
     ApiTrace();
     ~ApiTrace();
@@ -29,23 +55,11 @@ public:
 
     QString fileName() const;
 
-    FrameMarker frameMarker() const;
-
     ApiTraceState defaultState() const;
 
-    ApiTraceCallSignature *signature(unsigned id);
-    void addSignature(unsigned id, ApiTraceCallSignature *signature);
-
-    ApiTraceEnumSignature *enumSignature(unsigned id);
-    void addEnumSignature(unsigned id, ApiTraceEnumSignature *signature);
-
-
-    QVector<ApiTraceCall*> calls() const;
-    ApiTraceCall *callAt(int idx) const;
     ApiTraceCall *callWithIndex(int idx) const;
-    int numCalls() const;
 
-    QList<ApiTraceFrame*> frames() const;
+    const QList<ApiTraceFrame*> & frames() const;
     ApiTraceFrame *frameAt(int idx) const;
     int numFrames() const;
     int numCallsInFrame(int idx) const;
@@ -61,39 +75,80 @@ public:
 
     bool hasErrors() const;
 
+    trace::API api() const;
+
 public slots:
     void setFileName(const QString &name);
-    void setFrameMarker(FrameMarker marker);
     void save();
+    void loadFrame(ApiTraceFrame *frame);
+    void findNext(ApiTraceFrame *frame,
+                  ApiTraceCall *call,
+                  const QString &str,
+                  Qt::CaseSensitivity sensitivity);
+    void findPrev(ApiTraceFrame *frame,
+                  ApiTraceCall *call,
+                  const QString &str,
+                  Qt::CaseSensitivity sensitivity);
+    void findFrameStart(ApiTraceFrame *frame);
+    void findFrameEnd(ApiTraceFrame *frame);
+    void findCallIndex(int index);
+    void setCallError(const ApiTraceError &error);
+
+    void bindThumbnailsToFrames(const QList<QImage> &thumbnails);
 
 signals:
+    void loadTrace(const QString &name);
+    void requestFrame(ApiTraceFrame *frame);
     void startedLoadingTrace();
+    void loaded(int percent);
     void finishedLoadingTrace();
     void invalidated();
     void framesInvalidated();
-    void changed(ApiTraceCall *call);
+    void changed(ApiTraceEvent *event);
     void startedSaving();
     void saved();
+    void findResult(const ApiTrace::SearchRequest &request,
+                    ApiTrace::SearchResult result,
+                    ApiTraceCall *call);
 
     void beginAddingFrames(int oldCount, int numAdded);
     void endAddingFrames();
-    void callsAdded(int oldCount, int numAdded);
+    void beginLoadingFrame(ApiTraceFrame *frame, int numAdded);
+    void endLoadingFrame(ApiTraceFrame *frame);
+    void foundFrameStart(ApiTraceFrame *frame);
+    void foundFrameEnd(ApiTraceFrame *frame);
+    void foundCallIndex(ApiTraceCall *call);
+
+signals:
+    void loaderSearch(const ApiTrace::SearchRequest &request);
+    void loaderFindFrameStart(ApiTraceFrame *frame);
+    void loaderFindFrameEnd(ApiTraceFrame *frame);
+    void loaderFindCallIndex(int index);
 
 private slots:
     void addFrames(const QList<ApiTraceFrame*> &frames);
     void slotSaved();
+    void guessedApi(int api);
+    void finishedParsing();
+    void loaderFrameLoaded(ApiTraceFrame *frame,
+                           const QVector<ApiTraceCall*> &calls,
+                           quint64 binaryDataSize);
+    void loaderSearchResult(const ApiTrace::SearchRequest &request,
+                            ApiTrace::SearchResult result,
+                            ApiTraceCall *call);
+
 private:
-    void detectFrames();
+    int callInFrame(int callIdx) const;
+    bool isFrameLoading(ApiTraceFrame *frame) const;
 private:
     QString m_fileName;
     QString m_tempFileName;
 
     QList<ApiTraceFrame*> m_frames;
-    QVector<ApiTraceCall*> m_calls;
-
-    FrameMarker m_frameMarker;
+    trace::API m_api;
 
-    LoaderThread *m_loader;
+    TraceLoader *m_loader;
+    QThread     *m_loaderThread;
     SaverThread  *m_saver;
 
     QSet<ApiTraceCall*> m_editedCalls;
@@ -101,8 +156,8 @@ private:
     bool m_needsSaving;
 
     QSet<ApiTraceCall*> m_errors;
-    QVector<ApiTraceCallSignature*> m_signatures;
-    QVector<ApiTraceEnumSignature*> m_enumSignatures;
+    QList< QPair<ApiTraceFrame*, ApiTraceError> > m_queuedErrors;
+    QSet<ApiTraceFrame*> m_loadingFrames;
 };
 
 #endif