diff --git a/src/gui/widgets/button-bar.cpp b/src/gui/widgets/button-bar.cpp index f8b1e9904..8587410e7 100644 --- a/src/gui/widgets/button-bar.cpp +++ b/src/gui/widgets/button-bar.cpp @@ -23,15 +23,19 @@ #include "button-bar.hpp" #include +#include using namespace Gtk; +using namespace Glib; using namespace sigc; +using namespace std; namespace gui { namespace widgets { ButtonBar::ButtonBar() { + set_flags(Gtk::NO_WINDOW); } void @@ -40,5 +44,64 @@ ButtonBar::append(Widget &widget) pack_start(widget, Gtk::PACK_SHRINK); } +void +ButtonBar::on_size_request(Gtk::Requisition* requisition) +{ + REQUIRE(requisition); + + requisition->width = 0; + requisition->height = 0; + + Box::BoxList &list = children(); + Box::BoxList::const_iterator i; + for(i = list.begin(); i != list.end(); i++) + { + Widget *widget = (*i).get_widget(); + REQUIRE(widget); + + Requisition child_requisition = widget->size_request(); + requisition->width += child_requisition.width; + requisition->height = max(requisition->height, + child_requisition.height); + } + + ENSURE(requisition->width >= 0); + ENSURE(requisition->height >= 0); +} + +void +ButtonBar::on_size_allocate(Gtk::Allocation& allocation) +{ + //Use the offered allocation for this container: + set_allocation(allocation); + + int offset = 0; + Box::BoxList &list = children(); + Box::BoxList::const_iterator i; + + for(i = list.begin(); i != list.end(); i++) + { + Widget *widget = (*i).get_widget(); + REQUIRE(widget); + + const Requisition child_requisition = widget->size_request(); + const Gtk::Allocation child_allocation( + allocation.get_x() + offset, + allocation.get_y(), + child_requisition.width, + allocation.get_height()); + + offset += child_requisition.width; + + if(offset > allocation.get_width()) + widget->set_child_visible(false); + else + { + widget->size_allocate(child_allocation); + widget->set_child_visible(true); + } + } +} + } // widgets } // gui diff --git a/src/gui/widgets/button-bar.hpp b/src/gui/widgets/button-bar.hpp index dfa346467..d9a0b2d79 100644 --- a/src/gui/widgets/button-bar.hpp +++ b/src/gui/widgets/button-bar.hpp @@ -34,7 +34,7 @@ namespace widgets { /** * A modified toolbar widget for use in dialogs. **/ -class ButtonBar : public Gtk::HBox +class ButtonBar : public Gtk::Box { public: /** @@ -59,6 +59,23 @@ public: button.signal_clicked().connect(clicked_slot); append(button); } + +private: + /* ===== Overrides ===== */ + + /** + * An event handler that is called to offer an allocation to this + * widget. + * @param requisition The area offered for this widget. + */ + void on_size_request(Gtk::Requisition* requisition); + + /** + * An event handler that is called to notify this widget to allocate + * a given area for itself. + * @param allocation The area to allocate for this widget. + */ + void on_size_allocate(Gtk::Allocation& allocation); }; } // gui diff --git a/src/gui/widgets/panel-bar.cpp b/src/gui/widgets/panel-bar.cpp index 474579cdf..25e0a34d6 100644 --- a/src/gui/widgets/panel-bar.cpp +++ b/src/gui/widgets/panel-bar.cpp @@ -39,7 +39,7 @@ namespace gui { namespace widgets { PanelBar::PanelBar(panels::Panel &owner_panel, const gchar *stock_id) : - HBox(), + Box(), panel(owner_panel), panelButton(StockID(stock_id)), lockItem(NULL) @@ -126,20 +126,66 @@ PanelBar::on_realize() unset_bg(STATE_NORMAL); } +void +PanelBar::on_size_request(Gtk::Requisition* requisition) +{ + REQUIRE(requisition); + + requisition->width = 0; + requisition->height = 0; + + Box::BoxList &list = children(); + Box::BoxList::const_iterator i; + for(i = list.begin(); i != list.end(); i++) + { + Widget *widget = (*i).get_widget(); + REQUIRE(widget); + + Requisition child_requisition = widget->size_request(); + requisition->width += child_requisition.width; + requisition->height = max(requisition->height, + child_requisition.height); + } + + ENSURE(requisition->width >= 0); + ENSURE(requisition->height >= 0); +} + void PanelBar::on_size_allocate(Gtk::Allocation& allocation) { + // Use the offered allocation for this container + set_allocation(allocation); + + // Lay out the child widgets + int offset = 0; + Box::BoxList &list = children(); + Box::BoxList::const_iterator i; + + for(i = list.begin(); i != list.end(); i++) + { + Widget *widget = (*i).get_widget(); + REQUIRE(widget); + + const Requisition child_requisition = widget->size_request(); + const Gtk::Allocation child_allocation( + offset, 0, + min(child_requisition.width, allocation.get_width() - offset), + allocation.get_height()); + + offset += child_requisition.width; + + widget->size_allocate(child_allocation); + } + + // Resize the window + int width = allocation.get_width(); if(window) { - const Requisition requisition(get_requisition()); - const int width = max(min(requisition.width, - allocation.get_width()), 0); + width = max(min(allocation.get_width(), offset), 0); window->move_resize(allocation.get_x(), allocation.get_y(), width, allocation.get_height()); } - - allocation.set_x(0); - HBox::on_size_allocate(allocation); } void diff --git a/src/gui/widgets/panel-bar.hpp b/src/gui/widgets/panel-bar.hpp index afccaa91c..30e08c91e 100644 --- a/src/gui/widgets/panel-bar.hpp +++ b/src/gui/widgets/panel-bar.hpp @@ -40,7 +40,7 @@ namespace widgets { /** * A container widget for widgets to be displayed on GDL panels grips. **/ -class PanelBar : public Gtk::HBox +class PanelBar : public Gtk::Box { public: @@ -66,6 +66,13 @@ private: **/ void on_realize(); + /** + * An event handler that is called to offer an allocation to this + * widget. + * @param requisition The area offered for this widget. + */ + void on_size_request(Gtk::Requisition* requisition); + /** * An override to intercept size allocate events. **/