ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
CodeEditor.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 #include "EditorSettings.h"
11 #include <QObject>
12 #include <QPlainTextEdit>
13 
14 class QPaintEvent;
15 class QResizeEvent;
16 class QSize;
17 class QWidget;
18 
19 class PythonHighlighter;
20 
21 class LineNumberArea;
22 
23 class CodeEditor final : public QPlainTextEdit
24 {
25  Q_OBJECT
26 
27  public:
28  explicit CodeEditor(EditorSettings *settings, QWidget *parent = nullptr);
29 
30  void lineNumberAreaPaintEvent(QPaintEvent *event);
31 
32  bool eventFilter(QObject *target, QEvent *event) override;
33  int lineNumberAreaWidth();
34  void newFile();
35  bool loadFile(const QString &fileName);
36  bool save();
37  bool saveAs();
38  bool saveFile(const QString &fileName);
39  QString userFriendlyCurrentFile();
40  QString currentFile() const
41  {
42  return m_curFile;
43  }
44  void comment();
45  void uncomment();
46  void indentMore();
47  void indentLess();
48 
49  protected:
50  void resizeEvent(QResizeEvent *event) override;
51  void closeEvent(QCloseEvent *event) override;
52 
53  private Q_SLOTS:
54  void updateLineNumberAreaWidth(int newBlockCount);
55  void highlightCurrentLine();
56  void updateLineNumberArea(const QRect &, int);
57  void documentWasModified();
58  void startAllHighlighting();
59 
60  private:
61  void updateUsingSettings();
62 
63  protected:
64  void keyPressEvent(QKeyEvent *e) override;
65 
66  private:
67  bool maybeSave();
68  void setCurrentFile(const QString &fileName);
69  QString strippedName(const QString &fullFileName);
70  void createPairedCharsSelection(int pos);
71  int getSelectedLineCount();
72 
73  QString m_curFile;
74  bool m_isUntitled{true};
75  QWidget *m_lineNumberArea{nullptr};
76  EditorSettings *m_settings{nullptr};
77  PythonHighlighter *m_highlighter;
78 };
79 
80 class LineNumberArea final : public QWidget
81 {
82  public:
83  explicit LineNumberArea(CodeEditor *editor) : QWidget(editor)
84  {
85  m_codeEditor = editor;
86  }
87 
88  QSize sizeHint() const override
89  {
90  return {m_codeEditor->lineNumberAreaWidth(), 0};
91  }
92 
93  protected:
94  void paintEvent(QPaintEvent *event) override
95  {
96  m_codeEditor->lineNumberAreaPaintEvent(event);
97  }
98 
99  private:
100  CodeEditor *m_codeEditor;
101 };
MouseEvent event
void indentMore()
Definition: CodeEditor.cpp:358
CodeEditor(EditorSettings *settings, QWidget *parent=nullptr)
Definition: CodeEditor.cpp:17
void newFile()
Definition: CodeEditor.cpp:172
bool loadFile(const QString &fileName)
Definition: CodeEditor.cpp:183
bool saveFile(const QString &fileName)
Definition: CodeEditor.cpp:226
void comment()
Definition: CodeEditor.cpp:325
QString userFriendlyCurrentFile()
Definition: CodeEditor.cpp:247
void lineNumberAreaPaintEvent(QPaintEvent *event)
Definition: CodeEditor.cpp:145
bool save()
Definition: CodeEditor.cpp:205
void closeEvent(QCloseEvent *event) override
Definition: CodeEditor.cpp:252
void resizeEvent(QResizeEvent *event) override
Definition: CodeEditor.cpp:114
bool saveAs()
Definition: CodeEditor.cpp:217
void uncomment()
Definition: CodeEditor.cpp:339
void keyPressEvent(QKeyEvent *e) override
Definition: CodeEditor.cpp:417
void indentLess()
Definition: CodeEditor.cpp:372
QString currentFile() const
Definition: CodeEditor.h:40
bool eventFilter(QObject *target, QEvent *event) override
Definition: CodeEditor.cpp:33
int lineNumberAreaWidth()
Definition: CodeEditor.cpp:83
void paintEvent(QPaintEvent *event) override
Definition: CodeEditor.h:94
QSize sizeHint() const override
Definition: CodeEditor.h:88
LineNumberArea(CodeEditor *editor)
Definition: CodeEditor.h:83