Browse Source

ui improvements to search menu to allow better keyboard control

Jonathan Higgins 6 months ago
parent
commit
cd5893dca8
4 changed files with 35 additions and 3 deletions
  1. 5 0
      project.godot
  2. 3 0
      scenes/main/scripts/control.gd
  3. 26 2
      scenes/menu/search_menu.gd
  4. 1 1
      theme/main_theme.tres

+ 5 - 0
project.godot

@@ -67,6 +67,11 @@ open_explore={
 "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
 ]
 }
+search={
+"deadzone": 0.2,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
 
 [rendering]
 

+ 3 - 0
scenes/main/scripts/control.gd

@@ -261,6 +261,9 @@ func _input(event):
 			save_load.save_graph_edit(currentfile)
 	elif event.is_action_pressed("open_explore"):
 		open_explore()
+	elif event.is_action_pressed("search"):
+		var pos = graph_edit.get_local_mouse_position()
+		_on_graph_edit_popup_request(pos)
 	
 
 

+ 26 - 2
scenes/menu/search_menu.gd

@@ -33,6 +33,9 @@ func display_items(filter: String):
 	# Remove all existing items from the VBoxContainer
 	for child in item_container.get_children():
 		child.queue_free()
+		
+	var filters = filter.to_lower().split(" ", false)
+	
 	for key in node_data.keys():
 		var item = node_data[key]
 		var title = item.get("title", "")
@@ -45,10 +48,18 @@ func display_items(filter: String):
 		var subcategory = item.get("subcategory", "")
 		var short_desc = item.get("short_description", "")
 		
+		# Combine all searchable text into one lowercase string
+		var searchable_text = "%s %s %s %s" % [title, short_desc, category, subcategory]
+		searchable_text = searchable_text.to_lower()
+		
 		# If filter is not empty, skip non-matches populate all other buttons
 		if filter != "":
-			var filter_lc = filter.to_lower()
-			if not (filter_lc in title.to_lower() or filter_lc in short_desc.to_lower() or filter_lc in category.to_lower() or filter_lc in subcategory.to_lower()):
+			var match_all_words = true
+			for word in filters:
+				if word != "" and not searchable_text.findn(word) != -1:
+					match_all_words = false
+					break
+			if not match_all_words:
 				continue
 		
 		var btn = Button.new()
@@ -63,6 +74,14 @@ func display_items(filter: String):
 		else:
 			btn.text = "%s: %s - %s" % [subcategory.to_pascal_case(), title, short_desc]
 		btn.connect("pressed", Callable(self, "_on_item_selected").bind(key)) #pass key (process name) when button is pressed
+		
+		#apply custom focus theme for keyboard naviagation
+		var theme := Theme.new()
+		var style_focus := StyleBoxFlat.new()
+		style_focus.bg_color = Color.hex(0xffffff6a)
+		theme.set_stylebox("focus", "Button", style_focus)
+		btn.theme = theme
+		
 		item_container.add_child(btn)
 	
 	#resize menu within certain bounds #50
@@ -78,3 +97,8 @@ func _on_search_bar_text_changed(new_text: String) -> void:
 func _on_item_selected(key: String):
 	self.hide()
 	make_node.emit(key) # send out signal to main patch
+
+func _on_search_bar_text_submitted(new_text: String) -> void:
+	var button = item_container.get_child(0)
+	if button and button is Button:
+		button.emit_signal("pressed")

+ 1 - 1
theme/main_theme.tres

@@ -18,7 +18,7 @@ content_margin_left = 4.0
 content_margin_top = 4.0
 content_margin_right = 4.0
 content_margin_bottom = 4.0
-bg_color = Color(1, 1, 1, 0.75)
+bg_color = Color(1, 1, 1, 0.415686)
 draw_center = false
 corner_detail = 5
 expand_margin_left = 2.0