Page Menu
Home
Search
Configure Global Search
Log In
Files
F12655
progress-tooltip.patch
Public
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Authored By
John Carpenter (zodiac)
Nov 13 2013, 2:36 PM
Size
4 KB
Subscribers
None
progress-tooltip.patch
View Options
Index: source/blender/windowmanager/intern/wm_jobs.c
===================================================================
--- source/blender/windowmanager/intern/wm_jobs.c (revision 29354)
+++ source/blender/windowmanager/intern/wm_jobs.c (working copy)
@@ -116,6 +116,10 @@
/* for display in header, identification */
char name[128];
+ /* for tooltip in progress bar */
+ char tooltip[128];
+ time_t starttime;
+
/* once running, we store this separately */
void *run_customdata;
void (*run_free)(void *);
@@ -187,6 +191,38 @@
return 0.0;
}
+/* time that job started */
+time_t WM_jobs_starttime(wmWindowManager *wm, void *owner)
+{
+ wmJob *steve= wm_job_find(wm, owner, NULL);
+
+ if (steve && steve->flag & WM_JOB_PROGRESS)
+ return steve->starttime;
+
+ return 0;
+}
+
+/* get progress bar tooltip text */
+char *WM_jobs_tooltip(wmWindowManager *wm, void *owner)
+{
+ wmJob *steve= wm_job_find(wm, owner, NULL);
+
+ if (steve && steve->flag & WM_JOB_PROGRESS)
+ return steve->tooltip;
+
+ return NULL;
+}
+
+/* get progress bar tooltip text */
+void WM_jobs_set_tooltip(wmWindowManager *wm, void *owner, char *tip)
+{
+ wmJob *steve= wm_job_find(wm, owner, NULL);
+
+ if (steve && steve->flag & WM_JOB_PROGRESS) {
+ BLI_strncpy(steve->tooltip, tip, 128);
+ }
+}
+
char *WM_jobs_name(wmWindowManager *wm, void *owner)
{
wmJob *steve= wm_job_find(wm, owner, NULL);
@@ -290,6 +326,7 @@
steve->stop= 0;
steve->ready= 0;
steve->progress= 0.0;
+ steve->starttime= time(NULL);
BLI_init_threads(&steve->threads, do_job_thread, 1);
BLI_insert_thread(&steve->threads, steve);
Index: source/blender/windowmanager/WM_api.h
===================================================================
--- source/blender/windowmanager/WM_api.h (revision 29354)
+++ source/blender/windowmanager/WM_api.h (working copy)
@@ -28,6 +28,9 @@
#ifndef WM_API_H
#define WM_API_H
+/* for WM_jobs_starttime */
+#include <time.h>
+
/* dna-savable wmStructs here */
#include "DNA_windowmanager_types.h"
@@ -306,6 +309,9 @@
int WM_jobs_test(struct wmWindowManager *wm, void *owner);
float WM_jobs_progress(struct wmWindowManager *wm, void *owner);
char *WM_jobs_name(struct wmWindowManager *wm, void *owner);
+time_t 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 *tip);
void WM_jobs_customdata(struct wmJob *, void *customdata, void (*free)(void *));
void WM_jobs_timer(struct wmJob *, double timestep, unsigned int note, unsigned int endnote);
Index: source/blender/editors/interface/interface_templates.c
===================================================================
--- source/blender/editors/interface/interface_templates.c (revision 29354)
+++ source/blender/editors/interface/interface_templates.c (working copy)
@@ -2401,6 +2401,41 @@
#define B_STOPANIM 3
#define B_STOPCOMPO 4
+/* divide elapsed time by progress and subtract elapsed time to get time remaining, and make it pretty */
+static char *time_remaining(time_t t, double progress)
+{
+ int days, hours, minutes, seconds;
+ int eta;
+ char *result = MEM_mallocN(128, "time for progress bar");
+
+ if (progress <= 0.0 || t / progress > 8640000)
+ {
+ BLI_snprintf(result, 128, "unknown");
+ return result;
+ }
+ eta = (int)(t / progress) - t;
+
+ days = eta / 86400;
+ hours = (eta % 86400) / 3600;
+ minutes = (eta % 3600) / 60;
+ seconds = eta % 60;
+ if (days > 0) {
+ BLI_snprintf(result, 128, "%dd %dh %dm %ds", days, hours, minutes, seconds);
+ }
+ else if (hours > 0) {
+ BLI_snprintf(result, 128, "%dh %dm %ds", hours, minutes, seconds);
+ }
+ else if (minutes > 0) {
+ BLI_snprintf(result, 128, "%dm %ds", minutes, seconds);
+ }
+ else {
+ BLI_snprintf(result, 128, "%ds", seconds);
+ }
+
+ return result;
+}
+
+
static void do_running_jobs(bContext *C, void *arg, int event)
{
switch(event) {
@@ -2428,6 +2463,8 @@
uiBlock *block;
void *owner;
int handle_event;
+ char tooltip[128];
+ char *remaining;
block= uiLayoutGetBlock(layout);
uiBlockSetCurLayout(block, layout);
@@ -2447,10 +2484,17 @@
abs = uiLayoutAbsolute(layout, 0);
+ /* create tooltip text and associate it with the job */
+ remaining = time_remaining(time(NULL) - WM_jobs_starttime(wm, owner), WM_jobs_progress(wm, owner));
+ BLI_snprintf(tooltip, 128, "Progress - %2d%% - %s remaining",
+ (int)(WM_jobs_progress(wm, owner) * 100), remaining);
+ WM_jobs_set_tooltip(wm, owner, tooltip);
+ MEM_freeN(remaining);
+
uiDefIconBut(block, BUT, handle_event, ICON_PANEL_CLOSE,
0, UI_UNIT_Y*0.1, UI_UNIT_X*0.8, UI_UNIT_Y*0.8, NULL, 0.0f, 0.0f, 0, 0, "Stop this job");
uiDefBut(block, PROGRESSBAR, 0, WM_jobs_name(wm, owner),
- UI_UNIT_X, 0, 100, UI_UNIT_Y, NULL, 0.0f, 0.0f, WM_jobs_progress(wm, owner), 0, "Progress");
+ UI_UNIT_X, 0, 100, UI_UNIT_Y, NULL, 0.0f, 0.0f, WM_jobs_progress(wm, owner), 0, WM_jobs_tooltip(wm, owner));
uiLayoutRow(layout, 0);
}
File Metadata
Details
Mime Type
text/x-diff
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
c5/de/cd1c134915c87172d7ea1b6ad290
Event Timeline
Log In to Comment