minor fixes update
18
.gitignore
vendored
@ -1,17 +1,3 @@
|
||||
*.import
|
||||
*.png
|
||||
|
||||
# Godot-specific ignores
|
||||
.import/
|
||||
export.cfg
|
||||
export_presets.cfg
|
||||
|
||||
# Imported translations (automatically generated from CSV files)
|
||||
*.translation
|
||||
|
||||
# Mono-specific ignores
|
||||
.mono/
|
||||
data_*/
|
||||
mono_crash.*.json
|
||||
|
||||
# System/tool-specific ignores
|
||||
.directory
|
||||
*~
|
||||
|
@ -19,371 +19,372 @@ values of more than one measured variable.
|
||||
# ---------------------
|
||||
|
||||
func _get_property_list():
|
||||
return [
|
||||
# Chart Properties
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/are_values_columns",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "-1,100,1",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/labels_index",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/show_x_values_as_labels",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "1,20,0.5",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/column_width",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0,10,0.5",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/column_gap",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
|
||||
# Chart Display
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,10",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/x_decim",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,10",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/y_decim",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
|
||||
# Chart Style
|
||||
{
|
||||
"hint": 24,
|
||||
"hint_string": "%d/%d:%s"%[TYPE_INT, PROPERTY_HINT_ENUM,
|
||||
PoolStringArray(PointShapes.keys()).join(",")],
|
||||
"name": "Chart_Style/points_shape",
|
||||
"type": TYPE_ARRAY,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/function_colors",
|
||||
"type": TYPE_COLOR_ARRAY
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/box_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/v_lines_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/h_lines_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/bold_font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_ENUM,
|
||||
"hint_string": PoolStringArray(TemplatesNames.keys()).join(","),
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/template",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
|
||||
# Chart Modifiers
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Modifiers/invert_chart",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
]
|
||||
return [
|
||||
# Chart Properties
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/are_values_columns",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "-1,100,1",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/labels_index",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/show_x_values_as_labels",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "1,20,0.5",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/column_width",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0,10,0.5",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/column_gap",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
|
||||
# Chart Display
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,10",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/x_decim",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,10",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/y_decim",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
|
||||
# Chart Style
|
||||
{
|
||||
"hint": 24,
|
||||
"hint_string": "%d/%d:%s"%[TYPE_INT, PROPERTY_HINT_ENUM,
|
||||
PoolStringArray(PointShapes.keys()).join(",")],
|
||||
"name": "Chart_Style/points_shape",
|
||||
"type": TYPE_ARRAY,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/function_colors",
|
||||
"type": TYPE_COLOR_ARRAY
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/box_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/v_lines_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/h_lines_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/bold_font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_ENUM,
|
||||
"hint_string": PoolStringArray(TemplatesNames.keys()).join(","),
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/template",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
|
||||
# Chart Modifiers
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Modifiers/invert_chart",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
]
|
||||
|
||||
func build_chart():
|
||||
SIZE = get_size()
|
||||
origin = Vector2(OFFSET.x,SIZE.y-OFFSET.y)
|
||||
SIZE = get_size()
|
||||
origin = Vector2(OFFSET.x,SIZE.y-OFFSET.y)
|
||||
|
||||
func structure_datas(database : Array, are_values_columns : bool, x_values_index : int):
|
||||
# @x_values_index can be either a column or a row relative to x values
|
||||
# @y_values can be either a column or a row relative to y values
|
||||
self.are_values_columns = are_values_columns
|
||||
match are_values_columns:
|
||||
true:
|
||||
for row in database.size():
|
||||
var t_vals : Array
|
||||
for column in database[row].size():
|
||||
if column == x_values_index:
|
||||
var x_data = database[row][column]
|
||||
if x_data.is_valid_float() or x_data.is_valid_integer():
|
||||
x_datas.append(x_data as float)
|
||||
else:
|
||||
x_datas.append(x_data.replace(",",".") as float)
|
||||
else:
|
||||
if row != 0:
|
||||
var y_data = database[row][column]
|
||||
if y_data.is_valid_float() or y_data.is_valid_integer():
|
||||
t_vals.append(y_data as float)
|
||||
else:
|
||||
t_vals.append(y_data.replace(",",".") as float)
|
||||
else:
|
||||
y_labels.append(str(database[row][column]))
|
||||
if not t_vals.empty():
|
||||
y_datas.append(t_vals)
|
||||
x_label = str(x_datas.pop_front())
|
||||
false:
|
||||
for row in database.size():
|
||||
if row == x_values_index:
|
||||
x_datas = (database[row])
|
||||
x_label = x_datas.pop_front() as String
|
||||
else:
|
||||
var values = database[row] as Array
|
||||
y_labels.append(values.pop_front() as String)
|
||||
y_datas.append(values)
|
||||
for data in y_datas:
|
||||
for value in data.size():
|
||||
data[value] = data[value] as float
|
||||
|
||||
# draw y labels
|
||||
var to_order : Array
|
||||
var to_order_min : Array
|
||||
for cluster in y_datas.size():
|
||||
# define x_chors and y_chors
|
||||
var ordered_cluster = y_datas[cluster] as Array
|
||||
ordered_cluster.sort()
|
||||
ordered_cluster = PoolIntArray(ordered_cluster)
|
||||
var margin_max = ordered_cluster[ordered_cluster.size()-1]
|
||||
var margin_min = ordered_cluster[0]
|
||||
to_order.append(margin_max)
|
||||
to_order_min.append(margin_min)
|
||||
|
||||
to_order.sort()
|
||||
to_order_min.sort()
|
||||
var margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
y_margin_min = to_order_min.pop_front()
|
||||
v_dist = y_decim * pow(10.0,str(margin).length()-2)
|
||||
var multi = 0
|
||||
var p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
|
||||
# draw x_labels
|
||||
if not show_x_values_as_labels:
|
||||
to_order.clear()
|
||||
to_order = x_datas as PoolIntArray
|
||||
|
||||
to_order.sort()
|
||||
margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
x_margin_min = to_order.pop_front()
|
||||
h_dist = x_decim * pow(10.0,str(margin).length()-2)
|
||||
multi = 0
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
# @x_values_index can be either a column or a row relative to x values
|
||||
# @y_values can be either a column or a row relative to y values
|
||||
self.are_values_columns = are_values_columns
|
||||
match are_values_columns:
|
||||
true:
|
||||
for row in database.size():
|
||||
var t_vals : Array
|
||||
for column in database[row].size():
|
||||
if column == x_values_index:
|
||||
var x_data = database[row][column]
|
||||
if x_data.is_valid_float() or x_data.is_valid_integer():
|
||||
x_datas.append(x_data as float)
|
||||
else:
|
||||
x_datas.append(x_data.replace(",",".") as float)
|
||||
else:
|
||||
if row != 0:
|
||||
var y_data = database[row][column]
|
||||
if y_data.is_valid_float() or y_data.is_valid_integer():
|
||||
t_vals.append(y_data as float)
|
||||
else:
|
||||
t_vals.append(y_data.replace(",",".") as float)
|
||||
else:
|
||||
y_labels.append(str(database[row][column]))
|
||||
if not t_vals.empty():
|
||||
y_datas.append(t_vals)
|
||||
x_label = str(x_datas.pop_front())
|
||||
false:
|
||||
for row in database.size():
|
||||
if row == x_values_index:
|
||||
x_datas = (database[row])
|
||||
x_label = x_datas.pop_front() as String
|
||||
else:
|
||||
var values = database[row] as Array
|
||||
y_labels.append(values.pop_front() as String)
|
||||
y_datas.append(values)
|
||||
for data in y_datas:
|
||||
for value in data.size():
|
||||
data[value] = data[value] as float
|
||||
|
||||
# draw y labels
|
||||
var to_order : Array
|
||||
var to_order_min : Array
|
||||
for cluster in y_datas.size():
|
||||
# define x_chors and y_chors
|
||||
var ordered_cluster = y_datas[cluster] as Array
|
||||
ordered_cluster.sort()
|
||||
ordered_cluster = PoolIntArray(ordered_cluster)
|
||||
var margin_max = ordered_cluster[ordered_cluster.size()-1]
|
||||
var margin_min = ordered_cluster[0]
|
||||
to_order.append(margin_max)
|
||||
to_order_min.append(margin_min)
|
||||
|
||||
to_order.sort()
|
||||
to_order_min.sort()
|
||||
var margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
y_margin_min = to_order_min.pop_front()
|
||||
v_dist = y_decim * pow(10.0,str(margin).length()-2)
|
||||
var multi = 0
|
||||
var p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
|
||||
# draw x_labels
|
||||
if not show_x_values_as_labels:
|
||||
to_order.clear()
|
||||
to_order = x_datas as PoolIntArray
|
||||
|
||||
to_order.sort()
|
||||
margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
x_margin_min = to_order.pop_front()
|
||||
h_dist = x_decim * pow(10.0,str(margin).length()-2)
|
||||
multi = 0
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
|
||||
|
||||
func calculate_pass():
|
||||
if invert_chart:
|
||||
x_chors = y_labels as PoolStringArray
|
||||
else:
|
||||
if show_x_values_as_labels:
|
||||
x_chors = x_datas as PoolStringArray
|
||||
else:
|
||||
x_chors = x_labels
|
||||
|
||||
# calculate distance in pixel between 2 consecutive values/datas
|
||||
if not are_values_columns:
|
||||
x_pass = (SIZE.x - OFFSET.x*2 - (column_width) * ( y_datas.size() if not invert_chart else y_datas[0].size()+1 ) - column_gap - column_width/2) / (x_chors.size()-1)
|
||||
else:
|
||||
x_pass = (SIZE.x - OFFSET.x*2 - (column_width) * ( y_datas.size() if invert_chart else y_datas[0].size()+1 ) - column_gap - column_width/2) / (x_chors.size()-1)
|
||||
y_pass = origin.y / (y_chors.size()-1)
|
||||
if invert_chart:
|
||||
x_chors = y_labels as PoolStringArray
|
||||
else:
|
||||
if show_x_values_as_labels:
|
||||
x_chors = x_datas as PoolStringArray
|
||||
else:
|
||||
x_chors = x_labels
|
||||
|
||||
# calculate distance in pixel between 2 consecutive values/datas
|
||||
if not are_values_columns:
|
||||
x_pass = (SIZE.x - OFFSET.x*2 - (column_width) * ( y_datas.size() if not invert_chart else y_datas[0].size()+1 ) - column_gap - column_width/2) / ((x_chors.size()-1) if x_chors.size()!=1 else 1)
|
||||
else:
|
||||
x_pass = (SIZE.x - OFFSET.x*2 - (column_width) * ( y_datas.size() if invert_chart else y_datas[0].size()+1 ) - column_gap - column_width/2) / (x_chors.size()-1)
|
||||
y_pass = origin.y / (y_chors.size()-1)
|
||||
|
||||
func calculate_coordinates():
|
||||
x_coordinates.clear()
|
||||
y_coordinates.clear()
|
||||
point_values.clear()
|
||||
point_positions.clear()
|
||||
|
||||
if invert_chart:
|
||||
for column in y_datas[0].size():
|
||||
var single_coordinates : Array
|
||||
for row in y_datas:
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((row[column]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((row[column] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
else:
|
||||
for cluster in y_datas:
|
||||
var single_coordinates : Array
|
||||
for value in cluster.size():
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((cluster[value]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((cluster[value] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
|
||||
if show_x_values_as_labels:
|
||||
for x in x_datas.size():
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
for x in x_datas.size():
|
||||
if origin_at_zero:
|
||||
if not invert_chart:
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
x_coordinates.append(x_datas[x]*x_pass/h_dist)
|
||||
else:
|
||||
x_coordinates.append((x_datas[x] - x_margin_min)*x_pass/h_dist)
|
||||
|
||||
for f in functions:
|
||||
point_values.append([])
|
||||
point_positions.append([])
|
||||
|
||||
if invert_chart:
|
||||
for function in y_coordinates.size():
|
||||
for function_value in y_coordinates[function].size():
|
||||
if are_values_columns:
|
||||
point_values[function].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
point_positions[function].append(Vector2(OFFSET.x/2 + column_width/2 + (column_width + column_gap)*function + x_coordinates[function_value]+origin.x,origin.y-y_coordinates[function][function_value]))
|
||||
else:
|
||||
point_positions[function].append(Vector2(OFFSET.x/2 + column_width/2 + (column_width + column_gap)*function + x_coordinates[function_value]+origin.x,origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
for cluster in y_coordinates.size():
|
||||
for y in y_coordinates[cluster].size():
|
||||
if are_values_columns:
|
||||
point_positions[y].append(Vector2(OFFSET.x/2 + column_width/2 + (column_width + column_gap)*y + x_coordinates[cluster] + origin.x, origin.y-y_coordinates[cluster][y]))
|
||||
point_values[y].append([x_datas[cluster],y_datas[cluster][y]])
|
||||
else:
|
||||
point_values[cluster].append([x_datas[y],y_datas[cluster][y]])
|
||||
point_positions[cluster].append(Vector2(OFFSET.x/2 + column_width/2 + (column_width + column_gap)*cluster + x_coordinates[y]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
x_coordinates.clear()
|
||||
y_coordinates.clear()
|
||||
point_values.clear()
|
||||
point_positions.clear()
|
||||
|
||||
if invert_chart:
|
||||
for column in y_datas[0].size():
|
||||
var single_coordinates : Array
|
||||
for row in y_datas:
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((row[column]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((row[column] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
else:
|
||||
for cluster in y_datas:
|
||||
var single_coordinates : Array
|
||||
for value in cluster.size():
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((cluster[value]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((cluster[value] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
|
||||
if show_x_values_as_labels:
|
||||
for x in x_datas.size():
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
for x in x_datas.size():
|
||||
if origin_at_zero:
|
||||
if not invert_chart:
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
x_coordinates.append(x*x_pass/h_dist)
|
||||
else:
|
||||
x_coordinates.append((x_datas[x] - x_margin_min)*x_pass/h_dist)
|
||||
|
||||
for f in functions:
|
||||
point_values.append([])
|
||||
point_positions.append([])
|
||||
|
||||
if invert_chart:
|
||||
for function in y_coordinates.size():
|
||||
for function_value in y_coordinates[function].size():
|
||||
if are_values_columns:
|
||||
point_values[function].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
point_positions[function].append(Vector2(OFFSET.x/2 + column_width/2 + (column_width + column_gap)*function + x_coordinates[function_value]+origin.x,origin.y-y_coordinates[function][function_value]))
|
||||
else:
|
||||
point_positions[function].append(Vector2(OFFSET.x/2 + column_width/2 + (column_width + column_gap)*function + x_coordinates[function_value]+origin.x,origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
for cluster in y_coordinates.size():
|
||||
for y in y_coordinates[cluster].size():
|
||||
if are_values_columns:
|
||||
point_positions[y].append(Vector2(OFFSET.x/2 + column_width/2 + (column_width + column_gap)*y + x_coordinates[cluster] + origin.x, origin.y-y_coordinates[cluster][y]))
|
||||
point_values[y].append([x_datas[cluster],y_datas[cluster][y]])
|
||||
else:
|
||||
point_values[cluster].append([x_datas[y],y_datas[cluster][y]])
|
||||
point_positions[cluster].append(Vector2(OFFSET.x/2 + column_width/2 + (column_width + column_gap)*cluster + x_coordinates[y]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
|
||||
func _draw():
|
||||
clear_points()
|
||||
|
||||
draw_grid()
|
||||
draw_chart_outlines()
|
||||
|
||||
var defined_colors : bool = false
|
||||
if function_colors.size():
|
||||
defined_colors = true
|
||||
|
||||
for _function in point_values.size():
|
||||
var PointContainer : Control = Control.new()
|
||||
Points.add_child(PointContainer)
|
||||
|
||||
for function_point in point_values[_function].size():
|
||||
var point : Point = point_node.instance()
|
||||
point.connect("_point_pressed",self,"point_pressed")
|
||||
point.connect("_mouse_entered",self,"show_data")
|
||||
point.connect("_mouse_exited",self,"hide_data")
|
||||
|
||||
point.create_point(points_shape[_function], function_colors[function_point if invert_chart else _function],
|
||||
Color.white, point_positions[_function][function_point],
|
||||
point.format_value(point_values[_function][function_point], false, false),
|
||||
y_labels[function_point if invert_chart else _function] as String)
|
||||
PointContainer.add_child(point)
|
||||
point.rect_size.y = origin.y - point_positions[_function][function_point].y
|
||||
draw_line( Vector2(point_positions[_function][function_point].x, origin.y),
|
||||
point_positions[_function][function_point], function_colors[_function], column_width, true)
|
||||
clear_points()
|
||||
|
||||
draw_grid()
|
||||
draw_chart_outlines()
|
||||
|
||||
var defined_colors : bool = false
|
||||
if function_colors.size():
|
||||
defined_colors = true
|
||||
|
||||
for _function in point_values.size():
|
||||
var PointContainer : Control = Control.new()
|
||||
Points.add_child(PointContainer)
|
||||
|
||||
for function_point in point_values[_function].size():
|
||||
var point : Point = point_node.instance()
|
||||
point.connect("_point_pressed",self,"point_pressed")
|
||||
point.connect("_mouse_entered",self,"show_data")
|
||||
point.connect("_mouse_exited",self,"hide_data")
|
||||
|
||||
point.create_point(points_shape[_function], function_colors[function_point if invert_chart else _function],
|
||||
Color.white, point_positions[_function][function_point],
|
||||
point.format_value(point_values[_function][function_point], false, false),
|
||||
y_labels[function_point if invert_chart else _function] as String)
|
||||
PointContainer.add_child(point)
|
||||
point.rect_size.y = origin.y - point_positions[_function][function_point].y
|
||||
draw_line( Vector2(point_positions[_function][function_point].x, origin.y),
|
||||
point_positions[_function][function_point], function_colors[_function], column_width, true)
|
||||
# draw_string(font, Vector2(point_positions[_function][function_point].x, origin.y+10), y_labels[function_point], font_color)
|
||||
|
||||
func draw_grid():
|
||||
# ascisse
|
||||
for p in x_chors.size():
|
||||
var point : Vector2 = origin+Vector2((p)*x_pass,0)
|
||||
# v grid
|
||||
draw_line(point,point-Vector2(0,SIZE.y-OFFSET.y),v_lines_color,0.2,true)
|
||||
# ascisse
|
||||
draw_line(point-Vector2(0,5),point,v_lines_color,1,true)
|
||||
var calculated_gap : float
|
||||
if not are_values_columns:
|
||||
calculated_gap = ( y_datas.size() if not invert_chart else y_datas[0].size()+1 )
|
||||
else:
|
||||
calculated_gap = ( y_datas.size() if invert_chart else y_datas[0].size()+1 )
|
||||
draw_string(font,point+Vector2(-const_width/2*x_chors[p].length() + (column_width/2) * calculated_gap + column_gap,font_size),x_chors[p],font_color)
|
||||
# ascisse
|
||||
for p in x_chors.size():
|
||||
var point : Vector2 = origin+Vector2((p)*x_pass,0)
|
||||
# v grid
|
||||
draw_line(point,point-Vector2(0,SIZE.y-OFFSET.y),v_lines_color,0.2,true)
|
||||
# ascisse
|
||||
draw_line(point-Vector2(0,5),point,v_lines_color,1,true)
|
||||
var calculated_gap : float
|
||||
if not are_values_columns:
|
||||
calculated_gap = ( y_datas.size() if not invert_chart else y_datas[0].size()+1 )
|
||||
else:
|
||||
calculated_gap = ( y_datas.size() if invert_chart else y_datas[0].size()+1 )
|
||||
draw_string(font,point+Vector2(-const_width/2*x_chors[p].length() + (column_width/2) * calculated_gap + column_gap,font_size),x_chors[p],font_color)
|
||||
|
||||
# ordinate
|
||||
for p in y_chors.size():
|
||||
var point : Vector2 = origin-Vector2(0,(p)*y_pass)
|
||||
# h grid
|
||||
draw_line(point,point+Vector2(SIZE.x-OFFSET.x,0),h_lines_color,0.2,true)
|
||||
# ordinate
|
||||
draw_line(point,point+Vector2(5,0),h_lines_color,1,true)
|
||||
draw_string(font,point-Vector2(y_chors[p].length()*const_width+font_size,font_size/2),y_chors[p],font_color)
|
||||
# ordinate
|
||||
for p in y_chors.size():
|
||||
var point : Vector2 = origin-Vector2(0,(p)*y_pass)
|
||||
# h grid
|
||||
draw_line(point,point+Vector2(SIZE.x-OFFSET.x,0),h_lines_color,0.2,true)
|
||||
# ordinate
|
||||
draw_line(point,point+Vector2(5,0),h_lines_color,1,true)
|
||||
draw_string(font,point-Vector2(y_chors[p].length()*const_width+font_size,font_size/2),y_chors[p],font_color)
|
||||
|
||||
func draw_chart_outlines():
|
||||
# if boxed:
|
||||
draw_line(Vector2(origin.x,0),Vector2(SIZE.x,0),box_color,1,true)
|
||||
draw_line(Vector2(SIZE.x,0),Vector2(SIZE.x,origin.y),box_color,1,true)
|
||||
draw_line(Vector2(SIZE.x,origin.y),origin,box_color,1,true)
|
||||
draw_line(origin,Vector2(origin.x,0),box_color,1,true)
|
||||
draw_line(Vector2(origin.x,0),Vector2(SIZE.x,0),box_color,1,true)
|
||||
draw_line(Vector2(SIZE.x,0),Vector2(SIZE.x,origin.y),box_color,1,true)
|
||||
draw_line(Vector2(SIZE.x,origin.y),origin,box_color,1,true)
|
||||
draw_line(origin,Vector2(origin.x,0),box_color,1,true)
|
||||
|
||||
func create_legend():
|
||||
legend.clear()
|
||||
for function in functions:
|
||||
var function_legend = FunctionLegend.instance()
|
||||
var f_name : String
|
||||
if invert_chart:
|
||||
f_name = x_datas[function] as String
|
||||
else:
|
||||
f_name = y_labels[function]
|
||||
var legend_font : Font
|
||||
if font != null:
|
||||
legend_font = font
|
||||
if bold_font != null:
|
||||
legend_font = bold_font
|
||||
function_legend.create_legend(f_name,function_colors[function],bold_font,font_color)
|
||||
legend.append(function_legend)
|
||||
|
||||
legend.clear()
|
||||
for function in functions:
|
||||
var function_legend = FunctionLegend.instance()
|
||||
var f_name : String
|
||||
if invert_chart:
|
||||
f_name = x_datas[function] as String
|
||||
else:
|
||||
f_name = y_labels[function]
|
||||
var legend_font : Font
|
||||
if font != null:
|
||||
legend_font = font
|
||||
if bold_font != null:
|
||||
legend_font = bold_font
|
||||
function_legend.create_legend(f_name,function_colors[function],bold_font,font_color)
|
||||
legend.append(function_legend)
|
||||
|
||||
|
@ -25,7 +25,23 @@ the specific categories being compared, and the other axis represents a measured
|
||||
Some bar graphs present bars clustered in groups of more than one, showing the
|
||||
values of more than one measured variable."
|
||||
}
|
||||
function_colors = [ "#1e1e1e", "#1e1e1e", "#1e1e1e", "#1e1e1e" ]
|
||||
Chart_Properties/are_values_columns = false
|
||||
Chart_Properties/labels_index = 0
|
||||
Chart_Properties/show_x_values_as_labels = true
|
||||
Chart_Properties/column_width = 2.0
|
||||
Chart_Properties/column_gap = 2.0
|
||||
Chart_Display/x_decim = 5.0
|
||||
Chart_Display/y_decim = 5.0
|
||||
Chart_Style/points_shape = [ 0 ]
|
||||
Chart_Style/function_colors = PoolColorArray( 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1 )
|
||||
Chart_Style/box_color = Color( 0.117647, 0.117647, 0.117647, 1 )
|
||||
Chart_Style/v_lines_color = Color( 0.792157, 0.792157, 0.792157, 1 )
|
||||
Chart_Style/h_lines_color = Color( 0.792157, 0.792157, 0.792157, 1 )
|
||||
Chart_Style/font = null
|
||||
Chart_Style/bold_font = null
|
||||
Chart_Style/font_color = Color( 0.117647, 0.117647, 0.117647, 1 )
|
||||
Chart_Style/template = 0
|
||||
Chart_Modifiers/invert_chart = false
|
||||
|
||||
[node name="Background" type="ColorRect" parent="."]
|
||||
visible = false
|
||||
@ -53,10 +69,23 @@ __meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="ChartName" type="Label" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 0.0266667
|
||||
align = 1
|
||||
valign = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": true
|
||||
}
|
||||
|
||||
[node name="PointData" parent="." instance=ExtResource( 1 )]
|
||||
|
||||
[node name="PointData" parent="PointData" index="0"]
|
||||
visible = false
|
||||
margin_left = -154.32
|
||||
margin_top = -115.171
|
||||
margin_right = -154.456
|
||||
margin_bottom = -114.371
|
||||
theme = SubResource( 1 )
|
||||
|
||||
[editable path="PointData"]
|
||||
|
@ -18,330 +18,330 @@ In these cases they are known as run charts.
|
||||
# ---------------------
|
||||
|
||||
func _get_property_list():
|
||||
return [
|
||||
# Chart Properties
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/are_values_columns",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "-1,100,1",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/labels_index",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/show_x_values_as_labels",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
|
||||
# Chart Display
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,10",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/x_decim",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,10",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/y_decim",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
|
||||
# Chart Style
|
||||
{
|
||||
"hint": 24,
|
||||
"hint_string": "%d/%d:%s"%[TYPE_INT, PROPERTY_HINT_ENUM,
|
||||
PoolStringArray(PointShapes.keys()).join(",")],
|
||||
"name": "Chart_Style/points_shape",
|
||||
"type": TYPE_ARRAY,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/function_colors",
|
||||
"type": TYPE_COLOR_ARRAY
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/box_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/v_lines_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/h_lines_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/bold_font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_ENUM,
|
||||
"hint_string": PoolStringArray(TemplatesNames.keys()).join(","),
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/template",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
|
||||
# Chart Modifiers
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Modifiers/invert_chart",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
]
|
||||
return [
|
||||
# Chart Properties
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/are_values_columns",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "-1,100,1",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/labels_index",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/show_x_values_as_labels",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
|
||||
# Chart Display
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,10",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/x_decim",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,10",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/y_decim",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
|
||||
# Chart Style
|
||||
{
|
||||
"hint": 24,
|
||||
"hint_string": "%d/%d:%s"%[TYPE_INT, PROPERTY_HINT_ENUM,
|
||||
PoolStringArray(PointShapes.keys()).join(",")],
|
||||
"name": "Chart_Style/points_shape",
|
||||
"type": TYPE_ARRAY,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/function_colors",
|
||||
"type": TYPE_COLOR_ARRAY
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/box_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/v_lines_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/h_lines_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/bold_font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_ENUM,
|
||||
"hint_string": PoolStringArray(TemplatesNames.keys()).join(","),
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/template",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
|
||||
# Chart Modifiers
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Modifiers/invert_chart",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
]
|
||||
|
||||
func structure_datas(database : Array, are_values_columns : bool, x_values_index : int):
|
||||
# @x_values_index can be either a column or a row relative to x values
|
||||
# @y_values can be either a column or a row relative to y values
|
||||
self.are_values_columns = are_values_columns
|
||||
match are_values_columns:
|
||||
true:
|
||||
for row in database.size():
|
||||
var t_vals : Array
|
||||
for column in database[row].size():
|
||||
if column == x_values_index:
|
||||
var x_data = database[row][column]
|
||||
if x_data.is_valid_float() or x_data.is_valid_integer():
|
||||
x_datas.append(x_data as float)
|
||||
else:
|
||||
x_datas.append(x_data.replace(",",".") as float)
|
||||
else:
|
||||
if row != 0:
|
||||
var y_data = database[row][column]
|
||||
if y_data.is_valid_float() or y_data.is_valid_integer():
|
||||
t_vals.append(y_data as float)
|
||||
else:
|
||||
t_vals.append(y_data.replace(",",".") as float)
|
||||
else:
|
||||
y_labels.append(str(database[row][column]))
|
||||
if not t_vals.empty():
|
||||
y_datas.append(t_vals)
|
||||
x_label = str(x_datas.pop_front())
|
||||
false:
|
||||
for row in database.size():
|
||||
if row == x_values_index:
|
||||
x_datas = (database[row])
|
||||
x_label = x_datas.pop_front() as String
|
||||
else:
|
||||
var values = database[row] as Array
|
||||
y_labels.append(values.pop_front() as String)
|
||||
y_datas.append(values)
|
||||
for data in y_datas:
|
||||
for value in data.size():
|
||||
data[value] = data[value] as float
|
||||
|
||||
# draw y labels
|
||||
var to_order : Array
|
||||
var to_order_min : Array
|
||||
for cluster in y_datas.size():
|
||||
# define x_chors and y_chors
|
||||
var ordered_cluster = y_datas[cluster] as Array
|
||||
ordered_cluster.sort()
|
||||
ordered_cluster = PoolIntArray(ordered_cluster)
|
||||
var margin_max = ordered_cluster[ordered_cluster.size()-1]
|
||||
var margin_min = ordered_cluster[0]
|
||||
to_order.append(margin_max)
|
||||
to_order_min.append(margin_min)
|
||||
|
||||
to_order.sort()
|
||||
to_order_min.sort()
|
||||
var margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
y_margin_min = to_order_min.pop_front()
|
||||
v_dist = y_decim * pow(10.0,str(margin).length()-2)
|
||||
var multi = 0
|
||||
var p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
|
||||
# draw x_labels
|
||||
if not show_x_values_as_labels:
|
||||
to_order.clear()
|
||||
to_order = x_datas as PoolIntArray
|
||||
|
||||
to_order.sort()
|
||||
margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
x_margin_min = to_order.pop_front()
|
||||
h_dist = x_decim * pow(10.0,str(margin).length()-2)
|
||||
multi = 0
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
# @x_values_index can be either a column or a row relative to x values
|
||||
# @y_values can be either a column or a row relative to y values
|
||||
self.are_values_columns = are_values_columns
|
||||
match are_values_columns:
|
||||
true:
|
||||
for row in database.size():
|
||||
var t_vals : Array
|
||||
for column in database[row].size():
|
||||
if column == x_values_index:
|
||||
var x_data = database[row][column]
|
||||
if x_data.is_valid_float() or x_data.is_valid_integer():
|
||||
x_datas.append(x_data as float)
|
||||
else:
|
||||
x_datas.append(x_data.replace(",",".") as float)
|
||||
else:
|
||||
if row != 0:
|
||||
var y_data = database[row][column]
|
||||
if y_data.is_valid_float() or y_data.is_valid_integer():
|
||||
t_vals.append(y_data as float)
|
||||
else:
|
||||
t_vals.append(y_data.replace(",",".") as float)
|
||||
else:
|
||||
y_labels.append(str(database[row][column]))
|
||||
if not t_vals.empty():
|
||||
y_datas.append(t_vals)
|
||||
x_label = str(x_datas.pop_front())
|
||||
false:
|
||||
for row in database.size():
|
||||
if row == x_values_index:
|
||||
x_datas = (database[row])
|
||||
x_label = x_datas.pop_front() as String
|
||||
else:
|
||||
var values = database[row] as Array
|
||||
y_labels.append(values.pop_front() as String)
|
||||
y_datas.append(values)
|
||||
for data in y_datas:
|
||||
for value in data.size():
|
||||
data[value] = data[value] as float
|
||||
|
||||
# draw y labels
|
||||
var to_order : Array
|
||||
var to_order_min : Array
|
||||
for cluster in y_datas.size():
|
||||
# define x_chors and y_chors
|
||||
var ordered_cluster = y_datas[cluster] as Array
|
||||
ordered_cluster.sort()
|
||||
ordered_cluster = PoolIntArray(ordered_cluster)
|
||||
var margin_max = ordered_cluster[ordered_cluster.size()-1]
|
||||
var margin_min = ordered_cluster[0]
|
||||
to_order.append(margin_max)
|
||||
to_order_min.append(margin_min)
|
||||
|
||||
to_order.sort()
|
||||
to_order_min.sort()
|
||||
var margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
y_margin_min = to_order_min.pop_front()
|
||||
v_dist = y_decim * pow(10.0,str(margin).length()-2)
|
||||
var multi = 0
|
||||
var p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
|
||||
# draw x_labels
|
||||
if not show_x_values_as_labels:
|
||||
to_order.clear()
|
||||
to_order = x_datas as PoolIntArray
|
||||
|
||||
to_order.sort()
|
||||
margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
x_margin_min = to_order.pop_front()
|
||||
h_dist = x_decim * pow(10.0,str(margin).length()-2)
|
||||
multi = 0
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
|
||||
func build_chart():
|
||||
SIZE = get_size()
|
||||
origin = Vector2(OFFSET.x,SIZE.y-OFFSET.y)
|
||||
SIZE = get_size()
|
||||
origin = Vector2(OFFSET.x,SIZE.y-OFFSET.y)
|
||||
|
||||
func calculate_pass():
|
||||
if invert_chart:
|
||||
x_chors = y_labels as PoolStringArray
|
||||
else:
|
||||
if show_x_values_as_labels:
|
||||
x_chors = x_datas as PoolStringArray
|
||||
else:
|
||||
x_chors = x_labels
|
||||
|
||||
# calculate distance in pixel between 2 consecutive values/datas
|
||||
x_pass = (SIZE.x - OFFSET.x) / (x_chors.size()-1)
|
||||
y_pass = origin.y / (y_chors.size()-1)
|
||||
if invert_chart:
|
||||
x_chors = y_labels as PoolStringArray
|
||||
else:
|
||||
if show_x_values_as_labels:
|
||||
x_chors = x_datas as PoolStringArray
|
||||
else:
|
||||
x_chors = x_labels
|
||||
|
||||
# calculate distance in pixel between 2 consecutive values/datas
|
||||
x_pass = (SIZE.x - OFFSET.x) / (x_chors.size()-1)
|
||||
y_pass = origin.y / (y_chors.size()-1)
|
||||
|
||||
func calculate_coordinates():
|
||||
x_coordinates.clear()
|
||||
y_coordinates.clear()
|
||||
point_values.clear()
|
||||
point_positions.clear()
|
||||
|
||||
if invert_chart:
|
||||
for column in y_datas[0].size():
|
||||
var single_coordinates : Array
|
||||
for row in y_datas:
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((row[column]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((row[column] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
else:
|
||||
for cluster in y_datas:
|
||||
var single_coordinates : Array
|
||||
for value in cluster.size():
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((cluster[value]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((cluster[value] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
|
||||
if show_x_values_as_labels:
|
||||
for x in x_datas.size():
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
for x in x_datas.size():
|
||||
if origin_at_zero:
|
||||
if invert_chart:
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
x_coordinates.append(x_datas[x]*x_pass/h_dist)
|
||||
else:
|
||||
x_coordinates.append((x_datas[x] - x_margin_min)*x_pass/h_dist)
|
||||
|
||||
for f in functions:
|
||||
point_values.append([])
|
||||
point_positions.append([])
|
||||
|
||||
if invert_chart:
|
||||
for function in y_coordinates.size():
|
||||
for function_value in y_coordinates[function].size():
|
||||
if are_values_columns:
|
||||
point_positions[function_value].append(Vector2(x_coordinates[function]+origin.x, origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function_value].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
point_positions[function].append(Vector2(x_coordinates[function_value]+origin.x,origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
for cluster in y_coordinates.size():
|
||||
for y in y_coordinates[cluster].size():
|
||||
if are_values_columns:
|
||||
point_values[y].append([x_datas[cluster],y_datas[cluster][y]])
|
||||
point_positions[y].append(Vector2(x_coordinates[cluster]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
else:
|
||||
point_values[cluster].append([x_datas[y],y_datas[cluster][y]])
|
||||
point_positions[cluster].append(Vector2(x_coordinates[y]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
x_coordinates.clear()
|
||||
y_coordinates.clear()
|
||||
point_values.clear()
|
||||
point_positions.clear()
|
||||
|
||||
if invert_chart:
|
||||
for column in y_datas[0].size():
|
||||
var single_coordinates : Array
|
||||
for row in y_datas:
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((row[column]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((row[column] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
else:
|
||||
for cluster in y_datas:
|
||||
var single_coordinates : Array
|
||||
for value in cluster.size():
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((cluster[value]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((cluster[value] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
|
||||
if show_x_values_as_labels:
|
||||
for x in x_datas.size():
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
for x in x_datas.size():
|
||||
if origin_at_zero:
|
||||
if invert_chart:
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
x_coordinates.append(x_datas[x]*x_pass/h_dist)
|
||||
else:
|
||||
x_coordinates.append((x_datas[x] - x_margin_min)*x_pass/h_dist)
|
||||
|
||||
for f in functions:
|
||||
point_values.append([])
|
||||
point_positions.append([])
|
||||
|
||||
if invert_chart:
|
||||
for function in y_coordinates.size():
|
||||
for function_value in y_coordinates[function].size():
|
||||
if are_values_columns:
|
||||
point_positions[function_value].append(Vector2(x_coordinates[function]+origin.x, origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function_value].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
point_positions[function].append(Vector2(x_coordinates[function_value]+origin.x,origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
for cluster in y_coordinates.size():
|
||||
for y in y_coordinates[cluster].size():
|
||||
if are_values_columns:
|
||||
point_values[y].append([x_datas[cluster],y_datas[cluster][y]])
|
||||
point_positions[y].append(Vector2(x_coordinates[cluster]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
else:
|
||||
point_values[cluster].append([x_datas[y],y_datas[cluster][y]])
|
||||
point_positions[cluster].append(Vector2(x_coordinates[y]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
|
||||
func _draw():
|
||||
clear_points()
|
||||
|
||||
draw_grid()
|
||||
draw_chart_outlines()
|
||||
|
||||
var defined_colors : bool = false
|
||||
if function_colors.size():
|
||||
defined_colors = true
|
||||
|
||||
for _function in point_values.size():
|
||||
var PointContainer : Control = Control.new()
|
||||
Points.add_child(PointContainer)
|
||||
|
||||
for function_point in point_values[_function].size():
|
||||
var point : Point = point_node.instance()
|
||||
point.connect("_point_pressed",self,"point_pressed")
|
||||
point.connect("_mouse_entered",self,"show_data")
|
||||
point.connect("_mouse_exited",self,"hide_data")
|
||||
|
||||
point.create_point(points_shape[_function], function_colors[function_point if invert_chart else _function],
|
||||
Color.white, point_positions[_function][function_point],
|
||||
point.format_value(point_values[_function][function_point], false, false),
|
||||
y_labels[function_point if invert_chart else _function] as String)
|
||||
|
||||
PointContainer.add_child(point)
|
||||
if function_point > 0:
|
||||
draw_line(point_positions[_function][function_point-1], point_positions[_function][function_point],
|
||||
function_colors[function_point if invert_chart else _function], 2, false)
|
||||
clear_points()
|
||||
|
||||
draw_grid()
|
||||
draw_chart_outlines()
|
||||
|
||||
var defined_colors : bool = false
|
||||
if function_colors.size():
|
||||
defined_colors = true
|
||||
|
||||
for _function in point_values.size():
|
||||
var PointContainer : Control = Control.new()
|
||||
Points.add_child(PointContainer)
|
||||
|
||||
for function_point in point_values[_function].size():
|
||||
var point : Point = point_node.instance()
|
||||
point.connect("_point_pressed",self,"point_pressed")
|
||||
point.connect("_mouse_entered",self,"show_data")
|
||||
point.connect("_mouse_exited",self,"hide_data")
|
||||
|
||||
point.create_point(points_shape[_function], function_colors[function_point if invert_chart else _function],
|
||||
Color.white, point_positions[_function][function_point],
|
||||
point.format_value(point_values[_function][function_point], false, false),
|
||||
y_labels[function_point if invert_chart else _function] as String)
|
||||
|
||||
PointContainer.add_child(point)
|
||||
if function_point > 0:
|
||||
draw_line(point_positions[_function][function_point-1], point_positions[_function][function_point],
|
||||
function_colors[function_point if invert_chart else _function], 2, false)
|
||||
|
||||
func draw_grid():
|
||||
# ascisse
|
||||
for p in x_chors.size():
|
||||
var point : Vector2 = origin+Vector2((p)*x_pass,0)
|
||||
# v grid
|
||||
draw_line(point,point-Vector2(0,SIZE.y-OFFSET.y),v_lines_color,0.2,true)
|
||||
# ascisse
|
||||
draw_line(point-Vector2(0,5),point,v_lines_color,1,true)
|
||||
draw_string(font,point+Vector2(-const_width/2*x_chors[p].length(),font_size+const_height),x_chors[p],font_color)
|
||||
|
||||
# ordinate
|
||||
for p in y_chors.size():
|
||||
var point : Vector2 = origin-Vector2(0,(p)*y_pass)
|
||||
# h grid
|
||||
draw_line(point,point+Vector2(SIZE.x-OFFSET.x,0),h_lines_color,0.2,true)
|
||||
# ordinate
|
||||
draw_line(point,point+Vector2(5,0),h_lines_color,1,true)
|
||||
draw_string(font,point-Vector2(y_chors[p].length()*const_width+font_size,-const_height),y_chors[p],font_color)
|
||||
# ascisse
|
||||
for p in x_chors.size():
|
||||
var point : Vector2 = origin+Vector2((p)*x_pass,0)
|
||||
# v grid
|
||||
draw_line(point,point-Vector2(0,SIZE.y-OFFSET.y),v_lines_color,0.2,true)
|
||||
# ascisse
|
||||
draw_line(point-Vector2(0,5),point,v_lines_color,1,true)
|
||||
draw_string(font,point+Vector2(-const_width/2*x_chors[p].length(),font_size+const_height),x_chors[p],font_color)
|
||||
|
||||
# ordinate
|
||||
for p in y_chors.size():
|
||||
var point : Vector2 = origin-Vector2(0,(p)*y_pass)
|
||||
# h grid
|
||||
draw_line(point,point+Vector2(SIZE.x-OFFSET.x,0),h_lines_color,0.2,true)
|
||||
# ordinate
|
||||
draw_line(point,point+Vector2(5,0),h_lines_color,1,true)
|
||||
draw_string(font,point-Vector2(y_chors[p].length()*const_width+font_size,-const_height),y_chors[p],font_color)
|
||||
|
||||
func draw_chart_outlines():
|
||||
draw_line(origin,SIZE-Vector2(0,OFFSET.y),box_color,1,true)
|
||||
draw_line(origin,Vector2(OFFSET.x,0),box_color,1,true)
|
||||
draw_line(Vector2(OFFSET.x,0),Vector2(SIZE.x,0),box_color,1,true)
|
||||
draw_line(Vector2(SIZE.x,0),SIZE-Vector2(0,OFFSET.y),box_color,1,true)
|
||||
draw_line(origin,SIZE-Vector2(0,OFFSET.y),box_color,1,true)
|
||||
draw_line(origin,Vector2(OFFSET.x,0),box_color,1,true)
|
||||
draw_line(Vector2(OFFSET.x,0),Vector2(SIZE.x,0),box_color,1,true)
|
||||
draw_line(Vector2(SIZE.x,0),SIZE-Vector2(0,OFFSET.y),box_color,1,true)
|
||||
|
@ -24,7 +24,21 @@ A line chart is often used to visualize a trend in data over intervals of time
|
||||
a time series – thus the line is often drawn chronologically.
|
||||
In these cases they are known as run charts."
|
||||
}
|
||||
function_colors = [ "#1e1e1e", "#1e1e1e", "#1e1e1e", "#1e1e1e" ]
|
||||
Chart_Properties/are_values_columns = false
|
||||
Chart_Properties/labels_index = 0
|
||||
Chart_Properties/show_x_values_as_labels = true
|
||||
Chart_Display/x_decim = 5.0
|
||||
Chart_Display/y_decim = 5.0
|
||||
Chart_Style/points_shape = [ 0 ]
|
||||
Chart_Style/function_colors = [ "#1e1e1e", "#1e1e1e", "#1e1e1e", "#1e1e1e" ]
|
||||
Chart_Style/box_color = Color( 0.117647, 0.117647, 0.117647, 1 )
|
||||
Chart_Style/v_lines_color = Color( 0.792157, 0.792157, 0.792157, 1 )
|
||||
Chart_Style/h_lines_color = Color( 0.792157, 0.792157, 0.792157, 1 )
|
||||
Chart_Style/font = null
|
||||
Chart_Style/bold_font = null
|
||||
Chart_Style/font_color = Color( 0.117647, 0.117647, 0.117647, 1 )
|
||||
Chart_Style/template = 0
|
||||
Chart_Modifiers/invert_chart = false
|
||||
|
||||
[node name="Background" type="ColorRect" parent="."]
|
||||
visible = false
|
||||
@ -52,10 +66,23 @@ __meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="ChartName" type="Label" parent="."]
|
||||
anchor_right = 1.0
|
||||
margin_bottom = 14.0
|
||||
align = 1
|
||||
valign = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="PointData" parent="." instance=ExtResource( 1 )]
|
||||
|
||||
[node name="PointData" parent="PointData" index="0"]
|
||||
visible = false
|
||||
margin_left = 431.058
|
||||
margin_top = 13.8323
|
||||
margin_right = 430.922
|
||||
margin_bottom = 14.6323
|
||||
theme = SubResource( 1 )
|
||||
|
||||
[editable path="PointData"]
|
||||
|
@ -14,254 +14,254 @@ distinct correlations, trade-offs, and a multitude of other comparative measures
|
||||
"""
|
||||
|
||||
func _get_property_list():
|
||||
return [
|
||||
# Chart Properties
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/are_values_columns",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "-1,100,1",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/labels_index",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "-1,100,1",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/function_names_index",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/use_height_as_radius",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0,2000",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/radius",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
|
||||
# Chart Display
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,100",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/full_scale",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
|
||||
# Chart Style
|
||||
{
|
||||
"hint": 24,
|
||||
"hint_string": "%d/%d:%s"%[TYPE_INT, PROPERTY_HINT_ENUM,
|
||||
PoolStringArray(PointShapes.keys()).join(",")],
|
||||
"name": "Chart_Style/points_shape",
|
||||
"type": TYPE_ARRAY,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/function_colors",
|
||||
"type": TYPE_COLOR_ARRAY
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/outline_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/grid_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/bold_font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_ENUM,
|
||||
"hint_string": PoolStringArray(TemplatesNames.keys()).join(","),
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/template",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0,360",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Modifiers/rotation",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
]
|
||||
return [
|
||||
# Chart Properties
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/are_values_columns",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "-1,100,1",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/labels_index",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "-1,100,1",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/function_names_index",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/use_height_as_radius",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0,2000",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/radius",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
|
||||
# Chart Display
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,100",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/full_scale",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
|
||||
# Chart Style
|
||||
{
|
||||
"hint": 24,
|
||||
"hint_string": "%d/%d:%s"%[TYPE_INT, PROPERTY_HINT_ENUM,
|
||||
PoolStringArray(PointShapes.keys()).join(",")],
|
||||
"name": "Chart_Style/points_shape",
|
||||
"type": TYPE_ARRAY,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/function_colors",
|
||||
"type": TYPE_COLOR_ARRAY
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/outline_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/grid_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/bold_font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_ENUM,
|
||||
"hint_string": PoolStringArray(TemplatesNames.keys()).join(","),
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/template",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0,360",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Modifiers/rotation",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
]
|
||||
|
||||
func structure_datas(database : Array, are_values_columns : bool, labels_index : int):
|
||||
# @x_values_index can be either a column or a row relative to x values
|
||||
# @y_values can be either a column or a row relative to y values
|
||||
self.labels_index = labels_index
|
||||
self.are_values_columns = are_values_columns
|
||||
match are_values_columns:
|
||||
true:
|
||||
for row in database.size():
|
||||
if row == labels_index:
|
||||
x_labels = database[row] as PoolStringArray
|
||||
else:
|
||||
if database[row].empty() or database[row].size() < 2:
|
||||
continue
|
||||
x_datas.append(PoolRealArray(database[row] as Array))
|
||||
|
||||
for column in database[row].size():
|
||||
if column == function_names_index:
|
||||
y_labels.append(database[row][column])
|
||||
false:
|
||||
for row in database.size():
|
||||
if row == function_names_index:
|
||||
y_labels = database[row] as PoolStringArray
|
||||
|
||||
var x_temp_datas : PoolRealArray = []
|
||||
for column in database[row].size():
|
||||
if column == labels_index:
|
||||
x_labels.append(database[row][column] as String)
|
||||
else:
|
||||
x_temp_datas.append(database[row][column] as float)
|
||||
x_datas.append(x_temp_datas)
|
||||
|
||||
if labels_index == -1 :
|
||||
for data in x_datas[0].size():
|
||||
x_labels.append("Element %s" % data)
|
||||
|
||||
if function_names_index == -1 :
|
||||
for data in x_datas.size():
|
||||
y_labels.append("Function %s" % data)
|
||||
# @x_values_index can be either a column or a row relative to x values
|
||||
# @y_values can be either a column or a row relative to y values
|
||||
self.labels_index = labels_index
|
||||
self.are_values_columns = are_values_columns
|
||||
match are_values_columns:
|
||||
true:
|
||||
for row in database.size():
|
||||
if row == labels_index:
|
||||
x_labels = database[row] as PoolStringArray
|
||||
else:
|
||||
if database[row].empty() or database[row].size() < 2:
|
||||
continue
|
||||
x_datas.append(PoolRealArray(database[row] as Array))
|
||||
|
||||
for column in database[row].size():
|
||||
if column == function_names_index:
|
||||
y_labels.append(database[row][column])
|
||||
false:
|
||||
for row in database.size():
|
||||
if row == function_names_index:
|
||||
y_labels = database[row] as PoolStringArray
|
||||
|
||||
var x_temp_datas : PoolRealArray = []
|
||||
for column in database[row].size():
|
||||
if column == labels_index:
|
||||
x_labels.append(database[row][column] as String)
|
||||
else:
|
||||
x_temp_datas.append(database[row][column] as float)
|
||||
x_datas.append(x_temp_datas)
|
||||
|
||||
if labels_index == -1 :
|
||||
for data in x_datas[0].size():
|
||||
x_labels.append("Element %s" % data)
|
||||
|
||||
if function_names_index == -1 :
|
||||
for data in x_datas.size():
|
||||
y_labels.append("Function %s" % data)
|
||||
|
||||
func build_chart():
|
||||
SIZE = get_size()
|
||||
origin = OFFSET + SIZE/2
|
||||
SIZE = get_size()
|
||||
origin = OFFSET + SIZE/2
|
||||
|
||||
var radar_polygon : Array
|
||||
|
||||
func calculate_pass() :
|
||||
var ordered_max : Array
|
||||
for data in x_datas :
|
||||
var ordered_data : Array = (data as Array)
|
||||
ordered_data.sort()
|
||||
ordered_max.append(ordered_data.pop_back())
|
||||
ordered_max.sort()
|
||||
var max_value : float = ordered_max.pop_back()
|
||||
var dist = full_scale * pow(10.0,str(max_value).length()-2)
|
||||
var multi = 0
|
||||
var value = dist * multi
|
||||
x_chors.append(value as String)
|
||||
while value < max_value:
|
||||
multi+=1
|
||||
value = dist * multi
|
||||
x_chors.append(value as String)
|
||||
var ordered_max : Array
|
||||
for data in x_datas :
|
||||
var ordered_data : Array = (data as Array)
|
||||
ordered_data.sort()
|
||||
ordered_max.append(ordered_data.pop_back())
|
||||
ordered_max.sort()
|
||||
var max_value : float = ordered_max.pop_back()
|
||||
var dist = full_scale * pow(10.0,str(max_value).length()-2)
|
||||
var multi = 0
|
||||
var value = dist * multi
|
||||
x_chors.append(value as String)
|
||||
while value < max_value:
|
||||
multi+=1
|
||||
value = dist * multi
|
||||
x_chors.append(value as String)
|
||||
|
||||
func calculate_coordinates():
|
||||
for chor in x_chors.size():
|
||||
var inner_polyline : PoolVector2Array
|
||||
var scalar_factor : float = (x_chors[chor] as float/x_chors.back() as float)
|
||||
for function in functions:
|
||||
var angle : float = ((2 * PI * function) / functions) - PI /2 + deg2rad(rotation)
|
||||
var x_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * cos(angle) + origin.x
|
||||
var y_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * sin(angle) + origin.y
|
||||
inner_polyline.append(Vector2(x_coordinate, y_coordinate))
|
||||
inner_polyline.append(inner_polyline[0])
|
||||
radar_polygon.append(inner_polyline)
|
||||
|
||||
for datas in x_datas:
|
||||
var function_positions : PoolVector2Array
|
||||
var function_values : Array
|
||||
for data in datas.size():
|
||||
var scalar_factor : float = datas[data] /( x_chors.back() as float)
|
||||
var angle : float = ((2 * PI * data) / datas.size()) - PI/2 + deg2rad(rotation)
|
||||
var x_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * cos(angle) + origin.x
|
||||
var y_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * sin(angle) + origin.y
|
||||
function_positions.append(Vector2(x_coordinate,y_coordinate))
|
||||
function_values.append([x_labels[data], datas[data]])
|
||||
function_positions.append(function_positions[0])
|
||||
point_positions.append(function_positions)
|
||||
point_values.append(function_values)
|
||||
for chor in x_chors.size():
|
||||
var inner_polyline : PoolVector2Array
|
||||
var scalar_factor : float = (x_chors[chor] as float/x_chors.back() as float)
|
||||
for function in functions:
|
||||
var angle : float = ((2 * PI * function) / functions) - PI /2 + deg2rad(rotation)
|
||||
var x_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * cos(angle) + origin.x
|
||||
var y_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * sin(angle) + origin.y
|
||||
inner_polyline.append(Vector2(x_coordinate, y_coordinate))
|
||||
inner_polyline.append(inner_polyline[0])
|
||||
radar_polygon.append(inner_polyline)
|
||||
|
||||
for datas in x_datas:
|
||||
var function_positions : PoolVector2Array
|
||||
var function_values : Array
|
||||
for data in datas.size():
|
||||
var scalar_factor : float = datas[data] /( x_chors.back() as float)
|
||||
var angle : float = ((2 * PI * data) / datas.size()) - PI/2 + deg2rad(rotation)
|
||||
var x_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * cos(angle) + origin.x
|
||||
var y_coordinate : float = (radius if (not use_height_as_radius and radius<SIZE.y/2) else SIZE.y/2) * scalar_factor * sin(angle) + origin.y
|
||||
function_positions.append(Vector2(x_coordinate,y_coordinate))
|
||||
function_values.append([x_labels[data], datas[data]])
|
||||
function_positions.append(function_positions[0])
|
||||
point_positions.append(function_positions)
|
||||
point_values.append(function_values)
|
||||
|
||||
func _draw():
|
||||
if Engine.editor_hint:
|
||||
return
|
||||
|
||||
clear_points()
|
||||
draw_grid()
|
||||
|
||||
for function in point_positions.size():
|
||||
var function_color : Color = function_colors[function]
|
||||
draw_polygon(point_positions[function], [Color(function_color.r, function_color.g, function_color.b, 0.2)],[],null,null,true)
|
||||
draw_polyline(point_positions[function], function_color, 2,true)
|
||||
|
||||
for _function in point_values.size():
|
||||
var PointContainer : Control = Control.new()
|
||||
Points.add_child(PointContainer)
|
||||
|
||||
for function_point in point_values[_function].size():
|
||||
var point : Point = point_node.instance()
|
||||
point.connect("_point_pressed",self,"point_pressed")
|
||||
point.connect("_mouse_entered",self,"show_data")
|
||||
point.connect("_mouse_exited",self,"hide_data")
|
||||
|
||||
point.create_point(points_shape[_function], function_colors[_function],
|
||||
Color.white, point_positions[_function][function_point],
|
||||
point.format_value(point_values[_function][function_point], false, false),
|
||||
y_labels[_function])
|
||||
if Engine.editor_hint:
|
||||
return
|
||||
|
||||
clear_points()
|
||||
draw_grid()
|
||||
|
||||
for function in point_positions.size():
|
||||
var function_color : Color = function_colors[function]
|
||||
draw_polygon(point_positions[function], [Color(function_color.r, function_color.g, function_color.b, 0.2)],[],null,null,true)
|
||||
draw_polyline(point_positions[function], function_color, 2,true)
|
||||
|
||||
for _function in point_values.size():
|
||||
var PointContainer : Control = Control.new()
|
||||
Points.add_child(PointContainer)
|
||||
|
||||
for function_point in point_values[_function].size():
|
||||
var point : Point = point_node.instance()
|
||||
point.connect("_point_pressed",self,"point_pressed")
|
||||
point.connect("_mouse_entered",self,"show_data")
|
||||
point.connect("_mouse_exited",self,"hide_data")
|
||||
|
||||
point.create_point(points_shape[_function], function_colors[_function],
|
||||
Color.white, point_positions[_function][function_point],
|
||||
point.format_value(point_values[_function][function_point], false, false),
|
||||
y_labels[_function])
|
||||
# str("Function %s"%_function))
|
||||
|
||||
PointContainer.add_child(point)
|
||||
|
||||
PointContainer.add_child(point)
|
||||
|
||||
func draw_grid():
|
||||
for polyline in radar_polygon:
|
||||
draw_polyline(polyline, grid_color, 1, true)
|
||||
var text : String = x_chors[radar_polygon.find(polyline)] as String
|
||||
draw_string(font, polyline[0] - Vector2(font.get_string_size(text).x/2,-5), text, font_color)
|
||||
|
||||
if not radar_polygon.empty():
|
||||
draw_polyline(radar_polygon[radar_polygon.size()-1], outline_color, 1, true)
|
||||
|
||||
for label in x_labels.size():
|
||||
var point_array : PoolVector2Array = radar_polygon[radar_polygon.size()-1]
|
||||
draw_line(origin, point_array[label], grid_color, 1, true)
|
||||
|
||||
if point_array[label].x != origin.x:
|
||||
draw_string(font, point_array[label] - (Vector2(font.get_string_size(x_labels[label]).x+10,(5 if point_array[label].y <= origin.y else -10)) if point_array[label].x <= origin.x else - Vector2(10,(-5 if point_array[label].y <= origin.y else 10))), x_labels[label], font_color)
|
||||
else:
|
||||
draw_string(font, point_array[label] - (Vector2(font.get_string_size(x_labels[label]).x/2, 10) if point_array[label].y < origin.x else - Vector2(font.get_string_size(x_labels[label]).x/2, 5)), x_labels[label], font_color)
|
||||
for polyline in radar_polygon:
|
||||
draw_polyline(polyline, grid_color, 1, true)
|
||||
var text : String = x_chors[radar_polygon.find(polyline)] as String
|
||||
draw_string(font, polyline[0] - Vector2(font.get_string_size(text).x/2,-5), text, font_color)
|
||||
|
||||
if not radar_polygon.empty():
|
||||
draw_polyline(radar_polygon[radar_polygon.size()-1], outline_color, 1, true)
|
||||
|
||||
for label in x_labels.size():
|
||||
var point_array : PoolVector2Array = radar_polygon[radar_polygon.size()-1]
|
||||
draw_line(origin, point_array[label], grid_color, 1, true)
|
||||
|
||||
if point_array[label].x != origin.x:
|
||||
draw_string(font, point_array[label] - (Vector2(font.get_string_size(x_labels[label]).x+10,(5 if point_array[label].y <= origin.y else -10)) if point_array[label].x <= origin.x else - Vector2(10,(-5 if point_array[label].y <= origin.y else 10))), x_labels[label], font_color)
|
||||
else:
|
||||
draw_string(font, point_array[label] - (Vector2(font.get_string_size(x_labels[label]).x/2, 10) if point_array[label].y < origin.x else - Vector2(font.get_string_size(x_labels[label]).x/2, 5)), x_labels[label], font_color)
|
||||
|
||||
func create_legend():
|
||||
pass
|
||||
pass
|
||||
# legend.clear()
|
||||
# for function in functions:
|
||||
# var function_legend = FunctionLegend.instance()
|
||||
@ -275,5 +275,5 @@ func create_legend():
|
||||
# legend.append(function_legend)
|
||||
|
||||
func count_functions():
|
||||
if x_labels.size():
|
||||
functions = x_labels.size()
|
||||
if x_labels.size():
|
||||
functions = x_labels.size()
|
||||
|
@ -21,8 +21,22 @@ uninformative, but various heuristics, such as algorithms that plot data as the
|
||||
total area, can be applied to sort the variables (axes) into relative positions that reveal
|
||||
distinct correlations, trade-offs, and a multitude of other comparative measures."
|
||||
}
|
||||
function_colors = PoolColorArray( 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1 )
|
||||
grid_color = Color( 0.792157, 0.792157, 0.792157, 1 )
|
||||
delimiter = ";"
|
||||
Chart_Properties/are_values_columns = false
|
||||
Chart_Properties/labels_index = 0
|
||||
Chart_Properties/function_names_index = 0
|
||||
Chart_Properties/use_height_as_radius = false
|
||||
Chart_Properties/radius = 150.0
|
||||
Chart_Display/full_scale = 1.0
|
||||
Chart_Style/points_shape = [ 0 ]
|
||||
Chart_Style/function_colors = PoolColorArray( 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1, 0.117647, 0.117647, 0.117647, 1 )
|
||||
Chart_Style/outline_color = Color( 0.117647, 0.117647, 0.117647, 1 )
|
||||
Chart_Style/grid_color = Color( 0.792157, 0.792157, 0.792157, 1 )
|
||||
Chart_Style/font = null
|
||||
Chart_Style/bold_font = null
|
||||
Chart_Style/font_color = Color( 0.117647, 0.117647, 0.117647, 1 )
|
||||
Chart_Style/template = 0
|
||||
Chart_Modifiers/rotation = 0.0
|
||||
|
||||
[node name="Background" type="ColorRect" parent="."]
|
||||
visible = false
|
||||
@ -50,10 +64,24 @@ __meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="ChartName" type="Label" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 0.053
|
||||
margin_bottom = 0.199999
|
||||
align = 1
|
||||
valign = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": true
|
||||
}
|
||||
|
||||
[node name="PointData" parent="." instance=ExtResource( 1 )]
|
||||
|
||||
[node name="PointData" parent="PointData" index="0"]
|
||||
visible = false
|
||||
margin_left = -230.138
|
||||
margin_top = -125.6
|
||||
margin_right = -230.275
|
||||
margin_bottom = -124.801
|
||||
theme = SubResource( 1 )
|
||||
|
||||
[editable path="PointData"]
|
||||
|
@ -16,327 +16,327 @@ the horizontal axis and the value of the other variable determining the position
|
||||
# ---------------------
|
||||
|
||||
func _get_property_list():
|
||||
return [
|
||||
# Chart Properties
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/are_values_columns",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "-1,100,1",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/labels_index",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/show_x_values_as_labels",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
|
||||
# Chart Display
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,10",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/x_decim",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,10",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/y_decim",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
|
||||
# Chart Style
|
||||
{
|
||||
"hint": 24,
|
||||
"hint_string": "%d/%d:%s"%[TYPE_INT, PROPERTY_HINT_ENUM,
|
||||
PoolStringArray(PointShapes.keys()).join(",")],
|
||||
"name": "Chart_Style/points_shape",
|
||||
"type": TYPE_ARRAY,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/function_colors",
|
||||
"type": TYPE_COLOR_ARRAY
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/box_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/v_lines_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/h_lines_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/bold_font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_ENUM,
|
||||
"hint_string": PoolStringArray(TemplatesNames.keys()).join(","),
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/template",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
|
||||
# Chart Modifiers
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Modifiers/invert_chart",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
]
|
||||
return [
|
||||
# Chart Properties
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/are_values_columns",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "-1,100,1",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/labels_index",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Properties/show_x_values_as_labels",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
|
||||
# Chart Display
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,10",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/x_decim",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_RANGE,
|
||||
"hint_string": "0.1,10",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Display/y_decim",
|
||||
"type": TYPE_REAL
|
||||
},
|
||||
|
||||
# Chart Style
|
||||
{
|
||||
"hint": 24,
|
||||
"hint_string": "%d/%d:%s"%[TYPE_INT, PROPERTY_HINT_ENUM,
|
||||
PoolStringArray(PointShapes.keys()).join(",")],
|
||||
"name": "Chart_Style/points_shape",
|
||||
"type": TYPE_ARRAY,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/function_colors",
|
||||
"type": TYPE_COLOR_ARRAY
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/box_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/v_lines_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/h_lines_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"class_name": "Font",
|
||||
"hint": PROPERTY_HINT_RESOURCE_TYPE,
|
||||
"hint_string": "Font",
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/bold_font",
|
||||
"type": TYPE_OBJECT
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/font_color",
|
||||
"type": TYPE_COLOR
|
||||
},
|
||||
{
|
||||
"hint": PROPERTY_HINT_ENUM,
|
||||
"hint_string": PoolStringArray(TemplatesNames.keys()).join(","),
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Style/template",
|
||||
"type": TYPE_INT
|
||||
},
|
||||
|
||||
# Chart Modifiers
|
||||
{
|
||||
"hint": PROPERTY_HINT_NONE,
|
||||
"usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE,
|
||||
"name": "Chart_Modifiers/invert_chart",
|
||||
"type": TYPE_BOOL
|
||||
},
|
||||
]
|
||||
|
||||
func structure_datas(database : Array, are_values_columns : bool, x_values_index : int):
|
||||
# @x_values_index can be either a column or a row relative to x values
|
||||
# @y_values can be either a column or a row relative to y values
|
||||
self.are_values_columns = are_values_columns
|
||||
match are_values_columns:
|
||||
true:
|
||||
for row in database.size():
|
||||
var t_vals : Array
|
||||
for column in database[row].size():
|
||||
if column == x_values_index:
|
||||
var x_data = database[row][column]
|
||||
if x_data.is_valid_float() or x_data.is_valid_integer():
|
||||
x_datas.append(x_data as float)
|
||||
else:
|
||||
x_datas.append(x_data.replace(",",".") as float)
|
||||
else:
|
||||
if row != 0:
|
||||
var y_data = database[row][column]
|
||||
if y_data.is_valid_float() or y_data.is_valid_integer():
|
||||
t_vals.append(y_data as float)
|
||||
else:
|
||||
t_vals.append(y_data.replace(",",".") as float)
|
||||
else:
|
||||
y_labels.append(str(database[row][column]))
|
||||
if not t_vals.empty():
|
||||
y_datas.append(t_vals)
|
||||
x_label = str(x_datas.pop_front())
|
||||
false:
|
||||
for row in database.size():
|
||||
if row == x_values_index:
|
||||
x_datas = (database[row])
|
||||
x_label = x_datas.pop_front() as String
|
||||
else:
|
||||
var values = database[row] as Array
|
||||
y_labels.append(values.pop_front() as String)
|
||||
y_datas.append(values)
|
||||
for data in y_datas:
|
||||
for value in data.size():
|
||||
data[value] = data[value] as float
|
||||
|
||||
# draw y labels
|
||||
var to_order : Array
|
||||
var to_order_min : Array
|
||||
for cluster in y_datas.size():
|
||||
# define x_chors and y_chors
|
||||
var ordered_cluster = y_datas[cluster] as Array
|
||||
ordered_cluster.sort()
|
||||
ordered_cluster = PoolIntArray(ordered_cluster)
|
||||
var margin_max = ordered_cluster[ordered_cluster.size()-1]
|
||||
var margin_min = ordered_cluster[0]
|
||||
to_order.append(margin_max)
|
||||
to_order_min.append(margin_min)
|
||||
|
||||
to_order.sort()
|
||||
to_order_min.sort()
|
||||
var margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
y_margin_min = to_order_min.pop_front()
|
||||
v_dist = y_decim * pow(10.0,str(margin).length()-2)
|
||||
var multi = 0
|
||||
var p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
|
||||
# draw x_labels
|
||||
if not show_x_values_as_labels:
|
||||
to_order.clear()
|
||||
to_order = x_datas as PoolIntArray
|
||||
|
||||
to_order.sort()
|
||||
margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
x_margin_min = to_order.pop_front()
|
||||
h_dist = x_decim * pow(10.0,str(margin).length()-2)
|
||||
multi = 0
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
# @x_values_index can be either a column or a row relative to x values
|
||||
# @y_values can be either a column or a row relative to y values
|
||||
self.are_values_columns = are_values_columns
|
||||
match are_values_columns:
|
||||
true:
|
||||
for row in database.size():
|
||||
var t_vals : Array
|
||||
for column in database[row].size():
|
||||
if column == x_values_index:
|
||||
var x_data = database[row][column]
|
||||
if x_data.is_valid_float() or x_data.is_valid_integer():
|
||||
x_datas.append(x_data as float)
|
||||
else:
|
||||
x_datas.append(x_data.replace(",",".") as float)
|
||||
else:
|
||||
if row != 0:
|
||||
var y_data = database[row][column]
|
||||
if y_data.is_valid_float() or y_data.is_valid_integer():
|
||||
t_vals.append(y_data as float)
|
||||
else:
|
||||
t_vals.append(y_data.replace(",",".") as float)
|
||||
else:
|
||||
y_labels.append(str(database[row][column]))
|
||||
if not t_vals.empty():
|
||||
y_datas.append(t_vals)
|
||||
x_label = str(x_datas.pop_front())
|
||||
false:
|
||||
for row in database.size():
|
||||
if row == x_values_index:
|
||||
x_datas = (database[row])
|
||||
x_label = x_datas.pop_front() as String
|
||||
else:
|
||||
var values = database[row] as Array
|
||||
y_labels.append(values.pop_front() as String)
|
||||
y_datas.append(values)
|
||||
for data in y_datas:
|
||||
for value in data.size():
|
||||
data[value] = data[value] as float
|
||||
|
||||
# draw y labels
|
||||
var to_order : Array
|
||||
var to_order_min : Array
|
||||
for cluster in y_datas.size():
|
||||
# define x_chors and y_chors
|
||||
var ordered_cluster = y_datas[cluster] as Array
|
||||
ordered_cluster.sort()
|
||||
ordered_cluster = PoolIntArray(ordered_cluster)
|
||||
var margin_max = ordered_cluster[ordered_cluster.size()-1]
|
||||
var margin_min = ordered_cluster[0]
|
||||
to_order.append(margin_max)
|
||||
to_order_min.append(margin_min)
|
||||
|
||||
to_order.sort()
|
||||
to_order_min.sort()
|
||||
var margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
y_margin_min = to_order_min.pop_front()
|
||||
v_dist = y_decim * pow(10.0,str(margin).length()-2)
|
||||
var multi = 0
|
||||
var p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
|
||||
# draw x_labels
|
||||
if not show_x_values_as_labels:
|
||||
to_order.clear()
|
||||
to_order = x_datas as PoolIntArray
|
||||
|
||||
to_order.sort()
|
||||
margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
x_margin_min = to_order.pop_front()
|
||||
h_dist = x_decim * pow(10.0,str(margin).length()-2)
|
||||
multi = 0
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
|
||||
func build_chart():
|
||||
SIZE = get_size()
|
||||
origin = Vector2(OFFSET.x,SIZE.y-OFFSET.y)
|
||||
SIZE = get_size()
|
||||
origin = Vector2(OFFSET.x,SIZE.y-OFFSET.y)
|
||||
|
||||
func calculate_pass():
|
||||
if invert_chart:
|
||||
x_chors = y_labels as PoolStringArray
|
||||
else:
|
||||
if show_x_values_as_labels:
|
||||
x_chors = x_datas as PoolStringArray
|
||||
else:
|
||||
x_chors = x_labels
|
||||
|
||||
# calculate distance in pixel between 2 consecutive values/datas
|
||||
x_pass = (SIZE.x - OFFSET.x) / (x_chors.size()-1)
|
||||
y_pass = origin.y / (y_chors.size()-1)
|
||||
if invert_chart:
|
||||
x_chors = y_labels as PoolStringArray
|
||||
else:
|
||||
if show_x_values_as_labels:
|
||||
x_chors = x_datas as PoolStringArray
|
||||
else:
|
||||
x_chors = x_labels
|
||||
|
||||
# calculate distance in pixel between 2 consecutive values/datas
|
||||
x_pass = (SIZE.x - OFFSET.x) / (x_chors.size()-1)
|
||||
y_pass = origin.y / (y_chors.size()-1)
|
||||
|
||||
func calculate_coordinates():
|
||||
x_coordinates.clear()
|
||||
y_coordinates.clear()
|
||||
point_values.clear()
|
||||
point_positions.clear()
|
||||
|
||||
if invert_chart:
|
||||
for column in y_datas[0].size():
|
||||
var single_coordinates : Array
|
||||
for row in y_datas:
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((row[column]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((row[column] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
else:
|
||||
for cluster in y_datas:
|
||||
var single_coordinates : Array
|
||||
for value in cluster.size():
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((cluster[value]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((cluster[value] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
|
||||
if show_x_values_as_labels:
|
||||
for x in x_datas.size():
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
for x in x_datas.size():
|
||||
if origin_at_zero:
|
||||
if invert_chart:
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
x_coordinates.append(x_datas[x]*x_pass/h_dist)
|
||||
else:
|
||||
x_coordinates.append((x_datas[x] - x_margin_min)*x_pass/h_dist)
|
||||
|
||||
for f in functions:
|
||||
point_values.append([])
|
||||
point_positions.append([])
|
||||
|
||||
if invert_chart:
|
||||
for function in y_coordinates.size():
|
||||
for function_value in y_coordinates[function].size():
|
||||
if are_values_columns:
|
||||
point_positions[function_value].append(Vector2(x_coordinates[function]+origin.x, origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function_value].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
point_positions[function].append(Vector2(x_coordinates[function_value]+origin.x,origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
for cluster in y_coordinates.size():
|
||||
for y in y_coordinates[cluster].size():
|
||||
if are_values_columns:
|
||||
point_values[y].append([x_datas[cluster],y_datas[cluster][y]])
|
||||
point_positions[y].append(Vector2(x_coordinates[cluster]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
else:
|
||||
point_values[cluster].append([x_datas[y],y_datas[cluster][y]])
|
||||
point_positions[cluster].append(Vector2(x_coordinates[y]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
x_coordinates.clear()
|
||||
y_coordinates.clear()
|
||||
point_values.clear()
|
||||
point_positions.clear()
|
||||
|
||||
if invert_chart:
|
||||
for column in y_datas[0].size():
|
||||
var single_coordinates : Array
|
||||
for row in y_datas:
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((row[column]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((row[column] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
else:
|
||||
for cluster in y_datas:
|
||||
var single_coordinates : Array
|
||||
for value in cluster.size():
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((cluster[value]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((cluster[value] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
|
||||
if show_x_values_as_labels:
|
||||
for x in x_datas.size():
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
for x in x_datas.size():
|
||||
if origin_at_zero:
|
||||
if invert_chart:
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
x_coordinates.append(x_datas[x]*x_pass/h_dist)
|
||||
else:
|
||||
x_coordinates.append((x_datas[x] - x_margin_min)*x_pass/h_dist)
|
||||
|
||||
for f in functions:
|
||||
point_values.append([])
|
||||
point_positions.append([])
|
||||
|
||||
if invert_chart:
|
||||
for function in y_coordinates.size():
|
||||
for function_value in y_coordinates[function].size():
|
||||
if are_values_columns:
|
||||
point_positions[function_value].append(Vector2(x_coordinates[function]+origin.x, origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function_value].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
point_positions[function].append(Vector2(x_coordinates[function_value]+origin.x,origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
for cluster in y_coordinates.size():
|
||||
for y in y_coordinates[cluster].size():
|
||||
if are_values_columns:
|
||||
point_values[y].append([x_datas[cluster],y_datas[cluster][y]])
|
||||
point_positions[y].append(Vector2(x_coordinates[cluster]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
else:
|
||||
point_values[cluster].append([x_datas[y],y_datas[cluster][y]])
|
||||
point_positions[cluster].append(Vector2(x_coordinates[y]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
|
||||
func _draw():
|
||||
clear_points()
|
||||
|
||||
draw_grid()
|
||||
draw_chart_outlines()
|
||||
|
||||
var defined_colors : bool = false
|
||||
if function_colors.size():
|
||||
defined_colors = true
|
||||
|
||||
for _function in point_values.size():
|
||||
var PointContainer : Control = Control.new()
|
||||
Points.add_child(PointContainer)
|
||||
|
||||
for function_point in point_values[_function].size():
|
||||
var point : Point = point_node.instance()
|
||||
point.connect("_point_pressed",self,"point_pressed")
|
||||
point.connect("_mouse_entered",self,"show_data")
|
||||
point.connect("_mouse_exited",self,"hide_data")
|
||||
|
||||
point.create_point(points_shape[_function], function_colors[function_point if invert_chart else _function],
|
||||
Color.white, point_positions[_function][function_point],
|
||||
point.format_value(point_values[_function][function_point], false, false),
|
||||
y_labels[function_point if invert_chart else _function] as String)
|
||||
|
||||
PointContainer.add_child(point)
|
||||
clear_points()
|
||||
|
||||
draw_grid()
|
||||
draw_chart_outlines()
|
||||
|
||||
var defined_colors : bool = false
|
||||
if function_colors.size():
|
||||
defined_colors = true
|
||||
|
||||
for _function in point_values.size():
|
||||
var PointContainer : Control = Control.new()
|
||||
Points.add_child(PointContainer)
|
||||
|
||||
for function_point in point_values[_function].size():
|
||||
var point : Point = point_node.instance()
|
||||
point.connect("_point_pressed",self,"point_pressed")
|
||||
point.connect("_mouse_entered",self,"show_data")
|
||||
point.connect("_mouse_exited",self,"hide_data")
|
||||
|
||||
point.create_point(points_shape[_function], function_colors[function_point if invert_chart else _function],
|
||||
Color.white, point_positions[_function][function_point],
|
||||
point.format_value(point_values[_function][function_point], false, false),
|
||||
y_labels[function_point if invert_chart else _function] as String)
|
||||
|
||||
PointContainer.add_child(point)
|
||||
|
||||
func draw_grid():
|
||||
# ascisse
|
||||
for p in x_chors.size():
|
||||
var point : Vector2 = origin+Vector2((p)*x_pass,0)
|
||||
# v grid
|
||||
draw_line(point,point-Vector2(0,SIZE.y-OFFSET.y),v_lines_color,0.2,true)
|
||||
# ascisse
|
||||
draw_line(point-Vector2(0,5),point,v_lines_color,1,true)
|
||||
draw_string(font,point+Vector2(-const_width/2*x_chors[p].length(),font_size+const_height),x_chors[p],font_color)
|
||||
|
||||
# ordinate
|
||||
for p in y_chors.size():
|
||||
var point : Vector2 = origin-Vector2(0,(p)*y_pass)
|
||||
# h grid
|
||||
draw_line(point,point+Vector2(SIZE.x-OFFSET.x,0),h_lines_color,0.2,true)
|
||||
# ordinate
|
||||
draw_line(point,point+Vector2(5,0),h_lines_color,1,true)
|
||||
draw_string(font,point-Vector2(y_chors[p].length()*const_width+font_size,-const_height),y_chors[p],font_color)
|
||||
# ascisse
|
||||
for p in x_chors.size():
|
||||
var point : Vector2 = origin+Vector2((p)*x_pass,0)
|
||||
# v grid
|
||||
draw_line(point,point-Vector2(0,SIZE.y-OFFSET.y),v_lines_color,0.2,true)
|
||||
# ascisse
|
||||
draw_line(point-Vector2(0,5),point,v_lines_color,1,true)
|
||||
draw_string(font,point+Vector2(-const_width/2*x_chors[p].length(),font_size+const_height),x_chors[p],font_color)
|
||||
|
||||
# ordinate
|
||||
for p in y_chors.size():
|
||||
var point : Vector2 = origin-Vector2(0,(p)*y_pass)
|
||||
# h grid
|
||||
draw_line(point,point+Vector2(SIZE.x-OFFSET.x,0),h_lines_color,0.2,true)
|
||||
# ordinate
|
||||
draw_line(point,point+Vector2(5,0),h_lines_color,1,true)
|
||||
draw_string(font,point-Vector2(y_chors[p].length()*const_width+font_size,-const_height),y_chors[p],font_color)
|
||||
|
||||
func draw_chart_outlines():
|
||||
draw_line(origin,SIZE-Vector2(0,OFFSET.y),box_color,1,true)
|
||||
draw_line(origin,Vector2(OFFSET.x,0),box_color,1,true)
|
||||
draw_line(Vector2(OFFSET.x,0),Vector2(SIZE.x,0),box_color,1,true)
|
||||
draw_line(Vector2(SIZE.x,0),SIZE-Vector2(0,OFFSET.y),box_color,1,true)
|
||||
draw_line(origin,SIZE-Vector2(0,OFFSET.y),box_color,1,true)
|
||||
draw_line(origin,Vector2(OFFSET.x,0),box_color,1,true)
|
||||
draw_line(Vector2(OFFSET.x,0),Vector2(SIZE.x,0),box_color,1,true)
|
||||
draw_line(Vector2(SIZE.x,0),SIZE-Vector2(0,OFFSET.y),box_color,1,true)
|
||||
|
@ -21,7 +21,21 @@ for a set of data. If the points are coded (color/shape/size), one additional va
|
||||
The data are displayed as a collection of points, each having the value of one variable determining the position on
|
||||
the horizontal axis and the value of the other variable determining the position on the vertical axis."
|
||||
}
|
||||
function_colors = [ "#1e1e1e", "#1e1e1e", "#1e1e1e", "#1e1e1e" ]
|
||||
Chart_Properties/are_values_columns = false
|
||||
Chart_Properties/labels_index = 0
|
||||
Chart_Properties/show_x_values_as_labels = true
|
||||
Chart_Display/x_decim = 5.0
|
||||
Chart_Display/y_decim = 5.0
|
||||
Chart_Style/points_shape = [ 0 ]
|
||||
Chart_Style/function_colors = [ "#1e1e1e", "#1e1e1e", "#1e1e1e", "#1e1e1e" ]
|
||||
Chart_Style/box_color = Color( 0.117647, 0.117647, 0.117647, 1 )
|
||||
Chart_Style/v_lines_color = Color( 0.792157, 0.792157, 0.792157, 1 )
|
||||
Chart_Style/h_lines_color = Color( 0.792157, 0.792157, 0.792157, 1 )
|
||||
Chart_Style/font = null
|
||||
Chart_Style/bold_font = null
|
||||
Chart_Style/font_color = Color( 0.117647, 0.117647, 0.117647, 1 )
|
||||
Chart_Style/template = 0
|
||||
Chart_Modifiers/invert_chart = false
|
||||
|
||||
[node name="Background" type="ColorRect" parent="."]
|
||||
visible = false
|
||||
@ -49,10 +63,23 @@ __meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="ChartName" type="Label" parent="."]
|
||||
anchor_right = 1.0
|
||||
margin_bottom = 14.0
|
||||
align = 1
|
||||
valign = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="PointData" parent="." instance=ExtResource( 1 )]
|
||||
|
||||
[node name="PointData" parent="PointData" index="0"]
|
||||
visible = false
|
||||
margin_left = 252.182
|
||||
margin_top = 37.3706
|
||||
margin_right = 252.046
|
||||
margin_bottom = 38.1706
|
||||
theme = SubResource( 1 )
|
||||
|
||||
[editable path="PointData"]
|
||||
|
@ -113,434 +113,434 @@ signal chart_plotted(chart)
|
||||
signal point_pressed(point)
|
||||
|
||||
func _point_plotted():
|
||||
pass
|
||||
pass
|
||||
|
||||
func _ready():
|
||||
_get_children()
|
||||
_get_children()
|
||||
|
||||
func _get_children():
|
||||
OutlinesTween = $OutlinesTween
|
||||
PointTween = $PointTween
|
||||
Functions = $Functions
|
||||
GridTween = $GridTween
|
||||
PointData = $PointData/PointData
|
||||
Outlines = $Outlines
|
||||
Grid = $Grid
|
||||
OutlinesTween = $OutlinesTween
|
||||
PointTween = $PointTween
|
||||
Functions = $Functions
|
||||
GridTween = $GridTween
|
||||
PointData = $PointData/PointData
|
||||
Outlines = $Outlines
|
||||
Grid = $Grid
|
||||
|
||||
func _set_size(size : Vector2):
|
||||
SIZE = size
|
||||
build_chart()
|
||||
if Engine.editor_hint:
|
||||
_get_children()
|
||||
Outlines.set_point_position(0,Vector2(origin.x,0))
|
||||
Outlines.set_point_position(1,Vector2(SIZE.x,0))
|
||||
Outlines.set_point_position(2,Vector2(SIZE.x,origin.y))
|
||||
Outlines.set_point_position(3,origin)
|
||||
Outlines.set_point_position(4,Vector2(origin.x,0))
|
||||
|
||||
Grid.get_node("VLine").set_point_position(0,Vector2((OFFSET.x+SIZE.x)/2,0))
|
||||
Grid.get_node("VLine").set_point_position(1,Vector2((OFFSET.x+SIZE.x)/2,origin.y))
|
||||
Grid.get_node("HLine").set_point_position(0,Vector2(origin.x,origin.y/2))
|
||||
Grid.get_node("HLine").set_point_position(1,Vector2(SIZE.x,origin.y/2))
|
||||
SIZE = size
|
||||
build_chart()
|
||||
if Engine.editor_hint:
|
||||
_get_children()
|
||||
Outlines.set_point_position(0,Vector2(origin.x,0))
|
||||
Outlines.set_point_position(1,Vector2(SIZE.x,0))
|
||||
Outlines.set_point_position(2,Vector2(SIZE.x,origin.y))
|
||||
Outlines.set_point_position(3,origin)
|
||||
Outlines.set_point_position(4,Vector2(origin.x,0))
|
||||
|
||||
Grid.get_node("VLine").set_point_position(0,Vector2((OFFSET.x+SIZE.x)/2,0))
|
||||
Grid.get_node("VLine").set_point_position(1,Vector2((OFFSET.x+SIZE.x)/2,origin.y))
|
||||
Grid.get_node("HLine").set_point_position(0,Vector2(origin.x,origin.y/2))
|
||||
Grid.get_node("HLine").set_point_position(1,Vector2(SIZE.x,origin.y/2))
|
||||
|
||||
func clear():
|
||||
Outlines.points = []
|
||||
Grid.get_node("HLine").queue_free()
|
||||
Grid.get_node("VLine").queue_free()
|
||||
Outlines.points = []
|
||||
Grid.get_node("HLine").queue_free()
|
||||
Grid.get_node("VLine").queue_free()
|
||||
|
||||
func load_font():
|
||||
if font != null:
|
||||
font_size = font.get_height()
|
||||
var theme : Theme = Theme.new()
|
||||
theme.set_default_font(font)
|
||||
PointData.set_theme(theme)
|
||||
else:
|
||||
var lbl = Label.new()
|
||||
font = lbl.get_font("")
|
||||
lbl.free()
|
||||
if bold_font != null:
|
||||
PointData.Data.set("custom_fonts/font",bold_font)
|
||||
if font != null:
|
||||
font_size = font.get_height()
|
||||
var theme : Theme = Theme.new()
|
||||
theme.set_default_font(font)
|
||||
PointData.set_theme(theme)
|
||||
else:
|
||||
var lbl = Label.new()
|
||||
font = lbl.get_font("")
|
||||
lbl.free()
|
||||
if bold_font != null:
|
||||
PointData.Data.set("custom_fonts/font",bold_font)
|
||||
|
||||
func _plot(source_ : String, delimiter_ : String, are_values_columns_ : bool, x_values_index_ : int):
|
||||
randomize()
|
||||
|
||||
clear()
|
||||
|
||||
load_font()
|
||||
PointData.hide()
|
||||
|
||||
datas = read_datas(source_,delimiter_)
|
||||
count_functions()
|
||||
structure_datas(datas,are_values_columns_,x_values_index_)
|
||||
build_chart()
|
||||
calculate_pass()
|
||||
calculate_coordinates()
|
||||
calculate_colors()
|
||||
draw_chart()
|
||||
|
||||
create_legend()
|
||||
emit_signal("chart_plotted", self)
|
||||
randomize()
|
||||
|
||||
clear()
|
||||
|
||||
load_font()
|
||||
PointData.hide()
|
||||
|
||||
datas = read_datas(source_,delimiter_)
|
||||
count_functions()
|
||||
structure_datas(datas,are_values_columns_,x_values_index_)
|
||||
build_chart()
|
||||
calculate_pass()
|
||||
calculate_coordinates()
|
||||
calculate_colors()
|
||||
draw_chart()
|
||||
|
||||
create_legend()
|
||||
emit_signal("chart_plotted", self)
|
||||
|
||||
func plot():
|
||||
randomize()
|
||||
|
||||
clear()
|
||||
|
||||
load_font()
|
||||
PointData.hide()
|
||||
|
||||
if source == "" or source == null:
|
||||
Utilities._print_message("Can't plot a chart without a Source file. Please, choose it in editor, or use the custom function _plot().",1)
|
||||
return
|
||||
datas = read_datas(source,delimiter)
|
||||
count_functions()
|
||||
structure_datas(datas,are_values_columns,x_values_index)
|
||||
build_chart()
|
||||
calculate_pass()
|
||||
calculate_coordinates()
|
||||
calculate_colors()
|
||||
draw_chart()
|
||||
|
||||
create_legend()
|
||||
emit_signal("chart_plotted", self)
|
||||
randomize()
|
||||
|
||||
clear()
|
||||
|
||||
load_font()
|
||||
PointData.hide()
|
||||
|
||||
if source == "" or source == null:
|
||||
Utilities._print_message("Can't plot a chart without a Source file. Please, choose it in editor, or use the custom function _plot().",1)
|
||||
return
|
||||
datas = read_datas(source,delimiter)
|
||||
count_functions()
|
||||
structure_datas(datas,are_values_columns,x_values_index)
|
||||
build_chart()
|
||||
calculate_pass()
|
||||
calculate_coordinates()
|
||||
calculate_colors()
|
||||
draw_chart()
|
||||
|
||||
create_legend()
|
||||
emit_signal("chart_plotted", self)
|
||||
|
||||
func calculate_colors():
|
||||
if function_colors.empty() or function_colors.size() < functions:
|
||||
for function in functions:
|
||||
function_colors.append(Color("#1e1e1e") as Color)
|
||||
if function_colors.empty() or function_colors.size() < functions:
|
||||
for function in functions:
|
||||
function_colors.append(Color("#1e1e1e") as Color)
|
||||
|
||||
func draw_chart():
|
||||
draw_outlines()
|
||||
draw_v_grid()
|
||||
draw_h_grid()
|
||||
draw_functions()
|
||||
draw_outlines()
|
||||
draw_v_grid()
|
||||
draw_h_grid()
|
||||
draw_functions()
|
||||
|
||||
func draw_outlines():
|
||||
if boxed:
|
||||
Outlines.set_default_color(box_color)
|
||||
OutlinesTween.interpolate_method(Outlines,"add_point",
|
||||
Vector2(origin.x,0),Vector2(SIZE.x,0),drawing_duration*0.5,Tween.TRANS_QUINT,Tween.EASE_OUT)
|
||||
OutlinesTween.start()
|
||||
yield(OutlinesTween,"tween_all_completed")
|
||||
OutlinesTween.interpolate_method(Outlines,"add_point",
|
||||
Vector2(SIZE.x,0),Vector2(SIZE.x,origin.y),drawing_duration*0.5,Tween.TRANS_QUINT,Tween.EASE_OUT)
|
||||
OutlinesTween.start()
|
||||
yield(OutlinesTween,"tween_all_completed")
|
||||
OutlinesTween.interpolate_method(Outlines,"add_point",
|
||||
Vector2(SIZE.x,origin.y),origin,drawing_duration*0.5,Tween.TRANS_QUINT,Tween.EASE_OUT)
|
||||
OutlinesTween.start()
|
||||
yield(OutlinesTween,"tween_all_completed")
|
||||
OutlinesTween.interpolate_method(Outlines,"add_point",
|
||||
origin,Vector2(origin.x,0),drawing_duration*0.5,Tween.TRANS_QUINT,Tween.EASE_OUT)
|
||||
OutlinesTween.start()
|
||||
yield(OutlinesTween,"tween_all_completed")
|
||||
if boxed:
|
||||
Outlines.set_default_color(box_color)
|
||||
OutlinesTween.interpolate_method(Outlines,"add_point",
|
||||
Vector2(origin.x,0),Vector2(SIZE.x,0),drawing_duration*0.5,Tween.TRANS_QUINT,Tween.EASE_OUT)
|
||||
OutlinesTween.start()
|
||||
yield(OutlinesTween,"tween_all_completed")
|
||||
OutlinesTween.interpolate_method(Outlines,"add_point",
|
||||
Vector2(SIZE.x,0),Vector2(SIZE.x,origin.y),drawing_duration*0.5,Tween.TRANS_QUINT,Tween.EASE_OUT)
|
||||
OutlinesTween.start()
|
||||
yield(OutlinesTween,"tween_all_completed")
|
||||
OutlinesTween.interpolate_method(Outlines,"add_point",
|
||||
Vector2(SIZE.x,origin.y),origin,drawing_duration*0.5,Tween.TRANS_QUINT,Tween.EASE_OUT)
|
||||
OutlinesTween.start()
|
||||
yield(OutlinesTween,"tween_all_completed")
|
||||
OutlinesTween.interpolate_method(Outlines,"add_point",
|
||||
origin,Vector2(origin.x,0),drawing_duration*0.5,Tween.TRANS_QUINT,Tween.EASE_OUT)
|
||||
OutlinesTween.start()
|
||||
yield(OutlinesTween,"tween_all_completed")
|
||||
|
||||
func draw_v_grid():
|
||||
for p in x_chors.size():
|
||||
var point : Vector2 = origin+Vector2((p)*x_pass,0)
|
||||
var v_grid : Line2D = Line2D.new()
|
||||
Grid.add_child(v_grid)
|
||||
v_grid.set_width(1)
|
||||
v_grid.set_default_color(v_lines_color)
|
||||
add_label(point+Vector2(-const_width/2*x_chors[p].length(),font_size/2), x_chors[p])
|
||||
GridTween.interpolate_method(v_grid,"add_point",point,point-Vector2(0,SIZE.y-OFFSET.y),drawing_duration/(x_chors.size()),Tween.TRANS_EXPO,Tween.EASE_OUT)
|
||||
GridTween.start()
|
||||
yield(GridTween,"tween_all_completed")
|
||||
for p in x_chors.size():
|
||||
var point : Vector2 = origin+Vector2((p)*x_pass,0)
|
||||
var v_grid : Line2D = Line2D.new()
|
||||
Grid.add_child(v_grid)
|
||||
v_grid.set_width(1)
|
||||
v_grid.set_default_color(v_lines_color)
|
||||
add_label(point+Vector2(-const_width/2*x_chors[p].length(),font_size/2), x_chors[p])
|
||||
GridTween.interpolate_method(v_grid,"add_point",point,point-Vector2(0,SIZE.y-OFFSET.y),drawing_duration/(x_chors.size()),Tween.TRANS_EXPO,Tween.EASE_OUT)
|
||||
GridTween.start()
|
||||
yield(GridTween,"tween_all_completed")
|
||||
|
||||
func draw_h_grid():
|
||||
for p in y_chors.size():
|
||||
var point : Vector2 = origin-Vector2(0,(p)*y_pass)
|
||||
var h_grid : Line2D = Line2D.new()
|
||||
Grid.add_child(h_grid)
|
||||
h_grid.set_width(1)
|
||||
h_grid.set_default_color(h_lines_color)
|
||||
add_label(point-Vector2(y_chors[p].length()*const_width+font_size,font_size/2), y_chors[p])
|
||||
GridTween.interpolate_method(h_grid,"add_point",point,Vector2(SIZE.x,point.y),drawing_duration/(y_chors.size()),Tween.TRANS_EXPO,Tween.EASE_OUT)
|
||||
GridTween.start()
|
||||
yield(GridTween,"tween_all_completed")
|
||||
for p in y_chors.size():
|
||||
var point : Vector2 = origin-Vector2(0,(p)*y_pass)
|
||||
var h_grid : Line2D = Line2D.new()
|
||||
Grid.add_child(h_grid)
|
||||
h_grid.set_width(1)
|
||||
h_grid.set_default_color(h_lines_color)
|
||||
add_label(point-Vector2(y_chors[p].length()*const_width+font_size,font_size/2), y_chors[p])
|
||||
GridTween.interpolate_method(h_grid,"add_point",point,Vector2(SIZE.x,point.y),drawing_duration/(y_chors.size()),Tween.TRANS_EXPO,Tween.EASE_OUT)
|
||||
GridTween.start()
|
||||
yield(GridTween,"tween_all_completed")
|
||||
|
||||
|
||||
func add_label(point : Vector2, text : String):
|
||||
var lbl : Label = Label.new()
|
||||
if font != null:
|
||||
lbl.set("custom_fonts/font",font)
|
||||
lbl.set("custom_colors/font_color",font_color)
|
||||
Grid.add_child(lbl)
|
||||
lbl.rect_position = point
|
||||
lbl.set_text(text)
|
||||
var lbl : Label = Label.new()
|
||||
if font != null:
|
||||
lbl.set("custom_fonts/font",font)
|
||||
lbl.set("custom_colors/font_color",font_color)
|
||||
Grid.add_child(lbl)
|
||||
lbl.rect_position = point
|
||||
lbl.set_text(text)
|
||||
|
||||
func draw_functions():
|
||||
for function in point_positions.size():
|
||||
draw_function(function,point_positions[function])
|
||||
for function in point_positions.size():
|
||||
draw_function(function,point_positions[function])
|
||||
|
||||
func draw_function(f_index : int, function : Array):
|
||||
var pointv : Point
|
||||
for point in function.size():
|
||||
pointv = point_node.instance()
|
||||
Functions.add_child(pointv)
|
||||
pointv.connect("_mouse_entered",self,"show_data")
|
||||
pointv.connect("_mouse_exited",self,"hide_data")
|
||||
pointv.connect("_point_pressed",self,"point_pressed")
|
||||
pointv.create_point(point_shape, function_colors[f_index], Color.white, function[point],
|
||||
pointv.format_value(point_values[f_index][point],false,false),
|
||||
y_labels[point if invert_chart else f_index] as String)
|
||||
yield(get_tree().create_timer(drawing_duration/function.size()), "timeout")
|
||||
var pointv : Point
|
||||
for point in function.size():
|
||||
pointv = point_node.instance()
|
||||
Functions.add_child(pointv)
|
||||
pointv.connect("_mouse_entered",self,"show_data")
|
||||
pointv.connect("_mouse_exited",self,"hide_data")
|
||||
pointv.connect("_point_pressed",self,"point_pressed")
|
||||
pointv.create_point(point_shape, function_colors[f_index], Color.white, function[point],
|
||||
pointv.format_value(point_values[f_index][point],false,false),
|
||||
y_labels[point if invert_chart else f_index] as String)
|
||||
yield(get_tree().create_timer(drawing_duration/function.size()), "timeout")
|
||||
|
||||
|
||||
func read_datas(source : String, delimiter : String):
|
||||
var file : File = File.new()
|
||||
file.open(source,File.READ)
|
||||
var content : Array
|
||||
while not file.eof_reached():
|
||||
var line : PoolStringArray = file.get_csv_line(delimiter)
|
||||
content.append(line)
|
||||
file.close()
|
||||
for data in content:
|
||||
if data.size() < 2:
|
||||
content.erase(data)
|
||||
return content
|
||||
var file : File = File.new()
|
||||
file.open(source,File.READ)
|
||||
var content : Array
|
||||
while not file.eof_reached():
|
||||
var line : PoolStringArray = file.get_csv_line(delimiter)
|
||||
content.append(line)
|
||||
file.close()
|
||||
for data in content:
|
||||
if data.size() < 2:
|
||||
content.erase(data)
|
||||
return content
|
||||
|
||||
func structure_datas(database : Array, are_values_columns : bool, x_values_index : int):
|
||||
# @x_values_index can be either a column or a row relative to x values
|
||||
# @y_values can be either a column or a row relative to y values
|
||||
self.are_values_columns = are_values_columns
|
||||
match are_values_columns:
|
||||
true:
|
||||
for row in database.size():
|
||||
var t_vals : Array
|
||||
for column in database[row].size():
|
||||
if column == x_values_index:
|
||||
var x_data = database[row][column]
|
||||
if x_data.is_valid_float() or x_data.is_valid_integer():
|
||||
x_datas.append(x_data as float)
|
||||
else:
|
||||
x_datas.append(x_data.replace(",",".") as float)
|
||||
else:
|
||||
if row != 0:
|
||||
var y_data = database[row][column]
|
||||
if y_data.is_valid_float() or y_data.is_valid_integer():
|
||||
t_vals.append(y_data as float)
|
||||
else:
|
||||
t_vals.append(y_data.replace(",",".") as float)
|
||||
else:
|
||||
y_labels.append(str(database[row][column]))
|
||||
if not t_vals.empty():
|
||||
y_datas.append(t_vals)
|
||||
x_label = str(x_datas.pop_front())
|
||||
false:
|
||||
for row in database.size():
|
||||
if row == x_values_index:
|
||||
x_datas = (database[row])
|
||||
x_label = x_datas.pop_front() as String
|
||||
else:
|
||||
var values = database[row] as Array
|
||||
y_labels.append(values.pop_front() as String)
|
||||
y_datas.append(values)
|
||||
for data in y_datas:
|
||||
for value in data.size():
|
||||
data[value] = data[value] as float
|
||||
|
||||
# draw y labels
|
||||
var to_order : Array
|
||||
var to_order_min : Array
|
||||
for cluster in y_datas.size():
|
||||
# define x_chors and y_chors
|
||||
var ordered_cluster = y_datas[cluster] as Array
|
||||
ordered_cluster.sort()
|
||||
ordered_cluster = PoolIntArray(ordered_cluster)
|
||||
var margin_max = ordered_cluster[ordered_cluster.size()-1]
|
||||
var margin_min = ordered_cluster[0]
|
||||
to_order.append(margin_max)
|
||||
to_order_min.append(margin_min)
|
||||
|
||||
to_order.sort()
|
||||
to_order_min.sort()
|
||||
var margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
y_margin_min = to_order_min.pop_front()
|
||||
v_dist = y_decim * pow(10.0,str(margin).length()-2)
|
||||
var multi = 0
|
||||
var p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
|
||||
# draw x_labels
|
||||
if not show_x_values_as_labels:
|
||||
to_order.clear()
|
||||
to_order = x_datas as PoolIntArray
|
||||
|
||||
to_order.sort()
|
||||
margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
x_margin_min = to_order.pop_front()
|
||||
h_dist = x_decim * pow(10.0,str(margin).length()-2)
|
||||
multi = 0
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
# @x_values_index can be either a column or a row relative to x values
|
||||
# @y_values can be either a column or a row relative to y values
|
||||
self.are_values_columns = are_values_columns
|
||||
match are_values_columns:
|
||||
true:
|
||||
for row in database.size():
|
||||
var t_vals : Array
|
||||
for column in database[row].size():
|
||||
if column == x_values_index:
|
||||
var x_data = database[row][column]
|
||||
if x_data.is_valid_float() or x_data.is_valid_integer():
|
||||
x_datas.append(x_data as float)
|
||||
else:
|
||||
x_datas.append(x_data.replace(",",".") as float)
|
||||
else:
|
||||
if row != 0:
|
||||
var y_data = database[row][column]
|
||||
if y_data.is_valid_float() or y_data.is_valid_integer():
|
||||
t_vals.append(y_data as float)
|
||||
else:
|
||||
t_vals.append(y_data.replace(",",".") as float)
|
||||
else:
|
||||
y_labels.append(str(database[row][column]))
|
||||
if not t_vals.empty():
|
||||
y_datas.append(t_vals)
|
||||
x_label = str(x_datas.pop_front())
|
||||
false:
|
||||
for row in database.size():
|
||||
if row == x_values_index:
|
||||
x_datas = (database[row])
|
||||
x_label = x_datas.pop_front() as String
|
||||
else:
|
||||
var values = database[row] as Array
|
||||
y_labels.append(values.pop_front() as String)
|
||||
y_datas.append(values)
|
||||
for data in y_datas:
|
||||
for value in data.size():
|
||||
data[value] = data[value] as float
|
||||
|
||||
# draw y labels
|
||||
var to_order : Array
|
||||
var to_order_min : Array
|
||||
for cluster in y_datas.size():
|
||||
# define x_chors and y_chors
|
||||
var ordered_cluster = y_datas[cluster] as Array
|
||||
ordered_cluster.sort()
|
||||
ordered_cluster = PoolIntArray(ordered_cluster)
|
||||
var margin_max = ordered_cluster[ordered_cluster.size()-1]
|
||||
var margin_min = ordered_cluster[0]
|
||||
to_order.append(margin_max)
|
||||
to_order_min.append(margin_min)
|
||||
|
||||
to_order.sort()
|
||||
to_order_min.sort()
|
||||
var margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
y_margin_min = to_order_min.pop_front()
|
||||
v_dist = y_decim * pow(10.0,str(margin).length()-2)
|
||||
var multi = 0
|
||||
var p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (v_dist*multi) + ((y_margin_min) if not origin_at_zero else 0)
|
||||
y_chors.append(p as String)
|
||||
|
||||
# draw x_labels
|
||||
if not show_x_values_as_labels:
|
||||
to_order.clear()
|
||||
to_order = x_datas as PoolIntArray
|
||||
|
||||
to_order.sort()
|
||||
margin = to_order.pop_back()
|
||||
if not origin_at_zero:
|
||||
x_margin_min = to_order.pop_front()
|
||||
h_dist = x_decim * pow(10.0,str(margin).length()-2)
|
||||
multi = 0
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
while p < margin:
|
||||
multi+=1
|
||||
p = (h_dist*multi) + ((x_margin_min) if not origin_at_zero else 0)
|
||||
x_labels.append(p as String)
|
||||
|
||||
func build_chart():
|
||||
origin = Vector2(OFFSET.x,SIZE.y-OFFSET.y)
|
||||
origin = Vector2(OFFSET.x,SIZE.y-OFFSET.y)
|
||||
|
||||
func calculate_pass():
|
||||
if invert_chart:
|
||||
x_chors = y_labels as PoolStringArray
|
||||
else:
|
||||
if show_x_values_as_labels:
|
||||
x_chors = x_datas as PoolStringArray
|
||||
else:
|
||||
x_chors = x_labels
|
||||
|
||||
# calculate distance in pixel between 2 consecutive values/datas
|
||||
x_pass = (SIZE.x - OFFSET.x) / (x_chors.size()-1)
|
||||
y_pass = origin.y / (y_chors.size()-1)
|
||||
if invert_chart:
|
||||
x_chors = y_labels as PoolStringArray
|
||||
else:
|
||||
if show_x_values_as_labels:
|
||||
x_chors = x_datas as PoolStringArray
|
||||
else:
|
||||
x_chors = x_labels
|
||||
|
||||
# calculate distance in pixel between 2 consecutive values/datas
|
||||
x_pass = (SIZE.x - OFFSET.x) / (x_chors.size()-1)
|
||||
y_pass = origin.y / (y_chors.size()-1)
|
||||
|
||||
func calculate_coordinates():
|
||||
x_coordinates.clear()
|
||||
y_coordinates.clear()
|
||||
point_values.clear()
|
||||
point_positions.clear()
|
||||
|
||||
if invert_chart:
|
||||
for column in y_datas[0].size():
|
||||
var single_coordinates : Array
|
||||
for row in y_datas:
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((row[column]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((row[column] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
else:
|
||||
for cluster in y_datas:
|
||||
var single_coordinates : Array
|
||||
for value in cluster.size():
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((cluster[value]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((cluster[value] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
|
||||
if show_x_values_as_labels:
|
||||
for x in x_datas.size():
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
for x in x_datas.size():
|
||||
if origin_at_zero:
|
||||
if invert_chart:
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
x_coordinates.append(x_datas[x]*x_pass/h_dist)
|
||||
else:
|
||||
x_coordinates.append((x_datas[x] - x_margin_min)*x_pass/h_dist)
|
||||
|
||||
for f in functions:
|
||||
point_values.append([])
|
||||
point_positions.append([])
|
||||
|
||||
if invert_chart:
|
||||
for function in y_coordinates.size():
|
||||
for function_value in y_coordinates[function].size():
|
||||
if are_values_columns:
|
||||
point_positions[function_value].append(Vector2(x_coordinates[function]+origin.x, origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function_value].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
point_positions[function].append(Vector2(x_coordinates[function_value]+origin.x,origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
for cluster in y_coordinates.size():
|
||||
for y in y_coordinates[cluster].size():
|
||||
if are_values_columns:
|
||||
point_values[y].append([x_datas[cluster],y_datas[cluster][y]])
|
||||
point_positions[y].append(Vector2(x_coordinates[cluster]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
else:
|
||||
point_values[cluster].append([x_datas[y],y_datas[cluster][y]])
|
||||
point_positions[cluster].append(Vector2(x_coordinates[y]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
x_coordinates.clear()
|
||||
y_coordinates.clear()
|
||||
point_values.clear()
|
||||
point_positions.clear()
|
||||
|
||||
if invert_chart:
|
||||
for column in y_datas[0].size():
|
||||
var single_coordinates : Array
|
||||
for row in y_datas:
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((row[column]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((row[column] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
else:
|
||||
for cluster in y_datas:
|
||||
var single_coordinates : Array
|
||||
for value in cluster.size():
|
||||
if origin_at_zero:
|
||||
single_coordinates.append((cluster[value]*y_pass)/v_dist)
|
||||
else:
|
||||
single_coordinates.append((cluster[value] - y_margin_min)*y_pass/v_dist)
|
||||
y_coordinates.append(single_coordinates)
|
||||
|
||||
if show_x_values_as_labels:
|
||||
for x in x_datas.size():
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
for x in x_datas.size():
|
||||
if origin_at_zero:
|
||||
if invert_chart:
|
||||
x_coordinates.append(x_pass*x)
|
||||
else:
|
||||
x_coordinates.append(x_datas[x]*x_pass/h_dist)
|
||||
else:
|
||||
x_coordinates.append((x_datas[x] - x_margin_min)*x_pass/h_dist)
|
||||
|
||||
for f in functions:
|
||||
point_values.append([])
|
||||
point_positions.append([])
|
||||
|
||||
if invert_chart:
|
||||
for function in y_coordinates.size():
|
||||
for function_value in y_coordinates[function].size():
|
||||
if are_values_columns:
|
||||
point_positions[function_value].append(Vector2(x_coordinates[function]+origin.x, origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function_value].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
point_positions[function].append(Vector2(x_coordinates[function_value]+origin.x,origin.y-y_coordinates[function][function_value]))
|
||||
point_values[function].append([x_datas[function_value],y_datas[function_value][function]])
|
||||
else:
|
||||
for cluster in y_coordinates.size():
|
||||
for y in y_coordinates[cluster].size():
|
||||
if are_values_columns:
|
||||
point_values[y].append([x_datas[cluster],y_datas[cluster][y]])
|
||||
point_positions[y].append(Vector2(x_coordinates[cluster]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
else:
|
||||
point_values[cluster].append([x_datas[y],y_datas[cluster][y]])
|
||||
point_positions[cluster].append(Vector2(x_coordinates[y]+origin.x,origin.y-y_coordinates[cluster][y]))
|
||||
|
||||
func redraw():
|
||||
build_chart()
|
||||
calculate_pass()
|
||||
calculate_coordinates()
|
||||
update()
|
||||
build_chart()
|
||||
calculate_pass()
|
||||
calculate_coordinates()
|
||||
update()
|
||||
|
||||
|
||||
func show_data(point):
|
||||
PointData.update_datas(point)
|
||||
PointData.show()
|
||||
PointData.update_datas(point)
|
||||
PointData.show()
|
||||
|
||||
func hide_data():
|
||||
PointData.hide()
|
||||
PointData.hide()
|
||||
|
||||
func clear_points():
|
||||
function_colors.clear()
|
||||
if Functions.get_children():
|
||||
for function in Functions.get_children():
|
||||
function.queue_free()
|
||||
function_colors.clear()
|
||||
if Functions.get_children():
|
||||
for function in Functions.get_children():
|
||||
function.queue_free()
|
||||
|
||||
func set_legend(l : Array):
|
||||
legend = l
|
||||
legend = l
|
||||
|
||||
func get_legend():
|
||||
return legend
|
||||
return legend
|
||||
|
||||
func invert_chart():
|
||||
invert_chart = !invert_chart
|
||||
count_functions()
|
||||
redraw()
|
||||
create_legend()
|
||||
invert_chart = !invert_chart
|
||||
count_functions()
|
||||
redraw()
|
||||
create_legend()
|
||||
|
||||
func count_functions():
|
||||
if are_values_columns:
|
||||
if not invert_chart:
|
||||
functions = datas[0].size()-1
|
||||
else:
|
||||
functions = datas.size()-1
|
||||
else:
|
||||
if invert_chart:
|
||||
functions = datas[0].size()-1
|
||||
else:
|
||||
functions = datas.size()-1
|
||||
if are_values_columns:
|
||||
if not invert_chart:
|
||||
functions = datas[0].size()-1
|
||||
else:
|
||||
functions = datas.size()-1
|
||||
else:
|
||||
if invert_chart:
|
||||
functions = datas[0].size()-1
|
||||
else:
|
||||
functions = datas.size()-1
|
||||
|
||||
func create_legend():
|
||||
legend.clear()
|
||||
for function in functions:
|
||||
var function_legend = FunctionLegend.instance()
|
||||
var f_name : String
|
||||
if invert_chart:
|
||||
f_name = x_datas[function] as String
|
||||
else:
|
||||
f_name = y_labels[function]
|
||||
var legend_font : Font
|
||||
if font != null:
|
||||
legend_font = font
|
||||
if bold_font != null:
|
||||
legend_font = bold_font
|
||||
function_legend.create_legend(f_name,function_colors[function],bold_font,font_color)
|
||||
legend.append(function_legend)
|
||||
legend.clear()
|
||||
for function in functions:
|
||||
var function_legend = FunctionLegend.instance()
|
||||
var f_name : String
|
||||
if invert_chart:
|
||||
f_name = x_datas[function] as String
|
||||
else:
|
||||
f_name = y_labels[function]
|
||||
var legend_font : Font
|
||||
if font != null:
|
||||
legend_font = font
|
||||
if bold_font != null:
|
||||
legend_font = bold_font
|
||||
function_legend.create_legend(f_name,function_colors[function],bold_font,font_color)
|
||||
legend.append(function_legend)
|
||||
|
||||
func apply_template(template_name : int):
|
||||
template = template_name
|
||||
templates = Utilities._load_templates()
|
||||
if template_name!=null:
|
||||
var custom_template = templates.get(templates.keys()[template_name])
|
||||
function_colors = custom_template.function_colors as PoolColorArray
|
||||
v_lines_color = Color(custom_template.v_lines_color)
|
||||
h_lines_color = Color(custom_template.h_lines_color)
|
||||
box_color = Color(custom_template.outline_color)
|
||||
font_color = Color(custom_template.font_color)
|
||||
property_list_changed_notify()
|
||||
|
||||
if Engine.editor_hint:
|
||||
_get_children()
|
||||
Outlines.set_default_color(box_color)
|
||||
Grid.get_node("VLine").set_default_color(v_lines_color)
|
||||
Grid.get_node("HLine").set_default_color(h_lines_color)
|
||||
template = template_name
|
||||
templates = Utilities._load_templates()
|
||||
if template_name!=null:
|
||||
var custom_template = templates.get(templates.keys()[template_name])
|
||||
function_colors = custom_template.function_colors as PoolColorArray
|
||||
v_lines_color = Color(custom_template.v_lines_color)
|
||||
h_lines_color = Color(custom_template.h_lines_color)
|
||||
box_color = Color(custom_template.outline_color)
|
||||
font_color = Color(custom_template.font_color)
|
||||
property_list_changed_notify()
|
||||
|
||||
if Engine.editor_hint:
|
||||
_get_children()
|
||||
Outlines.set_default_color(box_color)
|
||||
Grid.get_node("VLine").set_default_color(v_lines_color)
|
||||
Grid.get_node("HLine").set_default_color(h_lines_color)
|
||||
|
||||
|
||||
func _enter_tree():
|
||||
_ready()
|
||||
_ready()
|
||||
|
@ -1,3 +1,4 @@
|
||||
tool
|
||||
extends VBoxContainer
|
||||
|
||||
onready var Function : Label = $Function
|
||||
@ -9,25 +10,25 @@ var font_color : Color
|
||||
var font : Font
|
||||
|
||||
func _ready():
|
||||
Function.set("custom_fonts/font",font)
|
||||
Function.set("custom_colors/font_color",font_color)
|
||||
Function.set_text(function)
|
||||
FunctionColor.set_frame_color(color)
|
||||
Function.set("custom_fonts/font",font)
|
||||
Function.set("custom_colors/font_color",font_color)
|
||||
Function.set_text(function)
|
||||
FunctionColor.set_frame_color(color)
|
||||
|
||||
func create_legend(text : String, color : Color, font : Font, font_color : Color):
|
||||
self.function = text
|
||||
self.color = color
|
||||
self.font_color = font_color
|
||||
self.font = font
|
||||
self.function = text
|
||||
self.color = color
|
||||
self.font_color = font_color
|
||||
self.font = font
|
||||
|
||||
func set_function( t : String ):
|
||||
function = t
|
||||
function = t
|
||||
|
||||
func get_function() -> String:
|
||||
return function
|
||||
return function
|
||||
|
||||
func set_function_color( c : Color ):
|
||||
color = c
|
||||
color = c
|
||||
|
||||
func get_function_color() -> Color:
|
||||
return color
|
||||
return color
|
||||
|
@ -1,3 +1,4 @@
|
||||
tool
|
||||
extends Control
|
||||
class_name Point
|
||||
|
||||
@ -11,7 +12,7 @@ var function : String setget set_function, get_function
|
||||
var mouse_entered : bool = false
|
||||
|
||||
enum SHAPES {
|
||||
DOT, TRIANGLE, SQUARE, CROSS
|
||||
DOT, TRIANGLE, SQUARE, CROSS
|
||||
}
|
||||
|
||||
var shape : int = 0 setget set_shape, get_shape
|
||||
@ -22,102 +23,102 @@ signal _point_pressed(point)
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
pass # Replace with function body.
|
||||
pass # Replace with function body.
|
||||
|
||||
func _draw():
|
||||
if mouse_entered:
|
||||
draw_point(7,color_outline)
|
||||
draw_point(5,color)
|
||||
if mouse_entered:
|
||||
draw_point(7,color_outline)
|
||||
draw_point(5,color)
|
||||
|
||||
func draw_point(size : float, color : Color):
|
||||
match shape:
|
||||
SHAPES.DOT:
|
||||
draw_circle(OFFSET, size, color)
|
||||
SHAPES.TRIANGLE:
|
||||
size+=6
|
||||
draw_colored_polygon([
|
||||
OFFSET-Vector2(0,size/2), OFFSET+Vector2(1,1)*size/2, OFFSET-Vector2(1,-1)*size/2
|
||||
], color,[],null,null,false)
|
||||
SHAPES.SQUARE:
|
||||
size+=4
|
||||
draw_colored_polygon([
|
||||
OFFSET-Vector2(1,1)*size/2, OFFSET-Vector2(-1,1)*size/2, OFFSET+Vector2(1,1)*size/2, OFFSET-Vector2(1,-1)*size/2
|
||||
], color,[],null,null,false)
|
||||
SHAPES.CROSS:
|
||||
size+=2
|
||||
draw_line(OFFSET-Vector2(size,0), OFFSET+Vector2(size,0), color, size-5, true)
|
||||
draw_line(OFFSET-Vector2(0,size), OFFSET+Vector2(0,size), color, size-5, true)
|
||||
match shape:
|
||||
SHAPES.DOT:
|
||||
draw_circle(OFFSET, size, color)
|
||||
SHAPES.TRIANGLE:
|
||||
size+=6
|
||||
draw_colored_polygon([
|
||||
OFFSET-Vector2(0,size/2), OFFSET+Vector2(1,1)*size/2, OFFSET-Vector2(1,-1)*size/2
|
||||
], color,[],null,null,false)
|
||||
SHAPES.SQUARE:
|
||||
size+=4
|
||||
draw_colored_polygon([
|
||||
OFFSET-Vector2(1,1)*size/2, OFFSET-Vector2(-1,1)*size/2, OFFSET+Vector2(1,1)*size/2, OFFSET-Vector2(1,-1)*size/2
|
||||
], color,[],null,null,false)
|
||||
SHAPES.CROSS:
|
||||
size+=2
|
||||
draw_line(OFFSET-Vector2(size,0), OFFSET+Vector2(size,0), color, size-5, true)
|
||||
draw_line(OFFSET-Vector2(0,size), OFFSET+Vector2(0,size), color, size-5, true)
|
||||
|
||||
func create_point(shape : int, color : Color, color_outline : Color, position : Vector2, value : Array, function : String):
|
||||
self.shape = shape
|
||||
self.color = color
|
||||
self.color_outline = color_outline
|
||||
self.point_position = position
|
||||
self.rect_position = point_position - OFFSET
|
||||
self.point_value = value
|
||||
self.function = function
|
||||
self.shape = shape
|
||||
self.color = color
|
||||
self.color_outline = color_outline
|
||||
self.point_position = position
|
||||
self.rect_position = point_position - OFFSET
|
||||
self.point_value = value
|
||||
self.function = function
|
||||
|
||||
|
||||
func _on_Point_mouse_entered():
|
||||
mouse_entered = true
|
||||
emit_signal("_mouse_entered",self)
|
||||
update()
|
||||
mouse_entered = true
|
||||
emit_signal("_mouse_entered",self)
|
||||
update()
|
||||
|
||||
func _on_Point_mouse_exited():
|
||||
mouse_entered = false
|
||||
emit_signal("_mouse_exited")
|
||||
update()
|
||||
mouse_entered = false
|
||||
emit_signal("_mouse_exited")
|
||||
update()
|
||||
|
||||
func _on_Point_gui_input(event):
|
||||
if event is InputEventMouseButton:
|
||||
if event.is_pressed():
|
||||
if event.button_index == 1:
|
||||
emit_signal("_point_pressed",self)
|
||||
if event is InputEventMouseButton:
|
||||
if event.is_pressed():
|
||||
if event.button_index == 1:
|
||||
emit_signal("_point_pressed",self)
|
||||
|
||||
func format_value(v : Array, format_x : bool, format_y : bool):
|
||||
var x : String = str(v[0])
|
||||
var y : String = str(v[1])
|
||||
|
||||
if format_x:
|
||||
x = format(v[1])
|
||||
if format_y:
|
||||
y = format(v[1])
|
||||
|
||||
return [x,y]
|
||||
var x : String = str(v[0])
|
||||
var y : String = str(v[1])
|
||||
|
||||
if format_x:
|
||||
x = format(v[1])
|
||||
if format_y:
|
||||
y = format(v[1])
|
||||
|
||||
return [x,y]
|
||||
|
||||
func format(n):
|
||||
n = str(n)
|
||||
var size = n.length()
|
||||
var s
|
||||
for i in range(size):
|
||||
if((size - i) % 3 == 0 and i > 0):
|
||||
s = str(s,",", n[i])
|
||||
else:
|
||||
s = str(s,n[i])
|
||||
|
||||
return s.replace("Null","")
|
||||
n = str(n)
|
||||
var size = n.length()
|
||||
var s
|
||||
for i in range(size):
|
||||
if((size - i) % 3 == 0 and i > 0):
|
||||
s = str(s,",", n[i])
|
||||
else:
|
||||
s = str(s,n[i])
|
||||
|
||||
return s.replace("Null","")
|
||||
|
||||
func set_value( v : Array = [] ) :
|
||||
point_value = v
|
||||
point_value = v
|
||||
|
||||
func set_color_point( c : Color ):
|
||||
color = c
|
||||
color = c
|
||||
|
||||
func set_function( f : String ):
|
||||
function = f
|
||||
function = f
|
||||
|
||||
func set_shape(s : int):
|
||||
shape = s
|
||||
shape = s
|
||||
|
||||
# Public Getters
|
||||
func get_value() -> Array:
|
||||
return point_value
|
||||
return point_value
|
||||
|
||||
func get_color_point() -> Color:
|
||||
return color
|
||||
return color
|
||||
|
||||
func get_function() -> String:
|
||||
return function
|
||||
return function
|
||||
|
||||
func get_shape() -> int:
|
||||
return shape
|
||||
return shape
|
||||
|
@ -1,3 +1,4 @@
|
||||
tool
|
||||
extends PanelContainer
|
||||
class_name PointData
|
||||
|
||||
@ -12,36 +13,36 @@ onready var Value : Label = $PointData/Value/y
|
||||
onready var Function : Label = $PointData/Function
|
||||
|
||||
func _ready():
|
||||
pass
|
||||
pass
|
||||
|
||||
func _process(delta):
|
||||
if get_global_mouse_position().y > OFFSET.y + GAP.y:
|
||||
rect_position = get_global_mouse_position() - OFFSET - GAP
|
||||
else:
|
||||
rect_position = get_global_mouse_position() + GAP*5 - OFFSET
|
||||
if get_global_mouse_position().y > OFFSET.y + GAP.y:
|
||||
rect_position = get_global_mouse_position() - OFFSET - GAP
|
||||
else:
|
||||
rect_position = get_global_mouse_position() + GAP*5 - OFFSET
|
||||
|
||||
func update_datas(point : Control):
|
||||
update_size()
|
||||
|
||||
get("custom_styles/panel").set("bg_color",point.color)
|
||||
|
||||
var font_color : Color
|
||||
if point.color.g < 0.75:
|
||||
font_color = Color(1,1,1,1)
|
||||
else:
|
||||
font_color = Color(0,0,0,1)
|
||||
Data.set("custom_colors/font_color",font_color)
|
||||
Value.set("custom_colors/font_color",font_color)
|
||||
Function.set("custom_colors/font_color",font_color)
|
||||
get("custom_styles/panel").set("border_color",font_color)
|
||||
|
||||
Data.set_text(point.point_value[0]+":")
|
||||
Value.set_text(point.point_value[1])
|
||||
Function.set_text(point.function)
|
||||
update()
|
||||
show()
|
||||
update_size()
|
||||
|
||||
get("custom_styles/panel").set("bg_color",point.color)
|
||||
|
||||
var font_color : Color
|
||||
if point.color.g < 0.75:
|
||||
font_color = Color(1,1,1,1)
|
||||
else:
|
||||
font_color = Color(0,0,0,1)
|
||||
Data.set("custom_colors/font_color",font_color)
|
||||
Value.set("custom_colors/font_color",font_color)
|
||||
Function.set("custom_colors/font_color",font_color)
|
||||
get("custom_styles/panel").set("border_color",font_color)
|
||||
|
||||
Data.set_text(point.point_value[0]+":")
|
||||
Value.set_text(point.point_value[1])
|
||||
Function.set_text(point.function)
|
||||
update()
|
||||
show()
|
||||
|
||||
func update_size():
|
||||
OFFSET.x = get_size().x/2
|
||||
OFFSET.y = get_size().y
|
||||
GAP.y = OFFSET.y/3
|
||||
OFFSET.x = get_size().x/2
|
||||
OFFSET.y = get_size().y
|
||||
GAP.y = OFFSET.y/3
|
||||
|
@ -73,6 +73,7 @@ var legend : Array setget set_legend,get_legend
|
||||
var templates : Dictionary = {}
|
||||
|
||||
# ................... Export Shared Variables ..................
|
||||
export (String) var chart_name : String = "" setget set_chart_name
|
||||
export (String, FILE, "*.txt, *.csv") var source : String = "" setget set_source
|
||||
export (String) var delimiter : String = ";" setget set_delimiter
|
||||
|
||||
@ -113,143 +114,146 @@ var invert_chart : bool = false setget set_invert_chart
|
||||
|
||||
# .......................... Properties Manager ....................................
|
||||
func _get(property):
|
||||
match property:
|
||||
"Chart_Properties/origin_at_zero":
|
||||
return origin_at_zero
|
||||
"Chart_Properties/are_values_columns":
|
||||
return are_values_columns
|
||||
"Chart_Properties/show_x_values_as_labels":
|
||||
return show_x_values_as_labels
|
||||
"Chart_Properties/labels_index":
|
||||
return labels_index
|
||||
"Chart_Properties/function_names_index":
|
||||
return function_names_index
|
||||
"Chart_Properties/use_height_as_radius":
|
||||
return use_height_as_radius
|
||||
"Chart_Properties/radius":
|
||||
return radius
|
||||
"Chart_Properties/column_width":
|
||||
return column_width
|
||||
"Chart_Properties/column_gap":
|
||||
return column_gap
|
||||
|
||||
"Chart_Display/full_scale":
|
||||
return full_scale
|
||||
"Chart_Display/x_decim":
|
||||
return x_decim
|
||||
"Chart_Display/y_decim":
|
||||
return y_decim
|
||||
|
||||
"Chart_Style/points_shape":
|
||||
return points_shape
|
||||
"Chart_Style/function_colors":
|
||||
return function_colors
|
||||
"Chart_Style/template":
|
||||
return template
|
||||
"Chart_Style/outline_color":
|
||||
return outline_color
|
||||
"Chart_Style/grid_color":
|
||||
return grid_color
|
||||
"Chart_Style/box_color":
|
||||
return box_color
|
||||
"Chart_Style/v_lines_color":
|
||||
return v_lines_color
|
||||
"Chart_Style/h_lines_color":
|
||||
return h_lines_color
|
||||
"Chart_Style/font":
|
||||
return font
|
||||
"Chart_Style/bold_font":
|
||||
return bold_font
|
||||
"Chart_Style/font_color":
|
||||
return font_color
|
||||
|
||||
"Chart_Modifiers/rotation":
|
||||
return rotation
|
||||
"Chart_Modifiers/invert_chart":
|
||||
return invert_chart
|
||||
match property:
|
||||
"Chart_Properties/origin_at_zero":
|
||||
return origin_at_zero
|
||||
"Chart_Properties/are_values_columns":
|
||||
return are_values_columns
|
||||
"Chart_Properties/show_x_values_as_labels":
|
||||
return show_x_values_as_labels
|
||||
"Chart_Properties/labels_index":
|
||||
return labels_index
|
||||
"Chart_Properties/function_names_index":
|
||||
return function_names_index
|
||||
"Chart_Properties/use_height_as_radius":
|
||||
return use_height_as_radius
|
||||
"Chart_Properties/radius":
|
||||
return radius
|
||||
"Chart_Properties/column_width":
|
||||
return column_width
|
||||
"Chart_Properties/column_gap":
|
||||
return column_gap
|
||||
|
||||
"Chart_Display/full_scale":
|
||||
return full_scale
|
||||
"Chart_Display/x_decim":
|
||||
return x_decim
|
||||
"Chart_Display/y_decim":
|
||||
return y_decim
|
||||
|
||||
"Chart_Style/points_shape":
|
||||
return points_shape
|
||||
"Chart_Style/function_colors":
|
||||
return function_colors
|
||||
"Chart_Style/template":
|
||||
return template
|
||||
"Chart_Style/outline_color":
|
||||
return outline_color
|
||||
"Chart_Style/grid_color":
|
||||
return grid_color
|
||||
"Chart_Style/box_color":
|
||||
return box_color
|
||||
"Chart_Style/v_lines_color":
|
||||
return v_lines_color
|
||||
"Chart_Style/h_lines_color":
|
||||
return h_lines_color
|
||||
"Chart_Style/font":
|
||||
return font
|
||||
"Chart_Style/bold_font":
|
||||
return bold_font
|
||||
"Chart_Style/font_color":
|
||||
return font_color
|
||||
|
||||
"Chart_Modifiers/rotation":
|
||||
return rotation
|
||||
"Chart_Modifiers/invert_chart":
|
||||
return invert_chart
|
||||
|
||||
func _set(property, value):
|
||||
match property:
|
||||
"Chart_Properties/origin_at_zero":
|
||||
origin_at_zero = value
|
||||
return true
|
||||
"Chart_Properties/are_values_columns":
|
||||
are_values_columns = value
|
||||
return true
|
||||
"Chart_Properties/show_x_values_as_labels":
|
||||
show_x_values_as_labels = value
|
||||
return true
|
||||
"Chart_Properties/labels_index":
|
||||
labels_index = value
|
||||
return true
|
||||
"Chart_Properties/function_names_index":
|
||||
function_names_index = value
|
||||
return true
|
||||
"Chart_Properties/use_height_as_radius":
|
||||
use_height_as_radius = value
|
||||
return true
|
||||
"Chart_Properties/radius":
|
||||
radius = value
|
||||
return true
|
||||
"Chart_Properties/column_width":
|
||||
column_width = value
|
||||
return true
|
||||
"Chart_Properties/column_gap":
|
||||
column_width = value
|
||||
return true
|
||||
|
||||
"Chart_Display/full_scale":
|
||||
full_scale = value
|
||||
return true
|
||||
"Chart_Display/x_decim":
|
||||
x_decim = value
|
||||
return true
|
||||
"Chart_Display/y_decim":
|
||||
y_decim = value
|
||||
return true
|
||||
|
||||
"Chart_Style/points_shape":
|
||||
points_shape = value
|
||||
return true
|
||||
"Chart_Style/function_colors":
|
||||
function_colors = value
|
||||
return true
|
||||
"Chart_Style/template":
|
||||
template = value
|
||||
apply_template(template)
|
||||
return true
|
||||
"Chart_Style/outline_color":
|
||||
outline_color = value
|
||||
return true
|
||||
"Chart_Style/grid_color":
|
||||
grid_color = value
|
||||
return true
|
||||
"Chart_Style/box_color":
|
||||
box_color = value
|
||||
return true
|
||||
"Chart_Style/v_lines_color":
|
||||
v_lines_color = value
|
||||
return true
|
||||
"Chart_Style/h_lines_color":
|
||||
h_lines_color = value
|
||||
return true
|
||||
"Chart_Style/font":
|
||||
font = value
|
||||
return true
|
||||
"Chart_Style/bold_font":
|
||||
bold_font = value
|
||||
return true
|
||||
"Chart_Style/font_color":
|
||||
font_color = value
|
||||
apply_template(template)
|
||||
return true
|
||||
|
||||
"Chart_Modifiers/rotation":
|
||||
rotation = value
|
||||
return true
|
||||
"Chart_Modifiers/invert_chart":
|
||||
invert_chart = value
|
||||
return true
|
||||
match property:
|
||||
"Chart_Properties/origin_at_zero":
|
||||
origin_at_zero = value
|
||||
return true
|
||||
"Chart_Properties/are_values_columns":
|
||||
are_values_columns = value
|
||||
return true
|
||||
"Chart_Properties/show_x_values_as_labels":
|
||||
show_x_values_as_labels = value
|
||||
return true
|
||||
"Chart_Properties/labels_index":
|
||||
labels_index = value
|
||||
return true
|
||||
"Chart_Properties/function_names_index":
|
||||
function_names_index = value
|
||||
return true
|
||||
"Chart_Properties/use_height_as_radius":
|
||||
use_height_as_radius = value
|
||||
return true
|
||||
"Chart_Properties/radius":
|
||||
radius = value
|
||||
return true
|
||||
"Chart_Properties/column_width":
|
||||
column_width = value
|
||||
return true
|
||||
"Chart_Properties/column_gap":
|
||||
column_width = value
|
||||
return true
|
||||
|
||||
"Chart_Display/full_scale":
|
||||
full_scale = value
|
||||
return true
|
||||
"Chart_Display/x_decim":
|
||||
x_decim = value
|
||||
return true
|
||||
"Chart_Display/y_decim":
|
||||
y_decim = value
|
||||
return true
|
||||
|
||||
"Chart_Style/points_shape":
|
||||
points_shape = value
|
||||
return true
|
||||
"Chart_Style/function_colors":
|
||||
function_colors = value
|
||||
return true
|
||||
"Chart_Style/template":
|
||||
template = value
|
||||
apply_template(template)
|
||||
return true
|
||||
"Chart_Style/outline_color":
|
||||
outline_color = value
|
||||
return true
|
||||
"Chart_Style/grid_color":
|
||||
grid_color = value
|
||||
return true
|
||||
"Chart_Style/box_color":
|
||||
box_color = value
|
||||
return true
|
||||
"Chart_Style/v_lines_color":
|
||||
v_lines_color = value
|
||||
return true
|
||||
"Chart_Style/h_lines_color":
|
||||
h_lines_color = value
|
||||
return true
|
||||
"Chart_Style/font":
|
||||
font = value
|
||||
return true
|
||||
"Chart_Style/bold_font":
|
||||
bold_font = value
|
||||
return true
|
||||
"Chart_Style/font_color":
|
||||
font_color = value
|
||||
apply_template(template)
|
||||
return true
|
||||
|
||||
"Chart_Modifiers/rotation":
|
||||
rotation = value
|
||||
return true
|
||||
"Chart_Modifiers/invert_chart":
|
||||
invert_chart = value
|
||||
return true
|
||||
|
||||
func _ready():
|
||||
templates = Utilities._load_templates()
|
||||
|
||||
# .......................... Shared Functions and virtuals ........................
|
||||
|
||||
@ -270,268 +274,271 @@ func _set(property, value):
|
||||
# create_legend()
|
||||
# emit_signal("chart_plotted")
|
||||
|
||||
func _ready():
|
||||
templates = Utilities._load_templates()
|
||||
|
||||
func plot():
|
||||
load_font()
|
||||
PointData.hide()
|
||||
|
||||
if source == "" or source == null:
|
||||
Utilities._print_message("Can't plot a chart without a Source file. Please, choose it in editor, or use the custom function _plot().",1)
|
||||
return
|
||||
|
||||
datas = read_datas(source,delimiter)
|
||||
structure_datas(datas,are_values_columns,labels_index)
|
||||
build_chart()
|
||||
count_functions()
|
||||
calculate_pass()
|
||||
calculate_coordinates()
|
||||
calculate_colors()
|
||||
set_shapes()
|
||||
create_legend()
|
||||
emit_signal("chart_plotted",self)
|
||||
load_font()
|
||||
PointData.hide()
|
||||
|
||||
if source == "" or source == null:
|
||||
Utilities._print_message("Can't plot a chart without a Source file. Please, choose it in editor, or use the custom function _plot().",1)
|
||||
return
|
||||
|
||||
datas = read_datas(source)
|
||||
structure_datas(datas,are_values_columns,labels_index)
|
||||
build_chart()
|
||||
count_functions()
|
||||
calculate_pass()
|
||||
calculate_coordinates()
|
||||
calculate_colors()
|
||||
set_shapes()
|
||||
create_legend()
|
||||
emit_signal("chart_plotted",self)
|
||||
|
||||
func load_font():
|
||||
if font != null:
|
||||
font_size = font.get_height()
|
||||
var theme : Theme = Theme.new()
|
||||
theme.set_default_font(font)
|
||||
PointData.set_theme(theme)
|
||||
else:
|
||||
var lbl = Label.new()
|
||||
font = lbl.get_font("")
|
||||
lbl.free()
|
||||
if bold_font != null:
|
||||
PointData.Data.set("custom_fonts/font",bold_font)
|
||||
if font != null:
|
||||
font_size = font.get_height()
|
||||
var theme : Theme = Theme.new()
|
||||
theme.set_default_font(font)
|
||||
PointData.set_theme(theme)
|
||||
else:
|
||||
var lbl = Label.new()
|
||||
font = lbl.get_font("")
|
||||
lbl.free()
|
||||
if bold_font != null:
|
||||
PointData.Data.set("custom_fonts/font",bold_font)
|
||||
|
||||
func calculate_colors():
|
||||
if function_colors.empty() or function_colors.size() < functions:
|
||||
for function in functions:
|
||||
function_colors.append(Color("#1e1e1e"))
|
||||
if function_colors.empty() or function_colors.size() < functions:
|
||||
for function in functions:
|
||||
function_colors.append(Color("#1e1e1e"))
|
||||
|
||||
func set_shapes():
|
||||
if points_shape.empty() or points_shape.size() < functions:
|
||||
for function in functions:
|
||||
points_shape.append(PointShapes.Dot)
|
||||
if points_shape.empty() or points_shape.size() < functions:
|
||||
for function in functions:
|
||||
points_shape.append(PointShapes.Dot)
|
||||
|
||||
func read_datas(source : String, delimiter : String):
|
||||
var file : File = File.new()
|
||||
file.open(source,File.READ)
|
||||
var content : Array
|
||||
while not file.eof_reached():
|
||||
var line : PoolStringArray = file.get_csv_line(delimiter)
|
||||
content.append(line)
|
||||
file.close()
|
||||
for data in content:
|
||||
if data.size() < 2 or data.empty():
|
||||
content.erase(data)
|
||||
return content
|
||||
func read_datas(source : String):
|
||||
var file : File = File.new()
|
||||
file.open(source,File.READ)
|
||||
var content : Array
|
||||
while not file.eof_reached():
|
||||
var line : PoolStringArray = file.get_csv_line(delimiter)
|
||||
content.append(line)
|
||||
file.close()
|
||||
for data in content:
|
||||
if data.size() < 2 or data.empty():
|
||||
content.erase(data)
|
||||
return content
|
||||
|
||||
func count_functions():
|
||||
if are_values_columns:
|
||||
if not invert_chart:
|
||||
functions = datas[0].size()-1
|
||||
else:
|
||||
functions = datas.size()-1
|
||||
else:
|
||||
if invert_chart:
|
||||
functions = datas[0].size()-1
|
||||
else:
|
||||
functions = datas.size()-1
|
||||
if are_values_columns:
|
||||
if not invert_chart:
|
||||
functions = datas[0].size()-1
|
||||
else:
|
||||
functions = datas.size()-1
|
||||
else:
|
||||
if invert_chart:
|
||||
functions = datas[0].size()-1
|
||||
else:
|
||||
functions = datas.size()-1
|
||||
|
||||
func clear_points():
|
||||
if $Points.get_children():
|
||||
for function in Points.get_children():
|
||||
function.queue_free()
|
||||
for legend in $Legend.get_children():
|
||||
legend.queue_free()
|
||||
if $Points.get_children():
|
||||
for function in Points.get_children():
|
||||
function.queue_free()
|
||||
for legend in $Legend.get_children():
|
||||
legend.queue_free()
|
||||
|
||||
func redraw():
|
||||
build_chart()
|
||||
calculate_pass()
|
||||
calculate_coordinates()
|
||||
update()
|
||||
build_chart()
|
||||
calculate_pass()
|
||||
calculate_coordinates()
|
||||
update()
|
||||
|
||||
# .................. VIRTUAL FUNCTIONS .........................
|
||||
func calculate_pass():
|
||||
pass
|
||||
pass
|
||||
|
||||
func calculate_coordinates():
|
||||
pass
|
||||
pass
|
||||
|
||||
func structure_datas(database : Array, are_values_columns : bool, labels_index : int):
|
||||
pass
|
||||
pass
|
||||
|
||||
func build_chart():
|
||||
pass
|
||||
pass
|
||||
|
||||
func function_colors():
|
||||
pass
|
||||
pass
|
||||
|
||||
func create_legend():
|
||||
pass
|
||||
pass
|
||||
|
||||
# ........................... Shared Setters & Getters ..............................
|
||||
func apply_template(template_name : int):
|
||||
if Engine.editor_hint:
|
||||
set_template(template_name)
|
||||
property_list_changed_notify()
|
||||
if Engine.editor_hint:
|
||||
set_template(template_name)
|
||||
property_list_changed_notify()
|
||||
|
||||
# !!! API v2
|
||||
func set_chart_name(ch_name : String):
|
||||
chart_name = ch_name
|
||||
get_node("ChartName").set_text(chart_name)
|
||||
|
||||
# !!! API v2
|
||||
func set_source(source_file : String, delim : String = ";"):
|
||||
source = source_file
|
||||
delimiter = delim
|
||||
func set_source(source_file : String):
|
||||
source = source_file
|
||||
|
||||
# !!! API v2
|
||||
func set_indexes(lb : int = 0, function_names : int = 0):
|
||||
labels_index = lb
|
||||
function_names_index = function_names
|
||||
labels_index = lb
|
||||
function_names_index = function_names
|
||||
|
||||
# !!! API v2
|
||||
func set_radius(use_height : bool = false, f : float = 0):
|
||||
use_height_as_radius = use_height
|
||||
radius = f
|
||||
use_height_as_radius = use_height
|
||||
radius = f
|
||||
|
||||
# !!! API v2
|
||||
func set_chart_colors(f_colors : Array, o_color : Color, b_color : Color, g_color : Color, h_lines : Color, v_lines : Color):
|
||||
function_colors = f_colors
|
||||
outline_color = o_color
|
||||
box_color = b_color
|
||||
grid_color = g_color
|
||||
h_lines_color = h_lines
|
||||
v_lines_color = v_lines
|
||||
function_colors = f_colors
|
||||
outline_color = o_color
|
||||
box_color = b_color
|
||||
grid_color = g_color
|
||||
h_lines_color = h_lines
|
||||
v_lines_color = v_lines
|
||||
|
||||
# !!! API v2
|
||||
func set_chart_fonts(normal_font : Font, bold_font : Font, f_color : Color):
|
||||
font = normal_font
|
||||
self.bold_font = bold_font
|
||||
font_color = f_color
|
||||
font = normal_font
|
||||
self.bold_font = bold_font
|
||||
font_color = f_color
|
||||
|
||||
# !!! API v2
|
||||
func set_delimiter(d : String):
|
||||
d = delimiter
|
||||
d = delimiter
|
||||
|
||||
# ! API
|
||||
func set_origin_at_zero(b : bool):
|
||||
origin_at_zero = b
|
||||
origin_at_zero = b
|
||||
|
||||
# ! API
|
||||
func set_are_values_columns(b : bool):
|
||||
are_values_columns = b
|
||||
are_values_columns = b
|
||||
|
||||
# ! API
|
||||
func set_show_x_values_as_labels(b : bool):
|
||||
show_x_values_as_labels = b
|
||||
show_x_values_as_labels = b
|
||||
|
||||
func set_labels_index(i : int):
|
||||
labels_index = i
|
||||
labels_index = i
|
||||
|
||||
func set_function_names_index(i : int):
|
||||
function_names_index = i
|
||||
function_names_index = i
|
||||
|
||||
func set_use_height_as_radius(b : bool):
|
||||
use_height_as_radius = b
|
||||
use_height_as_radius = b
|
||||
|
||||
func _set_radius(r : float):
|
||||
radius = r
|
||||
radius = r
|
||||
|
||||
# ! API
|
||||
func set_column_width(f : float):
|
||||
column_width = f
|
||||
column_width = f
|
||||
|
||||
# ! API
|
||||
func set_column_gap(f : float):
|
||||
column_gap = f
|
||||
column_gap = f
|
||||
|
||||
# ! API
|
||||
func set_full_scale(f : float):
|
||||
full_scale = f
|
||||
full_scale = f
|
||||
|
||||
# ! API
|
||||
func set_x_decim(f : float):
|
||||
x_decim = f
|
||||
x_decim = f
|
||||
|
||||
# ! API
|
||||
func set_y_decim(f : float):
|
||||
y_decim = f
|
||||
y_decim = f
|
||||
|
||||
# ! API
|
||||
func set_points_shape(a : Array):
|
||||
points_shape = a
|
||||
points_shape = a
|
||||
|
||||
|
||||
# ! API
|
||||
func set_function_colors(a : Array):
|
||||
function_colors = a
|
||||
function_colors = a
|
||||
|
||||
# ! API
|
||||
func set_outline_color(c : Color):
|
||||
outline_color = c
|
||||
outline_color = c
|
||||
|
||||
# ! API
|
||||
func set_box_color(c : Color):
|
||||
box_color = c
|
||||
box_color = c
|
||||
|
||||
# ! API
|
||||
func set_grid_color(c : Color):
|
||||
grid_color = c
|
||||
grid_color = c
|
||||
|
||||
# ! API
|
||||
func set_v_lines_color(c : Color):
|
||||
v_lines_color = c
|
||||
v_lines_color = c
|
||||
|
||||
# ! API
|
||||
func set_h_lines_color(c : Color):
|
||||
h_lines_color = c
|
||||
h_lines_color = c
|
||||
|
||||
# ! API
|
||||
func set_font(f : Font):
|
||||
font = f
|
||||
font = f
|
||||
|
||||
# ! API
|
||||
func set_bold_font(f : Font):
|
||||
bold_font = f
|
||||
bold_font = f
|
||||
|
||||
# ! API
|
||||
func set_font_color(c : Color):
|
||||
font_color = c
|
||||
font_color = c
|
||||
|
||||
# ! API
|
||||
func set_template(template_name : int):
|
||||
template = template_name
|
||||
templates = Utilities.templates
|
||||
if template_name!=null:
|
||||
var custom_template = templates.get(templates.keys()[template_name])
|
||||
function_colors = custom_template.function_colors as PoolColorArray
|
||||
outline_color = Color(custom_template.outline_color)
|
||||
box_color = Color(custom_template.outline_color)
|
||||
grid_color = Color(custom_template.v_lines_color)
|
||||
v_lines_color = Color(custom_template.v_lines_color)
|
||||
h_lines_color = Color(custom_template.h_lines_color)
|
||||
box_color = Color(custom_template.outline_color)
|
||||
font_color = Color(custom_template.font_color)
|
||||
template = template_name
|
||||
templates = Utilities.templates
|
||||
if template_name!=null:
|
||||
var custom_template = templates.get(templates.keys()[template_name])
|
||||
function_colors = custom_template.function_colors as PoolColorArray
|
||||
outline_color = Color(custom_template.outline_color)
|
||||
box_color = Color(custom_template.outline_color)
|
||||
grid_color = Color(custom_template.v_lines_color)
|
||||
v_lines_color = Color(custom_template.v_lines_color)
|
||||
h_lines_color = Color(custom_template.h_lines_color)
|
||||
box_color = Color(custom_template.outline_color)
|
||||
font_color = Color(custom_template.font_color)
|
||||
|
||||
# ! API
|
||||
func set_rotation(f : float):
|
||||
rotation = f
|
||||
rotation = f
|
||||
|
||||
# ! API
|
||||
func set_invert_chart(b : bool):
|
||||
invert_chart = b
|
||||
invert_chart = b
|
||||
|
||||
func set_legend(l : Array):
|
||||
legend = l
|
||||
legend = l
|
||||
|
||||
func get_legend():
|
||||
return legend
|
||||
return legend
|
||||
|
||||
# ............................. Shared Signals ..............................
|
||||
func point_pressed(point : Point):
|
||||
emit_signal("point_pressed",point)
|
||||
emit_signal("point_pressed",point)
|
||||
|
||||
func show_data(point : Point):
|
||||
PointData.update_datas(point)
|
||||
PointData.show()
|
||||
PointData.update_datas(point)
|
||||
PointData.show()
|
||||
|
||||
func hide_data():
|
||||
PointData.hide()
|
||||
PointData.hide()
|
||||
|
@ -1,3 +1,4 @@
|
||||
tool
|
||||
extends Node2D
|
||||
class_name Chart2D
|
||||
|
||||
@ -6,4 +7,4 @@ enum TemplatesNames { Default, Clean, Gradient, Minimal, Invert }
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
pass # Replace with function body.
|
||||
pass # Replace with function body.
|
||||
|
@ -5,22 +5,22 @@ var plugin_name : String = "Easy Charts"
|
||||
var templates : Dictionary = {}
|
||||
|
||||
func _ready():
|
||||
templates = _load_templates()
|
||||
_print_message("Templates loaded")
|
||||
templates = _load_templates()
|
||||
_print_message("Templates loaded")
|
||||
|
||||
func _print_message(message : String, type : int = 0):
|
||||
match type:
|
||||
0:
|
||||
print("[%s] => %s" % [plugin_name, message])
|
||||
1:
|
||||
printerr("ERROR: [%s] => %s" % [plugin_name, message])
|
||||
match type:
|
||||
0:
|
||||
print("[%s] => %s" % [plugin_name, message])
|
||||
1:
|
||||
printerr("ERROR: [%s] => %s" % [plugin_name, message])
|
||||
|
||||
func _load_templates() -> Dictionary:
|
||||
var template_file : File = File.new()
|
||||
template_file.open("res://addons/easy_charts/templates.json",File.READ)
|
||||
var templates = JSON.parse(template_file.get_as_text()).get_result()
|
||||
template_file.close()
|
||||
return templates
|
||||
var template_file : File = File.new()
|
||||
template_file.open("res://addons/easy_charts/templates.json",File.READ)
|
||||
var templates = JSON.parse(template_file.get_as_text()).get_result()
|
||||
template_file.close()
|
||||
return templates
|
||||
|
||||
func get_template(template_index : int):
|
||||
return templates.get(templates.keys()[template_index])
|
||||
return templates.get(templates.keys()[template_index])
|
||||
|
@ -1,10 +1,10 @@
|
||||
Year;Column 1
|
||||
2009;36200
|
||||
2010;36600
|
||||
2011;37500
|
||||
2012;38700
|
||||
2013;39600
|
||||
2014;40500
|
||||
2015;41200
|
||||
2016;41803
|
||||
2017;42600
|
||||
Year;Column 1
|
||||
2009;36200
|
||||
2010;36600
|
||||
2011;37500
|
||||
2012;38700
|
||||
2013;39600
|
||||
2014;40500
|
||||
2015;41200
|
||||
2016;41803
|
||||
2017;42600
|
||||
|
|
@ -1,5 +1,5 @@
|
||||
Year;2009;2010;2011;2012;2013;2014;2015;2016;2017
|
||||
Column 1;36200;36600;37500;38700;39600;40500;41200;41803;42600
|
||||
Column 2;27200;27800;28500;29400;30200;30900;31500;31931;32600
|
||||
Column 3;26200;26600;27500;28700;29600;20500;21200;21803;22600
|
||||
Column 4;17200;17800;18500;19400;10200;10900;11500;11931;12600
|
||||
Year;2009;2010;2011;2012;2013;2014;2015;2016;2017
|
||||
Column 1;36200;36600;37500;38700;39600;40500;41200;41803;42600
|
||||
Column 2;27200;27800;28500;29400;30200;30900;31500;31931;32600
|
||||
Column 3;26200;26600;27500;28700;29600;20500;21200;21803;22600
|
||||
Column 4;17200;17800;18500;19400;10200;10900;11500;11931;12600
|
||||
|
|
3
addons/easy_charts/file.samples/gei_jam#2columns.csv
Normal file
@ -0,0 +1,3 @@
|
||||
Meccaniche;deve essere possibile rallentare/fermare il tempo;deve essere basato su una griglia;deve essere un gioco a tentativi;deve implementare della magia;non deve contenere istruzioni
|
||||
Valori;22;13;20;20;15
|
||||
Valori2;22;13;20;20;15
|
|
@ -0,0 +1,6 @@
|
||||
Meccaniche;Voti
|
||||
deve essere possibile rallentare/fermare il tempo;22
|
||||
deve essere basato su una griglia;13
|
||||
deve essere un gioco a tentativi;20
|
||||
deve implementare della magia;20
|
||||
non deve contenere istruzioni;15
|
|
@ -1,101 +1,101 @@
|
||||
x;y1;y2
|
||||
50,05732879;116,61234;90,55501121
|
||||
53,23295081;105,6457011;47,41275029
|
||||
47,28686102;95,61795061;36,33108959
|
||||
53,0250493;106,4552515;85,4302022
|
||||
57,10271278;111,9088163;39,80610352
|
||||
40,71992494;78,27201391;79,55208897
|
||||
55,62752569;122,7859036;94,15837791
|
||||
54,17819455;107,9817124;39,80351785
|
||||
40,8610371;107,92736;61,0663229
|
||||
54,06159551;110,0647495;93,00315399
|
||||
64,35130431;134,5556319;114,2043276
|
||||
49,29181834;88,18806126;64,89624292
|
||||
44,63823505;102,8364528;108,1982178
|
||||
58,62487836;126,0319541;78,40707574
|
||||
55,78566879;95,81224088;75,02657209
|
||||
50,76570445;94,73143882;39,96573437
|
||||
48,45339259;92,86957776;88,41618517
|
||||
49,40446173;70,21723661;9,81277488
|
||||
48,34604978;97,87616091;40,53011113
|
||||
43,62470151;103,7308337;97,10613219
|
||||
50,8877046;117,1558657;62,2681611
|
||||
52,25082012;103,3922334;79,14141328
|
||||
50,35929987;87,68936817;19,3300683
|
||||
46,42761861;90,1655428;67,73792419
|
||||
55,67926036;93,17073084;69,49147048
|
||||
61,72779383;142,8458546;106,1180608
|
||||
58,99808851;102,3529041;27,35481559
|
||||
43,6620999;77,36405233;17,70195243
|
||||
55,42639088;121,0878726;78,66148172
|
||||
58,79311097;111,8698686;49,07675763
|
||||
50,71073988;106,5406487;97,82990882
|
||||
45,57346035;104,7456111;56,17215075
|
||||
45,7981314;83,9963622;75,1982308
|
||||
46,46484131;82,94617575;77,48133444
|
||||
57,9492853;144,9994608;129,0501755
|
||||
48,3999722;72,83510082;30,43512862
|
||||
54,2097076;114,7785416;82,568834
|
||||
46,67548966;95,25014621;37,57465655
|
||||
38,21698894;88,21423442;64,99724548
|
||||
51,95614673;90,93548401;66,97933728
|
||||
51,22522594;105,1106925;101,8854666
|
||||
52,84741658;105,0503069;75,20289032
|
||||
54,78984594;109,9873973;87,19755136
|
||||
52,00296104;101,442706;89,43974496
|
||||
51,43150193;88,40178257;36,97028064
|
||||
47,40407943;89,44141735;55,03733792
|
||||
51,6749185;96,54147702;31,86655852
|
||||
40,74049925;83,85842913;79,11792988
|
||||
49,82155418;112,9093356;96,08778142
|
||||
57,57763531;115,7709369;72,19330159
|
||||
51,49652924;127,9054098;118,4088806
|
||||
53,10710725;112,6337002;90,52659295
|
||||
42,93645994;102,8111834;102,8747235
|
||||
44,14066275;78,88897631;41,74831356
|
||||
46,60936983;98,64046333;54,0310935
|
||||
47,41415307;95,89594769;58,48179462
|
||||
47,99032677;106,3655192;102,3751924
|
||||
50,68360992;106,9507457;44,26713578
|
||||
50,57070899;83,19613908;61,62543009
|
||||
57,14992785;115,5596634;40,40973555
|
||||
50,45105658;97,6950217;64,24396512
|
||||
46,76779029;99,20006513;60,43227484
|
||||
50,49802495;99,43092076;87,93289581
|
||||
51,52523583;84,24653091;17,72129508
|
||||
40,72692657;102,1715902;67,44466363
|
||||
54,96034411;111,5346596;82,57431549
|
||||
48,86213774;101,4305303;58,56839256
|
||||
52,76166432;108,021472;60,25980768
|
||||
55,46249302;83,51709356;51,05460054
|
||||
51,78186354;79,45870906;11,67684552
|
||||
54,7256505;108,6386184;58,9129679
|
||||
55,03288163;112,1224042;72,08952257
|
||||
52,83806054;104,53718;101,6991195
|
||||
45,86692682;91,39643691;29,52951009
|
||||
49,67284006;110,1908352;88,51799514
|
||||
53,18552185;119,0135337;113,8280119
|
||||
41,69070011;62,78988486;53,09918475
|
||||
53,36320564;118,5841731;108,2209675
|
||||
44,27369117;74,58882658;69,31513541
|
||||
49,92198979;76,93363417;52,01164438
|
||||
44,91221355;82,33766098;44,42544743
|
||||
37,92316535;68,0076039;17,08443855
|
||||
50,10889447;103,6209931;49,51209863
|
||||
44,20348231;84,19989748;57,99641517
|
||||
57,11433271;102,0528226;84,93848989
|
||||
41,90764861;109,1360517;50,22840309
|
||||
51,88278094;89,01870776;69,13592682
|
||||
44,31355843;81,19982464;76,88626621
|
||||
44,25547817;72,64564157;53,3901634
|
||||
48,93179315;107,7773458;40,84555265
|
||||
39,36849865;59,39799005;68,0294914
|
||||
53,33338181;99,04871654;92,71533473
|
||||
61,63696872;129,3884947;76,75152598
|
||||
46,40148646;102,9511032;92,54961674
|
||||
43,81949012;75,15673812;44,337248
|
||||
53,78046359;85,87008695;50,08962336
|
||||
41,27977392;60,49700348;50,21722956
|
||||
52,32206122;106,8462547;57,52419348
|
||||
41,36660384;105,0465099;78,67990606
|
||||
47,62423286;96,62455823;84,00032537
|
||||
x;y1;y2
|
||||
50,05732879;116,61234;90,55501121
|
||||
53,23295081;105,6457011;47,41275029
|
||||
47,28686102;95,61795061;36,33108959
|
||||
53,0250493;106,4552515;85,4302022
|
||||
57,10271278;111,9088163;39,80610352
|
||||
40,71992494;78,27201391;79,55208897
|
||||
55,62752569;122,7859036;94,15837791
|
||||
54,17819455;107,9817124;39,80351785
|
||||
40,8610371;107,92736;61,0663229
|
||||
54,06159551;110,0647495;93,00315399
|
||||
64,35130431;134,5556319;114,2043276
|
||||
49,29181834;88,18806126;64,89624292
|
||||
44,63823505;102,8364528;108,1982178
|
||||
58,62487836;126,0319541;78,40707574
|
||||
55,78566879;95,81224088;75,02657209
|
||||
50,76570445;94,73143882;39,96573437
|
||||
48,45339259;92,86957776;88,41618517
|
||||
49,40446173;70,21723661;9,81277488
|
||||
48,34604978;97,87616091;40,53011113
|
||||
43,62470151;103,7308337;97,10613219
|
||||
50,8877046;117,1558657;62,2681611
|
||||
52,25082012;103,3922334;79,14141328
|
||||
50,35929987;87,68936817;19,3300683
|
||||
46,42761861;90,1655428;67,73792419
|
||||
55,67926036;93,17073084;69,49147048
|
||||
61,72779383;142,8458546;106,1180608
|
||||
58,99808851;102,3529041;27,35481559
|
||||
43,6620999;77,36405233;17,70195243
|
||||
55,42639088;121,0878726;78,66148172
|
||||
58,79311097;111,8698686;49,07675763
|
||||
50,71073988;106,5406487;97,82990882
|
||||
45,57346035;104,7456111;56,17215075
|
||||
45,7981314;83,9963622;75,1982308
|
||||
46,46484131;82,94617575;77,48133444
|
||||
57,9492853;144,9994608;129,0501755
|
||||
48,3999722;72,83510082;30,43512862
|
||||
54,2097076;114,7785416;82,568834
|
||||
46,67548966;95,25014621;37,57465655
|
||||
38,21698894;88,21423442;64,99724548
|
||||
51,95614673;90,93548401;66,97933728
|
||||
51,22522594;105,1106925;101,8854666
|
||||
52,84741658;105,0503069;75,20289032
|
||||
54,78984594;109,9873973;87,19755136
|
||||
52,00296104;101,442706;89,43974496
|
||||
51,43150193;88,40178257;36,97028064
|
||||
47,40407943;89,44141735;55,03733792
|
||||
51,6749185;96,54147702;31,86655852
|
||||
40,74049925;83,85842913;79,11792988
|
||||
49,82155418;112,9093356;96,08778142
|
||||
57,57763531;115,7709369;72,19330159
|
||||
51,49652924;127,9054098;118,4088806
|
||||
53,10710725;112,6337002;90,52659295
|
||||
42,93645994;102,8111834;102,8747235
|
||||
44,14066275;78,88897631;41,74831356
|
||||
46,60936983;98,64046333;54,0310935
|
||||
47,41415307;95,89594769;58,48179462
|
||||
47,99032677;106,3655192;102,3751924
|
||||
50,68360992;106,9507457;44,26713578
|
||||
50,57070899;83,19613908;61,62543009
|
||||
57,14992785;115,5596634;40,40973555
|
||||
50,45105658;97,6950217;64,24396512
|
||||
46,76779029;99,20006513;60,43227484
|
||||
50,49802495;99,43092076;87,93289581
|
||||
51,52523583;84,24653091;17,72129508
|
||||
40,72692657;102,1715902;67,44466363
|
||||
54,96034411;111,5346596;82,57431549
|
||||
48,86213774;101,4305303;58,56839256
|
||||
52,76166432;108,021472;60,25980768
|
||||
55,46249302;83,51709356;51,05460054
|
||||
51,78186354;79,45870906;11,67684552
|
||||
54,7256505;108,6386184;58,9129679
|
||||
55,03288163;112,1224042;72,08952257
|
||||
52,83806054;104,53718;101,6991195
|
||||
45,86692682;91,39643691;29,52951009
|
||||
49,67284006;110,1908352;88,51799514
|
||||
53,18552185;119,0135337;113,8280119
|
||||
41,69070011;62,78988486;53,09918475
|
||||
53,36320564;118,5841731;108,2209675
|
||||
44,27369117;74,58882658;69,31513541
|
||||
49,92198979;76,93363417;52,01164438
|
||||
44,91221355;82,33766098;44,42544743
|
||||
37,92316535;68,0076039;17,08443855
|
||||
50,10889447;103,6209931;49,51209863
|
||||
44,20348231;84,19989748;57,99641517
|
||||
57,11433271;102,0528226;84,93848989
|
||||
41,90764861;109,1360517;50,22840309
|
||||
51,88278094;89,01870776;69,13592682
|
||||
44,31355843;81,19982464;76,88626621
|
||||
44,25547817;72,64564157;53,3901634
|
||||
48,93179315;107,7773458;40,84555265
|
||||
39,36849865;59,39799005;68,0294914
|
||||
53,33338181;99,04871654;92,71533473
|
||||
61,63696872;129,3884947;76,75152598
|
||||
46,40148646;102,9511032;92,54961674
|
||||
43,81949012;75,15673812;44,337248
|
||||
53,78046359;85,87008695;50,08962336
|
||||
41,27977392;60,49700348;50,21722956
|
||||
52,32206122;106,8462547;57,52419348
|
||||
41,36660384;105,0465099;78,67990606
|
||||
47,62423286;96,62455823;84,00032537
|
||||
|
|
@ -3,5 +3,5 @@
|
||||
name="EasyCharts"
|
||||
description=""
|
||||
author="Nicolò \"fenix\" Santilio"
|
||||
version="0.2.8"
|
||||
version="0.2.9"
|
||||
script="plugin.gd"
|
||||
|
63
addons/file-editor/README.md
Normal file
@ -0,0 +1,63 @@
|
||||
Check my **[Discord](https://discord.gg/KnJGY9S)** to stay updated on this repository.
|
||||
*(Recommended since the AssetLibrary is not automatically updated)*
|
||||
|
||||
This plugin is now supported in [Godot Extended Library Discord](https://discord.gg/JNrcucg), check out the [Godot Extended Library Project](https://github.com/godot-extended-libraries)!
|
||||
|
||||
# Godot Text Editor
|
||||
A little plugin to easy-way manage your text files inside your project folder.
|
||||
|
||||
Author: *"Nicolo (fenix) Santilio"*
|
||||
Version: *1.7.1*
|
||||
Godot Version: *3.2.1*
|
||||
|
||||
**This repository was pushed directly from Godot Engine Editor thanks to [GitHub Integration](https://github.com/fenix-hub/godot-engine.github-integration)!**
|
||||
|
||||
## What is this?
|
||||
This is a little plugin I've made to easily edit text files in your project folder.
|
||||
|
||||
## How does it work?
|
||||
You can open an existing file, create a new file and delete a file.
|
||||
When opening / creating a file, the editor will open and you will be able to edit it and save it.
|
||||
You can just *Save* the file, or *Save file As* a new file (if it is a new file but also to make some copies).
|
||||
You will also be able to see some informations about the file you are editing (time and date of last edit) and you can set your editor to *Read Only* if you don't want to make changes but still read the content of the file.
|
||||
Multiple files can be opened in different tabs.
|
||||
![preview1](https://i.imgur.com/BbZzKzD.png)![preview2](https://i.imgur.com/asggk4f.png) ![preview3](https://i.imgur.com/omReRZr.png) ![preview4](https://i.imgur.com/d8pMJsE.png)
|
||||
|
||||
## How do I install it?
|
||||
**Manual**
|
||||
Just download this whole repository and put it in your `res://addons` folder inside the project you want to work on.
|
||||
Then, go to `Project > Plugins > "File Editor" > Status > Activate`.
|
||||
|
||||
**Automatic**
|
||||
You can find this plugin in the AssetLib of Godot Engine Editor. Just download it from there and everything should be fine!
|
||||
(Remember to activate this plugin)
|
||||
|
||||
## Supported formats
|
||||
+ "*.txt ; Plain Text File",
|
||||
+ "*.rtf ; Rich Text Format File",
|
||||
+ "*.log ; Log File",
|
||||
+ "*.md ; MD File",
|
||||
+ "*.doc ; WordPad Document",
|
||||
+ "*.doc ; Microsoft Word Document",
|
||||
+ "*.docm ; Word Open XML Macro-Enabled Document",
|
||||
+ "*.docx ; Microsoft Word Open XML Document",
|
||||
+ "*.bbs ; Bulletin Board System Text",
|
||||
+ "*.dat ; Data File",
|
||||
+ "*.xml ; XML File",
|
||||
+ "*.sql ; SQL database file",
|
||||
+ "*.json ; JavaScript Object Notation File",
|
||||
+ "*.html ; HyperText Markup Language"
|
||||
+ "*.cfg ; Configuration File"
|
||||
+ "*.ini ; Initialization File (same as .cfg Configuration File)"
|
||||
+ "*.csv ; Comma-separated values File"
|
||||
|
||||
#### Current version
|
||||
To check all the features included in the current version, please read the [VERSION file](./VERSION.md)
|
||||
|
||||
#### Upcoming features
|
||||
To check all the features I'm currently working on, please read the [TODO file](./TODO.md)
|
||||
|
||||
# Disclaimer
|
||||
This addon was built for a **personal use** intention. It was released as an open source plugin in the hope that it could be useful to the Godot Engine Community.
|
||||
As a "work in progress" project, there is *no warranty* for any eventual issue and bug that may broke your project.
|
||||
I don't assume any responsibility for possible corruptions of your project files. It is always advisable to keep a copy of your files and check any changes.
|
3
addons/file-editor/TODO.md
Normal file
@ -0,0 +1,3 @@
|
||||
### to do (v-0.x.x)
|
||||
- Popup dialog when closing a tab if there is new content
|
||||
- Module for markdown support/conversion
|
114
addons/file-editor/VERSION.md
Normal file
@ -0,0 +1,114 @@
|
||||
**version 0.0.1**
|
||||
*added*
|
||||
- Plugin Created
|
||||
|
||||
-----------------------
|
||||
|
||||
**version 0.1.1**
|
||||
*added*
|
||||
- "Create new File" option
|
||||
- "Open File" option
|
||||
- "Delete File" option
|
||||
- "Save File" option
|
||||
- "Save File As.." option
|
||||
|
||||
-----------------------
|
||||
|
||||
**version 0.1.2**
|
||||
*fixed*
|
||||
- Repository Installation, folder order
|
||||
|
||||
-----------------------
|
||||
|
||||
**version 0.2.5**
|
||||
*removed*
|
||||
- Old layout
|
||||
|
||||
*added*
|
||||
- New Layout
|
||||
- Last modified time and date
|
||||
- Tabs
|
||||
|
||||
-----------------------
|
||||
|
||||
**version 0.3.1**
|
||||
*added*
|
||||
- Version check
|
||||
- Preview support
|
||||
- Context menu in editor
|
||||
- BBCode converter
|
||||
- Light Mardkwon converter (DEMO)
|
||||
|
||||
-----------------------
|
||||
|
||||
**version 1.2.1**
|
||||
*removed*
|
||||
- Old layout, the plugin won't appear in docs
|
||||
- Icons file extensions, plugin size reduced
|
||||
- Old Mardkwon preview method
|
||||
|
||||
*added*
|
||||
- More supported files
|
||||
1. "*.dat ; Data File",
|
||||
2. "*.xml ; XML File",
|
||||
3. "*.sql ; SQL database file",
|
||||
4. "*.json ; JavaScript Object Notation File",
|
||||
5. "*.html ; HyperText Markup Language",
|
||||
- New Markdown preview method ( Markdown -> BBCode converter)
|
||||
- New HTML preview method ( HTML -> BBCode converter)
|
||||
- New Plugin Layout: a new ButtonTool "File" in you TopBar will appear
|
||||
- Error check
|
||||
- Message popups for closing unsaved files
|
||||
|
||||
-----------------------
|
||||
|
||||
**version 1.4.3**
|
||||
*removed*
|
||||
- Old layout
|
||||
|
||||
*added*
|
||||
- More supported files:
|
||||
1. "*.cfg ; Configuration File",
|
||||
2. "*.ini ; Initialization File (same as .cfg Configuration File)",
|
||||
- Added some sample files
|
||||
- Memorize system of last opened files
|
||||
- Added *Editor* button , you can now choose which editor to use:
|
||||
1. Vanilla Editor (simple text editor)
|
||||
2. Cfg/Ini Editor (table editor for Cfg/Ini files)
|
||||
Editors are automatically updated, so if you update a cfg/ini file in the Vanilla Editor it will be updated in the Cfg/Ini Editor, and viceversa
|
||||
- Added editor shorcuts:
|
||||
1. *Ctrl + N* (new file)
|
||||
2. *Ctrl + O* (open file)
|
||||
3. *Ctrl + Alt + C* (close file)
|
||||
4. *Ctrl + S* (save file)
|
||||
5. *Ctrl + Alt + S* (save file as...)
|
||||
6. *Ctrl + D* (delete file)
|
||||
7. *Ctrl + 1* (Vanilla Editor)
|
||||
8. *Ctrl + 3* (Cfg/Ini Editor)
|
||||
|
||||
-----------------------
|
||||
|
||||
**version 1.6.0**
|
||||
*fixed*
|
||||
- Each opened file now has own editor: unsaved changes are no longer erased if a new file is opened without saving the previous opened file
|
||||
|
||||
*added*
|
||||
- Custom Syntax Highlighting for each file type (.md, .cfg/.ini, .html, .bbs)
|
||||
- Characters counter in VanillaEditor
|
||||
- String searcher in VanillaEditor (with custom shortcut *Ctrl + F*)
|
||||
- String replacer in VanillaEditor (with custom shortcut *Ctrl + R*)
|
||||
|
||||
-----------------------
|
||||
|
||||
**version 1.6.4**
|
||||
*added*
|
||||
- CSV VisualEditor (shortcut *Ctrl+2*):
|
||||
- you can now read and edit CSV files which importing them as simple CSV files (and not translate file)
|
||||
- MiniMap drawer in VanillaEditor
|
||||
- SoftWrap / NoWrap in VanillaEditor
|
||||
- **Version 3.2alpha2 supported**
|
||||
|
||||
---------------------
|
||||
|
||||
**version 1.7.1**
|
||||
- several bug fixes
|
23
addons/file-editor/file.samples/sample.bbs
Normal file
@ -0,0 +1,23 @@
|
||||
[b]bolded text[/b]
|
||||
[i]italicized text[/i]
|
||||
[u]underlined text[/u]
|
||||
[s]strikethrough text[/s]
|
||||
[url]https://en.wikipedia.org[/url]
|
||||
[url=https://en.wikipedia.org]English Wikipedia[/url]
|
||||
[img]res://addons/file-editor/icon.png[/img]
|
||||
[code]monospaced text[/code]
|
||||
left [center]center[/center] [right]right[/right]
|
||||
|
||||
[center][wave amp=50 freq=10]oooooondaaaaaaaaa[/wave][/center]
|
||||
|
||||
[center][tornado amp=50 freq=10 radius=5]tornaaaaaadoooooo[/tornado][/center]
|
||||
|
||||
[center][shake rate=15 level=10]scossa[/shake][/center]
|
||||
|
||||
[center][fade start=4 length=14]Effetto fantasmaaaaaa[/fade][/center]
|
||||
|
||||
[center][rainbow freq=4 sat=10 val=100]Arcobaleno![/rainbow][/center]
|
||||
|
||||
[center][pulse freq=6.0 height=5.0][pulse color=#00FFAA freq=2.0]Questo è un codice custom![/pulse][/pulse][/center]
|
||||
|
||||
*Some md text in bb file*
|
33
addons/file-editor/file.samples/sample.cfg
Normal file
@ -0,0 +1,33 @@
|
||||
[Locale]
|
||||
|
||||
SecondLanguage="oh"
|
||||
Language="it"
|
||||
|
||||
[Version]
|
||||
|
||||
Minor="1"
|
||||
Micro="3"
|
||||
Major="5"
|
||||
|
||||
[Directories]
|
||||
|
||||
TempDir="C:UsersJonAppDataLocalAudacitySessionData"
|
||||
|
||||
[AudioIO]
|
||||
|
||||
RecordingDevice="Microphone (Blue Snowball)"
|
||||
Host="MME"
|
||||
PlaybackDevice="Speakers / Headphones (Realtek)"
|
||||
EffectsPreviewLen="6"
|
||||
CutPreviewBeforeLen="2"
|
||||
CutPreviewAfterLen="1"
|
||||
SeekShortPeriod="1"
|
||||
SeekLongPeriod="15"
|
||||
Duplex="1"
|
||||
SWPlaythrough="0"
|
||||
|
||||
[AnotherSection]
|
||||
|
||||
SectionName="ThisNewSection"
|
||||
SeconKey="SecondValue"
|
||||
|
9
addons/file-editor/file.samples/sample.csv
Normal file
@ -0,0 +1,9 @@
|
||||
COLUMN 1| |COLUMN2|COLUMN3|COLUMN5
|
||||
this is a| |csv file with empty spaces| |-
|
||||
anyway,|they are stored in| |the file|-
|
||||
this|is a |new|line|-
|
||||
line 5|and column 5|where created|with the editor|-
|
||||
-|-|-|-|-
|
||||
res|res|res||
|
||||
awew|aweawe|ewaewa
|
||||
|
|
9
addons/file-editor/file.samples/sample.html
Normal file
@ -0,0 +1,9 @@
|
||||
<b>bolded text</b>
|
||||
<i>italicized text</i>
|
||||
<ins>insnderlined text</ins>
|
||||
<del>deltrikethroinsgh text</del>
|
||||
<a>httpdel://en.wikipedia.org</a>
|
||||
<img src="res://addondel/file-editor/icon.png"/>
|
||||
<a href=https://en.wikipedia.org>Englidelh Wikipedia</a>
|
||||
<pre>monodelpaced text</pre>
|
||||
left <center>center</center> <right>right</right>
|
10
addons/file-editor/file.samples/sample.ini
Normal file
@ -0,0 +1,10 @@
|
||||
; last modified 1 April 2001 by John Doe
|
||||
[owner]
|
||||
name="John Doe"
|
||||
organization="Acme Widgets Inc."
|
||||
|
||||
[database]
|
||||
; use IP address in case network name resolution is not working
|
||||
server="192.0.2.62"
|
||||
port="143"
|
||||
file="payroll.dat"
|
16
addons/file-editor/file.samples/sample.md
Normal file
@ -0,0 +1,16 @@
|
||||
**bolded text**
|
||||
*italicized text*
|
||||
***bolded and italicized***
|
||||
~~strikethrough~~
|
||||
__underline__
|
||||
> This is a quote
|
||||
`this is some code`
|
||||
[link](http://example.com)
|
||||
![image](res://addons/file-editor/icon.png)
|
||||
|
||||
# header 1
|
||||
## header 2
|
||||
### header 3
|
||||
#### header 5
|
||||
##### header 6
|
||||
###### header7
|
1
addons/file-editor/file.samples/sample.txt
Normal file
@ -0,0 +1 @@
|
||||
This is a simple text file.
|
120
addons/file-editor/file.samples/sample.xml
Normal file
@ -0,0 +1,120 @@
|
||||
<?xml version="1.0"?>
|
||||
<catalog>
|
||||
<book id="bk101">
|
||||
<author>Gambardella, Matthew</author>
|
||||
<title>XML Developer's Guide</title>
|
||||
<genre>Computer</genre>
|
||||
<price>44.95</price>
|
||||
<publish_date>2000-10-01</publish_date>
|
||||
<description>An in-depth look at creating applications
|
||||
with XML.</description>
|
||||
</book>
|
||||
<book id="bk102">
|
||||
<author>Ralls, Kim</author>
|
||||
<title>Midnight Rain</title>
|
||||
<genre>Fantasy</genre>
|
||||
<price>5.95</price>
|
||||
<publish_date>2000-12-16</publish_date>
|
||||
<description>A former architect battles corporate zombies,
|
||||
an evil sorceress, and her own childhood to become queen
|
||||
of the world.</description>
|
||||
</book>
|
||||
<book id="bk103">
|
||||
<author>Corets, Eva</author>
|
||||
<title>Maeve Ascendant</title>
|
||||
<genre>Fantasy</genre>
|
||||
<price>5.95</price>
|
||||
<publish_date>2000-11-17</publish_date>
|
||||
<description>After the collapse of a nanotechnology
|
||||
society in England, the young survivors lay the
|
||||
foundation for a new society.</description>
|
||||
</book>
|
||||
<book id="bk104">
|
||||
<author>Corets, Eva</author>
|
||||
<title>Oberon's Legacy</title>
|
||||
<genre>Fantasy</genre>
|
||||
<price>5.95</price>
|
||||
<publish_date>2001-03-10</publish_date>
|
||||
<description>In post-apocalypse England, the mysterious
|
||||
agent known only as Oberon helps to create a new life
|
||||
for the inhabitants of London. Sequel to Maeve
|
||||
Ascendant.</description>
|
||||
</book>
|
||||
<book id="bk105">
|
||||
<author>Corets, Eva</author>
|
||||
<title>The Sundered Grail</title>
|
||||
<genre>Fantasy</genre>
|
||||
<price>5.95</price>
|
||||
<publish_date>2001-09-10</publish_date>
|
||||
<description>The two daughters of Maeve, half-sisters,
|
||||
battle one another for control of England. Sequel to
|
||||
Oberon's Legacy.</description>
|
||||
</book>
|
||||
<book id="bk106">
|
||||
<author>Randall, Cynthia</author>
|
||||
<title>Lover Birds</title>
|
||||
<genre>Romance</genre>
|
||||
<price>4.95</price>
|
||||
<publish_date>2000-09-02</publish_date>
|
||||
<description>When Carla meets Paul at an ornithology
|
||||
conference, tempers fly as feathers get ruffled.</description>
|
||||
</book>
|
||||
<book id="bk107">
|
||||
<author>Thurman, Paula</author>
|
||||
<title>Splish Splash</title>
|
||||
<genre>Romance</genre>
|
||||
<price>4.95</price>
|
||||
<publish_date>2000-11-02</publish_date>
|
||||
<description>A deep sea diver finds true love twenty
|
||||
thousand leagues beneath the sea.</description>
|
||||
</book>
|
||||
<book id="bk108">
|
||||
<author>Knorr, Stefan</author>
|
||||
<title>Creepy Crawlies</title>
|
||||
<genre>Horror</genre>
|
||||
<price>4.95</price>
|
||||
<publish_date>2000-12-06</publish_date>
|
||||
<description>An anthology of horror stories about roaches,
|
||||
centipedes, scorpions and other insects.</description>
|
||||
</book>
|
||||
<book id="bk109">
|
||||
<author>Kress, Peter</author>
|
||||
<title>Paradox Lost</title>
|
||||
<genre>Science Fiction</genre>
|
||||
<price>6.95</price>
|
||||
<publish_date>2000-11-02</publish_date>
|
||||
<description>After an inadvertant trip through a Heisenberg
|
||||
Uncertainty Device, James Salway discovers the problems
|
||||
of being quantum.</description>
|
||||
</book>
|
||||
<book id="bk110">
|
||||
<author>O'Brien, Tim</author>
|
||||
<title>Microsoft .NET: The Programming Bible</title>
|
||||
<genre>Computer</genre>
|
||||
<price>36.95</price>
|
||||
<publish_date>2000-12-09</publish_date>
|
||||
<description>Microsoft's .NET initiative is explored in
|
||||
detail in this deep programmer's reference.</description>
|
||||
</book>
|
||||
<book id="bk111">
|
||||
<author>O'Brien, Tim</author>
|
||||
<title>MSXML3: A Comprehensive Guide</title>
|
||||
<genre>Computer</genre>
|
||||
<price>36.95</price>
|
||||
<publish_date>2000-12-01</publish_date>
|
||||
<description>The Microsoft MSXML3 parser is covered in
|
||||
detail, with attention to XML DOM interfaces, XSLT processing,
|
||||
SAX and more.</description>
|
||||
</book>
|
||||
<book id="bk112">
|
||||
<author>Galos, Mike</author>
|
||||
<title>Visual Studio 7: A Comprehensive Guide</title>
|
||||
<genre>Computer</genre>
|
||||
<price>49.95</price>
|
||||
<publish_date>2001-04-16</publish_date>
|
||||
<description>Microsoft Visual Studio 7 is explored in depth,
|
||||
looking at how Visual Basic, Visual C++, C#, and ASP+ are
|
||||
integrated into a comprehensive development
|
||||
environment.</description>
|
||||
</book>
|
||||
</catalog>
|
BIN
addons/file-editor/fonts/COUR.TTF
Normal file
BIN
addons/file-editor/fonts/Carlito-Bold.ttf
Normal file
BIN
addons/file-editor/fonts/Carlito-BoldItalic.ttf
Normal file
BIN
addons/file-editor/fonts/Carlito-Italic.ttf
Normal file
BIN
addons/file-editor/fonts/Carlito-Regular.ttf
Normal file
BIN
addons/file-editor/fonts/Roboto-Black.ttf
Normal file
BIN
addons/file-editor/fonts/Roboto-Regular.ttf
Normal file
BIN
addons/file-editor/icon.psd
Normal file
BIN
addons/file-editor/icons.pngs/add.png.buttonicon
Normal file
After Width: | Height: | Size: 146 B |
BIN
addons/file-editor/icons.pngs/align.png.buttonicon
Normal file
After Width: | Height: | Size: 195 B |
BIN
addons/file-editor/icons.pngs/column.png.buttonicon
Normal file
After Width: | Height: | Size: 146 B |
BIN
addons/file-editor/icons.pngs/delete.png.buttonicon
Normal file
After Width: | Height: | Size: 183 B |
BIN
addons/file-editor/icons.pngs/edit.png.buttonicon
Normal file
After Width: | Height: | Size: 244 B |
BIN
addons/file-editor/icons.pngs/edit_.png.buttonicon
Normal file
After Width: | Height: | Size: 186 B |
BIN
addons/file-editor/icons.pngs/file.png.buttonicon
Normal file
After Width: | Height: | Size: 160 B |
BIN
addons/file-editor/icons.pngs/keys.png.buttonicon
Normal file
After Width: | Height: | Size: 222 B |
BIN
addons/file-editor/icons.pngs/new.png.buttonicon
Normal file
After Width: | Height: | Size: 180 B |
BIN
addons/file-editor/icons.pngs/read.png.buttonicon
Normal file
After Width: | Height: | Size: 286 B |
BIN
addons/file-editor/icons.pngs/remove.png.buttonicon
Normal file
After Width: | Height: | Size: 226 B |
BIN
addons/file-editor/icons.pngs/row.png.buttonicon
Normal file
After Width: | Height: | Size: 150 B |
BIN
addons/file-editor/icons.pngs/save.png.buttonicon
Normal file
After Width: | Height: | Size: 236 B |
BIN
addons/file-editor/icons.pngs/saveas.png.buttonicon
Normal file
After Width: | Height: | Size: 250 B |
BIN
addons/file-editor/icons.pngs/section.png.buttonicon
Normal file
After Width: | Height: | Size: 178 B |
BIN
addons/file-editor/icons.pngs/sections.png.buttonicon
Normal file
After Width: | Height: | Size: 141 B |
BIN
addons/file-editor/icons.pngs/text-center.png.buttonicon
Normal file
After Width: | Height: | Size: 156 B |
BIN
addons/file-editor/icons.pngs/text-fill.png.buttonicon
Normal file
After Width: | Height: | Size: 142 B |
BIN
addons/file-editor/icons.pngs/text-left.png.buttonicon
Normal file
After Width: | Height: | Size: 154 B |
BIN
addons/file-editor/icons.pngs/text-right.png.buttonicon
Normal file
After Width: | Height: | Size: 154 B |
13
addons/file-editor/lastopenedfiles.lastcfg
Normal file
@ -0,0 +1,13 @@
|
||||
[Opened]
|
||||
|
||||
sample.bbs="res://addons/file-editor/file.samples/sample.bbs"
|
||||
sample.cfg="res://addons/file-editor/file.samples/sample.cfg"
|
||||
sample.csv="res://addons/file-editor/file.samples/sample.csv"
|
||||
sample.html="res://addons/file-editor/file.samples/sample.html"
|
||||
sample.ini="res://addons/file-editor/file.samples/sample.ini"
|
||||
sample.md="res://addons/file-editor/file.samples/sample.md"
|
||||
sample.txt="res://addons/file-editor/file.samples/sample.txt"
|
||||
datas_on_columns.csv="res://addons/easy_charts/file.samples/datas_on_columns.csv"
|
||||
radar.csv="res://addons/easy_charts/file.samples/radar.csv"
|
||||
godot_engine_italia_jam#2.csv="res://addons/easy_charts/file.samples/godot_engine_italia_jam#2.csv"
|
||||
gei_jam#2columns.csv="res://addons/easy_charts/file.samples/gei_jam#2columns.csv"
|
7
addons/file-editor/plugin.cfg
Normal file
@ -0,0 +1,7 @@
|
||||
[plugin]
|
||||
|
||||
name="File Editor"
|
||||
description="An internal file editor to view and edit text files in your project folder."
|
||||
author="Nicolo 'fenix' Santilio"
|
||||
version="1.7.3"
|
||||
script="scripts/file-editor.gd"
|
406
addons/file-editor/scenes/CsvEditor.tscn
Normal file
@ -0,0 +1,406 @@
|
||||
[gd_scene load_steps=36 format=2]
|
||||
|
||||
[ext_resource path="res://addons/file-editor/scripts/CsvEditor.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/file-editor/fonts/Roboto-Black.ttf" type="DynamicFontData" id=2]
|
||||
|
||||
[sub_resource type="Image" id=34]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 48, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 80, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 191, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=2]
|
||||
image = SubResource( 34 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=35]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=4]
|
||||
image = SubResource( 35 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=36]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=6]
|
||||
image = SubResource( 36 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=37]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=8]
|
||||
image = SubResource( 37 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=38]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=10]
|
||||
image = SubResource( 38 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=39]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 239, 224, 224, 224, 239, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 80, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=12]
|
||||
image = SubResource( 39 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=40]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=14]
|
||||
image = SubResource( 40 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=41]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=16]
|
||||
image = SubResource( 41 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=42]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 207, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 223, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 207, 224, 224, 224, 48, 224, 224, 224, 48, 224, 224, 224, 191, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 32, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 32, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 191, 224, 224, 224, 16, 224, 224, 224, 16, 224, 224, 224, 159, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 223, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 239, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 64, 224, 224, 224, 239, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 239, 224, 224, 224, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=18]
|
||||
image = SubResource( 42 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=43]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 239, 224, 224, 224, 239, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 80, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=20]
|
||||
image = SubResource( 43 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=21]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=22]
|
||||
|
||||
[sub_resource type="Image" id=44]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 80, 224, 224, 224, 206, 224, 224, 224, 238, 224, 224, 224, 238, 224, 224, 224, 174, 224, 224, 224, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 206, 224, 224, 224, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 238, 224, 224, 224, 254, 224, 224, 224, 206, 224, 224, 224, 112, 224, 224, 224, 16, 224, 224, 224, 16, 224, 224, 224, 80, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 222, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 96, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 64, 224, 224, 224, 206, 224, 224, 224, 222, 224, 224, 224, 64, 0, 0, 0, 0, 224, 224, 224, 96, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 32, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 16, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 222, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 126, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 64, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 80, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 126, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 190, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 206, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 64, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 112, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 206, 224, 224, 224, 126, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=24]
|
||||
image = SubResource( 44 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=45]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 44, 59, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 44, 59, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 44, 59, 174, 37, 44, 59, 254, 37, 44, 59, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 44, 59, 64, 37, 44, 59, 254, 37, 44, 59, 174, 0, 0, 0, 0, 0, 0, 0, 0, 37, 44, 59, 126, 37, 44, 59, 254, 37, 44, 59, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 44, 59, 190, 37, 44, 59, 254, 37, 44, 59, 126, 0, 0, 0, 0, 0, 0, 0, 0, 37, 44, 59, 16, 37, 44, 59, 222, 37, 44, 59, 254, 37, 44, 59, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 44, 59, 16, 37, 44, 59, 158, 37, 44, 59, 254, 37, 44, 59, 238, 37, 44, 59, 16, 0, 0, 0, 0, 0, 0, 0, 0, 37, 44, 59, 16, 37, 44, 59, 190, 37, 44, 59, 254, 37, 44, 59, 254, 37, 44, 59, 206, 37, 44, 59, 96, 0, 0, 0, 0, 37, 44, 59, 16, 37, 44, 59, 64, 37, 44, 59, 206, 37, 44, 59, 254, 37, 44, 59, 254, 37, 44, 59, 222, 37, 44, 59, 16, 0, 0, 0, 0, 0, 0, 0, 0, 37, 44, 59, 16, 37, 44, 59, 206, 37, 44, 59, 206, 37, 44, 59, 222, 37, 44, 59, 254, 37, 44, 59, 254, 37, 44, 59, 254, 37, 44, 59, 254, 37, 44, 59, 254, 37, 44, 59, 254, 37, 44, 59, 238, 37, 44, 59, 222, 37, 44, 59, 206, 37, 44, 59, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 44, 59, 16, 37, 44, 59, 32, 0, 0, 0, 0, 37, 44, 59, 112, 37, 44, 59, 206, 37, 44, 59, 254, 37, 44, 59, 254, 37, 44, 59, 206, 37, 44, 59, 112, 37, 44, 59, 16, 37, 44, 59, 16, 37, 44, 59, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 44, 59, 254, 37, 44, 59, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=26]
|
||||
image = SubResource( 45 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=27]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=28]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=29]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=30]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=31]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=32]
|
||||
|
||||
[sub_resource type="DynamicFont" id=33]
|
||||
font_data = ExtResource( 2 )
|
||||
|
||||
[node name="CsvEditor" type="Control"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_vertical = 3
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Editor" type="VBoxContainer" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_horizontal = 3
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Buttons" type="HBoxContainer" parent="Editor"]
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 22.0
|
||||
|
||||
[node name="align_bt" type="MenuButton" parent="Editor/Buttons"]
|
||||
margin_right = 63.0
|
||||
margin_bottom = 22.0
|
||||
text = "Align"
|
||||
icon = SubResource( 2 )
|
||||
items = [ "Left", SubResource( 4 ), 0, false, false, 0, 0, null, "", false, "Center", SubResource( 6 ), 0, false, false, 1, 0, null, "", false, "Right", SubResource( 8 ), 0, false, false, 2, 0, null, "", false, "Fill", SubResource( 10 ), 0, false, false, 3, 0, null, "", false ]
|
||||
|
||||
[node name="edit_bt" type="MenuButton" parent="Editor/Buttons"]
|
||||
margin_left = 67.0
|
||||
margin_right = 122.0
|
||||
margin_bottom = 22.0
|
||||
text = "Edit"
|
||||
icon = SubResource( 12 )
|
||||
items = [ "Add Line", SubResource( 14 ), 0, false, false, 0, 0, null, "", false, "Add Column", SubResource( 16 ), 0, false, false, 1, 0, null, "", false, "", null, 0, false, false, 2, 0, null, "", true, "Save", SubResource( 18 ), 0, false, false, 3, 0, null, "", false ]
|
||||
|
||||
[node name="options_btn" type="MenuButton" parent="Editor/Buttons"]
|
||||
margin_left = 126.0
|
||||
margin_right = 208.0
|
||||
margin_bottom = 22.0
|
||||
text = "Options"
|
||||
icon = SubResource( 20 )
|
||||
items = [ "Change Delimiter", null, 0, false, false, 0, 0, null, "", false ]
|
||||
|
||||
[node name="Horizontal" type="HBoxContainer" parent="Editor"]
|
||||
margin_top = 26.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 26.0
|
||||
|
||||
[node name="TableContainer" type="HBoxContainer" parent="Editor"]
|
||||
margin_top = 30.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 577.0
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="Vertical" type="VBoxContainer" parent="Editor/TableContainer"]
|
||||
margin_bottom = 547.0
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="Editor/TableContainer"]
|
||||
margin_left = 4.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 547.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
scroll_horizontal_enabled = false
|
||||
|
||||
[node name="Table" type="GridContainer" parent="Editor/TableContainer/ScrollContainer"]
|
||||
margin_right = 1020.0
|
||||
margin_bottom = 547.0
|
||||
size_flags_horizontal = 7
|
||||
size_flags_vertical = 3
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="FileInfo" type="HBoxContainer" parent="Editor"]
|
||||
margin_top = 581.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 600.0
|
||||
custom_constants/separation = 0
|
||||
|
||||
[node name="Label" type="Label" parent="Editor/FileInfo"]
|
||||
margin_right = 81.0
|
||||
margin_bottom = 14.0
|
||||
size_flags_horizontal = 0
|
||||
size_flags_vertical = 0
|
||||
text = "Dimensions:"
|
||||
|
||||
[node name="rows2" type="Label" parent="Editor/FileInfo"]
|
||||
margin_left = 81.0
|
||||
margin_right = 119.0
|
||||
margin_bottom = 14.0
|
||||
size_flags_horizontal = 0
|
||||
size_flags_vertical = 0
|
||||
custom_colors/font_color = Color( 0.501961, 0.501961, 0.501961, 1 )
|
||||
text = "(rows)"
|
||||
align = 3
|
||||
|
||||
[node name="rows" type="Label" parent="Editor/FileInfo"]
|
||||
margin_left = 119.0
|
||||
margin_right = 127.0
|
||||
margin_bottom = 14.0
|
||||
size_flags_horizontal = 0
|
||||
size_flags_vertical = 0
|
||||
text = "n"
|
||||
align = 3
|
||||
|
||||
[node name="Label2" type="Label" parent="Editor/FileInfo"]
|
||||
margin_left = 127.0
|
||||
margin_right = 134.0
|
||||
margin_bottom = 14.0
|
||||
size_flags_horizontal = 0
|
||||
size_flags_vertical = 0
|
||||
text = "x"
|
||||
align = 3
|
||||
|
||||
[node name="columns" type="Label" parent="Editor/FileInfo"]
|
||||
margin_left = 134.0
|
||||
margin_right = 142.0
|
||||
margin_bottom = 14.0
|
||||
size_flags_horizontal = 0
|
||||
size_flags_vertical = 0
|
||||
text = "n"
|
||||
align = 3
|
||||
|
||||
[node name="columns2" type="Label" parent="Editor/FileInfo"]
|
||||
margin_left = 142.0
|
||||
margin_right = 205.0
|
||||
margin_bottom = 14.0
|
||||
size_flags_horizontal = 0
|
||||
size_flags_vertical = 0
|
||||
custom_colors/font_color = Color( 0.501961, 0.501961, 0.501961, 1 )
|
||||
text = "(columns)"
|
||||
align = 3
|
||||
|
||||
[node name="VSeparator" type="VSeparator" parent="Editor/FileInfo"]
|
||||
margin_left = 205.0
|
||||
margin_right = 230.0
|
||||
margin_bottom = 3.0
|
||||
rect_min_size = Vector2( 25, 0 )
|
||||
size_flags_horizontal = 0
|
||||
size_flags_vertical = 0
|
||||
custom_styles/separator = SubResource( 21 )
|
||||
|
||||
[node name="Label3" type="Label" parent="Editor/FileInfo"]
|
||||
margin_left = 230.0
|
||||
margin_right = 295.0
|
||||
margin_bottom = 14.0
|
||||
size_flags_horizontal = 0
|
||||
size_flags_vertical = 0
|
||||
text = "Delimiter:"
|
||||
|
||||
[node name="delimiter" type="Label" parent="Editor/FileInfo"]
|
||||
margin_left = 295.0
|
||||
margin_top = 2.0
|
||||
margin_right = 302.0
|
||||
margin_bottom = 16.0
|
||||
size_flags_horizontal = 0
|
||||
custom_styles/normal = SubResource( 22 )
|
||||
custom_colors/font_color = Color( 0.176471, 0.85098, 0.337255, 1 )
|
||||
text = "|"
|
||||
|
||||
[node name="TextureButton" type="TextureButton" parent="Editor/FileInfo"]
|
||||
margin_left = 945.0
|
||||
margin_right = 945.0
|
||||
margin_bottom = 19.0
|
||||
size_flags_horizontal = 10
|
||||
|
||||
[node name="Readonly" type="CheckBox" parent="Editor/FileInfo"]
|
||||
margin_left = 945.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 19.0
|
||||
size_flags_horizontal = 8
|
||||
size_flags_vertical = 0
|
||||
custom_icons/checked = SubResource( 24 )
|
||||
custom_icons/unchecked = SubResource( 26 )
|
||||
custom_styles/hover = SubResource( 27 )
|
||||
custom_styles/pressed = SubResource( 28 )
|
||||
custom_styles/focus = SubResource( 29 )
|
||||
custom_styles/disabled = SubResource( 30 )
|
||||
custom_styles/hover_pressed = SubResource( 31 )
|
||||
custom_styles/normal = SubResource( 32 )
|
||||
custom_fonts/font = SubResource( 33 )
|
||||
custom_colors/font_color = Color( 0.145098, 0.172549, 0.231373, 1 )
|
||||
custom_colors/font_color_pressed = Color( 1, 1, 1, 1 )
|
||||
text = "Can Edit"
|
||||
flat = true
|
||||
|
||||
[node name="ChangeDelimiterDialog" type="AcceptDialog" parent="."]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
margin_left = -120.0
|
||||
margin_top = -52.0
|
||||
margin_right = 120.0
|
||||
margin_bottom = 52.0
|
||||
window_title = "Change Delimiter"
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="ChangeDelimiterDialog"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 8.0
|
||||
margin_top = 8.0
|
||||
margin_right = -8.0
|
||||
margin_bottom = -36.0
|
||||
alignment = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Label" type="Label" parent="ChangeDelimiterDialog/VBoxContainer"]
|
||||
margin_top = 9.0
|
||||
margin_right = 224.0
|
||||
margin_bottom = 23.0
|
||||
text = "Enter a delimiter you want to use:"
|
||||
align = 1
|
||||
autowrap = true
|
||||
|
||||
[node name="delim_read" type="LineEdit" parent="ChangeDelimiterDialog/VBoxContainer"]
|
||||
margin_top = 27.0
|
||||
margin_right = 224.0
|
||||
margin_bottom = 51.0
|
286
addons/file-editor/scenes/FileEditor.tscn
Normal file
@ -0,0 +1,286 @@
|
||||
[gd_scene load_steps=19 format=2]
|
||||
|
||||
[ext_resource path="res://addons/file-editor/scripts/FileEditor.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/file-editor/fonts/Roboto-Black.ttf" type="DynamicFontData" id=2]
|
||||
|
||||
[sub_resource type="Image" id=17]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=2]
|
||||
image = SubResource( 17 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=18]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 239, 224, 224, 224, 239, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 80, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=4]
|
||||
image = SubResource( 18 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=19]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 80, 224, 224, 224, 206, 224, 224, 224, 238, 224, 224, 224, 238, 224, 224, 224, 174, 224, 224, 224, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 206, 224, 224, 224, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 238, 224, 224, 224, 254, 224, 224, 224, 206, 224, 224, 224, 112, 224, 224, 224, 16, 224, 224, 224, 16, 224, 224, 224, 80, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 222, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 96, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 64, 224, 224, 224, 206, 224, 224, 224, 222, 224, 224, 224, 64, 0, 0, 0, 0, 224, 224, 224, 96, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 32, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 16, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 222, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 126, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 64, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 80, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 126, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 190, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 206, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 64, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 112, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 206, 224, 224, 224, 126, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=6]
|
||||
image = SubResource( 19 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="DynamicFont" id=7]
|
||||
size = 13
|
||||
font_data = ExtResource( 2 )
|
||||
|
||||
[sub_resource type="Image" id=20]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=9]
|
||||
image = SubResource( 20 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=21]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=11]
|
||||
image = SubResource( 21 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=22]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=13]
|
||||
image = SubResource( 22 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=23]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=15]
|
||||
image = SubResource( 23 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=16]
|
||||
|
||||
[node name="FileEditor" type="Control"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 7.0
|
||||
margin_right = -6.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="FileEditorContainer" type="VBoxContainer" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 6.0
|
||||
margin_right = -5.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="TobBar" type="HBoxContainer" parent="FileEditorContainer"]
|
||||
margin_right = 1000.0
|
||||
margin_bottom = 22.0
|
||||
|
||||
[node name="file_btn" type="MenuButton" parent="FileEditorContainer/TobBar"]
|
||||
margin_right = 54.0
|
||||
margin_bottom = 22.0
|
||||
text = "File"
|
||||
icon = SubResource( 2 )
|
||||
items = [ "New File", null, 0, false, false, 0, 268435534, null, "", false, "Open File", null, 0, false, false, 1, 268435535, null, "", false, "Close File", null, 0, false, false, 2, 335544387, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Save File", null, 0, false, false, 3, 268435539, null, "", false, "Save File as...", null, 0, false, false, 4, 335544403, null, "", false, "Delete File", null, 0, false, false, 5, 268435524, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Search in file...", null, 0, false, false, 6, 268435526, null, "", false, "Replace occurencies", null, 0, false, false, 7, 268435538, null, "", false ]
|
||||
|
||||
[node name="editor_btn" type="MenuButton" parent="FileEditorContainer/TobBar"]
|
||||
margin_left = 58.0
|
||||
margin_right = 126.0
|
||||
margin_bottom = 22.0
|
||||
text = "Editor"
|
||||
icon = SubResource( 4 )
|
||||
items = [ "Vanilla Editor", null, 0, false, false, 0, 268435505, null, "", false, "CSV Editor", null, 0, false, false, 1, 268435506, null, "", false, "CFG/INI Editor", null, 0, false, false, 2, 268435507, null, "", false ]
|
||||
|
||||
[node name="preview_btn" type="MenuButton" parent="FileEditorContainer/TobBar"]
|
||||
margin_left = 130.0
|
||||
margin_right = 211.0
|
||||
margin_bottom = 22.0
|
||||
text = "Preview"
|
||||
icon = SubResource( 6 )
|
||||
items = [ "BBCode Preview", null, 0, false, false, 0, 0, null, "", false, "Markdown Preview", null, 0, false, false, 1, 0, null, "", false, "HTML Preview", null, 0, false, false, 2, 0, null, "", false, "CSV Preview [coming soon]", null, 0, false, true, 3, 0, null, "", false, "XML Preview [coming soon]", null, 0, false, true, 4, 0, null, "", false, "JSON Preview [coming soon]", null, 0, false, true, 5, 0, null, "", false ]
|
||||
|
||||
[node name="version" type="Label" parent="FileEditorContainer/TobBar"]
|
||||
margin_left = 953.0
|
||||
margin_top = 2.0
|
||||
margin_right = 1000.0
|
||||
margin_bottom = 19.0
|
||||
size_flags_horizontal = 10
|
||||
custom_fonts/font = SubResource( 7 )
|
||||
custom_colors/font_color = Color( 0.121569, 0.145098, 0.192157, 1 )
|
||||
text = "v1.7.11"
|
||||
align = 1
|
||||
|
||||
[node name="SplitContainer" type="HSplitContainer" parent="FileEditorContainer"]
|
||||
margin_top = 26.0
|
||||
margin_right = 1000.0
|
||||
margin_bottom = 600.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
split_offset = 150
|
||||
|
||||
[node name="FileContainer" type="VBoxContainer" parent="FileEditorContainer/SplitContainer"]
|
||||
margin_right = 153.0
|
||||
margin_bottom = 574.0
|
||||
|
||||
[node name="OpenFileList" type="ItemList" parent="FileEditorContainer/SplitContainer/FileContainer"]
|
||||
margin_right = 153.0
|
||||
margin_bottom = 570.0
|
||||
size_flags_vertical = 3
|
||||
items = [ "README.md", SubResource( 9 ), false, "sample.cfg", SubResource( 11 ), false, "data2.csv", SubResource( 13 ), false, "text.txt", SubResource( 15 ), false ]
|
||||
allow_reselect = true
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="FileEditorContainer/SplitContainer/FileContainer"]
|
||||
margin_top = 574.0
|
||||
margin_right = 153.0
|
||||
margin_bottom = 574.0
|
||||
rect_min_size = Vector2( 2, 0 )
|
||||
custom_styles/separator = SubResource( 16 )
|
||||
custom_constants/separation = 0
|
||||
|
||||
[node name="EditorContainer" type="VBoxContainer" parent="FileEditorContainer/SplitContainer"]
|
||||
margin_left = 165.0
|
||||
margin_right = 1000.0
|
||||
margin_bottom = 574.0
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="FileEditorContainer/SplitContainer/EditorContainer"]
|
||||
margin_right = 835.0
|
||||
margin_bottom = 24.0
|
||||
|
||||
[node name="Label" type="Label" parent="FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer"]
|
||||
margin_top = 5.0
|
||||
margin_right = 71.0
|
||||
margin_bottom = 19.0
|
||||
text = "Editing file:"
|
||||
|
||||
[node name="OpenFileName" type="LineEdit" parent="FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer"]
|
||||
margin_left = 75.0
|
||||
margin_right = 653.0
|
||||
margin_bottom = 24.0
|
||||
mouse_filter = 1
|
||||
size_flags_horizontal = 3
|
||||
text = "res://text.txt"
|
||||
editable = false
|
||||
|
||||
[node name="wrap_button" type="OptionButton" parent="FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer"]
|
||||
margin_left = 657.0
|
||||
margin_right = 741.0
|
||||
margin_bottom = 24.0
|
||||
text = "No Wrap"
|
||||
items = [ "No Wrap", null, false, 0, null, "Soft Wrap", null, false, 1, null ]
|
||||
selected = 0
|
||||
|
||||
[node name="map_button" type="OptionButton" parent="FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer"]
|
||||
margin_left = 745.0
|
||||
margin_right = 835.0
|
||||
margin_bottom = 24.0
|
||||
text = "Hide Map"
|
||||
items = [ "Hide Map", null, false, 0, null, "Show Map", null, false, 1, null ]
|
||||
selected = 0
|
||||
|
||||
[node name="FileList" type="FileDialog" parent="."]
|
||||
margin_top = 24.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 600.0
|
||||
size_flags_vertical = 3
|
||||
popup_exclusive = true
|
||||
window_title = "Salva un file"
|
||||
dialog_hide_on_ok = true
|
||||
filters = PoolStringArray( "*.txt ; Plain Text File", "*.rtf ; Rich Text Format File", "*.log ; Log File", "*.md ; MD File", "*.doc ; WordPad Document", "*.doc ; Microsoft Word Document", "*.docm ; Word Open XML Macro-Enabled Document", "*.docx ; Microsoft Word Open XML Document", "*.bbs ; Bulletin Board System Text", "*.dat ; Data File", "*.xml ; XML File", "*.sql ; SQL database file", "*.json ; JavaScript Object Notation File", "*.html ; HyperText Markup Language", "*.csv ; Comma-separated values", "*.cfg ; Configuration File", "*.ini ; Initialization File (same as .cfg Configuration File)", "*.csv ; Comma-separated values File" )
|
||||
|
||||
[node name="NewFileDialogue" type="AcceptDialog" parent="."]
|
||||
margin_left = 348.254
|
||||
margin_top = 232.623
|
||||
margin_right = 644.254
|
||||
margin_bottom = 321.623
|
||||
window_title = "Create new File"
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="NewFileDialogue"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 8.0
|
||||
margin_top = 8.0
|
||||
margin_right = -8.0
|
||||
margin_bottom = -36.0
|
||||
|
||||
[node name="Label" type="Label" parent="NewFileDialogue/VBoxContainer"]
|
||||
margin_right = 280.0
|
||||
margin_bottom = 16.0
|
||||
size_flags_vertical = 3
|
||||
text = "Insert file name (no extension needed)"
|
||||
align = 1
|
||||
valign = 1
|
||||
|
||||
[node name="new_filename" type="LineEdit" parent="NewFileDialogue/VBoxContainer"]
|
||||
margin_left = 40.0
|
||||
margin_top = 20.0
|
||||
margin_right = 240.0
|
||||
margin_bottom = 44.0
|
||||
rect_min_size = Vector2( 200, 0 )
|
||||
size_flags_horizontal = 6
|
||||
size_flags_vertical = 3
|
||||
clear_button_enabled = true
|
||||
placeholder_text = "example"
|
||||
|
||||
[node name="ConfirmationDialog" type="ConfirmationDialog" parent="."]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
margin_left = -323.5
|
||||
margin_top = -37.5
|
||||
margin_right = 323.5
|
||||
margin_bottom = 37.5
|
||||
window_title = "Unsaved changes"
|
||||
dialog_text = "There are some unsaved changes.
|
||||
Press \"OK\" if you want to close this tab anyway, or \"cancel\" if you want to keep on editing your file."
|
324
addons/file-editor/scenes/FileEditor.tscn.tmp
Normal file
@ -0,0 +1,324 @@
|
||||
[gd_scene load_steps=25 format=2]
|
||||
|
||||
[ext_resource path="res://addons/file-editor/scripts/FileEditor.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/file-editor/fonts/Roboto-Black.ttf" type="DynamicFontData" id=2]
|
||||
|
||||
[sub_resource type="Image" id=23]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=2]
|
||||
image = SubResource( 23 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=24]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 239, 224, 224, 224, 239, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 80, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=4]
|
||||
image = SubResource( 24 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=25]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 80, 224, 224, 224, 206, 224, 224, 224, 238, 224, 224, 224, 238, 224, 224, 224, 174, 224, 224, 224, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 206, 224, 224, 224, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 238, 224, 224, 224, 254, 224, 224, 224, 206, 224, 224, 224, 112, 224, 224, 224, 16, 224, 224, 224, 16, 224, 224, 224, 80, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 222, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 96, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 64, 224, 224, 224, 206, 224, 224, 224, 222, 224, 224, 224, 64, 0, 0, 0, 0, 224, 224, 224, 96, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 32, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 16, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 222, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 126, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 64, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 80, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 126, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 190, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 206, 224, 224, 224, 96, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 64, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 112, 224, 224, 224, 206, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 206, 224, 224, 224, 126, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=6]
|
||||
image = SubResource( 25 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="DynamicFont" id=7]
|
||||
size = 13
|
||||
font_data = ExtResource( 2 )
|
||||
|
||||
[sub_resource type="Image" id=26]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=9]
|
||||
image = SubResource( 26 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=27]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=11]
|
||||
image = SubResource( 27 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=28]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=13]
|
||||
image = SubResource( 28 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=29]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=15]
|
||||
image = SubResource( 29 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=30]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=17]
|
||||
image = SubResource( 30 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=31]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=19]
|
||||
image = SubResource( 31 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=32]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=21]
|
||||
image = SubResource( 32 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=22]
|
||||
|
||||
[node name="FileEditor" type="Control"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 7.0
|
||||
margin_right = -6.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="FileEditorContainer" type="VBoxContainer" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 6.0
|
||||
margin_right = -5.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="TobBar" type="HBoxContainer" parent="FileEditorContainer"]
|
||||
margin_right = 1000.0
|
||||
margin_bottom = 22.0
|
||||
|
||||
[node name="file_btn" type="MenuButton" parent="FileEditorContainer/TobBar"]
|
||||
margin_right = 54.0
|
||||
margin_bottom = 22.0
|
||||
text = "File"
|
||||
icon = SubResource( 2 )
|
||||
items = [ "New File", null, 0, false, false, 0, 268435534, null, "", false, "Open File", null, 0, false, false, 1, 268435535, null, "", false, "Close File", null, 0, false, false, 2, 335544387, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Save File", null, 0, false, false, 3, 268435539, null, "", false, "Save File as...", null, 0, false, false, 4, 335544403, null, "", false, "Delete File", null, 0, false, false, 5, 268435524, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Search in file...", null, 0, false, false, 6, 268435526, null, "", false, "Replace occurencies", null, 0, false, false, 7, 268435538, null, "", false ]
|
||||
|
||||
[node name="editor_btn" type="MenuButton" parent="FileEditorContainer/TobBar"]
|
||||
margin_left = 58.0
|
||||
margin_right = 126.0
|
||||
margin_bottom = 22.0
|
||||
text = "Editor"
|
||||
icon = SubResource( 4 )
|
||||
items = [ "Vanilla Editor", null, 0, false, false, 0, 268435505, null, "", false, "CSV Editor", null, 0, false, false, 1, 268435506, null, "", false, "CFG/INI Editor", null, 0, false, false, 2, 268435507, null, "", false ]
|
||||
|
||||
[node name="preview_btn" type="MenuButton" parent="FileEditorContainer/TobBar"]
|
||||
margin_left = 130.0
|
||||
margin_right = 211.0
|
||||
margin_bottom = 22.0
|
||||
text = "Preview"
|
||||
icon = SubResource( 6 )
|
||||
items = [ "BBCode Preview", null, 0, false, false, 0, 0, null, "", false, "Markdown Preview", null, 0, false, false, 1, 0, null, "", false, "HTML Preview", null, 0, false, false, 2, 0, null, "", false, "XML Preview", null, 0, false, false, 4, 0, null, "", false, "JSON Preview", null, 0, false, false, 5, 0, null, "", false ]
|
||||
|
||||
[node name="version" type="Label" parent="FileEditorContainer/TobBar"]
|
||||
margin_left = 961.0
|
||||
margin_top = 2.0
|
||||
margin_right = 1000.0
|
||||
margin_bottom = 19.0
|
||||
size_flags_horizontal = 10
|
||||
custom_fonts/font = SubResource( 7 )
|
||||
custom_colors/font_color = Color( 0.121569, 0.145098, 0.192157, 1 )
|
||||
text = "v1.6.2"
|
||||
align = 1
|
||||
|
||||
[node name="SplitContainer" type="HSplitContainer" parent="FileEditorContainer"]
|
||||
margin_top = 26.0
|
||||
margin_right = 1000.0
|
||||
margin_bottom = 600.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
split_offset = 150
|
||||
|
||||
[node name="FileContainer" type="VBoxContainer" parent="FileEditorContainer/SplitContainer"]
|
||||
margin_right = 153.0
|
||||
margin_bottom = 574.0
|
||||
|
||||
[node name="OpenFileList" type="ItemList" parent="FileEditorContainer/SplitContainer/FileContainer"]
|
||||
margin_right = 153.0
|
||||
margin_bottom = 570.0
|
||||
size_flags_vertical = 3
|
||||
items = [ "sample.md", SubResource( 9 ), false, "sample.bbs", SubResource( 11 ), false, "sample.ini", SubResource( 13 ), false, "sample.cfg", SubResource( 15 ), false, "sample.csv", SubResource( 17 ), false, "sample.txt", SubResource( 19 ), false, "sample.html", SubResource( 21 ), false ]
|
||||
allow_reselect = true
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="FileEditorContainer/SplitContainer/FileContainer"]
|
||||
margin_top = 574.0
|
||||
margin_right = 153.0
|
||||
margin_bottom = 574.0
|
||||
rect_min_size = Vector2( 2, 0 )
|
||||
custom_styles/separator = SubResource( 22 )
|
||||
custom_constants/separation = 0
|
||||
|
||||
[node name="EditorContainer" type="VBoxContainer" parent="FileEditorContainer/SplitContainer"]
|
||||
margin_left = 165.0
|
||||
margin_right = 1000.0
|
||||
margin_bottom = 574.0
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="FileEditorContainer/SplitContainer/EditorContainer"]
|
||||
margin_right = 835.0
|
||||
margin_bottom = 24.0
|
||||
|
||||
[node name="Label" type="Label" parent="FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer"]
|
||||
margin_top = 5.0
|
||||
margin_right = 71.0
|
||||
margin_bottom = 19.0
|
||||
text = "Editing file:"
|
||||
|
||||
[node name="OpenFileName" type="LineEdit" parent="FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer"]
|
||||
margin_left = 75.0
|
||||
margin_right = 629.0
|
||||
margin_bottom = 24.0
|
||||
mouse_filter = 1
|
||||
size_flags_horizontal = 3
|
||||
text = "res://addons/file-editor/file.samples/sample.html"
|
||||
editable = false
|
||||
|
||||
[node name="wrap_button" type="OptionButton" parent="FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer"]
|
||||
margin_left = 633.0
|
||||
margin_right = 729.0
|
||||
margin_bottom = 24.0
|
||||
text = "No Wrap"
|
||||
items = [ "No Wrap", null, false, 0, null, "Soft Wrap", null, false, 1, null ]
|
||||
selected = 0
|
||||
|
||||
[node name="map_button" type="OptionButton" parent="FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer"]
|
||||
margin_left = 733.0
|
||||
margin_right = 835.0
|
||||
margin_bottom = 24.0
|
||||
text = "Hide Map"
|
||||
items = [ "Hide Map", null, false, 0, null, "Show Map", null, false, 1, null ]
|
||||
selected = 0
|
||||
|
||||
[node name="FileList" type="FileDialog" parent="."]
|
||||
margin_top = 24.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 600.0
|
||||
size_flags_vertical = 3
|
||||
popup_exclusive = true
|
||||
dialog_hide_on_ok = true
|
||||
filters = PoolStringArray( "*.txt ; Plain Text File", "*.rtf ; Rich Text Format File", "*.log ; Log File", "*.md ; MD File", "*.doc ; WordPad Document", "*.doc ; Microsoft Word Document", "*.docm ; Word Open XML Macro-Enabled Document", "*.docx ; Microsoft Word Open XML Document", "*.bbs ; Bulletin Board System Text", "*.dat ; Data File", "*.xml ; XML File", "*.sql ; SQL database file", "*.json ; JavaScript Object Notation File", "*.html ; HyperText Markup Language", "*.csv ; Comma-separated values", "*.cfg ; Configuration File", "*.ini ; Initialization File (same as .cfg Configuration File)" )
|
||||
|
||||
[node name="NewFileDialogue" type="AcceptDialog" parent="."]
|
||||
margin_left = 348.254
|
||||
margin_top = 232.623
|
||||
margin_right = 644.254
|
||||
margin_bottom = 321.623
|
||||
window_title = "Create new File"
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="NewFileDialogue"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 8.0
|
||||
margin_top = 8.0
|
||||
margin_right = -8.0
|
||||
margin_bottom = -36.0
|
||||
|
||||
[node name="Label" type="Label" parent="NewFileDialogue/VBoxContainer"]
|
||||
margin_right = 280.0
|
||||
margin_bottom = 16.0
|
||||
size_flags_vertical = 3
|
||||
text = "Insert file name (no extension needed)"
|
||||
align = 1
|
||||
valign = 1
|
||||
|
||||
[node name="new_filename" type="LineEdit" parent="NewFileDialogue/VBoxContainer"]
|
||||
margin_left = 40.0
|
||||
margin_top = 20.0
|
||||
margin_right = 240.0
|
||||
margin_bottom = 44.0
|
||||
rect_min_size = Vector2( 200, 0 )
|
||||
size_flags_horizontal = 6
|
||||
size_flags_vertical = 3
|
||||
clear_button_enabled = true
|
||||
placeholder_text = "example"
|
||||
|
||||
[node name="ConfirmationDialog" type="ConfirmationDialog" parent="."]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
margin_left = -323.5
|
||||
margin_top = -37.5
|
||||
margin_right = 323.5
|
||||
margin_bottom = 37.5
|
||||
window_title = "Unsaved changes"
|
||||
dialog_text = "There are some unsaved changes.
|
||||
Press \"OK\" if you want to close this tab anyway, or \"cancel\" if you want to keep on editing your file."
|
144
addons/file-editor/scenes/FileScene.tscn
Normal file
@ -0,0 +1,144 @@
|
||||
[gd_scene load_steps=12 format=2]
|
||||
|
||||
[ext_resource path="res://addons/file-editor/scripts/FileScene.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/file-editor/fonts/Roboto-Black.ttf" type="DynamicFontData" id=2]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id=1]
|
||||
content_margin_left = 10.0
|
||||
content_margin_right = 10.0
|
||||
bg_color = Color( 0.145098, 0.172549, 0.231373, 1 )
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=2]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=3]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=4]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=5]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=6]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=7]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=8]
|
||||
|
||||
[sub_resource type="DynamicFont" id=9]
|
||||
font_data = ExtResource( 2 )
|
||||
|
||||
[node name="filename" type="VBoxContainer"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_vertical = 3
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="."]
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 4.0
|
||||
|
||||
[node name="TopBar" type="HBoxContainer" parent="."]
|
||||
margin_top = 8.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 28.0
|
||||
|
||||
[node name="VSeparator" type="VSeparator" parent="TopBar"]
|
||||
margin_right = 4.0
|
||||
margin_bottom = 20.0
|
||||
|
||||
[node name="FileButton" type="MenuButton" parent="TopBar"]
|
||||
margin_left = 8.0
|
||||
margin_right = 51.0
|
||||
margin_bottom = 20.0
|
||||
custom_styles/hover = SubResource( 1 )
|
||||
custom_styles/normal = SubResource( 1 )
|
||||
text = "File"
|
||||
flat = false
|
||||
items = [ "Save File", null, 0, false, false, 0, 0, null, "", false, "Save file As...", null, 0, false, false, 1, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Normal Preview", null, 0, false, false, 2, 0, null, "", false, "BBCode Preview", null, 0, false, false, 3, 0, null, "", false, "Markdown Preview", null, 0, false, false, 4, 0, null, "", false, "HTML Preview", null, 0, false, false, 5, 0, null, "", false ]
|
||||
|
||||
[node name="filepath" type="Label" parent="TopBar"]
|
||||
margin_left = 523.0
|
||||
margin_top = 3.0
|
||||
margin_right = 523.0
|
||||
margin_bottom = 17.0
|
||||
size_flags_horizontal = 6
|
||||
|
||||
[node name="close_btn" type="Button" parent="TopBar"]
|
||||
margin_left = 996.0
|
||||
margin_right = 1016.0
|
||||
margin_bottom = 20.0
|
||||
size_flags_horizontal = 8
|
||||
text = "X"
|
||||
|
||||
[node name="VSeparator2" type="VSeparator" parent="TopBar"]
|
||||
margin_left = 1020.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 20.0
|
||||
|
||||
[node name="TextEditor" type="TextEdit" parent="."]
|
||||
margin_top = 32.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 577.0
|
||||
size_flags_vertical = 3
|
||||
syntax_highlighting = true
|
||||
show_line_numbers = true
|
||||
breakpoint_gutter = true
|
||||
highlight_all_occurrences = true
|
||||
smooth_scrolling = true
|
||||
wrap_enabled = true
|
||||
caret_blink = true
|
||||
caret_blink_speed = 1.0
|
||||
caret_moving_by_right_click = false
|
||||
|
||||
[node name="FileInfo" type="HBoxContainer" parent="."]
|
||||
margin_top = 581.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 600.0
|
||||
custom_constants/separation = 2
|
||||
|
||||
[node name="VSeparator4" type="VSeparator" parent="FileInfo"]
|
||||
margin_right = 5.0
|
||||
margin_bottom = 19.0
|
||||
rect_min_size = Vector2( 5, 0 )
|
||||
custom_styles/separator = SubResource( 2 )
|
||||
|
||||
[node name="lastmodified_icon" type="TextureRect" parent="FileInfo"]
|
||||
margin_left = 7.0
|
||||
margin_right = 7.0
|
||||
margin_bottom = 19.0
|
||||
stretch_mode = 4
|
||||
|
||||
[node name="Label" type="Label" parent="FileInfo"]
|
||||
margin_left = 9.0
|
||||
margin_top = 2.0
|
||||
margin_right = 134.0
|
||||
margin_bottom = 16.0
|
||||
text = "Last modified time:"
|
||||
|
||||
[node name="lastmodified" type="Label" parent="FileInfo"]
|
||||
margin_left = 136.0
|
||||
margin_top = 2.0
|
||||
margin_right = 136.0
|
||||
margin_bottom = 16.0
|
||||
|
||||
[node name="Readonly" type="CheckBox" parent="FileInfo"]
|
||||
margin_left = 939.0
|
||||
margin_right = 1018.0
|
||||
margin_bottom = 19.0
|
||||
size_flags_horizontal = 10
|
||||
custom_styles/hover = SubResource( 3 )
|
||||
custom_styles/pressed = SubResource( 4 )
|
||||
custom_styles/focus = SubResource( 5 )
|
||||
custom_styles/disabled = SubResource( 6 )
|
||||
custom_styles/hover_pressed = SubResource( 7 )
|
||||
custom_styles/normal = SubResource( 8 )
|
||||
custom_fonts/font = SubResource( 9 )
|
||||
custom_colors/font_color = Color( 0.145098, 0.172549, 0.231373, 1 )
|
||||
custom_colors/font_color_pressed = Color( 1, 1, 1, 1 )
|
||||
text = "Can Edit"
|
||||
flat = true
|
||||
|
||||
[node name="VSeparator3" type="VSeparator" parent="FileInfo"]
|
||||
margin_left = 1020.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 19.0
|
||||
rect_min_size = Vector2( 4, 0 )
|
||||
[connection signal="text_changed" from="TextEditor" to="." method="_on_TextEditor_text_changed"]
|
392
addons/file-editor/scenes/IniEditor.tscn
Normal file
@ -0,0 +1,392 @@
|
||||
[gd_scene load_steps=17 format=2]
|
||||
|
||||
[ext_resource path="res://addons/file-editor/scripts/IniVisualEditor.gd" type="Script" id=1]
|
||||
|
||||
[sub_resource type="Image" id=16]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=2]
|
||||
image = SubResource( 16 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=17]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=4]
|
||||
image = SubResource( 17 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=18]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 64, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=6]
|
||||
image = SubResource( 18 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=19]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 142, 224, 224, 224, 238, 224, 224, 224, 238, 224, 224, 224, 174, 224, 224, 224, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 32, 224, 224, 224, 238, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 158, 224, 224, 224, 254, 224, 224, 224, 190, 224, 224, 224, 48, 224, 224, 224, 32, 224, 224, 224, 190, 224, 224, 224, 254, 224, 224, 224, 158, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 32, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 32, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 158, 224, 224, 224, 254, 224, 224, 224, 190, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 158, 224, 224, 224, 254, 224, 224, 224, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 32, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 48, 224, 224, 224, 158, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 190, 224, 224, 224, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=8]
|
||||
image = SubResource( 19 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=20]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=10]
|
||||
image = SubResource( 20 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=11]
|
||||
|
||||
[sub_resource type="Image" id=21]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 175, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 239, 224, 224, 224, 239, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 80, 224, 224, 224, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=13]
|
||||
image = SubResource( 21 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="Image" id=22]
|
||||
data = {
|
||||
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 64, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 238, 224, 224, 224, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"format": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=15]
|
||||
image = SubResource( 22 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[node name="IniEditor" type="Control"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_vertical = 3
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
|
||||
[node name="HSplitContainer" type="HSplitContainer" parent="VBoxContainer"]
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 595.0
|
||||
size_flags_vertical = 3
|
||||
split_offset = 100
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HSplitContainer"]
|
||||
margin_right = 174.0
|
||||
margin_bottom = 595.0
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HSplitContainer/VBoxContainer"]
|
||||
margin_right = 174.0
|
||||
margin_bottom = 16.0
|
||||
|
||||
[node name="sections_icon" type="TextureRect" parent="VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer"]
|
||||
margin_right = 16.0
|
||||
margin_bottom = 16.0
|
||||
texture = SubResource( 2 )
|
||||
stretch_mode = 6
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer"]
|
||||
margin_left = 20.0
|
||||
margin_top = 1.0
|
||||
margin_right = 174.0
|
||||
margin_bottom = 15.0
|
||||
size_flags_horizontal = 7
|
||||
text = "Sections"
|
||||
|
||||
[node name="sections2" type="ItemList" parent="VBoxContainer/HSplitContainer/VBoxContainer"]
|
||||
margin_top = 20.0
|
||||
margin_right = 174.0
|
||||
margin_bottom = 567.0
|
||||
size_flags_vertical = 3
|
||||
allow_reselect = true
|
||||
auto_height = true
|
||||
same_column_width = true
|
||||
|
||||
[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/HSplitContainer/VBoxContainer"]
|
||||
margin_top = 571.0
|
||||
margin_right = 174.0
|
||||
margin_bottom = 595.0
|
||||
alignment = 1
|
||||
|
||||
[node name="btn_add_section" type="ToolButton" parent="VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer2"]
|
||||
margin_left = 57.0
|
||||
margin_right = 85.0
|
||||
margin_bottom = 24.0
|
||||
hint_tooltip = "Add a new Section"
|
||||
disabled = true
|
||||
icon = SubResource( 4 )
|
||||
|
||||
[node name="btn_remove_section" type="ToolButton" parent="VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer2"]
|
||||
margin_left = 89.0
|
||||
margin_right = 117.0
|
||||
margin_bottom = 24.0
|
||||
hint_tooltip = "Remove selected Section"
|
||||
disabled = true
|
||||
icon = SubResource( 6 )
|
||||
|
||||
[node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/HSplitContainer"]
|
||||
margin_left = 186.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 595.0
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/HSplitContainer/VBoxContainer2"]
|
||||
margin_right = 838.0
|
||||
margin_bottom = 16.0
|
||||
|
||||
[node name="keys_icon" type="TextureRect" parent="VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer2"]
|
||||
margin_right = 16.0
|
||||
margin_bottom = 16.0
|
||||
texture = SubResource( 8 )
|
||||
stretch_mode = 6
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer2"]
|
||||
margin_left = 20.0
|
||||
margin_top = 1.0
|
||||
margin_right = 838.0
|
||||
margin_bottom = 15.0
|
||||
size_flags_horizontal = 7
|
||||
text = "Keys"
|
||||
|
||||
[node name="keys" type="Tree" parent="VBoxContainer/HSplitContainer/VBoxContainer2"]
|
||||
margin_top = 20.0
|
||||
margin_right = 838.0
|
||||
margin_bottom = 567.0
|
||||
size_flags_vertical = 3
|
||||
columns = 2
|
||||
allow_reselect = true
|
||||
hide_folding = true
|
||||
hide_root = true
|
||||
select_mode = 1
|
||||
|
||||
[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/HSplitContainer/VBoxContainer2"]
|
||||
margin_top = 571.0
|
||||
margin_right = 838.0
|
||||
margin_bottom = 595.0
|
||||
alignment = 1
|
||||
|
||||
[node name="btn_add_key" type="ToolButton" parent="VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3"]
|
||||
margin_left = 275.0
|
||||
margin_right = 357.0
|
||||
margin_bottom = 24.0
|
||||
hint_tooltip = "Add a new Key"
|
||||
disabled = true
|
||||
text = "Add key"
|
||||
icon = SubResource( 10 )
|
||||
|
||||
[node name="VSeparator2" type="VSeparator" parent="VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3"]
|
||||
margin_left = 361.0
|
||||
margin_right = 365.0
|
||||
margin_bottom = 24.0
|
||||
custom_styles/separator = SubResource( 11 )
|
||||
|
||||
[node name="btn_edit_key" type="ToolButton" parent="VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3"]
|
||||
margin_left = 369.0
|
||||
margin_right = 451.0
|
||||
margin_bottom = 24.0
|
||||
hint_tooltip = "Edit selected Key"
|
||||
disabled = true
|
||||
text = "Edit Key"
|
||||
icon = SubResource( 13 )
|
||||
|
||||
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3"]
|
||||
margin_left = 455.0
|
||||
margin_right = 459.0
|
||||
margin_bottom = 24.0
|
||||
custom_styles/separator = SubResource( 11 )
|
||||
|
||||
[node name="btn_remove_key" type="ToolButton" parent="VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3"]
|
||||
margin_left = 463.0
|
||||
margin_right = 563.0
|
||||
margin_bottom = 24.0
|
||||
hint_tooltip = "Remove selected Key"
|
||||
disabled = true
|
||||
text = "Delete key"
|
||||
icon = SubResource( 15 )
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="VBoxContainer"]
|
||||
margin_top = 599.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 600.0
|
||||
rect_min_size = Vector2( 0, 1 )
|
||||
custom_constants/separation = 0
|
||||
|
||||
[node name="Section" type="AcceptDialog" parent="."]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
margin_left = -153.0
|
||||
margin_top = -29.0
|
||||
margin_right = 155.0
|
||||
margin_bottom = 98.0
|
||||
window_title = ""
|
||||
|
||||
[node name="Container" type="VBoxContainer" parent="Section"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 8.0
|
||||
margin_top = 8.0
|
||||
margin_right = -8.0
|
||||
margin_bottom = -36.0
|
||||
|
||||
[node name="section" type="HBoxContainer" parent="Section/Container"]
|
||||
margin_right = 292.0
|
||||
margin_bottom = 24.0
|
||||
|
||||
[node name="Label" type="Label" parent="Section/Container/section"]
|
||||
margin_top = 5.0
|
||||
margin_right = 91.0
|
||||
margin_bottom = 19.0
|
||||
text = "Section name:"
|
||||
|
||||
[node name="_name" type="LineEdit" parent="Section/Container/section"]
|
||||
margin_left = 95.0
|
||||
margin_right = 292.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
context_menu_enabled = false
|
||||
|
||||
[node name="key" type="HBoxContainer" parent="Section/Container"]
|
||||
margin_top = 28.0
|
||||
margin_right = 292.0
|
||||
margin_bottom = 52.0
|
||||
|
||||
[node name="Label" type="Label" parent="Section/Container/key"]
|
||||
margin_top = 5.0
|
||||
margin_right = 91.0
|
||||
margin_bottom = 19.0
|
||||
rect_min_size = Vector2( 91, 0 )
|
||||
text = "Key name:"
|
||||
align = 1
|
||||
|
||||
[node name="_name" type="LineEdit" parent="Section/Container/key"]
|
||||
margin_left = 95.0
|
||||
margin_right = 292.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
context_menu_enabled = false
|
||||
|
||||
[node name="value" type="HBoxContainer" parent="Section/Container"]
|
||||
margin_top = 56.0
|
||||
margin_right = 292.0
|
||||
margin_bottom = 80.0
|
||||
|
||||
[node name="Label" type="Label" parent="Section/Container/value"]
|
||||
margin_top = 5.0
|
||||
margin_right = 91.0
|
||||
margin_bottom = 19.0
|
||||
rect_min_size = Vector2( 91, 0 )
|
||||
text = "Key value:"
|
||||
align = 1
|
||||
|
||||
[node name="_value" type="LineEdit" parent="Section/Container/value"]
|
||||
margin_left = 95.0
|
||||
margin_right = 292.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
context_menu_enabled = false
|
||||
|
||||
[node name="Key" type="ConfirmationDialog" parent="."]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
margin_left = -150.0
|
||||
margin_top = -46.0
|
||||
margin_right = 151.0
|
||||
margin_bottom = 64.0
|
||||
window_title = "Add a new Key"
|
||||
|
||||
[node name="data" type="VBoxContainer" parent="Key"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 8.0
|
||||
margin_top = 8.0
|
||||
margin_right = -8.0
|
||||
margin_bottom = -36.0
|
||||
alignment = 1
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="Key/data"]
|
||||
margin_top = 7.0
|
||||
margin_right = 285.0
|
||||
margin_bottom = 31.0
|
||||
|
||||
[node name="Label" type="Label" parent="Key/data/HBoxContainer"]
|
||||
margin_top = 5.0
|
||||
margin_right = 140.0
|
||||
margin_bottom = 19.0
|
||||
size_flags_horizontal = 3
|
||||
text = "Key name:"
|
||||
align = 1
|
||||
valign = 1
|
||||
|
||||
[node name="name" type="LineEdit" parent="Key/data/HBoxContainer"]
|
||||
margin_left = 144.0
|
||||
margin_right = 285.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="HBoxContainer2" type="HBoxContainer" parent="Key/data"]
|
||||
margin_top = 35.0
|
||||
margin_right = 285.0
|
||||
margin_bottom = 59.0
|
||||
|
||||
[node name="Label" type="Label" parent="Key/data/HBoxContainer2"]
|
||||
margin_top = 5.0
|
||||
margin_right = 140.0
|
||||
margin_bottom = 19.0
|
||||
size_flags_horizontal = 3
|
||||
text = "Key value:"
|
||||
align = 1
|
||||
valign = 1
|
||||
|
||||
[node name="value" type="LineEdit" parent="Key/data/HBoxContainer2"]
|
||||
margin_left = 144.0
|
||||
margin_right = 285.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
62
addons/file-editor/scenes/Preview.tscn
Normal file
@ -0,0 +1,62 @@
|
||||
[gd_scene load_steps=12 format=2]
|
||||
|
||||
[ext_resource path="res://addons/file-editor/scripts/Preview.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/file-editor/fonts/COUR.TTF" type="DynamicFontData" id=2]
|
||||
[ext_resource path="res://addons/file-editor/fonts/Carlito-BoldItalic.ttf" type="DynamicFontData" id=3]
|
||||
[ext_resource path="res://addons/file-editor/fonts/Carlito-Italic.ttf" type="DynamicFontData" id=4]
|
||||
[ext_resource path="res://addons/file-editor/fonts/Carlito-Bold.ttf" type="DynamicFontData" id=5]
|
||||
[ext_resource path="res://addons/file-editor/fonts/Carlito-Regular.ttf" type="DynamicFontData" id=6]
|
||||
|
||||
[sub_resource type="DynamicFont" id=1]
|
||||
use_mipmaps = true
|
||||
use_filter = true
|
||||
font_data = ExtResource( 2 )
|
||||
|
||||
[sub_resource type="DynamicFont" id=2]
|
||||
font_data = ExtResource( 3 )
|
||||
|
||||
[sub_resource type="DynamicFont" id=3]
|
||||
font_data = ExtResource( 4 )
|
||||
|
||||
[sub_resource type="DynamicFont" id=4]
|
||||
font_data = ExtResource( 5 )
|
||||
|
||||
[sub_resource type="DynamicFont" id=5]
|
||||
font_data = ExtResource( 6 )
|
||||
|
||||
[node name="Preview" type="WindowDialog"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 81.0
|
||||
margin_top = 47.0
|
||||
margin_right = -80.0
|
||||
margin_bottom = -48.0
|
||||
window_title = "File preview"
|
||||
resizable = true
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="Container" type="VBoxContainer" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
|
||||
[node name="TextPreview" type="RichTextLabel" parent="Container"]
|
||||
visible = false
|
||||
margin_right = 863.0
|
||||
margin_bottom = 505.0
|
||||
size_flags_vertical = 3
|
||||
custom_fonts/mono_font = SubResource( 1 )
|
||||
custom_fonts/bold_italics_font = SubResource( 2 )
|
||||
custom_fonts/italics_font = SubResource( 3 )
|
||||
custom_fonts/bold_font = SubResource( 4 )
|
||||
custom_fonts/normal_font = SubResource( 5 )
|
||||
bbcode_enabled = true
|
||||
scroll_following = true
|
||||
|
||||
[node name="TablePreview" type="GridContainer" parent="Container"]
|
||||
visible = false
|
||||
margin_right = 863.0
|
||||
margin_bottom = 505.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
columns = 3
|
||||
[connection signal="popup_hide" from="." to="." method="_on_Preview_popup_hide"]
|
64
addons/file-editor/scenes/Preview.tscn.tmp
Normal file
@ -0,0 +1,64 @@
|
||||
[gd_scene load_steps=13 format=2]
|
||||
|
||||
[ext_resource path="res://addons/file-editor/scripts/Preview.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/file-editor/fonts/COUR.TTF" type="DynamicFontData" id=2]
|
||||
[ext_resource path="res://addons/file-editor/fonts/Carlito-BoldItalic.ttf" type="DynamicFontData" id=3]
|
||||
[ext_resource path="res://addons/file-editor/fonts/Carlito-Italic.ttf" type="DynamicFontData" id=4]
|
||||
[ext_resource path="res://addons/file-editor/fonts/Carlito-Bold.ttf" type="DynamicFontData" id=5]
|
||||
[ext_resource path="res://addons/file-editor/fonts/Carlito-Regular.ttf" type="DynamicFontData" id=6]
|
||||
[ext_resource path="res://new_richtexteffect.tres" type="RichTextEffect" id=7]
|
||||
|
||||
[sub_resource type="DynamicFont" id=1]
|
||||
use_mipmaps = true
|
||||
use_filter = true
|
||||
font_data = ExtResource( 2 )
|
||||
|
||||
[sub_resource type="DynamicFont" id=2]
|
||||
font_data = ExtResource( 3 )
|
||||
|
||||
[sub_resource type="DynamicFont" id=3]
|
||||
font_data = ExtResource( 4 )
|
||||
|
||||
[sub_resource type="DynamicFont" id=4]
|
||||
font_data = ExtResource( 5 )
|
||||
|
||||
[sub_resource type="DynamicFont" id=5]
|
||||
font_data = ExtResource( 6 )
|
||||
|
||||
[node name="Preview" type="WindowDialog"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 81.0
|
||||
margin_top = 47.0
|
||||
margin_right = -80.0
|
||||
margin_bottom = -48.0
|
||||
window_title = "File preview"
|
||||
resizable = true
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="Container" type="VBoxContainer" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
|
||||
[node name="TextPreview" type="RichTextLabel" parent="Container"]
|
||||
visible = false
|
||||
margin_right = 863.0
|
||||
margin_bottom = 505.0
|
||||
size_flags_vertical = 3
|
||||
custom_fonts/mono_font = SubResource( 1 )
|
||||
custom_fonts/bold_italics_font = SubResource( 2 )
|
||||
custom_fonts/italics_font = SubResource( 3 )
|
||||
custom_fonts/bold_font = SubResource( 4 )
|
||||
custom_fonts/normal_font = SubResource( 5 )
|
||||
bbcode_enabled = true
|
||||
scroll_following = true
|
||||
custom_effects = [ ExtResource( 7 ) ]
|
||||
|
||||
[node name="TablePreview" type="GridContainer" parent="Container"]
|
||||
visible = false
|
||||
margin_right = 863.0
|
||||
margin_bottom = 505.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
columns = 3
|
||||
[connection signal="popup_hide" from="." to="." method="_on_Preview_popup_hide"]
|
35
addons/file-editor/scenes/Readonly.tscn
Normal file
@ -0,0 +1,35 @@
|
||||
[gd_scene load_steps=9 format=2]
|
||||
|
||||
[ext_resource path="res://addons/file-editor/fonts/Roboto-Black.ttf" type="DynamicFontData" id=1]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=1]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=2]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=3]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=4]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=5]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=6]
|
||||
|
||||
[sub_resource type="DynamicFont" id=7]
|
||||
font_data = ExtResource( 1 )
|
||||
|
||||
[node name="Readonly" type="CheckBox"]
|
||||
margin_left = 945.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 19.0
|
||||
size_flags_horizontal = 10
|
||||
custom_styles/hover = SubResource( 1 )
|
||||
custom_styles/pressed = SubResource( 2 )
|
||||
custom_styles/focus = SubResource( 3 )
|
||||
custom_styles/disabled = SubResource( 4 )
|
||||
custom_styles/hover_pressed = SubResource( 5 )
|
||||
custom_styles/normal = SubResource( 6 )
|
||||
custom_fonts/font = SubResource( 7 )
|
||||
custom_colors/font_color = Color( 0.145098, 0.172549, 0.231373, 1 )
|
||||
custom_colors/font_color_pressed = Color( 1, 1, 1, 1 )
|
||||
text = "Can Edit"
|
||||
flat = true
|
215
addons/file-editor/scenes/VanillaEditor.tscn
Normal file
@ -0,0 +1,215 @@
|
||||
[gd_scene load_steps=10 format=2]
|
||||
|
||||
[ext_resource path="res://addons/file-editor/scripts/VanillaEditor.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/file-editor/fonts/Roboto-Black.ttf" type="DynamicFontData" id=2]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=1]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=2]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=3]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=4]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=5]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=6]
|
||||
|
||||
[sub_resource type="DynamicFont" id=7]
|
||||
font_data = ExtResource( 2 )
|
||||
|
||||
[node name="VanillaEditor" type="VBoxContainer"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_vertical = 3
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="TextEditor" type="TextEdit" parent="."]
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 577.0
|
||||
size_flags_vertical = 3
|
||||
custom_colors/member_variable_color = Color( 0.737255, 0.882353, 1, 1 )
|
||||
custom_colors/code_folding_color = Color( 1, 1, 1, 0.701961 )
|
||||
custom_colors/function_color = Color( 0.341176, 0.701961, 1, 1 )
|
||||
custom_colors/safe_line_number_color = Color( 0.8, 0.968627, 0.827451, 0.74902 )
|
||||
custom_colors/symbol_color = Color( 0.670588, 0.788235, 1, 1 )
|
||||
custom_colors/caret_background_color = Color( 0, 0, 0, 1 )
|
||||
custom_colors/selection_color = Color( 0.411765, 0.611765, 0.909804, 0.34902 )
|
||||
custom_colors/caret_color = Color( 1, 1, 1, 1 )
|
||||
custom_colors/breakpoint_color = Color( 1, 0.470588, 0.419608, 1 )
|
||||
custom_colors/font_color_selected = Color( 0, 0, 0, 1 )
|
||||
custom_colors/font_color = Color( 1, 1, 1, 1 )
|
||||
custom_colors/completion_font_color = Color( 1, 1, 1, 0.392157 )
|
||||
custom_colors/completion_scroll_color = Color( 1, 1, 1, 0.0705882 )
|
||||
custom_colors/background_color = Color( 0.121569, 0.145098, 0.192157, 1 )
|
||||
custom_colors/number_color = Color( 0.631373, 1, 0.882353, 1 )
|
||||
custom_colors/completion_background_color = Color( 0.196078, 0.231373, 0.309804, 1 )
|
||||
custom_colors/brace_mismatch_color = Color( 1, 0.470588, 0.419608, 1 )
|
||||
custom_colors/current_line_color = Color( 1, 1, 1, 0.0705882 )
|
||||
custom_colors/completion_selected_color = Color( 1, 1, 1, 0.0705882 )
|
||||
custom_colors/mark_color = Color( 1, 0.470588, 0.419608, 0.301961 )
|
||||
custom_colors/word_highlighted_color = Color( 1, 1, 1, 0.392157 )
|
||||
custom_colors/completion_existing_color = Color( 1, 1, 1, 0.392157 )
|
||||
custom_constants/completion_lines = 20
|
||||
custom_constants/completion_max_width = 20
|
||||
custom_constants/completion_scroll_width = 20
|
||||
highlight_current_line = true
|
||||
syntax_highlighting = true
|
||||
show_line_numbers = true
|
||||
breakpoint_gutter = true
|
||||
highlight_all_occurrences = true
|
||||
override_selected_font_color = true
|
||||
smooth_scrolling = true
|
||||
hiding_enabled = true
|
||||
caret_blink = true
|
||||
caret_blink_speed = 1.0
|
||||
caret_moving_by_right_click = false
|
||||
|
||||
[node name="SearchBox" type="HBoxContainer" parent="."]
|
||||
visible = false
|
||||
margin_top = 525.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 549.0
|
||||
|
||||
[node name="Label" type="Label" parent="SearchBox"]
|
||||
margin_top = 5.0
|
||||
margin_right = 46.0
|
||||
margin_bottom = 19.0
|
||||
text = "Search:"
|
||||
|
||||
[node name="LineEdit" type="LineEdit" parent="SearchBox"]
|
||||
margin_left = 50.0
|
||||
margin_right = 778.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="matchcase" type="CheckBox" parent="SearchBox"]
|
||||
margin_left = 782.0
|
||||
margin_right = 883.0
|
||||
margin_bottom = 24.0
|
||||
text = "Match Case"
|
||||
|
||||
[node name="wholewords" type="CheckBox" parent="SearchBox"]
|
||||
margin_left = 887.0
|
||||
margin_right = 1001.0
|
||||
margin_bottom = 24.0
|
||||
text = "Whole Words"
|
||||
|
||||
[node name="close" type="Button" parent="SearchBox"]
|
||||
margin_left = 1005.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 24.0
|
||||
text = "x"
|
||||
flat = true
|
||||
|
||||
[node name="ReplaceBox" type="HBoxContainer" parent="."]
|
||||
visible = false
|
||||
margin_top = 553.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 577.0
|
||||
|
||||
[node name="Label" type="Label" parent="ReplaceBox"]
|
||||
margin_top = 5.0
|
||||
margin_right = 54.0
|
||||
margin_bottom = 19.0
|
||||
text = "Replace:"
|
||||
|
||||
[node name="replace" type="LineEdit" parent="ReplaceBox"]
|
||||
margin_left = 58.0
|
||||
margin_right = 475.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="Label2" type="Label" parent="ReplaceBox"]
|
||||
margin_left = 479.0
|
||||
margin_top = 5.0
|
||||
margin_right = 513.0
|
||||
margin_bottom = 19.0
|
||||
text = "With:"
|
||||
|
||||
[node name="with" type="LineEdit" parent="ReplaceBox"]
|
||||
margin_left = 517.0
|
||||
margin_right = 934.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="Button" type="Button" parent="ReplaceBox"]
|
||||
margin_left = 938.0
|
||||
margin_right = 1000.0
|
||||
margin_bottom = 24.0
|
||||
text = "Replace"
|
||||
|
||||
[node name="close2" type="Button" parent="ReplaceBox"]
|
||||
margin_left = 1004.0
|
||||
margin_right = 1023.0
|
||||
margin_bottom = 24.0
|
||||
text = "x"
|
||||
flat = true
|
||||
|
||||
[node name="FileInfo" type="HBoxContainer" parent="."]
|
||||
margin_top = 581.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 600.0
|
||||
custom_constants/separation = 2
|
||||
alignment = 1
|
||||
|
||||
[node name="lastmodified_icon" type="TextureRect" parent="FileInfo"]
|
||||
margin_bottom = 19.0
|
||||
stretch_mode = 4
|
||||
|
||||
[node name="Label" type="Label" parent="FileInfo"]
|
||||
margin_left = 2.0
|
||||
margin_top = 2.0
|
||||
margin_right = 127.0
|
||||
margin_bottom = 16.0
|
||||
text = "Last modified time:"
|
||||
|
||||
[node name="lastmodified" type="Label" parent="FileInfo"]
|
||||
margin_left = 129.0
|
||||
margin_top = 2.0
|
||||
margin_right = 129.0
|
||||
margin_bottom = 16.0
|
||||
|
||||
[node name="Label2" type="Label" parent="FileInfo"]
|
||||
margin_left = 131.0
|
||||
margin_top = 2.0
|
||||
margin_right = 427.0
|
||||
margin_bottom = 16.0
|
||||
size_flags_horizontal = 15
|
||||
text = "Characters counter:"
|
||||
align = 2
|
||||
|
||||
[node name="c_counter" type="Label" parent="FileInfo"]
|
||||
margin_left = 429.0
|
||||
margin_top = 2.0
|
||||
margin_right = 429.0
|
||||
margin_bottom = 16.0
|
||||
size_flags_horizontal = 2
|
||||
|
||||
[node name="Readonly" type="CheckBox" parent="FileInfo"]
|
||||
margin_left = 945.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 19.0
|
||||
size_flags_horizontal = 10
|
||||
custom_styles/hover = SubResource( 1 )
|
||||
custom_styles/pressed = SubResource( 2 )
|
||||
custom_styles/focus = SubResource( 3 )
|
||||
custom_styles/disabled = SubResource( 4 )
|
||||
custom_styles/hover_pressed = SubResource( 5 )
|
||||
custom_styles/normal = SubResource( 6 )
|
||||
custom_fonts/font = SubResource( 7 )
|
||||
custom_colors/font_color = Color( 0.145098, 0.172549, 0.231373, 1 )
|
||||
custom_colors/font_color_pressed = Color( 1, 1, 1, 1 )
|
||||
text = "Can Edit"
|
||||
flat = true
|
||||
[connection signal="text_changed" from="TextEditor" to="." method="_on_TextEditor_text_changed"]
|
||||
[connection signal="focus_entered" from="SearchBox/LineEdit" to="." method="_on_LineEdit_focus_entered"]
|
||||
[connection signal="text_changed" from="SearchBox/LineEdit" to="." method="_on_LineEdit_text_changed"]
|
||||
[connection signal="toggled" from="SearchBox/matchcase" to="." method="_on_matchcase_toggled"]
|
||||
[connection signal="toggled" from="SearchBox/wholewords" to="." method="_on_wholewords_toggled"]
|
||||
[connection signal="pressed" from="SearchBox/close" to="." method="_on_close_pressed"]
|
||||
[connection signal="pressed" from="ReplaceBox/Button" to="." method="_on_Button_pressed"]
|
||||
[connection signal="pressed" from="ReplaceBox/close2" to="." method="_on_close2_pressed"]
|
215
addons/file-editor/scripts/CsvEditor.gd
Normal file
@ -0,0 +1,215 @@
|
||||
tool
|
||||
extends Control
|
||||
|
||||
var IconLoader = preload("res://addons/file-editor/scripts/IconLoader.gd").new()
|
||||
var LastOpenedFiles = preload("res://addons/file-editor/scripts/LastOpenedFiles.gd").new()
|
||||
|
||||
onready var Table = $Editor/TableContainer/ScrollContainer/Table
|
||||
onready var AlignBTN = $Editor/Buttons/align_bt.get_popup()
|
||||
onready var EditBTN = $Editor/Buttons/edit_bt.get_popup()
|
||||
onready var OptionsBTN = $Editor/Buttons/options_btn.get_popup()
|
||||
onready var FileInfo = $Editor/FileInfo
|
||||
onready var ReadOnly = $Editor/FileInfo/Readonly
|
||||
|
||||
onready var Horizontal = $Editor/Horizontal
|
||||
onready var Vertical = $Editor/TableContainer/Vertical
|
||||
|
||||
onready var ChangeDelimiterDialog = $ChangeDelimiterDialog
|
||||
|
||||
var current_file_path : String = ""
|
||||
|
||||
var rows : int
|
||||
var columns : int
|
||||
var csv_delimiter : String
|
||||
var filepath : String
|
||||
|
||||
signal update_file()
|
||||
|
||||
func _ready():
|
||||
add_to_group("csv_editor")
|
||||
connect_signals()
|
||||
|
||||
load_icons()
|
||||
|
||||
func connect_signals():
|
||||
AlignBTN.connect("id_pressed",self,"on_align_pressed")
|
||||
EditBTN.connect("id_pressed",self,"on_edit_pressed")
|
||||
OptionsBTN.connect("id_pressed",self,"on_options_pressed")
|
||||
ReadOnly.connect("toggled",self,"_on_Readonly_toggled")
|
||||
ChangeDelimiterDialog.connect("confirmed",self,"on_changedelimiter_confirmed")
|
||||
|
||||
connect("visibility_changed",self,"_on_visibility_changed")
|
||||
|
||||
func load_icons():
|
||||
$Editor/Buttons/align_bt.set_button_icon(IconLoader.load_icon_from_name("align"))
|
||||
$Editor/Buttons/edit_bt.set_button_icon(IconLoader.load_icon_from_name("edit_"))
|
||||
|
||||
AlignBTN.set_item_icon(0,IconLoader.load_icon_from_name("text-left"))
|
||||
AlignBTN.set_item_icon(1,IconLoader.load_icon_from_name("text-center"))
|
||||
AlignBTN.set_item_icon(2,IconLoader.load_icon_from_name("text-right"))
|
||||
AlignBTN.set_item_icon(3,IconLoader.load_icon_from_name("text-fill"))
|
||||
|
||||
EditBTN.set_item_icon(0,IconLoader.load_icon_from_name("row"))
|
||||
EditBTN.set_item_icon(1,IconLoader.load_icon_from_name("column"))
|
||||
EditBTN.set_item_icon(3,IconLoader.load_icon_from_name("save"))
|
||||
|
||||
ReadOnly.set("custom_icons/checked",IconLoader.load_icon_from_name("read"))
|
||||
ReadOnly.set("custom_icons/unchecked",IconLoader.load_icon_from_name("edit"))
|
||||
|
||||
func open_csv_file(filepath : String, csv_delimiter : String) -> void:
|
||||
self.filepath = filepath
|
||||
var csv = File.new()
|
||||
csv.open(filepath,File.READ)
|
||||
var rows : Array = []
|
||||
var columns = -1
|
||||
while not csv.eof_reached():
|
||||
rows.append(csv.get_csv_line(csv_delimiter))
|
||||
if columns == -1:
|
||||
columns = rows[0].size()
|
||||
csv.close()
|
||||
self.csv_delimiter = csv_delimiter
|
||||
load_file_in_table(rows,columns)
|
||||
ReadOnly.pressed = (true)
|
||||
$Editor/FileInfo/delimiter.set_text(csv_delimiter)
|
||||
ChangeDelimiterDialog.get_node("VBoxContainer/delim_read").set_text(csv_delimiter)
|
||||
|
||||
func load_file_in_table(rows : Array, columns : int) -> void:
|
||||
Table.set_columns(columns)
|
||||
for row in rows:
|
||||
add_row(row.size(),"",row)
|
||||
update_dimensions(rows.size()-1,columns)
|
||||
|
||||
func add_row(columns : int, cell_text : String = "", cell2text : PoolStringArray = []):
|
||||
for i in range(0,columns):
|
||||
if cell2text.size()<1:
|
||||
var cell = LineEdit.new()
|
||||
cell.set_h_size_flags(2)
|
||||
cell.set_h_size_flags(3)
|
||||
cell.set_text(cell_text)
|
||||
Table.add_child(cell)
|
||||
if ReadOnly.pressed:
|
||||
cell.set_editable(false)
|
||||
|
||||
else:
|
||||
if cell2text[i]!="":
|
||||
var cell = LineEdit.new()
|
||||
cell.set_h_size_flags(2)
|
||||
cell.set_h_size_flags(3)
|
||||
Table.add_child(cell)
|
||||
if cell2text:
|
||||
cell.set_text(cell2text[i])
|
||||
else:
|
||||
cell.set_text(cell_text)
|
||||
if ReadOnly.pressed:
|
||||
cell.set_editable(false)
|
||||
|
||||
func add_column(rows : int ,cell_text : String = ""):
|
||||
for i in range(0,rows):
|
||||
var cell = LineEdit.new()
|
||||
cell.set_h_size_flags(2)
|
||||
cell.set_h_size_flags(3)
|
||||
Table.add_child(cell)
|
||||
Table.move_child(cell,(columns)*(i+1)-1)
|
||||
cell.set_text(cell_text)
|
||||
if ReadOnly.pressed:
|
||||
cell.set_editable(false)
|
||||
|
||||
func on_align_pressed(index : int) -> void:
|
||||
for cell in Table.get_children():
|
||||
cell.set_align(index)
|
||||
|
||||
func on_edit_pressed(index :int) -> void:
|
||||
match index:
|
||||
0:
|
||||
update_dimensions(rows+1,columns)
|
||||
add_row(columns)
|
||||
1:
|
||||
update_dimensions(rows,columns+1)
|
||||
add_column(rows)
|
||||
3:
|
||||
save_table()
|
||||
|
||||
func on_options_pressed(index : int) -> void:
|
||||
match index:
|
||||
0:
|
||||
ChangeDelimiterDialog.popup()
|
||||
|
||||
func table_ruler(rows : int, columns : int):
|
||||
for child in Vertical.get_children():
|
||||
child.queue_free()
|
||||
for child in Horizontal.get_children():
|
||||
child.queue_free()
|
||||
for i in range(0,rows):
|
||||
var lb = Label.new()
|
||||
lb.set_h_size_flags(2)
|
||||
lb.set_h_size_flags(3)
|
||||
lb.set_text(str(i+1))
|
||||
Vertical.add_child(lb)
|
||||
var lb = Label.new()
|
||||
lb.set_text(" ")
|
||||
Horizontal.add_child(lb)
|
||||
for j in range(0,columns):
|
||||
var lb2 = Label.new()
|
||||
lb2.set_h_size_flags(2)
|
||||
lb2.set_h_size_flags(3)
|
||||
lb2.set_align(1)
|
||||
lb2.set_text(str(j+1))
|
||||
Horizontal.add_child(lb2)
|
||||
|
||||
func update_dimensions(rows : int, columns : int):
|
||||
self.rows = rows
|
||||
self.columns = columns
|
||||
table_ruler(rows,columns)
|
||||
Table.set_columns(columns)
|
||||
FileInfo.get_node("rows").set_text(str(rows))
|
||||
FileInfo.get_node("columns").set_text(str(columns))
|
||||
|
||||
func _on_Readonly_toggled(button_pressed):
|
||||
if button_pressed:
|
||||
ReadOnly.set_text("Read Only")
|
||||
for cell in Table.get_children():
|
||||
cell.set_editable(false)
|
||||
else:
|
||||
ReadOnly.set_text("Can Edit")
|
||||
for cell in Table.get_children():
|
||||
cell.set_editable(true)
|
||||
|
||||
func save_table():
|
||||
var content : Array = []
|
||||
var column = 0
|
||||
var row_ : PoolStringArray = []
|
||||
for cell in Table.get_children():
|
||||
if column < columns:
|
||||
row_.append(cell.get_text())
|
||||
column+=1
|
||||
else:
|
||||
content.append(row_)
|
||||
row_ = []
|
||||
row_.append(cell.get_text())
|
||||
column = 1
|
||||
content.append(row_)
|
||||
|
||||
var file = File.new()
|
||||
file.open(filepath, File.WRITE)
|
||||
for line in content:
|
||||
file.store_csv_line(line,csv_delimiter)
|
||||
file.close()
|
||||
|
||||
emit_signal("update_file")
|
||||
|
||||
func on_changedelimiter_confirmed():
|
||||
change_delimiter(ChangeDelimiterDialog.get_node("VBoxContainer/delim_read").get_text())
|
||||
|
||||
func change_delimiter(delim : String):
|
||||
csv_delimiter = delim
|
||||
reload()
|
||||
|
||||
func reload():
|
||||
for element in Table.get_children():
|
||||
element.queue_free()
|
||||
open_csv_file(current_file_path,csv_delimiter)
|
||||
FileInfo.show()
|
||||
|
||||
func _on_visibility_changed():
|
||||
if visible:
|
||||
reload()
|
583
addons/file-editor/scripts/FileEditor.gd
Normal file
@ -0,0 +1,583 @@
|
||||
tool
|
||||
extends Control
|
||||
|
||||
onready var FileList = $FileList
|
||||
|
||||
onready var NewFileDialogue = $NewFileDialogue
|
||||
onready var NewFileDialogue_name = $NewFileDialogue/VBoxContainer/new_filename
|
||||
|
||||
onready var FileBTN = $FileEditorContainer/TobBar/file_btn.get_popup()
|
||||
onready var PreviewBTN = $FileEditorContainer/TobBar/preview_btn.get_popup()
|
||||
onready var EditorBTN = $FileEditorContainer/TobBar/editor_btn.get_popup()
|
||||
|
||||
onready var Version = $FileEditorContainer/TobBar/version
|
||||
|
||||
|
||||
onready var FileContainer = $FileEditorContainer/SplitContainer/FileContainer
|
||||
onready var OpenFileList = $FileEditorContainer/SplitContainer/FileContainer/OpenFileList
|
||||
onready var OpenFileName = $FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer/OpenFileName
|
||||
onready var SplitEditorContainer = $FileEditorContainer/SplitContainer/EditorContainer
|
||||
onready var WrapBTN = $FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer/wrap_button
|
||||
onready var MapBTN = $FileEditorContainer/SplitContainer/EditorContainer/HBoxContainer/map_button
|
||||
|
||||
var IconLoader = preload("res://addons/file-editor/scripts/IconLoader.gd").new()
|
||||
var LastOpenedFiles = preload("res://addons/file-editor/scripts/LastOpenedFiles.gd").new()
|
||||
|
||||
var Preview = preload("res://addons/file-editor/scenes/Preview.tscn")
|
||||
var IniEditor = preload("res://addons/file-editor/scenes/IniEditor.tscn")
|
||||
var VanillaEditor = preload("res://addons/file-editor/scenes/VanillaEditor.tscn")
|
||||
var CsvEditor = preload("res://addons/file-editor/scenes/CsvEditor.tscn")
|
||||
|
||||
onready var EditorContainer = $FileEditorContainer/SplitContainer
|
||||
|
||||
var DIRECTORY : String = "res://"
|
||||
var EXCEPTIONS : String = "addons"
|
||||
var EXTENSIONS : PoolStringArray = [
|
||||
"*.txt ; Plain Text File",
|
||||
"*.rtf ; Rich Text Format File",
|
||||
"*.log ; Log File",
|
||||
"*.md ; MD File",
|
||||
"*.doc ; WordPad Document",
|
||||
"*.doc ; Microsoft Word Document",
|
||||
"*.docm ; Word Open XML Macro-Enabled Document",
|
||||
"*.docx ; Microsoft Word Open XML Document",
|
||||
"*.bbs ; Bulletin Board System Text",
|
||||
"*.dat ; Data File",
|
||||
"*.xml ; XML File",
|
||||
"*.sql ; SQL database file",
|
||||
"*.json ; JavaScript Object Notation File",
|
||||
"*.html ; HyperText Markup Language",
|
||||
"*.csv ; Comma-separated values",
|
||||
"*.cfg ; Configuration File",
|
||||
"*.ini ; Initialization File (same as .cfg Configuration File)",
|
||||
"*.csv ; Comma-separated values File",
|
||||
"*.res ; Resource File",
|
||||
]
|
||||
|
||||
var directories = []
|
||||
var files = []
|
||||
var current_file_index = -1
|
||||
var current_file_path = ""
|
||||
var save_as = false
|
||||
var current_editor : Control
|
||||
var current_ini_editor : Control
|
||||
var current_csv_editor : Control
|
||||
|
||||
|
||||
|
||||
func _ready():
|
||||
|
||||
clean_editor()
|
||||
update_version()
|
||||
connect_signals()
|
||||
create_shortcuts()
|
||||
load_icons()
|
||||
|
||||
var opened_files : Array = LastOpenedFiles.load_opened_files()
|
||||
for open_file in opened_files:
|
||||
open_file(open_file[1])
|
||||
|
||||
FileList.set_filters(EXTENSIONS)
|
||||
|
||||
func create_shortcuts():
|
||||
var hotkey
|
||||
|
||||
hotkey = InputEventKey.new()
|
||||
hotkey.scancode = KEY_S
|
||||
hotkey.control = true
|
||||
FileBTN.set_item_accelerator(4,hotkey.get_scancode_with_modifiers()) # save file
|
||||
|
||||
hotkey = InputEventKey.new()
|
||||
hotkey.scancode = KEY_N
|
||||
hotkey.control = true
|
||||
FileBTN.set_item_accelerator(0,hotkey.get_scancode_with_modifiers()) # new file
|
||||
|
||||
hotkey = InputEventKey.new()
|
||||
hotkey.scancode = KEY_O
|
||||
hotkey.control = true
|
||||
FileBTN.set_item_accelerator(1,hotkey.get_scancode_with_modifiers()) # open file
|
||||
|
||||
hotkey = InputEventKey.new()
|
||||
hotkey.scancode = KEY_D
|
||||
hotkey.control = true
|
||||
FileBTN.set_item_accelerator(6,hotkey.get_scancode_with_modifiers()) # delete file
|
||||
|
||||
hotkey = InputEventKey.new()
|
||||
hotkey.scancode = KEY_S
|
||||
hotkey.control = true
|
||||
hotkey.alt = true
|
||||
FileBTN.set_item_accelerator(5,hotkey.get_scancode_with_modifiers()) #save file as
|
||||
|
||||
hotkey = InputEventKey.new()
|
||||
hotkey.scancode = KEY_C
|
||||
hotkey.control = true
|
||||
hotkey.alt = true
|
||||
FileBTN.set_item_accelerator(2,hotkey.get_scancode_with_modifiers()) # close file
|
||||
|
||||
hotkey = InputEventKey.new()
|
||||
hotkey.scancode = KEY_F
|
||||
hotkey.control = true
|
||||
FileBTN.set_item_accelerator(8,hotkey.get_scancode_with_modifiers()) # search
|
||||
|
||||
hotkey = InputEventKey.new()
|
||||
hotkey.scancode = KEY_R
|
||||
hotkey.control = true
|
||||
FileBTN.set_item_accelerator(9,hotkey.get_scancode_with_modifiers()) # replace
|
||||
|
||||
# vanilla editor -----------------------
|
||||
|
||||
hotkey = InputEventKey.new()
|
||||
hotkey.scancode = KEY_1
|
||||
hotkey.control = true
|
||||
EditorBTN.set_item_accelerator(0,hotkey.get_scancode_with_modifiers()) # vanilla editor
|
||||
|
||||
hotkey = InputEventKey.new()
|
||||
hotkey.scancode = KEY_2
|
||||
hotkey.control = true
|
||||
EditorBTN.set_item_accelerator(1,hotkey.get_scancode_with_modifiers()) # csv editor
|
||||
|
||||
hotkey = InputEventKey.new()
|
||||
hotkey.scancode = KEY_3
|
||||
hotkey.control = true
|
||||
EditorBTN.set_item_accelerator(2,hotkey.get_scancode_with_modifiers()) # inieditor editor
|
||||
|
||||
func load_icons():
|
||||
$FileEditorContainer/TobBar/file_btn.icon = IconLoader.load_icon_from_name("file")
|
||||
$FileEditorContainer/TobBar/preview_btn.icon = IconLoader.load_icon_from_name("read")
|
||||
$FileEditorContainer/TobBar/editor_btn.icon = IconLoader.load_icon_from_name("edit_")
|
||||
|
||||
func connect_signals():
|
||||
FileList.connect("confirmed",self,"update_list")
|
||||
FileBTN.connect("id_pressed",self,"_on_filebtn_pressed")
|
||||
PreviewBTN.connect("id_pressed",self,"_on_previewbtn_pressed")
|
||||
EditorBTN.connect("id_pressed",self,"_on_editorbtn_pressed")
|
||||
|
||||
OpenFileList.connect("item_selected",self,"_on_fileitem_pressed")
|
||||
WrapBTN.connect("item_selected",self,"on_wrap_button")
|
||||
MapBTN.connect("item_selected",self,"on_minimap_button")
|
||||
|
||||
func update_version():
|
||||
var plugin_version = ""
|
||||
var config = ConfigFile.new()
|
||||
var err = config.load("res://addons/file-editor/plugin.cfg")
|
||||
if err == OK:
|
||||
plugin_version = config.get_value("plugin","version")
|
||||
Version.set_text("v"+plugin_version)
|
||||
print(plugin_version)
|
||||
|
||||
func create_selected_file():
|
||||
update_list()
|
||||
FileList.mode = FileDialog.MODE_SAVE_FILE
|
||||
FileList.set_title("Create a new File")
|
||||
if FileList.is_connected("file_selected",self,"delete_file"):
|
||||
FileList.disconnect("file_selected",self,"delete_file")
|
||||
if FileList.is_connected("file_selected",self,"open_file"):
|
||||
FileList.disconnect("file_selected",self,"open_file")
|
||||
if not FileList.is_connected("file_selected",self,"create_new_file"):
|
||||
FileList.connect("file_selected",self,"create_new_file")
|
||||
open_filelist()
|
||||
|
||||
func open_selected_file():
|
||||
update_list()
|
||||
FileList.mode = FileDialog.MODE_OPEN_FILE
|
||||
FileList.set_title("Select a File you want to edit")
|
||||
if FileList.is_connected("file_selected",self,"delete_file"):
|
||||
FileList.disconnect("file_selected",self,"delete_file")
|
||||
if FileList.is_connected("file_selected",self,"create_new_file"):
|
||||
FileList.disconnect("file_selected",self,"create_new_file")
|
||||
if not FileList.is_connected("file_selected",self,"open_file"):
|
||||
FileList.connect("file_selected",self,"open_file")
|
||||
open_filelist()
|
||||
|
||||
func delete_selected_file():
|
||||
update_list()
|
||||
FileList.mode = FileDialog.MODE_OPEN_FILES
|
||||
FileList.set_title("Select one or more Files you want to delete")
|
||||
if FileList.is_connected("file_selected",self,"open_file"):
|
||||
FileList.disconnect("file_selected",self,"open_file")
|
||||
if FileList.is_connected("file_selected",self,"create_new_file"):
|
||||
FileList.disconnect("file_selected",self,"create_new_file")
|
||||
if not FileList.is_connected("files_selected",self,"delete_file"):
|
||||
FileList.connect("files_selected",self,"delete_file")
|
||||
open_filelist()
|
||||
|
||||
func save_current_file_as():
|
||||
update_list()
|
||||
FileList.mode = FileDialog.MODE_SAVE_FILE
|
||||
FileList.set_title("Save this File as...")
|
||||
if FileList.is_connected("file_selected",self,"delete_file"):
|
||||
FileList.disconnect("file_selected",self,"delete_file")
|
||||
if FileList.is_connected("file_selected",self,"open_file"):
|
||||
FileList.disconnect("file_selected",self,"open_file")
|
||||
if not FileList.is_connected("file_selected",self,"create_new_file"):
|
||||
FileList.connect("file_selected",self,"create_new_file")
|
||||
open_filelist()
|
||||
|
||||
func _on_filebtn_pressed(index : int):
|
||||
match index:
|
||||
0:
|
||||
create_selected_file()
|
||||
1:
|
||||
open_selected_file()
|
||||
2:
|
||||
if current_file_index!=-1 and current_file_path != "":
|
||||
close_file(current_file_index)
|
||||
|
||||
3:
|
||||
if current_file_index!=-1 and current_file_path != "":
|
||||
save_as = false
|
||||
if current_csv_editor and current_csv_editor.visible:
|
||||
current_csv_editor.save_table()
|
||||
save_file(current_file_path)
|
||||
4:
|
||||
if current_file_index!=-1 and current_file_path != "":
|
||||
save_as = true
|
||||
save_file(current_file_path)
|
||||
save_current_file_as()
|
||||
5:
|
||||
delete_selected_file()
|
||||
6:
|
||||
current_editor.open_searchbox()
|
||||
7:
|
||||
current_editor.open_replacebox()
|
||||
|
||||
func _on_previewbtn_pressed(id : int):
|
||||
if id == 0:
|
||||
bbcode_preview()
|
||||
elif id == 1:
|
||||
markdown_preview()
|
||||
elif id == 2:
|
||||
html_preview()
|
||||
elif id == 3:
|
||||
csv_preview()
|
||||
elif id == 4:
|
||||
xml_preview()
|
||||
elif id == 5:
|
||||
json_preview()
|
||||
|
||||
func _on_editorbtn_pressed(index : int):
|
||||
match index:
|
||||
0:
|
||||
if not current_editor.visible:
|
||||
current_editor.show()
|
||||
if current_csv_editor:
|
||||
current_csv_editor.hide()
|
||||
if current_ini_editor:
|
||||
current_ini_editor.hide()
|
||||
1:
|
||||
if current_csv_editor and not current_csv_editor.visible:
|
||||
if current_ini_editor:
|
||||
current_ini_editor.hide()
|
||||
current_editor.hide()
|
||||
current_csv_editor = open_in_csveditor(current_file_path)
|
||||
current_csv_editor.show()
|
||||
2:
|
||||
if current_ini_editor and not current_ini_editor.visible:
|
||||
current_editor.hide()
|
||||
if current_csv_editor:
|
||||
current_csv_editor.hide()
|
||||
current_ini_editor = open_in_inieditor(current_file_path)
|
||||
current_ini_editor.show()
|
||||
|
||||
func _on_fileitem_pressed(index : int):
|
||||
current_file_index = index
|
||||
var selected_item_metadata = OpenFileList.get_item_metadata(current_file_index)
|
||||
var extension = selected_item_metadata[0].current_path.get_file().get_extension()
|
||||
|
||||
current_file_path = selected_item_metadata[0].current_path
|
||||
if current_editor.visible:
|
||||
current_editor.hide()
|
||||
current_editor = selected_item_metadata[0]
|
||||
current_editor.show()
|
||||
OpenFileName.set_text(current_editor.current_path)
|
||||
current_csv_editor = selected_item_metadata[2]
|
||||
current_ini_editor = selected_item_metadata[1]
|
||||
if WrapBTN.get_selected_id() == 1:
|
||||
current_editor.set_wrap_enabled(true)
|
||||
else:
|
||||
current_editor.set_wrap_enabled(false)
|
||||
if MapBTN.get_selected_id() == 1:
|
||||
current_editor.draw_minimap(true)
|
||||
else:
|
||||
current_editor.draw_minimap(false)
|
||||
elif current_csv_editor and current_csv_editor.visible:
|
||||
if extension == "csv":
|
||||
current_csv_editor.hide()
|
||||
current_csv_editor = selected_item_metadata[2]
|
||||
current_csv_editor.show()
|
||||
OpenFileName.set_text(current_csv_editor.current_file_path)
|
||||
current_editor = selected_item_metadata[0]
|
||||
current_ini_editor = selected_item_metadata[1]
|
||||
else:
|
||||
if current_csv_editor:
|
||||
current_csv_editor.hide()
|
||||
current_csv_editor = selected_item_metadata[2]
|
||||
if current_ini_editor:
|
||||
current_ini_editor.hide()
|
||||
current_ini_editor = selected_item_metadata[1]
|
||||
current_editor.hide()
|
||||
current_editor = selected_item_metadata[0]
|
||||
current_editor.show()
|
||||
OpenFileName.set_text(current_editor.current_path)
|
||||
elif current_ini_editor and current_ini_editor.visible:
|
||||
if extension == "cfg" or extension == "ini":
|
||||
current_ini_editor.hide()
|
||||
current_ini_editor = selected_item_metadata[1]
|
||||
current_ini_editor.show()
|
||||
OpenFileName.set_text(current_ini_editor.current_file_path)
|
||||
else:
|
||||
if current_ini_editor:
|
||||
current_ini_editor.hide()
|
||||
current_ini_editor = selected_item_metadata[1]
|
||||
if current_csv_editor:
|
||||
current_csv_editor.hide()
|
||||
current_csv_editor = selected_item_metadata[2]
|
||||
current_editor.hide()
|
||||
current_editor = selected_item_metadata[0]
|
||||
current_editor.show()
|
||||
OpenFileName.set_text(current_editor.current_path)
|
||||
|
||||
func open_file(path : String):
|
||||
if current_file_path != path:
|
||||
current_file_path = path
|
||||
|
||||
var vanilla_editor = open_in_vanillaeditor(path)
|
||||
var ini_editor = open_in_inieditor(path)
|
||||
var csv_editor = open_in_csveditor(path)
|
||||
|
||||
generate_file_item(path,vanilla_editor,ini_editor,csv_editor)
|
||||
|
||||
LastOpenedFiles.store_opened_files(OpenFileList)
|
||||
current_editor.show()
|
||||
|
||||
func generate_file_item(path : String , veditor : Control , inieditor : Control, csveditor : Control):
|
||||
OpenFileName.set_text(path)
|
||||
OpenFileList.add_item(path.get_file(),IconLoader.load_icon_from_name("file"),true)
|
||||
current_file_index = OpenFileList.get_item_count()-1
|
||||
OpenFileList.set_item_metadata(current_file_index,[veditor,inieditor,csveditor])
|
||||
OpenFileList.select(OpenFileList.get_item_count()-1)
|
||||
|
||||
func open_in_vanillaeditor(path : String) -> Control:
|
||||
var editor = VanillaEditor.instance()
|
||||
SplitEditorContainer.add_child(editor,true)
|
||||
|
||||
if current_editor and current_editor!=editor:
|
||||
editor.show()
|
||||
current_editor.hide()
|
||||
if current_csv_editor and current_csv_editor.visible:
|
||||
current_csv_editor.hide()
|
||||
if current_ini_editor and current_ini_editor.visible:
|
||||
current_ini_editor.hide()
|
||||
|
||||
current_editor = editor
|
||||
|
||||
|
||||
editor.connect("text_changed",self,"_on_vanillaeditor_text_changed")
|
||||
|
||||
var current_file : File = File.new()
|
||||
current_file.open(path,File.READ)
|
||||
var current_content = ""
|
||||
current_content = current_file.get_as_text()
|
||||
|
||||
var last_modified = OS.get_datetime_from_unix_time(current_file.get_modified_time(path))
|
||||
|
||||
current_file.close()
|
||||
|
||||
editor.new_file_open(current_content,last_modified,current_file_path)
|
||||
|
||||
update_list()
|
||||
|
||||
if WrapBTN.get_selected_id() == 1:
|
||||
current_editor.set_wrap_enabled(true)
|
||||
|
||||
|
||||
return editor
|
||||
|
||||
func open_in_inieditor(path : String) -> Control:
|
||||
var extension = path.get_file().get_extension()
|
||||
if extension == "ini" or extension == "cfg":
|
||||
var inieditor = IniEditor.instance()
|
||||
SplitEditorContainer.add_child(inieditor)
|
||||
inieditor.hide()
|
||||
inieditor.connect("update_file",self,"_on_update_file")
|
||||
current_ini_editor = inieditor
|
||||
inieditor.current_file_path = path
|
||||
var current_file : ConfigFile = ConfigFile.new()
|
||||
var err = current_file.load(path)
|
||||
if err == OK:
|
||||
var sections = current_file.get_sections()
|
||||
var filemap = []
|
||||
for section in sections:
|
||||
var keys = []
|
||||
var section_keys = current_file.get_section_keys(section)
|
||||
for key in section_keys:
|
||||
keys.append([key,current_file.get_value(section,key)])
|
||||
|
||||
filemap.append([section,keys])
|
||||
|
||||
inieditor.open_file(filemap)
|
||||
return inieditor
|
||||
else:
|
||||
current_ini_editor = null
|
||||
return null
|
||||
|
||||
func open_in_csveditor(path : String) -> Control:
|
||||
var extension = path.get_file().get_extension()
|
||||
if extension == "csv":
|
||||
var csveditor = CsvEditor.instance()
|
||||
SplitEditorContainer.add_child(csveditor)
|
||||
csveditor.hide()
|
||||
csveditor.connect("update_file",self,"_on_update_file")
|
||||
current_csv_editor = csveditor
|
||||
csveditor.current_file_path = path
|
||||
csveditor.open_csv_file(path,"|")
|
||||
return csveditor
|
||||
else:
|
||||
current_csv_editor = null
|
||||
return null
|
||||
|
||||
func close_file(index):
|
||||
LastOpenedFiles.remove_opened_file(index,OpenFileList)
|
||||
OpenFileList.remove_item(index)
|
||||
OpenFileName.clear()
|
||||
current_editor.queue_free()
|
||||
|
||||
if index>0:
|
||||
OpenFileList.select(OpenFileList.get_item_count()-1)
|
||||
_on_fileitem_pressed(OpenFileList.get_item_count()-1)
|
||||
|
||||
func _on_update_file():
|
||||
# current_editor.clean_editor()
|
||||
var current_file : File = File.new()
|
||||
current_file.open(current_file_path,File.READ)
|
||||
|
||||
var current_content = current_file.get_as_text()
|
||||
var last_modified = OS.get_datetime_from_unix_time(current_file.get_modified_time(current_file_path))
|
||||
|
||||
current_file.close()
|
||||
|
||||
current_editor.new_file_open(current_content,last_modified,current_file_path)
|
||||
|
||||
func delete_file(files_selected : PoolStringArray):
|
||||
var dir = Directory.new()
|
||||
for file in files_selected:
|
||||
dir.remove(file)
|
||||
|
||||
update_list()
|
||||
|
||||
func open_newfiledialogue():
|
||||
NewFileDialogue.popup()
|
||||
NewFileDialogue.set_position(OS.get_screen_size()/2 - NewFileDialogue.get_size()/2)
|
||||
|
||||
func open_filelist():
|
||||
update_list()
|
||||
FileList.popup()
|
||||
FileList.set_position(OS.get_screen_size()/2 - FileList.get_size()/2)
|
||||
|
||||
func create_new_file(given_path : String):
|
||||
var current_file = File.new()
|
||||
current_file.open(given_path,File.WRITE)
|
||||
if save_as :
|
||||
current_file.store_line(current_editor.get_node("TextEditor").get_text())
|
||||
current_file.close()
|
||||
|
||||
open_file(given_path)
|
||||
|
||||
func save_file(current_path : String):
|
||||
var current_file = File.new()
|
||||
current_file.open(current_path,File.WRITE)
|
||||
var current_content = ""
|
||||
var lines = current_editor.get_node("TextEditor").get_line_count()
|
||||
for line in range(0,lines):
|
||||
current_content = current_editor.get_node("TextEditor").get_text()
|
||||
current_file.store_line(current_editor.get_node("TextEditor").get_line(line))
|
||||
current_file.close()
|
||||
|
||||
current_file_path = current_path
|
||||
|
||||
var last_modified = OS.get_datetime_from_unix_time(current_file.get_modified_time(current_file_path))
|
||||
|
||||
current_editor.update_lastmodified(last_modified,"save")
|
||||
OpenFileList.set_item_metadata(current_file_index,[current_editor,current_ini_editor,current_csv_editor])
|
||||
print(OpenFileList.get_item_metadata(current_file_index))
|
||||
|
||||
if OpenFileList.get_item_text(current_file_index).ends_with("(*)"):
|
||||
OpenFileList.set_item_text(current_file_index,OpenFileList.get_item_text(current_file_index).rstrip("(*)"))
|
||||
|
||||
# OpenFileList.set_item_metadata(current_file_index,[current_editor,open_in_inieditor(current_file_path),open_in_csveditor(current_file_path)])
|
||||
|
||||
update_list()
|
||||
|
||||
func clean_editor() -> void :
|
||||
for inieditor in get_tree().get_nodes_in_group("ini_editor"):
|
||||
inieditor.queue_free()
|
||||
for vanillaeditor in get_tree().get_nodes_in_group("vanilla_editor"):
|
||||
vanillaeditor.queue_free()
|
||||
OpenFileName.clear()
|
||||
OpenFileList.clear()
|
||||
|
||||
|
||||
func csv_preview():
|
||||
var preview = Preview.instance()
|
||||
get_parent().get_parent().get_parent().add_child(preview)
|
||||
preview.popup()
|
||||
preview.window_title += " ("+current_file_path.get_file()+")"
|
||||
var lines = current_editor.get_node("TextEditor").get_line_count()
|
||||
var rows = []
|
||||
for i in range(0,lines-1):
|
||||
rows.append(current_editor.get_node("TextEditor").get_line(i).rsplit(",",false))
|
||||
preview.print_csv(rows)
|
||||
|
||||
func bbcode_preview():
|
||||
var preview = Preview.instance()
|
||||
get_parent().get_parent().get_parent().add_child(preview)
|
||||
preview.popup()
|
||||
preview.window_title += " ("+current_file_path.get_file()+")"
|
||||
preview.print_bb(current_editor.get_node("TextEditor").get_text())
|
||||
|
||||
func markdown_preview():
|
||||
var preview = Preview.instance()
|
||||
get_parent().get_parent().get_parent().add_child(preview)
|
||||
preview.popup()
|
||||
preview.window_title += " ("+current_file_path.get_file()+")"
|
||||
preview.print_markdown(current_editor.get_node("TextEditor").get_text())
|
||||
|
||||
func html_preview():
|
||||
var preview = Preview.instance()
|
||||
get_parent().get_parent().get_parent().add_child(preview)
|
||||
preview.popup()
|
||||
preview.window_title += " ("+current_file_path.get_file()+")"
|
||||
preview.print_html(current_editor.get_node("TextEditor").get_text())
|
||||
|
||||
func xml_preview():
|
||||
pass
|
||||
|
||||
func json_preview():
|
||||
pass
|
||||
|
||||
|
||||
func _on_vanillaeditor_text_changed():
|
||||
if not OpenFileList.get_item_text(current_file_index).ends_with("(*)"):
|
||||
OpenFileList.set_item_text(current_file_index,OpenFileList.get_item_text(current_file_index)+"(*)")
|
||||
|
||||
|
||||
func update_list():
|
||||
FileList.invalidate()
|
||||
|
||||
func on_wrap_button(index:int):
|
||||
match index:
|
||||
0:
|
||||
current_editor.set_wrap_enabled(false)
|
||||
1:
|
||||
current_editor.set_wrap_enabled(true)
|
||||
|
||||
func on_minimap_button(index:int):
|
||||
match index:
|
||||
0:
|
||||
current_editor.draw_minimap(false)
|
||||
1:
|
||||
current_editor.draw_minimap(true)
|
||||
|
||||
func check_file_preview(file : String):
|
||||
# check whether the opened file has a corresponding preview session for its extension
|
||||
pass
|
19
addons/file-editor/scripts/FileEditorButton.gd
Normal file
@ -0,0 +1,19 @@
|
||||
tool
|
||||
extends ToolButton
|
||||
|
||||
var fileditor_workspace
|
||||
var fileditor
|
||||
|
||||
func _ready():
|
||||
connect("pressed",self,"show_fileditor")
|
||||
|
||||
func show_fileditor():
|
||||
fileditor_workspace.get_children()[0].hide()
|
||||
fileditor_workspace.get_children()[1].hide()
|
||||
fileditor_workspace.get_children()[2].hide()
|
||||
fileditor_workspace.add_child(fileditor)
|
||||
fileditor.show()
|
||||
|
||||
func load_values(fi, fe):
|
||||
fileditor_workspace = fi
|
||||
fileditor = fe
|
198
addons/file-editor/scripts/FileScene.gd
Normal file
@ -0,0 +1,198 @@
|
||||
tool
|
||||
extends VBoxContainer
|
||||
|
||||
var IconLoader = preload("res://addons/file-editor/scripts/IconLoader.gd").new()
|
||||
var LastOpenedFiles = preload("res://addons/file-editor/scripts/LastOpenedFiles.gd").new()
|
||||
|
||||
onready var ReadOnly = $FileInfo/Readonly
|
||||
|
||||
onready var TextEditor = $TextEditor
|
||||
|
||||
onready var LastModified = $FileInfo/lastmodified
|
||||
|
||||
onready var FileList = get_parent().get_parent().get_parent().get_node("FileList")
|
||||
|
||||
onready var ClosingFile = get_parent().get_parent().get_parent().get_node("ConfirmationDialog")
|
||||
|
||||
onready var LastModifiedIcon = $FileInfo/lastmodified_icon
|
||||
|
||||
onready var SearchBox = $SearchBox
|
||||
onready var ReplaceBox = $ReplaceBox
|
||||
|
||||
onready var c_counter = $FileInfo/c_counter
|
||||
|
||||
var current_path = ""
|
||||
var current_filename = ""
|
||||
var Preview = load("res://addons/file-editor/scenes/Preview.tscn")
|
||||
|
||||
|
||||
var search_flag = 0
|
||||
|
||||
signal text_changed()
|
||||
|
||||
func _ready():
|
||||
ClosingFile.connect("confirmed",self,"queue_free")
|
||||
|
||||
ReadOnly.connect("toggled",self,"_on_Readonly_toggled")
|
||||
|
||||
ReadOnly.set("custom_icons/checked",IconLoader.load_icon_from_name("read"))
|
||||
ReadOnly.set("custom_icons/unchecked",IconLoader.load_icon_from_name("edit"))
|
||||
|
||||
add_to_group("vanilla_editor")
|
||||
|
||||
func color_region(filextension : String): # -----------------------------> dal momento che voglio creare un editor per ogni file, renderò questa funzione singola in base all'estensione del file
|
||||
match(filextension):
|
||||
"bbs":
|
||||
TextEditor.add_color_region("[b]","[/b]",Color8(153,153,255,255),false)
|
||||
TextEditor.add_color_region("[i]","[/i]",Color8(153,255,153,255),false)
|
||||
TextEditor.add_color_region("[s]","[/s]",Color8(255,153,153,255),false)
|
||||
TextEditor.add_color_region("[u]","[/u]",Color8(255,255,102,255),false)
|
||||
TextEditor.add_color_region("[url","[/url]",Color8(153,204,255,255),false)
|
||||
TextEditor.add_color_region("[code]","[/code]",Color8(192,192,192,255),false)
|
||||
TextEditor.add_color_region("[img]","[/img]",Color8(255,204,153,255),false)
|
||||
TextEditor.add_color_region("[center]","[/center]",Color8(175,238,238,255),false)
|
||||
TextEditor.add_color_region("[right]","[/right]",Color8(135,206,235,255),false)
|
||||
"html":
|
||||
TextEditor.add_color_region("<b>","</b>",Color8(153,153,255,255),false)
|
||||
TextEditor.add_color_region("<i>","</i>",Color8(153,255,153,255),false)
|
||||
TextEditor.add_color_region("<del>","</del>",Color8(255,153,153,255),false)
|
||||
TextEditor.add_color_region("<ins>","</ins>",Color8(255,255,102,255),false)
|
||||
TextEditor.add_color_region("<a","</a>",Color8(153,204,255,255),false)
|
||||
TextEditor.add_color_region("<img","/>",Color8(255,204,153,255),true)
|
||||
TextEditor.add_color_region("<pre>","</pre>",Color8(192,192,192,255),false)
|
||||
TextEditor.add_color_region("<center>","</center>",Color8(175,238,238,255),false)
|
||||
TextEditor.add_color_region("<right>","</right>",Color8(135,206,235,255),false)
|
||||
"md":
|
||||
TextEditor.add_color_region("**","**",Color8(153,153,255,255),false)
|
||||
TextEditor.add_color_region("*","*",Color8(153,255,153,255),false)
|
||||
TextEditor.add_color_region("+ ","",Color8(255,178,102,255),false)
|
||||
TextEditor.add_color_region("- ","",Color8(255,178,102,255),false)
|
||||
TextEditor.add_color_region("~~","~~",Color8(255,153,153,255),false)
|
||||
TextEditor.add_color_region("__","__",Color8(255,255,102,255),false)
|
||||
TextEditor.add_color_region("[",")",Color8(153,204,255,255),false)
|
||||
TextEditor.add_color_region("`","`",Color8(192,192,192,255),false)
|
||||
TextEditor.add_color_region('"*.','"',Color8(255,255,255,255),true)
|
||||
TextEditor.add_color_region("# ","",Color8(105,105,105,255),true)
|
||||
TextEditor.add_color_region("## ","",Color8(128,128,128,255),true)
|
||||
TextEditor.add_color_region("### ","",Color8(169,169,169,255),true)
|
||||
TextEditor.add_color_region("#### ","",Color8(192,192,192,255),true)
|
||||
TextEditor.add_color_region("##### ","",Color8(211,211,211,255),true)
|
||||
TextEditor.add_color_region("###### ","",Color8(255,255,255,255),true)
|
||||
"cfg":
|
||||
TextEditor.add_color_region("[","]",Color8(153,204,255,255),false)
|
||||
TextEditor.add_color_region('"','"',Color8(255,255,102,255),false)
|
||||
_:
|
||||
pass
|
||||
|
||||
func clean_editor():
|
||||
TextEditor.set_text("")
|
||||
LastModifiedIcon.texture = IconLoader.load_icon_from_name("save")
|
||||
LastModified.set_text("")
|
||||
FileList.invalidate()
|
||||
current_filename = ""
|
||||
current_path = ""
|
||||
|
||||
func new_file_open(file_content, last_modified , current_file_path):
|
||||
current_path = current_file_path
|
||||
current_filename = current_file_path.get_file()
|
||||
color_region(current_filename.get_extension())
|
||||
TextEditor.set_text(file_content)
|
||||
update_lastmodified(last_modified,"save")
|
||||
FileList.invalidate()
|
||||
count_characters()
|
||||
|
||||
func update_lastmodified(last_modified : Dictionary, icon : String):
|
||||
LastModified.set_text(str(last_modified.hour)+":"+str(last_modified.minute)+" "+str(last_modified.day)+"/"+str(last_modified.month)+"/"+str(last_modified.year))
|
||||
LastModifiedIcon.texture = IconLoader.load_icon_from_name(icon)
|
||||
|
||||
func new_file_create(file_name):
|
||||
TextEditor.set_text("")
|
||||
|
||||
FileList.invalidate()
|
||||
|
||||
func _on_Readonly_toggled(button_pressed):
|
||||
if button_pressed:
|
||||
ReadOnly.set_text("Read Only")
|
||||
TextEditor.readonly = (true)
|
||||
else:
|
||||
ReadOnly.set_text("Can Edit")
|
||||
TextEditor.readonly = (false)
|
||||
|
||||
func _on_TextEditor_text_changed():
|
||||
LastModifiedIcon.texture = IconLoader.load_icon_from_name("saveas")
|
||||
count_characters()
|
||||
emit_signal("text_changed")
|
||||
|
||||
func count_characters():
|
||||
var counted : int = 0
|
||||
for line in TextEditor.get_line_count():
|
||||
counted += TextEditor.get_line(line).length()
|
||||
c_counter.set_text(str(counted))
|
||||
|
||||
func _on_LineEdit_text_changed(new_text):
|
||||
var linecount = TextEditor.get_line_count()
|
||||
if new_text != "":
|
||||
var found
|
||||
var find = false
|
||||
for line in range(0,linecount):
|
||||
for column in range(0,TextEditor.get_line(line).length()):
|
||||
found = TextEditor.search( new_text, search_flag, line , column )
|
||||
if found.size():
|
||||
if found[1] == line:
|
||||
# if not find:
|
||||
TextEditor.select(line,found[0],found[1],found[0]+new_text.length())
|
||||
# find = true
|
||||
else:
|
||||
TextEditor.select(0,0,0,0)
|
||||
else:
|
||||
TextEditor.select(0,0,0,0)
|
||||
|
||||
func _on_matchcase_toggled(button_pressed):
|
||||
if button_pressed:
|
||||
search_flag = 1
|
||||
else:
|
||||
if $SearchBox/wholewords.is_pressed():
|
||||
search_flag = 2
|
||||
else:
|
||||
search_flag = 0
|
||||
_on_LineEdit_text_changed($SearchBox/LineEdit.get_text())
|
||||
|
||||
func _on_wholewords_toggled(button_pressed):
|
||||
if button_pressed:
|
||||
search_flag = 2
|
||||
else:
|
||||
if $SearchBox/matchcase.is_pressed():
|
||||
search_flag = 1
|
||||
else:
|
||||
search_flag = 0
|
||||
_on_LineEdit_text_changed($SearchBox/LineEdit.get_text())
|
||||
|
||||
func _on_close_pressed():
|
||||
SearchBox.hide()
|
||||
|
||||
func open_searchbox():
|
||||
if SearchBox.visible:
|
||||
SearchBox.hide()
|
||||
else:
|
||||
SearchBox.show()
|
||||
SearchBox.get_node("LineEdit").grab_focus()
|
||||
|
||||
func _on_Button_pressed():
|
||||
var linecount = TextEditor.get_line_count()-1
|
||||
var old_text = $ReplaceBox/replace.get_text()
|
||||
var new_text = $ReplaceBox/with.get_text()
|
||||
var text = TextEditor.get_text()
|
||||
TextEditor.set_text(text.replace(old_text,new_text))
|
||||
|
||||
func open_replacebox():
|
||||
if ReplaceBox.visible:
|
||||
ReplaceBox.hide()
|
||||
else:
|
||||
ReplaceBox.show()
|
||||
ReplaceBox.get_node("replace").grab_focus()
|
||||
|
||||
func _on_close2_pressed():
|
||||
ReplaceBox.hide()
|
||||
|
||||
func _on_LineEdit_focus_entered():
|
||||
_on_LineEdit_text_changed($SearchBox/LineEdit.get_text())
|
20
addons/file-editor/scripts/IconLoader.gd
Normal file
@ -0,0 +1,20 @@
|
||||
tool
|
||||
extends Node
|
||||
|
||||
var imgBuffer
|
||||
|
||||
func _ready():
|
||||
pass
|
||||
|
||||
func load_icon_from_name(icon_name : String) -> ImageTexture:
|
||||
var file = File.new()
|
||||
var image = Image.new()
|
||||
var texture = ImageTexture.new()
|
||||
|
||||
file.open("res://addons/file-editor/icons.pngs/"+icon_name+".png.buttonicon", File.READ)
|
||||
var buffer = file.get_buffer(file.get_len())
|
||||
file.close()
|
||||
|
||||
image.load_png_from_buffer(buffer)
|
||||
texture.create_from_image(image)
|
||||
return texture
|
284
addons/file-editor/scripts/IniVisualEditor.gd
Normal file
@ -0,0 +1,284 @@
|
||||
tool
|
||||
extends Control
|
||||
|
||||
var IconLoader = preload("res://addons/file-editor/scripts/IconLoader.gd").new()
|
||||
var LastOpenedFiles = preload("res://addons/file-editor/scripts/LastOpenedFiles.gd").new()
|
||||
|
||||
onready var Keys = $VBoxContainer/HSplitContainer/VBoxContainer2/keys
|
||||
onready var Sections = $VBoxContainer/HSplitContainer/VBoxContainer/sections2
|
||||
|
||||
onready var BtnAddSection = $VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer2/btn_add_section
|
||||
onready var BtnRemoveSection = $VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer2/btn_remove_section
|
||||
|
||||
onready var BtnAddKey = $VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3/btn_add_key
|
||||
onready var BtnEditKey = $VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3/btn_edit_key
|
||||
onready var BtnRemoveKey = $VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer3/btn_remove_key
|
||||
|
||||
onready var Section = $Section
|
||||
onready var Key = $Key
|
||||
|
||||
var selected_key
|
||||
var selected_section : int = -1
|
||||
var root : TreeItem
|
||||
|
||||
var current_file_path : String = ""
|
||||
|
||||
signal update_file()
|
||||
|
||||
func _ready():
|
||||
create_table_names()
|
||||
connect_signals()
|
||||
load_icons()
|
||||
clean_editor()
|
||||
|
||||
add_to_group("ini_editor")
|
||||
|
||||
# var metadata = [["name","Godot Engine"],["version","1.0.0"],["color","Light Blue"]]
|
||||
# load_section("Engine", metadata)
|
||||
|
||||
func connect_signals():
|
||||
Sections.connect("item_selected",self,"_on_section_selected")
|
||||
Sections.connect("nothing_selected",self,"_on_nosection_selected")
|
||||
|
||||
BtnAddSection.connect("pressed",self,"_on_addsection_pressed")
|
||||
BtnRemoveSection.connect("pressed",self,"_on_removesection_pressed")
|
||||
|
||||
Keys.connect("item_selected",self,"_on_key_selected")
|
||||
Keys.connect("nothing_selected",self,"_on_nokey_selected")
|
||||
|
||||
BtnAddKey.connect("pressed",self,"_on_addkey_pressed")
|
||||
BtnRemoveKey.connect("pressed",self,"_on_removekey_pressed")
|
||||
BtnEditKey.connect("pressed",self,"_on_editkey_pressed")
|
||||
|
||||
connect("visibility_changed",self,"_on_visibility_changed")
|
||||
|
||||
func create_table_names():
|
||||
create_root()
|
||||
Keys.hide_root = true
|
||||
|
||||
Keys.set_column_titles_visible(true)
|
||||
Keys.set_column_title(0,"Name")
|
||||
Keys.set_column_title(1,"Value")
|
||||
|
||||
func load_icons():
|
||||
$VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/sections_icon.texture = IconLoader.load_icon_from_name("sections")
|
||||
$VBoxContainer/HSplitContainer/VBoxContainer2/HBoxContainer2/keys_icon.texture = IconLoader.load_icon_from_name("keys")
|
||||
BtnAddSection.icon = IconLoader.load_icon_from_name("add")
|
||||
BtnAddSection.hint_tooltip = "Add a new Section"
|
||||
BtnRemoveSection.icon = IconLoader.load_icon_from_name("delete")
|
||||
BtnRemoveSection.hint_tooltip = "Remove selected Section"
|
||||
|
||||
BtnAddKey.icon = IconLoader.load_icon_from_name("add")
|
||||
BtnAddKey.hint_tooltip = "Add a new Key"
|
||||
BtnRemoveKey.icon = IconLoader.load_icon_from_name("delete")
|
||||
BtnRemoveKey.hint_tooltip = "Remove selected Key"
|
||||
BtnEditKey.icon = IconLoader.load_icon_from_name("edit_")
|
||||
BtnEditKey.hint_tooltip = "Edit selected Key"
|
||||
|
||||
func _on_addsection_pressed():
|
||||
Section.get_node("Container/section/_name").show()
|
||||
Section.window_title = "Add a new Section"
|
||||
if not Section.is_connected("confirmed",self,"new_section"):
|
||||
Section.connect("confirmed",self,"new_section")
|
||||
if Section.is_connected("confirmed",self,"remove_section"):
|
||||
Section.disconnect("confirmed",self,"remove_section")
|
||||
Section.popup()
|
||||
|
||||
func _on_removesection_pressed():
|
||||
Section.get_node("Container").hide()
|
||||
Section.window_title = "Remove selected Section"
|
||||
Section.dialog_text = "Are you sure you want to remove this Section?"
|
||||
if not Section.is_connected("confirmed",self,"remove_section"):
|
||||
Section.connect("confirmed",self,"remove_section")
|
||||
if Section.is_connected("confirmed",self,"new_section"):
|
||||
Section.disconnect("confirmed",self,"new_section")
|
||||
Section.popup()
|
||||
|
||||
func _on_addkey_pressed():
|
||||
Key.get_node("data").show()
|
||||
Key.get_node("data/HBoxContainer/name").editable = true
|
||||
Key.get_node("data/HBoxContainer/name").set_text("")
|
||||
Key.window_title = "Add a new Key"
|
||||
Key.dialog_text = ""
|
||||
if not Key.is_connected("confirmed",self,"new_key"):
|
||||
Key.connect("confirmed",self,"new_key")
|
||||
if Key.is_connected("confirmed",self,"edit_key"):
|
||||
Key.disconnect("confirmed",self,"edit_key")
|
||||
if Key.is_connected("confirmed",self,"remove_key"):
|
||||
Key.disconnect("confirmed",self,"remove_key")
|
||||
Key.popup()
|
||||
|
||||
func _on_removekey_pressed():
|
||||
Key.get_node("data").hide()
|
||||
Key.window_title = "Delete selected Key"
|
||||
Key.dialog_text = "Are you sure you want to remove the selected Key?"
|
||||
if not Key.is_connected("confirmed",self,"remove_key"):
|
||||
Key.connect("confirmed",self,"remove_key")
|
||||
if Key.is_connected("confirmed",self,"edit_key"):
|
||||
Key.disconnect("confirmed",self,"edit_key")
|
||||
if Key.is_connected("confirmed",self,"new_key"):
|
||||
Key.disconnect("confirmed",self,"new_key")
|
||||
Key.popup()
|
||||
|
||||
func _on_editkey_pressed():
|
||||
Key.get_node("data").show()
|
||||
Key.get_node("data/HBoxContainer/name").editable = false
|
||||
Key.get_node("data/HBoxContainer/name").set_text(str(selected_key.get_text(0)))
|
||||
Key.get_node("data/HBoxContainer2/value").set_text(str(selected_key.get_text(1)))
|
||||
Key.window_title = "Edit selected Key"
|
||||
Key.dialog_text = ""
|
||||
if not Key.is_connected("confirmed",self,"edit_key"):
|
||||
Key.connect("confirmed",self,"edit_key")
|
||||
if Key.is_connected("confirmed",self,"remove_key"):
|
||||
Key.disconnect("confirmed",self,"remove_key")
|
||||
if Key.is_connected("confirmed",self,"new_key"):
|
||||
Key.disconnect("confirmed",self,"new_key")
|
||||
Key.popup()
|
||||
|
||||
func clean_editor():
|
||||
Keys.clear()
|
||||
Sections.clear()
|
||||
selected_section = -1
|
||||
BtnAddKey.disabled = true
|
||||
if current_file_path == "":
|
||||
BtnAddSection.disabled = true
|
||||
else:
|
||||
BtnAddSection.disabled = false
|
||||
BtnEditKey.disabled = true
|
||||
BtnRemoveKey.disabled = true
|
||||
BtnRemoveSection.disabled = true
|
||||
|
||||
create_root()
|
||||
|
||||
func open_file(filemap : Array):
|
||||
clean_editor()
|
||||
for section in filemap:
|
||||
load_sections(section[0],section[1])
|
||||
|
||||
func new_section():
|
||||
var file = ConfigFile.new()
|
||||
file.load(current_file_path)
|
||||
|
||||
var section_name = str(Section.get_node("Container/section/_name").get_text())
|
||||
var key_name = str(Section.get_node("Container/key/_name").get_text())
|
||||
var key_value = Section.get_node("Container/value/_value").get_text()
|
||||
|
||||
if section_name and key_name and key_value:
|
||||
file.set_value(section_name,key_name,key_value)
|
||||
file.save(current_file_path)
|
||||
|
||||
load_sections(section_name,[[key_name,key_value]])
|
||||
|
||||
emit_signal("update_file")
|
||||
else:
|
||||
print("Section <",section_name,"> with Key name: <",key_name,"> and Key value: <",key_value,"> not valid.")
|
||||
|
||||
func remove_section():
|
||||
var file = ConfigFile.new()
|
||||
file.load(current_file_path)
|
||||
var current_section = Sections.get_item_text(selected_section)
|
||||
file.erase_section(current_section)
|
||||
Sections.remove_item(selected_section)
|
||||
file.save(current_file_path)
|
||||
|
||||
emit_signal("update_file")
|
||||
|
||||
func new_key():
|
||||
var key_name = str(Key.get_node("data/HBoxContainer/name").get_text())
|
||||
var key_value = Key.get_node("data/HBoxContainer2/value").get_text()
|
||||
if key_name and key_value:
|
||||
|
||||
var file = ConfigFile.new()
|
||||
file.load(current_file_path)
|
||||
|
||||
var current_section = Sections.get_item_text(selected_section)
|
||||
|
||||
file.set_value(current_section,key_name,key_value)
|
||||
file.save(current_file_path)
|
||||
|
||||
load_keys_selected_section([[key_name,key_value]])
|
||||
|
||||
file.save(current_file_path)
|
||||
|
||||
emit_signal("update_file")
|
||||
else:
|
||||
print("Key name: <",key_name,"> with Key value: <",key_value,"> not valid.")
|
||||
|
||||
func remove_key():
|
||||
var section = Sections.get_item_text(selected_section)
|
||||
var sectionmetadata = Sections.get_item_metadata(selected_section)
|
||||
|
||||
for meta in sectionmetadata:
|
||||
if meta.has(selected_key.get_text(0)):
|
||||
sectionmetadata.erase(meta)
|
||||
|
||||
Sections.set_item_metadata(selected_section,sectionmetadata)
|
||||
|
||||
if Sections.get_item_metadata(selected_section) == []:
|
||||
Sections.remove_item(selected_section)
|
||||
|
||||
var file = ConfigFile.new()
|
||||
file.load(current_file_path)
|
||||
file.set_value(section,selected_key.get_text(0),null)
|
||||
file.save(current_file_path)
|
||||
|
||||
Keys.clear()
|
||||
create_root()
|
||||
load_keys_selected_section(sectionmetadata)
|
||||
|
||||
emit_signal("update_file")
|
||||
|
||||
func edit_key():
|
||||
remove_key()
|
||||
new_key()
|
||||
|
||||
# load a section with custom fields @section_name = name of section ; @section_metadata = keys of this section with keys' properties
|
||||
func load_sections(section_name : String, section_metadata : Array):
|
||||
Sections.add_item(section_name,IconLoader.load_icon_from_name("section"),true)
|
||||
Sections.set_item_metadata(Sections.get_item_count()-1,section_metadata)
|
||||
|
||||
# load a key of a selected section to fill the "keys" list
|
||||
func load_keys_selected_section(metadata : Array):
|
||||
for key in metadata:
|
||||
var key_item = Keys.create_item(root)
|
||||
key_item.set_text(0,key[0])
|
||||
key_item.set_text(1,key[1])
|
||||
|
||||
func _on_section_selected(index : int):
|
||||
Keys.clear()
|
||||
create_root()
|
||||
BtnRemoveSection.disabled = false
|
||||
BtnAddSection.disabled = false
|
||||
BtnAddKey.disabled = false
|
||||
BtnRemoveKey.disabled = true
|
||||
BtnEditKey.disabled = true
|
||||
|
||||
selected_section = index
|
||||
if Sections.get_item_metadata(index):
|
||||
load_keys_selected_section(Sections.get_item_metadata(index))
|
||||
|
||||
func _on_key_selected():
|
||||
selected_key = Keys.get_selected()
|
||||
BtnRemoveKey.disabled = false
|
||||
BtnEditKey.disabled = false
|
||||
|
||||
func _on_nosection_selected():
|
||||
BtnRemoveKey.disabled = true
|
||||
BtnAddKey.disabled = true
|
||||
BtnEditKey.disabled = true
|
||||
BtnRemoveSection.disabled = true
|
||||
Keys.clear()
|
||||
selected_section = -1
|
||||
|
||||
func _on_nokey_selected():
|
||||
BtnRemoveKey.disabled = true
|
||||
BtnEditKey.disabled = true
|
||||
|
||||
func create_root():
|
||||
root = Keys.create_item()
|
||||
root.set_text(0,"KEY_NAME")
|
||||
root.set_text(1,"KEY_VALUE")
|
||||
|
||||
func _on_visibility_changed():
|
||||
if visible:
|
||||
pass
|
33
addons/file-editor/scripts/LastOpenedFiles.gd
Normal file
@ -0,0 +1,33 @@
|
||||
tool
|
||||
extends Node
|
||||
|
||||
const lastopenedfile_path : String = "res://addons/file-editor/lastopenedfiles.lastcfg"
|
||||
|
||||
func _ready():
|
||||
pass
|
||||
|
||||
func store_opened_files(filecontainer : Control):
|
||||
var file = ConfigFile.new()
|
||||
file.load(lastopenedfile_path)
|
||||
for child in range(0,filecontainer.get_item_count()):
|
||||
var filepath = filecontainer.get_item_metadata(child)[0].current_path
|
||||
file.set_value("Opened",filepath.get_file(),filepath)
|
||||
|
||||
file.save(lastopenedfile_path)
|
||||
|
||||
func remove_opened_file(index : int , filecontainer : Control):
|
||||
var file = ConfigFile.new()
|
||||
file.load(lastopenedfile_path)
|
||||
var filepath = filecontainer.get_item_metadata(index)[0].current_path
|
||||
file.set_value("Opened",filepath.get_file(),null)
|
||||
file.save(lastopenedfile_path)
|
||||
|
||||
func load_opened_files() -> Array:
|
||||
var file = ConfigFile.new()
|
||||
file.load(lastopenedfile_path)
|
||||
var keys = []
|
||||
if file.has_section("Opened"):
|
||||
var openedfiles = file.get_section_keys("Opened")
|
||||
for openedfile in openedfiles:
|
||||
keys.append([openedfile,file.get_value("Opened",openedfile)])
|
||||
return keys
|
160
addons/file-editor/scripts/Preview.gd
Normal file
@ -0,0 +1,160 @@
|
||||
tool
|
||||
extends WindowDialog
|
||||
|
||||
var IconLoader = preload("res://addons/file-editor/scripts/IconLoader.gd").new()
|
||||
var LastOpenedFiles = preload("res://addons/file-editor/scripts/LastOpenedFiles.gd").new()
|
||||
|
||||
onready var TextPreview = $Container/TextPreview
|
||||
onready var TablePreview = $Container/TablePreview
|
||||
|
||||
signal image_downloaded()
|
||||
signal image_loaded()
|
||||
|
||||
var imgBuffer : Image
|
||||
|
||||
func _ready():
|
||||
TextPreview.hide()
|
||||
TablePreview.hide()
|
||||
|
||||
func print_preview(content : String):
|
||||
TextPreview.append_bbcode(content)
|
||||
TextPreview.show()
|
||||
|
||||
func print_bb(content : String):
|
||||
TextPreview.append_bbcode(content)
|
||||
TextPreview.show()
|
||||
|
||||
func print_markdown(content : String):
|
||||
var result = ""
|
||||
var bolded = []
|
||||
var italics = []
|
||||
var striked = []
|
||||
var coded = []
|
||||
var linknames = []
|
||||
var images = []
|
||||
var links = []
|
||||
var lists = []
|
||||
var underlined = []
|
||||
|
||||
var regex = RegEx.new()
|
||||
regex.compile('\\*\\*(?<boldtext>.*)\\*\\*')
|
||||
result = regex.search_all(content)
|
||||
if result:
|
||||
for res in result:
|
||||
bolded.append(res.get_string("boldtext"))
|
||||
|
||||
regex.compile('\\_\\_(?<underlinetext>.*)\\_\\_')
|
||||
result = regex.search_all(content)
|
||||
if result:
|
||||
for res in result:
|
||||
underlined.append(res.get_string("underlinetext"))
|
||||
|
||||
regex.compile("\\*(?<italictext>.*)\\*")
|
||||
result = regex.search_all(content)
|
||||
if result:
|
||||
for res in result:
|
||||
italics.append(res.get_string("italictext"))
|
||||
|
||||
regex.compile("~~(?<strikedtext>.*)~~")
|
||||
result = regex.search_all(content)
|
||||
if result:
|
||||
for res in result:
|
||||
striked.append(res.get_string("strikedtext"))
|
||||
|
||||
regex.compile("`(?<coded>.*)`")
|
||||
result = regex.search_all(content)
|
||||
if result:
|
||||
for res in result:
|
||||
coded.append(res.get_string("coded"))
|
||||
|
||||
regex.compile("[+-*](?<element>\\s.*)")
|
||||
result = regex.search_all(content)
|
||||
if result:
|
||||
for res in result:
|
||||
lists.append(res.get_string("element"))
|
||||
|
||||
regex.compile("(?<img>!\\[.*?\\))")
|
||||
result = regex.search_all(content)
|
||||
if result:
|
||||
for res in result:
|
||||
images.append(res.get_string("img"))
|
||||
|
||||
regex.compile("\\[(?<linkname>.*?)\\]|\\((?<link>[h\\.]\\S*?)\\)")
|
||||
result = regex.search_all(content)
|
||||
if result:
|
||||
for res in result:
|
||||
if res.get_string("link")!="":
|
||||
links.append(res.get_string("link"))
|
||||
if res.get_string("linkname")!="":
|
||||
linknames.append(res.get_string("linkname"))
|
||||
|
||||
for bold in bolded:
|
||||
content = content.replace("**"+bold+"**","[b]"+bold+"[/b]")
|
||||
for italic in italics:
|
||||
content = content.replace("*"+italic+"*","[i]"+italic+"[/i]")
|
||||
for strik in striked:
|
||||
content = content.replace("~~"+strik+"~~","[s]"+strik+"[/s]")
|
||||
for underline in underlined:
|
||||
content = content.replace("__"+underline+"__","[u]"+underline+"[/u]")
|
||||
for code in coded:
|
||||
content = content.replace("`"+code+"`","[code]"+code+"[/code]")
|
||||
for image in images:
|
||||
var substr = image.split("(")
|
||||
var imglink = substr[1].rstrip(")")
|
||||
content = content.replace(image,"[img]"+imglink+"[/img]")
|
||||
for i in links.size():
|
||||
content = content.replace("["+linknames[i]+"]("+links[i]+")","[url="+links[i]+"]"+linknames[i]+"[/url]")
|
||||
for element in lists:
|
||||
if content.find("- "+element):
|
||||
content = content.replace("-"+element,"[indent]-"+element+"[/indent]")
|
||||
if content.find("+ "+element):
|
||||
content = content.replace("+"+element,"[indent]-"+element+"[/indent]")
|
||||
if content.find("* "+element):
|
||||
content = content.replace("+"+element,"[indent]-"+element+"[/indent]")
|
||||
|
||||
TextPreview.append_bbcode(content)
|
||||
TextPreview.show()
|
||||
|
||||
func print_html(content : String):
|
||||
content = content.replace("<i>","[i]")
|
||||
content = content.replace("</i>","[/i]")
|
||||
content = content.replace("<b>","[b]")
|
||||
content = content.replace("</b>","[/b]")
|
||||
content = content.replace("<u>","[u]")
|
||||
content = content.replace("</u>","[/u]")
|
||||
content = content.replace("<ins>","[u]")
|
||||
content = content.replace("</ins>","[/u]")
|
||||
content = content.replace("<del>","[s]")
|
||||
content = content.replace("</del>","[/s]")
|
||||
content = content.replace('<a href="',"[url=")
|
||||
content = content.replace('">',"]")
|
||||
content = content.replace("</a>","[/url]")
|
||||
content = content.replace('<img src="',"[img]")
|
||||
content = content.replace('" />',"[/img]")
|
||||
content = content.replace('"/>',"[/img]")
|
||||
content = content.replace("<pre>","[code]")
|
||||
content = content.replace("</pre>","[/code]")
|
||||
content = content.replace("<center>","[center]")
|
||||
content = content.replace("</center>","[/center]")
|
||||
content = content.replace("<right>","[right]")
|
||||
content = content.replace("</right>","[/right]")
|
||||
|
||||
TextPreview.append_bbcode(content)
|
||||
TextPreview.show()
|
||||
|
||||
func print_csv(rows : Array):
|
||||
TablePreview.columns = rows[0].size()
|
||||
for item in rows:
|
||||
for string in item:
|
||||
var label = Label.new()
|
||||
label.text = str(string)
|
||||
label.set_h_size_flags(SIZE_EXPAND)
|
||||
label.set_align(1)
|
||||
label.set_valign(1)
|
||||
TablePreview.add_child(label)
|
||||
|
||||
|
||||
TablePreview.show()
|
||||
|
||||
func _on_Preview_popup_hide():
|
||||
queue_free()
|
213
addons/file-editor/scripts/VanillaEditor.gd
Normal file
@ -0,0 +1,213 @@
|
||||
tool
|
||||
extends VBoxContainer
|
||||
|
||||
var IconLoader = preload("res://addons/file-editor/scripts/IconLoader.gd").new()
|
||||
var LastOpenedFiles = preload("res://addons/file-editor/scripts/LastOpenedFiles.gd").new()
|
||||
|
||||
onready var ReadOnly = $FileInfo/Readonly
|
||||
|
||||
onready var TextEditor = $TextEditor
|
||||
|
||||
onready var LastModified = $FileInfo/lastmodified
|
||||
|
||||
onready var FileList = get_parent().get_parent().get_parent().get_parent().get_node("FileList")
|
||||
|
||||
onready var ClosingFile = get_parent().get_parent().get_parent().get_parent().get_node("ConfirmationDialog")
|
||||
|
||||
onready var LastModifiedIcon = $FileInfo/lastmodified_icon
|
||||
|
||||
onready var SearchBox = $SearchBox
|
||||
onready var ReplaceBox = $ReplaceBox
|
||||
|
||||
onready var c_counter = $FileInfo/c_counter
|
||||
|
||||
var current_path = ""
|
||||
var current_filename = ""
|
||||
var Preview = load("res://addons/file-editor/scenes/Preview.tscn")
|
||||
|
||||
|
||||
var search_flag = 0
|
||||
|
||||
signal text_changed()
|
||||
|
||||
func _ready():
|
||||
ClosingFile.connect("confirmed",self,"queue_free")
|
||||
|
||||
ReadOnly.connect("toggled",self,"_on_Readonly_toggled")
|
||||
|
||||
ReadOnly.set("custom_icons/checked",IconLoader.load_icon_from_name("read"))
|
||||
ReadOnly.set("custom_icons/unchecked",IconLoader.load_icon_from_name("edit"))
|
||||
|
||||
add_to_group("vanilla_editor")
|
||||
|
||||
func set_wrap_enabled(enabled:bool):
|
||||
TextEditor.set_wrap_enabled(enabled)
|
||||
TextEditor.update()
|
||||
|
||||
func draw_minimap(value:bool):
|
||||
TextEditor.draw_minimap(value)
|
||||
TextEditor.update()
|
||||
|
||||
func color_region(filextension : String): # -----------------------------> dal momento che voglio creare un editor per ogni file, renderò questa funzione singola in base all'estensione del file
|
||||
match(filextension):
|
||||
"bbs":
|
||||
TextEditor.add_color_region("[b]","[/b]",Color8(153,153,255,255),false)
|
||||
TextEditor.add_color_region("[i]","[/i]",Color8(153,255,153,255),false)
|
||||
TextEditor.add_color_region("[s]","[/s]",Color8(255,153,153,255),false)
|
||||
TextEditor.add_color_region("[u]","[/u]",Color8(255,255,102,255),false)
|
||||
TextEditor.add_color_region("[url","[/url]",Color8(153,204,255,255),false)
|
||||
TextEditor.add_color_region("[code]","[/code]",Color8(192,192,192,255),false)
|
||||
TextEditor.add_color_region("[img]","[/img]",Color8(255,204,153,255),false)
|
||||
TextEditor.add_color_region("[center]","[/center]",Color8(175,238,238,255),false)
|
||||
TextEditor.add_color_region("[right]","[/right]",Color8(135,206,235,255),false)
|
||||
"html":
|
||||
TextEditor.add_color_region("<b>","</b>",Color8(153,153,255,255),false)
|
||||
TextEditor.add_color_region("<i>","</i>",Color8(153,255,153,255),false)
|
||||
TextEditor.add_color_region("<del>","</del>",Color8(255,153,153,255),false)
|
||||
TextEditor.add_color_region("<ins>","</ins>",Color8(255,255,102,255),false)
|
||||
TextEditor.add_color_region("<a","</a>",Color8(153,204,255,255),false)
|
||||
TextEditor.add_color_region("<img","/>",Color8(255,204,153,255),true)
|
||||
TextEditor.add_color_region("<pre>","</pre>",Color8(192,192,192,255),false)
|
||||
TextEditor.add_color_region("<center>","</center>",Color8(175,238,238,255),false)
|
||||
TextEditor.add_color_region("<right>","</right>",Color8(135,206,235,255),false)
|
||||
"md":
|
||||
TextEditor.add_color_region("***","***",Color8(126,186,181,255),false)
|
||||
TextEditor.add_color_region("**","**",Color8(153,153,255,255),false)
|
||||
TextEditor.add_color_region("*","*",Color8(153,255,153,255),false)
|
||||
TextEditor.add_color_region("+ ","",Color8(255,178,102,255),false)
|
||||
TextEditor.add_color_region("- ","",Color8(255,178,102,255),false)
|
||||
TextEditor.add_color_region("~~","~~",Color8(255,153,153,255),false)
|
||||
TextEditor.add_color_region("__","__",Color8(255,255,102,255),false)
|
||||
TextEditor.add_color_region("[",")",Color8(153,204,255,255),false)
|
||||
TextEditor.add_color_region("`","`",Color8(192,192,192,255),false)
|
||||
TextEditor.add_color_region('"*.','"',Color8(255,255,255,255),true)
|
||||
TextEditor.add_color_region("# ","",Color8(105,105,105,255),true)
|
||||
TextEditor.add_color_region("## ","",Color8(128,128,128,255),true)
|
||||
TextEditor.add_color_region("### ","",Color8(169,169,169,255),true)
|
||||
TextEditor.add_color_region("#### ","",Color8(192,192,192,255),true)
|
||||
TextEditor.add_color_region("##### ","",Color8(211,211,211,255),true)
|
||||
TextEditor.add_color_region("###### ","",Color8(255,255,255,255),true)
|
||||
TextEditor.add_color_region("> ","",Color8(172,138,79,255),true)
|
||||
"cfg":
|
||||
TextEditor.add_color_region("[","]",Color8(153,204,255,255),false)
|
||||
TextEditor.add_color_region('"','"',Color8(255,255,102,255),false)
|
||||
TextEditor.add_color_region(';','',Color8(128,128,128,255),true)
|
||||
"ini":
|
||||
TextEditor.add_color_region("[","]",Color8(153,204,255,255),false)
|
||||
TextEditor.add_color_region('"','"',Color8(255,255,102,255),false)
|
||||
TextEditor.add_color_region(';','',Color8(128,128,128,255),true)
|
||||
_:
|
||||
pass
|
||||
|
||||
func clean_editor():
|
||||
TextEditor.set_text("")
|
||||
LastModifiedIcon.texture = IconLoader.load_icon_from_name("save")
|
||||
LastModified.set_text("")
|
||||
FileList.invalidate()
|
||||
current_filename = ""
|
||||
current_path = ""
|
||||
|
||||
func new_file_open(file_content : String, last_modified : Dictionary, current_file_path : String):
|
||||
current_path = current_file_path
|
||||
current_filename = current_file_path.get_file()
|
||||
color_region(current_filename.get_extension())
|
||||
TextEditor.set_text(file_content)
|
||||
update_lastmodified(last_modified,"save")
|
||||
FileList.invalidate()
|
||||
count_characters()
|
||||
|
||||
func update_lastmodified(last_modified : Dictionary, icon : String):
|
||||
LastModified.set_text(str(last_modified.hour)+":"+str(last_modified.minute)+" "+str(last_modified.day)+"/"+str(last_modified.month)+"/"+str(last_modified.year))
|
||||
LastModifiedIcon.texture = IconLoader.load_icon_from_name(icon)
|
||||
|
||||
func new_file_create(file_name):
|
||||
TextEditor.set_text("")
|
||||
|
||||
FileList.invalidate()
|
||||
|
||||
func _on_Readonly_toggled(button_pressed):
|
||||
if button_pressed:
|
||||
ReadOnly.set_text("Read Only")
|
||||
TextEditor.readonly = (true)
|
||||
else:
|
||||
ReadOnly.set_text("Can Edit")
|
||||
TextEditor.readonly = (false)
|
||||
|
||||
func _on_TextEditor_text_changed():
|
||||
LastModifiedIcon.texture = IconLoader.load_icon_from_name("saveas")
|
||||
count_characters()
|
||||
emit_signal("text_changed")
|
||||
|
||||
func count_characters():
|
||||
var counted : int = 0
|
||||
for line in TextEditor.get_line_count():
|
||||
counted += TextEditor.get_line(line).length()
|
||||
c_counter.set_text(str(counted))
|
||||
|
||||
func _on_LineEdit_text_changed(new_text):
|
||||
var linecount = TextEditor.get_line_count()
|
||||
if new_text != "":
|
||||
var found
|
||||
var find = false
|
||||
for line in range(0,linecount):
|
||||
for column in range(0,TextEditor.get_line(line).length()):
|
||||
found = TextEditor.search( new_text, search_flag, line , column )
|
||||
if found.size():
|
||||
if found[1] == line:
|
||||
# if not find:
|
||||
TextEditor.select(line,found[0],found[1],found[0]+new_text.length())
|
||||
# find = true
|
||||
else:
|
||||
TextEditor.select(0,0,0,0)
|
||||
else:
|
||||
TextEditor.select(0,0,0,0)
|
||||
|
||||
func _on_matchcase_toggled(button_pressed):
|
||||
if button_pressed:
|
||||
search_flag = 1
|
||||
else:
|
||||
if $SearchBox/wholewords.is_pressed():
|
||||
search_flag = 2
|
||||
else:
|
||||
search_flag = 0
|
||||
_on_LineEdit_text_changed($SearchBox/LineEdit.get_text())
|
||||
|
||||
func _on_wholewords_toggled(button_pressed):
|
||||
if button_pressed:
|
||||
search_flag = 2
|
||||
else:
|
||||
if $SearchBox/matchcase.is_pressed():
|
||||
search_flag = 1
|
||||
else:
|
||||
search_flag = 0
|
||||
_on_LineEdit_text_changed($SearchBox/LineEdit.get_text())
|
||||
|
||||
func _on_close_pressed():
|
||||
SearchBox.hide()
|
||||
|
||||
func open_searchbox():
|
||||
if SearchBox.visible:
|
||||
SearchBox.hide()
|
||||
else:
|
||||
SearchBox.show()
|
||||
SearchBox.get_node("LineEdit").grab_focus()
|
||||
|
||||
func _on_Button_pressed():
|
||||
var linecount = TextEditor.get_line_count()-1
|
||||
var old_text = $ReplaceBox/replace.get_text()
|
||||
var new_text = $ReplaceBox/with.get_text()
|
||||
var text = TextEditor.get_text()
|
||||
TextEditor.set_text(text.replace(old_text,new_text))
|
||||
|
||||
func open_replacebox():
|
||||
if ReplaceBox.visible:
|
||||
ReplaceBox.hide()
|
||||
else:
|
||||
ReplaceBox.show()
|
||||
ReplaceBox.get_node("replace").grab_focus()
|
||||
|
||||
func _on_close2_pressed():
|
||||
ReplaceBox.hide()
|
||||
|
||||
func _on_LineEdit_focus_entered():
|
||||
_on_LineEdit_text_changed($SearchBox/LineEdit.get_text())
|
33
addons/file-editor/scripts/file-editor.gd
Normal file
@ -0,0 +1,33 @@
|
||||
tool
|
||||
extends EditorPlugin
|
||||
|
||||
#var doc = preload("../scenes/FileEditor.tscn")
|
||||
|
||||
var IconLoader = preload("res://addons/file-editor/scripts/IconLoader.gd").new()
|
||||
|
||||
var FileEditor
|
||||
|
||||
func _enter_tree():
|
||||
add_autoload_singleton("IconLoader","res://addons/file-editor/scripts/IconLoader.gd")
|
||||
add_autoload_singleton("LastOpenedFiles","res://addons/file-editor/scripts/LastOpenedFiles.gd")
|
||||
FileEditor = preload("../scenes/FileEditor.tscn").instance()
|
||||
get_editor_interface().get_editor_viewport().add_child(FileEditor)
|
||||
FileEditor.hide()
|
||||
|
||||
func _exit_tree():
|
||||
# FileEditor.clean_editor()
|
||||
remove_autoload_singleton("IconLoader")
|
||||
remove_autoload_singleton("LastOpenedFiles")
|
||||
get_editor_interface().get_editor_viewport().remove_child(FileEditor)
|
||||
|
||||
func has_main_screen():
|
||||
return true
|
||||
|
||||
func get_plugin_name():
|
||||
return "File"
|
||||
|
||||
func get_plugin_icon():
|
||||
return IconLoader.load_icon_from_name("file")
|
||||
|
||||
func make_visible(visible):
|
||||
FileEditor.visible = visible
|
BIN
addons/github-integration/fonts/Roboto-Black.ttf
Normal file
BIN
addons/github-integration/fonts/Roboto-Black.ttf.tmp
Normal file
BIN
addons/github-integration/fonts/Roboto-Regular.ttf
Normal file
BIN
addons/github-integration/fonts/Roboto-Regular.ttf.tmp
Normal file
BIN
addons/github-integration/fonts/SEGOEUI.TTF
Normal file
BIN
addons/github-integration/fonts/SEGOEUIB.TTF
Normal file
BIN
addons/github-integration/icons.pngs/add-gray.png.iconpng
Normal file
After Width: | Height: | Size: 146 B |
BIN
addons/github-integration/icons.pngs/add.png.iconpng
Normal file
After Width: | Height: | Size: 146 B |
BIN
addons/github-integration/icons.pngs/align.png.buttonicon
Normal file
After Width: | Height: | Size: 195 B |
BIN
addons/github-integration/icons.pngs/background.png.iconpng
Normal file
After Width: | Height: | Size: 118 B |
BIN
addons/github-integration/icons.pngs/circle.png.iconpng
Normal file
After Width: | Height: | Size: 885 B |
BIN
addons/github-integration/icons.pngs/column.png.buttonicon
Normal file
After Width: | Height: | Size: 146 B |
BIN
addons/github-integration/icons.pngs/connection.png.iconpng
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
addons/github-integration/icons.pngs/delete.png.buttonicon
Normal file
After Width: | Height: | Size: 183 B |
BIN
addons/github-integration/icons.pngs/dir-gray.png.iconpng
Normal file
After Width: | Height: | Size: 171 B |
BIN
addons/github-integration/icons.pngs/dir.png.iconpng
Normal file
After Width: | Height: | Size: 171 B |
BIN
addons/github-integration/icons.pngs/download-gray.png.iconpng
Normal file
After Width: | Height: | Size: 232 B |
BIN
addons/github-integration/icons.pngs/download.png.iconpng
Normal file
After Width: | Height: | Size: 232 B |