/* Paned Widgets * * The GtkHPaned and GtkVPaned Widgets divide their content * area into two panes with a divider in between that the * user can adjust. A separate child is placed into each * pane. * * There are a number of options that can be set for each pane. * This test contains both a horizontal (HPaned) and a vertical * (VPaned) widget, and allows you to adjust the options for * each side of each widget. */ #include namespace { class Example_Panes : public Gtk::Window { public: Example_Panes(); ~Example_Panes() override; }; class PaneOptions : public Gtk::Frame { public: PaneOptions(Gtk::Paned& paned, const Glib::ustring& frame_label, const Glib::ustring& label1, const Glib::ustring& label2); ~PaneOptions() override; private: // member widgets: Gtk::Paned* m_pPaned; Gtk::CheckButton m_CheckButton_resize1; Gtk::CheckButton m_CheckButton_shrink1; Gtk::CheckButton m_CheckButton_resize2; Gtk::CheckButton m_CheckButton_shrink2; // signal handlers: void on_checkbutton1(); void on_checkbutton2(); }; Example_Panes::Example_Panes() { set_title("Panes"); set_border_width(0); Gtk::Box *const pVBox = new Gtk::Box(Gtk::ORIENTATION_VERTICAL); add(*Gtk::manage(pVBox)); Gtk::Paned *const pVPaned = new Gtk::Paned(Gtk::ORIENTATION_VERTICAL); pVBox->pack_start(*Gtk::manage(pVPaned)); pVPaned->set_border_width(5); Gtk::Paned *const pHPaned = new Gtk::Paned(Gtk::ORIENTATION_HORIZONTAL); pVPaned->add1(*Gtk::manage(pHPaned)); Gtk::Frame *const pFrame1 = new Gtk::Frame(); pHPaned->add1(*Gtk::manage(pFrame1)); pFrame1->set_shadow_type(Gtk::SHADOW_IN); pFrame1->set_size_request(60, 60); pFrame1->add(*Gtk::make_managed("_Hi there", true)); Gtk::Frame *const pFrame2 = new Gtk::Frame(); pHPaned->add2(*Gtk::manage(pFrame2)); pFrame2->set_shadow_type(Gtk::SHADOW_IN); pFrame2->set_size_request(80, 60); Gtk::Frame *const pFrame3 = new Gtk::Frame(); pVPaned->add2(*Gtk::manage(pFrame3)); pFrame3->set_shadow_type(Gtk::SHADOW_IN); pFrame3->set_size_request(60, 80); // Now create check buttons to control sizing pVBox->pack_start(*Gtk::make_managed(*pHPaned, "Horizontal", "Left", "Right"), Gtk::PACK_SHRINK); pVBox->pack_start(*Gtk::make_managed(*pVPaned, "Vertical", "Top", "Bottom"), Gtk::PACK_SHRINK); show_all(); } Example_Panes::~Example_Panes() {} PaneOptions::PaneOptions(Gtk::Paned& paned, const Glib::ustring& frame_label, const Glib::ustring& label1, const Glib::ustring& label2) : Gtk::Frame (frame_label), m_pPaned (&paned), m_CheckButton_resize1 ("_Resize", true), m_CheckButton_shrink1 ("_Shrink", true), m_CheckButton_resize2 ("_Resize", true), m_CheckButton_shrink2 ("_Shrink", true) { set_border_width(4); Gtk::Grid *const pGrid = new Gtk::Grid(); add(*Gtk::manage(pGrid)); pGrid->attach(*Gtk::make_managed(label1), 0, 0, 1, 1); pGrid->attach(*Gtk::make_managed(label2), 1, 0, 1, 1); pGrid->attach(m_CheckButton_resize1, 0, 1, 1, 1); pGrid->attach(m_CheckButton_shrink1, 0, 2, 1, 1); pGrid->attach(m_CheckButton_resize2, 1, 1, 1, 1); pGrid->attach(m_CheckButton_shrink2, 1, 2, 1, 1); m_CheckButton_resize1.set_active(false); m_CheckButton_shrink1.set_active(true); m_CheckButton_resize2.set_active(true); m_CheckButton_shrink2.set_active(true); m_CheckButton_resize1.signal_toggled().connect(sigc::mem_fun(*this, &PaneOptions::on_checkbutton1)); m_CheckButton_shrink1.signal_toggled().connect(sigc::mem_fun(*this, &PaneOptions::on_checkbutton1)); m_CheckButton_resize2.signal_toggled().connect(sigc::mem_fun(*this, &PaneOptions::on_checkbutton2)); m_CheckButton_shrink2.signal_toggled().connect(sigc::mem_fun(*this, &PaneOptions::on_checkbutton2)); // Sync Gtk::Paned options with the CheckButtons' state. Actually, the // preset state of the buttons should match the Gtk::Paned default settings, // but it is definitely cleaner this way. on_checkbutton1(); on_checkbutton2(); } PaneOptions::~PaneOptions() {} void PaneOptions::on_checkbutton1() { Gtk::AttachOptions options = Gtk::AttachOptions(0); if(m_CheckButton_resize1.get_active()) options = (options | Gtk::EXPAND); if(m_CheckButton_shrink1.get_active()) options = (options | Gtk::SHRINK); Gtk::Widget *const pChild = m_pPaned->get_child1(); m_pPaned->remove(*pChild); m_pPaned->pack1(*pChild, options); } void PaneOptions::on_checkbutton2() { Gtk::AttachOptions options = Gtk::AttachOptions(0); if(m_CheckButton_resize2.get_active()) options = (options | Gtk::EXPAND); if(m_CheckButton_shrink2.get_active()) options = (options | Gtk::SHRINK); Gtk::Widget *const pChild = m_pPaned->get_child2(); m_pPaned->remove(*pChild); m_pPaned->pack2(*pChild, options); } } // anonymous namespace // called by DemoWindow Gtk::Window* do_panes() { return new Example_Panes(); }