-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathterminal_view.h
258 lines (197 loc) · 6.98 KB
/
terminal_view.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
#pragma once
#include <string>
#include <vector>
#include <array>
#include <memory>
#include <unordered_set>
#include <unordered_map>
#include <map>
#include <regex>
#include <queue>
#include <chrono>
#include "imgui.h"
#include "coordinates.h"
#include "escape_sequence_parser.h"
#include "terminal_state.h"
#include "terminal_data.h"
#include "vector_timed.h"
namespace imterm {
class TerminalView
{
public:
struct Options {
bool LineNumbers = true;
bool TimeStamps = true;
};
enum class SelectionMode
{
Normal,
Word,
Line
};
struct Breakpoint
{
int mLine;
bool mEnabled;
std::string mCondition;
Breakpoint()
: mLine(-1)
, mEnabled(false)
{}
};
struct Identifier
{
Coordinates mLocation;
std::string mDeclaration;
};
typedef std::string String;
typedef std::unordered_map<std::string, Identifier> Identifiers;
typedef std::unordered_set<std::string> Keywords;
typedef std::map<int, std::string> ErrorMarkers;
typedef std::unordered_set<int> Breakpoints;
typedef std::array<ImU32, (unsigned)PaletteIndex::Max> Palette;
struct RenderGeometry
{
RenderGeometry()
: mValid(false),
mCursorScreenPos(ImVec2(0, 0)),
mScrollX(0),
mScrollY(0),
mFirstVisibleLineNo(0),
mLastVisibleLineNo(0),
mTotalLines(0),
mWindowSize(ImVec2(0, 0)),
mContentRegionAvail(ImVec2(0, 0)),
mTextScreenPos(ImVec2(0, 0))
{}
bool mValid;
ImVec2 mCursorScreenPos;
float mScrollX;
float mScrollY;
int mFirstVisibleLineNo;
int mLastVisibleLineNo;
int mTotalLines;
ImVec2 mWindowSize;
ImVec2 mContentRegionAvail;
ImVec2 mTextScreenPos;
};
TerminalView(std::shared_ptr<TerminalData> aTerminalData, std::shared_ptr<TerminalState> aTerminalState, Options aOptions);
~TerminalView();
const Palette& GetPalette() const { return mPaletteBase; }
void SetPalette(const Palette& aValue);
void SetErrorMarkers(const ErrorMarkers& aMarkers) { mErrorMarkers = aMarkers; }
void SetBreakpoints(const Breakpoints& aMarkers) { mBreakpoints = aMarkers; }
void Render(const char* aTitle, const ImVec2& aSize = ImVec2(), bool aBorder = false);
std::vector<std::string> GetTextLines() const;
std::string GetSelectedText() const;
std::string GetCurrentLineText()const;
int GetTotalLines() const { return (int)mLines.size(); }
bool IsTextChanged() const { return mData->IsTextChanged(); }
bool IsCursorPositionChanged() const { return mCursorPositionChanged; }
bool IsColorizerEnabled() const { return mColorizerEnabled; }
void SetColorizerEnable(bool aValue);
Coordinates GetCursorPosition() const { return GetActualCursorCoordinates(); }
void SetCursorPosition(const Coordinates& aPosition);
inline void SetHandleMouseInputs(bool aValue) { mHandleMouseInputs = aValue; }
inline bool IsHandleMouseInputsEnabled() const { return mHandleKeyboardInputs; }
inline void SetHandleKeyboardInputs(bool aValue) { mHandleKeyboardInputs = aValue; }
inline bool IsHandleKeyboardInputsEnabled() const { return mHandleKeyboardInputs; }
inline void SetImGuiChildIgnored(bool aValue) { mIgnoreImGuiChild = aValue; }
inline bool IsImGuiChildIgnored() const { return mIgnoreImGuiChild; }
inline void SetShowWhitespaces(bool aValue) { mShowWhitespaces = aValue; }
inline bool IsShowingWhitespaces() const { return mShowWhitespaces; }
void SetCursorToEnd();
void MoveUp(int aAmount = 1, bool aSelect = false);
void MoveDown(int aAmount = 1, bool aSelect = false);
void MoveLeft(int aAmount = 1, bool aSelect = false, bool aWordMode = false);
void MoveRight(int aAmount = 1, bool aSelect = false, bool aWordMode = false);
void MoveTop(bool aSelect = false);
void MoveBottom(bool aSelect = false);
void MoveHome(bool aSelect = false);
void MoveEnd(bool aSelect = false);
void SetSelectionStart(const Coordinates& aPosition);
void SetSelectionEnd(const Coordinates& aPosition);
void SetSelection(const Coordinates& aStart, const Coordinates& aEnd, SelectionMode aMode = SelectionMode::Normal);
void SelectWordUnderCursor();
void SelectAll();
bool HasSelection() const;
bool IsLastLineVisible();
const RenderGeometry& GetLastRenderGeometry();
void Copy();
void Cut();
void Paste();
void Delete();
static const Palette& GetDarkPalette();
static const Palette& GetLightPalette();
static const Palette& GetRetroBluePalette();
void AddKeyboardInput(std::string input);
void AddKeyboardInput(std::u16string input);
void AddKeyboardInput(char input);
void AddKeyboardInput(const char* input);
ImWchar GetKeyboardInput();
bool KeyboardInputAvailable();
inline Options GetOptions() { return mOptions; }
void SetOptions(const Options& aOptions) { mOptions = aOptions; }
private:
typedef std::vector<std::pair<std::regex, PaletteIndex>> RegexList;
struct UiState
{
Coordinates mSelectionStart;
Coordinates mSelectionEnd;
Coordinates mCursorPosition; // The UI Cursor, not to be confused with the real terminal cursor location
};
float TextDistanceToLineStart(const Coordinates& aFrom) const;
void EnsureCursorVisible();
int GetPageSize() const;
Coordinates GetActualCursorCoordinates() const;
Coordinates SanitizeCoordinates(const Coordinates& aValue) const;
void Advance(Coordinates& aCoordinates) const;
Coordinates ScreenPosToCoordinates(const ImVec2& aPosition) const;
Coordinates FindWordStart(const Coordinates& aFrom) const;
Coordinates FindWordEnd(const Coordinates& aFrom) const;
Coordinates FindNextWord(const Coordinates& aFrom) const;
bool IsOnWordBoundary(const Coordinates& aAt) const;
void EnterCharacter(ImWchar aChar, bool aShift);
void Backspace();
void DeleteSelection();
std::string GetWordUnderCursor() const;
std::string GetWordAt(const Coordinates& aCoords) const;
ImU32 GetGlyphColor(const Glyph& aGlyph) const;
void HandleKeyboardInputs();
void HandleMouseInputs();
void Render();
void InputGlyph(Line& line, int& termColI, PaletteIndex pi, uint8_t aValue);
float mLineSpacing;
const Lines& mLines;
std::shared_ptr<TerminalData> mData = nullptr;
UiState mUiState;
bool mWithinRender;
bool mScrollToCursor;
bool mScrollToTop;
bool mColorizerEnabled;
float mTextStart; // position (in pixels) where a code line starts relative to the left of the TextEditor.
int mLeftMargin;
bool mCursorPositionChanged;
int mColorRangeMin, mColorRangeMax;
SelectionMode mSelectionMode;
bool mHandleKeyboardInputs;
bool mHandleMouseInputs;
bool mIgnoreImGuiChild;
bool mShowWhitespaces;
Palette mPaletteBase;
Palette mPalette;
Breakpoints mBreakpoints;
ErrorMarkers mErrorMarkers;
ImVec2 mCharAdvance;
Coordinates mInteractiveStart, mInteractiveEnd;
std::string mLineBuffer;
uint64_t mStartTime;
float mLastClick;
RenderGeometry mLastRenderGeometry;
std::queue<ImVector<ImWchar>> mQueuedInputQueueCharacters;
std::queue<ImWchar> mKeyboardInputQueue;
//TerminalState& mTermState;
std::shared_ptr<TerminalState> mTermState = nullptr;
Options mOptions;
};
}