2014-02-10 02:10:30 +01:00
/*************************************************************************/
/* script_editor_plugin.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* http://www.godotengine.org */
/*************************************************************************/
2017-01-01 22:01:57 +01:00
/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
2017-04-08 00:45:00 +02:00
/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
2014-02-10 02:10:30 +01:00
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
# include "script_editor_plugin.h"
2017-03-19 00:36:26 +01:00
# include "editor/editor_node.h"
2017-03-18 23:45:45 +01:00
# include "editor/editor_settings.h"
2017-03-19 00:36:26 +01:00
# include "editor/script_editor_debugger.h"
# include "globals.h"
2014-02-10 02:10:30 +01:00
# include "io/resource_loader.h"
# include "io/resource_saver.h"
2017-03-19 00:36:26 +01:00
# include "os/file_access.h"
# include "os/input.h"
# include "os/keyboard.h"
2014-02-10 02:10:30 +01:00
# include "os/os.h"
# include "scene/main/viewport.h"
2015-06-22 05:03:19 +02:00
/*** SCRIPT EDITOR ****/
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
static bool _can_open_in_editor ( Script * p_script ) {
2016-07-07 01:35:49 +02:00
String path = p_script - > get_path ( ) ;
2017-03-19 00:36:26 +01:00
if ( path . find ( " :: " ) ! = - 1 ) {
2016-07-07 01:35:49 +02:00
//refuse handling this if it can't be edited
2017-03-19 00:36:26 +01:00
bool valid = false ;
for ( int i = 0 ; i < EditorNode : : get_singleton ( ) - > get_editor_data ( ) . get_edited_scene_count ( ) ; i + + ) {
2016-07-07 01:35:49 +02:00
if ( path . begins_with ( EditorNode : : get_singleton ( ) - > get_editor_data ( ) . get_scene_path ( i ) ) ) {
2017-03-19 00:36:26 +01:00
valid = true ;
2016-07-07 01:35:49 +02:00
break ;
}
}
return valid ;
}
return true ;
}
2015-06-26 06:14:31 +02:00
class EditorScriptCodeCompletionCache : public ScriptCodeCompletionCache {
struct Cache {
uint64_t time_loaded ;
RES cache ;
} ;
2017-03-19 00:36:26 +01:00
Map < String , Cache > cached ;
2015-06-26 06:14:31 +02:00
public :
uint64_t max_time_cache ;
int max_cache_size ;
void cleanup ( ) {
2017-03-19 00:36:26 +01:00
List < Map < String , Cache > : : Element * > to_clean ;
2015-06-26 06:14:31 +02:00
2017-03-19 00:36:26 +01:00
Map < String , Cache > : : Element * I = cached . front ( ) ;
while ( I ) {
if ( ( OS : : get_singleton ( ) - > get_ticks_msec ( ) - I - > get ( ) . time_loaded ) > max_time_cache ) {
2015-06-26 06:14:31 +02:00
to_clean . push_back ( I ) ;
}
2017-03-19 00:36:26 +01:00
I = I - > next ( ) ;
2015-06-26 06:14:31 +02:00
}
2017-03-19 00:36:26 +01:00
while ( to_clean . front ( ) ) {
2015-06-26 06:14:31 +02:00
cached . erase ( to_clean . front ( ) - > get ( ) ) ;
to_clean . pop_front ( ) ;
}
}
2017-03-19 00:36:26 +01:00
RES get_cached_resource ( const String & p_path ) {
2015-06-26 06:14:31 +02:00
2017-03-19 00:36:26 +01:00
Map < String , Cache > : : Element * E = cached . find ( p_path ) ;
2015-06-26 06:14:31 +02:00
if ( ! E ) {
Cache c ;
2017-03-19 00:36:26 +01:00
c . cache = ResourceLoader : : load ( p_path ) ;
E = cached . insert ( p_path , c ) ;
2015-06-26 06:14:31 +02:00
}
2017-03-19 00:36:26 +01:00
E - > get ( ) . time_loaded = OS : : get_singleton ( ) - > get_ticks_msec ( ) ;
2015-06-26 06:14:31 +02:00
2017-03-19 00:36:26 +01:00
if ( cached . size ( ) > max_cache_size ) {
2015-06-26 06:14:31 +02:00
uint64_t older ;
2017-03-19 00:36:26 +01:00
Map < String , Cache > : : Element * O = cached . front ( ) ;
older = O - > get ( ) . time_loaded ;
Map < String , Cache > : : Element * I = O ;
while ( I ) {
if ( I - > get ( ) . time_loaded < older ) {
2015-06-26 06:14:31 +02:00
older = I - > get ( ) . time_loaded ;
2017-03-19 00:36:26 +01:00
O = I ;
2015-06-26 06:14:31 +02:00
}
2017-03-19 00:36:26 +01:00
I = I - > next ( ) ;
2015-06-26 06:14:31 +02:00
}
2017-03-19 00:36:26 +01:00
if ( O ! = E ) { //should never heppane..
2015-06-26 06:14:31 +02:00
cached . erase ( O ) ;
}
}
return E - > get ( ) . cache ;
}
EditorScriptCodeCompletionCache ( ) {
2017-03-19 00:36:26 +01:00
max_cache_size = 128 ;
max_time_cache = 5 * 60 * 1000 ; //minutes, five
2015-06-26 06:14:31 +02:00
}
} ;
2015-06-22 05:03:19 +02:00
# define SORT_SCRIPT_LIST
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
void ScriptEditorQuickOpen : : popup ( const Vector < String > & p_functions , bool p_dontclear ) {
2014-02-10 02:10:30 +01:00
popup_centered_ratio ( 0.6 ) ;
if ( p_dontclear )
search_box - > select_all ( ) ;
else
search_box - > clear ( ) ;
search_box - > grab_focus ( ) ;
2017-03-19 00:36:26 +01:00
functions = p_functions ;
2014-02-10 02:10:30 +01:00
_update_search ( ) ;
}
2017-03-19 00:36:26 +01:00
void ScriptEditorQuickOpen : : _text_changed ( const String & p_newtext ) {
2014-02-10 02:10:30 +01:00
_update_search ( ) ;
}
2017-03-19 00:36:26 +01:00
void ScriptEditorQuickOpen : : _sbox_input ( const InputEvent & p_ie ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
if ( p_ie . type = = InputEvent : : KEY & & ( p_ie . key . scancode = = KEY_UP | |
p_ie . key . scancode = = KEY_DOWN | |
p_ie . key . scancode = = KEY_PAGEUP | |
p_ie . key . scancode = = KEY_PAGEDOWN ) ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
search_options - > call ( " _input_event " , p_ie ) ;
2014-02-10 02:10:30 +01:00
search_box - > accept_event ( ) ;
}
}
void ScriptEditorQuickOpen : : _update_search ( ) {
search_options - > clear ( ) ;
TreeItem * root = search_options - > create_item ( ) ;
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < functions . size ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
String file = functions [ i ] ;
2017-03-19 00:36:26 +01:00
if ( ( search_box - > get_text ( ) = = " " | | file . findn ( search_box - > get_text ( ) ) ! = - 1 ) ) {
2014-02-10 02:10:30 +01:00
TreeItem * ti = search_options - > create_item ( root ) ;
2017-03-19 00:36:26 +01:00
ti - > set_text ( 0 , file ) ;
if ( root - > get_children ( ) = = ti )
2014-02-10 02:10:30 +01:00
ti - > select ( 0 ) ;
}
}
2017-03-19 00:36:26 +01:00
get_ok ( ) - > set_disabled ( root - > get_children ( ) = = NULL ) ;
2014-02-10 02:10:30 +01:00
}
void ScriptEditorQuickOpen : : _confirmed ( ) {
TreeItem * ti = search_options - > get_selected ( ) ;
if ( ! ti )
return ;
2017-03-19 00:36:26 +01:00
int line = ti - > get_text ( 0 ) . get_slice ( " : " , 1 ) . to_int ( ) ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
emit_signal ( " goto_line " , line - 1 ) ;
2014-02-10 02:10:30 +01:00
hide ( ) ;
}
void ScriptEditorQuickOpen : : _notification ( int p_what ) {
2017-03-19 00:36:26 +01:00
if ( p_what = = NOTIFICATION_ENTER_TREE ) {
2015-06-22 05:03:19 +02:00
2017-03-19 00:36:26 +01:00
connect ( " confirmed " , this , " _confirmed " ) ;
2014-02-10 02:10:30 +01:00
}
}
void ScriptEditorQuickOpen : : _bind_methods ( ) {
2017-03-19 00:36:26 +01:00
ObjectTypeDB : : bind_method ( _MD ( " _text_changed " ) , & ScriptEditorQuickOpen : : _text_changed ) ;
ObjectTypeDB : : bind_method ( _MD ( " _confirmed " ) , & ScriptEditorQuickOpen : : _confirmed ) ;
ObjectTypeDB : : bind_method ( _MD ( " _sbox_input " ) , & ScriptEditorQuickOpen : : _sbox_input ) ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
ADD_SIGNAL ( MethodInfo ( " goto_line " , PropertyInfo ( Variant : : INT , " line " ) ) ) ;
2014-02-10 02:10:30 +01:00
}
ScriptEditorQuickOpen : : ScriptEditorQuickOpen ( ) {
2017-03-19 00:36:26 +01:00
VBoxContainer * vbc = memnew ( VBoxContainer ) ;
2014-02-10 02:10:30 +01:00
add_child ( vbc ) ;
set_child_rect ( vbc ) ;
2017-03-19 00:36:26 +01:00
search_box = memnew ( LineEdit ) ;
vbc - > add_margin_child ( TTR ( " Search: " ) , search_box ) ;
search_box - > connect ( " text_changed " , this , " _text_changed " ) ;
search_box - > connect ( " input_event " , this , " _sbox_input " ) ;
search_options = memnew ( Tree ) ;
vbc - > add_margin_child ( TTR ( " Matches: " ) , search_options , true ) ;
2016-05-04 03:25:37 +02:00
get_ok ( ) - > set_text ( TTR ( " Open " ) ) ;
2014-02-10 02:10:30 +01:00
get_ok ( ) - > set_disabled ( true ) ;
register_text_enter ( search_box ) ;
set_hide_on_ok ( false ) ;
2017-03-19 00:36:26 +01:00
search_options - > connect ( " item_activated " , this , " _confirmed " ) ;
2014-02-10 02:10:30 +01:00
search_options - > set_hide_root ( true ) ;
}
/////////////////////////////////
2017-03-19 00:36:26 +01:00
ScriptEditor * ScriptEditor : : script_editor = NULL ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
Vector < String > ScriptTextEditor : : get_functions ( ) {
2014-02-10 02:10:30 +01:00
String errortxt ;
2017-03-19 00:36:26 +01:00
int line = - 1 , col ;
TextEdit * te = get_text_edit ( ) ;
2014-02-10 02:10:30 +01:00
String text = te - > get_text ( ) ;
List < String > fnc ;
2017-03-19 00:36:26 +01:00
if ( script - > get_language ( ) - > validate ( text , line , col , errortxt , script - > get_path ( ) , & fnc ) ) {
2014-02-10 02:10:30 +01:00
//if valid rewrite functions to latest
functions . clear ( ) ;
2017-03-19 00:36:26 +01:00
for ( List < String > : : Element * E = fnc . front ( ) ; E ; E = E - > next ( ) ) {
2014-02-10 02:10:30 +01:00
functions . push_back ( E - > get ( ) ) ;
}
}
return functions ;
}
void ScriptTextEditor : : apply_code ( ) {
if ( script . is_null ( ) )
return ;
2017-03-19 00:36:26 +01:00
// print_line("applying code");
2014-02-10 02:10:30 +01:00
script - > set_source_code ( get_text_edit ( ) - > get_text ( ) ) ;
2014-09-22 05:50:48 +02:00
script - > update_exports ( ) ;
2014-02-10 02:10:30 +01:00
}
Ref < Script > ScriptTextEditor : : get_edited_script ( ) const {
return script ;
}
void ScriptTextEditor : : _load_theme_settings ( ) {
get_text_edit ( ) - > clear_colors ( ) ;
/* keyword color */
2017-03-19 00:36:26 +01:00
get_text_edit ( ) - > set_custom_bg_color ( EDITOR_DEF ( " text_editor/background_color " , Color ( 0 , 0 , 0 , 0 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " completion_background_color " , EDITOR_DEF ( " text_editor/completion_background_color " , Color ( 0 , 0 , 0 , 0 ) ) ) ;
2016-06-21 18:21:55 +02:00
get_text_edit ( ) - > add_color_override ( " completion_selected_color " , EDITOR_DEF ( " text_editor/completion_selected_color " , Color : : html ( " 434244 " ) ) ) ;
2016-06-21 18:34:38 +02:00
get_text_edit ( ) - > add_color_override ( " completion_existing_color " , EDITOR_DEF ( " text_editor/completion_existing_color " , Color : : html ( " 21dfdfdf " ) ) ) ;
2016-07-11 15:11:34 +02:00
get_text_edit ( ) - > add_color_override ( " completion_scroll_color " , EDITOR_DEF ( " text_editor/completion_scroll_color " , Color : : html ( " ffffff " ) ) ) ;
2016-07-11 15:25:56 +02:00
get_text_edit ( ) - > add_color_override ( " completion_font_color " , EDITOR_DEF ( " text_editor/completion_font_color " , Color : : html ( " aaaaaa " ) ) ) ;
2017-03-19 00:36:26 +01:00
get_text_edit ( ) - > add_color_override ( " font_color " , EDITOR_DEF ( " text_editor/text_color " , Color ( 0 , 0 , 0 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " line_number_color " , EDITOR_DEF ( " text_editor/line_number_color " , Color ( 0 , 0 , 0 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " caret_color " , EDITOR_DEF ( " text_editor/caret_color " , Color ( 0 , 0 , 0 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " caret_background_color " , EDITOR_DEF ( " text_editor/caret_background_color " , Color ( 0 , 0 , 0 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " font_selected_color " , EDITOR_DEF ( " text_editor/text_selected_color " , Color ( 1 , 1 , 1 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " selection_color " , EDITOR_DEF ( " text_editor/selection_color " , Color ( 0.2 , 0.2 , 1 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " brace_mismatch_color " , EDITOR_DEF ( " text_editor/brace_mismatch_color " , Color ( 1 , 0.2 , 0.2 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " current_line_color " , EDITOR_DEF ( " text_editor/current_line_color " , Color ( 0.3 , 0.5 , 0.8 , 0.15 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " word_highlighted_color " , EDITOR_DEF ( " text_editor/word_highlighted_color " , Color ( 0.8 , 0.9 , 0.9 , 0.15 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " number_color " , EDITOR_DEF ( " text_editor/number_color " , Color ( 0.9 , 0.6 , 0.0 , 2 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " function_color " , EDITOR_DEF ( " text_editor/function_color " , Color ( 0.4 , 0.6 , 0.8 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " member_variable_color " , EDITOR_DEF ( " text_editor/member_variable_color " , Color ( 0.9 , 0.3 , 0.3 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " mark_color " , EDITOR_DEF ( " text_editor/mark_color " , Color ( 1.0 , 0.4 , 0.4 , 0.4 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " breakpoint_color " , EDITOR_DEF ( " text_editor/breakpoint_color " , Color ( 0.8 , 0.8 , 0.4 , 0.2 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " search_result_color " , EDITOR_DEF ( " text_editor/search_result_color " , Color ( 0.05 , 0.25 , 0.05 , 1 ) ) ) ;
get_text_edit ( ) - > add_color_override ( " search_result_border_color " , EDITOR_DEF ( " text_editor/search_result_border_color " , Color ( 0.1 , 0.45 , 0.1 , 1 ) ) ) ;
get_text_edit ( ) - > add_constant_override ( " line_spacing " , EDITOR_DEF ( " text_editor/line_spacing " , 4 ) ) ;
Color keyword_color = EDITOR_DEF ( " text_editor/keyword_color " , Color ( 0.5 , 0.0 , 0.2 ) ) ;
2014-02-10 02:10:30 +01:00
List < String > keywords ;
script - > get_language ( ) - > get_reserved_words ( & keywords ) ;
2017-03-19 00:36:26 +01:00
for ( List < String > : : Element * E = keywords . front ( ) ; E ; E = E - > next ( ) ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
get_text_edit ( ) - > add_keyword_color ( E - > get ( ) , keyword_color ) ;
2014-02-10 02:10:30 +01:00
}
//colorize core types
2017-03-19 00:36:26 +01:00
Color basetype_color = EDITOR_DEF ( " text_editor/base_type_color " , Color ( 0.3 , 0.3 , 0.0 ) ) ;
get_text_edit ( ) - > add_keyword_color ( " Vector2 " , basetype_color ) ;
get_text_edit ( ) - > add_keyword_color ( " Vector3 " , basetype_color ) ;
get_text_edit ( ) - > add_keyword_color ( " Plane " , basetype_color ) ;
get_text_edit ( ) - > add_keyword_color ( " Quat " , basetype_color ) ;
get_text_edit ( ) - > add_keyword_color ( " AABB " , basetype_color ) ;
get_text_edit ( ) - > add_keyword_color ( " Matrix3 " , basetype_color ) ;
get_text_edit ( ) - > add_keyword_color ( " Transform " , basetype_color ) ;
get_text_edit ( ) - > add_keyword_color ( " Color " , basetype_color ) ;
get_text_edit ( ) - > add_keyword_color ( " Image " , basetype_color ) ;
get_text_edit ( ) - > add_keyword_color ( " InputEvent " , basetype_color ) ;
get_text_edit ( ) - > add_keyword_color ( " Rect2 " , basetype_color ) ;
get_text_edit ( ) - > add_keyword_color ( " NodePath " , basetype_color ) ;
2014-02-10 02:10:30 +01:00
//colorize engine types
2017-03-19 00:36:26 +01:00
Color type_color = EDITOR_DEF ( " text_editor/engine_type_color " , Color ( 0.0 , 0.2 , 0.4 ) ) ;
2014-02-10 02:10:30 +01:00
2015-06-29 05:29:49 +02:00
List < StringName > types ;
2014-02-10 02:10:30 +01:00
ObjectTypeDB : : get_type_list ( & types ) ;
2017-03-19 00:36:26 +01:00
for ( List < StringName > : : Element * E = types . front ( ) ; E ; E = E - > next ( ) ) {
2014-02-10 02:10:30 +01:00
2016-01-10 16:20:04 +01:00
String n = E - > get ( ) ;
if ( n . begins_with ( " _ " ) )
n = n . substr ( 1 , n . length ( ) ) ;
2017-03-19 00:36:26 +01:00
get_text_edit ( ) - > add_keyword_color ( n , type_color ) ;
2014-02-10 02:10:30 +01:00
}
//colorize comments
2017-03-19 00:36:26 +01:00
Color comment_color = EDITOR_DEF ( " text_editor/comment_color " , Color : : hex ( 0x797e7eff ) ) ;
2014-02-10 02:10:30 +01:00
List < String > comments ;
script - > get_language ( ) - > get_comment_delimiters ( & comments ) ;
2017-03-19 00:36:26 +01:00
for ( List < String > : : Element * E = comments . front ( ) ; E ; E = E - > next ( ) ) {
2014-02-10 02:10:30 +01:00
String comment = E - > get ( ) ;
2017-03-19 00:36:26 +01:00
String beg = comment . get_slice ( " " , 0 ) ;
String end = comment . get_slice_count ( " " ) > 1 ? comment . get_slice ( " " , 1 ) : String ( ) ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
get_text_edit ( ) - > add_color_region ( beg , end , comment_color , end = = " " ) ;
2014-02-10 02:10:30 +01:00
}
//colorize strings
2017-03-19 00:36:26 +01:00
Color string_color = EDITOR_DEF ( " text_editor/string_color " , Color : : hex ( 0x6b6f00ff ) ) ;
2014-02-10 02:10:30 +01:00
List < String > strings ;
script - > get_language ( ) - > get_string_delimiters ( & strings ) ;
2017-03-19 00:36:26 +01:00
for ( List < String > : : Element * E = strings . front ( ) ; E ; E = E - > next ( ) ) {
2014-02-10 02:10:30 +01:00
String string = E - > get ( ) ;
2017-03-19 00:36:26 +01:00
String beg = string . get_slice ( " " , 0 ) ;
String end = string . get_slice_count ( " " ) > 1 ? string . get_slice ( " " , 1 ) : String ( ) ;
get_text_edit ( ) - > add_color_region ( beg , end , string_color , end = = " " ) ;
2014-02-10 02:10:30 +01:00
}
//colorize symbols
2017-03-19 00:36:26 +01:00
Color symbol_color = EDITOR_DEF ( " text_editor/symbol_color " , Color : : hex ( 0x005291ff ) ) ;
2014-02-10 02:10:30 +01:00
get_text_edit ( ) - > set_symbol_color ( symbol_color ) ;
}
void ScriptTextEditor : : reload_text ( ) {
2017-03-19 00:36:26 +01:00
ERR_FAIL_COND ( script . is_null ( ) ) ;
2014-02-10 02:10:30 +01:00
2015-06-16 09:15:10 +02:00
TextEdit * te = get_text_edit ( ) ;
int column = te - > cursor_get_column ( ) ;
int row = te - > cursor_get_line ( ) ;
int h = te - > get_h_scroll ( ) ;
int v = te - > get_v_scroll ( ) ;
te - > set_text ( script - > get_source_code ( ) ) ;
te - > clear_undo_history ( ) ;
te - > cursor_set_line ( row ) ;
te - > cursor_set_column ( column ) ;
te - > set_h_scroll ( h ) ;
te - > set_v_scroll ( v ) ;
2015-12-09 13:08:41 +01:00
te - > tag_saved_version ( ) ;
2014-02-10 02:10:30 +01:00
_line_col_changed ( ) ;
}
void ScriptTextEditor : : _notification ( int p_what ) {
2017-03-19 00:36:26 +01:00
if ( p_what = = NOTIFICATION_READY ) {
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
//emit_signal("name_changed");
2014-02-10 02:10:30 +01:00
}
}
2017-03-19 00:36:26 +01:00
bool ScriptTextEditor : : is_unsaved ( ) {
2015-12-09 13:08:41 +01:00
2017-03-19 00:36:26 +01:00
return get_text_edit ( ) - > get_version ( ) ! = get_text_edit ( ) - > get_saved_version ( ) ;
2015-12-09 13:08:41 +01:00
}
2017-03-19 00:36:26 +01:00
String ScriptTextEditor : : get_name ( ) {
2014-02-10 02:10:30 +01:00
String name ;
2017-03-19 00:36:26 +01:00
if ( script - > get_path ( ) . find ( " local:// " ) = = - 1 & & script - > get_path ( ) . find ( " :: " ) = = - 1 ) {
name = script - > get_path ( ) . get_file ( ) ;
if ( get_text_edit ( ) - > get_version ( ) ! = get_text_edit ( ) - > get_saved_version ( ) ) {
name + = " (*) " ;
2014-02-10 02:10:30 +01:00
}
2017-03-19 00:36:26 +01:00
} else if ( script - > get_name ( ) ! = " " )
name = script - > get_name ( ) ;
2014-02-10 02:10:30 +01:00
else
2017-03-19 00:36:26 +01:00
name = script - > get_type ( ) + " ( " + itos ( script - > get_instance_ID ( ) ) + " ) " ;
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
return name ;
}
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
Ref < Texture > ScriptTextEditor : : get_icon ( ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
if ( get_parent_control ( ) & & get_parent_control ( ) - > has_icon ( script - > get_type ( ) , " EditorIcons " ) ) {
return get_parent_control ( ) - > get_icon ( script - > get_type ( ) , " EditorIcons " ) ;
2014-02-10 02:10:30 +01:00
}
2015-06-22 05:03:19 +02:00
return Ref < Texture > ( ) ;
}
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
void ScriptTextEditor : : set_edited_script ( const Ref < Script > & p_script ) {
2014-02-10 02:10:30 +01:00
ERR_FAIL_COND ( ! script . is_null ( ) ) ;
2017-03-19 00:36:26 +01:00
script = p_script ;
2014-02-10 02:10:30 +01:00
_load_theme_settings ( ) ;
get_text_edit ( ) - > set_text ( script - > get_source_code ( ) ) ;
get_text_edit ( ) - > clear_undo_history ( ) ;
get_text_edit ( ) - > tag_saved_version ( ) ;
2015-06-22 05:03:19 +02:00
emit_signal ( " name_changed " ) ;
2014-02-10 02:10:30 +01:00
_line_col_changed ( ) ;
}
void ScriptTextEditor : : _validate_script ( ) {
String errortxt ;
2017-03-19 00:36:26 +01:00
int line = - 1 , col ;
TextEdit * te = get_text_edit ( ) ;
2014-02-10 02:10:30 +01:00
String text = te - > get_text ( ) ;
List < String > fnc ;
2017-03-19 00:36:26 +01:00
if ( ! script - > get_language ( ) - > validate ( text , line , col , errortxt , script - > get_path ( ) , & fnc ) ) {
String error_text = " error( " + itos ( line ) + " , " + itos ( col ) + " ): " + errortxt ;
2014-02-10 02:10:30 +01:00
set_error ( error_text ) ;
} else {
set_error ( " " ) ;
2017-03-19 00:36:26 +01:00
line = - 1 ;
2014-02-10 02:10:30 +01:00
if ( ! script - > is_tool ( ) ) {
script - > set_source_code ( text ) ;
2014-09-22 05:50:48 +02:00
script - > update_exports ( ) ;
//script->reload(); //will update all the variables in property editors
2014-02-10 02:10:30 +01:00
}
functions . clear ( ) ;
2017-03-19 00:36:26 +01:00
for ( List < String > : : Element * E = fnc . front ( ) ; E ; E = E - > next ( ) ) {
2014-02-10 02:10:30 +01:00
functions . push_back ( E - > get ( ) ) ;
}
}
line - - ;
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < te - > get_line_count ( ) ; i + + ) {
te - > set_line_as_marked ( i , line = = i ) ;
2014-02-10 02:10:30 +01:00
}
2015-06-22 05:03:19 +02:00
emit_signal ( " name_changed " ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-19 00:36:26 +01:00
static Node * _find_node_for_script ( Node * p_base , Node * p_current , const Ref < Script > & p_script ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
if ( p_current - > get_owner ( ) ! = p_base & & p_base ! = p_current )
2014-12-17 02:31:57 +01:00
return NULL ;
Ref < Script > c = p_current - > get_script ( ) ;
2017-03-19 00:36:26 +01:00
if ( c = = p_script )
2014-12-17 02:31:57 +01:00
return p_current ;
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < p_current - > get_child_count ( ) ; i + + ) {
Node * found = _find_node_for_script ( p_base , p_current - > get_child ( i ) , p_script ) ;
2014-12-17 02:31:57 +01:00
if ( found )
return found ;
}
return NULL ;
}
2017-03-19 00:36:26 +01:00
static void _find_changed_scripts_for_external_editor ( Node * p_base , Node * p_current , Set < Ref < Script > > & r_scripts ) {
2015-12-09 13:08:41 +01:00
2017-03-19 00:36:26 +01:00
if ( p_current - > get_owner ( ) ! = p_base & & p_base ! = p_current )
2015-12-09 13:08:41 +01:00
return ;
Ref < Script > c = p_current - > get_script ( ) ;
if ( c . is_valid ( ) )
r_scripts . insert ( c ) ;
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < p_current - > get_child_count ( ) ; i + + ) {
_find_changed_scripts_for_external_editor ( p_base , p_current - > get_child ( i ) , r_scripts ) ;
2015-12-09 13:08:41 +01:00
}
}
2016-06-20 03:07:07 +02:00
void ScriptEditor : : _update_modified_scripts_for_external_editor ( Ref < Script > p_for_script ) {
2015-12-09 13:08:41 +01:00
if ( ! bool ( EditorSettings : : get_singleton ( ) - > get ( " external_editor/use_external_editor " ) ) )
return ;
Set < Ref < Script > > scripts ;
Node * base = get_tree ( ) - > get_edited_scene_root ( ) ;
if ( base ) {
2017-03-19 00:36:26 +01:00
_find_changed_scripts_for_external_editor ( base , base , scripts ) ;
2015-12-09 13:08:41 +01:00
}
2017-03-19 00:36:26 +01:00
for ( Set < Ref < Script > > : : Element * E = scripts . front ( ) ; E ; E = E - > next ( ) ) {
2015-12-09 13:08:41 +01:00
Ref < Script > script = E - > get ( ) ;
2017-03-19 00:36:26 +01:00
if ( p_for_script . is_valid ( ) & & p_for_script ! = script )
2016-06-20 03:07:07 +02:00
continue ;
2017-03-19 00:36:26 +01:00
if ( script - > get_path ( ) = = " " | | script - > get_path ( ) . find ( " local:// " ) ! = - 1 | | script - > get_path ( ) . find ( " :: " ) ! = - 1 ) {
2015-12-09 13:08:41 +01:00
continue ; //internal script, who cares, though weird
}
uint64_t last_date = script - > get_last_modified_time ( ) ;
uint64_t date = FileAccess : : get_modified_time ( script - > get_path ( ) ) ;
2017-03-19 00:36:26 +01:00
if ( last_date ! = date ) {
2015-12-09 13:08:41 +01:00
2017-03-19 00:36:26 +01:00
Ref < Script > rel_script = ResourceLoader : : load ( script - > get_path ( ) , script - > get_type ( ) , true ) ;
2015-12-09 13:08:41 +01:00
ERR_CONTINUE ( ! rel_script . is_valid ( ) ) ;
2017-03-19 00:36:26 +01:00
script - > set_source_code ( rel_script - > get_source_code ( ) ) ;
script - > set_last_modified_time ( rel_script - > get_last_modified_time ( ) ) ;
2015-12-09 13:08:41 +01:00
script - > update_exports ( ) ;
}
}
}
2017-03-19 00:36:26 +01:00
void ScriptTextEditor : : _code_complete_script ( const String & p_code , List < String > * r_options ) {
2014-12-17 02:31:57 +01:00
Node * base = get_tree ( ) - > get_edited_scene_root ( ) ;
if ( base ) {
2017-03-19 00:36:26 +01:00
base = _find_node_for_script ( base , base , script ) ;
2014-12-17 02:31:57 +01:00
}
String hint ;
2017-03-19 00:36:26 +01:00
Error err = script - > get_language ( ) - > complete_code ( p_code , script - > get_path ( ) . get_base_dir ( ) , base , r_options , hint ) ;
if ( hint ! = " " ) {
2014-12-17 02:31:57 +01:00
get_text_edit ( ) - > set_code_hint ( hint ) ;
}
2014-02-10 02:10:30 +01:00
}
2015-06-22 05:03:19 +02:00
void ScriptTextEditor : : _bind_methods ( ) {
ADD_SIGNAL ( MethodInfo ( " name_changed " ) ) ;
}
2014-02-10 02:10:30 +01:00
ScriptTextEditor : : ScriptTextEditor ( ) {
}
/*** SCRIPT EDITOR ******/
2017-03-19 00:36:26 +01:00
String ScriptEditor : : _get_debug_tooltip ( const String & p_text , Node * _ste ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
ScriptTextEditor * ste = _ste - > cast_to < ScriptTextEditor > ( ) ;
2014-02-10 02:10:30 +01:00
String val = debugger - > get_var_value ( p_text ) ;
2017-03-19 00:36:26 +01:00
if ( val ! = String ( ) ) {
return p_text + " : " + val ;
2014-02-10 02:10:30 +01:00
} else {
return String ( ) ;
}
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : _breaked ( bool p_breaked , bool p_can_debug ) {
2014-02-10 02:10:30 +01:00
2017-02-20 21:22:50 +01:00
if ( bool ( EditorSettings : : get_singleton ( ) - > get ( " text_editor/external/use_external_editor " ) ) ) {
return ;
}
2017-03-19 00:36:26 +01:00
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_NEXT ) , ! ( p_breaked & & p_can_debug ) ) ;
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_STEP ) , ! ( p_breaked & & p_can_debug ) ) ;
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_BREAK ) , p_breaked ) ;
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_CONTINUE ) , ! p_breaked ) ;
2014-02-10 02:10:30 +01:00
}
void ScriptEditor : : _show_debugger ( bool p_show ) {
2017-03-19 00:36:26 +01:00
// debug_menu->get_popup()->set_item_checked( debug_menu->get_popup()->get_item_index(DEBUG_SHOW), p_show);
2014-02-10 02:10:30 +01:00
}
2015-08-10 01:39:59 +02:00
void ScriptEditor : : _script_created ( Ref < Script > p_script ) {
editor - > push_item ( p_script . operator - > ( ) ) ;
}
2016-04-23 20:21:34 +02:00
void ScriptEditor : : _trim_trailing_whitespace ( TextEdit * tx ) {
bool trimed_whitespace = false ;
for ( int i = 0 ; i < tx - > get_line_count ( ) ; i + + ) {
String line = tx - > get_line ( i ) ;
if ( line . ends_with ( " " ) | | line . ends_with ( " \t " ) ) {
if ( ! trimed_whitespace ) {
tx - > begin_complex_operation ( ) ;
trimed_whitespace = true ;
}
int end = 0 ;
for ( int j = line . length ( ) - 1 ; j > - 1 ; j - - ) {
if ( line [ j ] ! = ' ' & & line [ j ] ! = ' \t ' ) {
2017-03-19 00:36:26 +01:00
end = j + 1 ;
2016-04-23 20:21:34 +02:00
break ;
}
}
tx - > set_line ( i , line . substr ( 0 , end ) ) ;
}
}
if ( trimed_whitespace ) {
tx - > end_complex_operation ( ) ;
tx - > update ( ) ;
}
}
2014-02-10 02:10:30 +01:00
void ScriptEditor : : _goto_script_line2 ( int p_line ) {
int selected = tab_container - > get_current_tab ( ) ;
2017-03-19 00:36:26 +01:00
if ( selected < 0 | | selected > = tab_container - > get_child_count ( ) )
2014-02-10 02:10:30 +01:00
return ;
ScriptTextEditor * current = tab_container - > get_child ( selected ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ! current )
return ;
current - > get_text_edit ( ) - > cursor_set_line ( p_line ) ;
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : _goto_script_line ( REF p_script , int p_line ) {
2014-02-10 02:10:30 +01:00
editor - > push_item ( p_script . ptr ( ) ) ;
_goto_script_line2 ( p_line ) ;
}
2015-11-17 13:46:08 +01:00
void ScriptEditor : : _update_history_arrows ( ) {
2017-03-19 00:36:26 +01:00
script_back - > set_disabled ( history_pos < = 0 ) ;
script_forward - > set_disabled ( history_pos > = history . size ( ) - 1 ) ;
2015-11-17 13:46:08 +01:00
}
void ScriptEditor : : _go_to_tab ( int p_idx ) {
Node * cn = tab_container - > get_child ( p_idx ) ;
if ( ! cn )
return ;
Control * c = cn - > cast_to < Control > ( ) ;
if ( ! c )
return ;
2017-03-19 00:36:26 +01:00
if ( history_pos > = 0 & & history_pos < history . size ( ) & & history [ history_pos ] . control = = tab_container - > get_current_tab_control ( ) ) {
2015-11-17 13:46:08 +01:00
Node * n = tab_container - > get_current_tab_control ( ) ;
if ( n - > cast_to < ScriptTextEditor > ( ) ) {
2017-03-19 00:36:26 +01:00
history [ history_pos ] . scroll_pos = n - > cast_to < ScriptTextEditor > ( ) - > get_text_edit ( ) - > get_v_scroll ( ) ;
history [ history_pos ] . cursor_column = n - > cast_to < ScriptTextEditor > ( ) - > get_text_edit ( ) - > cursor_get_column ( ) ;
history [ history_pos ] . cursor_row = n - > cast_to < ScriptTextEditor > ( ) - > get_text_edit ( ) - > cursor_get_line ( ) ;
2015-11-17 13:46:08 +01:00
}
if ( n - > cast_to < EditorHelp > ( ) ) {
2017-03-19 00:36:26 +01:00
history [ history_pos ] . scroll_pos = n - > cast_to < EditorHelp > ( ) - > get_scroll ( ) ;
2015-11-17 13:46:08 +01:00
}
}
2017-03-19 00:36:26 +01:00
history . resize ( history_pos + 1 ) ;
2015-11-17 13:46:08 +01:00
ScriptHistory sh ;
2017-03-19 00:36:26 +01:00
sh . control = c ;
sh . scroll_pos = 0 ;
2015-11-17 13:46:08 +01:00
history . push_back ( sh ) ;
history_pos + + ;
tab_container - > set_current_tab ( p_idx ) ;
c = tab_container - > get_current_tab_control ( ) ;
if ( c - > cast_to < ScriptTextEditor > ( ) ) {
script_name_label - > set_text ( c - > cast_to < ScriptTextEditor > ( ) - > get_name ( ) ) ;
script_icon - > set_texture ( c - > cast_to < ScriptTextEditor > ( ) - > get_icon ( ) ) ;
if ( is_visible ( ) )
c - > cast_to < ScriptTextEditor > ( ) - > get_text_edit ( ) - > grab_focus ( ) ;
}
if ( c - > cast_to < EditorHelp > ( ) ) {
script_name_label - > set_text ( c - > cast_to < EditorHelp > ( ) - > get_class_name ( ) ) ;
2017-03-19 00:36:26 +01:00
script_icon - > set_texture ( get_icon ( " Help " , " EditorIcons " ) ) ;
2015-11-17 13:46:08 +01:00
if ( is_visible ( ) )
c - > cast_to < EditorHelp > ( ) - > set_focused ( ) ;
}
2017-03-19 00:36:26 +01:00
c - > set_meta ( " __editor_pass " , + + edit_pass ) ;
2015-11-17 13:46:08 +01:00
_update_history_arrows ( ) ;
_update_script_colors ( ) ;
}
2016-07-07 01:35:49 +02:00
void ScriptEditor : : _close_tab ( int p_idx ) {
2014-02-10 02:10:30 +01:00
2016-07-07 01:35:49 +02:00
int selected = p_idx ;
2017-03-19 00:36:26 +01:00
if ( selected < 0 | | selected > = tab_container - > get_child_count ( ) )
2014-02-10 02:10:30 +01:00
return ;
2016-03-09 00:00:52 +01:00
2015-11-17 13:46:08 +01:00
Node * tselected = tab_container - > get_child ( selected ) ;
2014-02-10 02:10:30 +01:00
ScriptTextEditor * current = tab_container - > get_child ( selected ) - > cast_to < ScriptTextEditor > ( ) ;
2015-11-17 13:46:08 +01:00
if ( current ) {
apply_scripts ( ) ;
}
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
//remove from history
2017-03-19 00:36:26 +01:00
history . resize ( history_pos + 1 ) ;
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < history . size ( ) ; i + + ) {
if ( history [ i ] . control = = tselected ) {
2015-11-17 13:46:08 +01:00
history . remove ( i ) ;
i - - ;
history_pos - - ;
}
}
2017-03-19 00:36:26 +01:00
if ( history_pos > = history . size ( ) ) {
history_pos = history . size ( ) - 1 ;
2015-11-17 13:46:08 +01:00
}
2014-02-10 02:10:30 +01:00
int idx = tab_container - > get_current_tab ( ) ;
2015-11-17 13:46:08 +01:00
memdelete ( tselected ) ;
2017-03-19 00:36:26 +01:00
if ( idx > = tab_container - > get_child_count ( ) )
idx = tab_container - > get_child_count ( ) - 1 ;
if ( idx > = 0 ) {
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
if ( history_pos > = 0 ) {
2015-11-17 13:46:08 +01:00
idx = history [ history_pos ] . control - > get_index ( ) ;
}
2014-02-10 02:10:30 +01:00
tab_container - > set_current_tab ( idx ) ;
2015-11-17 13:46:08 +01:00
2015-06-22 05:03:19 +02:00
//script_list->select(idx);
}
2015-11-17 13:46:08 +01:00
_update_history_arrows ( ) ;
2015-06-22 05:03:19 +02:00
_update_script_names ( ) ;
2016-07-18 17:30:43 +02:00
_save_layout ( ) ;
2016-07-07 01:35:49 +02:00
}
void ScriptEditor : : _close_current_tab ( ) {
_close_tab ( tab_container - > get_current_tab ( ) ) ;
2014-02-10 02:10:30 +01:00
}
2016-07-18 00:18:48 +02:00
void ScriptEditor : : _close_docs_tab ( ) {
int child_count = tab_container - > get_child_count ( ) ;
2017-03-19 00:36:26 +01:00
for ( int i = child_count - 1 ; i > = 0 ; i - - ) {
2016-07-18 00:18:48 +02:00
EditorHelp * ste = tab_container - > get_child ( i ) - > cast_to < EditorHelp > ( ) ;
if ( ste ) {
_close_tab ( i ) ;
}
}
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : _resave_scripts ( const String & p_str ) {
2014-02-10 02:10:30 +01:00
apply_scripts ( ) ;
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ! ste )
continue ;
Ref < Script > script = ste - > get_edited_script ( ) ;
2017-03-19 00:36:26 +01:00
if ( script - > get_path ( ) = = " " | | script - > get_path ( ) . find ( " local:// " ) ! = - 1 | | script - > get_path ( ) . find ( " :: " ) ! = - 1 )
2014-02-10 02:10:30 +01:00
continue ; //internal script, who cares
2016-04-23 20:21:34 +02:00
if ( trim_trailing_whitespace_on_save ) {
_trim_trailing_whitespace ( ste - > get_text_edit ( ) ) ;
}
2014-02-10 02:10:30 +01:00
editor - > save_resource ( script ) ;
ste - > get_text_edit ( ) - > tag_saved_version ( ) ;
}
disk_changed - > hide ( ) ;
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : _reload_scripts ( ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ! ste ) {
continue ;
}
Ref < Script > script = ste - > get_edited_script ( ) ;
2017-03-19 00:36:26 +01:00
if ( script - > get_path ( ) = = " " | | script - > get_path ( ) . find ( " local:// " ) ! = - 1 | | script - > get_path ( ) . find ( " :: " ) ! = - 1 ) {
2014-02-10 02:10:30 +01:00
continue ; //internal script, who cares
}
2016-07-09 17:12:03 +02:00
uint64_t last_date = script - > get_last_modified_time ( ) ;
uint64_t date = FileAccess : : get_modified_time ( script - > get_path ( ) ) ;
//printf("last date: %lli vs date: %lli\n",last_date,date);
2017-03-19 00:36:26 +01:00
if ( last_date = = date ) {
2016-07-09 17:12:03 +02:00
continue ;
}
2017-03-19 00:36:26 +01:00
Ref < Script > rel_script = ResourceLoader : : load ( script - > get_path ( ) , script - > get_type ( ) , true ) ;
2014-02-10 02:10:30 +01:00
ERR_CONTINUE ( ! rel_script . is_valid ( ) ) ;
2017-03-19 00:36:26 +01:00
script - > set_source_code ( rel_script - > get_source_code ( ) ) ;
script - > set_last_modified_time ( rel_script - > get_last_modified_time ( ) ) ;
2014-02-10 02:10:30 +01:00
script - > reload ( ) ;
ste - > reload_text ( ) ;
}
disk_changed - > hide ( ) ;
2015-12-09 13:08:41 +01:00
_update_script_names ( ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : _res_saved_callback ( const Ref < Resource > & p_res ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ! ste ) {
continue ;
}
Ref < Script > script = ste - > get_edited_script ( ) ;
2017-03-19 00:36:26 +01:00
if ( script - > get_path ( ) = = " " | | script - > get_path ( ) . find ( " local:// " ) ! = - 1 | | script - > get_path ( ) . find ( " :: " ) ! = - 1 ) {
2014-02-10 02:10:30 +01:00
continue ; //internal script, who cares
}
2017-03-19 00:36:26 +01:00
if ( script = = p_res ) {
2014-02-10 02:10:30 +01:00
ste - > get_text_edit ( ) - > tag_saved_version ( ) ;
}
}
2015-06-22 05:03:19 +02:00
_update_script_names ( ) ;
2016-06-03 17:34:11 +02:00
if ( ! pending_auto_reload & & auto_reload_running_scripts ) {
call_deferred ( " _live_auto_reload_running_scripts " ) ;
2017-03-19 00:36:26 +01:00
pending_auto_reload = true ;
2016-06-03 17:34:11 +02:00
}
}
void ScriptEditor : : _live_auto_reload_running_scripts ( ) {
2017-03-19 00:36:26 +01:00
pending_auto_reload = false ;
2016-06-03 17:34:11 +02:00
debugger - > reload_scripts ( ) ;
2014-02-10 02:10:30 +01:00
}
2016-06-20 03:07:07 +02:00
bool ScriptEditor : : _test_script_times_on_disk ( Ref < Script > p_for_script ) {
2014-02-10 02:10:30 +01:00
disk_changed_list - > clear ( ) ;
TreeItem * r = disk_changed_list - > create_item ( ) ;
disk_changed_list - > set_hide_root ( true ) ;
2017-03-19 00:36:26 +01:00
bool need_ask = false ;
bool need_reload = false ;
bool use_autoreload = bool ( EDITOR_DEF ( " text_editor/auto_reload_scripts_on_external_change " , false ) ) ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
2015-12-09 13:08:41 +01:00
if ( ste ) {
2014-02-10 02:10:30 +01:00
2015-12-09 13:08:41 +01:00
Ref < Script > script = ste - > get_edited_script ( ) ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
if ( p_for_script . is_valid ( ) & & p_for_script ! = script )
2016-06-20 03:07:07 +02:00
continue ;
2017-03-19 00:36:26 +01:00
if ( script - > get_path ( ) = = " " | | script - > get_path ( ) . find ( " local:// " ) ! = - 1 | | script - > get_path ( ) . find ( " :: " ) ! = - 1 )
2015-12-09 13:08:41 +01:00
continue ; //internal script, who cares
2014-02-10 02:10:30 +01:00
2015-12-09 13:08:41 +01:00
uint64_t last_date = script - > get_last_modified_time ( ) ;
uint64_t date = FileAccess : : get_modified_time ( script - > get_path ( ) ) ;
2014-02-10 02:10:30 +01:00
2015-12-09 13:08:41 +01:00
//printf("last date: %lli vs date: %lli\n",last_date,date);
2017-03-19 00:36:26 +01:00
if ( last_date ! = date ) {
2014-02-10 02:10:30 +01:00
2015-12-09 13:08:41 +01:00
TreeItem * ti = disk_changed_list - > create_item ( r ) ;
2017-03-19 00:36:26 +01:00
ti - > set_text ( 0 , script - > get_path ( ) . get_file ( ) ) ;
2014-02-10 02:10:30 +01:00
2015-12-09 13:08:41 +01:00
if ( ! use_autoreload | | ste - > is_unsaved ( ) ) {
2017-03-19 00:36:26 +01:00
need_ask = true ;
2015-12-09 13:08:41 +01:00
}
2017-03-19 00:36:26 +01:00
need_reload = true ;
2015-12-09 13:08:41 +01:00
//r->set_metadata(0,);
}
2014-02-10 02:10:30 +01:00
}
}
2015-12-09 13:08:41 +01:00
if ( need_reload ) {
if ( ! need_ask ) {
2015-01-10 18:55:12 +01:00
script_editor - > _reload_scripts ( ) ;
2017-03-19 00:36:26 +01:00
need_reload = false ;
2015-02-17 03:58:41 +01:00
} else {
2017-03-19 00:36:26 +01:00
disk_changed - > call_deferred ( " popup_centered_ratio " , 0.5 ) ;
2015-02-17 03:58:41 +01:00
}
}
2014-02-10 02:10:30 +01:00
2015-12-09 13:08:41 +01:00
return need_reload ;
2014-02-10 02:10:30 +01:00
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : swap_lines ( TextEdit * tx , int line1 , int line2 ) {
String tmp = tx - > get_line ( line1 ) ;
String tmp2 = tx - > get_line ( line2 ) ;
tx - > set_line ( line2 , tmp ) ;
tx - > set_line ( line1 , tmp2 ) ;
2014-12-07 07:07:00 +01:00
2017-03-19 00:36:26 +01:00
tx - > cursor_set_line ( line2 ) ;
2014-12-07 07:07:00 +01:00
}
2016-07-15 16:02:55 +02:00
void ScriptEditor : : _breakpoint_toggled ( const int p_row ) {
int selected = tab_container - > get_current_tab ( ) ;
2017-03-19 00:36:26 +01:00
if ( selected < 0 | | selected > = tab_container - > get_child_count ( ) ) {
2016-07-15 16:02:55 +02:00
return ;
}
ScriptTextEditor * current = tab_container - > get_child ( selected ) - > cast_to < ScriptTextEditor > ( ) ;
if ( current ) {
2017-03-19 00:36:26 +01:00
get_debugger ( ) - > set_breakpoint ( current - > get_edited_script ( ) - > get_path ( ) , p_row + 1 , current - > get_text_edit ( ) - > is_line_set_as_breakpoint ( p_row ) ) ;
2016-07-15 16:02:55 +02:00
}
}
2016-04-12 16:45:31 +02:00
void ScriptEditor : : _file_dialog_action ( String p_file ) {
switch ( file_dialog_option ) {
case FILE_SAVE_THEME_AS : {
2017-03-19 00:36:26 +01:00
if ( ! EditorSettings : : get_singleton ( ) - > save_text_editor_theme_as ( p_file ) ) {
2016-04-12 16:45:31 +02:00
editor - > show_warning ( TTR ( " Error while saving theme " ) , TTR ( " Error saving " ) ) ;
}
} break ;
case FILE_IMPORT_THEME : {
2017-03-19 00:36:26 +01:00
if ( ! EditorSettings : : get_singleton ( ) - > import_text_editor_theme ( p_file ) ) {
2016-04-12 16:45:31 +02:00
editor - > show_warning ( TTR ( " Error importing theme " ) , TTR ( " Error importing " ) ) ;
}
} break ;
}
file_dialog_option = - 1 ;
}
2014-02-10 02:10:30 +01:00
void ScriptEditor : : _menu_option ( int p_option ) {
2017-03-19 00:36:26 +01:00
switch ( p_option ) {
2015-08-10 01:39:59 +02:00
case FILE_NEW : {
script_create_dialog - > config ( " Node " , " .gd " ) ;
2017-03-19 00:36:26 +01:00
script_create_dialog - > popup_centered ( Size2 ( 300 , 300 ) * EDSCALE ) ;
2015-08-10 01:39:59 +02:00
} break ;
2015-11-17 13:46:08 +01:00
case FILE_OPEN : {
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
editor - > open_resource ( " Script " ) ;
return ;
2014-02-10 02:10:30 +01:00
} break ;
case FILE_SAVE_ALL : {
if ( ! _test_script_times_on_disk ( ) )
return ;
2016-02-03 01:10:52 +01:00
save_all_scripts ( ) ;
#if 0
2014-02-10 02:10:30 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ! ste )
continue ;
Ref < Script > script = ste - > get_edited_script ( ) ;
if ( script - > get_path ( ) = = " " | | script - > get_path ( ) . find ( " local:// " ) ! = - 1 | | script - > get_path ( ) . find ( " :: " ) ! = - 1 )
continue ; //internal script, who cares
editor - > save_resource ( script ) ;
}
2016-02-03 01:10:52 +01:00
# endif
2014-02-10 02:10:30 +01:00
} break ;
2016-04-12 16:45:31 +02:00
case FILE_IMPORT_THEME : {
file_dialog - > set_mode ( EditorFileDialog : : MODE_OPEN_FILE ) ;
file_dialog - > set_access ( EditorFileDialog : : ACCESS_FILESYSTEM ) ;
file_dialog_option = FILE_IMPORT_THEME ;
file_dialog - > clear_filters ( ) ;
file_dialog - > add_filter ( " *.tet " ) ;
file_dialog - > popup_centered_ratio ( ) ;
file_dialog - > set_title ( TTR ( " Import Theme " ) ) ;
} break ;
case FILE_RELOAD_THEME : {
EditorSettings : : get_singleton ( ) - > load_text_editor_theme ( ) ;
} break ;
case FILE_SAVE_THEME : {
2017-03-19 00:36:26 +01:00
if ( ! EditorSettings : : get_singleton ( ) - > save_text_editor_theme ( ) ) {
2016-04-12 16:45:31 +02:00
editor - > show_warning ( TTR ( " Error while saving theme " ) , TTR ( " Error saving " ) ) ;
}
} break ;
case FILE_SAVE_THEME_AS : {
file_dialog - > set_mode ( EditorFileDialog : : MODE_SAVE_FILE ) ;
file_dialog - > set_access ( EditorFileDialog : : ACCESS_FILESYSTEM ) ;
file_dialog_option = FILE_SAVE_THEME_AS ;
file_dialog - > clear_filters ( ) ;
file_dialog - > add_filter ( " *.tet " ) ;
file_dialog - > set_current_path ( EditorSettings : : get_singleton ( ) - > get_settings_path ( ) + " /text_editor_themes/ " + EditorSettings : : get_singleton ( ) - > get ( " text_editor/color_theme " ) ) ;
file_dialog - > popup_centered_ratio ( ) ;
file_dialog - > set_title ( TTR ( " Save Theme As.. " ) ) ;
} break ;
2015-11-17 13:46:08 +01:00
case SEARCH_HELP : {
2014-02-10 02:10:30 +01:00
2015-11-24 22:33:26 +01:00
help_search_dialog - > popup ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2015-11-17 13:46:08 +01:00
case SEARCH_CLASSES : {
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
String current ;
2014-05-24 06:35:47 +02:00
2017-03-19 00:36:26 +01:00
if ( tab_container - > get_tab_count ( ) > 0 ) {
EditorHelp * eh = tab_container - > get_child ( tab_container - > get_current_tab ( ) ) - > cast_to < EditorHelp > ( ) ;
2015-11-24 22:59:44 +01:00
if ( eh ) {
2017-03-19 00:36:26 +01:00
current = eh - > get_class_name ( ) ;
2015-11-24 22:59:44 +01:00
}
2014-05-24 06:35:47 +02:00
}
2016-03-05 11:51:09 +01:00
help_index - > popup ( ) ;
2014-05-24 06:35:47 +02:00
2017-03-19 00:36:26 +01:00
if ( current ! = " " ) {
help_index - > call_deferred ( " select_class " , current ) ;
2015-11-17 13:46:08 +01:00
}
2014-02-10 02:10:30 +01:00
} break ;
2015-11-17 13:46:08 +01:00
case SEARCH_WEBSITE : {
2014-02-10 02:10:30 +01:00
2016-02-20 14:01:34 +01:00
OS : : get_singleton ( ) - > shell_open ( " http://docs.godotengine.org/ " ) ;
2014-02-10 02:10:30 +01:00
} break ;
2015-11-17 13:46:08 +01:00
case WINDOW_NEXT : {
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
_history_forward ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2015-11-17 13:46:08 +01:00
case WINDOW_PREV : {
_history_back ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2015-12-12 14:09:50 +01:00
case DEBUG_SHOW : {
if ( debugger ) {
2017-03-19 00:36:26 +01:00
bool visible = debug_menu - > get_popup ( ) - > is_item_checked ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_SHOW ) ) ;
debug_menu - > get_popup ( ) - > set_item_checked ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_SHOW ) , ! visible ) ;
2015-12-12 14:09:50 +01:00
if ( visible )
debugger - > hide ( ) ;
else
debugger - > show ( ) ;
}
} break ;
case DEBUG_SHOW_KEEP_OPEN : {
2017-03-19 00:36:26 +01:00
bool visible = debug_menu - > get_popup ( ) - > is_item_checked ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_SHOW_KEEP_OPEN ) ) ;
2015-12-12 14:09:50 +01:00
if ( debugger )
debugger - > set_hide_on_stop ( visible ) ;
2017-03-19 00:36:26 +01:00
debug_menu - > get_popup ( ) - > set_item_checked ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_SHOW_KEEP_OPEN ) , ! visible ) ;
2015-12-12 14:09:50 +01:00
} break ;
2015-11-17 13:46:08 +01:00
}
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
int selected = tab_container - > get_current_tab ( ) ;
2017-03-19 00:36:26 +01:00
if ( selected < 0 | | selected > = tab_container - > get_child_count ( ) )
2015-11-17 13:46:08 +01:00
return ;
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
ScriptTextEditor * current = tab_container - > get_child ( selected ) - > cast_to < ScriptTextEditor > ( ) ;
if ( current ) {
2017-03-19 00:36:26 +01:00
switch ( p_option ) {
2015-11-17 13:46:08 +01:00
case FILE_NEW : {
script_create_dialog - > config ( " Node " , " .gd " ) ;
2017-03-19 00:36:26 +01:00
script_create_dialog - > popup_centered ( Size2 ( 300 , 300 ) * EDSCALE ) ;
2015-11-17 13:46:08 +01:00
} break ;
case FILE_SAVE : {
2016-01-23 18:44:37 +01:00
if ( _test_script_times_on_disk ( ) )
2015-11-17 13:46:08 +01:00
return ;
2016-01-23 18:44:37 +01:00
2016-04-23 20:21:34 +02:00
if ( trim_trailing_whitespace_on_save ) {
_trim_trailing_whitespace ( current - > get_text_edit ( ) ) ;
}
2017-03-19 00:36:26 +01:00
editor - > save_resource ( current - > get_edited_script ( ) ) ;
2015-11-17 13:46:08 +01:00
} break ;
case FILE_SAVE_AS : {
2016-04-23 20:21:34 +02:00
if ( trim_trailing_whitespace_on_save ) {
_trim_trailing_whitespace ( current - > get_text_edit ( ) ) ;
}
2016-06-22 18:39:02 +02:00
editor - > push_item ( current - > get_edited_script ( ) - > cast_to < Object > ( ) ) ;
2017-03-19 00:36:26 +01:00
editor - > save_resource_as ( current - > get_edited_script ( ) ) ;
2015-11-17 13:46:08 +01:00
} break ;
case EDIT_UNDO : {
current - > get_text_edit ( ) - > undo ( ) ;
current - > get_text_edit ( ) - > call_deferred ( " grab_focus " ) ;
} break ;
case EDIT_REDO : {
current - > get_text_edit ( ) - > redo ( ) ;
current - > get_text_edit ( ) - > call_deferred ( " grab_focus " ) ;
} break ;
case EDIT_CUT : {
current - > get_text_edit ( ) - > cut ( ) ;
current - > get_text_edit ( ) - > call_deferred ( " grab_focus " ) ;
} break ;
case EDIT_COPY : {
current - > get_text_edit ( ) - > copy ( ) ;
current - > get_text_edit ( ) - > call_deferred ( " grab_focus " ) ;
} break ;
case EDIT_PASTE : {
current - > get_text_edit ( ) - > paste ( ) ;
current - > get_text_edit ( ) - > call_deferred ( " grab_focus " ) ;
} break ;
case EDIT_SELECT_ALL : {
current - > get_text_edit ( ) - > select_all ( ) ;
current - > get_text_edit ( ) - > call_deferred ( " grab_focus " ) ;
} break ;
case EDIT_MOVE_LINE_UP : {
TextEdit * tx = current - > get_text_edit ( ) ;
Ref < Script > scr = current - > get_edited_script ( ) ;
if ( scr . is_null ( ) )
return ;
2016-04-06 08:36:29 +02:00
tx - > begin_complex_operation ( ) ;
2017-03-19 00:36:26 +01:00
if ( tx - > is_selection_active ( ) ) {
2015-11-17 13:46:08 +01:00
int from_line = tx - > get_selection_from_line ( ) ;
2017-03-19 00:36:26 +01:00
int from_col = tx - > get_selection_from_column ( ) ;
int to_line = tx - > get_selection_to_line ( ) ;
2015-11-17 13:46:08 +01:00
int to_column = tx - > get_selection_to_column ( ) ;
2017-03-19 00:36:26 +01:00
for ( int i = from_line ; i < = to_line ; i + + ) {
2015-11-17 13:46:08 +01:00
int line_id = i ;
int next_id = i - 1 ;
if ( line_id = = 0 | | next_id < 0 )
return ;
swap_lines ( tx , line_id , next_id ) ;
}
2017-03-19 00:36:26 +01:00
int from_line_up = from_line > 0 ? from_line - 1 : from_line ;
int to_line_up = to_line > 0 ? to_line - 1 : to_line ;
2015-11-17 13:46:08 +01:00
tx - > select ( from_line_up , from_col , to_line_up , to_column ) ;
2017-03-19 00:36:26 +01:00
} else {
2015-11-17 13:46:08 +01:00
int line_id = tx - > cursor_get_line ( ) ;
int next_id = line_id - 1 ;
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
if ( line_id = = 0 | | next_id < 0 )
return ;
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
swap_lines ( tx , line_id , next_id ) ;
}
2016-04-06 08:36:29 +02:00
tx - > end_complex_operation ( ) ;
2015-11-17 13:46:08 +01:00
tx - > update ( ) ;
} break ;
case EDIT_MOVE_LINE_DOWN : {
TextEdit * tx = current - > get_text_edit ( ) ;
Ref < Script > scr = current - > get_edited_script ( ) ;
if ( scr . is_null ( ) )
return ;
2016-04-06 08:36:29 +02:00
tx - > begin_complex_operation ( ) ;
2017-03-19 00:36:26 +01:00
if ( tx - > is_selection_active ( ) ) {
2015-11-17 13:46:08 +01:00
int from_line = tx - > get_selection_from_line ( ) ;
2017-03-19 00:36:26 +01:00
int from_col = tx - > get_selection_from_column ( ) ;
int to_line = tx - > get_selection_to_line ( ) ;
2015-11-17 13:46:08 +01:00
int to_column = tx - > get_selection_to_column ( ) ;
2017-03-19 00:36:26 +01:00
for ( int i = to_line ; i > = from_line ; i - - ) {
2015-11-17 13:46:08 +01:00
int line_id = i ;
int next_id = i + 1 ;
2017-03-19 00:36:26 +01:00
if ( line_id = = tx - > get_line_count ( ) - 1 | | next_id > tx - > get_line_count ( ) )
2015-11-17 13:46:08 +01:00
return ;
swap_lines ( tx , line_id , next_id ) ;
}
2017-03-19 00:36:26 +01:00
int from_line_down = from_line < tx - > get_line_count ( ) ? from_line + 1 : from_line ;
int to_line_down = to_line < tx - > get_line_count ( ) ? to_line + 1 : to_line ;
2015-11-17 13:46:08 +01:00
tx - > select ( from_line_down , from_col , to_line_down , to_column ) ;
2017-03-19 00:36:26 +01:00
} else {
2015-11-17 13:46:08 +01:00
int line_id = tx - > cursor_get_line ( ) ;
int next_id = line_id + 1 ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
if ( line_id = = tx - > get_line_count ( ) - 1 | | next_id > tx - > get_line_count ( ) )
2015-11-17 13:46:08 +01:00
return ;
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
swap_lines ( tx , line_id , next_id ) ;
}
2016-04-06 08:36:29 +02:00
tx - > end_complex_operation ( ) ;
2015-11-17 13:46:08 +01:00
tx - > update ( ) ;
} break ;
case EDIT_INDENT_LEFT : {
TextEdit * tx = current - > get_text_edit ( ) ;
Ref < Script > scr = current - > get_edited_script ( ) ;
if ( scr . is_null ( ) )
return ;
2016-04-06 08:36:29 +02:00
tx - > begin_complex_operation ( ) ;
2017-03-19 00:36:26 +01:00
if ( tx - > is_selection_active ( ) ) {
2016-04-06 17:37:03 +02:00
tx - > indent_selection_left ( ) ;
2017-03-19 00:36:26 +01:00
} else {
2015-11-17 13:46:08 +01:00
int begin = tx - > cursor_get_line ( ) ;
String line_text = tx - > get_line ( begin ) ;
// begins with tab
2017-03-19 00:36:26 +01:00
if ( line_text . begins_with ( " \t " ) ) {
2015-11-17 13:46:08 +01:00
line_text = line_text . substr ( 1 , line_text . length ( ) ) ;
tx - > set_line ( begin , line_text ) ;
}
// begins with 4 spaces
2017-03-19 00:36:26 +01:00
else if ( line_text . begins_with ( " " ) ) {
2015-11-17 13:46:08 +01:00
line_text = line_text . substr ( 4 , line_text . length ( ) ) ;
tx - > set_line ( begin , line_text ) ;
}
}
2016-04-06 08:36:29 +02:00
tx - > end_complex_operation ( ) ;
2015-11-17 13:46:08 +01:00
tx - > update ( ) ;
//tx->deselect();
} break ;
case EDIT_INDENT_RIGHT : {
TextEdit * tx = current - > get_text_edit ( ) ;
Ref < Script > scr = current - > get_edited_script ( ) ;
if ( scr . is_null ( ) )
return ;
2016-04-06 08:36:29 +02:00
tx - > begin_complex_operation ( ) ;
2017-03-19 00:36:26 +01:00
if ( tx - > is_selection_active ( ) ) {
2016-04-06 17:37:03 +02:00
tx - > indent_selection_right ( ) ;
2017-03-19 00:36:26 +01:00
} else {
2015-11-17 13:46:08 +01:00
int begin = tx - > cursor_get_line ( ) ;
String line_text = tx - > get_line ( begin ) ;
line_text = ' \t ' + line_text ;
tx - > set_line ( begin , line_text ) ;
}
2016-04-06 08:36:29 +02:00
tx - > end_complex_operation ( ) ;
2015-11-17 13:46:08 +01:00
tx - > update ( ) ;
//tx->deselect();
} break ;
case EDIT_CLONE_DOWN : {
TextEdit * tx = current - > get_text_edit ( ) ;
Ref < Script > scr = current - > get_edited_script ( ) ;
if ( scr . is_null ( ) )
return ;
2016-05-19 16:32:41 +02:00
int from_line = tx - > cursor_get_line ( ) ;
int to_line = tx - > cursor_get_line ( ) ;
2015-12-06 19:34:09 +01:00
int column = tx - > cursor_get_column ( ) ;
2015-11-17 13:46:08 +01:00
2016-05-19 16:32:41 +02:00
if ( tx - > is_selection_active ( ) ) {
from_line = tx - > get_selection_from_line ( ) ;
to_line = tx - > get_selection_to_line ( ) ;
column = tx - > cursor_get_column ( ) ;
}
int next_line = to_line + 1 ;
tx - > begin_complex_operation ( ) ;
for ( int i = from_line ; i < = to_line ; i + + ) {
if ( i > = tx - > get_line_count ( ) - 1 ) {
2017-03-19 00:36:26 +01:00
tx - > set_line ( i , tx - > get_line ( i ) + " \n " ) ;
2016-05-19 16:32:41 +02:00
}
String line_clone = tx - > get_line ( i ) ;
tx - > insert_at ( line_clone , next_line ) ;
next_line + + ;
}
2015-11-17 13:46:08 +01:00
2015-12-06 19:34:09 +01:00
tx - > cursor_set_column ( column ) ;
2016-05-19 16:32:41 +02:00
if ( tx - > is_selection_active ( ) ) {
tx - > select ( to_line + 1 , tx - > get_selection_from_column ( ) , next_line - 1 , tx - > get_selection_to_column ( ) ) ;
}
tx - > end_complex_operation ( ) ;
2015-11-17 13:46:08 +01:00
tx - > update ( ) ;
} break ;
case EDIT_TOGGLE_COMMENT : {
TextEdit * tx = current - > get_text_edit ( ) ;
Ref < Script > scr = current - > get_edited_script ( ) ;
if ( scr . is_null ( ) )
return ;
2016-04-06 08:36:29 +02:00
tx - > begin_complex_operation ( ) ;
2017-03-19 00:36:26 +01:00
if ( tx - > is_selection_active ( ) ) {
2015-11-17 13:46:08 +01:00
int begin = tx - > get_selection_from_line ( ) ;
int end = tx - > get_selection_to_line ( ) ;
2016-04-04 07:31:39 +02:00
// End of selection ends on the first column of the last line, ignore it.
2017-03-19 00:36:26 +01:00
if ( tx - > get_selection_to_column ( ) = = 0 )
2016-04-04 07:31:39 +02:00
end - = 1 ;
2016-04-23 20:21:34 +02:00
2017-03-19 00:36:26 +01:00
for ( int i = begin ; i < = end ; i + + ) {
2015-11-17 13:46:08 +01:00
String line_text = tx - > get_line ( i ) ;
if ( line_text . begins_with ( " # " ) )
line_text = line_text . substr ( 1 , line_text . length ( ) ) ;
else
line_text = " # " + line_text ;
tx - > set_line ( i , line_text ) ;
}
2017-03-19 00:36:26 +01:00
} else {
2015-11-17 13:46:08 +01:00
int begin = tx - > cursor_get_line ( ) ;
String line_text = tx - > get_line ( begin ) ;
if ( line_text . begins_with ( " # " ) )
line_text = line_text . substr ( 1 , line_text . length ( ) ) ;
else
line_text = " # " + line_text ;
tx - > set_line ( begin , line_text ) ;
}
2016-04-06 08:36:29 +02:00
tx - > end_complex_operation ( ) ;
2015-11-17 13:46:08 +01:00
tx - > update ( ) ;
//tx->deselect();
} break ;
case EDIT_COMPLETE : {
current - > get_text_edit ( ) - > query_code_comple ( ) ;
} break ;
case EDIT_AUTO_INDENT : {
TextEdit * te = current - > get_text_edit ( ) ;
String text = te - > get_text ( ) ;
Ref < Script > scr = current - > get_edited_script ( ) ;
if ( scr . is_null ( ) )
return ;
2017-03-19 00:36:26 +01:00
int begin , end ;
2015-11-17 13:46:08 +01:00
if ( te - > is_selection_active ( ) ) {
2017-03-19 00:36:26 +01:00
begin = te - > get_selection_from_line ( ) ;
end = te - > get_selection_to_line ( ) ;
2015-11-17 13:46:08 +01:00
} else {
2017-03-19 00:36:26 +01:00
begin = 0 ;
end = te - > get_line_count ( ) - 1 ;
2015-11-17 13:46:08 +01:00
}
2017-03-19 00:36:26 +01:00
scr - > get_language ( ) - > auto_indent_code ( text , begin , end ) ;
2015-11-17 13:46:08 +01:00
te - > set_text ( text ) ;
2016-06-09 01:00:02 +02:00
} break ;
case FILE_TOOL_RELOAD :
case FILE_TOOL_RELOAD_SOFT : {
TextEdit * te = current - > get_text_edit ( ) ;
Ref < Script > scr = current - > get_edited_script ( ) ;
if ( scr . is_null ( ) )
return ;
scr - > set_source_code ( te - > get_text ( ) ) ;
2017-03-19 00:36:26 +01:00
bool soft = p_option = = FILE_TOOL_RELOAD_SOFT | | scr - > get_instance_base_type ( ) = = " EditorPlugin " ; //always soft-reload editor plugins
2016-07-19 00:24:38 +02:00
2017-03-19 00:36:26 +01:00
scr - > get_language ( ) - > reload_tool_script ( scr , soft ) ;
2016-04-23 20:21:34 +02:00
} break ;
case EDIT_TRIM_TRAILING_WHITESAPCE : {
_trim_trailing_whitespace ( current - > get_text_edit ( ) ) ;
2015-11-17 13:46:08 +01:00
} break ;
case SEARCH_FIND : {
2016-05-28 18:25:45 +02:00
current - > get_find_replace_bar ( ) - > popup_search ( ) ;
2015-11-17 13:46:08 +01:00
} break ;
case SEARCH_FIND_NEXT : {
2016-05-28 18:25:45 +02:00
current - > get_find_replace_bar ( ) - > search_next ( ) ;
} break ;
case SEARCH_FIND_PREV : {
current - > get_find_replace_bar ( ) - > search_prev ( ) ;
2015-11-17 13:46:08 +01:00
} break ;
case SEARCH_REPLACE : {
2016-05-28 18:25:45 +02:00
current - > get_find_replace_bar ( ) - > popup_replace ( ) ;
2015-11-17 13:46:08 +01:00
} break ;
case SEARCH_LOCATE_FUNCTION : {
if ( ! current )
return ;
quick_open - > popup ( current - > get_functions ( ) ) ;
} break ;
case SEARCH_GOTO_LINE : {
goto_line_dialog - > popup_find_line ( current - > get_text_edit ( ) ) ;
} break ;
case DEBUG_TOGGLE_BREAKPOINT : {
2017-03-19 00:36:26 +01:00
int line = current - > get_text_edit ( ) - > cursor_get_line ( ) ;
2015-11-17 13:46:08 +01:00
bool dobreak = ! current - > get_text_edit ( ) - > is_line_set_as_breakpoint ( line ) ;
2017-03-19 00:36:26 +01:00
current - > get_text_edit ( ) - > set_line_as_breakpoint ( line , dobreak ) ;
get_debugger ( ) - > set_breakpoint ( current - > get_edited_script ( ) - > get_path ( ) , line + 1 , dobreak ) ;
2015-11-17 13:46:08 +01:00
} break ;
2016-05-27 16:29:04 +02:00
case DEBUG_REMOVE_ALL_BREAKPOINTS : {
List < int > bpoints ;
current - > get_text_edit ( ) - > get_breakpoints ( & bpoints ) ;
2017-03-19 00:36:26 +01:00
for ( List < int > : : Element * E = bpoints . front ( ) ; E ; E = E - > next ( ) ) {
2016-05-27 16:29:04 +02:00
int line = E - > get ( ) ;
bool dobreak = ! current - > get_text_edit ( ) - > is_line_set_as_breakpoint ( line ) ;
2017-03-19 00:36:26 +01:00
current - > get_text_edit ( ) - > set_line_as_breakpoint ( line , dobreak ) ;
get_debugger ( ) - > set_breakpoint ( current - > get_edited_script ( ) - > get_path ( ) , line + 1 , dobreak ) ;
2016-05-27 16:29:04 +02:00
}
}
case DEBUG_GOTO_NEXT_BREAKPOINT : {
List < int > bpoints ;
current - > get_text_edit ( ) - > get_breakpoints ( & bpoints ) ;
if ( bpoints . size ( ) < = 0 ) {
return ;
}
2017-03-19 00:36:26 +01:00
int line = current - > get_text_edit ( ) - > cursor_get_line ( ) ;
2016-05-27 16:29:04 +02:00
// wrap around
if ( line > = bpoints [ bpoints . size ( ) - 1 ] ) {
current - > get_text_edit ( ) - > cursor_set_line ( bpoints [ 0 ] ) ;
} else {
2017-03-19 00:36:26 +01:00
for ( List < int > : : Element * E = bpoints . front ( ) ; E ; E = E - > next ( ) ) {
2016-05-27 16:29:04 +02:00
int bline = E - > get ( ) ;
if ( bline > line ) {
current - > get_text_edit ( ) - > cursor_set_line ( bline ) ;
return ;
}
}
}
} break ;
case DEBUG_GOTO_PREV_BREAKPOINT : {
List < int > bpoints ;
current - > get_text_edit ( ) - > get_breakpoints ( & bpoints ) ;
if ( bpoints . size ( ) < = 0 ) {
return ;
}
2017-03-19 00:36:26 +01:00
int line = current - > get_text_edit ( ) - > cursor_get_line ( ) ;
2016-05-27 16:29:04 +02:00
// wrap around
if ( line < = bpoints [ 0 ] ) {
current - > get_text_edit ( ) - > cursor_set_line ( bpoints [ bpoints . size ( ) - 1 ] ) ;
} else {
2017-03-19 00:36:26 +01:00
for ( List < int > : : Element * E = bpoints . back ( ) ; E ; E = E - > prev ( ) ) {
2016-05-27 16:29:04 +02:00
int bline = E - > get ( ) ;
if ( bline < line ) {
current - > get_text_edit ( ) - > cursor_set_line ( bline ) ;
return ;
}
}
}
} break ;
2015-11-17 13:46:08 +01:00
case DEBUG_NEXT : {
if ( debugger )
debugger - > debug_next ( ) ;
} break ;
case DEBUG_STEP : {
if ( debugger )
debugger - > debug_step ( ) ;
} break ;
case DEBUG_BREAK : {
if ( debugger )
debugger - > debug_break ( ) ;
} break ;
case DEBUG_CONTINUE : {
if ( debugger )
debugger - > debug_continue ( ) ;
} break ;
case HELP_CONTEXTUAL : {
String text = current - > get_text_edit ( ) - > get_selection_text ( ) ;
if ( text = = " " )
text = current - > get_text_edit ( ) - > get_word_under_cursor ( ) ;
if ( text ! = " " )
help_search_dialog - > popup ( text ) ;
} break ;
case FILE_CLOSE : {
2017-03-19 00:36:26 +01:00
if ( current - > get_text_edit ( ) - > get_version ( ) ! = current - > get_text_edit ( ) - > get_saved_version ( ) ) {
erase_tab_confirm - > set_text ( " Close and save changes? \n \" " + current - > get_name ( ) + " \" " ) ;
2015-11-17 13:46:08 +01:00
erase_tab_confirm - > popup_centered_minsize ( ) ;
} else {
_close_current_tab ( ) ;
}
} break ;
2016-07-18 00:18:48 +02:00
case CLOSE_DOCS : {
_close_docs_tab ( ) ;
} break ;
2015-11-17 13:46:08 +01:00
case WINDOW_MOVE_LEFT : {
2017-03-19 00:36:26 +01:00
if ( tab_container - > get_current_tab ( ) > 0 ) {
tab_container - > call_deferred ( " set_current_tab " , tab_container - > get_current_tab ( ) - 1 ) ;
script_list - > call_deferred ( " select " , tab_container - > get_current_tab ( ) - 1 ) ;
tab_container - > move_child ( current , tab_container - > get_current_tab ( ) - 1 ) ;
2015-11-17 13:46:08 +01:00
_update_script_names ( ) ;
}
} break ;
case WINDOW_MOVE_RIGHT : {
2017-03-19 00:36:26 +01:00
if ( tab_container - > get_current_tab ( ) < tab_container - > get_child_count ( ) - 1 ) {
tab_container - > call_deferred ( " set_current_tab " , tab_container - > get_current_tab ( ) + 1 ) ;
script_list - > call_deferred ( " select " , tab_container - > get_current_tab ( ) + 1 ) ;
tab_container - > move_child ( current , tab_container - > get_current_tab ( ) + 1 ) ;
2015-11-17 13:46:08 +01:00
_update_script_names ( ) ;
}
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
} break ;
default : {
2017-03-19 00:36:26 +01:00
if ( p_option > = WINDOW_SELECT_BASE ) {
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
tab_container - > set_current_tab ( p_option - WINDOW_SELECT_BASE ) ;
script_list - > select ( p_option - WINDOW_SELECT_BASE ) ;
2015-11-17 13:46:08 +01:00
}
2014-02-10 02:10:30 +01:00
}
2015-11-17 13:46:08 +01:00
}
2017-04-20 23:09:00 +02:00
} else {
2014-02-10 02:10:30 +01:00
2017-04-20 23:09:00 +02:00
EditorHelp * help = tab_container - > get_current_tab_control ( ) - > cast_to < EditorHelp > ( ) ;
if ( help ) {
2014-02-10 02:10:30 +01:00
2017-04-20 23:09:00 +02:00
switch ( p_option ) {
2014-02-10 02:10:30 +01:00
2017-04-20 23:09:00 +02:00
case SEARCH_FIND : {
help - > popup_search ( ) ;
} break ;
case SEARCH_FIND_NEXT : {
help - > search_again ( ) ;
} break ;
case FILE_CLOSE : {
_close_current_tab ( ) ;
} break ;
case CLOSE_DOCS : {
_close_docs_tab ( ) ;
} break ;
}
2014-02-10 02:10:30 +01:00
}
}
}
void ScriptEditor : : _tab_changed ( int p_which ) {
ensure_select_current ( ) ;
}
void ScriptEditor : : _notification ( int p_what ) {
2017-03-19 00:36:26 +01:00
if ( p_what = = NOTIFICATION_ENTER_TREE ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
editor - > connect ( " play_pressed " , this , " _editor_play " ) ;
editor - > connect ( " pause_pressed " , this , " _editor_pause " ) ;
editor - > connect ( " stop_pressed " , this , " _editor_stop " ) ;
editor - > connect ( " script_add_function_request " , this , " _add_callback " ) ;
editor - > connect ( " resource_saved " , this , " _res_saved_callback " ) ;
script_list - > connect ( " item_selected " , this , " _script_selected " ) ;
script_split - > connect ( " dragged " , this , " _script_split_dragged " ) ;
autosave_timer - > connect ( " timeout " , this , " _autosave_scripts " ) ;
2015-05-05 04:32:40 +02:00
{
float autosave_time = EditorSettings : : get_singleton ( ) - > get ( " text_editor/autosave_interval_secs " ) ;
2017-03-19 00:36:26 +01:00
if ( autosave_time > 0 ) {
2015-05-05 04:32:40 +02:00
autosave_timer - > set_wait_time ( autosave_time ) ;
autosave_timer - > start ( ) ;
} else {
autosave_timer - > stop ( ) ;
}
}
2017-03-19 00:36:26 +01:00
EditorSettings : : get_singleton ( ) - > connect ( " settings_changed " , this , " _editor_settings_changed " ) ;
help_search - > set_icon ( get_icon ( " Help " , " EditorIcons " ) ) ;
site_search - > set_icon ( get_icon ( " Godot " , " EditorIcons " ) ) ;
class_search - > set_icon ( get_icon ( " ClassList " , " EditorIcons " ) ) ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
script_forward - > set_icon ( get_icon ( " Forward " , " EditorIcons " ) ) ;
script_back - > set_icon ( get_icon ( " Back " , " EditorIcons " ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-19 00:36:26 +01:00
if ( p_what = = NOTIFICATION_READY ) {
2015-06-22 05:03:19 +02:00
2017-03-19 00:36:26 +01:00
get_tree ( ) - > connect ( " tree_changed " , this , " _tree_changed " ) ;
editor - > connect ( " request_help " , this , " _request_help " ) ;
2017-05-16 21:26:32 +02:00
editor - > connect ( " request_help_search " , this , " _help_search " ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-19 00:36:26 +01:00
if ( p_what = = NOTIFICATION_EXIT_TREE ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
editor - > disconnect ( " play_pressed " , this , " _editor_play " ) ;
editor - > disconnect ( " pause_pressed " , this , " _editor_pause " ) ;
editor - > disconnect ( " stop_pressed " , this , " _editor_stop " ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-19 00:36:26 +01:00
if ( p_what = = MainLoop : : NOTIFICATION_WM_FOCUS_IN ) {
2014-02-10 02:10:30 +01:00
_test_script_times_on_disk ( ) ;
2015-12-09 13:08:41 +01:00
_update_modified_scripts_for_external_editor ( ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-19 00:36:26 +01:00
if ( p_what = = NOTIFICATION_PROCESS ) {
2014-02-10 02:10:30 +01:00
}
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : close_builtin_scripts_from_scene ( const String & p_scene ) {
2016-07-07 01:35:49 +02:00
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2016-07-07 01:35:49 +02:00
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ste ) {
Ref < Script > script = ste - > get_edited_script ( ) ;
if ( ! script . is_valid ( ) )
continue ;
2017-03-19 00:36:26 +01:00
if ( script - > get_path ( ) . find ( " :: " ) ! = - 1 & & script - > get_path ( ) . begins_with ( p_scene ) ) { //is an internal script and belongs to scene being closed
2016-07-07 01:35:49 +02:00
_close_tab ( i ) ;
i - - ;
}
}
}
}
2015-12-09 13:08:41 +01:00
void ScriptEditor : : edited_scene_changed ( ) {
_update_modified_scripts_for_external_editor ( ) ;
}
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
static const Node * _find_node_with_script ( const Node * p_node , const RefPtr & p_script ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
if ( p_node - > get_script ( ) = = p_script )
2014-02-10 02:10:30 +01:00
return p_node ;
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < p_node - > get_child_count ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
const Node * result = _find_node_with_script ( p_node - > get_child ( i ) , p_script ) ;
2014-02-10 02:10:30 +01:00
if ( result )
return result ;
}
return NULL ;
}
Dictionary ScriptEditor : : get_state ( ) const {
2017-03-19 00:36:26 +01:00
// apply_scripts();
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
Dictionary state ;
#if 0
2014-02-10 02:10:30 +01:00
Array paths ;
int open = - 1 ;
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ! ste )
continue ;
Ref < Script > script = ste - > get_edited_script ( ) ;
if ( script - > get_path ( ) ! = " " & & script - > get_path ( ) . find ( " local:// " ) = = - 1 & & script - > get_path ( ) . find ( " :: " ) = = - 1 ) {
paths . push_back ( script - > get_path ( ) ) ;
} else {
2014-11-06 01:20:42 +01:00
const Node * owner = _find_node_with_script ( get_tree ( ) - > get_root ( ) , script . get_ref_ptr ( ) ) ;
2014-02-10 02:10:30 +01:00
if ( owner )
paths . push_back ( owner - > get_path ( ) ) ;
}
if ( i = = tab_container - > get_current_tab ( ) )
open = i ;
}
if ( paths . size ( ) )
state [ " sources " ] = paths ;
if ( open ! = - 1 )
state [ " current " ] = open ;
2015-06-22 05:03:19 +02:00
# endif
2014-02-10 02:10:30 +01:00
return state ;
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : set_state ( const Dictionary & p_state ) {
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
#if 0
2014-02-10 02:10:30 +01:00
print_line ( " attempt set state: " + String ( Variant ( p_state ) ) ) ;
if ( ! p_state . has ( " sources " ) )
return ; //bleh
Array sources = p_state [ " sources " ] ;
for ( int i = 0 ; i < sources . size ( ) ; i + + ) {
Variant source = sources [ i ] ;
Ref < Script > script ;
if ( source . get_type ( ) = = Variant : : NODE_PATH ) {
2014-11-06 01:20:42 +01:00
Node * owner = get_tree ( ) - > get_root ( ) - > get_node ( source ) ;
2014-02-10 02:10:30 +01:00
if ( ! owner )
continue ;
script = owner - > get_script ( ) ;
} else if ( source . get_type ( ) = = Variant : : STRING ) {
script = ResourceLoader : : load ( source , " Script " ) ;
}
if ( script . is_null ( ) ) //ah well..
continue ;
editor - > call ( " _resource_selected " , script ) ;
}
if ( p_state . has ( " current " ) ) {
tab_container - > set_current_tab ( p_state [ " current " ] ) ;
}
2015-06-22 05:03:19 +02:00
# endif
2014-02-10 02:10:30 +01:00
}
void ScriptEditor : : clear ( ) {
2015-11-17 13:46:08 +01:00
#if 0
2014-02-10 02:10:30 +01:00
List < ScriptTextEditor * > stes ;
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ! ste )
continue ;
stes . push_back ( ste ) ;
}
while ( stes . size ( ) ) {
memdelete ( stes . front ( ) - > get ( ) ) ;
stes . pop_front ( ) ;
}
int idx = tab_container - > get_current_tab ( ) ;
if ( idx > = tab_container - > get_child_count ( ) )
idx = tab_container - > get_child_count ( ) - 1 ;
2015-06-22 05:03:19 +02:00
if ( idx > = 0 ) {
2014-02-10 02:10:30 +01:00
tab_container - > set_current_tab ( idx ) ;
2015-06-22 05:03:19 +02:00
script_list - > select ( script_list - > find_metadata ( idx ) ) ;
2014-02-10 02:10:30 +01:00
}
2015-11-17 13:46:08 +01:00
# endif
2014-02-10 02:10:30 +01:00
}
void ScriptEditor : : get_breakpoints ( List < String > * p_breakpoints ) {
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ! ste )
continue ;
List < int > bpoints ;
ste - > get_text_edit ( ) - > get_breakpoints ( & bpoints ) ;
Ref < Script > script = ste - > get_edited_script ( ) ;
String base = script - > get_path ( ) ;
2017-03-19 00:36:26 +01:00
ERR_CONTINUE ( base . begins_with ( " local:// " ) | | base = = " " ) ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
for ( List < int > : : Element * E = bpoints . front ( ) ; E ; E = E - > next ( ) ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
p_breakpoints - > push_back ( base + " : " + itos ( E - > get ( ) + 1 ) ) ;
2014-02-10 02:10:30 +01:00
}
}
}
void ScriptEditor : : ensure_focus_current ( ) {
2015-06-22 05:03:19 +02:00
if ( ! is_inside_tree ( ) )
return ;
2014-02-10 02:10:30 +01:00
int cidx = tab_container - > get_current_tab ( ) ;
2017-03-19 00:36:26 +01:00
if ( cidx < 0 | | cidx > = tab_container - > get_tab_count ( ) )
;
2014-02-10 02:10:30 +01:00
Control * c = tab_container - > get_child ( cidx ) - > cast_to < Control > ( ) ;
if ( ! c )
return ;
ScriptTextEditor * ste = c - > cast_to < ScriptTextEditor > ( ) ;
if ( ! ste )
return ;
ste - > get_text_edit ( ) - > grab_focus ( ) ;
}
2015-06-22 05:03:19 +02:00
void ScriptEditor : : _script_selected ( int p_idx ) {
grab_focus_block = ! Input : : get_singleton ( ) - > is_mouse_button_pressed ( 1 ) ; //amazing hack, simply amazing
2015-11-17 13:46:08 +01:00
_go_to_tab ( script_list - > get_item_metadata ( p_idx ) ) ;
2017-03-19 00:36:26 +01:00
grab_focus_block = false ;
2015-06-22 05:03:19 +02:00
}
2014-02-10 02:10:30 +01:00
void ScriptEditor : : ensure_select_current ( ) {
2017-03-19 00:36:26 +01:00
if ( tab_container - > get_child_count ( ) & & tab_container - > get_current_tab ( ) > = 0 ) {
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
Node * current = tab_container - > get_child ( tab_container - > get_current_tab ( ) ) ;
ScriptTextEditor * ste = current - > cast_to < ScriptTextEditor > ( ) ;
if ( ste ) {
Ref < Script > script = ste - > get_edited_script ( ) ;
2016-01-27 17:56:05 +01:00
if ( ! grab_focus_block & & is_visible ( ) )
2015-11-17 13:46:08 +01:00
ste - > get_text_edit ( ) - > grab_focus ( ) ;
edit_menu - > show ( ) ;
search_menu - > show ( ) ;
script_search_menu - > hide ( ) ;
}
EditorHelp * eh = current - > cast_to < EditorHelp > ( ) ;
2014-10-09 05:06:51 +02:00
2015-11-17 13:46:08 +01:00
if ( eh ) {
edit_menu - > hide ( ) ;
search_menu - > hide ( ) ;
script_search_menu - > show ( ) ;
}
2015-06-22 05:03:19 +02:00
}
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : _find_scripts ( Node * p_base , Node * p_current , Set < Ref < Script > > & used ) {
if ( p_current ! = p_base & & p_current - > get_owner ( ) ! = p_base )
2015-06-22 05:03:19 +02:00
return ;
if ( p_current - > get_script_instance ( ) ) {
Ref < Script > scr = p_current - > get_script ( ) ;
if ( scr . is_valid ( ) )
used . insert ( scr ) ;
}
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < p_current - > get_child_count ( ) ; i + + ) {
_find_scripts ( p_base , p_current - > get_child ( i ) , used ) ;
2015-06-22 05:03:19 +02:00
}
}
2015-11-17 13:46:08 +01:00
struct _ScriptEditorItemData {
String name ;
2017-02-02 13:31:01 +01:00
String sort_key ;
2015-11-17 13:46:08 +01:00
Ref < Texture > icon ;
int index ;
String tooltip ;
bool used ;
2015-11-18 13:20:46 +01:00
int category ;
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
bool operator < ( const _ScriptEditorItemData & id ) const {
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
return category = = id . category ? sort_key < id . sort_key : category < id . category ;
2015-11-17 13:46:08 +01:00
}
} ;
void ScriptEditor : : _update_script_colors ( ) {
2016-09-15 16:35:25 +02:00
bool script_temperature_enabled = EditorSettings : : get_singleton ( ) - > get ( " text_editor/script_temperature_enabled " ) ;
2016-09-07 18:54:20 +02:00
bool highlight_current = EditorSettings : : get_singleton ( ) - > get ( " text_editor/highlight_current_script " ) ;
2015-11-17 13:46:08 +01:00
int hist_size = EditorSettings : : get_singleton ( ) - > get ( " text_editor/script_temperature_history_size " ) ;
2017-03-19 00:36:26 +01:00
Color hot_color = EditorSettings : : get_singleton ( ) - > get ( " text_editor/script_temperature_hot_color " ) ;
Color cold_color = EditorSettings : : get_singleton ( ) - > get ( " text_editor/script_temperature_cold_color " ) ;
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < script_list - > get_item_count ( ) ; i + + ) {
2015-11-17 13:46:08 +01:00
int c = script_list - > get_item_metadata ( i ) ;
Node * n = tab_container - > get_child ( c ) ;
if ( ! n )
continue ;
2017-03-19 00:36:26 +01:00
script_list - > set_item_custom_bg_color ( i , Color ( 0 , 0 , 0 , 0 ) ) ;
2015-11-17 13:46:08 +01:00
2016-09-07 18:54:20 +02:00
bool current = tab_container - > get_current_tab ( ) = = c ;
if ( current & & highlight_current ) {
script_list - > set_item_custom_bg_color ( i , EditorSettings : : get_singleton ( ) - > get ( " text_editor/current_script_background_color " ) ) ;
2016-09-15 16:35:25 +02:00
} else if ( script_temperature_enabled ) {
if ( ! n - > has_meta ( " __editor_pass " ) ) {
continue ;
}
2017-03-19 00:36:26 +01:00
int pass = n - > get_meta ( " __editor_pass " ) ;
2016-09-15 16:35:25 +02:00
int h = edit_pass - pass ;
2017-03-19 00:36:26 +01:00
if ( h > hist_size ) {
2016-09-15 16:35:25 +02:00
continue ;
}
2017-03-19 00:36:26 +01:00
int non_zero_hist_size = ( hist_size = = 0 ) ? 1 : hist_size ;
float v = Math : : ease ( ( edit_pass - pass ) / float ( non_zero_hist_size ) , 0.4 ) ;
2016-09-15 16:35:25 +02:00
2017-03-19 00:36:26 +01:00
script_list - > set_item_custom_bg_color ( i , hot_color . linear_interpolate ( cold_color , v ) ) ;
2016-09-07 18:54:20 +02:00
}
2015-11-17 13:46:08 +01:00
}
}
2015-06-22 05:03:19 +02:00
void ScriptEditor : : _update_script_names ( ) {
2016-07-18 17:30:43 +02:00
if ( restoring_layout )
return ;
2017-03-19 00:36:26 +01:00
waiting_update_names = false ;
2015-06-22 05:03:19 +02:00
Set < Ref < Script > > used ;
2017-03-19 00:36:26 +01:00
Node * edited = EditorNode : : get_singleton ( ) - > get_edited_scene ( ) ;
2015-06-22 05:03:19 +02:00
if ( edited ) {
2017-03-19 00:36:26 +01:00
_find_scripts ( edited , edited , used ) ;
2015-06-22 05:03:19 +02:00
}
script_list - > clear ( ) ;
2015-11-18 13:20:46 +01:00
bool split_script_help = EditorSettings : : get_singleton ( ) - > get ( " text_editor/group_help_pages " ) ;
2017-03-19 00:36:26 +01:00
ScriptSortBy sort_by = ( ScriptSortBy ) ( int ) EditorSettings : : get_singleton ( ) - > get ( " text_editor/sort_scripts_by " ) ;
ScriptListName display_as = ( ScriptListName ) ( int ) EditorSettings : : get_singleton ( ) - > get ( " text_editor/list_script_names_as " ) ;
2015-11-17 13:46:08 +01:00
Vector < _ScriptEditorItemData > sedata ;
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2015-11-17 13:46:08 +01:00
2015-06-22 05:03:19 +02:00
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
2015-11-17 13:46:08 +01:00
if ( ste ) {
2015-06-22 05:03:19 +02:00
2015-11-17 13:46:08 +01:00
String name = ste - > get_name ( ) ;
Ref < Texture > icon = ste - > get_icon ( ) ;
2017-02-02 13:31:01 +01:00
String path = ste - > get_edited_script ( ) - > get_path ( ) ;
2015-06-22 05:03:19 +02:00
2015-11-17 13:46:08 +01:00
_ScriptEditorItemData sd ;
2017-03-19 00:36:26 +01:00
sd . icon = icon ;
sd . name = name ;
sd . tooltip = path ;
sd . index = i ;
sd . used = used . has ( ste - > get_edited_script ( ) ) ;
sd . category = 0 ;
2017-02-02 13:31:01 +01:00
switch ( sort_by ) {
case SORT_BY_NAME : {
2017-03-19 00:36:26 +01:00
sd . sort_key = name . to_lower ( ) ;
2017-02-02 13:31:01 +01:00
} break ;
case SORT_BY_PATH : {
2017-03-19 00:36:26 +01:00
sd . sort_key = path ;
2017-02-02 13:31:01 +01:00
} break ;
}
2017-03-19 00:36:26 +01:00
2017-02-02 13:31:01 +01:00
switch ( display_as ) {
case DISPLAY_NAME : {
2017-03-19 00:36:26 +01:00
sd . name = name ;
2017-02-02 13:31:01 +01:00
} break ;
case DISPLAY_DIR_AND_NAME : {
if ( ! path . get_base_dir ( ) . get_file ( ) . empty ( ) ) {
2017-03-19 00:36:26 +01:00
sd . name = path . get_base_dir ( ) . get_file ( ) + " / " + name ;
2017-02-02 13:31:01 +01:00
} else {
2017-03-19 00:36:26 +01:00
sd . name = name ;
2017-02-02 13:31:01 +01:00
}
} break ;
case DISPLAY_FULL_PATH : {
2017-03-19 00:36:26 +01:00
sd . name = path ;
2017-02-02 13:31:01 +01:00
} break ;
}
2015-11-17 13:46:08 +01:00
sedata . push_back ( sd ) ;
}
2015-06-22 05:03:19 +02:00
2015-11-17 13:46:08 +01:00
EditorHelp * eh = tab_container - > get_child ( i ) - > cast_to < EditorHelp > ( ) ;
if ( eh ) {
String name = eh - > get_class_name ( ) ;
2017-03-19 00:36:26 +01:00
Ref < Texture > icon = get_icon ( " Help " , " EditorIcons " ) ;
String tooltip = name + " Class Reference " ;
2015-11-17 13:46:08 +01:00
_ScriptEditorItemData sd ;
2017-03-19 00:36:26 +01:00
sd . icon = icon ;
sd . name = name ;
sd . sort_key = name ;
sd . tooltip = tooltip ;
sd . index = i ;
sd . used = false ;
sd . category = split_script_help ? 1 : 0 ;
2015-11-17 13:46:08 +01:00
sedata . push_back ( sd ) ;
}
}
sedata . sort ( ) ;
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < sedata . size ( ) ; i + + ) {
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
script_list - > add_item ( sedata [ i ] . name , sedata [ i ] . icon ) ;
int index = script_list - > get_item_count ( ) - 1 ;
script_list - > set_item_tooltip ( index , sedata [ i ] . tooltip ) ;
script_list - > set_item_metadata ( index , sedata [ i ] . index ) ;
2015-11-17 13:46:08 +01:00
if ( sedata [ i ] . used ) {
2015-06-22 05:03:19 +02:00
2017-03-19 00:36:26 +01:00
script_list - > set_item_custom_bg_color ( index , Color ( 88 / 255.0 , 88 / 255.0 , 60 / 255.0 ) ) ;
2015-06-22 05:03:19 +02:00
}
2017-03-19 00:36:26 +01:00
if ( tab_container - > get_current_tab ( ) = = sedata [ i ] . index ) {
2015-06-22 05:03:19 +02:00
script_list - > select ( index ) ;
2015-11-17 13:46:08 +01:00
script_name_label - > set_text ( sedata [ i ] . name ) ;
script_icon - > set_texture ( sedata [ i ] . icon ) ;
2015-06-22 05:03:19 +02:00
}
2014-02-10 02:10:30 +01:00
}
2015-06-22 05:03:19 +02:00
2015-11-17 13:46:08 +01:00
_update_script_colors ( ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : edit ( const Ref < Script > & p_script ) {
2014-02-10 02:10:30 +01:00
if ( p_script . is_null ( ) )
return ;
2016-07-07 01:35:49 +02:00
// refuse to open built-in if scene is not loaded
2014-02-10 02:10:30 +01:00
// see if already has it
2015-11-17 13:46:08 +01:00
bool open_dominant = EditorSettings : : get_singleton ( ) - > get ( " text_editor/open_dominant_script_on_scene_change " ) ;
2014-02-10 02:10:30 +01:00
if ( p_script - > get_path ( ) . is_resource_file ( ) & & bool ( EditorSettings : : get_singleton ( ) - > get ( " external_editor/use_external_editor " ) ) ) {
String path = EditorSettings : : get_singleton ( ) - > get ( " external_editor/exec_path " ) ;
String flags = EditorSettings : : get_singleton ( ) - > get ( " external_editor/exec_flags " ) ;
List < String > args ;
2017-03-19 00:36:26 +01:00
flags = flags . strip_edges ( ) ;
if ( flags ! = String ( ) ) {
Vector < String > flagss = flags . split ( " " , false ) ;
for ( int i = 0 ; i < flagss . size ( ) ; i + + )
2014-02-10 02:10:30 +01:00
args . push_back ( flagss [ i ] ) ;
}
args . push_back ( Globals : : get_singleton ( ) - > globalize_path ( p_script - > get_path ( ) ) ) ;
2017-03-19 00:36:26 +01:00
Error err = OS : : get_singleton ( ) - > execute ( path , args , false ) ;
if ( err = = OK )
2014-02-10 02:10:30 +01:00
return ;
WARN_PRINT ( " Couldn't open external text editor, using internal " ) ;
}
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ! ste )
continue ;
2017-03-19 00:36:26 +01:00
if ( ste - > get_edited_script ( ) = = p_script ) {
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
if ( open_dominant | | ! EditorNode : : get_singleton ( ) - > is_changing_scene ( ) ) {
2017-03-19 00:36:26 +01:00
if ( tab_container - > get_current_tab ( ) ! = i ) {
2015-11-17 13:46:08 +01:00
_go_to_tab ( i ) ;
2017-03-19 00:36:26 +01:00
script_list - > select ( script_list - > find_metadata ( i ) ) ;
2015-06-22 05:03:19 +02:00
}
2015-11-17 13:46:08 +01:00
if ( is_visible ( ) )
ste - > get_text_edit ( ) - > grab_focus ( ) ;
2015-06-22 05:03:19 +02:00
}
2014-02-10 02:10:30 +01:00
return ;
}
}
// doesn't have it, make a new one
2017-03-19 00:36:26 +01:00
ScriptTextEditor * ste = memnew ( ScriptTextEditor ) ;
ste - > update_editor_settings ( ) ;
2014-02-10 02:10:30 +01:00
ste - > set_edited_script ( p_script ) ;
2017-03-19 00:36:26 +01:00
ste - > get_text_edit ( ) - > set_tooltip_request_func ( this , " _get_debug_tooltip " , ste ) ;
2016-03-04 11:05:42 +01:00
ste - > get_text_edit ( ) - > set_callhint_settings (
2017-03-19 00:36:26 +01:00
EditorSettings : : get_singleton ( ) - > get ( " text_editor/put_callhint_tooltip_below_current_line " ) ,
EditorSettings : : get_singleton ( ) - > get ( " text_editor/callhint_tooltip_offset " ) ) ;
2016-07-15 16:02:55 +02:00
ste - > get_text_edit ( ) - > connect ( " breakpoint_toggled " , this , " _breakpoint_toggled " ) ;
2014-02-10 02:10:30 +01:00
tab_container - > add_child ( ste ) ;
2017-03-19 00:36:26 +01:00
_go_to_tab ( tab_container - > get_tab_count ( ) - 1 ) ;
2015-06-22 05:03:19 +02:00
_update_script_names ( ) ;
2016-07-18 17:30:43 +02:00
_save_layout ( ) ;
2017-03-19 00:36:26 +01:00
ste - > connect ( " name_changed " , this , " _update_script_names " ) ;
2016-06-20 03:07:07 +02:00
//test for modification, maybe the script was not edited but was loaded
_test_script_times_on_disk ( p_script ) ;
_update_modified_scripts_for_external_editor ( p_script ) ;
2014-02-10 02:10:30 +01:00
}
2016-02-03 01:10:52 +01:00
void ScriptEditor : : save_all_scripts ( ) {
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ! ste )
continue ;
2016-04-23 20:21:34 +02:00
if ( trim_trailing_whitespace_on_save ) {
_trim_trailing_whitespace ( ste - > get_text_edit ( ) ) ;
}
2017-03-19 00:36:26 +01:00
if ( ste - > get_text_edit ( ) - > get_version ( ) = = ste - > get_text_edit ( ) - > get_saved_version ( ) )
2016-02-03 01:10:52 +01:00
continue ;
2014-02-10 02:10:30 +01:00
Ref < Script > script = ste - > get_edited_script ( ) ;
2016-06-12 02:59:35 +02:00
if ( script . is_valid ( ) )
ste - > apply_code ( ) ;
2017-03-19 00:36:26 +01:00
if ( script - > get_path ( ) ! = " " & & script - > get_path ( ) . find ( " local:// " ) = = - 1 & & script - > get_path ( ) . find ( " :: " ) = = - 1 ) {
2014-02-10 02:10:30 +01:00
//external script, save it
2016-06-12 02:59:35 +02:00
2014-02-10 02:10:30 +01:00
editor - > save_resource ( script ) ;
//ResourceSaver::save(script->get_path(),script);
}
}
}
void ScriptEditor : : apply_scripts ( ) const {
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ! ste )
continue ;
ste - > apply_code ( ) ;
}
}
void ScriptEditor : : _editor_play ( ) {
debugger - > start ( ) ;
2016-10-22 12:54:38 +02:00
debug_menu - > get_popup ( ) - > grab_focus ( ) ;
2017-03-19 00:36:26 +01:00
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_NEXT ) , true ) ;
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_STEP ) , true ) ;
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_BREAK ) , false ) ;
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_CONTINUE ) , true ) ;
2014-02-10 02:10:30 +01:00
}
void ScriptEditor : : _editor_pause ( ) {
}
void ScriptEditor : : _editor_stop ( ) {
debugger - > stop ( ) ;
2017-03-19 00:36:26 +01:00
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_NEXT ) , true ) ;
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_STEP ) , true ) ;
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_BREAK ) , true ) ;
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_CONTINUE ) , true ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : _add_callback ( Object * p_obj , const String & p_function , const StringArray & p_args ) {
2014-02-10 02:10:30 +01:00
2016-06-19 01:01:06 +02:00
//print_line("add callback! hohoho"); kinda sad to remove this
2014-02-10 02:10:30 +01:00
ERR_FAIL_COND ( ! p_obj ) ;
Ref < Script > script = p_obj - > get_script ( ) ;
2017-03-19 00:36:26 +01:00
ERR_FAIL_COND ( ! script . is_valid ( ) ) ;
2014-02-10 02:10:30 +01:00
editor - > push_item ( script . ptr ( ) ) ;
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ! ste )
continue ;
2017-03-19 00:36:26 +01:00
if ( ste - > get_edited_script ( ) ! = script )
2014-02-10 02:10:30 +01:00
continue ;
String code = ste - > get_text_edit ( ) - > get_text ( ) ;
2017-03-19 00:36:26 +01:00
int pos = script - > get_language ( ) - > find_function ( p_function , code ) ;
if ( pos = = - 1 ) {
2014-02-10 02:10:30 +01:00
//does not exist
2014-12-07 06:04:20 +01:00
ste - > get_text_edit ( ) - > deselect ( ) ;
2017-03-19 00:36:26 +01:00
pos = ste - > get_text_edit ( ) - > get_line_count ( ) + 2 ;
String func = script - > get_language ( ) - > make_function ( " " , p_function , p_args ) ;
2014-02-10 02:10:30 +01:00
//code=code+func;
2017-03-19 00:36:26 +01:00
ste - > get_text_edit ( ) - > cursor_set_line ( pos + 1 ) ;
2014-02-10 02:10:30 +01:00
ste - > get_text_edit ( ) - > cursor_set_column ( 1000000 ) ; //none shall be that big
2017-03-19 00:36:26 +01:00
ste - > get_text_edit ( ) - > insert_text_at_cursor ( " \n \n " + func ) ;
2014-02-10 02:10:30 +01:00
}
2015-11-17 13:46:08 +01:00
_go_to_tab ( i ) ;
2014-02-10 02:10:30 +01:00
ste - > get_text_edit ( ) - > cursor_set_line ( pos ) ;
ste - > get_text_edit ( ) - > cursor_set_column ( 1 ) ;
2017-03-19 00:36:26 +01:00
script_list - > select ( script_list - > find_metadata ( i ) ) ;
2015-06-22 05:03:19 +02:00
2014-02-10 02:10:30 +01:00
break ;
}
}
2016-07-18 17:30:43 +02:00
void ScriptEditor : : _save_layout ( ) {
if ( restoring_layout ) {
return ;
}
editor - > save_layout ( ) ;
}
2015-05-05 04:32:40 +02:00
void ScriptEditor : : _editor_settings_changed ( ) {
2016-04-23 20:21:34 +02:00
trim_trailing_whitespace_on_save = EditorSettings : : get_singleton ( ) - > get ( " text_editor/trim_trailing_whitespace_on_save " ) ;
2015-05-05 04:32:40 +02:00
float autosave_time = EditorSettings : : get_singleton ( ) - > get ( " text_editor/autosave_interval_secs " ) ;
2017-03-19 00:36:26 +01:00
if ( autosave_time > 0 ) {
2015-05-05 04:32:40 +02:00
autosave_timer - > set_wait_time ( autosave_time ) ;
autosave_timer - > start ( ) ;
} else {
autosave_timer - > stop ( ) ;
}
2016-04-12 16:45:31 +02:00
if ( current_theme = = " " ) {
current_theme = EditorSettings : : get_singleton ( ) - > get ( " text_editor/color_theme " ) ;
} else if ( current_theme ! = EditorSettings : : get_singleton ( ) - > get ( " text_editor/color_theme " ) ) {
current_theme = EditorSettings : : get_singleton ( ) - > get ( " text_editor/color_theme " ) ;
EditorSettings : : get_singleton ( ) - > load_text_editor_theme ( ) ;
}
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2016-01-01 13:52:01 +01:00
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
if ( ! ste )
continue ;
2017-03-19 00:36:26 +01:00
ste - > update_editor_settings ( ) ;
2016-01-01 13:52:01 +01:00
}
2016-09-12 16:19:30 +02:00
_update_script_colors ( ) ;
2017-02-02 13:31:01 +01:00
_update_script_names ( ) ;
2016-01-01 13:52:01 +01:00
2017-03-19 00:36:26 +01:00
ScriptServer : : set_reload_scripts_on_save ( EDITOR_DEF ( " text_editor/auto_reload_and_parse_scripts_on_save " , true ) ) ;
2015-05-05 04:32:40 +02:00
}
void ScriptEditor : : _autosave_scripts ( ) {
2016-02-03 01:10:52 +01:00
save_all_scripts ( ) ;
2015-05-05 04:32:40 +02:00
}
2015-06-22 05:03:19 +02:00
void ScriptEditor : : _tree_changed ( ) {
if ( waiting_update_names )
return ;
2017-03-19 00:36:26 +01:00
waiting_update_names = true ;
2015-06-22 05:03:19 +02:00
call_deferred ( " _update_script_names " ) ;
}
void ScriptEditor : : _script_split_dragged ( float ) {
2016-07-18 17:30:43 +02:00
_save_layout ( ) ;
2015-06-22 05:03:19 +02:00
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : _unhandled_input ( const InputEvent & p_event ) {
2016-06-26 02:02:17 +02:00
if ( p_event . key . pressed | | ! is_visible ( ) ) return ;
if ( ED_IS_SHORTCUT ( " script_editor/next_script " , p_event ) ) {
int next_tab = script_list - > get_current ( ) + 1 ;
next_tab % = script_list - > get_item_count ( ) ;
_go_to_tab ( script_list - > get_item_metadata ( next_tab ) ) ;
_update_script_names ( ) ;
}
if ( ED_IS_SHORTCUT ( " script_editor/prev_script " , p_event ) ) {
int next_tab = script_list - > get_current ( ) - 1 ;
next_tab = next_tab > = 0 ? next_tab : script_list - > get_item_count ( ) - 1 ;
_go_to_tab ( script_list - > get_item_metadata ( next_tab ) ) ;
_update_script_names ( ) ;
}
}
2015-06-22 05:03:19 +02:00
void ScriptEditor : : set_window_layout ( Ref < ConfigFile > p_layout ) {
2017-03-19 00:36:26 +01:00
if ( ! bool ( EDITOR_DEF ( " text_editor/restore_scripts_on_load " , true ) ) ) {
2015-06-22 05:03:19 +02:00
return ;
}
2017-03-19 00:36:26 +01:00
if ( ! p_layout - > has_section_key ( " ScriptEditor " , " open_scripts " ) & & ! p_layout - > has_section_key ( " ScriptEditor " , " open_help " ) )
2015-06-22 05:03:19 +02:00
return ;
2017-03-19 00:36:26 +01:00
Array scripts = p_layout - > get_value ( " ScriptEditor " , " open_scripts " ) ;
2015-11-17 13:46:08 +01:00
Array helps ;
2017-03-19 00:36:26 +01:00
if ( p_layout - > has_section_key ( " ScriptEditor " , " open_help " ) )
helps = p_layout - > get_value ( " ScriptEditor " , " open_help " ) ;
2015-06-22 05:03:19 +02:00
2017-03-19 00:36:26 +01:00
restoring_layout = true ;
2015-06-22 05:03:19 +02:00
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < scripts . size ( ) ; i + + ) {
2015-06-22 05:03:19 +02:00
String path = scripts [ i ] ;
2016-07-08 02:27:20 +02:00
if ( ! FileAccess : : exists ( path ) )
continue ;
2015-06-22 05:03:19 +02:00
Ref < Script > scr = ResourceLoader : : load ( path ) ;
if ( scr . is_valid ( ) ) {
edit ( scr ) ;
}
}
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < helps . size ( ) ; i + + ) {
2015-11-17 13:46:08 +01:00
String path = helps [ i ] ;
2017-07-02 12:31:08 +02:00
if ( path = = " " ) { // invalid, skip
continue ;
}
2015-11-17 13:46:08 +01:00
_help_class_open ( path ) ;
}
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
tab_container - > get_child ( i ) - > set_meta ( " __editor_pass " , Variant ( ) ) ;
2015-11-17 13:46:08 +01:00
}
2017-03-19 00:36:26 +01:00
if ( p_layout - > has_section_key ( " ScriptEditor " , " split_offset " ) ) {
script_split - > set_split_offset ( p_layout - > get_value ( " ScriptEditor " , " split_offset " ) ) ;
2015-06-22 05:03:19 +02:00
}
2017-03-19 00:36:26 +01:00
restoring_layout = false ;
2015-06-22 05:03:19 +02:00
2016-07-18 17:30:43 +02:00
_update_script_names ( ) ;
2015-06-22 05:03:19 +02:00
}
void ScriptEditor : : get_window_layout ( Ref < ConfigFile > p_layout ) {
Array scripts ;
2015-11-17 13:46:08 +01:00
Array helps ;
2015-06-22 05:03:19 +02:00
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2015-06-22 05:03:19 +02:00
ScriptTextEditor * ste = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
2015-11-17 13:46:08 +01:00
if ( ste ) {
2015-06-22 05:03:19 +02:00
2015-11-17 13:46:08 +01:00
String path = ste - > get_edited_script ( ) - > get_path ( ) ;
if ( ! path . is_resource_file ( ) )
continue ;
scripts . push_back ( path ) ;
}
EditorHelp * eh = tab_container - > get_child ( i ) - > cast_to < EditorHelp > ( ) ;
if ( eh ) {
helps . push_back ( eh - > get_class_name ( ) ) ;
}
2015-06-22 05:03:19 +02:00
}
2017-03-19 00:36:26 +01:00
p_layout - > set_value ( " ScriptEditor " , " open_scripts " , scripts ) ;
p_layout - > set_value ( " ScriptEditor " , " open_help " , helps ) ;
p_layout - > set_value ( " ScriptEditor " , " split_offset " , script_split - > get_split_offset ( ) ) ;
2015-06-22 05:03:19 +02:00
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : _help_class_open ( const String & p_class ) {
2015-06-22 05:03:19 +02:00
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2015-11-17 13:46:08 +01:00
EditorHelp * eh = tab_container - > get_child ( i ) - > cast_to < EditorHelp > ( ) ;
2017-03-19 00:36:26 +01:00
if ( eh & & eh - > get_class_name ( ) = = p_class ) {
2015-11-17 13:46:08 +01:00
_go_to_tab ( i ) ;
_update_script_names ( ) ;
return ;
}
}
2017-03-19 00:36:26 +01:00
EditorHelp * eh = memnew ( EditorHelp ) ;
2015-11-17 13:46:08 +01:00
eh - > set_name ( p_class ) ;
tab_container - > add_child ( eh ) ;
2017-03-19 00:36:26 +01:00
_go_to_tab ( tab_container - > get_tab_count ( ) - 1 ) ;
eh - > go_to_class ( p_class , 0 ) ;
eh - > connect ( " go_to_help " , this , " _help_class_goto " ) ;
2015-11-17 13:46:08 +01:00
_update_script_names ( ) ;
2016-07-18 17:30:43 +02:00
_save_layout ( ) ;
2015-11-17 13:46:08 +01:00
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : _help_class_goto ( const String & p_desc ) {
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
String cname = p_desc . get_slice ( " : " , 1 ) ;
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2015-11-17 13:46:08 +01:00
EditorHelp * eh = tab_container - > get_child ( i ) - > cast_to < EditorHelp > ( ) ;
2017-03-19 00:36:26 +01:00
if ( eh & & eh - > get_class_name ( ) = = cname ) {
2015-11-17 13:46:08 +01:00
_go_to_tab ( i ) ;
eh - > go_to_help ( p_desc ) ;
_update_script_names ( ) ;
return ;
}
}
2017-03-19 00:36:26 +01:00
EditorHelp * eh = memnew ( EditorHelp ) ;
2015-11-17 13:46:08 +01:00
eh - > set_name ( cname ) ;
tab_container - > add_child ( eh ) ;
2017-03-19 00:36:26 +01:00
_go_to_tab ( tab_container - > get_tab_count ( ) - 1 ) ;
2015-11-17 13:46:08 +01:00
eh - > go_to_help ( p_desc ) ;
2017-03-19 00:36:26 +01:00
eh - > connect ( " go_to_help " , this , " _help_class_goto " ) ;
2015-11-17 13:46:08 +01:00
_update_script_names ( ) ;
2016-07-18 17:30:43 +02:00
_save_layout ( ) ;
2015-11-17 13:46:08 +01:00
}
void ScriptEditor : : _update_history_pos ( int p_new_pos ) {
Node * n = tab_container - > get_current_tab_control ( ) ;
if ( n - > cast_to < ScriptTextEditor > ( ) ) {
2017-03-19 00:36:26 +01:00
history [ history_pos ] . scroll_pos = n - > cast_to < ScriptTextEditor > ( ) - > get_text_edit ( ) - > get_v_scroll ( ) ;
history [ history_pos ] . cursor_column = n - > cast_to < ScriptTextEditor > ( ) - > get_text_edit ( ) - > cursor_get_column ( ) ;
history [ history_pos ] . cursor_row = n - > cast_to < ScriptTextEditor > ( ) - > get_text_edit ( ) - > cursor_get_line ( ) ;
2015-11-17 13:46:08 +01:00
}
if ( n - > cast_to < EditorHelp > ( ) ) {
2017-03-19 00:36:26 +01:00
history [ history_pos ] . scroll_pos = n - > cast_to < EditorHelp > ( ) - > get_scroll ( ) ;
2015-11-17 13:46:08 +01:00
}
2017-03-19 00:36:26 +01:00
history_pos = p_new_pos ;
2015-11-17 13:46:08 +01:00
tab_container - > set_current_tab ( history [ history_pos ] . control - > get_index ( ) ) ;
n = history [ history_pos ] . control ;
if ( n - > cast_to < ScriptTextEditor > ( ) ) {
n - > cast_to < ScriptTextEditor > ( ) - > get_text_edit ( ) - > set_v_scroll ( history [ history_pos ] . scroll_pos ) ;
2017-03-19 00:36:26 +01:00
n - > cast_to < ScriptTextEditor > ( ) - > get_text_edit ( ) - > cursor_set_column ( history [ history_pos ] . cursor_column ) ;
n - > cast_to < ScriptTextEditor > ( ) - > get_text_edit ( ) - > cursor_set_line ( history [ history_pos ] . cursor_row ) ;
2015-11-17 13:46:08 +01:00
n - > cast_to < ScriptTextEditor > ( ) - > get_text_edit ( ) - > grab_focus ( ) ;
}
if ( n - > cast_to < EditorHelp > ( ) ) {
n - > cast_to < EditorHelp > ( ) - > set_scroll ( history [ history_pos ] . scroll_pos ) ;
n - > cast_to < EditorHelp > ( ) - > set_focused ( ) ;
}
2017-03-19 00:36:26 +01:00
n - > set_meta ( " __editor_pass " , + + edit_pass ) ;
2015-11-17 13:46:08 +01:00
_update_script_names ( ) ;
_update_history_arrows ( ) ;
}
void ScriptEditor : : _history_forward ( ) {
2017-03-19 00:36:26 +01:00
if ( history_pos < history . size ( ) - 1 ) {
_update_history_pos ( history_pos + 1 ) ;
2015-11-17 13:46:08 +01:00
}
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : _history_back ( ) {
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
if ( history_pos > 0 ) {
_update_history_pos ( history_pos - 1 ) ;
2015-11-17 13:46:08 +01:00
}
}
2017-03-19 00:36:26 +01:00
void ScriptEditor : : set_scene_root_script ( Ref < Script > p_script ) {
2015-11-17 13:46:08 +01:00
bool open_dominant = EditorSettings : : get_singleton ( ) - > get ( " text_editor/open_dominant_script_on_scene_change " ) ;
2015-12-14 12:28:01 +01:00
2015-12-14 12:21:18 +01:00
if ( bool ( EditorSettings : : get_singleton ( ) - > get ( " external_editor/use_external_editor " ) ) )
return ;
2016-07-07 01:35:49 +02:00
if ( open_dominant & & p_script . is_valid ( ) & & _can_open_in_editor ( p_script . ptr ( ) ) ) {
2015-11-17 13:46:08 +01:00
edit ( p_script ) ;
}
}
2017-03-19 00:36:26 +01:00
bool ScriptEditor : : script_go_to_method ( Ref < Script > p_script , const String & p_method ) {
2016-06-12 01:01:17 +02:00
Vector < String > functions ;
2017-03-19 00:36:26 +01:00
bool found = false ;
2016-06-12 01:01:17 +02:00
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < tab_container - > get_child_count ( ) ; i + + ) {
2016-06-12 01:01:17 +02:00
ScriptTextEditor * current = tab_container - > get_child ( i ) - > cast_to < ScriptTextEditor > ( ) ;
2017-03-19 00:36:26 +01:00
if ( current & & current - > get_edited_script ( ) = = p_script ) {
functions = current - > get_functions ( ) ;
found = true ;
2016-06-12 01:01:17 +02:00
break ;
}
}
if ( ! found ) {
String errortxt ;
2017-03-19 00:36:26 +01:00
int line = - 1 , col ;
String text = p_script - > get_source_code ( ) ;
2016-06-12 01:01:17 +02:00
List < String > fnc ;
2017-03-19 00:36:26 +01:00
if ( p_script - > get_language ( ) - > validate ( text , line , col , errortxt , p_script - > get_path ( ) , & fnc ) ) {
2016-06-12 01:01:17 +02:00
2017-03-19 00:36:26 +01:00
for ( List < String > : : Element * E = fnc . front ( ) ; E ; E = E - > next ( ) )
2016-06-12 01:01:17 +02:00
functions . push_back ( E - > get ( ) ) ;
}
}
String method_search = p_method + " : " ;
2017-03-19 00:36:26 +01:00
for ( int i = 0 ; i < functions . size ( ) ; i + + ) {
String function = functions [ i ] ;
2016-06-12 01:01:17 +02:00
if ( function . begins_with ( method_search ) ) {
edit ( p_script ) ;
2017-03-19 00:36:26 +01:00
int line = function . get_slice ( " : " , 1 ) . to_int ( ) ;
_goto_script_line2 ( line - 1 ) ;
2016-06-12 01:01:17 +02:00
return true ;
}
}
return false ;
}
2016-06-03 17:34:11 +02:00
void ScriptEditor : : set_live_auto_reload_running_scripts ( bool p_enabled ) {
2017-03-19 00:36:26 +01:00
auto_reload_running_scripts = p_enabled ;
2016-06-03 17:34:11 +02:00
}
2015-11-17 13:46:08 +01:00
void ScriptEditor : : _bind_methods ( ) {
2017-03-19 00:36:26 +01:00
ObjectTypeDB : : bind_method ( " _file_dialog_action " , & ScriptEditor : : _file_dialog_action ) ;
ObjectTypeDB : : bind_method ( " _tab_changed " , & ScriptEditor : : _tab_changed ) ;
ObjectTypeDB : : bind_method ( " _menu_option " , & ScriptEditor : : _menu_option ) ;
ObjectTypeDB : : bind_method ( " _close_current_tab " , & ScriptEditor : : _close_current_tab ) ;
2016-07-18 00:18:48 +02:00
ObjectTypeDB : : bind_method ( " _close_docs_tab " , & ScriptEditor : : _close_docs_tab ) ;
2017-03-19 00:36:26 +01:00
ObjectTypeDB : : bind_method ( " _editor_play " , & ScriptEditor : : _editor_play ) ;
ObjectTypeDB : : bind_method ( " _editor_pause " , & ScriptEditor : : _editor_pause ) ;
ObjectTypeDB : : bind_method ( " _editor_stop " , & ScriptEditor : : _editor_stop ) ;
ObjectTypeDB : : bind_method ( " _add_callback " , & ScriptEditor : : _add_callback ) ;
ObjectTypeDB : : bind_method ( " _reload_scripts " , & ScriptEditor : : _reload_scripts ) ;
ObjectTypeDB : : bind_method ( " _resave_scripts " , & ScriptEditor : : _resave_scripts ) ;
ObjectTypeDB : : bind_method ( " _res_saved_callback " , & ScriptEditor : : _res_saved_callback ) ;
ObjectTypeDB : : bind_method ( " _goto_script_line " , & ScriptEditor : : _goto_script_line ) ;
ObjectTypeDB : : bind_method ( " _goto_script_line2 " , & ScriptEditor : : _goto_script_line2 ) ;
2016-07-15 16:02:55 +02:00
ObjectTypeDB : : bind_method ( " _breakpoint_toggled " , & ScriptEditor : : _breakpoint_toggled ) ;
2017-03-19 00:36:26 +01:00
ObjectTypeDB : : bind_method ( " _breaked " , & ScriptEditor : : _breaked ) ;
ObjectTypeDB : : bind_method ( " _show_debugger " , & ScriptEditor : : _show_debugger ) ;
ObjectTypeDB : : bind_method ( " _get_debug_tooltip " , & ScriptEditor : : _get_debug_tooltip ) ;
ObjectTypeDB : : bind_method ( " _autosave_scripts " , & ScriptEditor : : _autosave_scripts ) ;
ObjectTypeDB : : bind_method ( " _editor_settings_changed " , & ScriptEditor : : _editor_settings_changed ) ;
ObjectTypeDB : : bind_method ( " _update_script_names " , & ScriptEditor : : _update_script_names ) ;
ObjectTypeDB : : bind_method ( " _tree_changed " , & ScriptEditor : : _tree_changed ) ;
ObjectTypeDB : : bind_method ( " _script_selected " , & ScriptEditor : : _script_selected ) ;
ObjectTypeDB : : bind_method ( " _script_created " , & ScriptEditor : : _script_created ) ;
ObjectTypeDB : : bind_method ( " _script_split_dragged " , & ScriptEditor : : _script_split_dragged ) ;
ObjectTypeDB : : bind_method ( " _help_class_open " , & ScriptEditor : : _help_class_open ) ;
ObjectTypeDB : : bind_method ( " _help_class_goto " , & ScriptEditor : : _help_class_goto ) ;
ObjectTypeDB : : bind_method ( " _request_help " , & ScriptEditor : : _help_class_open ) ;
ObjectTypeDB : : bind_method ( " _history_forward " , & ScriptEditor : : _history_forward ) ;
ObjectTypeDB : : bind_method ( " _history_back " , & ScriptEditor : : _history_back ) ;
ObjectTypeDB : : bind_method ( " _live_auto_reload_running_scripts " , & ScriptEditor : : _live_auto_reload_running_scripts ) ;
ObjectTypeDB : : bind_method ( " _unhandled_input " , & ScriptEditor : : _unhandled_input ) ;
2015-11-17 13:46:08 +01:00
}
2015-06-22 05:03:19 +02:00
2014-02-10 02:10:30 +01:00
ScriptEditor : : ScriptEditor ( EditorNode * p_editor ) {
2016-04-12 16:45:31 +02:00
current_theme = " " ;
2017-03-19 00:36:26 +01:00
completion_cache = memnew ( EditorScriptCodeCompletionCache ) ;
restoring_layout = false ;
waiting_update_names = false ;
pending_auto_reload = false ;
auto_reload_running_scripts = false ;
editor = p_editor ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
menu_hb = memnew ( HBoxContainer ) ;
2014-02-10 02:10:30 +01:00
add_child ( menu_hb ) ;
2017-03-19 00:36:26 +01:00
script_split = memnew ( HSplitContainer ) ;
2016-01-18 00:03:57 +01:00
add_child ( script_split ) ;
2015-06-22 05:03:19 +02:00
script_split - > set_v_size_flags ( SIZE_EXPAND_FILL ) ;
2017-03-19 00:36:26 +01:00
script_list = memnew ( ItemList ) ;
2015-06-22 05:03:19 +02:00
script_split - > add_child ( script_list ) ;
2017-03-19 00:36:26 +01:00
script_list - > set_custom_minimum_size ( Size2 ( 0 , 0 ) ) ;
2016-01-20 13:01:27 +01:00
script_split - > set_split_offset ( 140 ) ;
2015-06-22 05:03:19 +02:00
2017-03-19 00:36:26 +01:00
tab_container = memnew ( TabContainer ) ;
2015-06-22 05:03:19 +02:00
tab_container - > set_tabs_visible ( false ) ;
script_split - > add_child ( tab_container ) ;
tab_container - > set_h_size_flags ( SIZE_EXPAND_FILL ) ;
2014-02-10 02:10:30 +01:00
2016-06-26 02:02:17 +02:00
ED_SHORTCUT ( " script_editor/next_script " , TTR ( " Next script " ) , KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_GREATER ) ;
ED_SHORTCUT ( " script_editor/prev_script " , TTR ( " Previous script " ) , KEY_MASK_CMD | KEY_LESS ) ;
set_process_unhandled_input ( true ) ;
2017-03-19 00:36:26 +01:00
file_menu = memnew ( MenuButton ) ;
2014-02-10 02:10:30 +01:00
menu_hb - > add_child ( file_menu ) ;
2016-05-04 03:25:37 +02:00
file_menu - > set_text ( TTR ( " File " ) ) ;
2016-06-11 23:18:55 +02:00
file_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/new " , TTR ( " New " ) ) , FILE_NEW ) ;
file_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/open " , TTR ( " Open " ) ) , FILE_OPEN ) ;
2015-06-22 05:03:19 +02:00
file_menu - > get_popup ( ) - > add_separator ( ) ;
2017-03-19 00:36:26 +01:00
file_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/save " , TTR ( " Save " ) , KEY_MASK_ALT | KEY_MASK_CMD | KEY_S ) , FILE_SAVE ) ;
2016-06-11 23:18:55 +02:00
file_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/save_as " , TTR ( " Save As.. " ) ) , FILE_SAVE_AS ) ;
2017-03-19 00:36:26 +01:00
file_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/save_all " , TTR ( " Save All " ) , KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_MASK_ALT | KEY_S ) , FILE_SAVE_ALL ) ;
2015-06-22 05:03:19 +02:00
file_menu - > get_popup ( ) - > add_separator ( ) ;
2017-03-19 00:36:26 +01:00
file_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/history_previous " , TTR ( " History Prev " ) , KEY_MASK_CTRL | KEY_MASK_ALT | KEY_LEFT ) , WINDOW_PREV ) ;
file_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/history_next " , TTR ( " History Next " ) , KEY_MASK_CTRL | KEY_MASK_ALT | KEY_RIGHT ) , WINDOW_NEXT ) ;
2015-11-17 13:46:08 +01:00
file_menu - > get_popup ( ) - > add_separator ( ) ;
2016-06-11 23:18:55 +02:00
file_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/import_theme " , TTR ( " Import Theme " ) ) , FILE_IMPORT_THEME ) ;
file_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/reload_theme " , TTR ( " Reload Theme " ) ) , FILE_RELOAD_THEME ) ;
file_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/save_theme " , TTR ( " Save Theme " ) ) , FILE_SAVE_THEME ) ;
file_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/save_theme_as " , TTR ( " Save Theme As " ) ) , FILE_SAVE_THEME_AS ) ;
2016-04-12 16:45:31 +02:00
file_menu - > get_popup ( ) - > add_separator ( ) ;
2016-07-18 00:18:48 +02:00
file_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/close_docs " , TTR ( " Close Docs " ) ) , CLOSE_DOCS ) ;
file_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/close_file " , TTR ( " Close " ) , KEY_MASK_CMD | KEY_W ) , FILE_CLOSE ) ;
2017-03-19 00:36:26 +01:00
file_menu - > get_popup ( ) - > connect ( " item_pressed " , this , " _menu_option " ) ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
edit_menu = memnew ( MenuButton ) ;
2014-02-10 02:10:30 +01:00
menu_hb - > add_child ( edit_menu ) ;
2016-05-04 03:25:37 +02:00
edit_menu - > set_text ( TTR ( " Edit " ) ) ;
2017-03-19 00:36:26 +01:00
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/undo " , TTR ( " Undo " ) , KEY_MASK_CMD | KEY_Z ) , EDIT_UNDO ) ;
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/redo " , TTR ( " Redo " ) , KEY_MASK_CMD | KEY_Y ) , EDIT_REDO ) ;
2014-02-10 02:10:30 +01:00
edit_menu - > get_popup ( ) - > add_separator ( ) ;
2017-03-19 00:36:26 +01:00
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/cut " , TTR ( " Cut " ) , KEY_MASK_CMD | KEY_X ) , EDIT_CUT ) ;
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/copy " , TTR ( " Copy " ) , KEY_MASK_CMD | KEY_C ) , EDIT_COPY ) ;
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/paste " , TTR ( " Paste " ) , KEY_MASK_CMD | KEY_V ) , EDIT_PASTE ) ;
2014-02-10 02:10:30 +01:00
edit_menu - > get_popup ( ) - > add_separator ( ) ;
2017-03-19 00:36:26 +01:00
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/select_all " , TTR ( " Select All " ) , KEY_MASK_CMD | KEY_A ) , EDIT_SELECT_ALL ) ;
2014-12-17 02:31:57 +01:00
edit_menu - > get_popup ( ) - > add_separator ( ) ;
2017-03-19 00:36:26 +01:00
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/move_up " , TTR ( " Move Up " ) , KEY_MASK_ALT | KEY_UP ) , EDIT_MOVE_LINE_UP ) ;
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/move_down " , TTR ( " Move Down " ) , KEY_MASK_ALT | KEY_DOWN ) , EDIT_MOVE_LINE_DOWN ) ;
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/indent_left " , TTR ( " Indent Left " ) , KEY_MASK_ALT | KEY_LEFT ) , EDIT_INDENT_LEFT ) ;
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/indent_right " , TTR ( " Indent Right " ) , KEY_MASK_ALT | KEY_RIGHT ) , EDIT_INDENT_RIGHT ) ;
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/toggle_comment " , TTR ( " Toggle Comment " ) , KEY_MASK_CMD | KEY_K ) , EDIT_TOGGLE_COMMENT ) ;
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/clone_down " , TTR ( " Clone Down " ) , KEY_MASK_CMD | KEY_B ) , EDIT_CLONE_DOWN ) ;
2014-02-10 02:10:30 +01:00
edit_menu - > get_popup ( ) - > add_separator ( ) ;
2015-01-04 15:03:31 +01:00
# ifdef OSX_ENABLED
2017-03-19 00:36:26 +01:00
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/complete_symbol " , TTR ( " Complete Symbol " ) , KEY_MASK_CTRL | KEY_SPACE ) , EDIT_COMPLETE ) ;
2015-01-04 15:03:31 +01:00
# else
2017-03-19 00:36:26 +01:00
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/complete_symbol " , TTR ( " Complete Symbol " ) , KEY_MASK_CMD | KEY_SPACE ) , EDIT_COMPLETE ) ;
2015-01-04 15:03:31 +01:00
# endif
2017-03-19 00:36:26 +01:00
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/trim_trailing_whitespace " , TTR ( " Trim Trailing Whitespace " ) , KEY_MASK_CTRL | KEY_MASK_ALT | KEY_T ) , EDIT_TRIM_TRAILING_WHITESAPCE ) ;
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/auto_indent " , TTR ( " Auto Indent " ) , KEY_MASK_CMD | KEY_I ) , EDIT_AUTO_INDENT ) ;
edit_menu - > get_popup ( ) - > connect ( " item_pressed " , this , " _menu_option " ) ;
2016-06-09 01:00:02 +02:00
edit_menu - > get_popup ( ) - > add_separator ( ) ;
2017-03-19 00:36:26 +01:00
edit_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/reload_script_soft " , TTR ( " Soft Reload Script " ) , KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_R ) , FILE_TOOL_RELOAD_SOFT ) ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
search_menu = memnew ( MenuButton ) ;
2014-02-10 02:10:30 +01:00
menu_hb - > add_child ( search_menu ) ;
2016-05-04 03:25:37 +02:00
search_menu - > set_text ( TTR ( " Search " ) ) ;
2017-03-19 00:36:26 +01:00
search_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/find " , TTR ( " Find.. " ) , KEY_MASK_CMD | KEY_F ) , SEARCH_FIND ) ;
2016-06-11 23:18:55 +02:00
search_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/find_next " , TTR ( " Find Next " ) , KEY_F3 ) , SEARCH_FIND_NEXT ) ;
2017-03-19 00:36:26 +01:00
search_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/find_previous " , TTR ( " Find Previous " ) , KEY_MASK_SHIFT | KEY_F3 ) , SEARCH_FIND_PREV ) ;
search_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/replace " , TTR ( " Replace.. " ) , KEY_MASK_CMD | KEY_R ) , SEARCH_REPLACE ) ;
2014-02-10 02:10:30 +01:00
search_menu - > get_popup ( ) - > add_separator ( ) ;
2017-03-19 00:36:26 +01:00
search_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/goto_function " , TTR ( " Goto Function.. " ) , KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_F ) , SEARCH_LOCATE_FUNCTION ) ;
search_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/goto_line " , TTR ( " Goto Line.. " ) , KEY_MASK_CMD | KEY_L ) , SEARCH_GOTO_LINE ) ;
search_menu - > get_popup ( ) - > connect ( " item_pressed " , this , " _menu_option " ) ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
script_search_menu = memnew ( MenuButton ) ;
2015-11-17 13:46:08 +01:00
menu_hb - > add_child ( script_search_menu ) ;
2016-05-04 03:25:37 +02:00
script_search_menu - > set_text ( TTR ( " Search " ) ) ;
2017-03-19 00:36:26 +01:00
script_search_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/find " , TTR ( " Find.. " ) , KEY_MASK_CMD | KEY_F ) , SEARCH_FIND ) ;
2016-06-11 23:18:55 +02:00
script_search_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/find_next " , TTR ( " Find Next " ) , KEY_F3 ) , SEARCH_FIND_NEXT ) ;
2017-03-19 00:36:26 +01:00
script_search_menu - > get_popup ( ) - > connect ( " item_pressed " , this , " _menu_option " ) ;
2015-11-17 13:46:08 +01:00
script_search_menu - > hide ( ) ;
2017-03-19 00:36:26 +01:00
debug_menu = memnew ( MenuButton ) ;
2014-02-10 02:10:30 +01:00
menu_hb - > add_child ( debug_menu ) ;
2016-05-04 03:25:37 +02:00
debug_menu - > set_text ( TTR ( " Debug " ) ) ;
2016-06-11 23:18:55 +02:00
debug_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/toggle_breakpoint " , TTR ( " Toggle Breakpoint " ) , KEY_F9 ) , DEBUG_TOGGLE_BREAKPOINT ) ;
2017-03-19 00:36:26 +01:00
debug_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/remove_all_breakpoints " , TTR ( " Remove All Breakpoints " ) , KEY_MASK_CTRL | KEY_MASK_SHIFT | KEY_F9 ) , DEBUG_REMOVE_ALL_BREAKPOINTS ) ;
debug_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/goto_next_breakpoint " , TTR ( " Goto Next Breakpoint " ) , KEY_MASK_CTRL | KEY_PERIOD ) , DEBUG_GOTO_NEXT_BREAKPOINT ) ;
debug_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/goto_previous_breakpoint " , TTR ( " Goto Previous Breakpoint " ) , KEY_MASK_CTRL | KEY_COMMA ) , DEBUG_GOTO_PREV_BREAKPOINT ) ;
2014-02-10 02:10:30 +01:00
debug_menu - > get_popup ( ) - > add_separator ( ) ;
2016-06-11 23:18:55 +02:00
debug_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " debugger/step_over " , TTR ( " Step Over " ) , KEY_F10 ) , DEBUG_NEXT ) ;
debug_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " debugger/step_into " , TTR ( " Step Into " ) , KEY_F11 ) , DEBUG_STEP ) ;
2014-02-10 02:10:30 +01:00
debug_menu - > get_popup ( ) - > add_separator ( ) ;
2016-06-11 23:18:55 +02:00
debug_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " debugger/break " , TTR ( " Break " ) ) , DEBUG_BREAK ) ;
debug_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " debugger/continue " , TTR ( " Continue " ) ) , DEBUG_CONTINUE ) ;
2014-02-10 02:10:30 +01:00
debug_menu - > get_popup ( ) - > add_separator ( ) ;
2016-05-21 01:18:35 +02:00
//debug_menu->get_popup()->add_check_item("Show Debugger",DEBUG_SHOW);
2016-06-11 23:18:55 +02:00
debug_menu - > get_popup ( ) - > add_check_shortcut ( ED_SHORTCUT ( " debugger/keep_debugger_open " , TTR ( " Keep Debugger Open " ) ) , DEBUG_SHOW_KEEP_OPEN ) ;
2017-03-19 00:36:26 +01:00
debug_menu - > get_popup ( ) - > connect ( " item_pressed " , this , " _menu_option " ) ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_NEXT ) , true ) ;
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_STEP ) , true ) ;
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_BREAK ) , true ) ;
debug_menu - > get_popup ( ) - > set_item_disabled ( debug_menu - > get_popup ( ) - > get_item_index ( DEBUG_CONTINUE ) , true ) ;
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
#if 0
2014-02-10 02:10:30 +01:00
window_menu = memnew ( MenuButton ) ;
menu_hb - > add_child ( window_menu ) ;
2016-05-04 03:25:37 +02:00
window_menu - > set_text ( TTR ( " Window " ) ) ;
window_menu - > get_popup ( ) - > add_item ( TTR ( " Close " ) , WINDOW_CLOSE , KEY_MASK_CMD | KEY_W ) ;
2014-02-10 02:10:30 +01:00
window_menu - > get_popup ( ) - > add_separator ( ) ;
2016-05-04 03:25:37 +02:00
window_menu - > get_popup ( ) - > add_item ( TTR ( " Move Left " ) , WINDOW_MOVE_LEFT , KEY_MASK_CMD | KEY_LEFT ) ;
window_menu - > get_popup ( ) - > add_item ( TTR ( " Move Right " ) , WINDOW_MOVE_RIGHT , KEY_MASK_CMD | KEY_RIGHT ) ;
2014-02-10 02:10:30 +01:00
window_menu - > get_popup ( ) - > add_separator ( ) ;
window_menu - > get_popup ( ) - > connect ( " item_pressed " , this , " _menu_option " ) ;
2015-06-22 05:03:19 +02:00
# endif
2017-03-19 00:36:26 +01:00
help_menu = memnew ( MenuButton ) ;
2014-05-05 15:59:18 +02:00
menu_hb - > add_child ( help_menu ) ;
2016-05-04 03:25:37 +02:00
help_menu - > set_text ( TTR ( " Help " ) ) ;
2017-03-19 00:36:26 +01:00
help_menu - > get_popup ( ) - > add_shortcut ( ED_SHORTCUT ( " script_editor/Contextual " , TTR ( " Contextual Help " ) , KEY_MASK_SHIFT | KEY_F1 ) , HELP_CONTEXTUAL ) ;
help_menu - > get_popup ( ) - > connect ( " item_pressed " , this , " _menu_option " ) ;
2014-05-05 15:59:18 +02:00
2015-11-17 13:46:08 +01:00
menu_hb - > add_spacer ( ) ;
2017-03-19 00:36:26 +01:00
script_icon = memnew ( TextureFrame ) ;
2015-11-17 13:46:08 +01:00
menu_hb - > add_child ( script_icon ) ;
2017-03-19 00:36:26 +01:00
script_name_label = memnew ( Label ) ;
2015-11-17 13:46:08 +01:00
menu_hb - > add_child ( script_name_label ) ;
script_icon - > hide ( ) ;
script_name_label - > hide ( ) ;
menu_hb - > add_spacer ( ) ;
2017-03-19 00:36:26 +01:00
site_search = memnew ( ToolButton ) ;
2016-05-04 03:25:37 +02:00
site_search - > set_text ( TTR ( " Tutorials " ) ) ;
2017-03-19 00:36:26 +01:00
site_search - > connect ( " pressed " , this , " _menu_option " , varray ( SEARCH_WEBSITE ) ) ;
2015-11-17 13:46:08 +01:00
menu_hb - > add_child ( site_search ) ;
2016-05-19 00:08:12 +02:00
site_search - > set_tooltip ( TTR ( " Open https://godotengine.org at tutorials section. " ) ) ;
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
class_search = memnew ( ToolButton ) ;
2016-05-04 03:25:37 +02:00
class_search - > set_text ( TTR ( " Classes " ) ) ;
2017-03-19 00:36:26 +01:00
class_search - > connect ( " pressed " , this , " _menu_option " , varray ( SEARCH_CLASSES ) ) ;
2015-11-17 13:46:08 +01:00
menu_hb - > add_child ( class_search ) ;
2016-05-04 03:25:37 +02:00
class_search - > set_tooltip ( TTR ( " Search the class hierarchy. " ) ) ;
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
help_search = memnew ( ToolButton ) ;
2016-05-04 03:25:37 +02:00
help_search - > set_text ( TTR ( " Search Help " ) ) ;
2017-03-19 00:36:26 +01:00
help_search - > connect ( " pressed " , this , " _menu_option " , varray ( SEARCH_HELP ) ) ;
2015-11-17 13:46:08 +01:00
menu_hb - > add_child ( help_search ) ;
2016-05-04 03:25:37 +02:00
help_search - > set_tooltip ( TTR ( " Search the reference documentation. " ) ) ;
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
menu_hb - > add_child ( memnew ( VSeparator ) ) ;
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
script_back = memnew ( ToolButton ) ;
script_back - > connect ( " pressed " , this , " _history_back " ) ;
2015-11-17 13:46:08 +01:00
menu_hb - > add_child ( script_back ) ;
script_back - > set_disabled ( true ) ;
2016-05-04 03:25:37 +02:00
script_back - > set_tooltip ( TTR ( " Go to previous edited document. " ) ) ;
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
script_forward = memnew ( ToolButton ) ;
script_forward - > connect ( " pressed " , this , " _history_forward " ) ;
2015-11-17 13:46:08 +01:00
menu_hb - > add_child ( script_forward ) ;
script_forward - > set_disabled ( true ) ;
2016-05-04 03:25:37 +02:00
script_forward - > set_tooltip ( TTR ( " Go to next edited document. " ) ) ;
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
tab_container - > connect ( " tab_changed " , this , " _tab_changed " ) ;
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
erase_tab_confirm = memnew ( ConfirmationDialog ) ;
2014-02-10 02:10:30 +01:00
add_child ( erase_tab_confirm ) ;
2017-03-19 00:36:26 +01:00
erase_tab_confirm - > connect ( " confirmed " , this , " _close_current_tab " ) ;
2014-02-10 02:10:30 +01:00
2015-08-10 01:39:59 +02:00
script_create_dialog = memnew ( ScriptCreateDialog ) ;
2016-05-04 03:25:37 +02:00
script_create_dialog - > set_title ( TTR ( " Create Script " ) ) ;
2015-08-10 01:39:59 +02:00
add_child ( script_create_dialog ) ;
script_create_dialog - > connect ( " script_created " , this , " _script_created " ) ;
2014-02-10 02:10:30 +01:00
2016-04-12 16:45:31 +02:00
file_dialog_option = - 1 ;
2017-03-19 00:36:26 +01:00
file_dialog = memnew ( EditorFileDialog ) ;
2016-04-12 16:45:31 +02:00
add_child ( file_dialog ) ;
2017-03-19 00:36:26 +01:00
file_dialog - > connect ( " file_selected " , this , " _file_dialog_action " ) ;
2016-04-12 16:45:31 +02:00
2014-02-10 02:10:30 +01:00
goto_line_dialog = memnew ( GotoLineDialog ) ;
add_child ( goto_line_dialog ) ;
2017-03-19 00:36:26 +01:00
debugger = memnew ( ScriptEditorDebugger ( editor ) ) ;
debugger - > connect ( " goto_script_line " , this , " _goto_script_line " ) ;
debugger - > connect ( " show_debugger " , this , " _show_debugger " ) ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
disk_changed = memnew ( ConfirmationDialog ) ;
2014-02-10 02:10:30 +01:00
{
2017-03-19 00:36:26 +01:00
VBoxContainer * vbc = memnew ( VBoxContainer ) ;
2014-02-10 02:10:30 +01:00
disk_changed - > add_child ( vbc ) ;
disk_changed - > set_child_rect ( vbc ) ;
2017-03-19 00:36:26 +01:00
Label * dl = memnew ( Label ) ;
2016-05-21 01:18:35 +02:00
dl - > set_text ( TTR ( " The following files are newer on disk. \n What action should be taken?: " ) ) ;
2014-02-10 02:10:30 +01:00
vbc - > add_child ( dl ) ;
2017-03-19 00:36:26 +01:00
disk_changed_list = memnew ( Tree ) ;
2014-02-10 02:10:30 +01:00
vbc - > add_child ( disk_changed_list ) ;
disk_changed_list - > set_v_size_flags ( SIZE_EXPAND_FILL ) ;
2017-03-19 00:36:26 +01:00
disk_changed - > connect ( " confirmed " , this , " _reload_scripts " ) ;
2016-05-04 03:25:37 +02:00
disk_changed - > get_ok ( ) - > set_text ( TTR ( " Reload " ) ) ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
disk_changed - > add_button ( TTR ( " Resave " ) , ! OS : : get_singleton ( ) - > get_swap_ok_cancel ( ) , " resave " ) ;
disk_changed - > connect ( " custom_action " , this , " _resave_scripts " ) ;
2014-02-10 02:10:30 +01:00
}
add_child ( disk_changed ) ;
2017-03-19 00:36:26 +01:00
script_editor = this ;
2014-02-10 02:10:30 +01:00
2017-03-19 00:36:26 +01:00
quick_open = memnew ( ScriptEditorQuickOpen ) ;
2014-02-10 02:10:30 +01:00
add_child ( quick_open ) ;
2017-03-19 00:36:26 +01:00
quick_open - > connect ( " goto_line " , this , " _goto_script_line2 " ) ;
2016-01-18 00:03:57 +01:00
2017-03-19 00:36:26 +01:00
Button * db = EditorNode : : get_singleton ( ) - > add_bottom_panel_item ( TTR ( " Debugger " ) , debugger ) ;
2016-01-18 00:03:57 +01:00
debugger - > set_tool_button ( db ) ;
2017-03-19 00:36:26 +01:00
debugger - > connect ( " breaked " , this , " _breaked " ) ;
2016-01-18 00:03:57 +01:00
2017-03-19 00:36:26 +01:00
autosave_timer = memnew ( Timer ) ;
2015-05-05 04:32:40 +02:00
autosave_timer - > set_one_shot ( false ) ;
add_child ( autosave_timer ) ;
2017-03-19 00:36:26 +01:00
grab_focus_block = false ;
2015-06-22 05:03:19 +02:00
2017-03-19 00:36:26 +01:00
help_search_dialog = memnew ( EditorHelpSearch ) ;
2015-11-17 13:46:08 +01:00
add_child ( help_search_dialog ) ;
2017-03-19 00:36:26 +01:00
help_search_dialog - > connect ( " go_to_help " , this , " _help_class_goto " ) ;
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
help_index = memnew ( EditorHelpIndex ) ;
2015-11-17 13:46:08 +01:00
add_child ( help_index ) ;
2017-03-19 00:36:26 +01:00
help_index - > connect ( " open_class " , this , " _help_class_open " ) ;
2015-11-17 13:46:08 +01:00
2017-03-19 00:36:26 +01:00
history_pos = - 1 ;
// debugger_gui->hide();
2014-05-06 11:43:14 +02:00
2017-03-19 00:36:26 +01:00
edit_pass = 0 ;
2016-04-23 20:21:34 +02:00
trim_trailing_whitespace_on_save = false ;
2014-02-10 02:10:30 +01:00
}
2015-06-26 06:14:31 +02:00
ScriptEditor : : ~ ScriptEditor ( ) {
memdelete ( completion_cache ) ;
}
2014-02-10 02:10:30 +01:00
void ScriptEditorPlugin : : edit ( Object * p_object ) {
if ( ! p_object - > cast_to < Script > ( ) )
return ;
script_editor - > edit ( p_object - > cast_to < Script > ( ) ) ;
}
bool ScriptEditorPlugin : : handles ( Object * p_object ) const {
2016-07-07 01:35:49 +02:00
if ( p_object - > cast_to < Script > ( ) ) {
bool valid = _can_open_in_editor ( p_object - > cast_to < Script > ( ) ) ;
if ( ! valid ) { //user tried to open it by clicking
EditorNode : : get_singleton ( ) - > show_warning ( TTR ( " Built-in scripts can only be edited when the scene they belong to is loaded " ) ) ;
}
return valid ;
}
2014-02-10 02:10:30 +01:00
return p_object - > is_type ( " Script " ) ;
}
void ScriptEditorPlugin : : make_visible ( bool p_visible ) {
if ( p_visible ) {
script_editor - > show ( ) ;
script_editor - > set_process ( true ) ;
script_editor - > ensure_select_current ( ) ;
} else {
script_editor - > hide ( ) ;
script_editor - > set_process ( false ) ;
}
}
void ScriptEditorPlugin : : selected_notify ( ) {
script_editor - > ensure_select_current ( ) ;
}
Dictionary ScriptEditorPlugin : : get_state ( ) const {
return script_editor - > get_state ( ) ;
}
2017-03-19 00:36:26 +01:00
void ScriptEditorPlugin : : set_state ( const Dictionary & p_state ) {
2014-02-10 02:10:30 +01:00
script_editor - > set_state ( p_state ) ;
}
void ScriptEditorPlugin : : clear ( ) {
script_editor - > clear ( ) ;
}
void ScriptEditorPlugin : : save_external_data ( ) {
2016-02-03 01:10:52 +01:00
script_editor - > save_all_scripts ( ) ;
2014-02-10 02:10:30 +01:00
}
void ScriptEditorPlugin : : apply_changes ( ) {
script_editor - > apply_scripts ( ) ;
}
void ScriptEditorPlugin : : restore_global_state ( ) {
}
void ScriptEditorPlugin : : save_global_state ( ) {
2015-06-22 05:03:19 +02:00
}
2014-02-10 02:10:30 +01:00
2015-06-22 05:03:19 +02:00
void ScriptEditorPlugin : : set_window_layout ( Ref < ConfigFile > p_layout ) {
script_editor - > set_window_layout ( p_layout ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-19 00:36:26 +01:00
void ScriptEditorPlugin : : get_window_layout ( Ref < ConfigFile > p_layout ) {
2015-06-22 05:03:19 +02:00
script_editor - > get_window_layout ( p_layout ) ;
}
2014-02-10 02:10:30 +01:00
void ScriptEditorPlugin : : get_breakpoints ( List < String > * p_breakpoints ) {
return script_editor - > get_breakpoints ( p_breakpoints ) ;
}
2015-12-09 13:08:41 +01:00
void ScriptEditorPlugin : : edited_scene_changed ( ) {
script_editor - > edited_scene_changed ( ) ;
}
2014-02-10 02:10:30 +01:00
ScriptEditorPlugin : : ScriptEditorPlugin ( EditorNode * p_node ) {
2017-03-19 00:36:26 +01:00
editor = p_node ;
script_editor = memnew ( ScriptEditor ( p_node ) ) ;
2014-02-10 02:10:30 +01:00
editor - > get_viewport ( ) - > add_child ( script_editor ) ;
2016-02-08 17:01:54 +01:00
script_editor - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2014-02-10 02:10:30 +01:00
script_editor - > hide ( ) ;
2017-03-19 00:36:26 +01:00
EDITOR_DEF ( " text_editor/auto_reload_scripts_on_external_change " , true ) ;
ScriptServer : : set_reload_scripts_on_save ( EDITOR_DEF ( " text_editor/auto_reload_and_parse_scripts_on_save " , true ) ) ;
EDITOR_DEF ( " text_editor/open_dominant_script_on_scene_change " , true ) ;
EDITOR_DEF ( " external_editor/use_external_editor " , false ) ;
EDITOR_DEF ( " external_editor/exec_path " , " " ) ;
EDITOR_DEF ( " text_editor/script_temperature_enabled " , true ) ;
2016-09-07 18:54:20 +02:00
EDITOR_DEF ( " text_editor/highlight_current_script " , true ) ;
2017-03-19 00:36:26 +01:00
EDITOR_DEF ( " text_editor/script_temperature_history_size " , 15 ) ;
EDITOR_DEF ( " text_editor/script_temperature_hot_color " , Color ( 1 , 0 , 0 , 0.3 ) ) ;
EDITOR_DEF ( " text_editor/script_temperature_cold_color " , Color ( 0 , 0 , 1 , 0.3 ) ) ;
EDITOR_DEF ( " text_editor/current_script_background_color " , Color ( 0.81 , 0.81 , 0.14 , 0.63 ) ) ;
EDITOR_DEF ( " text_editor/group_help_pages " , true ) ;
EditorSettings : : get_singleton ( ) - > add_property_hint ( PropertyInfo ( Variant : : INT , " text_editor/sort_scripts_by " , PROPERTY_HINT_ENUM , " Name,Path " ) ) ;
EDITOR_DEF ( " text_editor/sort_scripts_by " , 0 ) ;
EditorSettings : : get_singleton ( ) - > add_property_hint ( PropertyInfo ( Variant : : INT , " text_editor/list_script_names_as " , PROPERTY_HINT_ENUM , " Name,Parent Directory And Name,Full Path " ) ) ;
EDITOR_DEF ( " text_editor/list_script_names_as " , 0 ) ;
EditorSettings : : get_singleton ( ) - > add_property_hint ( PropertyInfo ( Variant : : STRING , " external_editor/exec_path " , PROPERTY_HINT_GLOBAL_FILE ) ) ;
EDITOR_DEF ( " external_editor/exec_flags " , " " ) ;
}
ScriptEditorPlugin : : ~ ScriptEditorPlugin ( ) {
2014-02-10 02:10:30 +01:00
}