malena
Why malena
Quick start
Tutorials
API docs
GitHub
GitHub
Tutorials
Loading...
Searching...
No Matches
Graphics
Text
CodeEditor.h
Go to the documentation of this file.
1
// Copyright (c) 2025 Dave R. Smith.
2
// Malena Framework — Licensed under PolyForm Noncommercial 1.0.0; commercial use requires a paid license. See LICENSE.
3
4
#ifndef MALENA_CODEEDITOR_H
5
#define MALENA_CODEEDITOR_H
6
7
#pragma once
8
9
#include <
Malena/Core/malena_export.h
>
10
#include <
Malena/Graphics/Text/TextArea.h
>
11
#include <
SFML/Graphics/Color.hpp
>
12
#include <cstddef>
13
#include <memory>
14
#include <string>
15
#include <unordered_set>
16
#include <vector>
17
18
namespace
ml
19
{
20
// ── Languages ───────────────────────────────────────────────────────────────
21
enum class
CodeLanguage
{
Plain
,
Cpp
,
Python
,
JavaScript
,
Java
};
22
23
// ── SyntaxToken ───────────────────────────────────────────────────────────────
25
struct
SyntaxToken
26
{
27
std::size_t
start
= 0;
28
std::size_t
end
= 0;
29
sf::Color
color
;
30
};
31
32
// ── SyntaxHighlighter ─────────────────────────────────────────────────────────
37
class
MALENA_API
SyntaxHighlighter
38
{
39
public
:
40
virtual
~SyntaxHighlighter
() =
default
;
43
[[nodiscard]]
virtual
std::vector<SyntaxToken>
tokenize
(
const
std::string& text)
const
= 0;
44
};
45
46
// ── BasicSyntaxHighlighter ──────────────────────────────────────────────────
54
class
MALENA_API
BasicSyntaxHighlighter
:
public
SyntaxHighlighter
55
{
56
public
:
57
explicit
BasicSyntaxHighlighter
(
CodeLanguage
lang =
CodeLanguage::Cpp
);
58
59
void
setLanguage
(
CodeLanguage
lang);
60
[[nodiscard]]
CodeLanguage
language
()
const
{
return
_lang; }
61
62
[[nodiscard]] std::vector<SyntaxToken>
tokenize
(
const
std::string& text)
const override
;
63
64
// Theme colors (override freely).
65
sf::Color
keywordColor
{ 197, 134, 192 };
// purple
66
sf::Color
stringColor
{ 206, 145, 120 };
// orange
67
sf::Color
commentColor
{ 106, 153, 85 };
// green
68
sf::Color
numberColor
{ 181, 206, 168 };
// light green
69
70
private
:
71
CodeLanguage
_lang;
72
std::unordered_set<std::string> _keywords;
73
bool
_hashComments =
false
;
// '#' line comments
74
};
75
76
// ── CodeEditor ──────────────────────────────────────────────────────────────
94
class
MALENA_API
CodeEditor
:
public
TextArea
95
{
96
public
:
98
static
const
sf::Font
&
monospaceFont
();
99
100
explicit
CodeEditor
(
const
sf::Font
&
font
=
monospaceFont
());
101
104
void
setLanguage
(
CodeLanguage
lang);
105
107
void
setHighlighter
(std::shared_ptr<SyntaxHighlighter> highlighter);
108
109
protected
:
110
void
onRebuildComplete
()
override
;
111
112
private
:
113
void
applyHighlighting();
114
115
std::shared_ptr<SyntaxHighlighter> _highlighter;
116
BasicSyntaxHighlighter
* _basic =
nullptr
;
// non-owning alias when built-in
117
std::string _lastHighlighted;
118
bool
_inHighlight =
false
;
119
};
120
121
}
// namespace ml
122
123
#endif
// MALENA_CODEEDITOR_H
Color.hpp
TextArea.h
ml::BasicSyntaxHighlighter
Built-in generic highlighter for C-like and scripting languages.
Definition
CodeEditor.h:55
ml::BasicSyntaxHighlighter::tokenize
std::vector< SyntaxToken > tokenize(const std::string &text) const override
ml::BasicSyntaxHighlighter::keywordColor
sf::Color keywordColor
Definition
CodeEditor.h:65
ml::BasicSyntaxHighlighter::stringColor
sf::Color stringColor
Definition
CodeEditor.h:66
ml::BasicSyntaxHighlighter::commentColor
sf::Color commentColor
Definition
CodeEditor.h:67
ml::BasicSyntaxHighlighter::language
CodeLanguage language() const
Definition
CodeEditor.h:60
ml::BasicSyntaxHighlighter::BasicSyntaxHighlighter
BasicSyntaxHighlighter(CodeLanguage lang=CodeLanguage::Cpp)
ml::BasicSyntaxHighlighter::setLanguage
void setLanguage(CodeLanguage lang)
ml::BasicSyntaxHighlighter::numberColor
sf::Color numberColor
Definition
CodeEditor.h:68
ml::CodeEditor::onRebuildComplete
void onRebuildComplete() override
ml::CodeEditor::monospaceFont
static const sf::Font & monospaceFont()
ml::CodeEditor::setLanguage
void setLanguage(CodeLanguage lang)
ml::CodeEditor::setHighlighter
void setHighlighter(std::shared_ptr< SyntaxHighlighter > highlighter)
ml::CodeEditor::CodeEditor
CodeEditor(const sf::Font &font=monospaceFont())
ml::SyntaxHighlighter
Pure tokenizer: maps source text to colored spans. No linting, no diagnostics — color only....
Definition
CodeEditor.h:38
ml::SyntaxHighlighter::tokenize
virtual std::vector< SyntaxToken > tokenize(const std::string &text) const =0
ml::SyntaxHighlighter::~SyntaxHighlighter
virtual ~SyntaxHighlighter()=default
ml::TextArea::TextArea
TextArea(const sf::Font &font=FontManager<>::getDefault())
sf::Color
sf::Font
malena_export.h
MALENA_API
#define MALENA_API
Definition
malena_export.h:18
ml
Definition
Component.h:22
ml::CodeLanguage
CodeLanguage
Definition
CodeEditor.h:21
ml::CodeLanguage::Plain
@ Plain
Definition
CodeEditor.h:21
ml::CodeLanguage::JavaScript
@ JavaScript
Definition
CodeEditor.h:21
ml::CodeLanguage::Python
@ Python
Definition
CodeEditor.h:21
ml::CodeLanguage::Java
@ Java
Definition
CodeEditor.h:21
ml::CodeLanguage::Cpp
@ Cpp
Definition
CodeEditor.h:21
ml::ControlTheme::font
const sf::Font * font
Definition
ControlTheme.h:39
ml::SyntaxToken
Definition
CodeEditor.h:26
ml::SyntaxToken::start
std::size_t start
Definition
CodeEditor.h:27
ml::SyntaxToken::color
sf::Color color
Definition
CodeEditor.h:29
ml::SyntaxToken::end
std::size_t end
Definition
CodeEditor.h:28