the rules are: - our own headers go before any library headers - all headers need to be spelled relative to include root - ensure that gtk is always included via gui/gtk-base.hpp
114 lines
3 KiB
C++
114 lines
3 KiB
C++
/*
|
|
button-bar.cpp - Implementation of the button bar widget
|
|
|
|
Copyright (C) Lumiera.org
|
|
2009, Joel Holdsworth <joel@airwebreathe.org.uk>
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation; either version 2 of
|
|
the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
* *****************************************************/
|
|
|
|
#include "gui/widgets/button-bar.hpp"
|
|
#include "include/logging.h"
|
|
|
|
#include <algorithm>
|
|
|
|
using namespace Gtk;
|
|
using namespace Glib;
|
|
using namespace sigc;
|
|
using namespace std;
|
|
|
|
namespace gui {
|
|
namespace widgets {
|
|
|
|
ButtonBar::ButtonBar()
|
|
{
|
|
set_flags(Gtk::NO_WINDOW);
|
|
}
|
|
|
|
void
|
|
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();
|
|
Gtk::Allocation child_allocation(
|
|
allocation.get_x() + offset,
|
|
allocation.get_y(),
|
|
child_requisition.width,
|
|
allocation.get_height());
|
|
|
|
offset += child_requisition.width;
|
|
|
|
if(get_direction() == TEXT_DIR_RTL)
|
|
{
|
|
child_allocation.set_x(
|
|
2*allocation.get_x() + allocation.get_width() -
|
|
child_allocation.get_x() - child_allocation.get_width());
|
|
}
|
|
|
|
if(offset > allocation.get_width())
|
|
widget->set_child_visible(false);
|
|
else
|
|
{
|
|
widget->size_allocate(child_allocation);
|
|
widget->set_child_visible(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
} // widgets
|
|
} // gui
|