|
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 and 1 to provide the new percentage.
where percentage is a number, from 0 to 1, indicating what
fraction of the bar should be filled.
A ProgressBaris horizontal and left-to-right by default, but you can change it to a vertical progress bar by using the set_orientation() method.
Reference
Besides indicating the amount of progress that has occured, 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.
When in continuous mode, the progress bar can also display a
configurable text string within its trough, using the set_text() method.
Source Code File: examplewindow.h
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H
#include <gtkmm.h>
class ExampleWindow : public Gtk::Window
{
public:
ExampleWindow();
virtual ~ExampleWindow();
protected:
//Signal handlers:
virtual void on_checkbutton_text();
virtual void on_checkbutton_activity();
virtual void on_checkbutton_orientation();
virtual bool on_timeout();
virtual void on_button_close();
//Child widgets:
Gtk::VBox m_VBox;
Gtk::Alignment m_Alignment;
Gtk::Table m_Table;
Gtk::ProgressBar m_ProgressBar;
Gtk::HSeparator m_Separator;
Gtk::CheckButton m_CheckButton_Text, m_CheckButton_Activity, m_CheckButton_Orientation;
Gtk::Button m_Button_Close;
int m_connection_id_timeout;
bool m_bActivityMode;
};
#endif //GTKMM_EXAMPLEWINDOW_H
File: examplewindow.cc
#include "examplewindow.h"
#include <iostream>
ExampleWindow::ExampleWindow()
: m_VBox(false, 5),
m_Alignment(0.5, 0.5, 0, 0),
m_Table(2, 2, true),
m_CheckButton_Text("Show text"),
m_CheckButton_Activity("Activity mode"),
m_CheckButton_Orientation("Right to Left"),
m_Button_Close("Close"),
m_bActivityMode(false)
{
set_resizable();
set_title("Gtk::ProgressBar");
m_VBox.set_border_width(10);
add(m_VBox);
m_VBox.pack_start(m_Alignment, Gtk::PACK_SHRINK, 5);
m_Alignment.add(m_ProgressBar);
//Add a timer callback to update the value of the progress bar:
m_connection_id_timeout = Glib::signal_timeout().connect( SigC::slot(*this, &ExampleWindow::on_timeout), 50 );
m_VBox.pack_start(m_Separator, Gtk::PACK_SHRINK);
m_VBox.pack_start(m_Table);
//Add a check button to select displaying of the trough text:
m_Table.attach(m_CheckButton_Text, 0, 1, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 5, 5);
m_CheckButton_Text.signal_clicked().connect( SigC::slot(*this, &ExampleWindow::on_checkbutton_text) );
//Add a check button to select displaying of the trough text:
m_Table.attach(m_CheckButton_Activity, 0, 1, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 5, 5);
m_CheckButton_Activity.signal_clicked().connect( SigC::slot(*this, &ExampleWindow::on_checkbutton_activity) );
//Add a check button to toggle activity mode:
m_Table.attach(m_CheckButton_Orientation, 0, 1, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 5, 5);
m_CheckButton_Orientation.signal_clicked().connect( SigC::slot(*this, &ExampleWindow::on_checkbutton_orientation) );
//Add a button to exit the program.
m_VBox.pack_start(m_Button_Close, Gtk::PACK_SHRINK);
m_Button_Close.signal_clicked().connect( SigC::slot(*this, &ExampleWindow::on_button_close) );
m_Button_Close.set_flags(Gtk::CAN_DEFAULT);
m_Button_Close.grab_default();
show_all_children();
}
ExampleWindow::~ExampleWindow()
{
}
void ExampleWindow::on_checkbutton_text()
{
const Glib::ustring text = m_ProgressBar.get_text();
if(!text.empty())
m_ProgressBar.set_text("");
else
m_ProgressBar.set_text("some 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_orientation()
{
switch(m_ProgressBar.get_orientation())
{
case Gtk::PROGRESS_LEFT_TO_RIGHT:
m_ProgressBar.set_orientation(Gtk::PROGRESS_RIGHT_TO_LEFT);
break;
case Gtk::PROGRESS_RIGHT_TO_LEFT:
m_ProgressBar.set_orientation(Gtk::PROGRESS_LEFT_TO_RIGHT);
break;
default:
break; // do nothing
}
}
void ExampleWindow::on_button_close()
{
hide();
}
/* 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
#include <gtkmm/main.h>
#include "examplewindow.h"
int main(int argc, char *argv[])
{
Gtk::Main kit(argc, argv);
ExampleWindow window;
Gtk::Main::run(window); //Shows the window and returns when it is closed.
return 0;
}
|