Added timer to progress dialog so it updates even when no idle events would normally be fired. Also (unsuccessfully) attempted to reduce the flicker.

Originally committed to SVN as r734.
This commit is contained in:
Niels Martin Hansen 2007-01-07 07:10:01 +00:00
parent b3ac7e40cb
commit 4e463a098a
2 changed files with 17 additions and 0 deletions

View File

@ -312,6 +312,7 @@ namespace Automation4 {
, has_inited(false) , has_inited(false)
, script_finished(false) , script_finished(false)
, debug_visible(false) , debug_visible(false)
, data_updated(false)
{ {
// make the controls // make the controls
progress_display = new wxGauge(this, -1, 1000, wxDefaultPosition, wxSize(300, 20)); progress_display = new wxGauge(this, -1, 1000, wxDefaultPosition, wxSize(300, 20));
@ -336,6 +337,12 @@ namespace Automation4 {
title_font.SetWeight(wxFONTWEIGHT_BOLD); title_font.SetWeight(wxFONTWEIGHT_BOLD);
title_display->SetFont(title_font); title_display->SetFont(title_font);
// Set up a timer to regularly update the status
// It doesn't need an event handler attached, as just a the timer in itself
// will ensure that the idle event is fired
update_timer = new wxTimer();
update_timer->Start(50, false);
sizer->SetSizeHints(this); sizer->SetSizeHints(this);
SetSizer(sizer); SetSizer(sizer);
Center(); Center();
@ -343,6 +350,7 @@ namespace Automation4 {
ProgressSink::~ProgressSink() ProgressSink::~ProgressSink()
{ {
delete update_timer;
} }
void ProgressSink::OnIdle(wxIdleEvent &evt) void ProgressSink::OnIdle(wxIdleEvent &evt)
@ -368,6 +376,7 @@ namespace Automation4 {
// there might actually be some debug output but the debug_visible flag won't // there might actually be some debug output but the debug_visible flag won't
// be set before the dialog closes itself. // be set before the dialog closes itself.
wxMutexLocker lock(data_mutex); wxMutexLocker lock(data_mutex);
if (!data_updated) return;
if (!pending_debug_output.IsEmpty()) { if (!pending_debug_output.IsEmpty()) {
if (!debug_visible) { if (!debug_visible) {
sizer->Show(debug_output, true); sizer->Show(debug_output, true);
@ -386,30 +395,35 @@ namespace Automation4 {
progress_display->SetValue((int)(progress*10)); progress_display->SetValue((int)(progress*10));
task_display->SetLabel(task); task_display->SetLabel(task);
title_display->SetLabel(title); title_display->SetLabel(title);
data_updated = false;
} }
void ProgressSink::SetProgress(float _progress) void ProgressSink::SetProgress(float _progress)
{ {
wxMutexLocker lock(data_mutex); wxMutexLocker lock(data_mutex);
progress = _progress; progress = _progress;
data_updated = true;
} }
void ProgressSink::SetTask(const wxString &_task) void ProgressSink::SetTask(const wxString &_task)
{ {
wxMutexLocker lock(data_mutex); wxMutexLocker lock(data_mutex);
task = _task; task = _task;
data_updated = true;
} }
void ProgressSink::SetTitle(const wxString &_title) void ProgressSink::SetTitle(const wxString &_title)
{ {
wxMutexLocker lock(data_mutex); wxMutexLocker lock(data_mutex);
title = _title; title = _title;
data_updated = true;
} }
void ProgressSink::AddDebugOutput(const wxString &msg) void ProgressSink::AddDebugOutput(const wxString &msg)
{ {
wxMutexLocker lock(data_mutex); wxMutexLocker lock(data_mutex);
pending_debug_output << msg; pending_debug_output << msg;
data_updated = true;
} }
BEGIN_EVENT_TABLE(ProgressSink, wxWindow) BEGIN_EVENT_TABLE(ProgressSink, wxWindow)

View File

@ -216,6 +216,7 @@ namespace Automation4 {
wxTextCtrl *debug_output; wxTextCtrl *debug_output;
bool debug_visible; bool debug_visible;
bool data_updated;
float progress; float progress;
wxString task; wxString task;
@ -223,6 +224,8 @@ namespace Automation4 {
wxString pending_debug_output; wxString pending_debug_output;
wxMutex data_mutex; wxMutex data_mutex;
wxTimer *update_timer;
void OnCancel(wxCommandEvent &evt); void OnCancel(wxCommandEvent &evt);
void OnInit(wxInitDialogEvent &evt); void OnInit(wxInitDialogEvent &evt);
void OnIdle(wxIdleEvent &evt); void OnIdle(wxIdleEvent &evt);