diff options
Diffstat (limited to 'src/gui/smileycontainer.cpp')
-rw-r--r-- | src/gui/smileycontainer.cpp | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/src/gui/smileycontainer.cpp b/src/gui/smileycontainer.cpp new file mode 100644 index 00000000..5eb99723 --- /dev/null +++ b/src/gui/smileycontainer.cpp @@ -0,0 +1,164 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World 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 + * any later version. + * + * The Mana World 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 The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "smileycontainer.h" + +#include <guichan/mouseinput.hpp> +#include <guichan/selectionlistener.hpp> + +#include "../graphics.h" +#include "../log.h" + +#include "../resources/image.h" +#include "../resources/iteminfo.h" +#include "../resources/resourcemanager.h" + +#include "../utils/tostring.h" + +const int SmileyContainer::gridWidth = 34; // item icon width + 4 +const int SmileyContainer::gridHeight = 36; // item icon height + 4 + +static const int NO_ITEM = -1; + +SmileyContainer::SmileyContainer(): + mSelectedItemIndex(NO_ITEM) +{ + ResourceManager *resman = ResourceManager::getInstance(); + + mSmileyImg = resman->getImageSet("graphics/gui/emotions.png",30,32); + if (!mSmileyImg) logger->error("Unable to load emotions"); + + mSelImg = resman->getImage("graphics/gui/selection.png"); + if (!mSelImg) logger->error("Unable to load selection.png"); + + mMaxSmiley = mSmileyImg->size(); + + addMouseListener(this); + addWidgetListener(this); +} + +SmileyContainer::~SmileyContainer() +{ + if (mSmileyImg) + { + mSmileyImg->decRef(); + mSmileyImg=NULL; + } + if (!mSelImg) + { + mSelImg->decRef(); + mSelImg=NULL; + } +} + +void SmileyContainer::draw(gcn::Graphics *graphics) +{ + int columns = getWidth() / gridWidth; + + // Have at least 1 column + if (columns < 1) + { + columns = 1; + } + + for (int i = 0; i < mMaxSmiley ; i++) + { + int itemX = ((i) % columns) * gridWidth; + int itemY = ((i) / columns) * gridHeight; + + + // Draw item icon + static_cast<Graphics*>(graphics)->drawImage( + mSmileyImg->get(i), itemX, itemY); + + // Draw selection image below selected item + if (mSelectedItemIndex == i) + { + static_cast<Graphics*>(graphics)->drawImage( + mSelImg, itemX, itemY); + } + } +} + +void SmileyContainer::widgetResized(const gcn::Event &event) +{ + recalculateHeight(); +} + +void SmileyContainer::recalculateHeight() +{ + int cols = getWidth() / gridWidth; + + if (cols < 1) + cols = 1; + + const int rows = (mMaxSmiley / cols) + (mMaxSmiley % cols > 0 ? 1 : 0); + const int height = rows * gridHeight + 8; + if (height != getHeight()) + setHeight(height); +} + +int SmileyContainer::getSelectedSmiley() +{ + if (mSelectedItemIndex == NO_ITEM) + return 0; + + return 1+mSelectedItemIndex; +} + +void SmileyContainer::selectNone() +{ + setSelectedItemIndex(NO_ITEM); +} + +void SmileyContainer::setSelectedItemIndex(int index) +{ + if (index < 0 || index >= mMaxSmiley ) + mSelectedItemIndex = NO_ITEM; + else + mSelectedItemIndex = index; +} + +void SmileyContainer::distributeValueChangedEvent() +{ + gcn::SelectionEvent event(this); + std::list<gcn::SelectionListener*>::iterator i_end = mListeners.end(); + std::list<gcn::SelectionListener*>::iterator i; + + for (i = mListeners.begin(); i != i_end; ++i) + { + (*i)->valueChanged(event); + } +} + +void SmileyContainer::mousePressed(gcn::MouseEvent &event) +{ + int button = event.getButton(); + if (button == gcn::MouseEvent::LEFT || button == gcn::MouseEvent::RIGHT) + { + int columns = getWidth() / gridWidth; + int mx = event.getX(); + int my = event.getY(); + int index = mx / gridWidth + ((my / gridHeight) * columns); + + setSelectedItemIndex(index); + } +} |