/* * 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 #include #include "../graphics.h" #include "../log.h" #include "../resources/image.h" #include "../resources/iteminfo.h" #include "../resources/resourcemanager.h" #include "../utils/gettext.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)->drawImage( mSmileyImg->get(i), itemX, itemY); // Draw selection image below selected item if (mSelectedItemIndex == i) { static_cast(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::iterator i_end = mListeners.end(); std::list::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); } }