I want to derive my own widget class and add standard widgets to this class to create a composite widget. Does anybody have an examples or suggesions on how to do this? For example, Suppose I want to create custom composite widget of 4 buttons. I'm guessing its something like the code below:
//First Question: Is this the best way to create composite widget? (see below)
//Second Question: How do you make a widget container expand in
// the horizontal direction while at the same time shrink in
// the vertical direction? because i wanted the boxes to expand horizontally
// to fill the window, and at the same time shrink to minimum width in the vertical
// direction
#include <iostream>
using namespace std;
#include <gtkmm.h>
class MyWidget : public Gtk::Frame {
public:
MyWidget() {
add(m_hbox1);
m_hbox1.pack_start (m_vbox1, Gtk::PackOptions::PACK_SHRINK);
m_vbox1.pack_start (m_hbox2, Gtk::PackOptions::PACK_EXPAND_WIDGET);
m_hbox2.pack_start (m_btn_fwd, Gtk::PackOptions::PACK_EXPAND_WIDGET);
m_hbox2.pack_start (m_btn_play, Gtk::PackOptions::PACK_EXPAND_WIDGET);
m_hbox2.pack_start (m_btn_stop, Gtk::PackOptions::PACK_EXPAND_WIDGET);
m_hbox2.pack_start (m_btn_back, Gtk::PackOptions::PACK_EXPAND_WIDGET);
show_all_children();
}
~MyWidget() {
}
private:
Gtk::Box m_vbox1 {Gtk::ORIENTATION_VERTICAL};
Gtk::Box m_hbox1 {Gtk::ORIENTATION_HORIZONTAL};
Gtk::Box m_hbox2 {Gtk::ORIENTATION_HORIZONTAL};
Gtk::Button m_btn_fwd {"Fwd"};
Gtk::Button m_btn_back {"Back"};
Gtk::Button m_btn_play {"Play"};
Gtk::Button m_btn_stop {"Stop"};
};
class MyWindow : public Gtk::Window {
public:
MyWindow(string name) {
set_title(name);
add(m_vbox);
// Shrink in Vertical Direction
m_vbox.pack_start(m_mywidget, Gtk::PackOptions::PACK_SHRINK);
show_all_children();
}
private:
Gtk::Box m_vbox {Gtk::ORIENTATION_VERTICAL};
MyWidget m_mywidget;
};
int main(int argc, char *argv[])
{
auto app = Gtk::Application::create(argc, argv,
"org.gtkmm.example.actionbar");
MyWindow window {"Testing Custom Composite Widget"};
// Shows the window and returns when it is closed.
return app->run(window);
}
it is actually possible to derive a custom C++ widget from Gtk::Widget in gtkmm although the library requires quite a bit of additional code, not only for compositing the composite oject but for adhering to the Gtk::Widget interface specification.
I am referring to a set of virtual methods which should be overridden in your implementation, in particular:
height of the widget.
The gtkmm documentation has a solid example in the gtkmm-tutorial section.