summaryrefslogtreecommitdiff
path: root/modules/gdscript/gd_editor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gdscript/gd_editor.cpp')
-rw-r--r--modules/gdscript/gd_editor.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/modules/gdscript/gd_editor.cpp b/modules/gdscript/gd_editor.cpp
index f8717c292f..5f5de8b5db 100644
--- a/modules/gdscript/gd_editor.cpp
+++ b/modules/gdscript/gd_editor.cpp
@@ -787,3 +787,67 @@ Error GDScriptLanguage::complete_keyword(const String& p_code, int p_line, const
return OK;
}
+void GDScriptLanguage::auto_indent_code(String& p_code,int p_from_line,int p_to_line) const {
+
+
+ Vector<String> lines = p_code.split("\n");
+ List<int> indent_stack;
+
+ for(int i=0;i<lines.size();i++) {
+
+ String l = lines[i];
+ int tc=0;
+ for(int j=0;j<l.length();j++) {
+ if (l[j]==' ' || l[j]=='\t') {
+
+ tc++;
+ } else {
+ break;
+ }
+ }
+
+
+ String st = l.substr(tc,l.length()).strip_edges();
+ if (st=="" || st.begins_with("#"))
+ continue; //ignore!
+
+ int ilevel=0;
+ if (indent_stack.size()) {
+ ilevel=indent_stack.back()->get();
+ }
+
+ if (tc>ilevel) {
+ indent_stack.push_back(tc);
+ } else if (tc<ilevel) {
+ while(indent_stack.size() && indent_stack.back()->get()>tc) {
+ indent_stack.pop_back();
+ }
+
+ if (indent_stack.size() && indent_stack.back()->get()!=tc)
+ indent_stack.push_back(tc); //this is not right but gets the job done
+ }
+
+ if (i>=p_from_line) {
+
+ l="";
+ for(int j=0;j<indent_stack.size();j++)
+ l+="\t";
+ l+=st;
+
+
+ } else if (i>p_to_line) {
+ break;
+ }
+
+ //print_line(itos(indent_stack.size())+","+itos(tc)+": "+l);
+ lines[i]=l;
+ }
+
+ p_code="";
+ for(int i=0;i<lines.size();i++) {
+ if (i>0)
+ p_code+="\n";
+ p_code+=lines[i];
+ }
+
+}