Guitar
AbstractTextEditorApplication.h
Go to the documentation of this file.
1 #ifndef ABSTRACTTEXTEDITORAPPLICATION_H
2 #define ABSTRACTTEXTEDITORAPPLICATION_H
3 
4 #include <QByteArray>
5 #include <QColor>
6 #include <QKeyEvent>
7 #include <QRect>
8 #include <QString>
9 #include <functional>
10 #include <memory>
11 #include <optional>
12 #include <variant>
13 #include <vector>
14 #include <mutex>
15 #include <QFont>
16 #include <QPixmap>
17 #include <QPainter>
18 #include <QFontMetrics>
19 
21 
22 namespace EscapeCode {
23 enum EscapeCode {
24  Up = 0x1b5b4100,
25  Down = 0x1b5b4200,
26  Right = 0x1b5b4300,
27  Left = 0x1b5b4400,
28  Home = 0x1b4f4800,
29  End = 0x1b4f4600,
30  Insert = 0x1b5b327e,
31  Delete = 0x1b5b337e,
32  PageUp = 0x1b5b357e,
33  PageDown = 0x1b5b367e,
34 };
35 }
36 
37 struct CharAttr {
38  enum Index {
42  };
43  uint16_t index = 0; // テーマ側で解釈する属性番号
44  QColor color; // 属性番号では表せない明示色(未指定なら無効色)
46  : index(index)
47  {
48  }
49  bool operator == (CharAttr const &r) const
50  {
51  return index == r.index && color == r.color;
52  }
53  bool operator != (CharAttr const &r) const
54  {
55  return !operator == (r);
56  }
57 };
58 
59 struct CharFlags {
60  enum DiffMarker {
62  Del,
63  Add,
64  _Reserved
65  };
66  union {
67  struct {
68  bool selected : 1; // 選択範囲内の文字
69  bool current_line : 1; // カーソルが属する論理行の文字
70  uint8_t diff_marker : 2; // 文字単位diffの種別
71 
72  };
73  uint16_t all = 0;
74  };
75 };
76 
77 struct Character {
78  char32_t unicode = 0; // Unicodeコードポイント。UTF-16のcode unitではない
79  int left_x = 0; // 行頭を0とする文字左端のピクセル座標
80  int right_x = 0; // 行頭を0とする文字右端のピクセル座標
81  CharAttr attr; // 描画属性
82  Character() = default;
83  Character(char32_t unicode)
84  : unicode(unicode)
85  {
86  }
87  operator char32_t () const
88  {
89  return unicode;
90  }
91 };
92 class CharBuffer {
93 public:
94  // コピー時にCharacter列を複製せず共有する。編集目的でコピーした場合も同じ
95  // vectorを指すため、呼び出し側は値型の深いコピーと誤認しないこと。
96  std::shared_ptr<std::vector<Character>> vec;
98  : vec(std::make_shared<std::vector<Character>>())
99  {
100  }
101  CharBuffer(std::vector<Character> const &v)
102  : vec(std::make_shared<std::vector<Character>>(v))
103  {
104  }
105  void reserve(size_t n)
106  {
107  vec->reserve(n);
108  }
109  void clear()
110  {
111  vec->clear();
112  }
113  void resize(size_t n)
114  {
115  vec->resize(n);
116  }
117  size_t size() const
118  {
119  return vec->size();
120  }
121  bool empty() const
122  {
123  return vec->empty();
124  }
125  Character const &back() const
126  {
127  return vec->back();
128  }
130  {
131  return (*vec)[i];
132  }
133  Character const &operator [] (size_t i) const
134  {
135  return (*vec)[i];
136  }
137  void push_back(Character const &c)
138  {
139  vec->push_back(c);
140  }
141  void emplace_back(Character const &c)
142  {
143  vec->emplace_back(c);
144  }
145  std::vector<Character>::iterator begin()
146  {
147  return vec->begin();
148  }
149  std::vector<Character> ::iterator end()
150  {
151  return vec->end();
152  }
153  std::vector<Character>::const_iterator begin() const
154  {
155  return vec->begin();
156  }
157  std::vector<Character> ::const_iterator end() const
158  {
159  return vec->end();
160  }
161  void insert(std::vector<Character>::iterator pos, Character const &first)
162  {
163  vec->insert(pos, first);
164  }
165  void insert(std::vector<Character>::iterator pos, Character const *first, Character const *last)
166  {
167  vec->insert(pos, first, last);
168  }
169  void insert(std::vector<Character>::iterator pos, std::vector<Character>::const_iterator first, std::vector<Character>::const_iterator last)
170  {
171  vec->insert(pos, first, last);
172  }
173  void erase(std::vector<Character>::iterator pos)
174  {
175  vec->erase(pos);
176  }
177  void erase(std::vector<Character>::iterator first, std::vector<Character>::iterator last)
178  {
179  vec->erase(first, last);
180  }
181 };
182 
183 typedef int32_t row_index_t;
184 typedef int32_t col_index_t;
185 
186 class Document {
187 public:
188  // vector<char>は編集可能な所有データ、string_viewはDocument::allなどを参照する
189  // 読み取り専用ビュー。編集時はLine::to_vector()で所有データへ昇格する。
190  typedef std::variant<std::vector<char>, std::string_view> varline_t;
191 
192  // UTF-8をデコードし、フォントメトリクスで位置計算した結果。
193  // 論理行と折り返し断片の双方で使うが、それぞれのLineが個別に所有する。
194  struct LineProperty {
195  CharBuffer chars; // デコード済み文字と各文字のX座標
196  std::vector<CharFlags> flags; // charsと同じ添字で参照する描画フラグ
197  // bool char_diff = false; // 文字単位diff情報を保持しているか
198  // charsを再利用できる入力テキストとフォントメトリクスの世代。
199  uint64_t text_revision = 0;
200  uint64_t metrics_revision = 0;
201  };
202 
203  enum LineType {
208  };
209  struct Line {
210  struct Meta {
211  LineType type = Normal; // 通常行、diff追加行、削除行などの種別
212  uint64_t text_revision = 1; // text変更時に増加する解析キャッシュ世代
213  col_index_t logical_col_pos = 0; // 折り返し断片の論理行内開始列
214  col_index_t logical_col_len = 0; // 折り返し断片が受け持つコードポイント数
215  int32_t line_number_override = -1; // 画面表示用行番号。-1のとき(論理行+1)、0のとき非表示、1以上のときはこの値を表示
216  mutable std::shared_ptr<LineProperty> detail; // デコード・文字位置計算キャッシュ
217  // 論理行だけが使用する折り返し結果。各要素は1表示行に対応する。
218  // 表示行の平坦なコピーは持たず、LineIndexMapのwrap_indexで参照する。
219  mutable std::vector<Document::Line> visual_lines;
220  };
221  struct D {
222  varline_t text = std::string_view(); // 改行コードを含み得るUTF-8列
223  Meta meta; // textから導出される情報と表示属性
224  };
225  // LineのコピーはDを共有する浅いコピー。折り返し断片のvector自体は
226  // 別Lineだが、Lineをコンテナ間でコピーすると同じDを参照する。
227  std::shared_ptr<D> sp;
228 
230  : sp(std::make_shared<D>())
231  {
232  }
233 
234  explicit Line(std::vector<char> const &ba, LineType type = Normal)
235  : sp(std::make_shared<D>())
236  {
237  sp->text = ba;
238  sp->meta.type = type;
239  }
240 
241  explicit Line(QByteArray const &ba, LineType type = Normal)
242  : sp(std::make_shared<D>())
243  {
244  sp->text = std::vector<char>(ba.data(), ba.data() + ba.size());
245  sp->meta.type = type;
246  }
247 
248  static Line InvalidLine()
249  {
250  Line line;
251  line.sp->meta.type = Invalid;
252  return line;
253  }
254 
256  {
257  Line line;
258  line.sp->meta.type = Normal;
259  return line;
260  }
261 
262  static Line None()
263  {
264  Line line;
265  line.sp->meta.type = Invalid;
266  return line;
267  }
268 
269  static Line View(std::string_view v, LineType type)
270  {
271  Line line;
272  line.sp->text = v;
273  line.sp->meta.type = type;
274  return line;
275  }
276 
277  static Line View(std::string_view v, Meta const &meta)
278  {
279  Line line;
280  line.sp->text = v;
281  line.sp->meta = meta;
282  return line;
283  }
284 
285  static Line View(std::string_view v)
286  {
287  return View(v, {});
288  }
289 
290  static Line View(Line const &line)
291  {
292  if (std::holds_alternative<std::string_view>(line.sp->text)) {
293  return line;
294  }
295  std::vector<char> const *v = std::get_if<std::vector<char>>(&line.sp->text);
296  assert(v);
297  return View(std::string_view(v->data(), v->size()), line.sp->meta);
298  }
299 
300  // テキストと表示属性を複製し、解析・折り返しキャッシュは引き継がない。
301  // 外部Documentの取り込みや、同じDを参照する論理行の並列更新前に使う。
303  {
304  std::vector<char> owned_text;
305  std::string_view source_text = text();
306  if (!source_text.empty()) {
307  owned_text.assign(source_text.begin(), source_text.end());
308  }
309  Line line(owned_text, sp->meta.type);
310  line.sp->meta.text_revision = sp->meta.text_revision;
311  line.sp->meta.logical_col_pos = sp->meta.logical_col_pos;
312  line.sp->meta.logical_col_len = sp->meta.logical_col_len;
313  line.sp->meta.line_number_override = sp->meta.line_number_override;
314  return line;
315  }
316 
318  {
319  if (!sp.unique()) {
320  *this = detached_copy();
321  }
322  }
323 
324  LineType type() const
325  {
326  return sp->meta.type;
327  }
328 
330  {
331  sp->meta.line_number_override = num;
332  }
333 
335  {
336  return sp->meta.detail.get();
337  }
338 
340  {
341  sp->meta.detail = std::make_shared<LineProperty>();
342  return detail();
343  }
344 
346  {
347  sp->meta.detail.reset();
348  }
349 
350  bool ends_with_new_line() const
351  {
352  int c = text().empty() ? 0 : text().back();
353  return c == '\n' || c == '\r';
354  }
355 
356  std::string_view text() const
357  {
358  if (std::holds_alternative<std::string_view>(sp->text)) {
359  return std::get<std::string_view>(sp->text);
360  }
361  std::vector<char> const *v = std::get_if<std::vector<char>>(&sp->text);
362  assert(v);
363  return std::string_view(v->data(), v->size());
364  }
365 
366  void set_text(std::vector<char> const &text)
367  {
368  sp->text = text;
369  sp->meta.text_revision++;
370  sp->meta.detail.reset();
371  }
372 
373  std::vector<char> *to_vector()
374  {
375  if (std::string_view *sv = std::get_if<std::string_view>(&sp->text)) {
376  sp->text = std::vector<char>(sv->data(), sv->data() + sv->size());
377  }
378  std::vector<char> *v = std::get_if<std::vector<char>>(&sp->text);
379  assert(v);
380  return v;
381  }
382 
383  void append_text(std::string_view new_text)
384  {
385  if (!new_text.empty()) {
386  std::vector<char> *v = to_vector();
387  v->insert(v->end(), new_text.data(), new_text.data() + new_text.size());
388  sp->meta.text_revision++;
389  sp->meta.detail.reset();
390  sp->meta.visual_lines.clear();
391  }
392  }
393 
394  void append_text(const std::vector<char> &new_text)
395  {
396  if (!new_text.empty()) {
397  append_text(std::string_view(new_text.data(), new_text.size()));
398  }
399  }
400 
401  void append_text(char c)
402  {
403  append_text(std::string_view(&c, 1));
404  }
405 
407  {
408  sp->meta.visual_lines.clear();
409  }
410  };
411 
412 
413  QByteArray all; // openFile()で読み込んだファイル全体の所有領域
414  // std::vector<varline_t> raw_lines; // allを行単位に分けたビュー(互換・保持用)
415 
416  // 文書の唯一の正本。折り返し断片やLineIndexMapはここから再生成できる。
417  std::vector<Line> logical_lines;
418 };
419 
421 public:
423 };
424 
427 };
428 
432 };
433 
435  bool enabled = false; // falseならlrow/lcolは選択端点として無効
436  row_index_t lrow = 0; // 論理行番号
437  col_index_t lcol = 0; // 論理行内のコードポイント位置
438  explicit operator bool () const
439  {
440  return enabled;
441  }
442  int compare(SelectionAnchor const &a) const
443  {
444  if (enabled && a.enabled) {
445  if (lrow < a.lrow) return -1;
446  if (lrow > a.lrow) return 1;
447  if (lcol < a.lcol) return -1;
448  if (lcol > a.lcol) return 1;
449  } else {
450  if (a.enabled) return -1;
451  if (enabled) return 1;
452  }
453  return 0;
454  }
455 };
456 static inline bool operator == (SelectionAnchor const &a, SelectionAnchor const &b) { return a.compare(b) == 0; }
457 static inline bool operator != (SelectionAnchor const &a, SelectionAnchor const &b) { return a.compare(b) != 0; }
458 static inline bool operator <= (SelectionAnchor const &a, SelectionAnchor const &b) { return a.compare(b) <= 0; }
459 static inline bool operator >= (SelectionAnchor const &a, SelectionAnchor const &b) { return a.compare(b) >= 0; }
460 static inline bool operator < (SelectionAnchor const &a, SelectionAnchor const &b) { return a.compare(b) < 0; }
461 static inline bool operator > (SelectionAnchor const &a, SelectionAnchor const &b) { return a.compare(b) > 0; }
462 
463 using TextEditorEngine_sp = std::shared_ptr<TextEditorEngine>;
464 
465 struct PositionX {
466  int absolute_x_px = 0; // 桁ピクセル座標(行頭基準)
467  int visual_x_px = 0; // 桁ピクセル座標(クライアント領域基準)
468 };
469 
470 struct RowCol {
474  : row(row)
475  , col(col)
476  {
477  }
478 };
479 
481  QRect cursor_rect; // IMEへ通知する、ウィジェット座標系のカーソル矩形
482  row_index_t current_visual_row = 0; // 表示行(物理行)
483  col_index_t current_visual_col = 0; // 表示列(物理列)
484  int current_visual_col_hint = 0; // 上下移動時に維持したい表示列
485  PositionX current_pos; // 桁ピクセル座標
486  int current_visual_y_px = 0; // 行ピクセル座標
487  row_index_t saved_row = 0; // terminal modeなどで一時退避する表示行
488  col_index_t saved_col = 0; // 同上の表示列
489  int saved_col_hint = 0; // 同上の列ヒント
490  int current_char_span = 1; // 現在文字が占める表示セル数
491  int scroll_horz_pos_px = 0; // 水平スクロール量(ピクセル)
492  int scroll_vert_pos_px = 0; // 垂直スクロール量(実態は表示行数)
493  col_index_t viewport_org_x_cols = 0; // テキスト領域の原点(桁位置)(行番号表示領域の幅の文字数)
494  row_index_t viewport_org_y_rows = 0; // ビューポート上端の行オフセット
495  int viewport_width_px = 640; // ビューポート幅(ピクセル)
496  int viewport_height_rows = 25; // ビューポートに入る表示行数
497  int tab_indent_size = 4; // タブストップ間隔
498  int bottom_line_y = -1; // 最終描画行のY位置(未設定は-1)
499  TextEditorEngine_sp engine; // Documentを共有するエンジン
500  // 論理行ごとの折り返し数・各断片長を保持し、論理座標と表示座標を変換する。
501  // wrapping時のvisual_lines参照は、この索引と常に同じ世代でなければならない。
503  struct Cache {
504  std::optional<row_index_t> nlines; // 総表示行数。nulloptならLineIndexMapから再取得
505  row_index_t current_logical_row = 0; // 現在の表示座標を変換した一時結果
506  col_index_t current_logical_col = 0; // 同上の論理列
507  bool scroll_bar_update_needed = true; // 次回の表示更新でrangeを再設定する
508  };
509  mutable Cache cache;
510 };
511 
513 public:
514  class Font {
515  public:
516  struct TextWidthCache {
517  // 同じ文字列のhorizontalAdvance()呼び出しを抑える。
518  // フォント変更時には必ず全消去する。
519  std::unordered_map<QString, int> map;
520  };
521  QFont text_font_; // 計測対象フォント
522  std::unique_ptr<QFontMetrics> fm_; // text_font_に対応するメトリクス
523  int ascent_ = 0; // ベースラインより上の高さ
524  int descent_ = 0; // ベースラインより下の高さ
525  QSize basic_character_size_; // 基準文字"0"の幅とフォントの高さ
526  mutable TextWidthCache text_width_cache_; // 文字列単位の幅キャッシュ
527 
528  void set_font(QFont const &font)
529  {
530  text_font_ = font;
531  text_width_cache_.map.clear();
532 
533  QPixmap pm(1, 1);
534  QPainter pr(&pm);
535  pr.setFont(text_font_);
536  fm_ = std::make_unique<QFontMetrics>(pr.fontMetrics());
537  ascent_ = fm_->ascent();
538  descent_ = fm_->descent();
539  basic_character_size_ = QSize(fm_->horizontalAdvance("0"), fm_->height());
540  }
541  QFont font() const
542  {
543  return text_font_;
544  }
545  int basis_char_width() const
546  {
547  int w = basic_character_size_.width();
548  return w > 0 ? w : 1;
549  }
550  int basis_char_height() const
551  {
552  int h = basic_character_size_.height();
553  return h > 0 ? h : 1;
554  }
555  int text_width(QString const &text) const
556  {
557  int ret = 0;
558  auto it = text_width_cache_.map.find(text);
559  if (it != text_width_cache_.map.end()) {
560  ret = it->second;
561  } else {
562  ret = fm_->horizontalAdvance(text);
563  text_width_cache_.map[text] = ret;
564  }
565  return ret;
566  }
567  };
568 
569  static const int LINE_NUMBER_AREA_WIDTH = 8;
570 
571  enum class WriteMode {
572  Insert,
573  Overwrite,
574  };
575 
576  enum class State {
577  Normal,
578  Exit,
579  };
580 
581  enum class WrappingMode {
582  NoWrap,
583  CharWrap,
584  WordWrap,
585  };
586 
587  struct Option {
590  QRect clip;
591  };
592 
593  struct Char16 {
594  uint16_t c = 0;
596  };
597 
598  static int charWidth(uint32_t c);
599 
601  public:
602  QString text;
603  enum Attr {
604  StyleID = 0x00ffffff,
605  Selected = 0x01000000,
606  };
607  uint32_t atts;
608  FormattedLine(QString const &text, int atts)
609  : text(text)
610  , atts(atts)
611  {
612  }
613  bool isSelected() const
614  {
615  return atts & Selected;
616  }
617  };
618 
619 private:
620  // 実装詳細と状態を隠すPimpl。所有権は本クラスにありデストラクタで破棄する。
621  struct Private;
623 protected:
624  SelectionAnchor const &selection_start() const;
625  SelectionAnchor const &selection_end() const;
626  void set_selection_start(SelectionAnchor const &anchor);
627  void set_selection_end(SelectionAnchor const &anchor);
628  void set_selection_start_enabled(bool enabled);
629  void set_selection_end_enabled(bool enabled);
630  void sync_selection();
631  void clear_selection();
632 protected:
633  // 総表示行数。NoWrapでは論理行数、wrapping時はLineIndexMapの値の総和。
634  row_index_t visual_nlines() const;
636 
637  // 表示行をLineIndexMapで(logical row, wrap index)へ変換して取得する。
638  // 戻り値はlogical_lines内または論理行のvisual_lines内を指す非所有ポインタ。
640 
642  {
643  return const_cast<AbstractTextEditorApplication *>(this)->visual_line(vrow);
644  }
645 
646  void initEditor();
647 protected:
648  const Document::Line *currentLine() const;
649 
653  int current_visual_col() const;
654  int current_visual_x_px() const;
655 
656  int scroll_vert_pos_px() const;
657  int scroll_horz_pos_px() const;
658 
659  int cursor_col_px() const;
660  int cursor_row_px() const;
661 
662  void set_scroll_vert_pos_px(int row);
663  void set_scroll_horz_pos_px(int col);
664 
665  int editor_viewport_width_px() const;
666  int editor_viewport_height() const;
667 
668  // カーソル、スクロール、Document、LineIndexMapをまとめた実行時コンテキスト。
669  // TextEditorViewなど派生クラスも描画時に参照する。
670  std::shared_ptr<TextEditorContext> editor_cx;
671 
673  TextEditorContext const *cx() const;
674 
675  Document *document();
676  Document const *document() const;
677  int logical_nlines() const;
678 
680 
681  int leftMargin_() const;
682 
685  bool change_col = true;
686  bool auto_scroll = true;
687  };
688  virtual void updateVisibility(UpdateVisibilityOption const &arg) = 0;
689 
690  void insert_line(row_index_t lrow); // DocumentとLineIndexMapへ同じ位置を挿入する
691  bool commit_line(row_index_t lrow, const CharBuffer &vec); // 変更行だけを再解析・再折り返しする
692 
693  void doDelete();
694  void doBackspace();
695 
696  void invalidate_visual_row_info(row_index_t vrow, size_t n = -1);
698  void invalidate_visual_line_details(row_index_t vrow, size_t n = -1);
699 
701 
702  virtual void calc_pos_x(CharBuffer *chars) const {}
703 
704 private:
705  void internalWrite(const ushort *begin, const ushort *end);
706  SelectionAnchor currentAnchor(bool enabled) const;
707  enum class EditOperation {
708  Cut,
709  Copy,
710  };
711  std::optional<CharBuffer> edit_selection(EditOperation op);
712  int calcColumnToIndex(int column);
713  void _edit_op(EditOperation op);
714  bool is_current_line_writable() const;
715  void initEngine(const std::shared_ptr<TextEditorContext>& cx);
716  void writeCR();
717  bool deleteIfSelected();
718  void _set_cursor_col(col_index_t col, bool auto_scroll = true, bool by_mouse = false);
719  std::vector<Document::Line> *documentLinesForWrite(bool check_readonly = true);
720 public:
723  RowCol visual_position(SelectionAnchor const &a) const;
724 protected:
726  const CharBuffer *parse_current_line() const;
727 private:
728  CharBuffer _parse_line(const TextEditorContext *cx, const Document::Line *line, std::mutex *mutex) const;
729 protected:
730  CharBuffer _parse_line(Document::Line const *line, std::mutex *mutex = nullptr) const;
731  CharBuffer *parse_line(row_index_t vrow) const;
732 
733  virtual void updateScrollBarRange() {}
734 
735  virtual void setCursorRow(row_index_t vrow, bool auto_scroll = true, bool by_mouse = false);
736  virtual void setCursorCol(col_index_t vcol);
737  void setCursorPos(RowCol const &vpos);
738  void setCursorPosByMouse(RowCol vpos, QPoint pt);
739 
740  static int nextTabStop(TextEditorContext const *cx, int x);
741  int scrollBottomLimit() const;
742  int scrollBottomLimit2() const;
743  bool isPaintingSuppressed() const;
744  void setPaintingSuppressed(bool f);
745 
746  void writeNewLine();
747 
748  void update_horz_scroll();
749 
750  QString statusLine() const;
751 
752 
753  void paintLineNumbers(std::function<void(int, QString const &, Document::Line const *)> const &draw);
754  bool isAutoLayout() const;
755  void savePos();
756  void restorePos();
757 public:
758 
761 
762  void setRecentlyUsedPath(QString const &path);
763  QString recentlyUsedPath();
764 
765  virtual void layoutEditor();
766  void scrollUp();
767  void scrollDown();
768  void moveCursorOut();
769  void moveCursorHome(bool consider_indent);
770  void moveCursorEnd();
771  void moveCursorUp();
772  virtual void moveCursorDown();
773  void moveCursorLeft();
774  void moveCursorRight();
775  void movePageUp();
776  void movePageDown();
777  void scrollToTop();
778 
779  TextEditorEngine_sp engine() const;
780  int client_width_px() const;
781  int client_height_px() const;
782  void set_client_size(int w, int h, bool update_layout);
783  void setContentWidth(int w);
785  bool openFile(QString const &path, QString *error_message = nullptr);
786  bool saveFile(QString const &path, QString *error_message = nullptr);
787  void loadExampleFile();
788  void pressEnter();
789  void pressEscape();
790  State state() const;
791  bool isLineNumberVisible() const;
792  void showLineNumber(bool show, int left_margin = LINE_NUMBER_AREA_WIDTH);
793  void set_auto_layout(bool f);
794  void setDocument(const std::vector<Document::Line> *source);
795  void setSelectionAnchor(bool enabled, bool update_anchor, bool auto_scroll);
796  void setNormalTextEditorMode(bool f);
797  void set_read_only(bool f);
798  bool is_read_only() const;
799  void edit_paste();
800  void edit_copy();
801  void edit_cut();
802  void setWriteMode(WriteMode wm);
803  bool isInsertMode() const;
804  bool isOverwriteMode() const;
805  void setTerminalMode(bool f);
806  bool isTerminalMode() const;
807  void moveToTop();
808  void moveToBottom();
809  void set_line_margin(int n);
810  void write(uint32_t c, bool by_keyboard);
811  void write(char const *ptr, int len, bool by_keyboard);
812  void write(std::string const &text);
813  void write(QKeyEvent *e);
814  void setCursorVisible(bool show);
815  bool isCursorVisible();
816  void setModifierKeys(Qt::KeyboardModifiers const &keymod);
817  bool isControlModifierPressed() const;
818  bool isShiftModifierPressed() const;
819  void clearShiftModifier();
820  bool isChanged() const;
821  void setChanged(bool f);
822  void logicalMoveToBottom();
823  void appendBulk(std::string_view const &str);
824  void clear();
825 protected:
826  virtual PositionX currentPixelX() const { return {}; }
827 private:
828  // 1論理行を現在の幅とWrappingModeで表示行へ分割する。
829  // 入力行のLinePropertyが有効ならUTF-8解析と文字幅計測は再利用される。
830  std::vector<Document::Line> _wrap_line(Document::Line line, std::mutex *mutex) const;
831 
832  void wrap_line(Document::Line *ll, bool force, std::mutex *mutex);
833  void update_line_index_map(row_index_t lrow, Document::Line *ll, std::mutex *mutex);
834 
835  bool _update_line(row_index_t lrow, std::optional<std::vector<char>> text, bool force, std::mutex *mutex);
836 protected:
837  bool update_visual_line(row_index_t lrow, bool force);
838  // 幅・フォント・モード・文書全体の変更時に、全論理行を並列で再折り返しする。
840 private:
841  void _update_logical_pos_cache() const;
842  void delete_line(row_index_t lrow);
843 protected:
846 protected:
847  bool isWidthFixed() const;
848 protected:
849  void write_(char const *ptr, bool by_keyboard);
850  void write_(QString const &text, bool by_keyboard);
851 
852  bool hasSelection() const;
853  void updateSelectionAnchor1(bool auto_scroll);
854  void updateSelectionAnchor2(bool auto_scroll);
855 
856  void set_fixed_font(const QFont &font);
857  void set_text_font(const QFont &font);
858  Font const &fixed_font() const;
859  Font const &text_font() const;
860  void set_line_margin_px(int top, int bottom);
861  int line_baseline_px() const;
863  int linenum_area_width_px() const;
864  void new_document();
865 public:
866  int line_height_px() const;
867 
868  void setWrappingMode(WrappingMode mode);
870 
871  bool save(std::function<bool (char const *p, size_t n)> callback) const
872  {
873  std::vector<Document::Line> const &llines = document()->logical_lines;
874  for (Document::Line const &line : llines) {
875  std::string_view view = line.text();
876  if (!callback(view.data(), view.size())) {
877  return false;
878  }
879  }
880  return true;
881  }
882 };
883 
884 #endif // ABSTRACTTEXTEDITORAPPLICATION_H
int32_t row_index_t
Definition: AbstractTextEditorApplication.h:183
static bool operator>(SelectionAnchor const &a, SelectionAnchor const &b)
Definition: AbstractTextEditorApplication.h:461
int32_t col_index_t
Definition: AbstractTextEditorApplication.h:184
std::shared_ptr< TextEditorEngine > TextEditorEngine_sp
Definition: AbstractTextEditorApplication.h:463
static bool operator>=(SelectionAnchor const &a, SelectionAnchor const &b)
Definition: AbstractTextEditorApplication.h:459
static bool operator<=(SelectionAnchor const &a, SelectionAnchor const &b)
Definition: AbstractTextEditorApplication.h:458
static bool operator==(SelectionAnchor const &a, SelectionAnchor const &b)
Definition: AbstractTextEditorApplication.h:456
static bool operator!=(SelectionAnchor const &a, SelectionAnchor const &b)
Definition: AbstractTextEditorApplication.h:457
static bool operator<(SelectionAnchor const &a, SelectionAnchor const &b)
Definition: AbstractTextEditorApplication.h:460
Definition: AbstractTextEditorApplication.h:514
QFont font() const
Definition: AbstractTextEditorApplication.h:541
QSize basic_character_size_
Definition: AbstractTextEditorApplication.h:525
int basis_char_width() const
Definition: AbstractTextEditorApplication.h:545
TextWidthCache text_width_cache_
Definition: AbstractTextEditorApplication.h:526
int text_width(QString const &text) const
Definition: AbstractTextEditorApplication.h:555
int basis_char_height() const
Definition: AbstractTextEditorApplication.h:550
int ascent_
Definition: AbstractTextEditorApplication.h:523
int descent_
Definition: AbstractTextEditorApplication.h:524
QFont text_font_
Definition: AbstractTextEditorApplication.h:521
std::unique_ptr< QFontMetrics > fm_
Definition: AbstractTextEditorApplication.h:522
void set_font(QFont const &font)
Definition: AbstractTextEditorApplication.h:528
Definition: AbstractTextEditorApplication.h:600
uint32_t atts
Definition: AbstractTextEditorApplication.h:607
QString text
Definition: AbstractTextEditorApplication.h:602
bool isSelected() const
Definition: AbstractTextEditorApplication.h:613
Attr
Definition: AbstractTextEditorApplication.h:603
@ Selected
Definition: AbstractTextEditorApplication.h:605
@ StyleID
Definition: AbstractTextEditorApplication.h:604
FormattedLine(QString const &text, int atts)
Definition: AbstractTextEditorApplication.h:608
Definition: AbstractTextEditorApplication.h:512
void set_client_size(int w, int h, bool update_layout)
Definition: AbstractTextEditorApplication.cpp:1013
row_index_t current_visual_row() const
Definition: AbstractTextEditorApplication.cpp:312
void writeCR()
Definition: AbstractTextEditorApplication.cpp:2367
CharBuffer * parse_line(row_index_t vrow) const
行を解析してCharacterの配列を返す(全文字のX座標を計算する)
Definition: AbstractTextEditorApplication.cpp:527
void ensure_current_line_visible()
Definition: AbstractTextEditorApplication.cpp:1374
std::optional< CharBuffer > edit_selection(EditOperation op)
Definition: AbstractTextEditorApplication.cpp:1547
void set_selection_start_enabled(bool enabled)
Definition: AbstractTextEditorApplication.cpp:419
void setNormalTextEditorMode(bool f)
Definition: AbstractTextEditorApplication.cpp:2162
SelectionAnchor currentAnchor(bool enabled) const
Definition: AbstractTextEditorApplication.cpp:2167
void delete_line(row_index_t lrow)
Definition: AbstractTextEditorApplication.cpp:1707
EditOperation
Definition: AbstractTextEditorApplication.h:707
bool isControlModifierPressed() const
Definition: AbstractTextEditorApplication.cpp:164
bool _update_line(row_index_t lrow, std::optional< std::vector< char >> text, bool force, std::mutex *mutex)
論理行を更新する
Definition: AbstractTextEditorApplication.cpp:820
void clearShiftModifier()
Definition: AbstractTextEditorApplication.cpp:159
void set_auto_layout(bool f)
Definition: AbstractTextEditorApplication.cpp:174
bool isAutoLayout() const
Definition: AbstractTextEditorApplication.cpp:2157
void invalidate_visual_line_details(row_index_t vrow, size_t n=-1)
Definition: AbstractTextEditorApplication.cpp:577
std::vector< Document::Line > * documentLinesForWrite(bool check_readonly=true)
Definition: AbstractTextEditorApplication.cpp:1040
void set_selection_end(SelectionAnchor const &anchor)
Definition: AbstractTextEditorApplication.cpp:414
int current_visual_col() const
Definition: AbstractTextEditorApplication.cpp:317
void setTextEditorEngine(const TextEditorEngine_sp &e)
Definition: AbstractTextEditorApplication.cpp:1159
void setContentWidth(int w)
Definition: AbstractTextEditorApplication.cpp:1022
void set_text_font(const QFont &font)
Definition: AbstractTextEditorApplication.cpp:1445
void setTerminalMode(bool f)
Definition: AbstractTextEditorApplication.cpp:2240
virtual void setCursorRow(row_index_t vrow, bool auto_scroll=true, bool by_mouse=false)
Definition: AbstractTextEditorApplication.cpp:1481
void internalWrite(const ushort *begin, const ushort *end)
Definition: AbstractTextEditorApplication.cpp:2288
void edit_cut()
Definition: AbstractTextEditorApplication.cpp:2218
void loadExampleFile()
Definition: TextEditorView.cpp:125
int calcColumnToIndex(int column)
Definition: AbstractTextEditorApplication.cpp:1814
col_index_t current_logical_col() const
Definition: AbstractTextEditorApplication.cpp:296
TextEditorContext * cx()
Definition: AbstractTextEditorApplication.cpp:1126
int logical_nlines() const
論理行数を返す
Definition: AbstractTextEditorApplication.cpp:225
SelectionAnchor const & selection_start() const
Definition: AbstractTextEditorApplication.cpp:399
void setRecentlyUsedPath(QString const &path)
Definition: AbstractTextEditorApplication.cpp:211
void set_read_only(bool f)
Definition: AbstractTextEditorApplication.cpp:2176
bool saveFile(QString const &path, QString *error_message=nullptr)
Definition: AbstractTextEditorApplication.cpp:1303
virtual void moveCursorDown()
Definition: AbstractTextEditorApplication.cpp:1940
void movePageUp()
Definition: AbstractTextEditorApplication.cpp:2049
void scrollToTop()
Definition: AbstractTextEditorApplication.cpp:1950
int editor_viewport_height() const
Definition: AbstractTextEditorApplication.cpp:1116
Private * m
Definition: AbstractTextEditorApplication.h:621
bool is_current_line_writable() const
Definition: AbstractTextEditorApplication.cpp:1094
void moveCursorRight()
Definition: AbstractTextEditorApplication.cpp:1989
void setWriteMode(WriteMode wm)
Definition: AbstractTextEditorApplication.cpp:2225
std::vector< Document::Line > _wrap_line(Document::Line line, std::mutex *mutex) const
Definition: AbstractTextEditorApplication.cpp:613
static int nextTabStop(TextEditorContext const *cx, int x)
Definition: AbstractTextEditorApplication.cpp:1539
int linenum_area_width_px() const
行番号表示領域の幅を返す(ピクセル単位)
Definition: AbstractTextEditorApplication.cpp:261
void moveCursorOut()
Definition: AbstractTextEditorApplication.cpp:1859
bool isWidthFixed() const
Definition: AbstractTextEditorApplication.cpp:1386
Document * document()
Definition: AbstractTextEditorApplication.cpp:1359
bool update_visual_line(row_index_t lrow, bool force)
論理行番号に対応する物理行情報を更新する
Definition: AbstractTextEditorApplication.cpp:859
virtual PositionX currentPixelX() const
Definition: AbstractTextEditorApplication.h:826
static int charWidth(uint32_t c)
Definition: AbstractTextEditorApplication.cpp:998
void doDelete()
Definition: AbstractTextEditorApplication.cpp:1718
void updateSelectionAnchor2(bool auto_scroll)
Definition: AbstractTextEditorApplication.cpp:1429
State state() const
Definition: AbstractTextEditorApplication.cpp:1354
void set_current_visual_col(col_index_t col)
Definition: AbstractTextEditorApplication.cpp:307
bool deleteIfSelected()
Definition: AbstractTextEditorApplication.cpp:1695
bool openFile(QString const &path, QString *error_message=nullptr)
Definition: AbstractTextEditorApplication.cpp:1225
QString statusLine() const
Definition: AbstractTextEditorApplication.cpp:2107
virtual void calc_pos_x(CharBuffer *chars) const
Definition: AbstractTextEditorApplication.h:702
int cursor_col_px() const
Definition: AbstractTextEditorApplication.cpp:353
LineIndexMap::LogicalPosition query_logical_for_visual_row(row_index_t vrow) const
物理行番号から論理行番号と論理列番号を求める。
Definition: AbstractTextEditorApplication.cpp:540
row_index_t lrow_to_vrow(row_index_t lrow) const
論理行番号から物理行番号を求める。
Definition: AbstractTextEditorApplication.cpp:762
void initEngine(const std::shared_ptr< TextEditorContext > &cx)
Definition: AbstractTextEditorApplication.cpp:1121
void setCursorVisible(bool show)
Definition: AbstractTextEditorApplication.cpp:186
void moveCursorHome(bool consider_indent)
Definition: AbstractTextEditorApplication.cpp:1864
int scrollBottomLimit2() const
Definition: AbstractTextEditorApplication.cpp:1854
int leftMargin_() const
Definition: AbstractTextEditorApplication.cpp:206
void update_visual_lines_all()
全論理行の折り返し結果とLineIndexMapを再構築する
Definition: AbstractTextEditorApplication.cpp:875
int line_height_px() const
Definition: AbstractTextEditorApplication.cpp:1469
void pressEscape()
Definition: AbstractTextEditorApplication.cpp:1344
const CharBuffer * parse_current_line() const
Definition: AbstractTextEditorApplication.cpp:594
void clear_selection()
Definition: AbstractTextEditorApplication.cpp:434
bool isLineNumberVisible() const
Definition: AbstractTextEditorApplication.cpp:993
void restorePos()
Definition: AbstractTextEditorApplication.cpp:1401
void doBackspace()
Definition: AbstractTextEditorApplication.cpp:1796
bool isInsertMode() const
Definition: AbstractTextEditorApplication.cpp:2230
void setCursorPosByMouse(RowCol vpos, QPoint pt)
Definition: AbstractTextEditorApplication.cpp:1532
RowCol visual_position(SelectionAnchor const &a) const
Definition: AbstractTextEditorApplication.cpp:782
void setDocument(const std::vector< Document::Line > *source)
Definition: AbstractTextEditorApplication.cpp:1046
State
Definition: AbstractTextEditorApplication.h:576
void set_scroll_horz_pos_px(int col)
Definition: AbstractTextEditorApplication.cpp:345
AbstractTextEditorApplication::WrappingMode wrappingMode() const
Definition: AbstractTextEditorApplication.cpp:608
int client_height_px() const
Definition: AbstractTextEditorApplication.cpp:1008
int scrollBottomLimit() const
Definition: AbstractTextEditorApplication.cpp:1849
void write(uint32_t c, bool by_keyboard)
Definition: AbstractTextEditorApplication.cpp:2374
bool isCursorVisible()
Definition: AbstractTextEditorApplication.cpp:191
int scroll_vert_pos_px() const
Definition: AbstractTextEditorApplication.cpp:327
void set_selection_end_enabled(bool enabled)
Definition: AbstractTextEditorApplication.cpp:424
void pressEnter()
Definition: AbstractTextEditorApplication.cpp:1338
const Document::Line * currentLine() const
Definition: AbstractTextEditorApplication.cpp:391
int scroll_horz_pos_px() const
Definition: AbstractTextEditorApplication.cpp:332
int line_baseline_px() const
Definition: AbstractTextEditorApplication.cpp:1475
void update_line_index_map(row_index_t lrow, Document::Line *ll, std::mutex *mutex)
論理行に対応する物理行数を更新する(line_index_map)
Definition: AbstractTextEditorApplication.cpp:798
void setSelectionAnchor(bool enabled, bool update_anchor, bool auto_scroll)
Definition: AbstractTextEditorApplication.cpp:2186
bool isPaintingSuppressed() const
Definition: AbstractTextEditorApplication.cpp:1030
void scrollUp()
Definition: AbstractTextEditorApplication.cpp:1913
void _set_cursor_col(col_index_t col, bool auto_scroll=true, bool by_mouse=false)
Definition: AbstractTextEditorApplication.cpp:1503
void need_to_update_scroll_bar()
スクロールバー更新が必要であることを通知する
Definition: AbstractTextEditorApplication.cpp:252
bool hasSelection() const
Definition: AbstractTextEditorApplication.cpp:1411
virtual void setCursorCol(col_index_t vcol)
Definition: AbstractTextEditorApplication.cpp:1520
void insert_line(row_index_t lrow)
Definition: AbstractTextEditorApplication.cpp:1069
void write_(char const *ptr, bool by_keyboard)
Definition: AbstractTextEditorApplication.cpp:2606
bool isChanged() const
Definition: AbstractTextEditorApplication.cpp:196
void _edit_op(EditOperation op)
Definition: AbstractTextEditorApplication.cpp:1670
void wrap_line(Document::Line *ll, bool force, std::mutex *mutex)
Definition: AbstractTextEditorApplication.cpp:744
WrappingMode
Definition: AbstractTextEditorApplication.h:581
virtual void layoutEditor()
Definition: AbstractTextEditorApplication.cpp:978
bool isShiftModifierPressed() const
Definition: AbstractTextEditorApplication.cpp:169
void edit_paste()
Definition: AbstractTextEditorApplication.cpp:2196
void sync_selection()
Definition: AbstractTextEditorApplication.cpp:429
void appendBulk(std::string_view const &str)
文字列を複数行に分割して、ドキュメントの末尾に追加する
Definition: AbstractTextEditorApplication.cpp:2510
CharBuffer parse_logical_line(const TextEditorContext *cx, row_index_t lrow) const
Definition: AbstractTextEditorApplication.cpp:1084
void moveCursorUp()
Definition: AbstractTextEditorApplication.cpp:1930
Font const & text_font() const
Definition: AbstractTextEditorApplication.cpp:1458
void movePageDown()
Definition: AbstractTextEditorApplication.cpp:2063
Font const & fixed_font() const
Definition: AbstractTextEditorApplication.cpp:1453
void setCursorPos(RowCol const &vpos)
Definition: AbstractTextEditorApplication.cpp:1526
bool save(std::function< bool(char const *p, size_t n)> callback) const
Definition: AbstractTextEditorApplication.h:871
void set_scroll_vert_pos_px(int row)
Definition: AbstractTextEditorApplication.cpp:337
Document::Line const * visual_line(row_index_t vrow) const
Definition: AbstractTextEditorApplication.h:641
void setWrappingMode(WrappingMode mode)
Definition: AbstractTextEditorApplication.cpp:599
row_index_t vrow_to_lrow(row_index_t vrow) const
Definition: AbstractTextEditorApplication.cpp:772
static const int LINE_NUMBER_AREA_WIDTH
Definition: AbstractTextEditorApplication.h:569
void logicalMoveToBottom()
Definition: AbstractTextEditorApplication.cpp:2269
bool isOverwriteMode() const
Definition: AbstractTextEditorApplication.cpp:2235
void paintLineNumbers(std::function< void(int, QString const &, Document::Line const *)> const &draw)
Definition: AbstractTextEditorApplication.cpp:2114
bool is_read_only() const
Definition: AbstractTextEditorApplication.cpp:2181
bool commit_line(row_index_t lrow, const CharBuffer &vec)
論理行を更新する(テキストを指定して更新する)
Definition: AbstractTextEditorApplication.cpp:951
void moveToTop()
Definition: AbstractTextEditorApplication.cpp:2257
std::shared_ptr< TextEditorContext > editor_cx
Definition: AbstractTextEditorApplication.h:670
void new_document()
Definition: AbstractTextEditorApplication.cpp:1145
void _update_logical_pos_cache() const
Definition: AbstractTextEditorApplication.cpp:275
void moveCursorLeft()
Definition: AbstractTextEditorApplication.cpp:1958
WriteMode
Definition: AbstractTextEditorApplication.h:571
row_index_t current_logical_row() const
Definition: AbstractTextEditorApplication.cpp:290
void set_fixed_font(const QFont &font)
Definition: AbstractTextEditorApplication.cpp:1437
void setModifierKeys(Qt::KeyboardModifiers const &keymod)
Definition: AbstractTextEditorApplication.cpp:152
void edit_copy()
Definition: AbstractTextEditorApplication.cpp:2213
void invalidate_nlines_cache()
物理行数キャッシュを無効化する
Definition: AbstractTextEditorApplication.cpp:269
void update_horz_scroll()
Definition: AbstractTextEditorApplication.cpp:2082
int current_visual_x_px() const
Definition: AbstractTextEditorApplication.cpp:322
virtual void updateVisibility(UpdateVisibilityOption const &arg)=0
QString recentlyUsedPath()
Definition: AbstractTextEditorApplication.cpp:216
void setPaintingSuppressed(bool f)
Definition: AbstractTextEditorApplication.cpp:1035
void scrollDown()
Definition: AbstractTextEditorApplication.cpp:1921
void moveToBottom()
Definition: AbstractTextEditorApplication.cpp:2281
void invalidate_visual_row_info(row_index_t vrow, size_t n=-1)
指定した表示行範囲の描画・解析詳細を無効化する
Definition: AbstractTextEditorApplication.cpp:560
void showLineNumber(bool show, int left_margin=LINE_NUMBER_AREA_WIDTH)
Definition: AbstractTextEditorApplication.cpp:180
TextEditorEngine_sp engine() const
Definition: AbstractTextEditorApplication.cpp:1139
virtual ~AbstractTextEditorApplication()
Definition: AbstractTextEditorApplication.cpp:147
int cursor_row_px() const
Definition: AbstractTextEditorApplication.cpp:358
virtual void updateScrollBarRange()
Definition: AbstractTextEditorApplication.h:733
void savePos()
Definition: AbstractTextEditorApplication.cpp:1391
void initEditor()
Definition: AbstractTextEditorApplication.cpp:987
void clear()
Definition: AbstractTextEditorApplication.cpp:1171
void setChanged(bool f)
Definition: AbstractTextEditorApplication.cpp:201
void set_line_margin(int n)
Definition: AbstractTextEditorApplication.cpp:1369
void invalidate_logical_row_info(row_index_t vrow)
Definition: AbstractTextEditorApplication.cpp:565
SelectionAnchor const & selection_end() const
Definition: AbstractTextEditorApplication.cpp:404
int editor_viewport_width_px() const
Definition: AbstractTextEditorApplication.cpp:1111
void updateSelectionAnchor1(bool auto_scroll)
Definition: AbstractTextEditorApplication.cpp:1416
int client_width_px() const
Definition: AbstractTextEditorApplication.cpp:1003
CharBuffer _parse_line(const TextEditorContext *cx, const Document::Line *line, std::mutex *mutex) const
UTF-8行をCharacter列へ変換し、全文字のX座標を計算する
Definition: AbstractTextEditorApplication.cpp:450
row_index_t visual_nlines() const
物理行数を返す
Definition: AbstractTextEditorApplication.cpp:234
void set_line_margin_px(int top, int bottom)
Definition: AbstractTextEditorApplication.cpp:1463
Document::Line * visual_line(row_index_t vrow)
物理行を取得する
Definition: AbstractTextEditorApplication.cpp:368
void moveCursorEnd()
Definition: AbstractTextEditorApplication.cpp:1893
void set_selection_start(SelectionAnchor const &anchor)
Definition: AbstractTextEditorApplication.cpp:409
void writeNewLine()
Definition: AbstractTextEditorApplication.cpp:1176
void set_current_visual_row(row_index_t row)
Definition: AbstractTextEditorApplication.cpp:302
bool isTerminalMode() const
Definition: AbstractTextEditorApplication.cpp:2252
AbstractTextEditorApplication()
Definition: AbstractTextEditorApplication.cpp:142
Definition: AbstractTextEditorApplication.h:92
std::vector< Character >::const_iterator end() const
Definition: AbstractTextEditorApplication.h:157
void insert(std::vector< Character >::iterator pos, Character const *first, Character const *last)
Definition: AbstractTextEditorApplication.h:165
void push_back(Character const &c)
Definition: AbstractTextEditorApplication.h:137
void clear()
Definition: AbstractTextEditorApplication.h:109
CharBuffer()
Definition: AbstractTextEditorApplication.h:97
std::vector< Character >::iterator begin()
Definition: AbstractTextEditorApplication.h:145
void insert(std::vector< Character >::iterator pos, std::vector< Character >::const_iterator first, std::vector< Character >::const_iterator last)
Definition: AbstractTextEditorApplication.h:169
size_t size() const
Definition: AbstractTextEditorApplication.h:117
void emplace_back(Character const &c)
Definition: AbstractTextEditorApplication.h:141
bool empty() const
Definition: AbstractTextEditorApplication.h:121
std::vector< Character >::iterator end()
Definition: AbstractTextEditorApplication.h:149
CharBuffer(std::vector< Character > const &v)
Definition: AbstractTextEditorApplication.h:101
Character & operator[](size_t i)
Definition: AbstractTextEditorApplication.h:129
void erase(std::vector< Character >::iterator first, std::vector< Character >::iterator last)
Definition: AbstractTextEditorApplication.h:177
void resize(size_t n)
Definition: AbstractTextEditorApplication.h:113
void erase(std::vector< Character >::iterator pos)
Definition: AbstractTextEditorApplication.h:173
void insert(std::vector< Character >::iterator pos, Character const &first)
Definition: AbstractTextEditorApplication.h:161
void reserve(size_t n)
Definition: AbstractTextEditorApplication.h:105
std::shared_ptr< std::vector< Character > > vec
Definition: AbstractTextEditorApplication.h:96
Character const & back() const
Definition: AbstractTextEditorApplication.h:125
std::vector< Character >::const_iterator begin() const
Definition: AbstractTextEditorApplication.h:153
Definition: AbstractTextEditorApplication.h:186
std::vector< Line > logical_lines
Definition: AbstractTextEditorApplication.h:417
LineType
Definition: AbstractTextEditorApplication.h:203
@ Normal
Definition: AbstractTextEditorApplication.h:205
@ Del
Definition: AbstractTextEditorApplication.h:207
@ Add
Definition: AbstractTextEditorApplication.h:206
@ Invalid
Definition: AbstractTextEditorApplication.h:204
QByteArray all
Definition: AbstractTextEditorApplication.h:413
std::variant< std::vector< char >, std::string_view > varline_t
Definition: AbstractTextEditorApplication.h:190
Definition: LineIndexMap.h:29
Definition: AbstractTextEditorApplication.h:420
Document document
Definition: AbstractTextEditorApplication.h:422
Definition: AbstractTextEditorApplication.h:22
@ Right
Definition: AbstractTextEditorApplication.h:26
@ Delete
Definition: AbstractTextEditorApplication.h:31
@ Home
Definition: AbstractTextEditorApplication.h:28
@ End
Definition: AbstractTextEditorApplication.h:29
@ Insert
Definition: AbstractTextEditorApplication.h:30
@ PageUp
Definition: AbstractTextEditorApplication.h:32
@ Down
Definition: AbstractTextEditorApplication.h:25
@ PageDown
Definition: AbstractTextEditorApplication.h:33
@ Left
Definition: AbstractTextEditorApplication.h:27
@ Up
Definition: AbstractTextEditorApplication.h:24
Definition: GitObjectManager.h:7
static T num(char const *value, Option_ const &opt)
Definition: AbstractTextEditorApplication.h:593
CharAttr a
Definition: AbstractTextEditorApplication.h:595
uint16_t c
Definition: AbstractTextEditorApplication.h:594
Definition: AbstractTextEditorApplication.h:516
std::unordered_map< QString, int > map
Definition: AbstractTextEditorApplication.h:519
Definition: AbstractTextEditorApplication.h:587
CharFlags char_flag
Definition: AbstractTextEditorApplication.h:589
QRect clip
Definition: AbstractTextEditorApplication.h:590
CharAttr char_attr
Definition: AbstractTextEditorApplication.h:588
Definition: AbstractTextEditorApplication.cpp:95
Definition: AbstractTextEditorApplication.h:683
bool auto_scroll
Definition: AbstractTextEditorApplication.h:686
bool change_col
Definition: AbstractTextEditorApplication.h:685
bool ensure_current_line_visible
Definition: AbstractTextEditorApplication.h:684
Definition: AbstractTextEditorApplication.h:37
bool operator==(CharAttr const &r) const
Definition: AbstractTextEditorApplication.h:49
CharAttr(int index=Normal)
Definition: AbstractTextEditorApplication.h:45
QColor color
Definition: AbstractTextEditorApplication.h:44
uint16_t index
Definition: AbstractTextEditorApplication.h:43
Index
Definition: AbstractTextEditorApplication.h:38
@ Hilite
Definition: AbstractTextEditorApplication.h:41
@ Normal
Definition: AbstractTextEditorApplication.h:39
@ Invert
Definition: AbstractTextEditorApplication.h:40
bool operator!=(CharAttr const &r) const
Definition: AbstractTextEditorApplication.h:53
Definition: AbstractTextEditorApplication.h:59
bool selected
Definition: AbstractTextEditorApplication.h:68
DiffMarker
Definition: AbstractTextEditorApplication.h:60
@ Del
Definition: AbstractTextEditorApplication.h:62
@ Undefined
Definition: AbstractTextEditorApplication.h:61
@ Add
Definition: AbstractTextEditorApplication.h:63
@ _Reserved
Definition: AbstractTextEditorApplication.h:64
bool current_line
Definition: AbstractTextEditorApplication.h:69
uint16_t all
Definition: AbstractTextEditorApplication.h:73
uint8_t diff_marker
Definition: AbstractTextEditorApplication.h:70
Definition: AbstractTextEditorApplication.h:77
int right_x
Definition: AbstractTextEditorApplication.h:80
char32_t unicode
Definition: AbstractTextEditorApplication.h:78
CharAttr attr
Definition: AbstractTextEditorApplication.h:81
Character(char32_t unicode)
Definition: AbstractTextEditorApplication.h:83
int left_x
Definition: AbstractTextEditorApplication.h:79
Character()=default
Definition: AbstractTextEditorApplication.h:194
CharBuffer chars
Definition: AbstractTextEditorApplication.h:195
uint64_t metrics_revision
Definition: AbstractTextEditorApplication.h:200
std::vector< CharFlags > flags
Definition: AbstractTextEditorApplication.h:196
uint64_t text_revision
Definition: AbstractTextEditorApplication.h:199
Definition: AbstractTextEditorApplication.h:221
varline_t text
Definition: AbstractTextEditorApplication.h:222
Meta meta
Definition: AbstractTextEditorApplication.h:223
Definition: AbstractTextEditorApplication.h:210
int32_t line_number_override
Definition: AbstractTextEditorApplication.h:215
std::vector< Document::Line > visual_lines
Definition: AbstractTextEditorApplication.h:219
uint64_t text_revision
Definition: AbstractTextEditorApplication.h:212
col_index_t logical_col_len
Definition: AbstractTextEditorApplication.h:214
std::shared_ptr< LineProperty > detail
Definition: AbstractTextEditorApplication.h:216
col_index_t logical_col_pos
Definition: AbstractTextEditorApplication.h:213
LineType type
Definition: AbstractTextEditorApplication.h:211
Definition: AbstractTextEditorApplication.h:209
static Line View(std::string_view v)
Definition: AbstractTextEditorApplication.h:285
void clear_visual_lines()
Definition: AbstractTextEditorApplication.h:406
void append_text(const std::vector< char > &new_text)
Definition: AbstractTextEditorApplication.h:394
LineProperty * detail() const
Definition: AbstractTextEditorApplication.h:334
void set_line_number_override(int32_t num)
Definition: AbstractTextEditorApplication.h:329
static Line None()
Definition: AbstractTextEditorApplication.h:262
LineProperty * new_detail()
Definition: AbstractTextEditorApplication.h:339
void clear_detail()
Definition: AbstractTextEditorApplication.h:345
static Line NormalEmptyLine()
Definition: AbstractTextEditorApplication.h:255
void set_text(std::vector< char > const &text)
Definition: AbstractTextEditorApplication.h:366
bool ends_with_new_line() const
Definition: AbstractTextEditorApplication.h:350
Line detached_copy() const
Definition: AbstractTextEditorApplication.h:302
Line()
Definition: AbstractTextEditorApplication.h:229
static Line View(std::string_view v, LineType type)
Definition: AbstractTextEditorApplication.h:269
static Line View(std::string_view v, Meta const &meta)
Definition: AbstractTextEditorApplication.h:277
std::vector< char > * to_vector()
Definition: AbstractTextEditorApplication.h:373
static Line InvalidLine()
Definition: AbstractTextEditorApplication.h:248
std::string_view text() const
Definition: AbstractTextEditorApplication.h:356
LineType type() const
Definition: AbstractTextEditorApplication.h:324
Line(std::vector< char > const &ba, LineType type=Normal)
Definition: AbstractTextEditorApplication.h:234
void detach_if_shared()
Definition: AbstractTextEditorApplication.h:317
void append_text(std::string_view new_text)
Definition: AbstractTextEditorApplication.h:383
static Line View(Line const &line)
Definition: AbstractTextEditorApplication.h:290
void append_text(char c)
Definition: AbstractTextEditorApplication.h:401
std::shared_ptr< D > sp
Definition: AbstractTextEditorApplication.h:227
Line(QByteArray const &ba, LineType type=Normal)
Definition: AbstractTextEditorApplication.h:241
Definition: LineIndexMap.h:413
Definition: AbstractTextEditorApplication.h:425
row_index_t visual_row
Definition: AbstractTextEditorApplication.h:426
Definition: AbstractTextEditorApplication.h:465
int absolute_x_px
Definition: AbstractTextEditorApplication.h:466
int visual_x_px
Definition: AbstractTextEditorApplication.h:467
Definition: AbstractTextEditorApplication.h:470
col_index_t col
Definition: AbstractTextEditorApplication.h:472
row_index_t row
Definition: AbstractTextEditorApplication.h:471
RowCol(row_index_t row=0, col_index_t col=0)
Definition: AbstractTextEditorApplication.h:473
Definition: AbstractTextEditorApplication.h:434
row_index_t lrow
Definition: AbstractTextEditorApplication.h:436
col_index_t lcol
Definition: AbstractTextEditorApplication.h:437
bool enabled
Definition: AbstractTextEditorApplication.h:435
int compare(SelectionAnchor const &a) const
Definition: AbstractTextEditorApplication.h:442
Definition: AbstractTextEditorApplication.h:503
row_index_t current_logical_row
Definition: AbstractTextEditorApplication.h:505
std::optional< row_index_t > nlines
Definition: AbstractTextEditorApplication.h:504
col_index_t current_logical_col
Definition: AbstractTextEditorApplication.h:506
bool scroll_bar_update_needed
Definition: AbstractTextEditorApplication.h:507
Definition: AbstractTextEditorApplication.h:480
int bottom_line_y
Definition: AbstractTextEditorApplication.h:498
Cache cache
Definition: AbstractTextEditorApplication.h:509
int scroll_horz_pos_px
Definition: AbstractTextEditorApplication.h:491
col_index_t viewport_org_x_cols
Definition: AbstractTextEditorApplication.h:493
int saved_col_hint
Definition: AbstractTextEditorApplication.h:489
row_index_t current_visual_row
Definition: AbstractTextEditorApplication.h:482
row_index_t viewport_org_y_rows
Definition: AbstractTextEditorApplication.h:494
col_index_t current_visual_col
Definition: AbstractTextEditorApplication.h:483
TextEditorEngine_sp engine
Definition: AbstractTextEditorApplication.h:499
int viewport_height_rows
Definition: AbstractTextEditorApplication.h:496
int viewport_width_px
Definition: AbstractTextEditorApplication.h:495
int current_char_span
Definition: AbstractTextEditorApplication.h:490
QRect cursor_rect
Definition: AbstractTextEditorApplication.h:481
PositionX current_pos
Definition: AbstractTextEditorApplication.h:485
int current_visual_col_hint
Definition: AbstractTextEditorApplication.h:484
int scroll_vert_pos_px
Definition: AbstractTextEditorApplication.h:492
row_index_t saved_row
Definition: AbstractTextEditorApplication.h:487
int tab_indent_size
Definition: AbstractTextEditorApplication.h:497
int current_visual_y_px
Definition: AbstractTextEditorApplication.h:486
LineIndexMap line_index_map
Definition: AbstractTextEditorApplication.h:502
col_index_t saved_col
Definition: AbstractTextEditorApplication.h:488
Definition: AbstractTextEditorApplication.h:429
col_index_t lcol
Definition: AbstractTextEditorApplication.h:431
row_index_t lrow
Definition: AbstractTextEditorApplication.h:430