pandemonium_engine_easy_charts/imgs/snapshot.html
Nicolò Santilio 7c73e92f8f
1st Refactor (#53)
fix #48 #52 #46 

* Refactor so it works with the new data format.

Restructured some functions in smaller pieces and changed it so they can work with data in the new format.

Main way to use it will be with the new plot_function but old functions support is requiered through structure_datas (WIP)

* structure_datas rework

structure_datas structure the data to match the new format.

* Add new plotting methods

Also renamed identifiers array to the already existing y_labels and a fix to correctly calculate tics.

* Add autoscale or user-defined range

* Add color definition from plot_function call

Introduction of a param_dic parameter on plot_function that allows for specific parameters definitions for that curve only without changing the full Chart.

Also moved the label identier string to a parameter on this dicionary so it can be called without specifying a label name.

* Fix representation of negative values

Using negative numbers should now work on both axis. For this I created two new methods calcualte_interval_tics and calculate_number_integer_digits to avoid code repetition.

I'd like to work more on this, since now the representation is correct but can look very weird for some values with a lot of empty space on the chart.

* Correctly calculates tics for numbers between 0 and 1

Also some small fixes to update_function and delete_function. Changed the tic little line to point outside the chart instead of inside so it doesn't overlap with the grid line.

* Correctly (almost) center axis labels

Needs a little of research for the vertical centering since get_string_size doesn't behave as expected.

* Add some style representation customization

Width of the grid and function lines.

Made drawing points for LineChart optional (especially useful when using a huge number of points to avoid overclustering). For this I had to rewrite the draw_lines function to work similar to draw_points using point_positions instead of information of the point nodes.

The string position of the labels is correctly calculated now. It uses a new variable: label_displacement so it don't look too close to the axis and the border.

Set some default values  that make more sense to the instanciable scenes.

* Fix clearing of data structures with multiple calls to plot_from_x

* Fix show_x_values_as_labels

Correctly sets the x position when show_x_values_as_labels is active.

* Fix show_x_values_as_labels when the label is a String

* restructure folder

* refactor scatter_chart and line_chart

* finish 1st refactoring

* finish 1st refactoring

* finish 1st refactoring

* remove .tmp

* fix min errors

Co-authored-by: Jorge <63685920+JFerrerBeired@users.noreply.github.com>
2022-01-08 19:10:31 +01:00

279 lines
9.6 KiB
HTML

<!DOCTYPE html>
<pre>
<code>
tool
class_name CodeSnapshotInstance
extends Control
onready var viewport_container : ViewportContainer = $VSplitContainer/ViewportContainer
onready var viewport : Viewport = viewport_container.get_child(0)
onready var snapshot_container : ColorRect = viewport.get_node("Background")
onready var settings_container : VBoxContainer = $VSplitContainer/Settings
onready var script_container : PanelContainer = snapshot_container.get_node("ScriptContainer")
onready var script_edit : TextEdit = script_container.get_node("VBox/ScriptEdit")
onready var template_menu : PopupMenu = settings_container.get_node("Template/TemplateMenu").get_popup()
onready var colors_list : VBoxContainer = settings_container.get_node("Colors/ColorsList")
onready var properties_list : VBoxContainer = settings_container.get_node("Properties/PropertiesList")
onready var from : LineEdit = settings_container.get_node("Properties/PropertiesList/from_line_to_line/from")
onready var to : LineEdit = settings_container.get_node("Properties/PropertiesList/from_line_to_line/to")
onready var save : FileDialog = $Save
var script_editor : ScriptEditor
var editor_settings : EditorSettings
var template_dir : String = "res://addons/code-snapshot/godot-syntax-themes/"
var templates : PoolStringArray
var template_file : String = "Darcula"
var keywords : Array = ["self", "if", "else", "elif", "or", "and", "yield","func", "onready", "export", "var", "tool", "extends", "void", "null", "true", "false", "class_name", "print", "return", "pass", "match", "in", "define", "const"]
var types : PoolStringArray = ClassDB.get_class_list()
var from_line_to : Array = [-1, -1]
var lines_count_as_min_size : bool = true
var exporting_extension : String
var path_to_save : String
func set_editor_settings(settings : EditorSettings):
editor_settings = settings
func set_script_editor(editor : ScriptEditor):
script_editor = editor
script_editor.connect("editor_script_changed", self, "_on_script_changed")
_on_script_changed(script_editor.get_current_script())
func hide_nodes():
colors_list.hide()
properties_list.hide()
func _ready() -> void:
yield(get_tree(),"idle_frame")
# viewport.set_process_input(true)
script_edit.set_text("")
template_menu.connect("index_pressed", self, "_on_index_pressed")
hide_nodes()
load_templates()
if script_editor != null : _on_script_changed(script_editor.get_current_script())
func load_templates():
templates = []
template_menu.clear()
var dir = Directory.new()
if dir.open(template_dir) == OK:
dir.list_dir_begin()
var file_name = dir.get_next()
while file_name != "":
if not dir.current_is_dir() and file_name.get_extension() == "tet":
templates.append(file_name.get_basename())
template_menu.add_item(file_name.get_basename())
file_name = dir.get_next()
else:
print("An error occurred when trying to access the path.")
_on_index_pressed(0)
func _on_index_pressed(index : int):
apply_template(templates[index])
$VSplitContainer/Settings/Template/TemplateMenu.set_text("> "+templates[index])
func apply_template(template : String):
var config = ConfigFile.new()
var err = config.load(template_dir+"%s.tet"%template)
if err == OK: # If not, something went wrong with the file loading
set_script_box_color(config.get_value("color_theme", "background_color"))
for setting in config.get_section_keys("color_theme"):
if setting == "gdscript/function_definition_color" :
add_function_definition_color(config.get_value("color_theme",setting))
set_node_color("function_definition_color", config, "gdscript/")
if setting == "keyword_color": add_keywords_color(config.get_value("color_theme",setting))
if setting == "comment_color": add_comment_color(config.get_value("color_theme", setting))
if setting == "string_color" : add_string_color(config.get_value("color_theme", setting))
if setting == "engine_type_color" : add_engine_type_color(config.get_value("color_theme",setting))
if setting == "gdscript/node_path_color" : add_node_path_color(config.get_value("color_theme",setting))
if setting == "text_color" : set_text_color(config.get_value("color_theme",setting))
script_edit.set("custom_colors/"+setting, config.get_value("color_theme",setting))
set_node_color(setting, config)
func set_node_color(setting : String, config : ConfigFile, category : String = ""):
if colors_list.get_node_or_null("%s/Color"%setting) != null : colors_list.get_node_or_null("%s/Color"%setting).color = config.get_value("color_theme",category+setting)
func add_node_path_color(color : Color):
script_edit.add_color_region("$","", color, false)
func add_engine_type_color(color : Color):
for type in types: script_edit.add_keyword_color(type, color)
func add_function_definition_color(color : Color):
script_edit.add_color_region("func ","", color)
func set_script_edit_size(size : Vector2):
script_container.rect_size = size
func set_background_color(color : Color):
snapshot_container.color = color
# Script Box Color
func set_script_box_color(color : Color):
script_container.get("custom_styles/panel").set("bg_color", color)
set_script_background_color(color)
func get_script_box_color() -> String:
return "#"+script_container.get("custom_styles/panel").get("bg_color").to_html(false)
# ................
func set_member_variable_color(color : Color):
script_edit.set("custom_colors/member_variable_color", color)
func set_function_color(color : Color):
script_edit.set("custom_colors/function_color", color)
# Script Background color .....
func set_script_background_color(color : Color):
script_edit.set("custom_colors/background_color", color)
func get_script_background_color() -> String:
return "#"+script_edit.get("custom_colors/background_color").to_html(false)
# ..............
func set_number_color(color : Color):
script_edit.set("custom_colors/number_color", color)
# Text Color .....
func set_text_color(color : Color):
script_edit.set("custom_colors/font_color", color)
func get_text_color() -> String:
return "#"+script_edit.get("custom_colors/font_color").to_html(false)
# ................
func add_keywords_color(color : Color):
for keyword in keywords:
script_edit.add_keyword_color(keyword,color)
func add_comment_color(color : Color):
script_edit.add_color_region("#","",color,true)
func add_string_color(color : Color):
script_edit.add_color_region('"','"',color,false)
func set_from_line_to(from : int, to : int):
from_line_to = [from, to]
var current_script : Script
func _on_script_changed(script : Script):
if script == null or script_edit == null: return
current_script = script
var code : String = script.get_source_code()
var code_array : Array = code.c_unescape().split("
")
code = PoolStringArray(code_array.slice(from_line_to[0]-1 if from_line_to[0] != -1 and from_line_to[0] < code_array.size()-1 else 0, from_line_to[1]-1 if from_line_to[1] != -1 and from_line_to[1] < code_array.size()-1 else code_array.size()-1)).join("
")
script_edit.set_text(code)
change_frame_min_size()
func change_frame_min_size():
if lines_count_as_min_size:
script_edit.rect_min_size.y = script_edit.get_line_count() * (editor_settings.get_setting("interface/editor/code_font_size") + 6) if script_edit.get_line_count() <= 35 else 132
viewport_container.rect_min_size.y = script_edit.rect_min_size.y + 168
else:
script_edit.rect_min_size.y = 0
viewport_container.rect_min_size.y = 300
func _on_ColorsBtn_toggled(button_pressed : bool):
colors_list.visible = button_pressed
if button_pressed: $VSplitContainer/Settings/Colors/ColorsBtn.set_text("v Colors")
else: $VSplitContainer/Settings/Colors/ColorsBtn.set_text("> Colors")
func _on_PropertiesBtn_toggled(button_pressed : bool):
properties_list.visible = button_pressed
if button_pressed: $VSplitContainer/Settings/Properties/PropertiesBtn.set_text("v Properties")
else: $VSplitContainer/Settings/Properties/PropertiesBtn.set_text("> Properties")
func _on_export_confirmed(path : String):
path_to_save = path
func _on_Save_hide():
match exporting_extension:
"png":
var image : Image = viewport.get_texture().get_data()
image.flip_y()
image.save_png(path_to_save)
"html":
var file : File = File.new()
file.open(path_to_save, File.WRITE)
var content : String = '<!DOCTYPE html>
'
content+='<pre>
<code>
'
content+=script_edit.text+"
"
content+='</code>
</pre>'
file.store_line(content)
file.close()
func _on_autowrap_value_toggled(button_pressed):
script_edit.wrap_enabled = button_pressed
script_edit.update()
func _on_draw_tabs_value_toggled(button_pressed):
script_edit.draw_tabs = button_pressed
func _on_from_text_changed(new_text):
if new_text.is_valid_integer():
if int(new_text) == 0:
new_text = str(-1)
from.set_text(new_text)
from_line_to[0] = int(new_text)
_on_script_changed(current_script)
func _on_to_text_changed(new_text):
if new_text.is_valid_integer():
if int(new_text) == 0:
new_text = str(-1)
to.set_text(new_text)
from_line_to[1] = int(new_text)
_on_script_changed(current_script)
func _on_Reload_pressed():
_on_script_changed(current_script)
func _on_minimap_draw_value_toggled(button_pressed):
script_edit.minimap_draw = button_pressed
func _on_ViewportContainer_item_rect_changed():
snapshot_container.rect_size = viewport_container.rect_size
func _on_minsie_value_toggled(button_pressed):
lines_count_as_min_size = button_pressed
change_frame_min_size()
func _on_ExportPNG_pressed():
exporting_extension = "png"
save.filters = ["*.png ; Portable Network Graphics"]
save.current_file = "snapshot.png"
save.popup()
func _on_ExportHTML_pressed():
exporting_extension = "html"
save.filters = ["*.html ; HyperText Markup Language"]
save.current_file = "snapshot.html"
save.popup()
</code>
</pre>