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>> chars;
38  std::shared_ptr<std::vector<CharAttr>> atts2;
39  bool has_diff_flags = false;
41  : chars(std::make_shared<std::vector<Char>>())
42  , atts2(std::make_shared<std::vector<CharAttr>>())
43  {
44  }
45  };
47  public:
48  int row_start = 0;
49  int row_count = 0;
50  std::unordered_map<int, TextEditorView::FormattedLine> lines;
51  void clear()
52  {
53  lines.clear();
54  }
55  size_t size() const
56  {
57  return lines.size();
58  }
59  };
60 private:
61  struct Private;
63 
64  void paintScreen(QPainter *painter);
65  void drawCursor(int row, int col, QPainter *pr, QColor const &color);
66  void drawCursor(QPainter *pr);
67  void drawFocusFrame(QPainter *pr);
68  void updateCursorRect(bool auto_scroll);
69  QColor defaultForegroundColor();
70  QColor defaultBackgroundColor();
71  QColor colorForIndex(CharAttr const &attr, bool foreground);
72  void internalUpdateVisibility(bool ensure_current_line_visible, bool change_col, bool auto_scroll);
73 public://@
75 private:
76  void moveCursorByMouse();
77  void calcPixelPosX(std::vector<Char> *chars, const QFontMetrics &fm) const;
78  int posX_px(int row, int col, bool adjust_scroll, std::vector<Char> *chars, std::vector<CharAttr> *attrs = nullptr) const;
79  int scrollPosX() const;
80  int view_y_from_row(int row) const;
81  FormattedLines _fetchLines(int row, int count) const;
82 public:
83  std::unordered_map<int, TextEditorView::FormattedLine> fetchLines() const;
84  FormattedLines *fetchLines2(bool all);
85  int basisCharWidth() const;
86 protected:
87  void paintEvent(QPaintEvent *) override;
88  void mousePressEvent(QMouseEvent *event) override;
89  void mouseReleaseEvent(QMouseEvent *event) override;
90  void mouseMoveEvent(QMouseEvent *event) override;
91  void wheelEvent(QWheelEvent *event) override;
92  void resizeEvent(QResizeEvent *event) override;
93  void contextMenuEvent(QContextMenuEvent *event) override;
94  QFont textFont() const;
95  void drawText(QPainter *painter, int px, int py, QString const &str);
96 protected:
97  void timerEvent(QTimerEvent *) override;
98  void setCursorCol(int col) override;
99  void setCursorRow(int row, bool auto_scroll, bool by_mouse) override;
100  void invalidateLineFormat(int row) override;
101 public:
102  explicit TextEditorView(QWidget *parent = nullptr);
103  ~TextEditorView() override;
104 
105  void setTheme(const TextEditorThemePtr &theme);
106  TextEditorTheme const *theme() const;
107 
108  int lineHeight() const;
109 
110  void updateVisibility(bool ensure_current_line_visible, bool change_col, bool auto_scroll) override;
111 
112  bool event(QEvent *event) override;
113 
114  void bindScrollBar(QScrollBar *vsb, QScrollBar *hsb);
116 
117  RowCol mapFromPixel(const QPoint &pt);
118 
119  QVariant inputMethodQuery(Qt::InputMethodQuery q) const override;
120  void inputMethodEvent(QInputMethodEvent *e) override;
121  void reflectScrollBar();
122 
123  void move(int cur_row, int cur_col, int scr_row, int scr_col, bool auto_scroll);
124  void layoutEditor() override;
125  void setFocusFrameVisible(bool f);
126  enum ScrollUnit {
128  };
130  void setScrollUnit(int n);
131  int scrollUnit() const;
132 
133  void setTextFont(const QFont &font);
134  void updateLayout();
135 
136  struct PointInView {
137  int x = 0;
138  int y = 0;
139  int height = 0;
140  };
141  PointInView pointInView(int row, int col) const;
142 
143  int scrollTopRow() const;
144 
145 signals:
146  void moved(int cur_row, int cur_col, int scr_row, int scr_col);
148  void idle();
149 };
150 
151 
152 
153 
154 #endif // TEXTEDITORVIEW_H
std::shared_ptr< TextEditorTheme > TextEditorThemePtr
Definition: TextEditorTheme.h:9
Definition: AbstractCharacterBasedApplication.h:551
Definition: TextEditorTheme.h:11
Definition: TextEditorView.h:35
std::shared_ptr< std::vector< CharAttr > > atts2
Definition: TextEditorView.h:38
std::shared_ptr< std::vector< Char > > chars
Definition: TextEditorView.h:37
bool has_diff_flags
Definition: TextEditorView.h:39
FormattedLine()
Definition: TextEditorView.h:40
Definition: TextEditorView.h:46
size_t size() const
Definition: TextEditorView.h:55
int row_count
Definition: TextEditorView.h:49
int row_start
Definition: TextEditorView.h:48
void clear()
Definition: TextEditorView.h:51
std::unordered_map< int, TextEditorView::FormattedLine > lines
Definition: TextEditorView.h:50
Definition: TextEditorView.h:32
int basisCharWidth() const
基準文字幅
Definition: TextEditorView.cpp:219
void invalidateLineFormat(int row) override
Definition: TextEditorView.cpp:230
TextEditorTheme const * theme() const
Definition: TextEditorView.cpp:113
void mouseReleaseEvent(QMouseEvent *event) override
Definition: TextEditorView.cpp:1090
void resizeEvent(QResizeEvent *event) override
Definition: TextEditorView.cpp:1173
void internalUpdateScrollBar()
Definition: TextEditorView.cpp:432
bool event(QEvent *event) override
Definition: TextEditorView.cpp:196
int scrollPosX() const
水平スクロール位置のピクセル値を取得
Definition: TextEditorView.cpp:638
void updateVisibility(bool ensure_current_line_visible, bool change_col, bool auto_scroll) override
Definition: TextEditorView.cpp:479
FormattedLines _fetchLines(int row, int count) const
ビューに表示されている範囲のテキストを取得
Definition: TextEditorView.cpp:704
void wheelEvent(QWheelEvent *event) override
Definition: TextEditorView.cpp:1181
void setCursorRow(int row, bool auto_scroll, bool by_mouse) override
行位置を変更する
Definition: TextEditorView.cpp:371
void setTheme(const TextEditorThemePtr &theme)
Definition: TextEditorView.cpp:108
QVariant inputMethodQuery(Qt::InputMethodQuery q) const override
Definition: TextEditorView.cpp:1117
void moved(int cur_row, int cur_col, int scr_row, int scr_col)
void paintEvent(QPaintEvent *) override
描画
Definition: TextEditorView.cpp:745
void calcPixelPosX(std::vector< Char > *chars, const QFontMetrics &fm) const
全文字のX座標を計算する
Definition: TextEditorView.cpp:248
int lineHeight() const
行の高さ
Definition: TextEditorView.cpp:209
void setFocusFrameVisible(bool f)
Definition: TextEditorView.cpp:1198
void updateCursorRect(bool auto_scroll)
Definition: TextEditorView.cpp:416
QColor colorForIndex(CharAttr const &attr, bool foreground)
Definition: TextEditorView.cpp:518
void moveCursorByMouse()
Definition: TextEditorView.cpp:1037
TextEditorView(QWidget *parent=nullptr)
Definition: TextEditorView.cpp:56
int scroll_unit_
Definition: TextEditorView.h:129
void drawText(QPainter *painter, int px, int py, QString const &str)
Definition: TextEditorView.cpp:503
void layoutEditor() override
Definition: TextEditorView.cpp:1163
QFont textFont() const
Definition: TextEditorView.cpp:498
void move(int cur_row, int cur_col, int scr_row, int scr_col, bool auto_scroll)
Definition: TextEditorView.cpp:487
void timerEvent(QTimerEvent *) override
Definition: TextEditorView.cpp:1203
void updateLayout()
Definition: TextEditorView.cpp:133
void mousePressEvent(QMouseEvent *event) override
Definition: TextEditorView.cpp:1060
FormattedLines * fetchLines2(bool all)
Definition: TextEditorView.cpp:724
ScrollUnit
Definition: TextEditorView.h:126
@ ScrollByCharacter
Definition: TextEditorView.h:127
RowCol mapFromPixel(const QPoint &pt)
ビューのピクセル座標から行と桁を求める
Definition: TextEditorView.cpp:320
void setScrollUnit(int n)
Definition: TextEditorView.cpp:624
void reflectScrollBar()
Definition: TextEditorView.cpp:1156
QColor defaultBackgroundColor()
Definition: TextEditorView.cpp:513
int scrollTopRow() const
TextEditorView::scrollTopRow.
Definition: TextEditorView.cpp:650
void internalUpdateVisibility(bool ensure_current_line_visible, bool change_col, bool auto_scroll)
Definition: TextEditorView.cpp:458
void setCursorCol(int col) override
桁位置を変更する
Definition: TextEditorView.cpp:392
void contextMenuEvent(QContextMenuEvent *event) override
Definition: TextEditorView.cpp:1214
void mouseMoveEvent(QMouseEvent *event) override
Definition: TextEditorView.cpp:1103
void paintScreen(QPainter *painter)
描画(CharacterMode用)
Definition: TextEditorView.cpp:534
std::unordered_map< int, TextEditorView::FormattedLine > fetchLines() const
Definition: TextEditorView.cpp:719
void updateScrollBar()
void inputMethodEvent(QInputMethodEvent *e) override
Definition: TextEditorView.cpp:1126
void drawFocusFrame(QPainter *pr)
Definition: TextEditorView.cpp:618
int posX_px(int row, int col, bool adjust_scroll, std::vector< Char > *chars, std::vector< CharAttr > *attrs=nullptr) const
行と桁位置からピクセルX座標を求める
Definition: TextEditorView.cpp:282
~TextEditorView() override
Definition: TextEditorView.cpp:103
int scrollUnit() const
Definition: TextEditorView.cpp:629
void bindScrollBar(QScrollBar *vsb, QScrollBar *hsb)
Definition: TextEditorView.cpp:402
Private * m
Definition: TextEditorView.h:61
void setupForLogWidget(const TextEditorThemePtr &theme)
Definition: TextEditorView.cpp:408
void setTextFont(const QFont &font)
Definition: TextEditorView.cpp:121
PointInView pointInView(int row, int col) const
行と桁からビュー座標を求める
Definition: TextEditorView.cpp:666
int view_y_from_row(int row) const
Definition: TextEditorView.cpp:655
QColor defaultForegroundColor()
Definition: TextEditorView.cpp:508
void drawCursor(int row, int col, QPainter *pr, QColor const &color)
カーソルを描画
Definition: TextEditorView.cpp:682
Definition: GitObjectManager.h:7
Definition: AbstractCharacterBasedApplication.h:290
Definition: AbstractCharacterBasedApplication.h:47
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:253
Definition: TextEditorView.h:136
int x
Definition: TextEditorView.h:137
int height
Definition: TextEditorView.h:139
int y
Definition: TextEditorView.h:138
Definition: TextEditorView.cpp:25