From 242798ae46270e31135faa8e06dab34652480686 Mon Sep 17 00:00:00 2001 From: fluxgen <fluxgen> Date: Mon, 11 Aug 2003 15:28:33 +0000 Subject: gui container --- src/Container.cc | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/Container.hh | 78 +++++++++++++++++++++++ 2 files changed, 264 insertions(+) create mode 100644 src/Container.cc create mode 100644 src/Container.hh diff --git a/src/Container.cc b/src/Container.cc new file mode 100644 index 0000000..0fff44a --- /dev/null +++ b/src/Container.cc @@ -0,0 +1,186 @@ +// Container.cc +// Copyright (c) 2003 Henrik Kinnunen (fluxgen at users.sourceforge.net) +// and Simon Bowden (rathnor at users.sourceforge.net) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +// $Id: Container.cc,v 1.1 2003/08/11 15:28:33 fluxgen Exp $ + +#include "FbTk/Button.hh" +#include "Container.hh" + +#include "FbTk/EventManager.hh" + +Container::Container(const FbTk::FbWindow &parent): + FbTk::FbWindow(parent, 0, 0, 1, 1, ExposureMask), m_selected(0) { + + FbTk::EventManager::instance()->add(*this, *this); +} + +Container::~Container() { + +} + +void Container::resize(unsigned int width, unsigned int height) { + // do we need to resize? + if (FbTk::FbWindow::width() == width && + FbTk::FbWindow::height() == height) + return; + + FbTk::FbWindow::resize(width, height); + repositionItems(); +} + +void Container::moveResize(int x, int y, + unsigned int width, unsigned int height) { + FbTk::FbWindow::moveResize(x, y, width, height); + repositionItems(); +} + +void Container::insertItems(ItemList &item_list, int pos) { + + // make sure all items have parent == this + ItemList::iterator it = m_item_list.begin(); + ItemList::iterator it_end = m_item_list.end(); + for (; it != it_end; ++it) { + if ((*it)->window().parent() != this) + return; + } + + if (pos > size() || pos < 0) { + // insert last + m_item_list.splice(m_item_list.end(), item_list); + } else if (pos == 0) { + // insert first + m_item_list.splice(m_item_list.begin(), item_list); + } else { + // find insert point + for (it = m_item_list.begin(); pos != 0; ++it, --pos) + continue; + m_item_list.splice(it, item_list); + } + + m_item_list.unique(); + + // update position + repositionItems(); +} + +void Container::insertItem(Item item, int pos) { + if (find(item) != -1) + return; + + // it must be a child of this window + if (item->window().parent() != this) + return; + + if (pos >= size() || pos < 0) { + m_item_list.push_back(item); + } else if (pos == 0) { + m_item_list.push_front(item); + } else { + ItemList::iterator it = m_item_list.begin(); + for (; pos != 0; ++it, --pos) + continue; + + m_item_list.insert(it, item); + } + + // make sure we dont have duplicate items + m_item_list.unique(); + + repositionItems(); +} + +void Container::removeItem(int index) { + if (index < 0 || index > size()) + return; + + ItemList::iterator it = m_item_list.begin(); + for (; index != 0; ++it, --index) + continue; + + if (*it == selected()) + m_selected = 0; + + m_item_list.erase(it); + + repositionItems(); +} + +void Container::removeAll() { + m_selected = 0; + m_item_list.clear(); + clear(); + +} + +int Container::find(Item item) { + ItemList::iterator it = m_item_list.begin(); + ItemList::iterator it_end = m_item_list.end(); + int index = 0; + for (; it != it_end; ++it, ++index) { + if ((*it) == item) + break; + } + + if (it == it_end) + return -1; + + return index; +} + +void Container::setSelected(int pos) { + if (pos < 0 || pos >= size()) + m_selected = 0; + else { + ItemList::iterator it = m_item_list.begin(); + for (; pos != 0; --pos, ++it) + continue; + m_selected = *it; + if (m_selected) + m_selected->clear(); + } + +} + +void Container::exposeEvent(XExposeEvent &event) { + clear(); +} + +void Container::repositionItems() { + if (size() == 0) + return; + + //!! TODO vertical position + + const int max_width_per_client = maxWidthPerClient(); + + ItemList::iterator it = m_item_list.begin(); + const ItemList::iterator it_end = m_item_list.end(); + int next_x = 0; + for (; it != it_end; ++it, next_x += max_width_per_client) { + // resize each clients including border in size + (*it)->moveResize(next_x - (*it)->window().borderWidth(), + (*it)->window().borderWidth(), + max_width_per_client - (*it)->window().borderWidth(), + height() + (*it)->window().borderWidth()); + (*it)->clear(); + } +} diff --git a/src/Container.hh b/src/Container.hh new file mode 100644 index 0000000..474e55b --- /dev/null +++ b/src/Container.hh @@ -0,0 +1,78 @@ +// Container.hh +// Copyright (c) 2003 Henrik Kinnunen (fluxgen at users.sourceforge.net) +// and Simon Bowden (rathnor at users.sourceforge.net) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +// $Id: Container.hh,v 1.1 2003/08/11 15:28:33 fluxgen Exp $ + +#ifndef CONTAINER_HH +#define CONTAINER_HH + +#include "FbTk/FbWindow.hh" +#include "FbTk/EventHandler.hh" +#include "FbTk/NotCopyable.hh" + +#include <list> + +class ContainerTheme; + +namespace FbTk { +class Button; +}; + +class Container:public FbTk::FbWindow, public FbTk::EventHandler, private FbTk::NotCopyable { +public: + typedef FbTk::Button * Item; + typedef std::list<Item> ItemList; + + explicit Container(const FbTk::FbWindow &parent); + virtual ~Container(); + + // manipulators + + void resize(unsigned int width, unsigned int height); + void moveResize(int x, int y, + unsigned int width, unsigned int height); + + void insertItems(ItemList &list, int position=-1); + void insertItem(Item item, int pos = -1); + void removeItem(int item); + void removeAll(); + int find(Item item); + void setSelected(int index); + + // event handler + void exposeEvent(XExposeEvent &event); + + // accessors + int size() const { return m_item_list.size(); } + const Item selected() const { return m_selected; } + Item selected() { return m_selected; } + unsigned int maxWidthPerClient() const { return (size() == 0 ? width() : width()/size()); } + unsigned int maxHeightPerClient() const { return (size() == 0 ? height() : height()/size()); } +private: + void repositionItems(); + + ItemList m_item_list; + Item m_selected; +}; + +#endif // CONTAINER_HH + -- cgit v0.11.2