Developer Documentation
TextBrowserWidget.hh
1 /*===========================================================================*\
2 * *
3 * OpenFlipper *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openflipper.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenFlipper. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39 * *
40 \*===========================================================================*/
41 
42 #pragma once
43 
44 #include <QPlainTextEdit>
45 #include <QObject>
46 
47 #include <vector>
48 
50 
51 
52 class TextBrowserWidget : public QPlainTextEdit
53 {
54  Q_OBJECT
55 
56  private:
57  enum FoldType {
58  SHADER,
59  RENDEROBJECT
60  };
61 
62  struct Fold {
63  Fold() :
64  start(-1),
65  end(-1),
66  folded(false),
67  type(SHADER)
68  {}
69 
70  Fold(int _start, int _end, FoldType _type) :
71  start(_start),
72  end(_end),
73  folded(false),
74  type(_type)
75  {}
76 
77  bool contains (int n) const {
78  return (start <= n) && (n <= end);
79  }
80 
81  // start positition in the document
82  int start;
83  // end positition in the document
84  int end;
85  bool folded;
86  FoldType type;
87  };
88 
89 
90  public:
91  explicit TextBrowserWidget(QWidget *parent = 0);
92 
93  void sideAreaPaintEvent(QPaintEvent *event);
94  int sideAreaWidth();
95 
96  protected:
97  void resizeEvent(QResizeEvent *event);
98  virtual void mouseDoubleClickEvent(QMouseEvent* e);
99 
100  private slots:
101  void updateTextBrowserSideAreaWidth();
102  void updateTextBrowserSideArea(const QRect &, int);
103  void foldAll();
104  void unfoldAll();
105  void fold(Fold& _fold);
106  void unfold(Fold& _fold);
107  void toggleFold(int _position);
108  void updateFolds();
109 
116  bool getFold(int _position, Fold& _fold);
117 
118  private:
119  TextBrowserSideArea* sideArea_;
120  static QString const startRenderObjectTag_;
121  static QString const startVertexShaderTag_;
122  static QString const endVertexShaderTag_;
123  static QString const startTessControlShaderTag_;
124  static QString const endTessControlShaderTag_;
125  static QString const startTessEvalShaderTag_;
126  static QString const endTessEvalShaderTag_;
127  static QString const startGeometryShaderTag_;
128  static QString const endGeometryShaderTag_;
129  static QString const startFragmentShaderTag_;
130  static QString const endFragmentShaderTag_;
131 
132  std::vector<Fold> folds_;
134  std::map<int, size_t> blockPosToFold_;
135 };
136 
137 
138 class TextBrowserSideArea : public QWidget
139 {
140  public:
141  explicit TextBrowserSideArea(TextBrowserWidget* _textBrowser) :
142  QWidget(_textBrowser),
143  textBrowser_(_textBrowser)
144  {}
145 
146  QSize sizeHint() const {
147  return QSize(textBrowser_->sideAreaWidth(), 0);
148  }
149 
150  protected:
151  void paintEvent(QPaintEvent *event) {
152  textBrowser_->sideAreaPaintEvent(event);
153  }
154 
155  private:
156  TextBrowserWidget* textBrowser_;
157 };
158 
159 
bool getFold(int _position, Fold &_fold)
get the _fold corresponding to the document _position
std::map< int, size_t > blockPosToFold_
maps positions in the document to indices in folds_