patch [#31644] Py Console: Indent and unindent independent of cursor (aligned) [Tab...
authorCampbell Barton <ideasman42@gmail.com>
Mon, 4 Jun 2012 07:24:19 +0000 (07:24 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 4 Jun 2012 07:24:19 +0000 (07:24 +0000)
from Sebastian Nell (codemanx)

release/scripts/startup/bl_ui/space_console.py
source/blender/editors/space_console/console_intern.h
source/blender/editors/space_console/console_ops.c
source/blender/editors/space_console/space_console.c

index fc1d8e2d4be3e67b51335a6e55167b4f0a1ce4c0..5ec9d06ec891b2d55a0b9f0ea1f50ac2f8a3fc9e 100644 (file)
@@ -41,8 +41,16 @@ class CONSOLE_MT_console(Menu):
     def draw(self, context):
         layout = self.layout
 
+        layout.operator("console.indent")
+        layout.operator("console.unindent")
+
+        layout.separator()
+
         layout.operator("console.clear")
         layout.operator("console.clear_line")
+
+        layout.separator()
+
         layout.operator("console.copy")
         layout.operator("console.paste")
         layout.menu("CONSOLE_MT_language")
index c0abd094e62105c4b636de9b604cadf50be94d89..3d30dcad710c603c97323f44ad5e19c158106e11 100644 (file)
@@ -54,6 +54,9 @@ void CONSOLE_OT_move(struct wmOperatorType *ot);
 void CONSOLE_OT_delete(struct wmOperatorType *ot);
 void CONSOLE_OT_insert(struct wmOperatorType *ot);
 
+void CONSOLE_OT_indent(struct wmOperatorType *ot);
+void CONSOLE_OT_unindent(struct wmOperatorType *ot);
+
 void CONSOLE_OT_history_append(struct wmOperatorType *ot);
 void CONSOLE_OT_scrollback_append(struct wmOperatorType *ot);
 
index 5ed384d22afcb01516a664923834864d6320c65b..44dda60edd026393f8420daeceafc578ede33618 100644 (file)
@@ -364,9 +364,8 @@ static int console_insert_exec(bContext *C, wmOperator *op)
        char *str = RNA_string_get_alloc(op->ptr, "text", NULL, 0);
        int len;
 
-       // XXX, alligned tab key hack
        if (str[0] == '\t' && str[1] == '\0') {
-               len = TAB_LENGTH - (ci->cursor % TAB_LENGTH);
+               len = TAB_LENGTH;
                MEM_freeN(str);
                str = MEM_mallocN(len + 1, "insert_exec");
                memset(str, ' ', len);
@@ -430,6 +429,95 @@ void CONSOLE_OT_insert(wmOperatorType *ot)
        RNA_def_property_flag(prop, PROP_SKIP_SAVE);
 }
 
+static int console_indent_exec(bContext *C, wmOperator *op)
+{
+       SpaceConsole *sc = CTX_wm_space_console(C);
+       ARegion *ar = CTX_wm_region(C);
+       ConsoleLine *ci = console_history_verify(C);
+       int spaces;
+       int len;
+
+       for (spaces = 0; spaces < ci->len; spaces++) {
+               if (ci->line[spaces] != ' ')
+                       break;
+       }
+
+       len = TAB_LENGTH - spaces % TAB_LENGTH;
+
+       console_line_verify_length(ci, ci->len + len);
+
+       memmove(ci->line + len, ci->line, ci->len);
+       memset(ci->line, ' ', len);
+       ci->len += len;
+       console_line_cursor_set(ci, ci->cursor + len);
+
+       console_textview_update_rect(sc, ar);
+       ED_area_tag_redraw(CTX_wm_area(C));
+
+       console_scroll_bottom(ar);
+
+       return OPERATOR_FINISHED;
+}
+
+void CONSOLE_OT_indent(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Indent";
+       ot->description = "Add 4 spaces at line beginning";
+       ot->idname = "CONSOLE_OT_indent";
+
+       /* api callbacks */
+       ot->exec = console_indent_exec;
+       ot->poll = ED_operator_console_active;
+}
+
+static int console_unindent_exec(bContext *C, wmOperator *op)
+{
+       SpaceConsole *sc = CTX_wm_space_console(C);
+       ARegion *ar = CTX_wm_region(C);
+       ConsoleLine *ci = console_history_verify(C);
+       int spaces;
+       int len;
+
+       for (spaces = 0; spaces < ci->len; spaces++) {
+               if (ci->line[spaces] != ' ')
+                       break;
+       }
+
+       if (spaces == 0)
+               return OPERATOR_CANCELLED;
+
+       len = spaces % TAB_LENGTH;
+       if (len == 0)
+               len = TAB_LENGTH;
+
+       console_line_verify_length(ci, ci->len - len);
+
+       memmove(ci->line, ci->line + len, (ci->len - len) + 1);
+       ci->len -= len;
+       console_line_cursor_set(ci, ci->cursor - len);
+
+       //console_select_offset(sc, -4);
+
+       console_textview_update_rect(sc, ar);
+       ED_area_tag_redraw(CTX_wm_area(C));
+
+       console_scroll_bottom(ar);
+
+       return OPERATOR_FINISHED;
+}
+
+void CONSOLE_OT_unindent(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Unindent";
+       ot->description = "Delete 4 spaces from line beginning";
+       ot->idname = "CONSOLE_OT_unindent";
+
+       /* api callbacks */
+       ot->exec = console_unindent_exec;
+       ot->poll = ED_operator_console_active;
+}
 
 static EnumPropertyItem console_delete_type_items[] = {
        {DEL_NEXT_CHAR, "NEXT_CHARACTER", 0, "Next Character", ""},
@@ -757,7 +845,8 @@ void CONSOLE_OT_scrollback_append(wmOperatorType *ot)
                {CONSOLE_LINE_INPUT,    "INPUT", 0, "Input", ""},
                {CONSOLE_LINE_INFO,     "INFO", 0, "Information", ""},
                {CONSOLE_LINE_ERROR,    "ERROR", 0, "Error", ""},
-               {0, NULL, 0, NULL, NULL}};
+               {0, NULL, 0, NULL, NULL}
+       };
 
        /* identifiers */
        ot->name = "Scrollback Append";
index a25606db2b3487c3370ce3d0620ef8017cc4240b..460b31d69bd9fa0f32413b69f861eb37551f064a 100644 (file)
@@ -246,6 +246,9 @@ static void console_operatortypes(void)
        WM_operatortype_append(CONSOLE_OT_move);
        WM_operatortype_append(CONSOLE_OT_delete);
        WM_operatortype_append(CONSOLE_OT_insert);
+
+       WM_operatortype_append(CONSOLE_OT_indent);
+       WM_operatortype_append(CONSOLE_OT_unindent);
        
        /* for use by python only */
        WM_operatortype_append(CONSOLE_OT_history_append); 
@@ -332,7 +335,11 @@ static void console_keymap(struct wmKeyConfig *keyconf)
        
        WM_keymap_add_item(keymap, "CONSOLE_OT_select_set", LEFTMOUSE, KM_PRESS, 0, 0);
 
-       RNA_string_set(WM_keymap_add_item(keymap, "CONSOLE_OT_insert", TABKEY, KM_PRESS, 0, 0)->ptr, "text", "\t"); /* fake tabs */
+       RNA_string_set(WM_keymap_add_item(keymap, "CONSOLE_OT_insert", TABKEY, KM_PRESS, KM_CTRL, 0)->ptr, "text", "\t"); /* fake tabs */
+
+       WM_keymap_add_item(keymap, "CONSOLE_OT_indent", TABKEY, KM_PRESS, 0, 0);
+       WM_keymap_add_item(keymap, "CONSOLE_OT_unindent", TABKEY, KM_PRESS, KM_SHIFT, 0);
+
        WM_keymap_add_item(keymap, "CONSOLE_OT_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last!
 }