Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions Scenes/ConceptGlossary.tscn
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
[gd_scene load_steps=2 format=3 uid="uid://concept_glossary"]

[ext_resource type="Script" path="res://Scripts/ConceptGlossary.gd" id="1"]

[node name="ConceptGlossary" type="Control"]
visible = false
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1")

[node name="CanvasLayer" type="CanvasLayer" parent="."]
layer = 100
visible = false

[node name="Background" type="ColorRect" parent="CanvasLayer"]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0, 0, 0, 0.7)

[node name="Panel" type="Panel" parent="CanvasLayer"]
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -400.0
offset_top = -300.0
offset_right = 400.0
offset_bottom = 300.0
grow_horizontal = 2
grow_vertical = 2

[node name="MarginContainer" type="MarginContainer" parent="CanvasLayer/Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_constants/margin_left = 20
theme_override_constants/margin_top = 20
theme_override_constants/margin_right = 20
theme_override_constants/margin_bottom = 20

[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer/Panel/MarginContainer"]
layout_mode = 2
theme_override_constants/separation = 10

[node name="Title" type="Label" parent="CanvasLayer/Panel/MarginContainer/VBoxContainer"]
layout_mode = 2
text = "📖 Knative Concepts"
horizontal_alignment = 1
theme_override_font_sizes/font_size = 24

[node name="SearchBox" type="LineEdit" parent="CanvasLayer/Panel/MarginContainer/VBoxContainer"]
layout_mode = 2
placeholder_text = "Search concepts..."

[node name="ScrollContainer" type="ScrollContainer" parent="CanvasLayer/Panel/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3

[node name="ResultsList" type="ItemList" parent="CanvasLayer/Panel/MarginContainer/VBoxContainer/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3

[node name="ConceptPanel" type="VBoxContainer" parent="CanvasLayer/Panel/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
theme_override_constants/separation = 10

[node name="ConceptName" type="Label" parent="CanvasLayer/Panel/MarginContainer/VBoxContainer/ConceptPanel"]
layout_mode = 2
theme_override_font_sizes/font_size = 20
horizontal_alignment = 1

[node name="Definition" type="Label" parent="CanvasLayer/Panel/MarginContainer/VBoxContainer/ConceptPanel"]
layout_mode = 2
autowrap_mode = 3

[node name="GameExample" type="Label" parent="CanvasLayer/Panel/MarginContainer/VBoxContainer/ConceptPanel"]
layout_mode = 2
autowrap_mode = 3

[node name="KnativeExample" type="Label" parent="CanvasLayer/Panel/MarginContainer/VBoxContainer/ConceptPanel"]
layout_mode = 2
autowrap_mode = 3

[node name="DocsButton" type="Button" parent="CanvasLayer/Panel/MarginContainer/VBoxContainer/ConceptPanel"]
layout_mode = 2
text = "📚 Read Official Docs"

[node name="CloseButton" type="Button" parent="CanvasLayer/Panel/MarginContainer/VBoxContainer"]
layout_mode = 2
text = "Close"

[connection signal="item_selected" from="CanvasLayer/Panel/MarginContainer/VBoxContainer/ScrollContainer/ResultsList" to="." method="_on_results_list_item_selected"]
53 changes: 45 additions & 8 deletions Scenes/message_display.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,50 @@ grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_y0tj3")

[node name="Label" type="Label" parent="."]
layout_mode = 0
offset_right = 1153.0
offset_bottom = 649.0
[node name="Background" type="ColorRect" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0, 0, 0, 0.7)

[node name="CenterContainer" type="CenterContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2

[node name="Panel" type="Panel" parent="CenterContainer"]
custom_minimum_size = Vector2(900, 500)
layout_mode = 2

[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_constants/margin_left = 40
theme_override_constants/margin_top = 40
theme_override_constants/margin_right = 40
theme_override_constants/margin_bottom = 40

[node name="ScrollContainer" type="ScrollContainer" parent="CenterContainer/Panel/MarginContainer"]
layout_mode = 2

[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer/Panel/MarginContainer/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/separation = 20

[node name="Label" type="Label" parent="CenterContainer/Panel/MarginContainer/ScrollContainer/VBoxContainer"]
layout_mode = 2
theme_override_colors/font_color = Color(0, 0.286275, 0.556863, 1)
theme_override_colors/font_shadow_color = Color(1, 0.94902, 0.870588, 1)
theme_override_font_sizes/font_size = 100
theme_override_font_sizes/font_size = 28
horizontal_alignment = 1
vertical_alignment = 1
autowrap_mode = 2
autowrap_mode = 3
7 changes: 7 additions & 0 deletions Scenes/sink.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ script = ExtResource("2_16xt0")
position = Vector2(0, -5.83331)
shape = SubResource("RectangleShape2D_7l3ci")

[node name="IndicatorLight" type="ColorRect" parent="."]
offset_left = -10.0
offset_top = -220.0
offset_right = 10.0
offset_bottom = -200.0
color = Color(0, 1, 0, 1)
z_index = 1
[node name="hoverlabel" type="RichTextLabel" parent="."]
visible = false
offset_left = 180.0
Expand Down
140 changes: 140 additions & 0 deletions Scripts/ConceptGlossary.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
extends Control

@onready var search_box = $CanvasLayer/Panel/MarginContainer/VBoxContainer/SearchBox
@onready var results_list = $CanvasLayer/Panel/MarginContainer/VBoxContainer/ScrollContainer/ResultsList
@onready var concept_panel = $CanvasLayer/Panel/MarginContainer/VBoxContainer/ConceptPanel
@onready var concept_name = $CanvasLayer/Panel/MarginContainer/VBoxContainer/ConceptPanel/ConceptName
@onready var definition = $CanvasLayer/Panel/MarginContainer/VBoxContainer/ConceptPanel/Definition
@onready var game_example = $CanvasLayer/Panel/MarginContainer/VBoxContainer/ConceptPanel/GameExample
@onready var knative_example = $CanvasLayer/Panel/MarginContainer/VBoxContainer/ConceptPanel/KnativeExample
@onready var docs_button = $CanvasLayer/Panel/MarginContainer/VBoxContainer/ConceptPanel/DocsButton
@onready var close_button = $CanvasLayer/Panel/MarginContainer/VBoxContainer/CloseButton

var concepts = {
"source": {
"name": "Event Source",
"definition": "A source generates events and sends them to a broker",
"game_example": "The event boxes at the start of each level",
"knative_example": "PingSource, ApiServerSource, KafkaSource",
"docs": "https://knative.dev/docs/eventing/sources/"
},
"broker": {
"name": "Broker",
"definition": "A broker receives events from sources and delivers them to sinks via triggers",
"game_example": "The invisible routing system that moves events in the game",
"knative_example": "MTChannelBasedBroker, RabbitMQBroker",
"docs": "https://knative.dev/docs/eventing/brokers/"
},
"trigger": {
"name": "Trigger",
"definition": "A trigger filters events and routes matching ones to a specific sink",
"game_example": "The connection you create from event to sink",
"knative_example": "Trigger with CloudEvents attribute filters",
"docs": "https://knative.dev/docs/eventing/triggers/"
},
"filter": {
"name": "Filter",
"definition": "Rules that determine which events match a trigger",
"game_example": "The colored filters you drag onto the conveyor",
"knative_example": "CloudEvents attribute filters (type, source, etc.)",
"docs": "https://knative.dev/docs/eventing/triggers/#trigger-filtering"
},
"sink": {
"name": "Sink",
"definition": "A sink receives and processes events",
"game_example": "The colored boxes where events are delivered",
"knative_example": "Knative Service, Channel, URI endpoint",
"docs": "https://knative.dev/docs/eventing/sinks/"
},
"dlq": {
"name": "Dead Letter Queue",
"definition": "A special sink that catches events that fail to process",
"game_example": "The DLS that catches blocked events in Level 4",
"knative_example": "DeadLetterSink in delivery spec",
"docs": "https://knative.dev/docs/eventing/event-delivery/"
},
"cloudevents": {
"name": "CloudEvents",
"definition": "A standard format for describing events",
"game_example": "The event boxes with different colors (types)",
"knative_example": "CloudEvents spec with type, source, id, etc.",
"docs": "https://cloudevents.io/"
},
"channel": {
"name": "Channel",
"definition": "A messaging channel that can be used as a sink or source",
"game_example": "Not directly shown in current levels",
"knative_example": "InMemoryChannel, KafkaChannel",
"docs": "https://knative.dev/docs/eventing/channels/"
},
"subscription": {
"name": "Subscription",
"definition": "Routes events from a channel to a sink",
"game_example": "Similar to the trigger concept in the game",
"knative_example": "Subscription connecting Channel to Sink",
"docs": "https://knative.dev/docs/eventing/channels/subscriptions/"
},
"retry": {
"name": "Retry Policy",
"definition": "Configuration for retrying failed event deliveries",
"game_example": "Related to DLQ pattern in Level 4",
"knative_example": "Retry count and backoff delay in delivery spec",
"docs": "https://knative.dev/docs/eventing/event-delivery/"
}
}

func _ready():
add_to_group("Glossary")
search_box.text_changed.connect(_on_search_changed)
close_button.pressed.connect(_on_close_pressed)
docs_button.pressed.connect(_on_docs_pressed)
concept_panel.visible = false
populate_all_concepts()

func populate_all_concepts():
results_list.clear()
for key in concepts:
results_list.add_item(concepts[key].name)

func _on_search_changed(query: String):
if query == "":
populate_all_concepts()
return

results_list.clear()
for key in concepts:
if key.contains(query.to_lower()) or \
concepts[key].name.to_lower().contains(query.to_lower()):
results_list.add_item(concepts[key].name)

func _on_results_list_item_selected(index: int):
var item_text = results_list.get_item_text(index)
for key in concepts:
if concepts[key].name == item_text:
show_concept(key)
break

func show_concept(concept_id: String):
var concept = concepts.get(concept_id)
if concept:
concept_name.text = concept.name
definition.text = concept.definition
game_example.text = "🎮 In game: " + concept.game_example
knative_example.text = "📦 In Knative: " + concept.knative_example
docs_button.set_meta("url", concept.docs)
concept_panel.visible = true

func _on_close_pressed():
$CanvasLayer.visible = false

func _on_docs_pressed():
var url = docs_button.get_meta("url")
OS.shell_open(url)

func open_to_term(term: String):
$CanvasLayer.visible = true
if concepts.has(term):
show_concept(term)

func open():
$CanvasLayer.visible = true
45 changes: 45 additions & 0 deletions Scripts/HoverLabel.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
extends Label

var hover_text: String = ""
var element_type: String = ""

func _ready():
mouse_entered.connect(_on_mouse_entered)
mouse_exited.connect(_on_mouse_exited)
mouse_filter = Control.MOUSE_FILTER_PASS

func set_hover_info(type: String, description: String):
element_type = type
hover_text = description

func _on_mouse_entered():
if hover_text != "":
var tooltip = create_tooltip()
add_child(tooltip)

func _on_mouse_exited():
for child in get_children():
if child.name == "HoverTooltip":
child.queue_free()

func create_tooltip() -> Control:
var tooltip = Panel.new()
tooltip.name = "HoverTooltip"
tooltip.custom_minimum_size = Vector2(200, 60)
tooltip.position = Vector2(0, -70)

var label = Label.new()
label.text = hover_text
label.autowrap_mode = TextServer.AUTOWRAP_WORD
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER

var margin = MarginContainer.new()
margin.add_theme_constant_override("margin_left", 10)
margin.add_theme_constant_override("margin_right", 10)
margin.add_theme_constant_override("margin_top", 10)
margin.add_theme_constant_override("margin_bottom", 10)
margin.add_child(label)

tooltip.add_child(margin)
return tooltip
Loading