operator macro playback (run operator reports in the console)

- reports can be selected with RMB, Border (bkey) and (de)select all.
- delete reports (X key)
- run operators in the console (R key)
- copy reports (Ctrl+C), can be pasted in the text editor an run with alt+p

Details
- Added "selected_editable_objects" and "selected_editable_bases" to screen_context.c, use the scene layers, this was needed for duplicate to run outside the 3D view.
- RNA_property_as_string converted an array of 1 into "(num)" need a comma so python sees it as a tuple - "(num,)"
- add flag to reports, use for seletion atm.

opens a new world of context bugs :)
This commit is contained in:
Campbell Barton 2009-07-19 00:49:44 +00:00
parent ad2e306b09
commit d7564761c0
15 changed files with 605 additions and 80 deletions

@ -15,19 +15,29 @@ class CONSOLE_HT_header(bpy.types.Header):
layout.template_header()
if context.area.show_menus:
row = layout.row()
row.itemM("CONSOLE_MT_console")
row = layout.row()
row.scale_x = 0.9
row.itemR(sc, "type", expand=True)
if sc.type == 'REPORT':
row.itemR(sc, "show_report_debug")
row.itemR(sc, "show_report_info")
row.itemR(sc, "show_report_operator")
row.itemR(sc, "show_report_warn")
row.itemR(sc, "show_report_error")
if context.area.show_menus:
row = layout.row()
row.itemM("CONSOLE_MT_report")
row.itemR(sc, "show_report_debug", text="Debug")
row.itemR(sc, "show_report_info", text="Info")
row.itemR(sc, "show_report_operator", text="Operators")
row.itemR(sc, "show_report_warn", text="Warnings")
row.itemR(sc, "show_report_error", text="Errors")
row = layout.row()
row.enabled = sc.show_report_operator
row.itemO("console.report_replay")
else:
if context.area.show_menus:
row = layout.row()
row.itemM("CONSOLE_MT_console")
class CONSOLE_MT_console(bpy.types.Menu):
@ -41,6 +51,20 @@ class CONSOLE_MT_console(bpy.types.Menu):
layout.column()
layout.itemO("console.clear")
class CONSOLE_MT_report(bpy.types.Menu):
__space_type__ = "CONSOLE"
__label__ = "Report"
def draw(self, context):
layout = self.layout
sc = context.space_data
layout.column()
layout.itemO("console.select_all_toggle")
layout.itemO("console.select_border")
layout.itemO("console.report_delete")
layout.itemO("console.report_copy")
def add_scrollback(text, text_type):
for l in text.split('\n'):
bpy.ops.console.scrollback_append(text=l.replace('\t', ' '), type=text_type)
@ -97,7 +121,7 @@ class CONSOLE_OT_exec(bpy.types.Operator):
Operator documentatuon text, will be used for the operator tooltip and python docs.
'''
__label__ = "Console Execute"
__register__ = True
__register__ = False
# Both prompts must be the same length
PROMPT = '>>> '
@ -373,7 +397,7 @@ class CONSOLE_OT_autocomplete(bpy.types.Operator):
Operator documentatuon text, will be used for the operator tooltip and python docs.
'''
__label__ = "Console Autocomplete"
__register__ = True
__register__ = False
def poll(self, context):
return context.space_data.type == 'PYTHON'
@ -423,6 +447,7 @@ class CONSOLE_OT_autocomplete(bpy.types.Operator):
bpy.types.register(CONSOLE_HT_header)
bpy.types.register(CONSOLE_MT_console)
bpy.types.register(CONSOLE_MT_report)
bpy.ops.add(CONSOLE_OT_exec)
bpy.ops.add(CONSOLE_OT_autocomplete)

