/* * The Mana World * Copyright 2008 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 * * $Id$ */ #include #include "tab.h" #include "tabbedarea.h" #include "../../graphics.h" #include "../../resources/image.h" #include "../../resources/resourcemanager.h" #include "../../utils/dtor.h" int Tab::mInstances = 0; enum{ TAB_STANDARD, // 0 TAB_HIGHLIGHTED, // 1 TAB_SELECTED, // 2 TAB_UNUSED, // 3 TAB_COUNT // 4 - Must be last. }; struct TabData { char const *file; int gridX; int gridY; }; static TabData const data[TAB_COUNT] = { {"graphics/gui/tab.png", 0, 0}, {"graphics/gui/tab.png", 9, 4}, {"graphics/gui/tabselected.png", 16, 19}, {"graphics/gui/tab.png", 25, 23} }; ImageRect Tab::tabImg[TAB_COUNT]; Tab::Tab() : gcn::Tab() { init(); } Tab::~Tab() { mInstances--; if (mInstances == 0) { for (int mode = 0; mode < TAB_COUNT; mode++) { for_each(tabImg[mode].grid, tabImg[mode].grid + 9, dtor()); } } } void Tab::init() { setFrameSize(0); if (mInstances == 0) { // Load the skin ResourceManager *resman = ResourceManager::getInstance(); Image *tab[TAB_COUNT]; int a, x, y, mode; for (mode = 0; mode < TAB_COUNT; mode++) { tab[mode] = resman->getImage(data[mode].file); a = 0; for (y = 0; y < 3; y++) { for (x = 0; x < 3; x++) { tabImg[mode].grid[a] = tab[mode]->getSubImage( data[x].gridX, data[y].gridY, data[x + 1].gridX - data[x].gridX + 1, data[y + 1].gridY - data[y].gridY + 1); a++; } } tab[mode]->decRef(); } } mInstances++; } void Tab::draw(gcn::Graphics *graphics) { int mode; // check which type of tab to draw if (mTabbedArea && mTabbedArea->isTabSelected(this)) { mode = TAB_SELECTED; } else { mode = TAB_STANDARD; } // draw tab static_cast(graphics)-> drawImageRect(0, 0, getWidth(), getHeight(), tabImg[mode]); // draw label drawChildren(graphics); }