1 #include "ProgressStatusBar.hpp"
2 
3 #include <wx/timer.h>
4 #include <wx/gauge.h>
5 #include <wx/button.h>
6 #include <wx/statusbr.h>
7 #include <wx/frame.h>
8 
9 #include "GUI_App.hpp"
10 
11 #include "I18N.hpp"
12 
13 #include <iostream>
14 
15 namespace Slic3r {
16 
ProgressStatusBar(wxWindow * parent,int id)17 ProgressStatusBar::ProgressStatusBar(wxWindow *parent, int id)
18     : self{new wxStatusBar(parent, id == -1 ? wxID_ANY : id)}
19     , m_prog{new wxGauge(self,
20                          wxGA_HORIZONTAL,
21                          100,
22                          wxDefaultPosition,
23                          wxDefaultSize)}
24     , m_cancelbutton{new wxButton(self,
25                                   -1,
26                                   _(L("Cancel")),
27                                   wxDefaultPosition,
28                                   wxDefaultSize)}
29     , m_timer{new wxTimer(self)}
30 {
31     m_prog->Hide();
32     m_cancelbutton->Hide();
33 
34     self->SetFieldsCount(3);
35     int w[] = {-1, 150, 155};
36     self->SetStatusWidths(3, w);
37 
38     wxSize s = m_cancelbutton->GetTextExtent(m_cancelbutton->GetLabel());
39     self->SetMinHeight(int(2 * self->GetBorderY() + 1.2 * s.GetHeight()));
40 
__anon4ca0d6680102(const wxTimerEvent&) 41     self->Bind(wxEVT_TIMER, [this](const wxTimerEvent&) {
42         if (m_prog->IsShown()) m_timer->Stop();
43         if(is_busy()) m_prog->Pulse();
44     });
45 
__anon4ca0d6680202(wxSizeEvent& event)46     self->Bind(wxEVT_SIZE, [this](wxSizeEvent& event){
47         wxRect rect;
48         self->GetFieldRect(1, rect);
49         auto offset = 0;
50         m_cancelbutton->Move(rect.GetX() + offset, rect.GetY() + offset);
51         m_cancelbutton->SetSize(rect.GetWidth() - offset, rect.GetHeight());
52 
53         self->GetFieldRect(2, rect);
54         m_prog->Move(rect.GetX() + offset, rect.GetY() + offset);
55         m_prog->SetSize(rect.GetWidth() - offset, rect.GetHeight());
56 
57         event.Skip();
58     });
59 
__anon4ca0d6680302(const wxCommandEvent&) 60     m_cancelbutton->Bind(wxEVT_BUTTON, [this](const wxCommandEvent&) {
61         if (m_cancel_cb)
62             m_cancel_cb();
63         m_cancelbutton->Hide();
64     });
65 }
66 
~ProgressStatusBar()67 ProgressStatusBar::~ProgressStatusBar() {
68     if(m_timer && m_timer->IsRunning()) m_timer->Stop();
69 }
70 
get_progress() const71 int ProgressStatusBar::get_progress() const
72 {
73     return m_prog ? m_prog->GetValue() : 0;
74 }
75 
set_progress(int val)76 void ProgressStatusBar::set_progress(int val)
77 {
78     if(!m_prog) return;
79 
80     if(!m_prog->IsShown()) show_progress(true);
81     if(val < 0) return;
82 
83     if(val == m_prog->GetRange()) {
84         m_prog->SetValue(0);
85         show_progress(false);
86     }
87     else {
88         m_prog->SetValue(val);
89     }
90 }
91 
get_range() const92 int ProgressStatusBar::get_range() const
93 {
94     return m_prog ? m_prog->GetRange() : 0;
95 }
96 
set_range(int val)97 void ProgressStatusBar::set_range(int val)
98 {
99     if(m_prog && val != m_prog->GetRange()) {
100         m_prog->SetRange(val);
101     }
102 }
103 
show_progress(bool show)104 void ProgressStatusBar::show_progress(bool show)
105 {
106     if(m_prog) {
107         m_prog->Show(show);
108         m_prog->Pulse();
109     }
110 }
111 
start_busy(int rate)112 void ProgressStatusBar::start_busy(int rate)
113 {
114     if(!m_prog) return;
115 
116     m_busy = true;
117     show_progress(true);
118     if (!m_timer->IsRunning()) {
119         m_timer->Start(rate);
120     }
121 }
122 
stop_busy()123 void ProgressStatusBar::stop_busy()
124 {
125     if(!m_timer || !m_prog) return;
126 
127     m_timer->Stop();
128     show_progress(false);
129     m_prog->SetValue(0);
130     m_busy = false;
131 }
132 
set_cancel_callback(ProgressStatusBar::CancelFn ccb)133 void ProgressStatusBar::set_cancel_callback(ProgressStatusBar::CancelFn ccb) {
134     m_cancel_cb = ccb;
135     if(m_cancelbutton) {
136         if(ccb) m_cancelbutton->Show();
137         else m_cancelbutton->Hide();
138     }
139 }
140 
run(int rate)141 void ProgressStatusBar::run(int rate)
142 {
143     if(m_timer && !m_timer->IsRunning()) {
144         m_timer->Start(rate);
145     }
146 }
147 
embed(wxFrame * frame)148 void ProgressStatusBar::embed(wxFrame *frame)
149 {
150     if(frame) frame->SetStatusBar(self);
151 }
152 
set_status_text(const wxString & txt)153 void ProgressStatusBar::set_status_text(const wxString& txt)
154 {
155 	if(self) self->SetStatusText(txt);
156 }
157 
set_status_text(const std::string & txt)158 void ProgressStatusBar::set_status_text(const std::string& txt)
159 {
160     this->set_status_text(txt.c_str());
161 }
162 
set_status_text(const char * txt)163 void ProgressStatusBar::set_status_text(const char *txt)
164 {
165     this->set_status_text(wxString::FromUTF8(txt));
166 }
167 
get_status_text() const168 wxString ProgressStatusBar::get_status_text() const
169 {
170     return self->GetStatusText();
171 }
172 
set_font(const wxFont & font)173 void ProgressStatusBar::set_font(const wxFont &font)
174 {
175     self->SetFont(font);
176 }
177 
show_cancel_button()178 void ProgressStatusBar::show_cancel_button()
179 {
180     if(m_cancelbutton) m_cancelbutton->Show();
181 }
182 
hide_cancel_button()183 void ProgressStatusBar::hide_cancel_button()
184 {
185     if(m_cancelbutton) m_cancelbutton->Hide();
186 }
187 
188 }
189