mirror of
https://github.com/lihop/godot-xterm.git
synced 2024-11-25 10:40:25 +01:00
Allow theme inheritance
Terminal colors and fonts will be inherited from ancestor nodes if not defined.
This commit is contained in:
parent
c81da3820b
commit
5f399ed46e
6 changed files with 70 additions and 40 deletions
|
@ -398,24 +398,33 @@ void Terminal::_draw() {
|
||||||
|
|
||||||
void Terminal::update_theme() {
|
void Terminal::update_theme() {
|
||||||
ResourceLoader *rl = ResourceLoader::get_singleton();
|
ResourceLoader *rl = ResourceLoader::get_singleton();
|
||||||
|
Ref<Theme> default_theme;
|
||||||
|
|
||||||
/* Load the default theme if it exists and no theme is set */
|
/* Load the default theme if it exists and no theme is set */
|
||||||
// Having an actual theme resource set allows things like like font resizing.
|
// Don't actually set the theme to default (to allow inheritence of themes),
|
||||||
|
// but do load default values from it.
|
||||||
|
|
||||||
const char *default_theme_path =
|
const char *default_theme_path =
|
||||||
"res://addons/godot_xterm/themes/default.tres";
|
"res://addons/godot_xterm/themes/default.tres";
|
||||||
|
|
||||||
if (!get_theme().is_valid() && rl->exists(default_theme_path)) {
|
if (!get_theme().is_valid() && rl->exists(default_theme_path)) {
|
||||||
set_theme(rl->load(default_theme_path));
|
default_theme = rl->load(default_theme_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generate color palette based on theme */
|
/* Generate color palette based on theme */
|
||||||
|
|
||||||
auto set_pallete_color = [this](tsm_vte_color color, String theme_color,
|
auto set_pallete_color = [this, default_theme](tsm_vte_color color,
|
||||||
|
String theme_color,
|
||||||
Color default_color) -> void {
|
Color default_color) -> void {
|
||||||
Color c;
|
Color c;
|
||||||
|
|
||||||
c = has_color(theme_color, "Terminal") ? get_color(theme_color, "Terminal")
|
c = has_color(theme_color, "Terminal")
|
||||||
|
? get_color(theme_color, "Terminal")
|
||||||
|
: has_color_override(theme_color)
|
||||||
|
? get_color(theme_color, "")
|
||||||
|
: (default_theme != nullptr &&
|
||||||
|
default_theme->has_color(theme_color, "Terminal"))
|
||||||
|
? default_theme->get_color(theme_color, "Terminal")
|
||||||
: default_color;
|
: default_color;
|
||||||
|
|
||||||
color_palette[color][0] = c.get_r8();
|
color_palette[color][0] = c.get_r8();
|
||||||
|
@ -475,13 +484,18 @@ void Terminal::update_theme() {
|
||||||
|
|
||||||
/* Load fonts into the fontmap from theme */
|
/* Load fonts into the fontmap from theme */
|
||||||
|
|
||||||
auto set_font = [this, rl](String font_style) -> void {
|
auto load_font = [this, default_theme](String font_style) -> void {
|
||||||
Ref<Font> fontref;
|
Ref<Font> fontref;
|
||||||
|
|
||||||
if (has_font(font_style, "Terminal")) {
|
if (has_font(font_style, "Terminal")) {
|
||||||
fontref = get_font(font_style, "Terminal");
|
fontref = get_font(font_style, "Terminal");
|
||||||
|
} else if (has_font_override(font_style)) {
|
||||||
|
fontref = get_font(font_style, "");
|
||||||
} else if (has_font("Regular", "Terminal")) {
|
} else if (has_font("Regular", "Terminal")) {
|
||||||
fontref = get_font("Regular", "Terminal");
|
fontref = get_font("Regular", "Terminal");
|
||||||
|
} else if (default_theme != nullptr &&
|
||||||
|
default_theme->has_font("Regular", "Terminal")) {
|
||||||
|
fontref = default_theme->get_font("Regular", "Terminal");
|
||||||
} else {
|
} else {
|
||||||
fontref = get_font("");
|
fontref = get_font("");
|
||||||
}
|
}
|
||||||
|
@ -489,12 +503,12 @@ void Terminal::update_theme() {
|
||||||
fontmap.insert(std::pair<String, Ref<Font>>(font_style, fontref));
|
fontmap.insert(std::pair<String, Ref<Font>>(font_style, fontref));
|
||||||
};
|
};
|
||||||
|
|
||||||
set_font("Bold Italic");
|
load_font("Bold Italic");
|
||||||
set_font("Bold");
|
load_font("Bold");
|
||||||
set_font("Italic");
|
load_font("Italic");
|
||||||
set_font("Regular");
|
load_font("Regular");
|
||||||
|
|
||||||
update_size();
|
// update_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Terminal::draw_background(int row, int col, Color bgcolor, int width = 1) {
|
void Terminal::draw_background(int row, int col, Color bgcolor, int width = 1) {
|
||||||
|
|
|
@ -7,8 +7,6 @@
|
||||||
tool
|
tool
|
||||||
extends Control
|
extends Control
|
||||||
|
|
||||||
const DefaultTheme = preload("../../themes/default.tres")
|
|
||||||
|
|
||||||
signal data_sent(data)
|
signal data_sent(data)
|
||||||
signal key_pressed(data, event)
|
signal key_pressed(data, event)
|
||||||
signal size_changed(new_size)
|
signal size_changed(new_size)
|
||||||
|
@ -46,6 +44,7 @@ export var bell_cooldown: float = 0.1
|
||||||
export var blink_on_time: float = 0.6
|
export var blink_on_time: float = 0.6
|
||||||
export var blink_off_time: float = 0.3
|
export var blink_off_time: float = 0.3
|
||||||
|
|
||||||
|
var _default_theme: Theme = preload("../../themes/default.tres")
|
||||||
var _viewport: Viewport = preload("./viewport.tscn").instance()
|
var _viewport: Viewport = preload("./viewport.tscn").instance()
|
||||||
var _native_terminal: Control = _viewport.get_node("Terminal")
|
var _native_terminal: Control = _viewport.get_node("Terminal")
|
||||||
var _screen := TextureRect.new()
|
var _screen := TextureRect.new()
|
||||||
|
@ -103,8 +102,7 @@ func copy_all() -> String:
|
||||||
|
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
if theme:
|
_update_theme()
|
||||||
_native_terminal.theme = theme
|
|
||||||
|
|
||||||
_native_terminal.update_mode = update_mode
|
_native_terminal.update_mode = update_mode
|
||||||
_native_terminal.connect("data_sent", self, "_on_data_sent")
|
_native_terminal.connect("data_sent", self, "_on_data_sent")
|
||||||
|
@ -131,6 +129,30 @@ func _ready():
|
||||||
_refresh()
|
_refresh()
|
||||||
|
|
||||||
|
|
||||||
|
func _update_theme():
|
||||||
|
# Themes are not propagated through the Viewport, so in order for theme
|
||||||
|
# inheritance to work we can pass through the theme variables manually.
|
||||||
|
for color in _default_theme.get_color_list("Terminal"):
|
||||||
|
var c: Color
|
||||||
|
if has_color(color, "Terminal"):
|
||||||
|
c = get_color(color, "Terminal")
|
||||||
|
else:
|
||||||
|
c = _default_theme.get_color(color, "Terminal")
|
||||||
|
_native_terminal.add_color_override(color, c)
|
||||||
|
for font in _default_theme.get_font_list("Terminal"):
|
||||||
|
var f: Font
|
||||||
|
if has_font(font, "Terminal"):
|
||||||
|
f = get_font(font, "Terminal")
|
||||||
|
else:
|
||||||
|
if _default_theme.has_font(font, "Terminal"):
|
||||||
|
f = _default_theme.get_font(font, "Terminal")
|
||||||
|
else:
|
||||||
|
f = _default_theme.get_font(font, "Regular")
|
||||||
|
_native_terminal.add_font_override(font, f)
|
||||||
|
_native_terminal._update_theme()
|
||||||
|
_native_terminal._update_size()
|
||||||
|
|
||||||
|
|
||||||
func _refresh():
|
func _refresh():
|
||||||
_screen.update()
|
_screen.update()
|
||||||
if update_mode == UpdateMode.AUTO:
|
if update_mode == UpdateMode.AUTO:
|
||||||
|
@ -212,7 +234,7 @@ func _notification(what: int) -> void:
|
||||||
_viewport.size = rect_size
|
_viewport.size = rect_size
|
||||||
_refresh()
|
_refresh()
|
||||||
NOTIFICATION_THEME_CHANGED:
|
NOTIFICATION_THEME_CHANGED:
|
||||||
_native_terminal.theme = theme
|
_update_theme()
|
||||||
_refresh()
|
_refresh()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ func draw_all(_size = Vector2.ZERO):
|
||||||
|
|
||||||
|
|
||||||
func draw_title():
|
func draw_title():
|
||||||
tput.setaf(Color("#FFECA0"))
|
tput.setaf(tput.ANSIColor.bright_yellow)
|
||||||
tput.cup(row, 0)
|
tput.cup(row, 0)
|
||||||
|
|
||||||
for line in TITLE.split("\r"):
|
for line in TITLE.split("\r"):
|
||||||
|
@ -94,8 +94,8 @@ func draw_menu():
|
||||||
tput.cup(row, offset)
|
tput.cup(row, offset)
|
||||||
|
|
||||||
if selected_index == i:
|
if selected_index == i:
|
||||||
tput.setab(Color("#FF786B"))
|
tput.setab(tput.ANSIColor.red)
|
||||||
tput.setaf(Color.black)
|
tput.setaf(tput.ANSIColor.black)
|
||||||
|
|
||||||
$Terminal.write("%s. %s" % [i + 1, item.name])
|
$Terminal.write("%s. %s" % [i + 1, item.name])
|
||||||
|
|
||||||
|
@ -130,12 +130,10 @@ func _on_Terminal_key_pressed(data: String, event: InputEventKey) -> void:
|
||||||
var scene = item.scene.instance()
|
var scene = item.scene.instance()
|
||||||
var animation_player: AnimationPlayer = scene.get_node("AnimationPlayer")
|
var animation_player: AnimationPlayer = scene.get_node("AnimationPlayer")
|
||||||
scene.connect("key_pressed", self, "_on_Asciicast_key_pressed", [animation_player])
|
scene.connect("key_pressed", self, "_on_Asciicast_key_pressed", [animation_player])
|
||||||
get_tree().get_root().add_child(scene)
|
add_child(scene)
|
||||||
visible = false
|
|
||||||
scene.grab_focus()
|
scene.grab_focus()
|
||||||
yield(animation_player, "animation_finished")
|
yield(animation_player, "animation_finished")
|
||||||
visible = true
|
remove_child(scene)
|
||||||
get_tree().get_root().remove_child(scene)
|
|
||||||
$Terminal.grab_focus()
|
$Terminal.grab_focus()
|
||||||
scene.queue_free()
|
scene.queue_free()
|
||||||
"Terminal":
|
"Terminal":
|
||||||
|
@ -151,11 +149,9 @@ func _on_Terminal_key_pressed(data: String, event: InputEventKey) -> void:
|
||||||
)
|
)
|
||||||
var scene = item.scene.instance()
|
var scene = item.scene.instance()
|
||||||
var pty = scene if OS.has_feature("JavaScript") else scene.get_node("PTY")
|
var pty = scene if OS.has_feature("JavaScript") else scene.get_node("PTY")
|
||||||
get_tree().get_root().add_child(scene)
|
add_child(scene)
|
||||||
visible = false
|
|
||||||
scene.grab_focus()
|
scene.grab_focus()
|
||||||
yield(pty, "exited")
|
yield(pty, "exited")
|
||||||
visible = true
|
|
||||||
$Terminal.grab_focus()
|
$Terminal.grab_focus()
|
||||||
scene.queue_free()
|
scene.queue_free()
|
||||||
"Exit":
|
"Exit":
|
||||||
|
|
|
@ -14,10 +14,10 @@ __meta__ = {
|
||||||
[node name="Terminal" type="Control" parent="."]
|
[node name="Terminal" type="Control" parent="."]
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
rect_pivot_offset = Vector2( -731.582, 67.4799 )
|
|
||||||
focus_mode = 1
|
focus_mode = 1
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
__meta__ = {
|
__meta__ = {
|
||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[connection signal="key_pressed" from="Terminal" to="." method="_on_Terminal_key_pressed"]
|
[connection signal="key_pressed" from="Terminal" to="." method="_on_Terminal_key_pressed"]
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
[gd_resource type="Theme" load_steps=5 format=2]
|
[gd_resource type="Theme" load_steps=5 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://addons/godot_xterm/themes/fonts/regular.tres" type="DynamicFont" id=1]
|
|
||||||
[ext_resource path="res://themes/fonts/bold_italic.tres" type="DynamicFont" id=2]
|
[ext_resource path="res://themes/fonts/bold_italic.tres" type="DynamicFont" id=2]
|
||||||
[ext_resource path="res://themes/fonts/italic.tres" type="DynamicFont" id=3]
|
[ext_resource path="res://themes/fonts/italic.tres" type="DynamicFont" id=3]
|
||||||
[ext_resource path="res://themes/fonts/bold.tres" type="DynamicFont" id=4]
|
[ext_resource path="res://themes/fonts/bold.tres" type="DynamicFont" id=4]
|
||||||
|
[ext_resource path="res://themes/fonts/regular.tres" type="DynamicFont" id=5]
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
default_font = ExtResource( 1 )
|
|
||||||
Terminal/colors/Background = Color( 0.12549, 0.145098, 0.192157, 1 )
|
Terminal/colors/Background = Color( 0.12549, 0.145098, 0.192157, 1 )
|
||||||
Terminal/colors/Black = Color( 0, 0, 0, 1 )
|
Terminal/colors/Black = Color( 0, 0, 0, 1 )
|
||||||
Terminal/colors/Blue = Color( 0.341176, 0.698039, 1, 1 )
|
Terminal/colors/Blue = Color( 0.341176, 0.698039, 1, 1 )
|
||||||
|
@ -29,4 +27,4 @@ Terminal/colors/Yellow = Color( 1, 0.866667, 0.396078, 1 )
|
||||||
Terminal/fonts/Bold = ExtResource( 4 )
|
Terminal/fonts/Bold = ExtResource( 4 )
|
||||||
"Terminal/fonts/Bold Italic" = ExtResource( 2 )
|
"Terminal/fonts/Bold Italic" = ExtResource( 2 )
|
||||||
Terminal/fonts/Italic = ExtResource( 3 )
|
Terminal/fonts/Italic = ExtResource( 3 )
|
||||||
Terminal/fonts/Regular = ExtResource( 1 )
|
Terminal/fonts/Regular = ExtResource( 5 )
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
[gd_resource type="DynamicFont" load_steps=6 format=2]
|
[gd_resource type="DynamicFont" load_steps=6 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://addons/godot_xterm/themes/fonts/nerd_fonts/symbols_2048_em_nerd_font_complete-2.1.0.ttf" type="DynamicFontData" id=1]
|
[ext_resource path="res://themes/fonts/unifont/unifont_upper-13.0.06.ttf" type="DynamicFontData" id=1]
|
||||||
[ext_resource path="res://addons/godot_xterm/themes/fonts/noto_color_emoji/noto_color_emoji-20201206-phase3.ttf" type="DynamicFontData" id=2]
|
[ext_resource path="res://themes/fonts/unifont/unifont-13.0.06.ttf" type="DynamicFontData" id=2]
|
||||||
[ext_resource path="res://addons/godot_xterm/themes/fonts/unifont/unifont-13.0.06.ttf" type="DynamicFontData" id=3]
|
[ext_resource path="res://themes/fonts/noto_color_emoji/noto_color_emoji-20201206-phase3.ttf" type="DynamicFontData" id=3]
|
||||||
[ext_resource path="res://addons/godot_xterm/themes/fonts/hack/hack_regular-3.003.ttf" type="DynamicFontData" id=4]
|
[ext_resource path="res://addons/godot_xterm/themes/fonts/hack/hack_regular-3.003.ttf" type="DynamicFontData" id=4]
|
||||||
[ext_resource path="res://addons/godot_xterm/themes/fonts/unifont/unifont_upper-13.0.06.ttf" type="DynamicFontData" id=5]
|
[ext_resource path="res://themes/fonts/nerd_fonts/symbols_2048_em_nerd_font_complete-2.1.0.ttf" type="DynamicFontData" id=5]
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
size = 14
|
size = 14
|
||||||
font_data = ExtResource( 4 )
|
font_data = ExtResource( 4 )
|
||||||
fallback/0 = ExtResource( 1 )
|
fallback/0 = ExtResource( 5 )
|
||||||
fallback/1 = ExtResource( 2 )
|
fallback/1 = ExtResource( 3 )
|
||||||
fallback/2 = ExtResource( 3 )
|
fallback/2 = ExtResource( 2 )
|
||||||
fallback/3 = ExtResource( 5 )
|
fallback/3 = ExtResource( 1 )
|
||||||
|
|
Loading…
Reference in a new issue