/* * The Mana Client * Copyright (C) 2007-2009 The Mana World Development Team * Copyright (C) 2009-2012 The Mana Developers * * This file is part of The Mana Client. * * This program 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. * * This program 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 this program. If not, see . */ #include "gui/widgets/itemshortcutcontainer.h" #include "configuration.h" #include "graphics.h" #include "inventory.h" #include "item.h" #include "itemshortcut.h" #include "keyboardconfig.h" #include "playerinfo.h" #include "gui/inventorywindow.h" #include "gui/itempopup.h" #include "gui/palette.h" #include "gui/viewport.h" #include "resources/image.h" #include "resources/iteminfo.h" #include "resources/theme.h" #include "utils/stringutils.h" ItemShortcutContainer::ItemShortcutContainer(): ShortcutContainer(), mItemClicked(false), mItemMoved(nullptr) { addMouseListener(this); addWidgetListener(this); mItemPopup = new ItemPopup; mBackgroundImg = Theme::getImageFromTheme("item_shortcut_bgr.png"); mMaxItems = itemShortcut->getItemCount(); mBackgroundImg->setAlpha(config.getFloatValue("guialpha")); mBoxHeight = mBackgroundImg->getHeight(); mBoxWidth = mBackgroundImg->getWidth(); } ItemShortcutContainer::~ItemShortcutContainer() { mBackgroundImg->decRef(); delete mItemPopup; } void ItemShortcutContainer::draw(gcn::Graphics *graphics) { if (config.getFloatValue("guialpha") != mAlpha) { mAlpha = config.getFloatValue("guialpha"); mBackgroundImg->setAlpha(mAlpha); } auto *g = static_cast(graphics); graphics->setFont(getFont()); for (int i = 0; i < mMaxItems; i++) { const int itemX = (i % mGridWidth) * mBoxWidth; const int itemY = (i / mGridWidth) * mBoxHeight; g->drawImage(mBackgroundImg, itemX, itemY); // Draw item keyboard shortcut. const char *key = SDL_GetKeyName( (SDL_Scancode) keyboard.getKeyValue(keyboard.KEY_SHORTCUT_1 + i)); graphics->setColor(Theme::getThemeColor(Theme::TEXT)); g->drawText(key, itemX + 2, itemY + 2, gcn::Graphics::LEFT); if (itemShortcut->getItem(i) < 0) continue; Item *item = PlayerInfo::getInventory()->findItem(itemShortcut->getItem(i)); if (item) { // Draw item icon. Image* image = item->getImage(); if (image) { std::string caption; if (item->getQuantity() > 1) caption = toString(item->getQuantity()); else if (item->isEquipped()) caption = "Eq."; image->setAlpha(1.0f); g->drawImage(image, itemX, itemY); if (item->isEquipped()) g->setColor(Theme::getThemeColor(Theme::ITEM_EQUIPPED)); g->drawText(caption, itemX + mBoxWidth / 2, itemY + mBoxHeight - 14, gcn::Graphics::CENTER); } } } if (mItemMoved) { // Draw the item image being dragged by the cursor. Image* image = mItemMoved->getImage(); if (image) { const int tPosX = mCursorPosX - (image->getWidth() / 2); const int tPosY = mCursorPosY - (image->getHeight() / 2); g->drawImage(image, tPosX, tPosY); g->drawText(toString(mItemMoved->getQuantity()), tPosX + mBoxWidth / 2, tPosY + mBoxHeight - 14, gcn::Graphics::CENTER); } } } void ItemShortcutContainer::mouseDragged(gcn::MouseEvent &event) { if (event.getButton() == gcn::MouseEvent::LEFT) { if (!mItemMoved && mItemClicked) { const int index = getIndexFromGrid(event.getX(), event.getY()); if (index == -1) return; const int itemId = itemShortcut->getItem(index); if (itemId < 0) return; Item *item = PlayerInfo::getInventory()->findItem(itemId); if (item) { mItemMoved = item; itemShortcut->removeItem(index); } } if (mItemMoved) { mCursorPosX = event.getX(); mCursorPosY = event.getY(); } } } void ItemShortcutContainer::mousePressed(gcn::MouseEvent &event) { const int index = getIndexFromGrid(event.getX(), event.getY()); if (index == -1) return; if (event.getButton() == gcn::MouseEvent::LEFT) { // Stores the selected item if theirs one. if (itemShortcut->isItemSelected() && inventoryWindow->isVisible()) { itemShortcut->setItem(index); itemShortcut->setItemSelected(-1); } else if (itemShortcut->getItem(index)) mItemClicked = true; } else if (event.getButton() == gcn::MouseEvent::RIGHT) { Item *item = PlayerInfo::getInventory()-> findItem(itemShortcut->getItem(index)); if (!item) return; // Convert relative to the window coordinates to absolute screen // coordinates. viewport->showPopup(nullptr, viewport->getMouseX(), viewport->getMouseY(), item); } } void ItemShortcutContainer::mouseReleased(gcn::MouseEvent &event) { if (event.getButton() == gcn::MouseEvent::LEFT) { if (itemShortcut->isItemSelected()) itemShortcut->setItemSelected(-1); const int index = getIndexFromGrid(event.getX(), event.getY()); if (index == -1) { mItemMoved = nullptr; return; } if (mItemMoved) { itemShortcut->setItems(index, mItemMoved->getId()); mItemMoved = nullptr; } else if (itemShortcut->getItem(index) && mItemClicked) { itemShortcut->useItem(index); } if (mItemClicked) mItemClicked = false; } } // Show ItemTooltip void ItemShortcutContainer::mouseMoved(gcn::MouseEvent &event) { const int index = getIndexFromGrid(event.getX(), event.getY()); if (index == -1) return; const int itemId = itemShortcut->getItem(index); if (itemId < 0) return; Item *item = PlayerInfo::getInventory()->findItem(itemId); if (item) { mItemPopup->setItem(item->getInfo()); mItemPopup->position(viewport->getMouseX(), viewport->getMouseY()); } else { mItemPopup->setVisible(false); } } // Hide ItemTooltip void ItemShortcutContainer::mouseExited(gcn::MouseEvent &event) { mItemPopup->setVisible(false); }