diff options
| author | Bent Bisballe Nyeng <deva@aasimon.org> | 2015-09-28 17:47:49 +0200 | 
|---|---|---|
| committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2015-09-28 17:47:49 +0200 | 
| commit | f7bdf8448c3ea0fcb07a1dffb14c5811d4e91079 (patch) | |
| tree | 0c7a29816d2e565e625a701dad37fa78febf8171 /plugingui | |
| parent | 9d3d6b7c4ee891e28280af1651d8edb9357df643 (diff) | |
Add Layout machanism.
Diffstat (limited to 'plugingui')
| -rw-r--r-- | plugingui/Makefile.am.plugingui | 1 | ||||
| -rw-r--r-- | plugingui/layout.cc | 175 | ||||
| -rw-r--r-- | plugingui/layout.h | 125 | ||||
| -rw-r--r-- | plugingui/widget.h | 3 | 
4 files changed, 303 insertions, 1 deletions
| diff --git a/plugingui/Makefile.am.plugingui b/plugingui/Makefile.am.plugingui index b1698e4..e2969f0 100644 --- a/plugingui/Makefile.am.plugingui +++ b/plugingui/Makefile.am.plugingui @@ -22,6 +22,7 @@ PLUGIN_GUI_SOURCES = \  	$(top_srcdir)/plugingui/checkbox.cc \  	$(top_srcdir)/plugingui/slider.cc \  	$(top_srcdir)/plugingui/scrollbar.cc \ +	$(top_srcdir)/plugingui/layout.cc \  	$(top_srcdir)/plugingui/listbox.cc \  	$(top_srcdir)/plugingui/listboxthin.cc \  	$(top_srcdir)/plugingui/listboxbasic.cc \ diff --git a/plugingui/layout.cc b/plugingui/layout.cc new file mode 100644 index 0000000..f12887e --- /dev/null +++ b/plugingui/layout.cc @@ -0,0 +1,175 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            layout.cc + * + *  Sat Mar 21 15:12:36 CET 2015 + *  Copyright 2015 Bent Bisballe Nyeng + *  deva@aasimon.org + ****************************************************************************/ + +/* + *  This file is part of DrumGizmo. + * + *  DrumGizmo 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. + * + *  DrumGizmo 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 DrumGizmo; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. + */ +#include "layout.h" + +#include "widget.h" + +namespace GUI { + +LayoutItem::LayoutItem() +	: parent(nullptr) +{ +} + +LayoutItem::~LayoutItem() +{ +	setLayoutParent(nullptr); // Will disconnect from layout if any. +} + +void LayoutItem::setLayoutParent(Layout *p) +{ +	if(this->parent) +	{ +		this->parent->removeItem(this); +	} + +	this->parent = p; +} + +Layout::Layout(LayoutItem *parent) +{ +	this->parent = parent; +} + +void Layout::addItem(LayoutItem *item) +{ +	items.push_back(item); +	item->setLayoutParent(this); +	layout(); +} + +void Layout::removeItem(LayoutItem *item) +{ +	LayoutItemList::iterator i = items.begin(); +	while(i != items.end()) +	{ +		if(*i == item) +		{ +			i = items.erase(i); +			continue; +		} +		++i; +	} + +	layout(); +} + +// +// BoxLayout +// + +BoxLayout::BoxLayout(LayoutItem *parent) +	: Layout(parent) +{ +	resize_children = true; +} + +void BoxLayout::setResizeChildren(bool resize_children) +{ +	this->resize_children = resize_children; +} + +// +// VBoxLayout +// + +VBoxLayout::VBoxLayout(LayoutItem *parent) +	: BoxLayout(parent), align(HALIGN_CENTER) +{ +} + +void VBoxLayout::layout() +{ +	size_t y = 0; +	size_t w = parent->width(); +	size_t h = parent->height() / items.size(); + +	LayoutItemList::iterator i = items.begin(); +	while(i != items.end()) +	{ +		LayoutItem *item = *i; +		if(resize_children)item->resize(w, h); +		item->move(0, y); +		y += h; +		++i; +	} +} + +// +// HBoxLayout +// + +HBoxLayout::HBoxLayout(LayoutItem *parent) +	: BoxLayout(parent) +	, align(VALIGN_CENTER) +{ +} + +void HBoxLayout::layout() +{ +	size_t w = parent->width() / items.size(); +	size_t h = parent->height(); +	size_t x = 0; + +	LayoutItemList::iterator i = items.begin(); +	while(i != items.end()) +	{ +		LayoutItem *item = *i; +		if(resize_children) +		{ +			item->resize(w, h); +			item->move(x, 0); +		} +		else +		{ +			size_t y = 0; +			switch(align) { +			case VALIGN_TOP: +				y = 0; +				break; +			case VALIGN_CENTER: +				y = (h / 2) - (item->height() / 2); +				break; +			case VALIGN_BOTTOM: +				y = h - item->height(); +				break; +			} + +			int diff = w - item->width(); +			item->move(x + diff / 2, y); +		} +		x += w; +		++i; +	} +} + +void HBoxLayout::setVAlignment(alignment_t alignment) +{ +	align = alignment; +} + +} // GUI:: diff --git a/plugingui/layout.h b/plugingui/layout.h new file mode 100644 index 0000000..a81f004 --- /dev/null +++ b/plugingui/layout.h @@ -0,0 +1,125 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            layout.h + * + *  Sat Mar 21 15:12:36 CET 2015 + *  Copyright 2015 Bent Bisballe Nyeng + *  deva@aasimon.org + ****************************************************************************/ + +/* + *  This file is part of DrumGizmo. + * + *  DrumGizmo 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. + * + *  DrumGizmo 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 DrumGizmo; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. + */ +#pragma once + +#include <list> +#include <cstdlib> + +namespace GUI { + +class Layout; + +class LayoutItem { +public: +	LayoutItem(); +	virtual ~LayoutItem(); + +	void setLayoutParent(Layout *parent); + +	virtual void resize(int width, int height) = 0; +	virtual void move(size_t x, size_t y) = 0; +	virtual size_t x() = 0; +	virtual size_t y() = 0; +	virtual size_t width() = 0; +	virtual size_t height() = 0; + +private: +	Layout *parent; +}; + +//! \brief Abtract Layout class. +class Layout +{ +public: +	Layout(LayoutItem *parent); +	virtual ~Layout() {} + +	virtual void addItem(LayoutItem *item); +	virtual void removeItem(LayoutItem *item); + +	//! \brief Reimplement this method to create a new Layout rule. +	virtual void layout() = 0; + +protected: +	LayoutItem *parent; +	typedef std::list<LayoutItem *> LayoutItemList; +	LayoutItemList items; +}; + +//! \brief Abstract box layout +class BoxLayout : public Layout { +public: +	BoxLayout(LayoutItem *parent); + +	//! \brief Set to false to only move the items, not scale them. +	void setResizeChildren(bool resize_children); + +	virtual void layout() = 0; + +protected: +	bool resize_children; +}; + +//! \brief A Layout that lays out its elements vertically. +class VBoxLayout : public BoxLayout { +public: +	VBoxLayout(LayoutItem *parent); + +	typedef enum { +		HALIGN_LEFT, +		HALIGN_CENTER, +		HALIGN_RIGHT, +	} alignment_t; + +	void setHAlignment(alignment_t alignment); + +	virtual void layout(); + +protected: +	alignment_t align; +}; + +//! \brief A Layout that lays out its elements vertically. +class HBoxLayout : public BoxLayout { +public: +	HBoxLayout(LayoutItem *parent); + +	typedef enum { +		VALIGN_TOP, +		VALIGN_CENTER, +		VALIGN_BOTTOM, +	} alignment_t; + +	void setVAlignment(alignment_t alignment); + +	virtual void layout(); + +protected: +	alignment_t align; +}; + +} // GUI:: diff --git a/plugingui/widget.h b/plugingui/widget.h index 10b221a..32acd5c 100644 --- a/plugingui/widget.h +++ b/plugingui/widget.h @@ -29,6 +29,7 @@  #include "guievent.h"  #include "pixelbuffer.h"  #include "notifier.h" +#include "layout.h"  #include <vector> @@ -36,7 +37,7 @@ namespace GUI {  class Window; -class Widget : public Listener { +class Widget : public Listener, LayoutItem {  public:  	Widget(Widget *parent);  	virtual ~Widget(); | 
