Progress bars are used to show the status of an ongoing operation. For
instance, a ProgressBar
can show how much of a task has
been completed.
To change the value shown, use the set_fraction()
method,
passing a double between 0.0 and 1.0 to provide the new fraction.
A ProgressBar
is horizontal and left-to-right by default,
but you can change it to a vertical progress bar by using the
set_orientation()
method.
Besides indicating the amount of progress that has occurred, the progress bar can also be used to indicate that there is some activity; this is done by placing the progress bar in activity mode. In this mode, the progress bar displays a small rectangle which moves back and forth. Activity mode is useful in situations where the progress of an operation cannot be calculated as a value range (e.g., receiving a file of unknown length).
To do this, you need to call the pulse()
method at regular
intervals. You can also choose the step size, with the
set_pulse_step()
method.
The progress bar can also display a configurable text
string next to the bar, using the set_text()
method.
File: examplewindow.h
(For use with gtkmm 4)
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H
#include <gtkmm.h>
class ExampleWindow : public Gtk::Window
{
public:
ExampleWindow();
virtual ~ExampleWindow();
protected:
//Signal handlers:
void on_checkbutton_text();
void on_checkbutton_activity();
void on_checkbutton_inverted();
bool on_timeout();
void on_button_close();
//Child widgets:
Gtk::Box m_VBox;
Gtk::Grid m_Grid;
Gtk::ProgressBar m_ProgressBar;
Gtk::Separator m_Separator;
Gtk::CheckButton m_CheckButton_Text, m_CheckButton_Activity, m_CheckButton_Inverted;
Gtk::Button m_Button_Close;
sigc::connection m_connection_timeout;
bool m_bActivityMode;
};
#endif //GTKMM_EXAMPLEWINDOW_H
File: examplewindow.cc
(For use with gtkmm 4)
#include "examplewindow.h"
#include <iostream>
ExampleWindow::ExampleWindow()
: m_VBox(Gtk::Orientation::VERTICAL, 5),
m_CheckButton_Text("Show text"),
m_CheckButton_Activity("Activity mode"),
m_CheckButton_Inverted("Right to Left"),
m_Button_Close("Close"),
m_bActivityMode(false)
{
set_resizable();
set_title("Gtk::ProgressBar");
m_VBox.set_margin(10);
set_child(m_VBox);
m_VBox.append(m_ProgressBar);
m_ProgressBar.set_margin_end(5);
m_ProgressBar.set_halign(Gtk::Align::CENTER);
m_ProgressBar.set_valign(Gtk::Align::CENTER);
m_ProgressBar.set_size_request(100, -1);
m_ProgressBar.set_text("some text");
m_ProgressBar.set_show_text(false);
//Add a timer callback to update the value of the progress bar:
m_connection_timeout = Glib::signal_timeout().connect(sigc::mem_fun(*this,
&ExampleWindow::on_timeout), 50 );
m_VBox.append(m_Separator);
m_VBox.append(m_Grid);
m_Grid.set_expand(true);
m_Grid.set_row_homogeneous(true);
//Add a check button to select displaying of the trough text:
m_Grid.attach(m_CheckButton_Text, 0, 0);
m_CheckButton_Text.set_margin(5);
m_CheckButton_Text.signal_toggled().connect(sigc::mem_fun(*this,
&ExampleWindow::on_checkbutton_text) );
//Add a check button to toggle activity mode:
m_Grid.attach(m_CheckButton_Activity, 0, 1);
m_CheckButton_Activity.set_margin(5);
m_CheckButton_Activity.signal_toggled().connect(sigc::mem_fun(*this,
&ExampleWindow::on_checkbutton_activity) );
//Add a check button to select growth from left to right or from right to left:
m_Grid.attach(m_CheckButton_Inverted, 0, 2);
m_CheckButton_Inverted.set_margin(5);
m_CheckButton_Inverted.signal_toggled().connect(sigc::mem_fun(*this,
&ExampleWindow::on_checkbutton_inverted) );
//Add a button to exit the program.
m_VBox.append(m_Button_Close);
m_Button_Close.signal_clicked().connect(sigc::mem_fun(*this,
&ExampleWindow::on_button_close) );
set_default_widget(m_Button_Close);
}
ExampleWindow::~ExampleWindow()
{
}
void ExampleWindow::on_checkbutton_text()
{
const bool show_text = m_CheckButton_Text.get_active();
m_ProgressBar.set_show_text(show_text);
}
void ExampleWindow::on_checkbutton_activity()
{
m_bActivityMode = m_CheckButton_Activity.get_active();
if(m_bActivityMode)
m_ProgressBar.pulse();
else
m_ProgressBar.set_fraction(0.0);
}
void ExampleWindow::on_checkbutton_inverted()
{
const bool inverted = m_CheckButton_Inverted.get_active();
m_ProgressBar.set_inverted(inverted);
}
void ExampleWindow::on_button_close()
{
set_visible(false);
}
/* Update the value of the progress bar so that we get
* some movement */
bool ExampleWindow::on_timeout()
{
if(m_bActivityMode)
m_ProgressBar.pulse();
else
{
double new_val = m_ProgressBar.get_fraction() + 0.01;
if(new_val > 1.0)
new_val = 0.0;
//Set the new value:
m_ProgressBar.set_fraction(new_val);
}
//As this is a timeout function, return true so that it
//continues to get called
return true;
}
File: main.cc
(For use with gtkmm 4)
#include "examplewindow.h"
#include <gtkmm/application.h>
int main(int argc, char *argv[])
{
auto app = Gtk::Application::create("org.gtkmm.example");
//Shows the window and returns when it is closed.
return app->make_window_and_run<ExampleWindow>(argc, argv);
}