Guitar
TextEditorView.h
Go to the documentation of this file.
1 #ifndef TEXTEDITORVIEW_H
2 #define TEXTEDITORVIEW_H
3 
5 #include "TextEditorTheme.h"
6 #include <QTextFormat>
7 #include <QWidget>
8 #include <cstdint>
9 #include <memory>
10 #include <vector>
11 #include <functional>
12 
13 class QScrollBar;
14 
15 struct PreEditText {
16  struct Format {
17  int start;
18  int length;
19  QTextFormat format;
20  Format(int start, int length, QTextFormat const &f)
21  : start(start)
22  , length(length)
23  , format(f)
24  {
25  }
26  };
27 
28  QString text;
29  std::vector<Format> format;
30 };
31 
32 class TextEditorView : public QWidget, public AbstractTextEditorApplication {
33  Q_OBJECT
34 public:
35  class FormattedLine {
36  public:
37  std::shared_ptr<std::vector<Char>> sp;
39  : sp(std::make_shared<std::vector<Char>>())
40  {
41  }
42  };
44  public:
45  std::vector<TextEditorView::FormattedLine> lines;
46  void clear()
47  {
48  lines.clear();
49  }
50  std::vector<Char> *append()
51  {
52  lines.emplace_back();
53  return lines.back().sp.get();
54  }
55  size_t size() const
56  {
57  return lines.size();
58  }
60  {
61  return lines[i];
62  }
63  FormattedLine const &operator [] (size_t i) const
64  {
65  return lines[i];
66  }
67  std::vector<Char> *chars(size_t i)
68  {
69  return lines[i].sp.get();
70  }
71  std::vector<Char> const *chars(size_t i) const
72  {
73  return lines[i].sp.get();
74  }
75  };
76 private:
77  struct Private;
79 
80  void paintScreen(QPainter *painter);
81  void drawCursor(int row, int col, QPainter *pr, QColor const &color);
82  void drawCursor(QPainter *pr);
83  void drawFocusFrame(QPainter *pr);
84  void updateCursorRect(bool auto_scroll);
85  QColor defaultForegroundColor();
86  QColor defaultBackgroundColor();
87  QColor colorForIndex(CharAttr const &attr, bool foreground);
88  void internalUpdateVisibility(bool ensure_current_line_visible, bool change_col, bool auto_scroll);
89 public://@
91 private:
92  void moveCursorByMouse();
93  int calcPixelPosX(int row, int col, bool adjust_scroll, std::vector<Char> *chars) const;
94  void parse(int row, std::vector<Char> *chars) const;
95  int scrollPosX() const;
96  void calcPixelPosX(std::vector<Char> *chars, const QFontMetrics &fm) const;
97  int view_y_from_row(int row) const;
98 public:
100  int basisCharWidth() const;
101 protected:
102  void paintEvent(QPaintEvent *) override;
103  void mousePressEvent(QMouseEvent *event) override;
104  void mouseReleaseEvent(QMouseEvent *event) override;
105  void mouseMoveEvent(QMouseEvent *event) override;
106  void wheelEvent(QWheelEvent *event) override;
107  void resizeEvent(QResizeEvent *event) override;
108  void contextMenuEvent(QContextMenuEvent *event) override;
109  QFont textFont() const;
110  void drawText(QPainter *painter, int px, int py, QString const &str);
111 protected:
112  void timerEvent(QTimerEvent *) override;
113  void setCursorCol(int col) override;
114  void setCursorRow(int row, bool auto_scroll, bool by_mouse) override;
115 public:
116  explicit TextEditorView(QWidget *parent = nullptr);
117  ~TextEditorView() override;
118 
119  void setTheme(const TextEditorThemePtr &theme);
120  TextEditorTheme const *theme() const;
121 
122  int lineHeight() const;
123 
124  void updateVisibility(bool ensure_current_line_visible, bool change_col, bool auto_scroll) override;
125 
126  bool event(QEvent *event) override;
127 
128  void bindScrollBar(QScrollBar *vsb, QScrollBar *hsb);
130 
131  RowCol mapFromPixel(const QPoint &pt);
132 
133  QVariant inputMethodQuery(Qt::InputMethodQuery q) const override;
134  void inputMethodEvent(QInputMethodEvent *e) override;
135  void refrectScrollBar();
136 
137 // void setRenderingMode(RenderingMode mode);
138 
139  void move(int cur_row, int cur_col, int scr_row, int scr_col, bool auto_scroll);
140  void layoutEditor() override;
141  void setFocusFrameVisible(bool f);
142  enum ScrollUnit {
144  };
146  void setScrollUnit(int n);
147  int scrollUnit() const;
148 
149  void setTextFont(const QFont &font);
150  void updateLayout();
151 
152  struct PointInView {
153  int x = 0;
154  int y = 0;
155  int height = 0;
156  };
157  PointInView pointInView(int row, int col) const;
158 
159  // TODO:
160  bool something_bad_flag = false;
161  void setSomethingBadFlag(bool f)
162  {
163  something_bad_flag = f;
164  }
165 
166 signals:
167  void moved(int cur_row, int cur_col, int scr_row, int scr_col);
169  void idle();
170 };
171 
172 
173 
174 
175 #endif // TEXTEDITORVIEW_H
std::shared_ptr< TextEditorTheme > TextEditorThemePtr
Definition: TextEditorTheme.h:9
Definition: AbstractCharacterBasedApplication.h:506
Definition: TextEditorTheme.h:11
Definition: TextEditorView.h:35
std::shared_ptr< std::vector< Char > > sp
Definition: TextEditorView.h:37
FormattedLine()
Definition: TextEditorView.h:38
Definition: TextEditorView.h:43
size_t size() const
Definition: TextEditorView.h:55
void clear()
Definition: TextEditorView.h:46
FormattedLine & operator[](size_t i)
Definition: TextEditorView.h:59
std::vector< Char > * append()
Definition: TextEditorView.h:50
std::vector< TextEditorView::FormattedLine > lines
Definition: TextEditorView.h:45
std::vector< Char > const * chars(size_t i) const
Definition: TextEditorView.h:71
std::vector< Char > * chars(size_t i)
Definition: TextEditorView.h:67
Definition: TextEditorView.h:32
int basisCharWidth() const
基準文字幅
Definition: TextEditorView.cpp:223
TextEditorTheme const * theme() const
Definition: TextEditorView.cpp:107
void mouseReleaseEvent(QMouseEvent *event) override
Definition: TextEditorView.cpp:1066
void resizeEvent(QResizeEvent *event) override
Definition: TextEditorView.cpp:1149
void internalUpdateScrollBar()
Definition: TextEditorView.cpp:435
bool event(QEvent *event) override
Definition: TextEditorView.cpp:200
int scrollPosX() const
水平スクロール位置のピクセル値を取得
Definition: TextEditorView.cpp:646
void updateVisibility(bool ensure_current_line_visible, bool change_col, bool auto_scroll) override
Definition: TextEditorView.cpp:482
void wheelEvent(QWheelEvent *event) override
Definition: TextEditorView.cpp:1157
void setCursorRow(int row, bool auto_scroll, bool by_mouse) override
行位置を変更する
Definition: TextEditorView.cpp:375
void setTheme(const TextEditorThemePtr &theme)
Definition: TextEditorView.cpp:102
QVariant inputMethodQuery(Qt::InputMethodQuery q) const override
Definition: TextEditorView.cpp:1093
void moved(int cur_row, int cur_col, int scr_row, int scr_col)
void paintEvent(QPaintEvent *) override
描画
Definition: TextEditorView.cpp:721
int lineHeight() const
行の高さ
Definition: TextEditorView.cpp:213
void setFocusFrameVisible(bool f)
Definition: TextEditorView.cpp:1174
void updateCursorRect(bool auto_scroll)
Definition: TextEditorView.cpp:419
QColor colorForIndex(CharAttr const &attr, bool foreground)
Definition: TextEditorView.cpp:527
void moveCursorByMouse()
Definition: TextEditorView.cpp:1013
TextEditorView(QWidget *parent=nullptr)
Definition: TextEditorView.cpp:49
int scroll_unit_
Definition: TextEditorView.h:145
void drawText(QPainter *painter, int px, int py, QString const &str)
Definition: TextEditorView.cpp:506
void layoutEditor() override
Definition: TextEditorView.cpp:1139
QFont textFont() const
Definition: TextEditorView.cpp:501
void move(int cur_row, int cur_col, int scr_row, int scr_col, bool auto_scroll)
Definition: TextEditorView.cpp:490
void timerEvent(QTimerEvent *) override
Definition: TextEditorView.cpp:1179
void updateLayout()
Definition: TextEditorView.cpp:127
void mousePressEvent(QMouseEvent *event) override
Definition: TextEditorView.cpp:1036
ScrollUnit
Definition: TextEditorView.h:142
@ ScrollByCharacter
Definition: TextEditorView.h:143
RowCol mapFromPixel(const QPoint &pt)
ビューのピクセル座標から行と桁を求める
Definition: TextEditorView.cpp:324
void setScrollUnit(int n)
Definition: TextEditorView.cpp:632
QColor defaultBackgroundColor()
Definition: TextEditorView.cpp:519
void internalUpdateVisibility(bool ensure_current_line_visible, bool change_col, bool auto_scroll)
Definition: TextEditorView.cpp:461
void refrectScrollBar()
Definition: TextEditorView.cpp:1132
void setCursorCol(int col) override
桁位置を変更する
Definition: TextEditorView.cpp:396
void contextMenuEvent(QContextMenuEvent *event) override
Definition: TextEditorView.cpp:1190
int calcPixelPosX(int row, int col, bool adjust_scroll, std::vector< Char > *chars) const
行と桁位置からピクセルX座標を求める
Definition: TextEditorView.cpp:287
void mouseMoveEvent(QMouseEvent *event) override
Definition: TextEditorView.cpp:1079
void paintScreen(QPainter *painter)
描画(CharacterMode用)
Definition: TextEditorView.cpp:543
bool something_bad_flag
Definition: TextEditorView.h:160
void updateScrollBar()
void inputMethodEvent(QInputMethodEvent *e) override
Definition: TextEditorView.cpp:1102
void drawFocusFrame(QPainter *pr)
Definition: TextEditorView.cpp:626
~TextEditorView() override
Definition: TextEditorView.cpp:97
FormattedLines * fetchLines()
ビューに表示されている範囲のテキストを取得
Definition: TextEditorView.cpp:705
int scrollUnit() const
Definition: TextEditorView.cpp:637
void bindScrollBar(QScrollBar *vsb, QScrollBar *hsb)
Definition: TextEditorView.cpp:405
Private * m
Definition: TextEditorView.h:77
void setupForLogWidget(const TextEditorThemePtr &theme)
Definition: TextEditorView.cpp:411
void setTextFont(const QFont &font)
Definition: TextEditorView.cpp:115
void setSomethingBadFlag(bool f)
Definition: TextEditorView.h:161
PointInView pointInView(int row, int col) const
行と桁からビュー座標を求める
Definition: TextEditorView.cpp:667
int view_y_from_row(int row) const
Definition: TextEditorView.cpp:654
QColor defaultForegroundColor()
Definition: TextEditorView.cpp:511
void parse(int row, std::vector< Char > *chars) const
Definition: TextEditorView.cpp:314
void drawCursor(int row, int col, QPainter *pr, QColor const &color)
カーソルを描画
Definition: TextEditorView.cpp:683
Definition: AbstractCharacterBasedApplication.h:206
Definition: AbstractCharacterBasedApplication.h:245
Definition: TextEditorView.h:16
int start
Definition: TextEditorView.h:17
Format(int start, int length, QTextFormat const &f)
Definition: TextEditorView.h:20
int length
Definition: TextEditorView.h:18
QTextFormat format
Definition: TextEditorView.h:19
Definition: TextEditorView.h:15
std::vector< Format > format
Definition: TextEditorView.h:29
QString text
Definition: TextEditorView.h:28
Definition: AbstractCharacterBasedApplication.h:174
Definition: TextEditorView.h:152
int x
Definition: TextEditorView.h:153
int height
Definition: TextEditorView.h:155
int y
Definition: TextEditorView.h:154
Definition: TextEditorView.cpp:20