[Bf-blender-cvs] [b4146a0] master: UI: use a callback for the progress tooltip

Campbell Barton noreply at git.blender.org
Mon Jan 18 04:08:38 CET 2016


Commit: b4146a04bc385a30ca9d02d89068671f48ca2233
Author: Campbell Barton
Date:   Mon Jan 18 13:53:38 2016 +1100
Branches: master
https://developer.blender.org/rBb4146a04bc385a30ca9d02d89068671f48ca2233

UI: use a callback for the progress tooltip

Avoids constructing tip text and storing it when its not used.

Also quiet divide by zero warning when no progress was made.

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

M	source/blender/editors/interface/interface_templates.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_jobs.c

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

diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index a97f55d..a404cde 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -3379,6 +3379,36 @@ static void do_running_jobs(bContext *C, void *UNUSED(arg), int event)
 	}
 }
 
+struct ProgressTooltip_Store {
+	wmWindowManager *wm;
+	void *owner;
+};
+
+static char *progress_tooltip_func(bContext *UNUSED(C), void *argN, const char *UNUSED(tip))
+{
+	struct ProgressTooltip_Store *arg = argN;
+	wmWindowManager *wm = arg->wm;
+	void *owner = arg->owner;
+
+	const float progress = WM_jobs_progress(wm, owner);
+
+	/* create tooltip text and associate it with the job */
+	char elapsed_str[32];
+	char remaining_str[32] = "Unknown";
+	const double elapsed = PIL_check_seconds_timer() - WM_jobs_starttime(wm, owner);
+	BLI_timecode_string_from_time_simple(elapsed_str, sizeof(elapsed_str), elapsed);
+
+	if (progress) {
+		const double remaining = (elapsed / progress) - elapsed;
+		BLI_timecode_string_from_time_simple(remaining_str, sizeof(remaining_str), remaining);
+	}
+
+	return BLI_sprintfN(
+	        "Time Remaining: %s\n"
+	        "Time Elapsed: %s",
+	        remaining_str, elapsed_str);
+}
+
 void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
 {
 	bScreen *screen = CTX_wm_screen(C);
@@ -3470,7 +3500,7 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
 
 	if (owner) {
 		const uiFontStyle *fstyle = UI_FSTYLE_WIDGET;
-		bool active = !(WM_jobs_is_stopped(wm, owner) || G.is_break);
+		bool active = !(G.is_break || WM_jobs_is_stopped(wm, owner));
 		
 		uiLayout *row = uiLayoutRow(layout, false);
 		block = uiLayoutGetBlock(row);
@@ -3479,20 +3509,6 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
 		const float progress = WM_jobs_progress(wm, owner);
 		char text[8];
 		BLI_snprintf(text, 8, "%d%%", (int)(progress * 100));
-		
-		/* create tooltip text and associate it with the job */
-
-		const double elapsed = PIL_check_seconds_timer() - WM_jobs_starttime(wm, owner);
-		const double remaining = (elapsed / progress) - elapsed;
-
-		char remaining_str[32], elapsed_str[32];
-		BLI_timecode_string_from_time_simple(remaining_str, sizeof(remaining_str), remaining);
-		BLI_timecode_string_from_time_simple(elapsed_str, sizeof(remaining_str), elapsed);
-
-		char tooltip[128];
-		BLI_snprintf(tooltip, sizeof(tooltip), "Time Remaining: %s\nTime Elapsed: %s", remaining_str, elapsed_str);
-
-		WM_jobs_set_tooltip(wm, owner, tooltip);
 
 		const char *name = active ? WM_jobs_name(wm, owner) : "Canceling...";
 
@@ -3506,9 +3522,16 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
 		uiLayoutSetActive(row, active);
 		block = uiLayoutGetBlock(row);
 
-		uiDefIconTextBut(block, UI_BTYPE_PROGRESS_BAR, 0, 0, text,
-		                 UI_UNIT_X, 0, UI_UNIT_X * 6.0f, UI_UNIT_Y, NULL, 0.0f, 0.0f,
-		                 progress, 0, WM_jobs_tooltip(wm, owner));
+		{
+			struct ProgressTooltip_Store *tip_arg = MEM_mallocN(sizeof(*tip_arg), __func__);
+			tip_arg->wm = wm;
+			tip_arg->owner = owner;
+			uiBut *but_progress = uiDefIconTextBut(
+			        block, UI_BTYPE_PROGRESS_BAR, 0, 0, text,
+			        UI_UNIT_X, 0, UI_UNIT_X * 6.0f, UI_UNIT_Y, NULL, 0.0f, 0.0f,
+			        progress, 0, NULL);
+			UI_but_func_tooltip_set(but_progress, progress_tooltip_func, tip_arg);
+		}
 
 		uiDefIconTextBut(block, UI_BTYPE_BUT, handle_event, ICON_PANEL_CLOSE,
 		                 "", 0, 0, UI_UNIT_X, UI_UNIT_Y,
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index b9e4f19..fc0a3a6 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -454,8 +454,6 @@ bool        WM_jobs_test(struct wmWindowManager *wm, void *owner, int job_type);
 float		WM_jobs_progress(struct wmWindowManager *wm, void *owner);
 char       *WM_jobs_name(struct wmWindowManager *wm, void *owner);
 double      WM_jobs_starttime(struct wmWindowManager *wm, void *owner);
-char       *WM_jobs_tooltip(struct wmWindowManager *wm, void *owner);
-void		WM_jobs_set_tooltip(struct wmWindowManager *wm, void *owner, char *text);
 void       *WM_jobs_customdata(struct wmWindowManager *wm, void *owner);
 void       *WM_jobs_customdata_from_type(struct wmWindowManager *wm, int job_type);
 
diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c
index 72941d1..19b393b 100644
--- a/source/blender/windowmanager/intern/wm_jobs.c
+++ b/source/blender/windowmanager/intern/wm_jobs.c
@@ -111,9 +111,6 @@ struct wmJob {
 
 	/* for display in header, identification */
 	char name[128];
-	
-    /* for other text display in progress bar */
-    char text[128];
 
 	/* once running, we store this separately */
 	void *run_customdata;
@@ -259,27 +256,6 @@ double WM_jobs_starttime(wmWindowManager *wm, void *owner)
 	return 0;
 }
 
-/* get progress bar tooltip text */
-char *WM_jobs_tooltip(wmWindowManager *wm, void *owner)
-{
-	wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY);
-
-	if (wm_job && wm_job->flag & WM_JOB_PROGRESS)
-		return wm_job->text;
-
-	return NULL;
-}
-
-/* set progress bar text (e.g. tooltip, UI label, eta...) */
-void WM_jobs_set_tooltip(wmWindowManager *wm, void *owner, char *text)
-{
-	wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY);
-
-	if (wm_job && wm_job->flag & WM_JOB_PROGRESS) {
-		BLI_strncpy(wm_job->text, text, sizeof(wm_job->text));
-	}
-}
-
 char *WM_jobs_name(wmWindowManager *wm, void *owner)
 {
 	wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY);




More information about the Bf-blender-cvs mailing list