mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-01-22 09:22:04 +00:00
f5c4964902
NotoSans was chosen because it contains all Latin, Cyrillic and Greek characters in one file. To test the substitution the separate font files for Armenian and Georgian were also added, even though the languages have not been translated.
156 lines
4.1 KiB
C++
156 lines
4.1 KiB
C++
|
|
#pragma once
|
|
|
|
#include "../../core/widget.h"
|
|
#include "../../core/timer.h"
|
|
#include "../../core/span_layout.h"
|
|
#include "../../core/font.h"
|
|
#include <functional>
|
|
|
|
class Scrollbar;
|
|
|
|
class TextEdit : public Widget
|
|
{
|
|
public:
|
|
TextEdit(Widget* parent);
|
|
~TextEdit();
|
|
|
|
bool IsReadOnly() const;
|
|
bool IsLowercase() const;
|
|
bool IsUppercase() const;
|
|
int GetMaxLength() const;
|
|
std::string GetText() const;
|
|
int GetLineCount() const;
|
|
std::string GetLineText(int line) const;
|
|
std::string GetSelection() const;
|
|
int GetSelectionStart() const;
|
|
int GetSelectionLength() const;
|
|
int GetCursorPos() const;
|
|
int GetCursorLineNumber() const;
|
|
double GetTotalHeight();
|
|
|
|
void SetSelectAllOnFocusGain(bool enable);
|
|
void SelectAll();
|
|
void SetReadOnly(bool enable = true);
|
|
void SetLowercase(bool enable = true);
|
|
void SetUppercase(bool enable = true);
|
|
void SetMaxLength(int length);
|
|
void SetText(const std::string& text);
|
|
void AddText(const std::string& text);
|
|
void SetSelection(int pos, int length);
|
|
void ClearSelection();
|
|
void SetCursorPos(int pos);
|
|
void DeleteSelectedText();
|
|
void SetInputMask(const std::string& mask);
|
|
void SetCursorDrawingEnabled(bool enable);
|
|
|
|
std::function<std::string(std::string text)> FuncFilterKeyChar;
|
|
std::function<void()> FuncBeforeEditChanged;
|
|
std::function<void()> FuncAfterEditChanged;
|
|
std::function<void()> FuncSelectionChanged;
|
|
std::function<void()> FuncFocusGained;
|
|
std::function<void()> FuncFocusLost;
|
|
std::function<void()> FuncEnterPressed;
|
|
|
|
protected:
|
|
void OnPaintFrame(Canvas* canvas) override;
|
|
void OnPaint(Canvas* canvas) override;
|
|
void OnMouseMove(const Point& pos) override;
|
|
void OnMouseDown(const Point& pos, int key) override;
|
|
void OnMouseDoubleclick(const Point& pos, int key) override;
|
|
void OnMouseUp(const Point& pos, int key) override;
|
|
void OnKeyChar(std::string chars) override;
|
|
void OnKeyDown(EInputKey key) override;
|
|
void OnKeyUp(EInputKey key) override;
|
|
void OnGeometryChanged() override;
|
|
void OnEnableChanged() override;
|
|
void OnSetFocus() override;
|
|
void OnLostFocus() override;
|
|
|
|
private:
|
|
void LayoutLines(Canvas* canvas);
|
|
|
|
void OnTimerExpired();
|
|
void OnScrollTimerExpired();
|
|
void CreateComponents();
|
|
void OnVerticalScroll();
|
|
void UpdateVerticalScroll();
|
|
void MoveVerticalScroll();
|
|
double GetTotalLineHeight();
|
|
|
|
struct Line
|
|
{
|
|
std::string text;
|
|
SpanLayout layout;
|
|
Rect box;
|
|
bool invalidated = true;
|
|
};
|
|
|
|
struct ivec2
|
|
{
|
|
ivec2() = default;
|
|
ivec2(int x, int y) : x(x), y(y) { }
|
|
int x = 0;
|
|
int y = 0;
|
|
|
|
bool operator==(const ivec2& b) const { return x == b.x && y == b.y; }
|
|
bool operator!=(const ivec2& b) const { return x != b.x || y != b.y; }
|
|
};
|
|
|
|
Scrollbar* vert_scrollbar;
|
|
Timer* timer = nullptr;
|
|
std::vector<Line> lines = { Line() };
|
|
ivec2 cursor_pos = { 0, 0 };
|
|
int max_length = -1;
|
|
bool mouse_selecting = false;
|
|
bool lowercase = false;
|
|
bool uppercase = false;
|
|
bool readonly = false;
|
|
ivec2 selection_start = { -1, 0 };
|
|
int selection_length = 0;
|
|
std::string input_mask;
|
|
|
|
static std::string break_characters;
|
|
|
|
void Move(int steps, bool shift, bool ctrl);
|
|
void InsertText(ivec2 pos, const std::string& str);
|
|
void Backspace();
|
|
void Del();
|
|
ivec2 GetCharacterIndex(Point mouse_wincoords);
|
|
ivec2 FindNextBreakCharacter(ivec2 pos);
|
|
ivec2 FindPreviousBreakCharacter(ivec2 pos);
|
|
bool InputMaskAcceptsInput(ivec2 cursor_pos, const std::string& str);
|
|
|
|
std::string::size_type ToOffset(ivec2 pos) const;
|
|
ivec2 FromOffset(std::string::size_type offset) const;
|
|
|
|
VerticalTextPosition vertical_text_align;
|
|
Timer* scroll_timer = nullptr;
|
|
|
|
bool mouse_moves_left = false;
|
|
bool cursor_blink_visible = true;
|
|
unsigned int blink_timer = 0;
|
|
int clip_start_offset = 0;
|
|
int clip_end_offset = 0;
|
|
bool ignore_mouse_events = false;
|
|
|
|
struct UndoInfo
|
|
{
|
|
/* set undo text when:
|
|
- added char after moving
|
|
- destructive block operation (del, cut etc)
|
|
- beginning erase
|
|
*/
|
|
|
|
std::string undo_text;
|
|
bool first_erase = false;
|
|
bool first_text_insert = false;
|
|
} undo_info;
|
|
|
|
bool select_all_on_focus_gain = false;
|
|
|
|
std::shared_ptr<Font> font = Font::Create("NotoSans", 12.0);
|
|
|
|
template<typename T>
|
|
static T clamp(T val, T minval, T maxval) { return std::max<T>(std::min<T>(val, maxval), minval); }
|
|
};
|