* Added description string to operator types, should be set along with ot->idname...
authorCampbell Barton <ideasman42@gmail.com>
Thu, 12 Feb 2009 03:39:56 +0000 (03:39 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 12 Feb 2009 03:39:56 +0000 (03:39 +0000)
* User interface uses this as a tooltip when NULL or "" is given.
* Python doc generation includes this description
* Python defined ops take the description as an argument.

* NULL check to image_ops.c, was crashing on exit when there was an image open.

source/blender/editors/interface/interface.c
source/blender/editors/space_image/image_ops.c
source/blender/editors/space_sequencer/sequencer_add.c
source/blender/makesdna/DNA_windowmanager_types.h
source/blender/python/epy_doc_gen.py
source/blender/python/intern/bpy_opwrapper.c
source/blender/windowmanager/intern/wm_operators.c

index c2c15a4cd5cef26d5a3fb80bf3395629c5134250..c4bd05f8076f7c9296511c2b1f3bfdf1043a9291 100644 (file)
@@ -2308,6 +2308,10 @@ uiBut *ui_def_but_operator(uiBlock *block, int type, char *opname, int opcontext
                if(ot) str= ot->name;
                else str= opname;
        }
+       
+       if ((!tip || tip[0]=='\0') && ot->description) {
+               tip= ot->description;
+       }
 
        but= ui_def_but(block, type, -1, str, x1, y1, x2, y2, NULL, 0, 0, 0, 0, tip);
        but->opname= opname;
index e24e7254553cd3ab909a3bae2a7a923676899072..51bca9d4fcc56d64714ab1af119f3eabd68b63c0 100644 (file)
@@ -1221,6 +1221,9 @@ static void sample_draw(const bContext *C, ARegion *ar, void *arg_info)
        ImBuf *ibuf= ED_space_image_buffer(sima);
        ImageSampleInfo *info= arg_info;
 
+       if(ibuf == NULL)
+               return;
+       
        draw_image_info(ar, ibuf->channels, info->x, info->y, info->colp,
                info->colfp, info->zp, info->zfp);
 }
index 5ab149ff6ca6d1c24954e7c5515416667b29eec4..c91972ec4f31d9eb2b506bb4fafcdd07cc7b40d1 100644 (file)
@@ -213,6 +213,7 @@ void SEQUENCER_OT_add_scene_strip(struct wmOperatorType *ot)
        /* identifiers */
        ot->name= "Add Scene Strip";
        ot->idname= "SEQUENCER_OT_add_scene_strip";
+       ot->description= "Add a strip to the sequencer using a blender scene as a source";
 
        /* api callbacks */
        ot->invoke= sequencer_add_scene_strip_invoke;
@@ -300,6 +301,7 @@ void SEQUENCER_OT_add_movie_strip(struct wmOperatorType *ot)
        /* identifiers */
        ot->name= "Add Movie Strip";
        ot->idname= "SEQUENCER_OT_add_movie_strip";
+       ot->description= "Add a movie strip to the sequencer";
 
        /* api callbacks */
        ot->invoke= sequencer_add_movie_strip_invoke;
@@ -400,6 +402,7 @@ void SEQUENCER_OT_add_sound_strip(struct wmOperatorType *ot)
        /* identifiers */
        ot->name= "Add Sound Strip";
        ot->idname= "SEQUENCER_OT_add_sound_strip";
+       ot->description= "Add a sound strip to the sequencer";
 
        /* api callbacks */
        ot->invoke= sequencer_add_sound_strip_invoke;
@@ -492,6 +495,7 @@ void SEQUENCER_OT_add_image_strip(struct wmOperatorType *ot)
        /* identifiers */
        ot->name= "Add Image Strip";
        ot->idname= "SEQUENCER_OT_add_image_strip";
+       ot->description= "Add an image or image sequence to the sequencer";
 
        /* api callbacks */
        ot->invoke= sequencer_add_image_strip_invoke;
@@ -623,6 +627,7 @@ void SEQUENCER_OT_add_effect_strip(struct wmOperatorType *ot)
        /* identifiers */
        ot->name= "Add Effect Strip";
        ot->idname= "SEQUENCER_OT_add_effect_strip";
