2014-02-10 02:10:30 +01:00
/*************************************************************************/
/* editor_help.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
2017-08-27 14:16:55 +02:00
/* https://godotengine.org */
2014-02-10 02:10:30 +01:00
/*************************************************************************/
2018-01-01 14:40:08 +01:00
/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2018 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. */
/*************************************************************************/
2018-01-05 00:50:27 +01:00
2014-02-10 02:10:30 +01:00
# include "editor_help.h"
2017-01-16 08:04:19 +01:00
2017-06-23 17:03:41 +02:00
# include "doc_data_compressed.gen.h"
2017-03-05 16:44:50 +01:00
# include "editor/plugins/script_editor_plugin.h"
2014-02-10 02:10:30 +01:00
# include "editor_node.h"
# include "editor_settings.h"
# include "os/keyboard.h"
2014-02-21 03:01:44 +01:00
2017-09-13 00:16:18 +02:00
# define CONTRIBUTE_URL "http: //docs.godotengine.org/en/latest/community/contributing/updating_the_class_reference.html"
2018-01-15 22:40:41 +01:00
# define CONTRIBUTE2_URL "https: //github.com/godotengine/godot-docs"
# define REQUEST_URL "https: //github.com/godotengine/godot-docs/issues/new"
2017-09-13 00:16:18 +02:00
2015-11-24 22:33:26 +01:00
void EditorHelpSearch : : popup ( ) {
2017-07-18 21:35:37 +02:00
popup_centered ( Size2 ( 700 , 600 ) * EDSCALE ) ;
2017-03-05 16:44:50 +01:00
if ( search_box - > get_text ( ) ! = " " ) {
2015-11-24 22:33:26 +01:00
search_box - > select_all ( ) ;
_update_search ( ) ;
}
search_box - > grab_focus ( ) ;
}
2014-02-21 03:01:44 +01:00
2017-03-05 16:44:50 +01:00
void EditorHelpSearch : : popup ( const String & p_term ) {
2014-02-21 03:01:44 +01:00
2017-07-18 21:35:37 +02:00
popup_centered ( Size2 ( 700 , 600 ) * EDSCALE ) ;
2017-03-05 16:44:50 +01:00
if ( p_term ! = " " ) {
2014-02-21 03:01:44 +01:00
search_box - > set_text ( p_term ) ;
search_box - > select_all ( ) ;
2014-05-05 15:59:18 +02:00
_update_search ( ) ;
2014-05-06 11:41:19 +02:00
} else
2014-02-21 03:01:44 +01:00
search_box - > clear ( ) ;
2014-05-06 11:41:19 +02:00
search_box - > grab_focus ( ) ;
2014-02-21 03:01:44 +01:00
}
2017-03-05 16:44:50 +01:00
void EditorHelpSearch : : _text_changed ( const String & p_newtext ) {
2014-02-21 03:01:44 +01:00
_update_search ( ) ;
}
2017-05-20 17:38:03 +02:00
void EditorHelpSearch : : _sbox_input ( const Ref < InputEvent > & p_ie ) {
2014-02-21 03:01:44 +01:00
2017-05-20 17:38:03 +02:00
Ref < InputEventKey > k = p_ie ;
2014-02-21 03:01:44 +01:00
2017-05-20 17:38:03 +02:00
if ( k . is_valid ( ) & & ( k - > get_scancode ( ) = = KEY_UP | |
k - > get_scancode ( ) = = KEY_DOWN | |
k - > get_scancode ( ) = = KEY_PAGEUP | |
k - > get_scancode ( ) = = KEY_PAGEDOWN ) ) {
search_options - > call ( " _gui_input " , k ) ;
2014-02-21 03:01:44 +01:00
search_box - > accept_event ( ) ;
}
}
2018-02-14 17:10:17 +01:00
void EditorHelpSearch : : IncrementalSearch : : phase1 ( Map < String , DocData : : ClassDoc > : : Element * E ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
if ( E - > key ( ) . findn ( term ) ! = - 1 ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
TreeItem * item = search_options - > create_item ( root ) ;
item - > set_metadata ( 0 , " class_name: " + E - > key ( ) ) ;
item - > set_text ( 0 , E - > key ( ) + " (Class) " ) ;
if ( search - > has_icon ( E - > key ( ) , " EditorIcons " ) )
item - > set_icon ( 0 , search - > get_icon ( E - > key ( ) , " EditorIcons " ) ) ;
else
item - > set_icon ( 0 , def_icon ) ;
2014-02-21 03:01:44 +01:00
}
2018-02-14 17:10:17 +01:00
}
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
void EditorHelpSearch : : IncrementalSearch : : phase2 ( Map < String , DocData : : ClassDoc > : : Element * E ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
DocData : : ClassDoc & c = E - > get ( ) ;
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
Ref < Texture > cicon ;
if ( search - > has_icon ( E - > key ( ) , " EditorIcons " ) )
cicon = search - > get_icon ( E - > key ( ) , " EditorIcons " ) ;
else
cicon = def_icon ;
2016-05-29 16:37:26 +02:00
2018-02-14 17:10:17 +01:00
for ( int i = 0 ; i < c . methods . size ( ) ; i + + ) {
if ( ( term . begins_with ( " . " ) & & c . methods [ i ] . name . begins_with ( term . right ( 1 ) ) ) | | ( term . ends_with ( " ( " ) & & c . methods [ i ] . name . ends_with ( term . left ( term . length ( ) - 1 ) . strip_edges ( ) ) ) | | ( term . begins_with ( " . " ) & & term . ends_with ( " ( " ) & & c . methods [ i ] . name = = term . substr ( 1 , term . length ( ) - 2 ) . strip_edges ( ) ) | | c . methods [ i ] . name . findn ( term ) ! = - 1 ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
TreeItem * item = search_options - > create_item ( root ) ;
item - > set_metadata ( 0 , " class_method: " + E - > key ( ) + " : " + c . methods [ i ] . name ) ;
item - > set_text ( 0 , E - > key ( ) + " . " + c . methods [ i ] . name + " (Method) " ) ;
item - > set_icon ( 0 , cicon ) ;
2014-02-21 03:01:44 +01:00
}
2018-02-14 17:10:17 +01:00
}
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
for ( int i = 0 ; i < c . signals . size ( ) ; i + + ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
if ( c . signals [ i ] . name . findn ( term ) ! = - 1 ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
TreeItem * item = search_options - > create_item ( root ) ;
item - > set_metadata ( 0 , " class_signal: " + E - > key ( ) + " : " + c . signals [ i ] . name ) ;
item - > set_text ( 0 , E - > key ( ) + " . " + c . signals [ i ] . name + " (Signal) " ) ;
item - > set_icon ( 0 , cicon ) ;
2014-02-21 03:01:44 +01:00
}
2018-02-14 17:10:17 +01:00
}
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
for ( int i = 0 ; i < c . constants . size ( ) ; i + + ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
if ( c . constants [ i ] . name . findn ( term ) ! = - 1 ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
TreeItem * item = search_options - > create_item ( root ) ;
item - > set_metadata ( 0 , " class_constant: " + E - > key ( ) + " : " + c . constants [ i ] . name ) ;
item - > set_text ( 0 , E - > key ( ) + " . " + c . constants [ i ] . name + " (Constant) " ) ;
item - > set_icon ( 0 , cicon ) ;
2014-02-21 03:01:44 +01:00
}
2018-02-14 17:10:17 +01:00
}
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
for ( int i = 0 ; i < c . properties . size ( ) ; i + + ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
if ( c . properties [ i ] . name . findn ( term ) ! = - 1 ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
TreeItem * item = search_options - > create_item ( root ) ;
item - > set_metadata ( 0 , " class_property: " + E - > key ( ) + " : " + c . properties [ i ] . name ) ;
item - > set_text ( 0 , E - > key ( ) + " . " + c . properties [ i ] . name + " (Property) " ) ;
item - > set_icon ( 0 , cicon ) ;
2014-02-21 03:01:44 +01:00
}
2018-02-14 17:10:17 +01:00
}
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
for ( int i = 0 ; i < c . theme_properties . size ( ) ; i + + ) {
2014-06-30 03:41:02 +02:00
2018-02-14 17:10:17 +01:00
if ( c . theme_properties [ i ] . name . findn ( term ) ! = - 1 ) {
2014-06-30 03:41:02 +02:00
2018-02-14 17:10:17 +01:00
TreeItem * item = search_options - > create_item ( root ) ;
item - > set_metadata ( 0 , " class_theme_item: " + E - > key ( ) + " : " + c . theme_properties [ i ] . name ) ;
item - > set_text ( 0 , E - > key ( ) + " . " + c . theme_properties [ i ] . name + " (Theme Item) " ) ;
item - > set_icon ( 0 , cicon ) ;
2014-06-30 03:41:02 +02:00
}
2014-02-21 03:01:44 +01:00
}
2018-02-14 17:10:17 +01:00
}
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
bool EditorHelpSearch : : IncrementalSearch : : slice ( ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
if ( phase > 2 )
return true ;
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
if ( iterator ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
switch ( phase ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
case 1 : {
phase1 ( iterator ) ;
} break ;
case 2 : {
phase2 ( iterator ) ;
} break ;
default : {
WARN_PRINT ( " illegal phase in IncrementalSearch " ) ;
return true ;
2017-12-05 19:43:20 +01:00
}
}
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
iterator = iterator - > next ( ) ;
} else {
phase + = 1 ;
iterator = doc - > class_list . front ( ) ;
2017-12-05 19:43:20 +01:00
}
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
return false ;
}
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
EditorHelpSearch : : IncrementalSearch : : IncrementalSearch ( EditorHelpSearch * p_search , Tree * p_search_options , const String & p_term ) :
search ( p_search ) ,
search_options ( p_search_options ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
def_icon = search - > get_icon ( " Node " , " EditorIcons " ) ;
doc = EditorHelp : : get_doc_data ( ) ;
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
term = p_term ;
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
root = search_options - > create_item ( ) ;
phase = 0 ;
iterator = 0 ;
}
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
bool EditorHelpSearch : : IncrementalSearch : : empty ( ) const {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
return root - > get_children ( ) = = NULL ;
}
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
bool EditorHelpSearch : : IncrementalSearch : : work ( uint64_t slot ) {
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
const uint64_t until = OS : : get_singleton ( ) - > get_ticks_usec ( ) + slot ;
2014-02-21 03:01:44 +01:00
2018-02-14 17:10:17 +01:00
while ( ! slice ( ) ) {
2017-12-05 19:43:20 +01:00
2018-02-14 17:10:17 +01:00
if ( OS : : get_singleton ( ) - > get_ticks_usec ( ) > until )
return false ;
2014-02-21 03:01:44 +01:00
}
2018-02-14 17:10:17 +01:00
return true ;
}
2014-02-21 03:01:44 +01:00
2017-12-05 19:43:20 +01:00
void EditorHelpSearch : : _update_search ( ) {
search_options - > clear ( ) ;
search_options - > set_hide_root ( true ) ;
String term = search_box - > get_text ( ) ;
if ( term . length ( ) < 2 )
return ;
search = Ref < IncrementalSearch > ( memnew ( IncrementalSearch ( this , search_options , term ) ) ) ;
set_process ( true ) ;
2014-02-21 03:01:44 +01:00
}
void EditorHelpSearch : : _confirmed ( ) {
TreeItem * ti = search_options - > get_selected ( ) ;
if ( ! ti )
return ;
2017-03-05 16:44:50 +01:00
String mdata = ti - > get_metadata ( 0 ) ;
2017-06-06 17:23:48 +02:00
EditorNode : : get_singleton ( ) - > set_visible_editor ( EditorNode : : EDITOR_SCRIPT ) ;
2017-03-05 16:44:50 +01:00
emit_signal ( " go_to_help " , mdata ) ;
2014-02-21 03:01:44 +01:00
// go to that
hide ( ) ;
}
void EditorHelpSearch : : _notification ( int p_what ) {
2017-03-05 16:44:50 +01:00
if ( p_what = = NOTIFICATION_ENTER_TREE ) {
2014-02-21 03:01:44 +01:00
2017-08-30 01:03:13 +02:00
//_update_icons
2018-08-11 12:04:19 +02:00
search_box - > set_right_icon ( get_icon ( " Search " , " EditorIcons " ) ) ;
2018-07-26 13:45:38 +02:00
search_box - > set_clear_button_enabled ( true ) ;
2017-07-18 21:35:37 +02:00
2017-03-05 16:44:50 +01:00
connect ( " confirmed " , this , " _confirmed " ) ;
2014-02-21 03:01:44 +01:00
_update_search ( ) ;
2017-08-30 01:03:13 +02:00
} else if ( p_what = = NOTIFICATION_VISIBILITY_CHANGED ) {
2014-02-21 03:01:44 +01:00
2017-01-13 14:45:50 +01:00
if ( is_visible_in_tree ( ) ) {
2014-02-21 03:01:44 +01:00
search_box - > call_deferred ( " grab_focus " ) ; // still not visible
search_box - > select_all ( ) ;
}
2017-08-30 01:03:13 +02:00
} else if ( p_what = = EditorSettings : : NOTIFICATION_EDITOR_SETTINGS_CHANGED ) {
//_update_icons
2018-08-11 12:04:19 +02:00
search_box - > set_right_icon ( get_icon ( " Search " , " EditorIcons " ) ) ;
2018-07-26 13:45:38 +02:00
search_box - > set_clear_button_enabled ( true ) ;
2017-12-05 19:43:20 +01:00
} else if ( p_what = = NOTIFICATION_PROCESS ) {
if ( search . is_valid ( ) ) {
if ( search - > work ( ) ) {
get_ok ( ) - > set_disabled ( search - > empty ( ) ) ;
search = Ref < IncrementalSearch > ( ) ;
set_process ( false ) ;
}
} else {
set_process ( false ) ;
}
2014-02-21 03:01:44 +01:00
}
}
void EditorHelpSearch : : _bind_methods ( ) {
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " _text_changed " ) , & EditorHelpSearch : : _text_changed ) ;
ClassDB : : bind_method ( D_METHOD ( " _confirmed " ) , & EditorHelpSearch : : _confirmed ) ;
ClassDB : : bind_method ( D_METHOD ( " _sbox_input " ) , & EditorHelpSearch : : _sbox_input ) ;
ClassDB : : bind_method ( D_METHOD ( " _update_search " ) , & EditorHelpSearch : : _update_search ) ;
2014-02-21 03:01:44 +01:00
ADD_SIGNAL ( MethodInfo ( " go_to_help " ) ) ;
}
2015-11-17 13:46:08 +01:00
EditorHelpSearch : : EditorHelpSearch ( ) {
2014-02-21 03:01:44 +01:00
2017-03-05 16:44:50 +01:00
VBoxContainer * vbc = memnew ( VBoxContainer ) ;
2014-02-21 03:01:44 +01:00
add_child ( vbc ) ;
2017-01-10 05:49:55 +01:00
2017-03-05 16:44:50 +01:00
search_box = memnew ( LineEdit ) ;
2017-07-18 21:35:37 +02:00
vbc - > add_child ( search_box ) ;
2017-03-05 16:44:50 +01:00
search_box - > connect ( " text_changed " , this , " _text_changed " ) ;
search_box - > connect ( " gui_input " , 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-21 03:01:44 +01:00
get_ok ( ) - > set_disabled ( true ) ;
register_text_enter ( search_box ) ;
set_hide_on_ok ( false ) ;
2017-03-05 16:44:50 +01:00
search_options - > connect ( " item_activated " , this , " _confirmed " ) ;
2016-07-09 16:12:15 +02:00
set_title ( TTR ( " Search Help " ) ) ;
2014-02-21 03:01:44 +01:00
}
2015-11-17 13:46:08 +01:00
/////////////////////////////////
2017-03-05 16:44:50 +01:00
void EditorHelpIndex : : add_type ( const String & p_type , HashMap < String , TreeItem * > & p_types , TreeItem * p_root ) {
2015-11-17 13:46:08 +01:00
if ( p_types . has ( p_type ) )
return ;
2017-03-05 16:44:50 +01:00
String inherits = EditorHelp : : get_doc_data ( ) - > class_list [ p_type ] . inherits ;
2015-11-17 13:46:08 +01:00
2017-03-05 16:44:50 +01:00
TreeItem * parent = p_root ;
2015-11-17 13:46:08 +01:00
if ( inherits . length ( ) ) {
if ( ! p_types . has ( inherits ) ) {
2017-03-05 16:44:50 +01:00
add_type ( inherits , p_types , p_root ) ;
2015-11-17 13:46:08 +01:00
}
2017-03-05 16:44:50 +01:00
if ( p_types . has ( inherits ) )
parent = p_types [ inherits ] ;
2015-11-17 13:46:08 +01:00
}
TreeItem * item = class_list - > create_item ( parent ) ;
2017-03-05 16:44:50 +01:00
item - > set_metadata ( 0 , p_type ) ;
item - > set_tooltip ( 0 , EditorHelp : : get_doc_data ( ) - > class_list [ p_type ] . brief_description ) ;
item - > set_text ( 0 , p_type ) ;
2015-11-17 13:46:08 +01:00
2017-03-05 16:44:50 +01:00
if ( has_icon ( p_type , " EditorIcons " ) ) {
2014-02-21 03:01:44 +01:00
2017-03-05 16:44:50 +01:00
item - > set_icon ( 0 , get_icon ( p_type , " EditorIcons " ) ) ;
2015-11-17 13:46:08 +01:00
}
2017-03-05 16:44:50 +01:00
p_types [ p_type ] = item ;
2015-11-17 13:46:08 +01:00
}
void EditorHelpIndex : : _tree_item_selected ( ) {
2017-03-05 16:44:50 +01:00
TreeItem * s = class_list - > get_selected ( ) ;
2015-11-17 13:46:08 +01:00
if ( ! s )
return ;
2017-06-06 17:23:48 +02:00
EditorNode : : get_singleton ( ) - > set_visible_editor ( EditorNode : : EDITOR_SCRIPT ) ;
2017-03-05 16:44:50 +01:00
emit_signal ( " open_class " , s - > get_text ( 0 ) ) ;
2015-11-17 13:46:08 +01:00
hide ( ) ;
}
2017-03-05 16:44:50 +01:00
void EditorHelpIndex : : select_class ( const String & p_class ) {
2015-11-17 13:46:08 +01:00
if ( ! tree_item_map . has ( p_class ) )
return ;
tree_item_map [ p_class ] - > select ( 0 ) ;
class_list - > ensure_cursor_is_visible ( ) ;
}
2016-03-05 11:51:09 +01:00
void EditorHelpIndex : : popup ( ) {
2017-07-18 21:35:37 +02:00
popup_centered ( Size2 ( 500 , 600 ) * EDSCALE ) ;
2016-03-05 11:51:09 +01:00
search_box - > set_text ( " " ) ;
_update_class_list ( ) ;
}
2015-11-17 13:46:08 +01:00
void EditorHelpIndex : : _notification ( int p_what ) {
2017-03-05 16:44:50 +01:00
if ( p_what = = NOTIFICATION_ENTER_TREE ) {
2015-11-17 13:46:08 +01:00
2017-08-30 01:03:13 +02:00
//_update_icons
2018-08-11 12:04:19 +02:00
search_box - > set_right_icon ( get_icon ( " Search " , " EditorIcons " ) ) ;
2018-07-26 13:45:38 +02:00
search_box - > set_clear_button_enabled ( true ) ;
2016-03-05 11:51:09 +01:00
_update_class_list ( ) ;
2017-03-05 16:44:50 +01:00
connect ( " confirmed " , this , " _tree_item_selected " ) ;
2015-11-17 13:46:08 +01:00
2017-03-05 16:44:50 +01:00
} else if ( p_what = = NOTIFICATION_POST_POPUP ) {
2016-03-05 11:51:09 +01:00
search_box - > call_deferred ( " grab_focus " ) ;
2017-08-30 01:03:13 +02:00
} else if ( p_what = = EditorSettings : : NOTIFICATION_EDITOR_SETTINGS_CHANGED ) {
//_update_icons
2018-08-11 12:04:19 +02:00
search_box - > set_right_icon ( get_icon ( " Search " , " EditorIcons " ) ) ;
2018-07-26 13:45:38 +02:00
search_box - > set_clear_button_enabled ( true ) ;
2016-03-05 11:51:09 +01:00
}
}
2017-03-05 16:44:50 +01:00
void EditorHelpIndex : : _text_changed ( const String & p_text ) {
2016-03-05 11:51:09 +01:00
_update_class_list ( ) ;
}
void EditorHelpIndex : : _update_class_list ( ) {
class_list - > clear ( ) ;
tree_item_map . clear ( ) ;
TreeItem * root = class_list - > create_item ( ) ;
class_list - > set_hide_root ( true ) ;
2015-11-17 13:46:08 +01:00
2016-03-05 11:51:09 +01:00
String filter = search_box - > get_text ( ) . strip_edges ( ) ;
String to_select = " " ;
2015-11-17 13:46:08 +01:00
2017-03-05 16:44:50 +01:00
for ( Map < String , DocData : : ClassDoc > : : Element * E = EditorHelp : : get_doc_data ( ) - > class_list . front ( ) ; E ; E = E - > next ( ) ) {
2014-02-21 03:01:44 +01:00
2016-03-05 11:51:09 +01:00
if ( filter = = " " ) {
2017-03-05 16:44:50 +01:00
add_type ( E - > key ( ) , tree_item_map , root ) ;
2016-03-05 11:51:09 +01:00
} else {
bool found = false ;
String type = E - > key ( ) ;
2017-03-05 16:44:50 +01:00
while ( type ! = " " ) {
2016-06-12 18:43:31 +02:00
if ( filter . is_subsequence_ofi ( type ) ) {
2016-03-05 11:51:09 +01:00
2017-11-29 07:20:11 +01:00
if ( to_select . empty ( ) | | type . length ( ) < to_select . length ( ) ) {
2016-03-05 11:51:09 +01:00
to_select = type ;
}
2017-03-05 16:44:50 +01:00
found = true ;
2016-03-05 11:51:09 +01:00
}
type = EditorHelp : : get_doc_data ( ) - > class_list [ type ] . inherits ;
}
if ( found ) {
2017-03-05 16:44:50 +01:00
add_type ( E - > key ( ) , tree_item_map , root ) ;
2016-03-05 11:51:09 +01:00
}
2015-11-17 13:46:08 +01:00
}
2016-03-05 11:51:09 +01:00
}
if ( tree_item_map . has ( filter ) ) {
select_class ( filter ) ;
} else if ( to_select ! = " " ) {
select_class ( to_select ) ;
}
}
2017-05-20 17:38:03 +02:00
void EditorHelpIndex : : _sbox_input ( const Ref < InputEvent > & p_ie ) {
Ref < InputEventKey > k = p_ie ;
2016-03-05 11:51:09 +01:00
2017-05-20 17:38:03 +02:00
if ( k . is_valid ( ) & & ( k - > get_scancode ( ) = = KEY_UP | |
k - > get_scancode ( ) = = KEY_DOWN | |
k - > get_scancode ( ) = = KEY_PAGEUP | |
k - > get_scancode ( ) = = KEY_PAGEDOWN ) ) {
2016-03-05 11:51:09 +01:00
2017-05-20 17:38:03 +02:00
class_list - > call ( " _gui_input " , k ) ;
2016-03-05 11:51:09 +01:00
search_box - > accept_event ( ) ;
2015-11-17 13:46:08 +01:00
}
}
void EditorHelpIndex : : _bind_methods ( ) {
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( " _tree_item_selected " , & EditorHelpIndex : : _tree_item_selected ) ;
ClassDB : : bind_method ( " _text_changed " , & EditorHelpIndex : : _text_changed ) ;
ClassDB : : bind_method ( " _sbox_input " , & EditorHelpIndex : : _sbox_input ) ;
ClassDB : : bind_method ( " select_class " , & EditorHelpIndex : : select_class ) ;
ADD_SIGNAL ( MethodInfo ( " open_class " ) ) ;
2015-11-17 13:46:08 +01:00
}
EditorHelpIndex : : EditorHelpIndex ( ) {
2017-03-05 16:44:50 +01:00
VBoxContainer * vbc = memnew ( VBoxContainer ) ;
2015-11-17 13:46:08 +01:00
add_child ( vbc ) ;
2017-03-05 16:44:50 +01:00
search_box = memnew ( LineEdit ) ;
2017-07-18 21:35:37 +02:00
vbc - > add_child ( search_box ) ;
2016-03-05 11:51:09 +01:00
search_box - > set_h_size_flags ( SIZE_EXPAND_FILL ) ;
register_text_enter ( search_box ) ;
search_box - > connect ( " text_changed " , this , " _text_changed " ) ;
2017-01-08 20:28:12 +01:00
search_box - > connect ( " gui_input " , this , " _sbox_input " ) ;
2016-03-05 11:51:09 +01:00
2017-03-05 16:44:50 +01:00
class_list = memnew ( Tree ) ;
vbc - > add_margin_child ( TTR ( " Class List: " ) + " " , class_list , true ) ;
2015-11-17 13:46:08 +01:00
class_list - > set_v_size_flags ( SIZE_EXPAND_FILL ) ;
2017-03-05 16:44:50 +01:00
class_list - > connect ( " item_activated " , this , " _tree_item_selected " ) ;
2015-11-17 13:46:08 +01:00
2016-05-04 03:25:37 +02:00
get_ok ( ) - > set_text ( TTR ( " Open " ) ) ;
2016-07-09 16:12:15 +02:00
set_title ( TTR ( " Search Classes " ) ) ;
2015-11-17 13:46:08 +01:00
}
/////////////////////////////////
2017-03-05 16:44:50 +01:00
DocData * EditorHelp : : doc = NULL ;
2014-02-16 01:16:33 +01:00
2017-12-15 09:45:23 +01:00
void EditorHelp : : _init_colors ( ) {
title_color = get_color ( " accent_color " , " Editor " ) ;
text_color = get_color ( " default_color " , " RichTextLabel " ) ;
headline_color = get_color ( " headline_color " , " EditorHelp " ) ;
base_type_color = title_color . linear_interpolate ( text_color , 0.5 ) ;
comment_color = Color ( text_color . r , text_color . g , text_color . b , 0.6 ) ;
symbol_color = comment_color ;
value_color = Color ( text_color . r , text_color . g , text_color . b , 0.4 ) ;
qualifier_color = Color ( text_color . r , text_color . g , text_color . b , 0.8 ) ;
type_color = get_color ( " accent_color " , " Editor " ) . linear_interpolate ( text_color , 0.5 ) ;
}
2017-05-20 17:38:03 +02:00
void EditorHelp : : _unhandled_key_input ( const Ref < InputEvent > & p_ev ) {
2014-02-10 02:10:30 +01:00
2017-01-13 14:45:50 +01:00
if ( ! is_visible_in_tree ( ) )
2014-05-06 11:41:19 +02:00
return ;
2017-05-20 17:38:03 +02:00
Ref < InputEventKey > k = p_ev ;
if ( k . is_valid ( ) & & k - > get_control ( ) & & k - > get_scancode ( ) = = KEY_F ) {
2014-02-10 02:10:30 +01:00
search - > grab_focus ( ) ;
search - > select_all ( ) ;
}
}
2017-03-05 16:44:50 +01:00
void EditorHelp : : _search ( const String & ) {
2014-02-10 02:10:30 +01:00
2017-12-22 19:09:31 +01:00
find_bar - > search_next ( ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
void EditorHelp : : _class_list_select ( const String & p_select ) {
2014-02-10 02:10:30 +01:00
_goto_desc ( p_select ) ;
}
2017-03-05 16:44:50 +01:00
void EditorHelp : : _class_desc_select ( const String & p_select ) {
2015-11-17 13:46:08 +01:00
2017-08-24 00:10:32 +02:00
if ( p_select . begins_with ( " $ " ) ) { //enum
String select = p_select . substr ( 1 , p_select . length ( ) ) ;
String class_name ;
if ( select . find ( " . " ) ! = - 1 ) {
class_name = select . get_slice ( " . " , 0 ) ;
2018-08-02 10:40:36 +02:00
select = select . get_slice ( " . " , 1 ) ;
2017-08-24 00:10:32 +02:00
} else {
2017-11-15 18:45:34 +01:00
class_name = " @GlobalScope " ;
2017-08-24 00:10:32 +02:00
}
emit_signal ( " go_to_help " , " class_enum: " + class_name + " : " + select ) ;
return ;
} else if ( p_select . begins_with ( " # " ) ) {
2017-03-05 16:44:50 +01:00
emit_signal ( " go_to_help " , " class_name: " + p_select . substr ( 1 , p_select . length ( ) ) ) ;
2014-02-10 02:10:30 +01:00
return ;
} else if ( p_select . begins_with ( " @ " ) ) {
2017-11-21 00:30:46 +01:00
String tag = p_select . substr ( 1 , 6 ) ;
String link = p_select . substr ( 7 , p_select . length ( ) ) ;
String topic ;
Map < String , int > * table = NULL ;
if ( tag = = " method " ) {
topic = " class_method " ;
table = & this - > method_line ;
} else if ( tag = = " member " ) {
topic = " class_property " ;
table = & this - > property_line ;
} else if ( tag = = " enum " ) {
topic = " class_enum " ;
table = & this - > enum_line ;
} else if ( tag = = " signal " ) {
topic = " class_signal " ;
table = & this - > signal_line ;
} else {
return ;
}
2014-02-10 02:10:30 +01:00
2017-11-21 00:30:46 +01:00
if ( link . find ( " . " ) ! = - 1 ) {
2015-11-17 13:46:08 +01:00
2017-11-21 00:30:46 +01:00
emit_signal ( " go_to_help " , topic + " : " + link . get_slice ( " . " , 0 ) + " : " + link . get_slice ( " . " , 1 ) ) ;
2015-11-17 13:46:08 +01:00
} else {
2017-11-21 00:30:46 +01:00
if ( ! table - > has ( link ) )
2015-11-17 13:46:08 +01:00
return ;
2017-11-21 00:30:46 +01:00
class_desc - > scroll_to_line ( ( * table ) [ link ] ) ;
2015-11-17 13:46:08 +01:00
}
2017-09-13 00:16:18 +02:00
} else if ( p_select . begins_with ( " http " ) ) {
OS : : get_singleton ( ) - > shell_open ( p_select ) ;
2014-02-10 02:10:30 +01:00
}
}
2017-05-20 17:38:03 +02:00
void EditorHelp : : _class_desc_input ( const Ref < InputEvent > & p_input ) {
2016-06-03 20:11:34 +02:00
}
2017-08-24 00:10:32 +02:00
void EditorHelp : : _add_type ( const String & p_type , const String & p_enum ) {
2014-02-10 02:10:30 +01:00
String t = p_type ;
2017-03-05 16:44:50 +01:00
if ( t = = " " )
t = " void " ;
2017-08-24 00:10:32 +02:00
bool can_ref = ( t ! = " int " & & t ! = " real " & & t ! = " bool " & & t ! = " void " ) | | p_enum ! = String ( ) ;
2014-02-10 02:10:30 +01:00
2017-08-24 00:10:32 +02:00
if ( p_enum ! = String ( ) ) {
if ( p_enum . get_slice_count ( " . " ) > 1 ) {
t = p_enum . get_slice ( " . " , 1 ) ;
} else {
t = p_enum . get_slice ( " . " , 0 ) ;
}
}
2017-09-14 02:56:37 +02:00
const Color text_color = get_color ( " default_color " , " RichTextLabel " ) ;
const Color type_color = get_color ( " accent_color " , " Editor " ) . linear_interpolate ( text_color , 0.5 ) ;
class_desc - > push_color ( type_color ) ;
2017-08-24 00:10:32 +02:00
if ( can_ref ) {
if ( p_enum = = " " ) {
class_desc - > push_meta ( " # " + t ) ; //class
} else {
class_desc - > push_meta ( " $ " + p_enum ) ; //class
}
}
2014-02-10 02:10:30 +01:00
class_desc - > add_text ( t ) ;
if ( can_ref )
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
}
2017-12-15 09:45:23 +01:00
void EditorHelp : : _add_method ( const DocData : : MethodDoc & p_method , bool p_overview ) {
method_line [ p_method . name ] = class_desc - > get_line_count ( ) - 2 ; //gets overridden if description
const bool is_vararg = p_method . qualifiers . find ( " vararg " ) ! = - 1 ;
if ( p_overview ) {
class_desc - > push_cell ( ) ;
class_desc - > push_align ( RichTextLabel : : ALIGN_RIGHT ) ;
}
_add_type ( p_method . return_type , p_method . return_enum ) ;
if ( p_overview ) {
class_desc - > pop ( ) ; //align
class_desc - > pop ( ) ; //cell
class_desc - > push_cell ( ) ;
} else {
class_desc - > add_text ( " " ) ;
}
if ( p_overview & & p_method . description ! = " " ) {
class_desc - > push_meta ( " @method " + p_method . name ) ;
}
class_desc - > push_color ( headline_color ) ;
_add_text ( p_method . name ) ;
class_desc - > pop ( ) ;
if ( p_overview & & p_method . description ! = " " ) {
class_desc - > pop ( ) ; //meta
}
class_desc - > push_color ( symbol_color ) ;
class_desc - > add_text ( p_method . arguments . size ( ) | | is_vararg ? " ( " : " ( " ) ;
class_desc - > pop ( ) ;
for ( int j = 0 ; j < p_method . arguments . size ( ) ; j + + ) {
class_desc - > push_color ( text_color ) ;
if ( j > 0 )
class_desc - > add_text ( " , " ) ;
_add_type ( p_method . arguments [ j ] . type , p_method . arguments [ j ] . enumeration ) ;
class_desc - > add_text ( " " ) ;
_add_text ( p_method . arguments [ j ] . name ) ;
if ( p_method . arguments [ j ] . default_value ! = " " ) {
class_desc - > push_color ( symbol_color ) ;
class_desc - > add_text ( " = " ) ;
class_desc - > pop ( ) ;
_add_text ( p_method . arguments [ j ] . default_value ) ;
}
class_desc - > pop ( ) ;
}
if ( is_vararg ) {
class_desc - > push_color ( text_color ) ;
if ( p_method . arguments . size ( ) )
class_desc - > add_text ( " , " ) ;
class_desc - > push_color ( symbol_color ) ;
class_desc - > add_text ( " ... " ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
}
class_desc - > push_color ( symbol_color ) ;
class_desc - > add_text ( p_method . arguments . size ( ) | | is_vararg ? " ) " : " ) " ) ;
class_desc - > pop ( ) ;
if ( p_method . qualifiers ! = " " ) {
class_desc - > push_color ( qualifier_color ) ;
class_desc - > add_text ( " " ) ;
_add_text ( p_method . qualifiers ) ;
class_desc - > pop ( ) ;
}
if ( p_overview )
class_desc - > pop ( ) ; //cell
}
2017-03-05 16:44:50 +01:00
Error EditorHelp : : _goto_desc ( const String & p_class , int p_vscr ) {
2014-02-10 02:10:30 +01:00
2014-05-06 11:41:19 +02:00
if ( ! doc - > class_list . has ( p_class ) )
return ERR_DOES_NOT_EXIST ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
select_locked = true ;
2014-06-23 17:43:37 +02:00
2014-02-10 02:10:30 +01:00
class_desc - > show ( ) ;
2017-12-18 18:46:17 +01:00
2017-03-05 16:44:50 +01:00
description_line = 0 ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( p_class = = edited_class )
2014-05-06 11:41:19 +02:00
return OK ; //already there
2014-02-10 02:10:30 +01:00
2018-08-13 02:40:06 +02:00
edited_class = p_class ;
_update_doc ( ) ;
return OK ;
}
void EditorHelp : : _update_doc ( ) {
2017-03-05 16:44:50 +01:00
scroll_locked = true ;
2014-02-10 02:10:30 +01:00
class_desc - > clear ( ) ;
method_line . clear ( ) ;
2017-09-14 02:56:37 +02:00
section_line . clear ( ) ;
2014-02-10 02:10:30 +01:00
2017-12-15 09:45:23 +01:00
_init_colors ( ) ;
2014-02-10 02:10:30 +01:00
2018-08-13 02:40:06 +02:00
DocData : : ClassDoc cd = doc - > class_list [ edited_class ] ; //make a copy, so we can sort without worrying
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
Ref < Font > doc_font = get_font ( " doc " , " EditorFonts " ) ;
Ref < Font > doc_title_font = get_font ( " doc_title " , " EditorFonts " ) ;
Ref < Font > doc_code_font = get_font ( " doc_source " , " EditorFonts " ) ;
2017-09-14 02:56:37 +02:00
String link_color_text = title_color . to_html ( false ) ;
2014-02-10 02:10:30 +01:00
2017-09-14 02:56:37 +02:00
section_line . push_back ( Pair < String , int > ( TTR ( " Top " ) , 0 ) ) ;
2014-02-21 03:01:44 +01:00
class_desc - > push_font ( doc_title_font ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( title_color ) ;
2017-03-05 16:44:50 +01:00
class_desc - > add_text ( TTR ( " Class: " ) + " " ) ;
2017-09-28 23:21:44 +02:00
class_desc - > push_color ( headline_color ) ;
2018-08-13 02:40:06 +02:00
_add_text ( edited_class ) ;
2014-02-21 03:01:44 +01:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
2017-03-05 16:44:50 +01:00
if ( cd . inherits ! = " " ) {
2014-02-10 02:10:30 +01:00
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( title_color ) ;
2014-02-10 02:10:30 +01:00
class_desc - > push_font ( doc_title_font ) ;
2017-03-05 16:44:50 +01:00
class_desc - > add_text ( TTR ( " Inherits: " ) + " " ) ;
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
2016-03-05 16:28:25 +01:00
String inherits = cd . inherits ;
2014-02-10 02:10:30 +01:00
class_desc - > push_font ( doc_font ) ;
2016-03-05 16:28:25 +01:00
while ( inherits ! = " " ) {
_add_type ( inherits ) ;
inherits = doc - > class_list [ inherits ] . inherits ;
if ( inherits ! = " " ) {
2017-10-09 18:59:53 +02:00
class_desc - > add_text ( " < " ) ;
2016-03-05 16:28:25 +01:00
}
}
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
2016-03-05 16:28:25 +01:00
}
2017-01-03 03:03:46 +01:00
if ( ClassDB : : class_exists ( cd . name ) ) {
2016-03-05 16:28:25 +01:00
bool found = false ;
bool prev = false ;
2017-03-05 16:44:50 +01:00
for ( Map < String , DocData : : ClassDoc > : : Element * E = doc - > class_list . front ( ) ; E ; E = E - > next ( ) ) {
2014-02-10 02:10:30 +01:00
2016-03-05 16:28:25 +01:00
if ( E - > get ( ) . inherits = = cd . name ) {
if ( ! found ) {
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( title_color ) ;
2016-03-05 16:28:25 +01:00
class_desc - > push_font ( doc_title_font ) ;
2017-03-05 16:44:50 +01:00
class_desc - > add_text ( TTR ( " Inherited by: " ) + " " ) ;
2016-03-05 16:28:25 +01:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
found = true ;
class_desc - > push_font ( doc_font ) ;
}
if ( prev ) {
class_desc - > add_text ( " , " ) ;
prev = false ;
}
_add_type ( E - > get ( ) . name ) ;
prev = true ;
}
}
if ( found )
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
2014-02-10 02:10:30 +01:00
}
2017-09-14 02:56:37 +02:00
class_desc - > add_newline ( ) ;
2016-03-05 16:28:25 +01:00
class_desc - > add_newline ( ) ;
2017-03-05 16:44:50 +01:00
if ( cd . brief_description ! = " " ) {
2014-02-10 02:10:30 +01:00
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( title_color ) ;
2014-02-10 02:10:30 +01:00
class_desc - > push_font ( doc_title_font ) ;
2016-05-04 03:25:37 +02:00
class_desc - > add_text ( TTR ( " Brief Description: " ) ) ;
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( text_color ) ;
2017-03-05 16:44:50 +01:00
class_desc - > push_font ( doc_font ) ;
2015-10-20 17:41:27 +02:00
class_desc - > push_indent ( 1 ) ;
2014-02-10 02:10:30 +01:00
_add_text ( cd . brief_description ) ;
2015-10-20 17:41:27 +02:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
2014-02-10 02:10:30 +01:00
class_desc - > add_newline ( ) ;
2015-09-30 04:38:23 +02:00
class_desc - > add_newline ( ) ;
2017-09-14 02:56:37 +02:00
class_desc - > add_newline ( ) ;
2014-02-10 02:10:30 +01:00
}
2017-01-04 05:16:14 +01:00
Set < String > skip_methods ;
2017-03-05 16:44:50 +01:00
bool property_descr = false ;
2017-01-04 05:16:14 +01:00
if ( cd . properties . size ( ) ) {
2017-09-14 02:56:37 +02:00
section_line . push_back ( Pair < String , int > ( TTR ( " Members " ) , class_desc - > get_line_count ( ) - 2 ) ) ;
class_desc - > push_color ( title_color ) ;
2017-01-04 05:16:14 +01:00
class_desc - > push_font ( doc_title_font ) ;
class_desc - > add_text ( TTR ( " Members: " ) ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > push_indent ( 1 ) ;
class_desc - > push_table ( 2 ) ;
2017-03-05 16:44:50 +01:00
class_desc - > set_table_column_expand ( 1 , 1 ) ;
2017-01-04 05:16:14 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < cd . properties . size ( ) ; i + + ) {
2017-03-24 21:45:31 +01:00
property_line [ cd . properties [ i ] . name ] = class_desc - > get_line_count ( ) - 2 ; //gets overridden if description
2017-01-04 05:16:14 +01:00
class_desc - > push_cell ( ) ;
class_desc - > push_align ( RichTextLabel : : ALIGN_RIGHT ) ;
class_desc - > push_font ( doc_code_font ) ;
2017-08-24 00:10:32 +02:00
_add_type ( cd . properties [ i ] . type , cd . properties [ i ] . enumeration ) ;
2017-01-04 05:16:14 +01:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
2017-03-05 16:44:50 +01:00
bool describe = false ;
2017-01-04 05:16:14 +01:00
2017-03-05 16:44:50 +01:00
if ( cd . properties [ i ] . setter ! = " " ) {
2017-01-04 05:16:14 +01:00
skip_methods . insert ( cd . properties [ i ] . setter ) ;
2017-03-05 16:44:50 +01:00
describe = true ;
2017-01-04 05:16:14 +01:00
}
2017-03-05 16:44:50 +01:00
if ( cd . properties [ i ] . getter ! = " " ) {
2017-01-04 05:16:14 +01:00
skip_methods . insert ( cd . properties [ i ] . getter ) ;
2017-03-05 16:44:50 +01:00
describe = true ;
2017-01-04 05:16:14 +01:00
}
2017-03-05 16:44:50 +01:00
if ( cd . properties [ i ] . description ! = " " ) {
describe = true ;
2017-01-04 05:16:14 +01:00
}
class_desc - > push_cell ( ) ;
if ( describe ) {
2017-11-21 00:30:46 +01:00
class_desc - > push_meta ( " @member " + cd . properties [ i ] . name ) ;
2017-01-04 05:16:14 +01:00
}
class_desc - > push_font ( doc_code_font ) ;
2017-09-28 23:21:44 +02:00
class_desc - > push_color ( headline_color ) ;
2017-01-04 05:16:14 +01:00
_add_text ( cd . properties [ i ] . name ) ;
if ( describe ) {
class_desc - > pop ( ) ;
2017-03-05 16:44:50 +01:00
property_descr = true ;
2017-01-04 05:16:14 +01:00
}
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
}
class_desc - > pop ( ) ; //table
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
class_desc - > add_newline ( ) ;
}
2017-12-19 01:47:17 +01:00
bool method_descr = false ;
2017-01-05 23:41:36 +01:00
bool sort_methods = EditorSettings : : get_singleton ( ) - > get ( " text_editor/help/sort_functions_alphabetically " ) ;
2016-05-29 16:37:26 +02:00
2017-01-04 05:16:14 +01:00
Vector < DocData : : MethodDoc > methods ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < cd . methods . size ( ) ; i + + ) {
2017-01-04 05:16:14 +01:00
if ( skip_methods . has ( cd . methods [ i ] . name ) )
continue ;
methods . push_back ( cd . methods [ i ] ) ;
}
if ( methods . size ( ) ) {
2014-02-10 02:10:30 +01:00
2016-05-29 16:37:26 +02:00
if ( sort_methods )
2017-01-04 05:16:14 +01:00
methods . sort ( ) ;
2016-05-29 16:37:26 +02:00
2017-09-14 02:56:37 +02:00
section_line . push_back ( Pair < String , int > ( TTR ( " Public Methods " ) , class_desc - > get_line_count ( ) - 2 ) ) ;
class_desc - > push_color ( title_color ) ;
2014-02-10 02:10:30 +01:00
class_desc - > push_font ( doc_title_font ) ;
2016-05-04 03:25:37 +02:00
class_desc - > add_text ( TTR ( " Public Methods: " ) ) ;
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
2017-12-27 17:34:20 +01:00
class_desc - > push_font ( doc_code_font ) ;
2014-02-10 02:10:30 +01:00
class_desc - > push_indent ( 1 ) ;
2015-12-26 14:25:17 +01:00
class_desc - > push_table ( 2 ) ;
2017-03-05 16:44:50 +01:00
class_desc - > set_table_column_expand ( 1 , 1 ) ;
2014-02-10 02:10:30 +01:00
2017-12-15 09:45:23 +01:00
bool any_previous = false ;
for ( int pass = 0 ; pass < 2 ; pass + + ) {
Vector < DocData : : MethodDoc > m ;
2017-09-14 02:56:37 +02:00
2017-12-15 09:45:23 +01:00
for ( int i = 0 ; i < methods . size ( ) ; i + + ) {
const String & q = methods [ i ] . qualifiers ;
if ( ( pass = = 0 & & q . find ( " virtual " ) ! = - 1 ) | | ( pass = = 1 & & q . find ( " virtual " ) = = - 1 ) ) {
m . push_back ( methods [ i ] ) ;
}
}
2015-12-26 14:25:17 +01:00
2017-12-15 09:45:23 +01:00
if ( any_previous & & ! m . empty ( ) ) {
class_desc - > push_cell ( ) ;
class_desc - > pop ( ) ; //cell
class_desc - > push_cell ( ) ;
class_desc - > pop ( ) ; //cell
any_previous = false ;
2014-02-10 02:10:30 +01:00
}
2017-12-15 09:45:23 +01:00
String group_prefix ;
for ( int i = 0 ; i < m . size ( ) ; i + + ) {
const String new_prefix = m [ i ] . name . substr ( 0 , 3 ) ;
bool is_new_group = false ;
if ( i < m . size ( ) - 1 & & new_prefix = = m [ i + 1 ] . name . substr ( 0 , 3 ) & & new_prefix ! = group_prefix ) {
is_new_group = i > 0 ;
group_prefix = new_prefix ;
} else if ( group_prefix ! = " " & & new_prefix ! = group_prefix ) {
is_new_group = true ;
group_prefix = " " ;
2014-02-10 02:10:30 +01:00
}
2017-12-15 09:45:23 +01:00
if ( is_new_group & & pass = = 1 ) {
class_desc - > push_cell ( ) ;
class_desc - > pop ( ) ; //cell
class_desc - > push_cell ( ) ;
class_desc - > pop ( ) ; //cell
}
2014-02-10 02:10:30 +01:00
2017-12-19 01:47:17 +01:00
if ( m [ i ] . description ! = " " ) {
method_descr = true ;
}
2017-12-15 09:45:23 +01:00
_add_method ( m [ i ] , true ) ;
2016-09-08 00:39:02 +02:00
}
2017-12-15 09:45:23 +01:00
any_previous = ! m . empty ( ) ;
2014-02-10 02:10:30 +01:00
}
2017-12-15 09:45:23 +01:00
2015-12-26 14:25:17 +01:00
class_desc - > pop ( ) ; //table
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
2017-12-27 17:34:20 +01:00
class_desc - > pop ( ) ; // font
2014-02-10 02:10:30 +01:00
class_desc - > add_newline ( ) ;
2015-12-26 14:25:17 +01:00
class_desc - > add_newline ( ) ;
2014-02-10 02:10:30 +01:00
}
2014-06-30 03:41:02 +02:00
if ( cd . theme_properties . size ( ) ) {
2017-09-14 02:56:37 +02:00
section_line . push_back ( Pair < String , int > ( TTR ( " GUI Theme Items " ) , class_desc - > get_line_count ( ) - 2 ) ) ;
class_desc - > push_color ( title_color ) ;
2014-06-30 03:41:02 +02:00
class_desc - > push_font ( doc_title_font ) ;
2016-05-04 03:25:37 +02:00
class_desc - > add_text ( TTR ( " GUI Theme Items: " ) ) ;
2014-06-30 03:41:02 +02:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
2017-09-14 02:56:37 +02:00
// class_desc->add_newline();
2014-06-30 03:41:02 +02:00
class_desc - > push_indent ( 1 ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_table ( 2 ) ;
class_desc - > set_table_column_expand ( 1 , 1 ) ;
2014-06-30 03:41:02 +02:00
//class_desc->add_newline();
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < cd . theme_properties . size ( ) ; i + + ) {
2014-06-30 03:41:02 +02:00
2017-03-24 21:45:31 +01:00
theme_property_line [ cd . theme_properties [ i ] . name ] = class_desc - > get_line_count ( ) - 2 ; //gets overridden if description
2017-09-14 02:56:37 +02:00
class_desc - > push_cell ( ) ;
class_desc - > push_align ( RichTextLabel : : ALIGN_RIGHT ) ;
2014-06-30 03:41:02 +02:00
class_desc - > push_font ( doc_code_font ) ;
_add_type ( cd . theme_properties [ i ] . type ) ;
2017-09-14 02:56:37 +02:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > push_cell ( ) ;
class_desc - > push_font ( doc_code_font ) ;
2017-09-28 23:21:44 +02:00
class_desc - > push_color ( headline_color ) ;
2015-10-20 17:41:27 +02:00
_add_text ( cd . theme_properties [ i ] . name ) ;
2014-06-30 03:41:02 +02:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
2014-02-10 02:10:30 +01:00
2017-09-14 02:56:37 +02:00
if ( cd . theme_properties [ i ] . description ! = " " ) {
2014-06-30 03:41:02 +02:00
class_desc - > push_font ( doc_font ) ;
class_desc - > add_text ( " " ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( comment_color ) ;
2015-10-20 17:41:27 +02:00
_add_text ( cd . theme_properties [ i ] . description ) ;
2014-06-30 03:41:02 +02:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
}
2017-09-14 02:56:37 +02:00
class_desc - > pop ( ) ; // cell
2014-06-30 03:41:02 +02:00
}
2017-09-14 02:56:37 +02:00
class_desc - > pop ( ) ; // table
2014-06-30 03:41:02 +02:00
class_desc - > pop ( ) ;
2016-08-01 10:30:09 +02:00
class_desc - > add_newline ( ) ;
2017-09-14 02:56:37 +02:00
class_desc - > add_newline ( ) ;
2014-06-30 03:41:02 +02:00
}
2016-08-01 10:30:09 +02:00
2014-02-10 02:10:30 +01:00
if ( cd . signals . size ( ) ) {
2016-05-29 16:37:26 +02:00
if ( sort_methods ) {
cd . signals . sort ( ) ;
}
2017-09-14 02:56:37 +02:00
section_line . push_back ( Pair < String , int > ( TTR ( " Signals " ) , class_desc - > get_line_count ( ) - 2 ) ) ;
class_desc - > push_color ( title_color ) ;
2014-02-10 02:10:30 +01:00
class_desc - > push_font ( doc_title_font ) ;
2016-05-04 03:25:37 +02:00
class_desc - > add_text ( TTR ( " Signals: " ) ) ;
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
2017-12-27 17:34:20 +01:00
class_desc - > add_newline ( ) ;
2014-02-10 02:10:30 +01:00
class_desc - > add_newline ( ) ;
class_desc - > push_indent ( 1 ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < cd . signals . size ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
2017-03-24 21:45:31 +01:00
signal_line [ cd . signals [ i ] . name ] = class_desc - > get_line_count ( ) - 2 ; //gets overridden if description
2017-03-05 16:44:50 +01:00
class_desc - > push_font ( doc_code_font ) ; // monofont
2017-09-28 23:21:44 +02:00
class_desc - > push_color ( headline_color ) ;
2015-10-20 17:41:27 +02:00
_add_text ( cd . signals [ i ] . name ) ;
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( symbol_color ) ;
2017-03-05 16:44:50 +01:00
class_desc - > add_text ( cd . signals [ i ] . arguments . size ( ) ? " ( " : " ( " ) ;
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < cd . signals [ i ] . arguments . size ( ) ; j + + ) {
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( text_color ) ;
2017-03-05 16:44:50 +01:00
if ( j > 0 )
2014-02-10 02:10:30 +01:00
class_desc - > add_text ( " , " ) ;
_add_type ( cd . signals [ i ] . arguments [ j ] . type ) ;
2015-10-20 17:41:27 +02:00
class_desc - > add_text ( " " ) ;
_add_text ( cd . signals [ i ] . arguments [ j ] . name ) ;
2017-03-05 16:44:50 +01:00
if ( cd . signals [ i ] . arguments [ j ] . default_value ! = " " ) {
2014-02-10 02:10:30 +01:00
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( symbol_color ) ;
2014-02-10 02:10:30 +01:00
class_desc - > add_text ( " = " ) ;
class_desc - > pop ( ) ;
2015-10-20 17:41:27 +02:00
_add_text ( cd . signals [ i ] . arguments [ j ] . default_value ) ;
2014-02-10 02:10:30 +01:00
}
class_desc - > pop ( ) ;
}
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( symbol_color ) ;
2017-03-05 16:44:50 +01:00
class_desc - > add_text ( cd . signals [ i ] . arguments . size ( ) ? " ) " : " ) " ) ;
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
2015-10-20 17:41:27 +02:00
class_desc - > pop ( ) ; // end monofont
2017-03-05 16:44:50 +01:00
if ( cd . signals [ i ] . description ! = " " ) {
2014-02-10 02:10:30 +01:00
2017-11-04 14:09:45 +01:00
class_desc - > push_font ( doc_font ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( comment_color ) ;
2017-11-04 14:09:45 +01:00
class_desc - > push_indent ( 1 ) ;
2015-10-20 17:41:27 +02:00
_add_text ( cd . signals [ i ] . description ) ;
2017-11-04 14:09:45 +01:00
class_desc - > pop ( ) ; // indent
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
2017-11-04 14:09:45 +01:00
class_desc - > pop ( ) ; // font
2014-02-10 02:10:30 +01:00
}
class_desc - > add_newline ( ) ;
2017-11-04 14:09:45 +01:00
class_desc - > add_newline ( ) ;
2014-02-10 02:10:30 +01:00
}
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
}
if ( cd . constants . size ( ) ) {
2017-08-24 00:10:32 +02:00
Map < String , Vector < DocData : : ConstantDoc > > enums ;
Vector < DocData : : ConstantDoc > constants ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < cd . constants . size ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
2017-08-24 00:10:32 +02:00
if ( cd . constants [ i ] . enumeration ! = String ( ) ) {
if ( ! enums . has ( cd . constants [ i ] . enumeration ) ) {
enums [ cd . constants [ i ] . enumeration ] = Vector < DocData : : ConstantDoc > ( ) ;
}
enums [ cd . constants [ i ] . enumeration ] . push_back ( cd . constants [ i ] ) ;
} else {
constants . push_back ( cd . constants [ i ] ) ;
}
}
if ( enums . size ( ) ) {
2017-09-14 02:56:37 +02:00
section_line . push_back ( Pair < String , int > ( TTR ( " Enumerations " ) , class_desc - > get_line_count ( ) - 2 ) ) ;
class_desc - > push_color ( title_color ) ;
2017-08-24 00:10:32 +02:00
class_desc - > push_font ( doc_title_font ) ;
class_desc - > add_text ( TTR ( " Enumerations: " ) ) ;
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
2017-08-24 00:10:32 +02:00
class_desc - > push_indent ( 1 ) ;
class_desc - > add_newline ( ) ;
for ( Map < String , Vector < DocData : : ConstantDoc > > : : Element * E = enums . front ( ) ; E ; E = E - > next ( ) ) {
enum_line [ E - > key ( ) ] = class_desc - > get_line_count ( ) - 2 ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( title_color ) ;
2017-08-24 00:10:32 +02:00
class_desc - > add_text ( TTR ( " enum " ) ) ;
class_desc - > pop ( ) ;
class_desc - > push_font ( doc_code_font ) ;
String e = E - > key ( ) ;
if ( e . get_slice_count ( " . " ) ) {
e = e . get_slice ( " . " , 1 ) ;
}
2017-09-28 23:21:44 +02:00
class_desc - > push_color ( headline_color ) ;
2017-08-24 00:10:32 +02:00
class_desc - > add_text ( e ) ;
class_desc - > pop ( ) ;
2017-09-14 02:56:37 +02:00
class_desc - > pop ( ) ;
class_desc - > push_color ( symbol_color ) ;
2017-08-24 00:10:32 +02:00
class_desc - > add_text ( " : " ) ;
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
class_desc - > push_indent ( 1 ) ;
Vector < DocData : : ConstantDoc > enum_list = E - > get ( ) ;
2018-03-30 16:20:24 +02:00
Map < String , int > enumValuesContainer ;
int enumStartingLine = enum_line [ E - > key ( ) ] ;
2017-08-24 00:10:32 +02:00
for ( int i = 0 ; i < enum_list . size ( ) ; i + + ) {
2018-03-30 16:20:24 +02:00
if ( cd . name = = " @GlobalScope " )
enumValuesContainer [ enum_list [ i ] . name ] = enumStartingLine ;
2017-08-24 00:10:32 +02:00
class_desc - > push_font ( doc_code_font ) ;
2017-09-28 23:21:44 +02:00
class_desc - > push_color ( headline_color ) ;
2017-08-24 00:10:32 +02:00
_add_text ( enum_list [ i ] . name ) ;
class_desc - > pop ( ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( symbol_color ) ;
2017-08-24 00:10:32 +02:00
class_desc - > add_text ( " = " ) ;
class_desc - > pop ( ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( value_color ) ;
2017-08-24 00:10:32 +02:00
_add_text ( enum_list [ i ] . value ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
if ( enum_list [ i ] . description ! = " " ) {
class_desc - > push_font ( doc_font ) ;
2017-11-04 14:09:45 +01:00
//class_desc->add_text(" ");
class_desc - > push_indent ( 1 ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( comment_color ) ;
2017-08-24 00:10:32 +02:00
_add_text ( enum_list [ i ] . description ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
2017-11-04 14:09:45 +01:00
class_desc - > pop ( ) ; // indent
class_desc - > add_newline ( ) ;
2017-08-24 00:10:32 +02:00
}
class_desc - > add_newline ( ) ;
}
2018-03-30 16:20:24 +02:00
if ( cd . name = = " @GlobalScope " )
enum_values_line [ E - > key ( ) ] = enumValuesContainer ;
2017-08-24 00:10:32 +02:00
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
}
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
}
if ( constants . size ( ) ) {
2017-09-14 02:56:37 +02:00
section_line . push_back ( Pair < String , int > ( TTR ( " Constants " ) , class_desc - > get_line_count ( ) - 2 ) ) ;
class_desc - > push_color ( title_color ) ;
2017-08-24 00:10:32 +02:00
class_desc - > push_font ( doc_title_font ) ;
class_desc - > add_text ( TTR ( " Constants: " ) ) ;
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
2017-08-24 00:10:32 +02:00
class_desc - > push_indent ( 1 ) ;
class_desc - > add_newline ( ) ;
for ( int i = 0 ; i < constants . size ( ) ; i + + ) {
constant_line [ constants [ i ] . name ] = class_desc - > get_line_count ( ) - 2 ;
class_desc - > push_font ( doc_code_font ) ;
2017-12-15 16:43:27 +01:00
if ( constants [ i ] . value . begins_with ( " Color( " ) & & constants [ i ] . value . ends_with ( " ) " ) ) {
String stripped = constants [ i ] . value . replace ( " " , " " ) . replace ( " Color( " , " " ) . replace ( " ) " , " " ) ;
Vector < float > color = stripped . split_floats ( " , " ) ;
if ( color . size ( ) > = 3 ) {
class_desc - > push_color ( Color ( color [ 0 ] , color [ 1 ] , color [ 2 ] ) ) ;
static const CharType prefix [ 3 ] = { 0x25CF /* filled circle */ , ' ' , 0 } ;
class_desc - > add_text ( String ( prefix ) ) ;
class_desc - > pop ( ) ;
}
}
2017-09-28 23:21:44 +02:00
class_desc - > push_color ( headline_color ) ;
2017-08-24 00:10:32 +02:00
_add_text ( constants [ i ] . name ) ;
class_desc - > pop ( ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( symbol_color ) ;
2017-08-24 00:10:32 +02:00
class_desc - > add_text ( " = " ) ;
class_desc - > pop ( ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( value_color ) ;
2017-08-24 00:10:32 +02:00
_add_text ( constants [ i ] . value ) ;
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
2017-12-15 16:43:27 +01:00
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
2017-08-24 00:10:32 +02:00
if ( constants [ i ] . description ! = " " ) {
class_desc - > push_font ( doc_font ) ;
2017-11-04 14:09:45 +01:00
class_desc - > push_indent ( 1 ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( comment_color ) ;
2017-08-24 00:10:32 +02:00
_add_text ( constants [ i ] . description ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
2017-11-04 14:09:45 +01:00
class_desc - > pop ( ) ; // indent
class_desc - > add_newline ( ) ;
2017-08-24 00:10:32 +02:00
}
class_desc - > add_newline ( ) ;
2014-02-10 02:10:30 +01:00
}
2017-08-24 00:10:32 +02:00
class_desc - > pop ( ) ;
2014-02-10 02:10:30 +01:00
class_desc - > add_newline ( ) ;
}
}
2017-03-05 16:44:50 +01:00
if ( cd . description ! = " " ) {
2014-02-10 02:10:30 +01:00
2017-09-14 02:56:37 +02:00
section_line . push_back ( Pair < String , int > ( TTR ( " Description " ) , class_desc - > get_line_count ( ) - 2 ) ) ;
2017-03-05 16:44:50 +01:00
description_line = class_desc - > get_line_count ( ) - 2 ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( title_color ) ;
2014-02-10 02:10:30 +01:00
class_desc - > push_font ( doc_title_font ) ;
2016-05-04 03:25:37 +02:00
class_desc - > add_text ( TTR ( " Description: " ) ) ;
2014-02-10 02:10:30 +01:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( text_color ) ;
2017-03-05 16:44:50 +01:00
class_desc - > push_font ( doc_font ) ;
2015-10-20 17:41:27 +02:00
class_desc - > push_indent ( 1 ) ;
_add_text ( cd . description ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
2014-02-10 02:10:30 +01:00
class_desc - > add_newline ( ) ;
2015-09-30 04:38:23 +02:00
class_desc - > add_newline ( ) ;
2017-09-14 02:56:37 +02:00
class_desc - > add_newline ( ) ;
2014-02-10 02:10:30 +01:00
}
2018-01-15 22:40:41 +01:00
{
class_desc - > push_color ( title_color ) ;
class_desc - > push_font ( doc_title_font ) ;
class_desc - > add_text ( TTR ( " Online Tutorials: " ) ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > push_indent ( 1 ) ;
class_desc - > push_font ( doc_code_font ) ;
class_desc - > add_newline ( ) ;
// class_desc->add_newline();
2018-06-11 13:35:44 +02:00
if ( cd . tutorials . size ( ) ! = 0 ) {
2018-01-15 22:40:41 +01:00
2018-06-11 13:35:44 +02:00
for ( int i = 0 ; i < cd . tutorials . size ( ) ; i + + ) {
String link = cd . tutorials [ i ] ;
2018-01-15 22:40:41 +01:00
String linktxt = link ;
int seppos = linktxt . find ( " // " ) ;
if ( seppos ! = - 1 ) {
linktxt = link . right ( seppos + 2 ) ;
}
class_desc - > push_color ( symbol_color ) ;
class_desc - > append_bbcode ( " [url= " + link + " ] " + linktxt + " [/url] " ) ;
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
}
} else {
class_desc - > push_color ( comment_color ) ;
class_desc - > append_bbcode ( TTR ( " There are currently no tutorials for this class, you can [color=$color][url=$url]contribute one[/url][/color] or [color=$color][url=$url2]request one[/url][/color]. " ) . replace ( " $url2 " , REQUEST_URL ) . replace ( " $url " , CONTRIBUTE2_URL ) . replace ( " $color " , link_color_text ) ) ;
class_desc - > pop ( ) ;
}
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
class_desc - > add_newline ( ) ;
}
2017-01-04 05:16:14 +01:00
if ( property_descr ) {
2017-09-14 02:56:37 +02:00
section_line . push_back ( Pair < String , int > ( TTR ( " Properties " ) , class_desc - > get_line_count ( ) - 2 ) ) ;
class_desc - > push_color ( title_color ) ;
2017-01-04 05:16:14 +01:00
class_desc - > push_font ( doc_title_font ) ;
class_desc - > add_text ( TTR ( " Property Description: " ) ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
class_desc - > add_newline ( ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < cd . properties . size ( ) ; i + + ) {
2017-01-04 05:16:14 +01:00
2017-11-21 00:30:46 +01:00
property_line [ cd . properties [ i ] . name ] = class_desc - > get_line_count ( ) - 2 ;
2017-01-04 05:16:14 +01:00
2017-11-04 14:09:45 +01:00
class_desc - > push_table ( 2 ) ;
class_desc - > set_table_column_expand ( 1 , 1 ) ;
class_desc - > push_cell ( ) ;
2017-01-04 05:16:14 +01:00
class_desc - > push_font ( doc_code_font ) ;
2017-08-24 00:10:32 +02:00
_add_type ( cd . properties [ i ] . type , cd . properties [ i ] . enumeration ) ;
2017-01-04 05:16:14 +01:00
class_desc - > add_text ( " " ) ;
2017-11-04 14:09:45 +01:00
class_desc - > pop ( ) ; // font
class_desc - > pop ( ) ; // cell
class_desc - > push_cell ( ) ;
class_desc - > push_font ( doc_code_font ) ;
2017-09-28 23:21:44 +02:00
class_desc - > push_color ( headline_color ) ;
2017-01-04 05:16:14 +01:00
_add_text ( cd . properties [ i ] . name ) ;
2017-11-04 14:09:45 +01:00
class_desc - > pop ( ) ; // color
class_desc - > pop ( ) ; // font
class_desc - > pop ( ) ; // cell
2017-01-04 05:16:14 +01:00
2017-03-05 16:44:50 +01:00
if ( cd . properties [ i ] . setter ! = " " ) {
2017-01-04 05:16:14 +01:00
2017-11-04 14:09:45 +01:00
class_desc - > push_cell ( ) ;
class_desc - > pop ( ) ; // cell
2017-01-04 05:16:14 +01:00
2017-11-04 14:09:45 +01:00
class_desc - > push_cell ( ) ;
class_desc - > push_font ( doc_code_font ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( text_color ) ;
2017-03-05 16:44:50 +01:00
class_desc - > add_text ( cd . properties [ i ] . setter + " (value) " ) ;
2017-11-04 14:09:45 +01:00
class_desc - > pop ( ) ; // color
class_desc - > push_color ( comment_color ) ;
class_desc - > add_text ( " setter " ) ;
class_desc - > pop ( ) ; // color
class_desc - > pop ( ) ; // font
class_desc - > pop ( ) ; // cell
2017-01-04 05:16:14 +01:00
}
2017-03-05 16:44:50 +01:00
if ( cd . properties [ i ] . getter ! = " " ) {
2017-01-04 05:16:14 +01:00
2017-11-04 14:09:45 +01:00
class_desc - > push_cell ( ) ;
class_desc - > pop ( ) ; // cell
2017-01-04 05:16:14 +01:00
2017-11-04 14:09:45 +01:00
class_desc - > push_cell ( ) ;
class_desc - > push_font ( doc_code_font ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( text_color ) ;
2017-03-05 16:44:50 +01:00
class_desc - > add_text ( cd . properties [ i ] . getter + " () " ) ;
2017-01-04 05:16:14 +01:00
class_desc - > pop ( ) ; //color
2017-11-04 14:09:45 +01:00
class_desc - > push_color ( comment_color ) ;
class_desc - > add_text ( " getter " ) ;
class_desc - > pop ( ) ; //color
2017-01-04 05:16:14 +01:00
class_desc - > pop ( ) ; //font
2017-11-04 14:09:45 +01:00
class_desc - > pop ( ) ; //cell
2017-01-04 05:16:14 +01:00
}
2017-11-04 14:09:45 +01:00
class_desc - > pop ( ) ; // table
2017-01-04 05:16:14 +01:00
class_desc - > add_newline ( ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( text_color ) ;
2017-03-05 16:44:50 +01:00
class_desc - > push_font ( doc_font ) ;
2017-01-04 05:16:14 +01:00
class_desc - > push_indent ( 1 ) ;
2017-09-13 00:16:18 +02:00
if ( cd . properties [ i ] . description . strip_edges ( ) ! = String ( ) ) {
_add_text ( cd . properties [ i ] . description ) ;
} else {
class_desc - > add_image ( get_icon ( " Error " , " EditorIcons " ) ) ;
class_desc - > add_text ( " " ) ;
2017-09-14 02:56:37 +02:00
class_desc - > push_color ( comment_color ) ;
2017-09-13 09:13:23 +02:00
class_desc - > append_bbcode ( TTR ( " There is currently no description for this property. Please help us by [color=$color][url=$url]contributing one[/url][/color]! " ) . replace ( " $url " , CONTRIBUTE_URL ) . replace ( " $color " , link_color_text ) ) ;
2017-09-13 00:16:18 +02:00
class_desc - > pop ( ) ;
}
2017-01-04 05:16:14 +01:00
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
class_desc - > add_newline ( ) ;
class_desc - > add_newline ( ) ;
}
}
2017-12-19 01:47:17 +01:00
if ( method_descr ) {
2014-02-10 02:10:30 +01:00
2017-12-19 01:47:17 +01:00
section_line . push_back ( Pair < String , int > ( TTR ( " Methods " ) , class_desc - > get_line_count ( ) - 2 ) ) ;
class_desc - > push_color ( title_color ) ;
class_desc - > push_font ( doc_title_font ) ;
class_desc - > add_text ( TTR ( " Method Description: " ) ) ;
class_desc - > pop ( ) ;
class_desc - > pop ( ) ;
2014-02-10 02:10:30 +01:00
2017-12-19 01:47:17 +01:00
class_desc - > add_newline ( ) ;
class_desc - > add_newline ( ) ;
2014-02-10 02:10:30 +01:00
2017-12-19 01:47:17 +01:00
for ( int i = 0 ; i < methods . size ( ) ; i + + ) {
2017-09-13 00:16:18 +02:00
2017-12-27 17:34:20 +01:00
class_desc - > push_font ( doc_code_font ) ;
2017-12-19 01:47:17 +01:00
_add_method ( methods [ i ] , false ) ;
2017-12-27 17:34:20 +01:00
class_desc - > pop ( ) ;
2017-12-19 01:47:17 +01:00
class_desc - > add_newline ( ) ;
class_desc - > push_color ( text_color ) ;
class_desc - > push_font ( doc_font ) ;
class_desc - > push_indent ( 1 ) ;
if ( methods [ i ] . description . strip_edges ( ) ! = String ( ) ) {
_add_text ( methods [ i ] . description ) ;
} else {
class_desc - > add_image ( get_icon ( " Error " , " EditorIcons " ) ) ;
class_desc - > add_text ( " " ) ;
class_desc - > push_color ( comment_color ) ;
class_desc - > append_bbcode ( TTR ( " There is currently no description for this method. Please help us by [color=$color][url=$url]contributing one[/url][/color]! " ) . replace ( " $url " , CONTRIBUTE_URL ) . replace ( " $color " , link_color_text ) ) ;
class_desc - > pop ( ) ;
}
class_desc - > pop ( ) ;
2015-10-20 17:41:27 +02:00
class_desc - > pop ( ) ;
2017-12-19 01:47:17 +01:00
class_desc - > pop ( ) ;
class_desc - > add_newline ( ) ;
class_desc - > add_newline ( ) ;
class_desc - > add_newline ( ) ;
2014-02-10 02:10:30 +01:00
}
}
2017-03-05 16:44:50 +01:00
scroll_locked = false ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
void EditorHelp : : _request_help ( const String & p_string ) {
2014-05-06 11:41:19 +02:00
Error err = _goto_desc ( p_string ) ;
2017-03-05 16:44:50 +01:00
if ( err = = OK ) {
2017-06-06 17:23:48 +02:00
EditorNode : : get_singleton ( ) - > set_visible_editor ( EditorNode : : EDITOR_SCRIPT ) ;
2014-05-06 11:41:19 +02:00
}
2014-02-21 03:01:44 +01:00
//100 palabras
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
void EditorHelp : : _help_callback ( const String & p_topic ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
String what = p_topic . get_slice ( " : " , 0 ) ;
String clss = p_topic . get_slice ( " : " , 1 ) ;
2014-02-21 03:01:44 +01:00
String name ;
2017-03-05 16:44:50 +01:00
if ( p_topic . get_slice_count ( " : " ) = = 3 )
name = p_topic . get_slice ( " : " , 2 ) ;
2014-02-21 03:01:44 +01:00
_request_help ( clss ) ; //first go to class
2017-03-05 16:44:50 +01:00
int line = 0 ;
2014-02-21 03:01:44 +01:00
2017-03-05 16:44:50 +01:00
if ( what = = " class_desc " ) {
line = description_line ;
} else if ( what = = " class_signal " ) {
2014-02-21 03:01:44 +01:00
if ( signal_line . has ( name ) )
2017-03-05 16:44:50 +01:00
line = signal_line [ name ] ;
} else if ( what = = " class_method " | | what = = " class_method_desc " ) {
2014-02-21 03:01:44 +01:00
if ( method_line . has ( name ) )
2017-03-05 16:44:50 +01:00
line = method_line [ name ] ;
} else if ( what = = " class_property " ) {
2014-02-21 03:01:44 +01:00
if ( property_line . has ( name ) )
2017-03-05 16:44:50 +01:00
line = property_line [ name ] ;
2017-08-24 00:10:32 +02:00
} else if ( what = = " class_enum " ) {
if ( enum_line . has ( name ) )
line = enum_line [ name ] ;
2017-03-05 16:44:50 +01:00
} else if ( what = = " class_theme_item " ) {
2014-06-30 03:41:02 +02:00
if ( theme_property_line . has ( name ) )
2017-03-05 16:44:50 +01:00
line = theme_property_line [ name ] ;
} else if ( what = = " class_constant " ) {
2014-02-21 03:01:44 +01:00
if ( constant_line . has ( name ) )
2017-03-05 16:44:50 +01:00
line = constant_line [ name ] ;
2018-03-30 16:20:24 +02:00
} else if ( what = = " class_global " ) {
if ( constant_line . has ( name ) )
line = constant_line [ name ] ;
else {
Map < String , Map < String , int > > : : Element * iter = enum_values_line . front ( ) ;
while ( true ) {
if ( iter - > value ( ) . has ( name ) ) {
line = iter - > value ( ) [ name ] ;
break ;
} else if ( iter = = enum_values_line . back ( ) )
break ;
else
iter = iter - > next ( ) ;
}
}
2014-02-21 03:01:44 +01:00
}
2015-11-28 00:11:49 +01:00
class_desc - > call_deferred ( " scroll_to_line " , line ) ;
2014-02-21 03:01:44 +01:00
}
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
static void _add_text_to_rt ( const String & p_bbcode , RichTextLabel * p_rt ) {
2016-08-24 04:15:16 +02:00
DocData * doc = EditorHelp : : get_doc_data ( ) ;
String base_path ;
2017-03-05 16:44:50 +01:00
Ref < Font > doc_font = p_rt - > get_font ( " doc " , " EditorFonts " ) ;
Ref < Font > doc_code_font = p_rt - > get_font ( " doc_source " , " EditorFonts " ) ;
2017-09-28 23:21:44 +02:00
Color font_color_hl = p_rt - > get_color ( " headline_color " , " EditorHelp " ) ;
2017-09-14 02:56:37 +02:00
Color link_color = p_rt - > get_color ( " accent_color " , " Editor " ) . linear_interpolate ( font_color_hl , 0.8 ) ;
2016-05-29 16:37:26 +02:00
2017-11-11 02:11:24 +01:00
String bbcode = p_bbcode . dedent ( ) . replace ( " \t " , " " ) . replace ( " \r " , " " ) . strip_edges ( ) ;
2016-02-28 03:10:44 +01:00
2014-02-10 02:10:30 +01:00
List < String > tag_stack ;
2017-11-11 02:11:24 +01:00
bool code_tag = false ;
2014-02-10 02:10:30 +01:00
2017-09-14 02:56:37 +02:00
int pos = 0 ;
2017-03-05 16:44:50 +01:00
while ( pos < bbcode . length ( ) ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
int brk_pos = bbcode . find ( " [ " , pos ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( brk_pos < 0 )
brk_pos = bbcode . length ( ) ;
2014-02-10 02:10:30 +01:00
if ( brk_pos > pos ) {
2017-11-11 02:11:24 +01:00
String text = bbcode . substr ( pos , brk_pos - pos ) ;
if ( ! code_tag )
text = text . replace ( " \n " , " \n \n " ) ;
p_rt - > add_text ( text ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
if ( brk_pos = = bbcode . length ( ) )
2017-12-18 18:46:17 +01:00
break ; //nothing else to add
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
int brk_end = bbcode . find ( " ] " , brk_pos + 1 ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( brk_end = = - 1 ) {
2017-11-11 02:11:24 +01:00
String text = bbcode . substr ( brk_pos , bbcode . length ( ) - brk_pos ) ;
if ( ! code_tag )
text = text . replace ( " \n " , " \n \n " ) ;
p_rt - > add_text ( text ) ;
2014-02-10 02:10:30 +01:00
break ;
}
2017-03-05 16:44:50 +01:00
String tag = bbcode . substr ( brk_pos + 1 , brk_end - brk_pos - 1 ) ;
2014-02-10 02:10:30 +01:00
if ( tag . begins_with ( " / " ) ) {
2017-03-05 16:44:50 +01:00
bool tag_ok = tag_stack . size ( ) & & tag_stack . front ( ) - > get ( ) = = tag . substr ( 1 , tag . length ( ) ) ;
2017-09-14 02:56:37 +02:00
2014-02-10 02:10:30 +01:00
if ( ! tag_ok ) {
2016-08-24 04:15:16 +02:00
p_rt - > add_text ( " [ " ) ;
2017-11-11 02:11:24 +01:00
pos = brk_pos + 1 ;
2014-02-10 02:10:30 +01:00
continue ;
}
tag_stack . pop_front ( ) ;
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
2017-11-11 02:11:24 +01:00
code_tag = false ;
2017-03-05 16:44:50 +01:00
if ( tag ! = " /img " )
2016-08-24 04:15:16 +02:00
p_rt - > pop ( ) ;
2017-11-11 02:11:24 +01:00
} else if ( code_tag ) {
p_rt - > add_text ( " [ " ) ;
pos = brk_pos + 1 ;
2014-02-10 02:10:30 +01:00
2017-11-21 00:30:46 +01:00
} else if ( tag . begins_with ( " method " ) | | tag . begins_with ( " member " ) | | tag . begins_with ( " signal " ) | | tag . begins_with ( " enum " ) ) {
2014-02-10 02:10:30 +01:00
2017-11-21 00:30:46 +01:00
String link_target = tag . substr ( tag . find ( " " ) + 1 , tag . length ( ) ) ;
String link_tag = tag . substr ( 0 , tag . find ( " " ) ) . rpad ( 6 ) ;
2017-09-14 02:56:37 +02:00
p_rt - > push_color ( link_color ) ;
2017-11-21 00:30:46 +01:00
p_rt - > push_meta ( " @ " + link_tag + link_target ) ;
p_rt - > add_text ( link_target + ( tag . begins_with ( " method " ) ? " () " : " " ) ) ;
2016-08-24 04:15:16 +02:00
p_rt - > pop ( ) ;
p_rt - > pop ( ) ;
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
2014-02-10 02:10:30 +01:00
2014-02-16 01:16:33 +01:00
} else if ( doc - > class_list . has ( tag ) ) {
2014-02-10 02:10:30 +01:00
2017-09-14 02:56:37 +02:00
p_rt - > push_color ( link_color ) ;
2017-03-05 16:44:50 +01:00
p_rt - > push_meta ( " # " + tag ) ;
2016-08-24 04:15:16 +02:00
p_rt - > add_text ( tag ) ;
p_rt - > pop ( ) ;
p_rt - > pop ( ) ;
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
} else if ( tag = = " b " ) {
2014-02-10 02:10:30 +01:00
//use bold font
2016-08-24 04:15:16 +02:00
p_rt - > push_font ( doc_code_font ) ;
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
2014-02-10 02:10:30 +01:00
tag_stack . push_front ( tag ) ;
2017-03-05 16:44:50 +01:00
} else if ( tag = = " i " ) {
2014-02-10 02:10:30 +01:00
//use italics font
2017-09-14 02:56:37 +02:00
p_rt - > push_color ( font_color_hl ) ;
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
2014-02-10 02:10:30 +01:00
tag_stack . push_front ( tag ) ;
2017-03-05 16:44:50 +01:00
} else if ( tag = = " code " | | tag = = " codeblock " ) {
2014-02-10 02:10:30 +01:00
//use monospace font
2016-08-24 04:15:16 +02:00
p_rt - > push_font ( doc_code_font ) ;
2017-11-11 02:11:24 +01:00
code_tag = true ;
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
2014-02-10 02:10:30 +01:00
tag_stack . push_front ( tag ) ;
2017-03-05 16:44:50 +01:00
} else if ( tag = = " center " ) {
2014-02-10 02:10:30 +01:00
//use monospace font
2016-08-24 04:15:16 +02:00
p_rt - > push_align ( RichTextLabel : : ALIGN_CENTER ) ;
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
2014-02-10 02:10:30 +01:00
tag_stack . push_front ( tag ) ;
2017-03-05 16:44:50 +01:00
} else if ( tag = = " br " ) {
2014-02-10 02:10:30 +01:00
//use monospace font
2016-08-24 04:15:16 +02:00
p_rt - > add_newline ( ) ;
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
} else if ( tag = = " u " ) {
2014-02-10 02:10:30 +01:00
//use underline
2016-08-24 04:15:16 +02:00
p_rt - > push_underline ( ) ;
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
2014-02-10 02:10:30 +01:00
tag_stack . push_front ( tag ) ;
2017-03-05 16:44:50 +01:00
} else if ( tag = = " s " ) {
2014-02-10 02:10:30 +01:00
//use strikethrough (not supported underline instead)
2016-08-24 04:15:16 +02:00
p_rt - > push_underline ( ) ;
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
2014-02-10 02:10:30 +01:00
tag_stack . push_front ( tag ) ;
2017-03-05 16:44:50 +01:00
} else if ( tag = = " url " ) {
2014-02-10 02:10:30 +01:00
//use strikethrough (not supported underline instead)
2017-03-05 16:44:50 +01:00
int end = bbcode . find ( " [ " , brk_end ) ;
if ( end = = - 1 )
end = bbcode . length ( ) ;
String url = bbcode . substr ( brk_end + 1 , end - brk_end - 1 ) ;
2016-08-24 04:15:16 +02:00
p_rt - > push_meta ( url ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
2014-02-10 02:10:30 +01:00
tag_stack . push_front ( tag ) ;
} else if ( tag . begins_with ( " url= " ) ) {
2017-03-05 16:44:50 +01:00
String url = tag . substr ( 4 , tag . length ( ) ) ;
2016-08-24 04:15:16 +02:00
p_rt - > push_meta ( url ) ;
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
2014-02-10 02:10:30 +01:00
tag_stack . push_front ( " url " ) ;
2017-03-05 16:44:50 +01:00
} else if ( tag = = " img " ) {
2014-02-10 02:10:30 +01:00
//use strikethrough (not supported underline instead)
2017-03-05 16:44:50 +01:00
int end = bbcode . find ( " [ " , brk_end ) ;
if ( end = = - 1 )
end = bbcode . length ( ) ;
String image = bbcode . substr ( brk_end + 1 , end - brk_end - 1 ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
Ref < Texture > texture = ResourceLoader : : load ( base_path + " / " + image , " Texture " ) ;
2014-02-10 02:10:30 +01:00
if ( texture . is_valid ( ) )
2016-08-24 04:15:16 +02:00
p_rt - > add_image ( texture ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
pos = end ;
2014-02-10 02:10:30 +01:00
tag_stack . push_front ( tag ) ;
} else if ( tag . begins_with ( " color= " ) ) {
2017-03-05 16:44:50 +01:00
String col = tag . substr ( 6 , tag . length ( ) ) ;
2014-02-10 02:10:30 +01:00
Color color ;
if ( col . begins_with ( " # " ) )
2017-03-05 16:44:50 +01:00
color = Color : : html ( col ) ;
else if ( col = = " aqua " )
color = Color : : html ( " #00FFFF " ) ;
else if ( col = = " black " )
color = Color : : html ( " #000000 " ) ;
else if ( col = = " blue " )
color = Color : : html ( " #0000FF " ) ;
else if ( col = = " fuchsia " )
color = Color : : html ( " #FF00FF " ) ;
else if ( col = = " gray " | | col = = " grey " )
color = Color : : html ( " #808080 " ) ;
else if ( col = = " green " )
color = Color : : html ( " #008000 " ) ;
else if ( col = = " lime " )
color = Color : : html ( " #00FF00 " ) ;
else if ( col = = " maroon " )
color = Color : : html ( " #800000 " ) ;
else if ( col = = " navy " )
color = Color : : html ( " #000080 " ) ;
else if ( col = = " olive " )
color = Color : : html ( " #808000 " ) ;
else if ( col = = " purple " )
color = Color : : html ( " #800080 " ) ;
else if ( col = = " red " )
color = Color : : html ( " #FF0000 " ) ;
else if ( col = = " silver " )
color = Color : : html ( " #C0C0C0 " ) ;
else if ( col = = " teal " )
color = Color : : html ( " #008008 " ) ;
else if ( col = = " white " )
color = Color : : html ( " #FFFFFF " ) ;
else if ( col = = " yellow " )
color = Color : : html ( " #FFFF00 " ) ;
2014-02-10 02:10:30 +01:00
else
2017-03-05 16:44:50 +01:00
color = Color ( 0 , 0 , 0 , 1 ) ; //base_color;
2014-02-10 02:10:30 +01:00
2016-08-24 04:15:16 +02:00
p_rt - > push_color ( color ) ;
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
2014-02-10 02:10:30 +01:00
tag_stack . push_front ( " color " ) ;
} else if ( tag . begins_with ( " font= " ) ) {
2017-03-05 16:44:50 +01:00
String fnt = tag . substr ( 5 , tag . length ( ) ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
Ref < Font > font = ResourceLoader : : load ( base_path + " / " + fnt , " Font " ) ;
2014-02-10 02:10:30 +01:00
if ( font . is_valid ( ) )
2016-08-24 04:15:16 +02:00
p_rt - > push_font ( font ) ;
2014-02-10 02:10:30 +01:00
else {
2016-08-24 04:15:16 +02:00
p_rt - > push_font ( doc_font ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
pos = brk_end + 1 ;
2014-02-10 02:10:30 +01:00
tag_stack . push_front ( " font " ) ;
} else {
2016-08-24 04:15:16 +02:00
p_rt - > add_text ( " [ " ) ; //ignore
2017-03-05 16:44:50 +01:00
pos = brk_pos + 1 ;
2014-02-10 02:10:30 +01:00
}
}
2016-08-24 04:15:16 +02:00
}
2017-03-05 16:44:50 +01:00
void EditorHelp : : _add_text ( const String & p_bbcode ) {
2016-08-24 04:15:16 +02:00
2017-03-05 16:44:50 +01:00
_add_text_to_rt ( p_bbcode , class_desc ) ;
2014-02-10 02:10:30 +01:00
}
2015-11-17 13:46:08 +01:00
void EditorHelp : : generate_doc ( ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
doc = memnew ( DocData ) ;
2015-11-17 13:46:08 +01:00
doc - > generate ( true ) ;
DocData compdoc ;
2017-03-05 16:44:50 +01:00
compdoc . load_compressed ( _doc_data_compressed , _doc_data_compressed_size , _doc_data_uncompressed_size ) ;
2015-11-17 13:46:08 +01:00
doc - > merge_from ( compdoc ) ; //ensure all is up to date
2014-02-10 02:10:30 +01:00
}
2015-11-17 13:46:08 +01:00
void EditorHelp : : _notification ( int p_what ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
switch ( p_what ) {
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
case NOTIFICATION_READY : {
2017-12-18 18:46:17 +01:00
2015-11-17 13:46:08 +01:00
_update_doc ( ) ;
2017-09-08 22:39:41 +02:00
2017-07-26 16:02:53 +02:00
} break ;
2014-02-10 02:10:30 +01:00
2017-09-02 19:16:31 +02:00
case EditorSettings : : NOTIFICATION_EDITOR_SETTINGS_CHANGED : {
2017-09-27 21:27:40 +02:00
class_desc - > add_color_override ( " selection_color " , get_color ( " text_editor/theme/selection_color " , " Editor " ) ) ;
2018-08-13 02:40:06 +02:00
_update_doc ( ) ;
2017-09-14 02:56:37 +02:00
2017-09-02 19:16:31 +02:00
} break ;
2017-07-26 16:02:53 +02:00
default : break ;
2014-02-10 02:10:30 +01:00
}
2015-11-17 13:46:08 +01:00
}
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
void EditorHelp : : go_to_help ( const String & p_help ) {
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
_help_callback ( p_help ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
void EditorHelp : : go_to_class ( const String & p_class , int p_scroll ) {
2014-02-16 01:16:33 +01:00
2017-03-05 16:44:50 +01:00
_goto_desc ( p_class , p_scroll ) ;
2015-11-17 13:46:08 +01:00
}
2014-02-16 01:16:33 +01:00
2017-09-14 02:56:37 +02:00
Vector < Pair < String , int > > EditorHelp : : get_sections ( ) {
Vector < Pair < String , int > > sections ;
for ( int i = 0 ; i < section_line . size ( ) ; i + + ) {
sections . push_back ( Pair < String , int > ( section_line [ i ] . first , i ) ) ;
}
return sections ;
}
void EditorHelp : : scroll_to_section ( int p_section_index ) {
int line = section_line [ p_section_index ] . second ;
class_desc - > scroll_to_line ( line ) ;
}
2015-11-17 13:46:08 +01:00
void EditorHelp : : popup_search ( ) {
2014-02-16 01:16:33 +01:00
2017-12-22 19:09:31 +01:00
find_bar - > popup_search ( ) ;
2015-11-17 13:46:08 +01:00
}
2014-02-10 02:10:30 +01:00
2017-01-03 03:03:46 +01:00
String EditorHelp : : get_class ( ) {
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
return edited_class ;
}
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
void EditorHelp : : search_again ( ) {
_search ( prev_search ) ;
}
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
int EditorHelp : : get_scroll ( ) const {
2014-02-10 02:10:30 +01:00
2017-01-04 05:16:14 +01:00
return class_desc - > get_v_scroll ( ) - > get_value ( ) ;
2014-02-10 02:10:30 +01:00
}
2015-11-17 13:46:08 +01:00
void EditorHelp : : set_scroll ( int p_scroll ) {
2014-02-10 02:10:30 +01:00
2017-01-04 05:16:14 +01:00
class_desc - > get_v_scroll ( ) - > set_value ( p_scroll ) ;
2014-02-10 02:10:30 +01:00
}
void EditorHelp : : _bind_methods ( ) {
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( " _class_list_select " , & EditorHelp : : _class_list_select ) ;
ClassDB : : bind_method ( " _class_desc_select " , & EditorHelp : : _class_desc_select ) ;
ClassDB : : bind_method ( " _class_desc_input " , & EditorHelp : : _class_desc_input ) ;
ClassDB : : bind_method ( " _request_help " , & EditorHelp : : _request_help ) ;
ClassDB : : bind_method ( " _unhandled_key_input " , & EditorHelp : : _unhandled_key_input ) ;
ClassDB : : bind_method ( " _search " , & EditorHelp : : _search ) ;
ClassDB : : bind_method ( " _help_callback " , & EditorHelp : : _help_callback ) ;
2014-02-10 02:10:30 +01:00
2015-11-17 13:46:08 +01:00
ADD_SIGNAL ( MethodInfo ( " go_to_help " ) ) ;
2014-02-10 02:10:30 +01:00
}
2015-11-17 13:46:08 +01:00
EditorHelp : : EditorHelp ( ) {
2014-02-10 02:10:30 +01:00
2017-12-18 18:46:17 +01:00
set_custom_minimum_size ( Size2 ( 150 * EDSCALE , 0 ) ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
EDITOR_DEF ( " text_editor/help/sort_functions_alphabetically " , true ) ;
2014-02-10 02:10:30 +01:00
2017-12-22 19:09:31 +01:00
find_bar = memnew ( FindBar ) ;
add_child ( find_bar ) ;
find_bar - > hide ( ) ;
2017-12-18 18:46:17 +01:00
class_desc = memnew ( RichTextLabel ) ;
add_child ( class_desc ) ;
class_desc - > set_v_size_flags ( SIZE_EXPAND_FILL ) ;
class_desc - > add_color_override ( " selection_color " , get_color ( " text_editor/theme/selection_color " , " Editor " ) ) ;
class_desc - > connect ( " meta_clicked " , this , " _class_desc_select " ) ;
class_desc - > connect ( " gui_input " , this , " _class_desc_input " ) ;
2014-02-10 02:10:30 +01:00
2017-12-22 19:09:31 +01:00
find_bar - > set_rich_text_label ( class_desc ) ;
2014-02-10 02:10:30 +01:00
class_desc - > set_selection_enabled ( true ) ;
2015-11-17 13:46:08 +01:00
2017-03-05 16:44:50 +01:00
scroll_locked = false ;
select_locked = false ;
2017-12-22 19:09:31 +01:00
//set_process_unhandled_key_input(true);
2014-02-10 02:10:30 +01:00
class_desc - > hide ( ) ;
}
2015-11-17 13:46:08 +01:00
EditorHelp : : ~ EditorHelp ( ) {
2014-02-10 02:10:30 +01:00
}
2016-08-24 04:15:16 +02:00
/////////////
void EditorHelpBit : : _go_to_help ( String p_what ) {
EditorNode : : get_singleton ( ) - > set_visible_editor ( EditorNode : : EDITOR_SCRIPT ) ;
ScriptEditor : : get_singleton ( ) - > goto_help ( p_what ) ;
emit_signal ( " request_hide " ) ;
}
void EditorHelpBit : : _meta_clicked ( String p_select ) {
2017-08-24 00:10:32 +02:00
print_line ( " got meta " + p_select ) ;
2017-12-18 18:46:17 +01:00
2017-08-24 00:10:32 +02:00
if ( p_select . begins_with ( " $ " ) ) { //enum
2017-12-18 18:46:17 +01:00
2017-08-24 00:10:32 +02:00
String select = p_select . substr ( 1 , p_select . length ( ) ) ;
String class_name ;
if ( select . find ( " . " ) ! = - 1 ) {
class_name = select . get_slice ( " . " , 0 ) ;
} else {
class_name = " @Global " ;
}
_go_to_help ( " class_enum: " + class_name + " : " + select ) ;
return ;
} else if ( p_select . begins_with ( " # " ) ) {
2017-12-18 18:46:17 +01:00
2017-03-05 16:44:50 +01:00
_go_to_help ( " class_name: " + p_select . substr ( 1 , p_select . length ( ) ) ) ;
2016-08-24 04:15:16 +02:00
return ;
} else if ( p_select . begins_with ( " @ " ) ) {
2017-03-05 16:44:50 +01:00
String m = p_select . substr ( 1 , p_select . length ( ) ) ;
2016-08-24 04:15:16 +02:00
2017-12-18 18:46:17 +01:00
if ( m . find ( " . " ) ! = - 1 )
_go_to_help ( " class_method: " + m . get_slice ( " . " , 0 ) + " : " + m . get_slice ( " . " , 0 ) ) ; //must go somewhere else
2016-08-24 04:15:16 +02:00
}
}
void EditorHelpBit : : _bind_methods ( ) {
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( " _meta_clicked " , & EditorHelpBit : : _meta_clicked ) ;
2018-07-20 23:14:33 +02:00
ClassDB : : bind_method ( D_METHOD ( " set_text " , " text " ) , & EditorHelpBit : : set_text ) ;
2016-08-24 04:15:16 +02:00
ADD_SIGNAL ( MethodInfo ( " request_hide " ) ) ;
}
2017-03-05 16:44:50 +01:00
void EditorHelpBit : : _notification ( int p_what ) {
2017-09-02 19:16:31 +02:00
switch ( p_what ) {
case EditorSettings : : NOTIFICATION_EDITOR_SETTINGS_CHANGED : {
2017-09-27 21:27:40 +02:00
rich_text - > add_color_override ( " selection_color " , get_color ( " text_editor/theme/selection_color " , " Editor " ) ) ;
2017-09-02 19:16:31 +02:00
} break ;
default : break ;
}
2016-08-24 04:15:16 +02:00
}
2017-03-05 16:44:50 +01:00
void EditorHelpBit : : set_text ( const String & p_text ) {
2016-08-24 04:15:16 +02:00
rich_text - > clear ( ) ;
2017-03-05 16:44:50 +01:00
_add_text_to_rt ( p_text , rich_text ) ;
2016-08-24 04:15:16 +02:00
}
EditorHelpBit : : EditorHelpBit ( ) {
2017-03-05 16:44:50 +01:00
rich_text = memnew ( RichTextLabel ) ;
2016-08-24 04:15:16 +02:00
add_child ( rich_text ) ;
2018-07-20 23:14:33 +02:00
//rich_text->set_anchors_and_margins_preset(Control::PRESET_WIDE);
2017-03-05 16:44:50 +01:00
rich_text - > connect ( " meta_clicked " , this , " _meta_clicked " ) ;
2017-09-27 21:27:40 +02:00
rich_text - > add_color_override ( " selection_color " , get_color ( " text_editor/theme/selection_color " , " Editor " ) ) ;
2017-09-27 19:24:05 +02:00
rich_text - > set_override_selected_font_color ( false ) ;
2017-03-05 16:44:50 +01:00
set_custom_minimum_size ( Size2 ( 0 , 70 * EDSCALE ) ) ;
2016-08-24 04:15:16 +02:00
}
2017-12-22 19:09:31 +01:00
FindBar : : FindBar ( ) {
container = memnew ( Control ) ;
add_child ( container ) ;
container - > set_clip_contents ( true ) ;
container - > set_h_size_flags ( SIZE_EXPAND_FILL ) ;
hbc = memnew ( HBoxContainer ) ;
container - > add_child ( hbc ) ;
vbc_search_text = memnew ( VBoxContainer ) ;
hbc - > add_child ( vbc_search_text ) ;
vbc_search_text - > set_h_size_flags ( SIZE_EXPAND_FILL ) ;
hbc - > set_anchor_and_margin ( MARGIN_RIGHT , 1 , 0 ) ;
search_text = memnew ( LineEdit ) ;
vbc_search_text - > add_child ( search_text ) ;
search_text - > set_custom_minimum_size ( Size2 ( 100 * EDSCALE , 0 ) ) ;
search_text - > connect ( " text_changed " , this , " _search_text_changed " ) ;
search_text - > connect ( " text_entered " , this , " _search_text_entered " ) ;
find_prev = memnew ( ToolButton ) ;
hbc - > add_child ( find_prev ) ;
find_prev - > set_focus_mode ( FOCUS_NONE ) ;
find_prev - > connect ( " pressed " , this , " _search_prev " ) ;
find_next = memnew ( ToolButton ) ;
hbc - > add_child ( find_next ) ;
find_next - > set_focus_mode ( FOCUS_NONE ) ;
find_next - > connect ( " pressed " , this , " _search_next " ) ;
error_label = memnew ( Label ) ;
hbc - > add_child ( error_label ) ;
error_label - > add_color_override ( " font_color " , EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_color ( " error_color " , " Editor " ) ) ;
hide_button = memnew ( TextureButton ) ;
add_child ( hide_button ) ;
hide_button - > set_focus_mode ( FOCUS_NONE ) ;
hide_button - > set_expand ( true ) ;
hide_button - > set_stretch_mode ( TextureButton : : STRETCH_KEEP_CENTERED ) ;
hide_button - > connect ( " pressed " , this , " _hide_pressed " ) ;
}
void FindBar : : popup_search ( ) {
2018-05-16 16:43:00 +02:00
2017-12-22 19:09:31 +01:00
show ( ) ;
2018-05-16 16:43:00 +02:00
bool grabbed_focus = false ;
if ( ! search_text - > has_focus ( ) ) {
search_text - > grab_focus ( ) ;
grabbed_focus = true ;
}
if ( ! search_text - > get_text ( ) . empty ( ) ) {
search_text - > select_all ( ) ;
search_text - > set_cursor_position ( search_text - > get_text ( ) . length ( ) ) ;
if ( grabbed_focus ) {
_search ( ) ;
}
}
call_deferred ( " _update_size " ) ;
}
void FindBar : : _update_size ( ) {
2017-12-22 19:09:31 +01:00
container - > set_custom_minimum_size ( Size2 ( 0 , hbc - > get_size ( ) . height ) ) ;
}
void FindBar : : _notification ( int p_what ) {
if ( p_what = = NOTIFICATION_READY ) {
find_prev - > set_icon ( get_icon ( " MoveUp " , " EditorIcons " ) ) ;
find_next - > set_icon ( get_icon ( " MoveDown " , " EditorIcons " ) ) ;
hide_button - > set_normal_texture ( get_icon ( " Close " , " EditorIcons " ) ) ;
hide_button - > set_hover_texture ( get_icon ( " Close " , " EditorIcons " ) ) ;
hide_button - > set_pressed_texture ( get_icon ( " Close " , " EditorIcons " ) ) ;
hide_button - > set_custom_minimum_size ( hide_button - > get_normal_texture ( ) - > get_size ( ) ) ;
} else if ( p_what = = NOTIFICATION_VISIBILITY_CHANGED ) {
set_process_unhandled_input ( is_visible_in_tree ( ) ) ;
} else if ( p_what = = EditorSettings : : NOTIFICATION_EDITOR_SETTINGS_CHANGED ) {
find_prev - > set_icon ( get_icon ( " MoveUp " , " EditorIcons " ) ) ;
find_next - > set_icon ( get_icon ( " MoveDown " , " EditorIcons " ) ) ;
hide_button - > set_normal_texture ( get_icon ( " Close " , " EditorIcons " ) ) ;
hide_button - > set_hover_texture ( get_icon ( " Close " , " EditorIcons " ) ) ;
hide_button - > set_pressed_texture ( get_icon ( " Close " , " EditorIcons " ) ) ;
hide_button - > set_custom_minimum_size ( hide_button - > get_normal_texture ( ) - > get_size ( ) ) ;
}
}
void FindBar : : _bind_methods ( ) {
ClassDB : : bind_method ( " _unhandled_input " , & FindBar : : _unhandled_input ) ;
ClassDB : : bind_method ( " _search_text_changed " , & FindBar : : _search_text_changed ) ;
ClassDB : : bind_method ( " _search_text_entered " , & FindBar : : _search_text_entered ) ;
ClassDB : : bind_method ( " _search_next " , & FindBar : : search_next ) ;
ClassDB : : bind_method ( " _search_prev " , & FindBar : : search_prev ) ;
ClassDB : : bind_method ( " _hide_pressed " , & FindBar : : _hide_bar ) ;
2018-05-16 16:43:00 +02:00
ClassDB : : bind_method ( " _update_size " , & FindBar : : _update_size ) ;
2017-12-22 19:09:31 +01:00
ADD_SIGNAL ( MethodInfo ( " search " ) ) ;
}
void FindBar : : set_rich_text_label ( RichTextLabel * p_rich_text_label ) {
rich_text_label = p_rich_text_label ;
}
bool FindBar : : search_next ( ) {
return _search ( ) ;
}
bool FindBar : : search_prev ( ) {
return _search ( true ) ;
}
bool FindBar : : _search ( bool p_search_previous ) {
String stext = search_text - > get_text ( ) ;
bool keep = prev_search = = stext ;
bool ret = rich_text_label - > search ( stext , keep , p_search_previous ) ;
if ( ! ret ) {
ret = rich_text_label - > search ( stext , false , p_search_previous ) ;
}
prev_search = stext ;
if ( ret ) {
set_error ( " " ) ;
} else {
set_error ( stext . empty ( ) ? " " : TTR ( " No Matches " ) ) ;
}
return ret ;
}
void FindBar : : set_error ( const String & p_label ) {
error_label - > set_text ( p_label ) ;
}
void FindBar : : _hide_bar ( ) {
if ( search_text - > has_focus ( ) )
rich_text_label - > grab_focus ( ) ;
hide ( ) ;
}
void FindBar : : _unhandled_input ( const Ref < InputEvent > & p_event ) {
Ref < InputEventKey > k = p_event ;
if ( k . is_valid ( ) ) {
if ( k - > is_pressed ( ) & & ( rich_text_label - > has_focus ( ) | | hbc - > is_a_parent_of ( get_focus_owner ( ) ) ) ) {
bool accepted = true ;
switch ( k - > get_scancode ( ) ) {
case KEY_ESCAPE : {
_hide_bar ( ) ;
} break ;
default : {
accepted = false ;
} break ;
}
if ( accepted ) {
accept_event ( ) ;
}
}
}
}
void FindBar : : _search_text_changed ( const String & p_text ) {
search_next ( ) ;
}
void FindBar : : _search_text_entered ( const String & p_text ) {
search_next ( ) ;
}