@ -101,7 +101,7 @@ void multiresModifier_join(Object *ob)
/* First find the highest level of subdivision */
base = FIRSTBASE;
while(base) {
if(TESTBASELIB_BGMODE(base) && base->object->type==OB_MESH) {
if(TESTBASELIB_BGMODE(v3d, base) && base->object->type==OB_MESH) {
ModifierData *md;
for(md = base->object->modifiers.first; md; md = md->next) {
if(md->type == eModifierType_Multires) {
@ -124,7 +124,7 @@ void multiresModifier_join(Object *ob)
/* Subdivide all the displacements to the highest level */
base = FIRSTBASE;
while(base) {
if(TESTBASELIB_BGMODE(base) && base->object->type==OB_MESH) {
if(TESTBASELIB_BGMODE(v3d, base) && base->object->type==OB_MESH) {
ModifierData *md = NULL;
MultiresModifierData *mmd = NULL;

@ -1323,7 +1323,18 @@ void make_local_object(Object *ob)
expand_local_object(ob);
}
/* returns true if the Object data is a from an external blend file (libdata) */
/*
* Returns true if the Object is a from an external blend file (libdata)
*/
int object_is_libdata(Object *ob)
{
if (!ob) return 0;
if (ob->proxy) return 0;
if (ob->id.lib) return 1;
return 0;
}
/* Returns true if the Object data is a from an external blend file (libdata) */
int object_data_is_libdata(Object *ob)
{
if(!ob) return 0;

@ -70,6 +70,7 @@ void ED_object_enter_editmode(struct bContext *C, int flag);
void ED_object_base_init_from_view(struct bContext *C, struct Base *base);
/* cleanup */
int object_is_libdata(struct Object *ob);
int object_data_is_libdata(struct Object *ob);
/* constraints */

@ -747,7 +747,7 @@ static void copy_object_set_idnew(Scene *scene, View3D *v3d, int dupflag)
/* XXX check object pointers */
for(base= FIRSTBASE; base; base= base->next) {
if(TESTBASELIB(v3d, base)) {
if(TESTBASELIB_BGMODE(v3d, base)) {
ob= base->object;
relink_constraints(&ob->constraints);
if (ob->pose){

@ -44,7 +44,9 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
if(CTX_data_dir(member)) {
static const char *dir[] = {
"scene", "selected_objects", "selected_bases", "active_base",
"scene", "selected_objects", "selected_bases",
"selected_editable_objects", "selected_editable_bases"
"active_base",
"active_object", "edit_object", NULL};
CTX_data_dir_set(result, dir);
@ -68,6 +70,24 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
return 1;
}
else if(CTX_data_equals(member, "selected_editable_objects") || CTX_data_equals(member, "selected_editable_bases")) {
int selected_editable_objects= CTX_data_equals(member, "selected_editable_objects");
for(base=scene->base.first; base; base=base->next) {
if((base->flag & SELECT) && (base->lay & scene->lay)) {
if((base->object->restrictflag & OB_RESTRICT_VIEW)==0) {
if(0==object_is_libdata(base->object)) {
if(selected_editable_objects)
CTX_data_id_list_add(result, &base->object->id);
else
CTX_data_list_add(result, &scene->id, &RNA_UnknownType, base);
}
}
}
}
return 1;
}
else if(CTX_data_equals(member, "active_base")) {
if(scene->basact)
CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, &scene->basact);

@ -31,6 +31,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <limits.h>
#include "MEM_guardedalloc.h"
@ -53,6 +54,8 @@
#include "BIF_glutil.h"
#include "ED_datafiles.h"
#include "ED_types.h"
#include "UI_interface.h"
#include "UI_resources.h"
@ -89,7 +92,7 @@ static void console_line_color(unsigned char *fg, int type)
}
}
static void console_report_color(unsigned char *fg, int type)
static void console_report_color(unsigned char *fg, unsigned char *bg, Report *report, int bool)
{
/*
if (type & RPT_ERROR_ALL) { fg[0]=220; fg[1]=0; fg[2]=0; }
@ -99,8 +102,30 @@ static void console_report_color(unsigned char *fg, int type)
else if (type & RPT_DEBUG_ALL) { fg[0]=196; fg[1]=196; fg[2]=196; }
else { fg[0]=196; fg[1]=196; fg[2]=196; }
*/
if(report->flag & SELECT) {
fg[0]=255; fg[1]=255; fg[2]=255;
if(bool) {
bg[0]=96; bg[1]=128; bg[2]=255;
}
else {
bg[0]=90; bg[1]=122; bg[2]=249;
}
}
else {
fg[0]=0; fg[1]=0; fg[2]=0;
if(bool) {
bg[0]=120; bg[1]=120; bg[2]=120;
}
else {
bg[0]=114; bg[1]=114; bg[2]=114;
}
}
fg[0]=0; fg[1]=0; fg[2]=0;
}
@ -180,14 +205,14 @@ static int console_draw_string( char *str, int str_len,
#define CONSOLE_DRAW_MARGIN 4
#define CONSOLE_DRAW_SCROLL 16
static int console_text_main__internal(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports, int draw)
static int console_text_main__internal(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports, int draw, int mouse_y, void **mouse_pick)
{
View2D *v2d= &ar->v2d;
ConsoleLine *cl= sc->history.last;
int x_orig=CONSOLE_DRAW_MARGIN, y_orig=CONSOLE_DRAW_MARGIN;
int x,y;
int x,y, y_prev;
int cwidth;
int console_width; /* number of characters that fit into the width of the console (fixed width) */
unsigned char fg[3];
@ -200,6 +225,10 @@ static int console_text_main__internal(struct SpaceConsole *sc, struct ARegion *
x= x_orig; y= y_orig;
if(mouse_y != INT_MAX)
mouse_y += (v2d->cur.ymin+CONSOLE_DRAW_MARGIN);
if(sc->type==CONSOLE_TYPE_PYTHON) {
int prompt_len;
@ -228,6 +257,7 @@ static int console_text_main__internal(struct SpaceConsole *sc, struct ARegion *
y += sc->lheight;
for(cl= sc->scrollback.last; cl; cl= cl->prev) {
y_prev= y;
if(draw)
console_line_color(fg, cl->type);
@ -235,7 +265,7 @@ static int console_text_main__internal(struct SpaceConsole *sc, struct ARegion *
if(!console_draw_string( cl->line, cl->len,
console_width, sc->lheight,
fg, NULL,
ar->winx-CONSOLE_DRAW_MARGIN,
ar->winx-(CONSOLE_DRAW_MARGIN+CONSOLE_DRAW_SCROLL),
v2d->cur.ymin, v2d->cur.ymax,
&x, &y, draw))
{
@ -244,37 +274,39 @@ static int console_text_main__internal(struct SpaceConsole *sc, struct ARegion *
break; /* past the y limits */
}
}
if((mouse_y != INT_MAX) && (mouse_y >= y_prev && mouse_y <= y)) {
*mouse_pick= (void *)cl;
break;
}
}
}
else {
Report *report;
int report_mask= 0;
int bool= 0;
unsigned char bg[3] = {114, 114, 114};
unsigned char bg[3];
if(draw) {
glClearColor(120.0/255.0, 120.0/255.0, 120.0/255.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
}
/* convert our display toggles into a flag compatible with BKE_report flags */
if(sc->rpt_mask & CONSOLE_RPT_DEBUG) report_mask |= RPT_DEBUG_ALL;
if(sc->rpt_mask & CONSOLE_RPT_INFO) report_mask |= RPT_INFO_ALL;
if(sc->rpt_mask & CONSOLE_RPT_OP) report_mask |= RPT_OPERATOR_ALL;
if(sc->rpt_mask & CONSOLE_RPT_WARN) report_mask |= RPT_WARNING_ALL;
if(sc->rpt_mask & CONSOLE_RPT_ERR) report_mask |= RPT_ERROR_ALL;
report_mask= console_report_mask(sc);
for(report=reports->list.last; report; report=report->prev) {
if(report->type & report_mask) {
y_prev= y;
if(draw)
console_report_color(fg, report->type);
console_report_color(fg, bg, report, bool);
if(!console_draw_string( report->message, report->len,
console_width, sc->lheight,
fg, bool?bg:NULL,
ar->winx-CONSOLE_DRAW_MARGIN,
fg, bg,
ar->winx-(CONSOLE_DRAW_MARGIN+CONSOLE_DRAW_SCROLL),
v2d->cur.ymin, v2d->cur.ymax,
&x, &y, draw))
{
@ -283,6 +315,10 @@ static int console_text_main__internal(struct SpaceConsole *sc, struct ARegion *
break; /* past the y limits */
}
}
if((mouse_y != INT_MAX) && (mouse_y >= y_prev && mouse_y <= y)) {
*mouse_pick= (void *)report;
break;
}
bool = !(bool);
}
@ -296,10 +332,17 @@ static int console_text_main__internal(struct SpaceConsole *sc, struct ARegion *
void console_text_main(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports)
{
console_text_main__internal(sc, ar, reports, 1);
console_text_main__internal(sc, ar, reports, 1, INT_MAX, NULL);
}
int console_text_height(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports)
{
return console_text_main__internal(sc, ar, reports, 0);
return console_text_main__internal(sc, ar, reports, 0, INT_MAX, NULL);
}
void *console_text_pick(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports, int mouse_y)
{
void *mouse_pick= NULL;
console_text_main__internal(sc, ar, reports, 0, mouse_y, &mouse_pick);
return (void *)mouse_pick;
}

@ -40,6 +40,7 @@ struct ReportList;
/* console_draw.c */
void console_text_main(struct SpaceConsole *sc, struct ARegion *ar, struct ReportList *reports);
int console_text_height(struct SpaceConsole *sc, struct ARegion *ar, struct ReportList *reports); /* needed to calculate the scrollbar */
void *console_text_pick(struct SpaceConsole *sc, struct ARegion *ar, struct ReportList *reports, int mouse_y); /* needed for selection */
/* console_ops.c */
void console_history_free(SpaceConsole *sc, ConsoleLine *cl);
@ -49,6 +50,8 @@ ConsoleLine *console_scrollback_add_str(const bContext *C, char *str, int own);
ConsoleLine *console_history_verify(const bContext *C);
int console_report_mask(SpaceConsole *sc);
void CONSOLE_OT_move(wmOperatorType *ot);
void CONSOLE_OT_delete(wmOperatorType *ot);
@ -61,9 +64,16 @@ void CONSOLE_OT_clear(wmOperatorType *ot);
void CONSOLE_OT_history_cycle(wmOperatorType *ot);
void CONSOLE_OT_zoom(wmOperatorType *ot);
/* DUMMY OPS. python will replace */
void CONSOLE_OT_exec(wmOperatorType *ot);
void CONSOLE_OT_autocomplete(wmOperatorType *ot);
/* console_report.c */
void CONSOLE_OT_select_pick(wmOperatorType *ot); /* report selection */
void CONSOLE_OT_select_all_toggle(wmOperatorType *ot);
void CONSOLE_OT_select_border(wmOperatorType *ot);
void CONSOLE_OT_report_replay(wmOperatorType *ot);
void CONSOLE_OT_report_delete(wmOperatorType *ot);
void CONSOLE_OT_report_copy(wmOperatorType *ot);
enum { LINE_BEGIN, LINE_END, PREV_CHAR, NEXT_CHAR, PREV_WORD, NEXT_WORD };
enum { DEL_ALL, DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_SELECTION, DEL_NEXT_SEL, DEL_PREV_SEL };

@ -22,7 +22,7 @@
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
*/
@ -49,13 +49,12 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
// #include "BKE_suggestions.h"
//#include "BKE_text.h"
#include "WM_api.h"
#include "WM_types.h"
#include "ED_screen.h"
#include "ED_types.h"
#include "UI_interface.h"
#include "UI_resources.h"
@ -210,8 +209,8 @@ static int console_edit_poll(bContext *C)
return 1;
}
/* static funcs for text editing */
/* static funcs for text editing */
/* similar to the text editor, with some not used. keep compatible */
static EnumPropertyItem move_type_items[]= {
@ -579,17 +578,3 @@ void CONSOLE_OT_zoom(wmOperatorType *ot)
/* properties */
RNA_def_int(ot->srna, "delta", 0, 0, INT_MAX, "Delta", "Scale the view font.", 0, 1000);
}
/* Dummy operators, python will replace these, so blender can start without any errors */
void CONSOLE_OT_exec(wmOperatorType *ot)
{
/* identifiers */
ot->name= "CONSOLE_OT_exec dummy";
ot->idname= "CONSOLE_OT_exec";
}
void CONSOLE_OT_autocomplete(wmOperatorType *ot)
{
/* identifiers */
ot->name= "CONSOLE_OT_autocomplete dummy";
ot->idname= "CONSOLE_OT_autocomplete";
}

@ -0,0 +1,414 @@
/**
* $Id: console_ops.c 21679 2009-07-18 16:27:25Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
*/
#include <stdlib.h>
#include <string.h>
#include "MEM_guardedalloc.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h"
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
#include "PIL_time.h"
#include "BKE_utildefines.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
#include "WM_api.h"
#include "WM_types.h"
#include "ED_screen.h"
#include "ED_types.h"
#include "UI_interface.h"
#include "UI_resources.h"
#include "RNA_access.h"
#include "RNA_define.h"
#include "console_intern.h"
int console_report_mask(SpaceConsole *sc)
{
int report_mask = 0;
if(sc->rpt_mask & CONSOLE_RPT_DEBUG) report_mask |= RPT_DEBUG_ALL;
if(sc->rpt_mask & CONSOLE_RPT_INFO) report_mask |= RPT_INFO_ALL;
if(sc->rpt_mask & CONSOLE_RPT_OP) report_mask |= RPT_OPERATOR_ALL;
if(sc->rpt_mask & CONSOLE_RPT_WARN) report_mask |= RPT_WARNING_ALL;
if(sc->rpt_mask & CONSOLE_RPT_ERR) report_mask |= RPT_ERROR_ALL;
return report_mask;
}
static int console_report_poll(bContext *C)
{
SpaceConsole *sc= CTX_wm_space_console(C);
if(!sc || sc->type != CONSOLE_TYPE_REPORT)
return 0;
return 1;
}
static int report_replay_exec(bContext *C, wmOperator *op)
{
SpaceConsole *sc= CTX_wm_space_console(C);
ReportList *reports= CTX_wm_reports(C);
int report_mask= console_report_mask(sc);
Report *report;
sc->type= CONSOLE_TYPE_PYTHON;
for(report=reports->list.last; report; report=report->prev) {
if((report->type & report_mask) && (report->type & RPT_OPERATOR_ALL) && (report->flag & SELECT)) {
console_history_add_str(C, report->message, 0);
WM_operator_name_call(C, "CONSOLE_OT_exec", WM_OP_EXEC_DEFAULT, NULL);
ED_area_tag_redraw(CTX_wm_area(C));
}
}
sc->type= CONSOLE_TYPE_REPORT;
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
}
void CONSOLE_OT_report_replay(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Replay Operators";
ot->idname= "CONSOLE_OT_report_replay";
/* api callbacks */
ot->poll= console_report_poll;
ot->exec= report_replay_exec;
/* flags */
/* ot->flag= OPTYPE_REGISTER; */
/* properties */
}
static int select_report_pick_exec(bContext *C, wmOperator *op)
{
int report_index= RNA_int_get(op->ptr, "report_index");
Report *report= BLI_findlink(&CTX_wm_reports(C)->list, report_index);
if(!report)
return OPERATOR_CANCELLED;
report->flag ^= SELECT; /* toggle */
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
}
static int select_report_pick_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceConsole *sc= CTX_wm_space_console(C);
ARegion *ar= CTX_wm_region(C);
ReportList *reports= CTX_wm_reports(C);
Report *report;
report= console_text_pick(sc, ar, reports, event->mval[1]);
RNA_int_set(op->ptr, "report_index", BLI_findindex(&reports->list, report));
return select_report_pick_exec(C, op);
}
void CONSOLE_OT_select_pick(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select report";
ot->idname= "CONSOLE_OT_select_pick";
/* api callbacks */
ot->poll= console_report_poll;
ot->invoke= select_report_pick_invoke;
ot->exec= select_report_pick_exec;
/* flags */
/* ot->flag= OPTYPE_REGISTER; */
/* properties */
RNA_def_int(ot->srna, "report_index", 0, 0, INT_MAX, "Report", "The index of the report.", 0, INT_MAX);
}
static int report_select_all_toggle_exec(bContext *C, wmOperator *op)
{
SpaceConsole *sc= CTX_wm_space_console(C);
ReportList *reports= CTX_wm_reports(C);
int report_mask= console_report_mask(sc);
int deselect= 0;
Report *report;
for(report=reports->list.last; report; report=report->prev) {
if((report->type & report_mask) && (report->flag & SELECT)) {
deselect= 1;
break;
}
}
if(deselect) {
for(report=reports->list.last; report; report=report->prev)
if(report->type & report_mask)
report->flag &= ~SELECT;
}
else {
for(report=reports->list.last; report; report=report->prev)
if(report->type & report_mask)
report->flag |= SELECT;
}
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
}
void CONSOLE_OT_select_all_toggle(wmOperatorType *ot)
{
/* identifiers */
ot->name= "(De)Select All";
ot->idname= "CONSOLE_OT_select_all_toggle";
/* api callbacks */
ot->poll= console_report_poll;
ot->exec= report_select_all_toggle_exec;
/* flags */
/*ot->flag= OPTYPE_REGISTER;*/
/* properties */
}
/* borderselect operator */
static int borderselect_exec(bContext *C, wmOperator *op)
{
SpaceConsole *sc= CTX_wm_space_console(C);
ARegion *ar= CTX_wm_region(C);
ReportList *reports= CTX_wm_reports(C);
int report_mask= console_report_mask(sc);
Report *report_min, *report_max, *report;
//View2D *v2d= UI_view2d_fromcontext(C);
rcti rect;
//rctf rectf, rq;
int val;
//short mval[2];
val= RNA_int_get(op->ptr, "event_type");
rect.xmin= RNA_int_get(op->ptr, "xmin");
rect.ymin= RNA_int_get(op->ptr, "ymin");
rect.xmax= RNA_int_get(op->ptr, "xmax");
rect.ymax= RNA_int_get(op->ptr, "ymax");
/*
mval[0]= rect.xmin;
mval[1]= rect.ymin;
UI_view2d_region_to_view(v2d, mval[0], mval[1], &rectf.xmin, &rectf.ymin);
mval[0]= rect.xmax;
mval[1]= rect.ymax;
UI_view2d_region_to_view(v2d, mval[0], mval[1], &rectf.xmax, &rectf.ymax);
*/
report_min= console_text_pick(sc, ar, reports, rect.ymax);
report_max= console_text_pick(sc, ar, reports, rect.ymin);
/* get the first report if none found */
if(report_min==NULL) {
printf("find_min\n");
for(report=reports->list.first; report; report=report->next) {
if(report->type & report_mask) {
report_min= report;
break;
}
}
}
if(report_max==NULL) {
printf("find_max\n");
for(report=reports->list.last; report; report=report->prev) {
if(report->type & report_mask) {
report_max= report;
break;
}
}
}
if(report_min==NULL || report_max==NULL)
return OPERATOR_CANCELLED;
for(report= report_min; (report != report_max->next); report= report->next) {
if((report->type & report_mask)==0)
continue;
if(val==LEFTMOUSE) report->flag |= SELECT;
else report->flag &= ~SELECT;
}
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
}
/* ****** Border Select ****** */
void CONSOLE_OT_select_border(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Border Select";
ot->idname= "CONSOLE_OT_select_border";
/* api callbacks */
ot->invoke= WM_border_select_invoke;
ot->exec= borderselect_exec;
ot->modal= WM_border_select_modal;
ot->poll= console_report_poll;
/* flags */
/* ot->flag= OPTYPE_REGISTER; */
/* rna */
RNA_def_int(ot->srna, "event_type", 0, INT_MIN, INT_MAX, "Event Type", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX);
}
static int report_delete_exec(bContext *C, wmOperator *op)
{
SpaceConsole *sc= CTX_wm_space_console(C);
ReportList *reports= CTX_wm_reports(C);
int report_mask= console_report_mask(sc);
Report *report, *report_next;
for(report=reports->list.first; report; ) {
report_next=report->next;
if((report->type & report_mask) && (report->flag & SELECT)) {
BLI_remlink(&reports->list, report);
MEM_freeN(report->message);
MEM_freeN(report);
}
report= report_next;
}
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
}
void CONSOLE_OT_report_delete(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Delete Reports";
ot->idname= "CONSOLE_OT_report_delete";
/* api callbacks */
ot->poll= console_report_poll;
ot->exec= report_delete_exec;
/* flags */
/*ot->flag= OPTYPE_REGISTER;*/
/* properties */
}
static int report_copy_exec(bContext *C, wmOperator *op)
{
SpaceConsole *sc= CTX_wm_space_console(C);
ReportList *reports= CTX_wm_reports(C);
int report_mask= console_report_mask(sc);
Report *report;
DynStr *buf_dyn= BLI_dynstr_new();
char *buf_str;
for(report=reports->list.first; report; report= report->next) {
if((report->type & report_mask) && (report->flag & SELECT)) {
BLI_dynstr_append(buf_dyn, report->message);
BLI_dynstr_append(buf_dyn, "\n");
}
}
buf_str= BLI_dynstr_get_cstring(buf_dyn);
BLI_dynstr_free(buf_dyn);
WM_clipboard_text_set(buf_str, 0);
MEM_freeN(buf_str);
return OPERATOR_FINISHED;
}
void CONSOLE_OT_report_copy(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Copy Reports to Clipboard";
ot->idname= "CONSOLE_OT_report_copy";
/* api callbacks */
ot->poll= console_report_poll;
ot->exec= report_copy_exec;
/* flags */
/*ot->flag= OPTYPE_REGISTER;*/
/* properties */
}

@ -203,6 +203,7 @@ static void console_main_area_draw(const bContext *C, ARegion *ar)
void console_operatortypes(void)
{
/* console_ops.c */
WM_operatortype_append(CONSOLE_OT_move);
WM_operatortype_append(CONSOLE_OT_delete);
WM_operatortype_append(CONSOLE_OT_insert);
@ -211,14 +212,19 @@ void console_operatortypes(void)
WM_operatortype_append(CONSOLE_OT_history_append);
WM_operatortype_append(CONSOLE_OT_scrollback_append);
WM_operatortype_append(CONSOLE_OT_clear);
WM_operatortype_append(CONSOLE_OT_history_cycle);
WM_operatortype_append(CONSOLE_OT_zoom);
/* Dummy, defined in space_console.py */
WM_operatortype_append(CONSOLE_OT_exec);
WM_operatortype_append(CONSOLE_OT_autocomplete);
/* console_report.c */
WM_operatortype_append(CONSOLE_OT_select_pick);
WM_operatortype_append(CONSOLE_OT_select_all_toggle);
WM_operatortype_append(CONSOLE_OT_select_border);
WM_operatortype_append(CONSOLE_OT_report_replay);
WM_operatortype_append(CONSOLE_OT_report_delete);
WM_operatortype_append(CONSOLE_OT_report_copy);
}
void console_keymap(struct wmWindowManager *wm)
@ -275,6 +281,21 @@ void console_keymap(struct wmWindowManager *wm)
WM_keymap_add_item(keymap, "CONSOLE_OT_autocomplete", RETKEY, KM_PRESS, KM_CTRL, 0); /* python operator - space_text.py */
#endif
/* report selection */
WM_keymap_add_item(keymap, "CONSOLE_OT_select_pick", SELECTMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CONSOLE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CONSOLE_OT_select_border", BKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CONSOLE_OT_report_replay", RKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CONSOLE_OT_report_delete", XKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CONSOLE_OT_report_delete", DELKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CONSOLE_OT_report_copy", CKEY, KM_PRESS, KM_CTRL, 0);
RNA_string_set(WM_keymap_add_item(keymap, "CONSOLE_OT_insert", TABKEY, KM_PRESS, 0, 0)->ptr, "text", " "); /* fake tabs */
WM_keymap_add_item(keymap, "CONSOLE_OT_insert", KM_TEXTINPUT, KM_PRESS, KM_ANY, 0); // last!
}

@ -591,24 +591,12 @@ static void view3d_tools_area_draw(const bContext *C, ARegion *ar)
ED_region_panels(C, ar, 1, view3d_context_string(C));
}
/*
* Returns true if the Object is a from an external blend file (libdata)
*/
static int object_is_libdata(Object *ob)
{
if (!ob) return 0;
if (ob->proxy) return 0;
if (ob->id.lib) return 1;
return 0;
}
static int view3d_context(const bContext *C, const char *member, bContextDataResult *result)
{
View3D *v3d= CTX_wm_view3d(C);
Scene *scene= CTX_data_scene(C);
Base *base;
if(v3d==NULL) return 0;
int lay = v3d ? v3d->lay:scene->lay; /* fallback to the scene layer, allows duplicate and other oject operators to run outside the 3d view */
if(CTX_data_dir(member)) {
static const char *dir[] = {
@ -624,7 +612,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
int selected_objects= CTX_data_equals(member, "selected_objects");
for(base=scene->base.first; base; base=base->next) {
if((base->flag & SELECT) && (base->lay & v3d->lay)) {
if((base->flag & SELECT) && (base->lay & lay)) {
if((base->object->restrictflag & OB_RESTRICT_VIEW)==0) {
if(selected_objects)
CTX_data_id_list_add(result, &base->object->id);
@ -640,7 +628,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
int selected_editable_objects= CTX_data_equals(member, "selected_editable_objects");
for(base=scene->base.first; base; base=base->next) {
if((base->flag & SELECT) && (base->lay & v3d->lay)) {
if((base->flag & SELECT) && (base->lay & lay)) {
if((base->object->restrictflag & OB_RESTRICT_VIEW)==0) {
if(0==object_is_libdata(base->object)) {
if(selected_editable_objects)
@ -658,7 +646,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
int visible_objects= CTX_data_equals(member, "visible_objects");
for(base=scene->base.first; base; base=base->next) {
if(base->lay & v3d->lay) {
if(base->lay & lay) {
if((base->object->restrictflag & OB_RESTRICT_VIEW)==0) {
if(visible_objects)
CTX_data_id_list_add(result, &base->object->id);
@ -674,7 +662,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
int selectable_objects= CTX_data_equals(member, "selectable_objects");
for(base=scene->base.first; base; base=base->next) {
if(base->lay & v3d->lay) {
if(base->lay & lay) {
if((base->object->restrictflag & OB_RESTRICT_VIEW)==0 && (base->object->restrictflag & OB_RESTRICT_SELECT)==0) {
if(selectable_objects)
CTX_data_id_list_add(result, &base->object->id);
@ -687,14 +675,14 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
return 1;
}
else if(CTX_data_equals(member, "active_base")) {
if(scene->basact && (scene->basact->lay & v3d->lay))
if(scene->basact && (scene->basact->lay & lay))
if((scene->basact->object->restrictflag & OB_RESTRICT_VIEW)==0)
CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, scene->basact);
return 1;
}
else if(CTX_data_equals(member, "active_object")) {
if(scene->basact && (scene->basact->lay & v3d->lay))
if(scene->basact && (scene->basact->lay & lay))
if((scene->basact->object->restrictflag & OB_RESTRICT_VIEW)==0)
CTX_data_id_pointer_set(result, &scene->basact->object->id);

@ -801,7 +801,7 @@ typedef struct Scene {
/* depricate this! */
#define TESTBASE(v3d, base) ( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0) )
#define TESTBASELIB(v3d, base) ( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
#define TESTBASELIB_BGMODE(base) ( ((base)->flag & SELECT) && ((base)->lay & (v3d ? v3d->lay : scene->lay)) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
#define TESTBASELIB_BGMODE(v3d, base) ( ((base)->flag & SELECT) && ((base)->lay & (v3d ? v3d->lay : scene->lay)) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
#define BASE_SELECTABLE(v3d, base) ((base->lay & v3d->lay) && (base->object->restrictflag & (OB_RESTRICT_SELECT|OB_RESTRICT_VIEW))==0)
#define FIRSTBASE scene->base.first
#define LASTBASE scene->base.last

@ -77,7 +77,8 @@ enum ReportListFlags {
};
typedef struct Report {
struct Report *next, *prev;
int type; /* ReportType */
short type; /* ReportType */
short flag;
int len; /* strlen(message), saves some time calculating the word wrap */
char *typestr;
char *message;

@ -2647,6 +2647,8 @@ char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop)
for(i=0; i<len; i++) {
BLI_dynstr_appendf(dynstr, i?", %s":"%s", RNA_property_boolean_get_index(ptr, prop, i) ? "True" : "False");
}
if(len==1)
BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
BLI_dynstr_append(dynstr, ")");
}
break;
@ -2659,6 +2661,8 @@ char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop)
for(i=0; i<len; i++) {
BLI_dynstr_appendf(dynstr, i?", %d":"%d", RNA_property_int_get_index(ptr, prop, i));
}
if(len==1)
BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
BLI_dynstr_append(dynstr, ")");
}
break;
@ -2671,6 +2675,8 @@ char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop)
for(i=0; i<len; i++) {
BLI_dynstr_appendf(dynstr, i?", %g":"%g", RNA_property_float_get_index(ptr, prop, i));
}
if(len==1)
BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
BLI_dynstr_append(dynstr, ")");
}
break;