1
2/*
3 * Copyright 2012 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#ifndef SKDEBUGGERUI_H
10#define SKDEBUGGERUI_H
11
12
13#include "SkCanvas.h"
14#include "SkCanvasWidget.h"
15#include "SkDebugger.h"
16#include "SkGLWidget.h"
17#include "SkListWidget.h"
18#include "SkInspectorWidget.h"
19#include "SkRasterWidget.h"
20#include "SkDrawCommandGeometryWidget.h"
21#include "SkSettingsWidget.h"
22#include <QtCore/QFileSystemWatcher>
23#include <QtCore/QSignalMapper>
24#include <QtCore/QVariant>
25#include <QtGui/QAction>
26#include <QtGui/QApplication>
27#include <QtGui/QButtonGroup>
28#include <QtGui/QHBoxLayout>
29#include <QtGui/QHeaderView>
30#include <QtGui/QListView>
31#include <QtGui/QListWidget>
32#include <QtGui/QMainWindow>
33#include <QtGui/QSplitter>
34#include <QtGui/QStatusBar>
35#include <QtGui/QToolBar>
36#include <QtGui/QVBoxLayout>
37#include <QtGui/QWidget>
38#include <QtGui/QMenu>
39#include <QtGui/QMenuBar>
40#include <vector>
41
42/** \class SkDebuggerGUI
43
44    Container for the UI and it's functions.
45 */
46class SkDebuggerGUI : public QMainWindow {
47    Q_OBJECT
48
49public:
50    /**
51        Constructs the view of the application.
52        @param parent  The parent container of this widget.
53     */
54    SkDebuggerGUI(QWidget *parent = 0);
55
56    /**
57        Updates the directory widget with the latest directory path stored in
58        the global class variable fPath.
59     */
60    void setupDirectoryWidget(const QString& path);
61
62    /**
63        Loads the specified file.
64    */
65    void openFile(const QString& filename);
66
67signals:
68    void commandChanged(int command);
69
70private slots:
71    /**
72        Toggles breakpoint view in the list widget.
73     */
74    void actionBreakpoints();
75
76    /**
77        Cancels the command filter in the list widget.
78     */
79    void actionCancel();
80
81    /**
82        Clears the breakpoint state off of all commands marked as breakpoints.
83     */
84    void actionClearBreakpoints();
85
86    /**
87        Clears the deleted state off of all commands marked as deleted.
88     */
89    void actionClearDeletes();
90
91    /**
92        Closes the application.
93     */
94    void actionClose();
95
96    /**
97        Deletes the command in question.
98     */
99    void actionDelete();
100
101#if SK_SUPPORT_GPU
102    /**
103        Updates the visibility of the GL canvas widget and sample count of the GL surface.
104     */
105    void actionGLSettingsChanged();
106#endif
107
108    /**
109        Toggles the visibility of the inspector widget.
110     */
111    void actionInspector();
112
113    /**
114        Plays from the current step to the next breakpoint if it exists, otherwise
115        executes all remaining draw commands.
116     */
117    void actionPlay();
118
119    /**
120        Sets the visibility of the raster canvas widget according to the settings widget.
121     */
122    void actionRasterSettingsChanged();
123
124    /**
125        Sets the visualization settings according to the settings widget.
126     */
127    void actionVisualizationsChanged();
128
129    /**
130        Applies the new texture filter override
131     */
132    void actionTextureFilter();
133
134    /**
135        Rewinds from the current step back to the start of the commands.
136     */
137    void actionRewind();
138
139    /**
140        Saves the current SKP with all modifications.
141     */
142    void actionSave();
143
144    /**
145        Saves the current SKP under a different name and/or location.
146     */
147    void actionSaveAs();
148
149    /**
150        Sends the scale factor information to the settings widget.
151     */
152    void actionScale(float scaleFactor);
153
154    /**
155        Toggles the settings widget visibility.
156     */
157    void actionSettings();
158
159    /**
160        Steps forward to the next draw command.
161     */
162    void actionStepBack();
163
164    /**
165        Steps backwards to the next draw command.
166     */
167    void actionStepForward();
168
169    /**
170        Called when the canvas is done being drawn to by SkCanvasWidget.
171     */
172    void drawComplete();
173
174    /**
175        Loads an skpicture selected from the directory.
176     */
177    void loadFile(QListWidgetItem *item);
178
179    /**
180        Toggles a dialog with a file browser for navigating to a skpicture. Loads
181        the selected file.
182     */
183    void openFile();
184
185    /**
186        Toggles whether drawing to a new command requires a double click
187        or simple focus.
188     */
189    void pauseDrawing(bool isPaused = true);
190
191    /**
192        Updates the UI based on the selected command.
193     */
194    void updateDrawCommandInfo();
195
196    /**
197        Sets the command to active in the list widget.
198     */
199    void selectCommand(int command);
200
201    /**
202        Toggles the exclusive listing of commands set as deleted.
203     */
204    void showDeletes();
205
206    /**
207        Toggles a breakpoint on the current step in the list widget.
208     */
209    void toggleBreakpoint();
210
211    /**
212        Toggles the visibility of the directory widget.
213     */
214    void toggleDirectory();
215
216    /**
217        Populates the contents of the directory widget with the skp files in the
218        current directory pointed to by fFile.
219     */
220    void populateDirectoryWidget();
221
222    /**
223        Filters the list widgets command visibility based on the currently
224        active selection.
225     */
226    void toggleFilter(QString string);
227
228    void updateHit(int newHit);
229
230    void updateImage();
231private:
232    QSplitter fCentralSplitter;
233    QStatusBar fStatusBar;
234    QToolBar fToolBar;
235
236    QAction fActionOpen;
237    QAction fActionBreakpoint;
238    QAction fActionCancel;
239    QAction fActionClearBreakpoints;
240    QAction fActionClearDeletes;
241    QAction fActionClose;
242    QAction fActionCreateBreakpoint;
243    QAction fActionDelete;
244    QAction fActionDirectory;
245    QAction fActionGoToLine;
246    QAction fActionInspector;
247    QAction fActionSettings;
248    QAction fActionPlay;
249    QAction fActionPause;
250    QAction fActionRewind;
251    QAction fActionSave;
252    QAction fActionSaveAs;
253    QAction fActionShowDeletes;
254    QAction fActionStepBack;
255    QAction fActionStepForward;
256    QAction fActionZoomIn;
257    QAction fActionZoomOut;
258    QSignalMapper fMapper;
259
260    QWidget fSpacer;
261    QComboBox fFilter;
262
263    QSplitter fLeftColumnSplitter;
264    QWidget fMainAndRightColumnWidget;
265    QVBoxLayout fMainAndRightColumnLayout;
266    QHBoxLayout fCanvasSettingsAndImageLayout;
267    QVBoxLayout fSettingsAndImageLayout;
268
269    QListWidget fListWidget;
270    QListWidget fDirectoryWidget;
271
272    QFileSystemWatcher fDirectoryWatcher;
273
274    SkDebugger fDebugger;
275    SkCanvasWidget fCanvasWidget;
276
277    SkInspectorWidget fInspectorWidget;
278    SkSettingsWidget fSettingsWidget;
279
280    QFrame fViewStateFrame;
281    QVBoxLayout fViewStateFrameLayout;
282    QGroupBox fViewStateGroup;
283    QFormLayout fViewStateLayout;
284    QLineEdit fCurrentCommandBox;
285    QLineEdit fCommandHitBox;
286    QLineEdit fZoomBox;
287    SkDrawCommandGeometryWidget fDrawCommandGeometryWidget;
288
289    QString fPath;
290    SkString fFileName;
291    SkTDArray<bool> fSkipCommands; // has a specific command been deleted?
292
293    QMenuBar fMenuBar;
294    QMenu fMenuFile;
295    QMenu fMenuEdit;
296    QMenu fMenuNavigate;
297    QMenu fMenuView;
298    QMenu fMenuWindows;
299
300    bool fLoading;
301    int fPausedRow;
302
303    /**
304        Creates the entire UI.
305     */
306    void setupUi(QMainWindow *SkDebuggerGUI);
307
308    /**
309        Pipes a QString in with the location of the filename, proceeds to updating
310        the listwidget, combowidget and inspectorwidget.
311     */
312    void loadPicture(const SkString& fileName);
313
314    /**
315        Creates a picture of the current canvas.
316     */
317    void saveToFile(const SkString& filename);
318
319    /**
320        Populates the list widget with the debugger draw command info.
321     */
322    void setupListWidget();
323
324    /**
325        Populates the combo box widget with with the debugger draw command info.
326     */
327    void setupComboBox();
328
329    /**
330        Fills in the overview pane with text
331     */
332    void setupOverviewText(const SkTDArray<double>* typeTimes, double totTime, int numRuns);
333
334    bool isPaused() const {
335        return fActionPause.isChecked();
336    }
337};
338
339#endif // SKDEBUGGERUI_H
340