UI:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 17 Dec 2008 16:53:56 +0000 (16:53 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 17 Dec 2008 16:53:56 +0000 (16:53 +0000)
* Changed pupmenu function name and added back some standard popups.

source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_regions.c
source/blender/windowmanager/intern/wm_operators.c

index 0540c0b2a25a8baf978bb055fef9482e866d17a6..29d1d653b39b6725b8a23ea662a8b09787eb01b1 100644 (file)
@@ -205,11 +205,13 @@ typedef struct uiMenuBlockHandle {
 typedef uiBlock* (*uiBlockFuncFP)(struct bContext *C, struct uiMenuBlockHandle *handle, void *arg1);
 typedef void (*uiPupmenuFunc)(struct bContext *C, void *arg, int event);
 
-extern void pupmenu_set_active(int val);
-extern void pupmenu_col(struct bContext *C, char *instr, int mx, int my, int maxrow, uiPupmenuFunc func, void *arg);
-extern void pupmenu(struct bContext *C, char *instr, int mx, int my, uiPupmenuFunc func, void *arg);
+void uiPupmenuSetActive(int val);
+void uiPupmenu(struct bContext *C, int maxrow, uiPupmenuFunc func, void *arg, char *str, ...);
 
-void okee_operator(struct bContext *C, char *opname, char *str, ...);
+void uiPupmenuOkee(struct bContext *C, char *opname, char *str, ...);
+void uiPupmenuSaveOver(struct bContext *C, char *opname, char *filename, ...);
+void uiPupmenuNotice(struct bContext *C, char *str, ...);
+void uiPupmenuError(struct bContext *C, char *str, ...);
 
 /* Block */
 
index 057f9863278da9714572d0841c7e1992c4b33185..1d1f8cb44b90327b0e54ad3eabe77b4ec9035a9d 100644 (file)
@@ -165,7 +165,7 @@ static void ui_apply_but_func(bContext *C, uiBut *but)
         * handling is done, i.e. menus are closed, in order to avoid conflicts
         * with these functions removing the buttons we are working with */
 
-       if(but->func || block->handle_func || (but->type == BUTM && block->butm_func)) {
+       if(but->func || block->handle_func || (but->type == BUTM && block->butm_func) || but->opname) {
                after= MEM_callocN(sizeof(uiAfterFunc), "uiAfterFunc");
 
                after->func= but->func;
index e4b3157c6a1dcddcc8b04a8d83468cea935b548e..a6f411951429be36e1a366b052a2b1ba7060fa73 100644 (file)
@@ -1278,7 +1278,7 @@ uiBlock *ui_block_func_COL(bContext *C, uiMenuBlockHandle *handle, void *arg_but
 
 static int pupmenu_set= 0;
 
-void pupmenu_set_active(int val)
+void uiPupmenuSetActive(int val)
 {
        pupmenu_set= val;
 }
@@ -1632,18 +1632,18 @@ uiBlock *ui_block_func_PUPMENUCOL(bContext *C, uiMenuBlockHandle *handle, void *
        return block;
 }
 
-void pupmenu_col(bContext *C, char *instr, int mx, int my, int maxrow, uiPupmenuFunc func, void *arg)
+void uiPupmenu(bContext *C, int maxrow, uiPupmenuFunc func, void *arg, char *str, ...)
 {
        uiPupMenuInfo info;
        uiMenuBlockHandle *menu;
 
        memset(&info, 0, sizeof(info));
-       info.instr= instr;
-       info.mx= mx;
-       info.my= my;
+       info.mx= C->window->eventstate->x;
+       info.my= C->window->eventstate->y;
        info.maxrow= maxrow;
+       info.instr= str;
 
-       menu= ui_menu_block_create(C, NULL, NULL, ui_block_func_PUPMENUCOL, &info);
+       menu= ui_menu_block_create(C, NULL, NULL, ui_block_func_PUPMENU, &info);
        menu->popup= 1;
 
        UI_add_popup_handlers(&C->window->handlers, menu);
@@ -1653,51 +1653,87 @@ void pupmenu_col(bContext *C, char *instr, int mx, int my, int maxrow, uiPupmenu
        menu->popup_arg= arg;
 }
 
-void pupmenu(bContext *C, char *instr, int mx, int my, uiPupmenuFunc func, void *arg)
+/* standard pupmenus */
+
+static void operator_cb(bContext *C, void *arg, int retval)
 {
-       uiPupMenuInfo info;
-       uiMenuBlockHandle *menu;
+       const char *opname= arg;
 
-       memset(&info, 0, sizeof(info));
-       info.instr= instr;
-       info.mx= mx;
-       info.my= my;
+       if(opname && retval > 0)
+               WM_operator_call(C, opname, WM_OP_DEFAULT, NULL);
+}
 
-       menu= ui_menu_block_create(C, NULL, NULL, ui_block_func_PUPMENU, &info);
-       menu->popup= 1;
+static void vconfirm(bContext *C, char *opname, char *title, char *itemfmt, va_list ap)
+{
+       char *s, buf[512];
 
-       UI_add_popup_handlers(&C->window->handlers, menu);
-       WM_event_add_mousemove(C);
+       s= buf;
+       if (title) s+= sprintf(s, "%s%%t|", title);
+       vsprintf(s, itemfmt, ap);
 
-       menu->popup_func= func;
-       menu->popup_arg= arg;
+       uiPupmenu(C, 0, operator_cb, opname, buf);
 }
 
-/* XXX test */
-static void operator_callback(bContext *C, void *arg, int retval)
+static void confirm(bContext *C, char *opname, char *title, char *itemfmt, ...)
 {
-       const char *opname= arg;
+       va_list ap;
 
-       if(retval > 0)
-               WM_operator_call(C, opname, WM_OP_DEFAULT, NULL);
+       va_start(ap, itemfmt);
+       vconfirm(C, opname, title, itemfmt, ap);
+       va_end(ap);
 }
 
-void okee_operator(bContext *C, char *opname, char *str, ...)
+void uiPupmenuOkee(bContext *C, char *opname, char *str, ...)
 {
        va_list ap;
-       char *s, buf[512];
-       int mx, my;
+       char titlestr[256];
 
-       mx= C->window->eventstate->x;
-       my= C->window->eventstate->y;
+       sprintf(titlestr, "OK? %%i%d", ICON_HELP);
 
        va_start(ap, str);
+       vconfirm(C, opname, titlestr, str, ap);
+       va_end(ap);
+}
 
-       s= buf;
-       s += sprintf(s, "OK? %%i%d%%t|", ICON_HELP);
-       vsprintf(s, str, ap);
+void uiPupmenuSaveOver(bContext *C, char *opname, char *filename, ...)
+{
+       size_t len= strlen(filename);
+
+       if(len==0)
+               return;
+
+       if(BLI_exists(filename)==0)
+               operator_cb(C, opname, 1);
+
+       if(filename[len-1]=='/' || filename[len-1]=='\\') {
+               uiPupmenuError(C, "Cannot overwrite a directory");
+               return;
+       }
+
+       confirm(C, opname, "Save over", filename);
+}
+
+void uiPupmenuNotice(bContext *C, char *str, ...)
+{
+       va_list ap;
+
+       va_start(ap, str);
+       vconfirm(C, NULL, NULL, str, ap);
        va_end(ap);
+}
 
-       pupmenu(C, buf, mx, my, operator_callback, opname);
+void uiPupmenuError(bContext *C, char *str, ...)
+{
+       va_list ap;
+       char nfmt[256];
+       char titlestr[256];
+
+       sprintf(titlestr, "Error %%i%d", ICON_ERROR);
+
+       sprintf(nfmt, "%s", str);
+
+       va_start(ap, str);
+       vconfirm(C, NULL, titlestr, nfmt, ap);
+       va_end(ap);
 }
 
index 897b7b23a0efdfafb472144aba7ce578ee97017b..262052c442aa11a7a74c18c9c451c79cd8bb5238 100644 (file)
@@ -102,7 +102,7 @@ int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *event)
        char buf[512];
        
        sprintf(buf, "OK? %%i%d%%t|%s", ICON_HELP, op->type->name);
-       pupmenu(C, buf, event->x, event->y, operator_callback, op);
+       uiPupmenu(C, 0, operator_callback, op, buf);
        
        return 1;
 }