+       ot->description= "Add an effect to the sequencer, most are applied ontop of existing strips";
 
        /* api callbacks */
        ot->invoke= sequencer_add_effect_strip_invoke;
index 822f081f9a8d416567d8658ae27780685512db20..e0f55ac535614253c654172c912312edd29abde5 100644 (file)
@@ -123,7 +123,8 @@ typedef struct wmOperatorType {
        struct wmOperatorType *next, *prev;
        
        char *name;             /* text for ui, undo */
-       char *idname;   /* unique identifier */
+       char *idname;           /* unique identifier */
+       char *description;      /* tooltips and python docs */
        
        /* this callback executes the operator without any interactive input,
         * parameters may be provided through operator properties. cannot use
index afe5468070b0160ad3000c6fd7d3d99bd02e878d..afe9acff36d7b3de558e7d22b54f4ede6006e895 100644 (file)
@@ -265,6 +265,7 @@ def op2epy(target_path):
                
                out.write('def %s(%s):\n' % (op, ', '.join(kw_args)))
                out.write('\t"""\n')
+               out.write('\t%s\n' % rna_struct.description)
                for desc in kw_arg_attrs:
                        out.write('\t%s\n' % desc)
                out.write('\t@rtype: None\n')
index 8a644f51b2469b9ab97912082d03397432bb96cc..ca6104d087f5a755b2cbf4263ddd3ca45ad691ef 100644 (file)
@@ -44,6 +44,7 @@ typedef struct PyOperatorType {
        void *next, *prev;
        char idname[OP_MAX_TYPENAME];
        char name[OP_MAX_TYPENAME];
+       char description[OP_MAX_TYPENAME]; // XXX should be longer?
        PyObject *py_invoke;
        PyObject *py_exec;
 } PyOperatorType;
@@ -276,6 +277,7 @@ void PYTHON_OT_wrapper(wmOperatorType *ot, void *userdata)
        /* identifiers */
        ot->name= pyot->name;
        ot->idname= pyot->idname;
+       ot->description= pyot->description;
 
        /* api callbacks */
        if (pyot->py_invoke != Py_None)
@@ -342,10 +344,11 @@ PyObject *PYOP_wrap_add(PyObject *self, PyObject *args)
 
        char *idname= NULL;
        char *name= NULL;
+       char *description= NULL;
        PyObject *invoke= NULL;
        PyObject *exec= NULL;
 
-       if (!PyArg_ParseTuple(args, "ssOO", &idname, &name, &invoke, &exec)) {
+       if (!PyArg_ParseTuple(args, "sssOO", &idname, &name, &description, &invoke, &exec)) {
                PyErr_SetString( PyExc_AttributeError, "expected 2 strings and 2 function objects");
                return NULL;
        }
@@ -362,8 +365,9 @@ PyObject *PYOP_wrap_add(PyObject *self, PyObject *args)
 
        pyot= MEM_callocN(sizeof(PyOperatorType), "PyOperatorType");
 
-       strcpy(pyot->idname, idname);
-       strcpy(pyot->name, name);
+       strncpy(pyot->idname, idname, sizeof(pyot->idname));
+       strncpy(pyot->name, name, sizeof(pyot->name));
+       strncpy(pyot->description, description, sizeof(pyot->description));
        pyot->py_invoke= invoke;
        pyot->py_exec= exec;
        Py_INCREF(invoke);
index 5ebca6842b1fea2cfa476dba8408a176f4792441..eb0d9d312e94722ac27e61651a38d97eedb0846b 100644 (file)
@@ -101,7 +101,7 @@ void WM_operatortype_append(void (*opfunc)(wmOperatorType*))
        ot= MEM_callocN(sizeof(wmOperatorType), "operatortype");
        ot->srna= RNA_def_struct(&BLENDER_RNA, "", "OperatorProperties");
        opfunc(ot);
-       RNA_def_struct_ui_text(ot->srna, ot->name, "DOC_BROKEN"); /* TODO - add a discription to wmOperatorType? */
+       RNA_def_struct_ui_text(ot->srna, ot->name, ot->description ? ot->description:""); // XXX All ops should have a description but for now allow them not to.
        RNA_def_struct_identifier(ot->srna, ot->idname);
        BLI_addtail(&global_ops, ot);
 }