[Bf-blender-cvs] [3b92a94] master: UI: update dynamic tips

Campbell Barton noreply at git.blender.org
Tue Feb 2 04:26:12 CET 2016


Commit: 3b92a9472c4cee8df98eb79e6be6b2f8b14c8b59
Author: Campbell Barton
Date:   Tue Feb 2 14:13:57 2016 +1100
Branches: master
https://developer.blender.org/rB3b92a9472c4cee8df98eb79e6be6b2f8b14c8b59

UI: update dynamic tips

Useful for progress ETA to continuously update.

This adds API option not to activate new regions GL state which isn't needed in many cases.

===================================================================

M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/screen/area.c
M	source/blender/editors/screen/screen_edit.c
M	source/blender/windowmanager/intern/wm_subwindow.c
M	source/blender/windowmanager/wm_subwindow.h

===================================================================

diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index d4b723b..617b0d1 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -705,6 +705,7 @@ void    UI_but_func_drawextra_set(
 void    UI_but_func_menu_step_set(uiBut *but, uiMenuStepFunc func);
 
 void    UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *argN);
+void    UI_but_tooltip_refresh(struct bContext *C, uiBut *but);
 void    UI_but_tooltip_timer_remove(struct bContext *C, uiBut *but);
 
 bool UI_textbutton_activate_rna(const struct bContext *C, struct ARegion *ar,
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index cb2b99d..ffebd39 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -1207,6 +1207,11 @@ void UI_block_update_from_old(const bContext *C, uiBlock *block)
 	for (but = block->buttons.first; but; but = but->next) {
 		if (ui_but_update_from_old_block(C, block, &but, &but_old)) {
 			ui_but_update(but);
+
+			/* redraw dynamic tooltip if we have one open */
+			if (but->tip_func) {
+				UI_but_tooltip_refresh((bContext *)C, but);
+			}
 		}
 	}
 
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 829fa6b..8e58ed5 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -7526,6 +7526,20 @@ static bool button_modal_state(uiHandleButtonState state)
 	            BUTTON_STATE_MENU_OPEN);
 }
 
+/**
+ * Recreate tooltip (use to update dynamic tips)
+ */
+void UI_but_tooltip_refresh(bContext *C, uiBut *but)
+{
+	uiHandleButtonData *data;
+
+	data = but->active;
+	if (data && data->tooltip) {
+		ui_tooltip_free(C, data->tooltip);
+		data->tooltip = ui_tooltip_create(C, data->region, but);
+	}
+}
+
 /* removes tooltip timer from active but (meaning tooltip is disabled until it's reenabled again) */
 void UI_but_tooltip_timer_remove(bContext *C, uiBut *but)
 {
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 0e4dd70..d39b708 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -1339,7 +1339,7 @@ static void area_calc_totrct(ScrArea *sa, int sizex, int sizey)
 
 
 /* used for area initialize below */
-static void region_subwindow(wmWindow *win, ARegion *ar)
+static void region_subwindow(wmWindow *win, ARegion *ar, bool activate)
 {
 	bool hidden = (ar->flag & (RGN_FLAG_HIDDEN | RGN_FLAG_TOO_SMALL)) != 0;
 
@@ -1351,10 +1351,12 @@ static void region_subwindow(wmWindow *win, ARegion *ar)
 			wm_subwindow_close(win, ar->swinid);
 		ar->swinid = 0;
 	}
-	else if (ar->swinid == 0)
-		ar->swinid = wm_subwindow_open(win, &ar->winrct);
-	else 
-		wm_subwindow_position(win, ar->swinid, &ar->winrct);
+	else if (ar->swinid == 0) {
+		ar->swinid = wm_subwindow_open(win, &ar->winrct, activate);
+	}
+	else {
+		wm_subwindow_position(win, ar->swinid, &ar->winrct, activate);
+	}
 }
 
 static void ed_default_handlers(wmWindowManager *wm, ScrArea *sa, ListBase *handlers, int flag)
