forked from bartvdbraak/blender
debug build option WITH_PYTHON_UI_INFO, so you can right click and edit the python source for UI layout directly.
This commit is contained in:
parent
4512f10db9
commit
445279524a
@ -213,6 +213,10 @@ mark_as_advanced(WITH_CXX_GUARDEDALLOC)
|
||||
option(WITH_ASSERT_ABORT "Call abort() when raising an assertion through BLI_assert()" OFF)
|
||||
mark_as_advanced(WITH_ASSERT_ABORT)
|
||||
|
||||
option(WITH_PYTHON_UI_INFO "Allow navigating to UI source from the context menu" OFF)
|
||||
mark_as_advanced(WITH_PYTHON_UI_INFO)
|
||||
|
||||
|
||||
if(APPLE)
|
||||
if(NOT CMAKE_OSX_ARCHITECTURES)
|
||||
set(CMAKE_OSX_ARCHITECTURES x86_64 CACHE STRING
|
||||
@ -1326,6 +1330,10 @@ if(WITH_ASSERT_ABORT)
|
||||
add_definitions(-DWITH_ASSERT_ABORT)
|
||||
endif()
|
||||
|
||||
if(WITH_PYTHON_UI_INFO)
|
||||
add_definitions(-DWITH_PYTHON_UI_INFO)
|
||||
endif()
|
||||
|
||||
# message(STATUS "Using CFLAGS: ${CMAKE_C_FLAGS}")
|
||||
# message(STATUS "Using CXXFLAGS: ${CMAKE_CXX_FLAGS}")
|
||||
|
||||
|
@ -2559,6 +2559,24 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, const char *str,
|
||||
if(block->curlayout)
|
||||
ui_layout_add_but(block->curlayout, but);
|
||||
|
||||
#ifdef WITH_PYTHON_UI_INFO
|
||||
{
|
||||
extern void PyC_FileAndNum_Safe(const char **filename, int *lineno);
|
||||
|
||||
const char *fn;
|
||||
int lineno= -1;
|
||||
PyC_FileAndNum_Safe(&fn, &lineno);
|
||||
if (lineno != -1) {
|
||||
BLI_strncpy(but->py_dbg_fn, fn, sizeof(but->py_dbg_fn));
|
||||
but->py_dbg_ln= lineno;
|
||||
}
|
||||
else {
|
||||
but->py_dbg_fn[0]= '\0';
|
||||
but->py_dbg_ln= -1;
|
||||
}
|
||||
}
|
||||
#endif /* WITH_PYTHON_UI_INFO */
|
||||
|
||||
return but;
|
||||
}
|
||||
|
||||
|
@ -4438,6 +4438,17 @@ static int ui_but_menu(bContext *C, uiBut *but)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WITH_PYTHON_UI_INFO
|
||||
if (but->py_dbg_ln != -1) {
|
||||
PointerRNA ptr_props;
|
||||
|
||||
WM_operator_properties_create(&ptr_props, "WM_OT_text_edit");
|
||||
RNA_string_set(&ptr_props, "filepath", but->py_dbg_fn);
|
||||
RNA_int_set(&ptr_props, "line", but->py_dbg_ln);
|
||||
uiItemFullO(layout, "WM_OT_text_edit", "Edit Source", ICON_NONE, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
|
||||
}
|
||||
#endif /* WITH_PYTHON_UI_INFO */
|
||||
|
||||
uiPupMenuEnd(C, pup);
|
||||
|
||||
return 1;
|
||||
|
@ -252,6 +252,11 @@ struct uiBut {
|
||||
|
||||
/* pointer back */
|
||||
uiBlock *block;
|
||||
|
||||
#ifdef WITH_PYTHON_UI_INFO
|
||||
char py_dbg_fn[240];
|
||||
int py_dbg_ln;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct uiBlock {
|
||||
|
@ -136,7 +136,12 @@ static void text_listener(ScrArea *sa, wmNotifier *wmn)
|
||||
|
||||
switch(wmn->data) {
|
||||
case ND_DISPLAY:
|
||||
ED_area_tag_redraw(sa);
|
||||
break;
|
||||
case ND_CURSOR:
|
||||
if(st->text && st->text == wmn->reference)
|
||||
text_scroll_to_cursor(st, sa);
|
||||
|
||||
ED_area_tag_redraw(sa);
|
||||
break;
|
||||
}
|
||||
|
@ -184,6 +184,15 @@ void PyC_FileAndNum(const char **filename, int *lineno)
|
||||
}
|
||||
}
|
||||
|
||||
void PyC_FileAndNum_Safe(const char **filename, int *lineno)
|
||||
{
|
||||
if(!PYC_INTERPRETER_ACTIVE) {
|
||||
return;
|
||||
}
|
||||
|
||||
PyC_FileAndNum(filename, lineno);
|
||||
}
|
||||
|
||||
/* Would be nice if python had this built in */
|
||||
PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...)
|
||||
{
|
||||
|
@ -36,6 +36,7 @@ PyObject * PyC_ExceptionBuffer(void);
|
||||
PyObject * PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
|
||||
PyObject * PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format, ...);
|
||||
void PyC_FileAndNum(const char **filename, int *lineno);
|
||||
void PyC_FileAndNum_Safe(const char **filename, int *lineno); /* checks python is running */
|
||||
int PyC_AsArray(void *array, PyObject *value, const int length, const PyTypeObject *type, const short is_double, const char *error_prefix);
|
||||
|
||||
/* follow http://www.python.org/dev/peps/pep-0383/ */
|
||||
|
@ -105,6 +105,11 @@
|
||||
|
||||
static GHash *global_ops_hash= NULL;
|
||||
|
||||
#ifdef WITH_PYTHON_UI_INFO
|
||||
# include "DNA_text_types.h"
|
||||
# include "BKE_text.h"
|
||||
#endif
|
||||
|
||||
/* ************ operator API, exported ********** */
|
||||
|
||||
|
||||
@ -3505,6 +3510,79 @@ static void operatortype_ghash_free_cb(wmOperatorType *ot)
|
||||
MEM_freeN(ot);
|
||||
}
|
||||
|
||||
#ifdef WITH_PYTHON_UI_INFO
|
||||
|
||||
static ScrArea *biggest_text_view(bContext *C)
|
||||
{
|
||||
bScreen *sc= CTX_wm_screen(C);
|
||||
ScrArea *sa, *big= NULL;
|
||||
int size, maxsize= 0;
|
||||
|
||||
for(sa= sc->areabase.first; sa; sa= sa->next) {
|
||||
if(sa->spacetype==SPACE_TEXT) {
|
||||
size= sa->winx * sa->winy;
|
||||
if(size > maxsize) {
|
||||
maxsize= size;
|
||||
big= sa;
|
||||
}
|
||||
}
|
||||
}
|
||||
return big;
|
||||
}
|
||||
|
||||
static int wm_text_edit_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Main *bmain= CTX_data_main(C);
|
||||
Text *text;
|
||||
|
||||
char filepath[240];
|
||||
int line= RNA_int_get(op->ptr, "line");
|
||||
RNA_string_get(op->ptr, "filepath", filepath);
|
||||
|
||||
for (text=bmain->text.first; text; text=text->id.next) {
|
||||
if (text->name && BLI_path_cmp(text->name, filepath) == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (text == NULL) {
|
||||
text= add_text(filepath, bmain->name);
|
||||
}
|
||||
|
||||
if (text == NULL) {
|
||||
BKE_reportf(op->reports, RPT_WARNING, "file: '%s' can't be opened", filepath);
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
else {
|
||||
/* naughty!, find text area to set, not good behavior
|
||||
* but since this is a dev tool lets allow it - campbell */
|
||||
ScrArea *sa= biggest_text_view(C);
|
||||
if(sa) {
|
||||
SpaceText *st= sa->spacedata.first;
|
||||
st->text= text;
|
||||
}
|
||||
|
||||
txt_move_toline(text, line - 1, FALSE);
|
||||
WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, text);
|
||||
}
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
static void WM_OT_text_edit(wmOperatorType *ot)
|
||||
{
|
||||
ot->name= "Edit Text File";
|
||||
ot->idname= "WM_OT_text_edit";
|
||||
|
||||
ot->exec= wm_text_edit_exec;
|
||||
|
||||
RNA_def_string_file_path(ot->srna, "filepath", "", FILE_MAX, "Path", "");
|
||||
RNA_def_int(ot->srna, "line", 0, INT_MIN, INT_MAX, "Line", "", 0, INT_MAX);
|
||||
}
|
||||
|
||||
#endif /* WITH_PYTHON_UI_INFO */
|
||||
|
||||
|
||||
/* ******************************************************* */
|
||||
/* called on initialize WM_exit() */
|
||||
void wm_operatortype_free(void)
|
||||
@ -3548,6 +3626,10 @@ void wm_operatortype_init(void)
|
||||
WM_operatortype_append(WM_OT_collada_import);
|
||||
#endif
|
||||
|
||||
#ifdef WITH_PYTHON_UI_INFO
|
||||
WM_operatortype_append(WM_OT_text_edit);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
/* circleselect-like modal operators */
|
||||
|
Loading…
Reference in New Issue
Block a user