ProgressBar
| Chapter 6. Miscellaneous Widgets |

## ProgressBar

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 `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.

Reference

### Activity Mode

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.

### Example

Figure 6.4. ProgressBar

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: `main.cc`

    #include <gtkmm/main.h>
    #include "examplewindow.h"

    int main(int argc, char *argv[])
    {
      Gtk::Main kit(argc, argv);

      ExampleWindow window;
      //Shows the window and returns when it is closed.
      Gtk::Main::run(window);

      return 0;
    }

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::mem_fun(*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::mem_fun(*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::mem_fun(*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::mem_fun(*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::mem_fun(*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;
    }

SpinButton |  | Tooltips