@@ -1457,7 +1459,7 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
 	
 	/* region windows, default and own handlers */
 	for (ar = sa->regionbase.first; ar; ar = ar->next) {
-		region_subwindow(win, ar);
+		region_subwindow(win, ar, false);
 		
 		if (ar->swinid) {
 			/* default region handlers */
@@ -1498,10 +1500,10 @@ void ED_region_update_rect(bContext *C, ARegion *ar)
 void ED_region_init(bContext *C, ARegion *ar)
 {
 //	ARegionType *at = ar->type;
-	
+
 	/* refresh can be called before window opened */
-	region_subwindow(CTX_wm_window(C), ar);
-	
+	region_subwindow(CTX_wm_window(C), ar, false);
+
 	region_update_rect(ar);
 }
 
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index a5b2564..fce2ef3 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -1233,10 +1233,12 @@ void ED_screen_refresh(wmWindowManager *wm, wmWindow *win)
 		
 		screen_test_scale(win->screen, winsize_x, winsize_y);
 		
-		if (win->screen->mainwin == 0)
-			win->screen->mainwin = wm_subwindow_open(win, &winrct);
-		else
-			wm_subwindow_position(win, win->screen->mainwin, &winrct);
+		if (win->screen->mainwin == 0) {
+			win->screen->mainwin = wm_subwindow_open(win, &winrct, false);
+		}
+		else {
+			wm_subwindow_position(win, win->screen->mainwin, &winrct, false);
+		}
 		
 		for (sa = win->screen->areabase.first; sa; sa = sa->next) {
 			/* set spacetype and region callbacks, calls init() */
diff --git a/source/blender/windowmanager/intern/wm_subwindow.c b/source/blender/windowmanager/intern/wm_subwindow.c
index 7dade62..a0279e5 100644
--- a/source/blender/windowmanager/intern/wm_subwindow.c
+++ b/source/blender/windowmanager/intern/wm_subwindow.c
@@ -192,7 +192,7 @@ void wm_subwindow_rect_set(wmWindow *win, int swinid, const rcti *rect)
 
 /* always sets pixel-precise 2D window/view matrices */
 /* coords is in whole pixels. xmin = 15, xmax = 16: means window is 2 pix big */
-int wm_subwindow_open(wmWindow *win, const rcti *winrct)
+int wm_subwindow_open(wmWindow *win, const rcti *winrct, bool activate)
 {
 	wmSubWindow *swin;
 	int width, height;
@@ -208,18 +208,19 @@ int wm_subwindow_open(wmWindow *win, const rcti *winrct)
 	swin->swinid = freewinid;
 	swin->winrct = *winrct;
 
-	/* and we appy it all right away */
-	wmSubWindowSet(win, swin->swinid);
-	
-	/* extra service */
-	wm_swin_size_get(swin, &width, &height);
-	wmOrtho2_pixelspace(width, height);
-	glLoadIdentity();
+	if (activate) {
+		/* and we appy it all right away */
+		wmSubWindowSet(win, swin->swinid);
+
+		/* extra service */
+		wm_swin_size_get(swin, &width, &height);
+		wmOrtho2_pixelspace(width, height);
+		glLoadIdentity();
+	}
 
 	return swin->swinid;
 }
 
-
 void wm_subwindow_close(wmWindow *win, int swinid)
 {
 	wmSubWindow *swin = swin_from_swinid(win, swinid);
@@ -237,7 +238,7 @@ void wm_subwindow_close(wmWindow *win, int swinid)
 }
 
 /* pixels go from 0-99 for a 100 pixel window */
-void wm_subwindow_position(wmWindow *win, int swinid, const rcti *winrct)
+void wm_subwindow_position(wmWindow *win, int swinid, const rcti *winrct, bool activate)
 {
 	wmSubWindow *swin = swin_from_swinid(win, swinid);
 	
@@ -267,10 +268,12 @@ void wm_subwindow_position(wmWindow *win, int swinid, const rcti *winrct)
 		if (swin->winrct.ymax > winsize_y)
 			swin->winrct.ymax = winsize_y;
 		
-		/* extra service */
-		wmSubWindowSet(win, swinid);
-		wm_swin_size_get(swin, &width, &height);
-		wmOrtho2_pixelspace(width, height);
+		if (activate) {
+			/* extra service */
+			wmSubWindowSet(win, swinid);
+			wm_swin_size_get(swin, &width, &height);
+			wmOrtho2_pixelspace(width, height);
+		}
 	}
 	else {
 		printf("%s: Internal error, bad winid: %d\n", __func__, swinid);
diff --git a/source/blender/windowmanager/wm_subwindow.h b/source/blender/windowmanager/wm_subwindow.h
index bf7b994..2a8118a 100644
--- a/source/blender/windowmanager/wm_subwindow.h
+++ b/source/blender/windowmanager/wm_subwindow.h
@@ -36,11 +36,11 @@
 /* *************** internal api ************** */
 void	wm_subwindows_free(wmWindow *win);
 
-int		wm_subwindow_open(wmWindow *win, const rcti *winrct);
+int		wm_subwindow_open(wmWindow *win, const rcti *winrct, bool activate);
 void	wm_subwindow_close(wmWindow *win, int swinid);
 int		wm_subwindow_get_id(wmWindow *win);				/* returns id */
 
-void	wm_subwindow_position(wmWindow *win, int swinid, const rcti *winrct);
+void	wm_subwindow_position(wmWindow *win, int swinid, const rcti *winrct, bool activate);
 
 void	wm_subwindow_size_get(wmWindow *win, int swinid, int *x, int *y);
 void	wm_subwindow_origin_get(wmWindow *win, int swinid, int *x, int *y);




More information about the Bf-blender-cvs mailing list