summaryrefslogtreecommitdiff
path: root/src/gui/itempopup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/itempopup.cpp')
-rw-r--r--src/gui/itempopup.cpp238
1 files changed, 238 insertions, 0 deletions
diff --git a/src/gui/itempopup.cpp b/src/gui/itempopup.cpp
new file mode 100644
index 000000000..15a0be6bc
--- /dev/null
+++ b/src/gui/itempopup.cpp
@@ -0,0 +1,238 @@
+/*
+ * The Mana Client
+ * Copyright (C) 2008 The Legend of Mazzeroth Development Team
+ * Copyright (C) 2008-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "gui/itempopup.h"
+
+#include "graphics.h"
+#include "item.h"
+#include "units.h"
+
+#include "gui/gui.h"
+#include "gui/theme.h"
+
+#include "gui/widgets/icon.h"
+#include "gui/widgets/textbox.h"
+
+#include "utils/gettext.h"
+#include "utils/stringutils.h"
+
+#include "resources/image.h"
+#include "resources/resourcemanager.h"
+
+#include <guichan/font.hpp>
+
+#include <guichan/widgets/label.hpp>
+#include <guichan/widgets/container.hpp>
+
+ItemPopup::ItemPopup():
+ Popup("ItemPopup"),
+ mIcon(0)
+{
+ // Item Name
+ mItemName = new gcn::Label;
+ mItemName->setFont(boldFont);
+ mItemName->setPosition(getPadding(), getPadding());
+
+ const int fontHeight = getFont()->getHeight();
+
+ // Item Description
+ mItemDesc = new TextBox;
+ mItemDesc->setEditable(false);
+ mItemDesc->setPosition(getPadding(), fontHeight);
+
+ // Item Effect
+ mItemEffect = new TextBox;
+ mItemEffect->setEditable(false);
+ mItemEffect->setPosition(getPadding(), 2 * fontHeight + 2 * getPadding());
+
+ // Item Weight
+ mItemWeight = new TextBox;
+ mItemWeight->setEditable(false);
+ mItemWeight->setPosition(getPadding(), 3 * fontHeight + 4 * getPadding());
+
+ mIcon = new Icon(0);
+
+ add(mItemName);
+ add(mItemDesc);
+ add(mItemEffect);
+ add(mItemWeight);
+ add(mIcon);
+
+ addMouseListener(this);
+}
+
+ItemPopup::~ItemPopup()
+{
+ if (mIcon)
+ {
+ Image *image = mIcon->getImage();
+ if (image)
+ image->decRef();
+ }
+}
+
+void ItemPopup::setItem(const Item *item, bool showImage)
+{
+ if (!item)
+ return;
+
+ const ItemInfo &ii = item->getInfo();
+ setItem(ii, showImage);
+ if (item->getRefine() > 0)
+ {
+ mItemName->setCaption(strprintf("%s (+%d), %d", ii.getName().c_str(),
+ item->getRefine(), ii.getId()));
+ mItemName->adjustSize();
+ int minWidth = mItemName->getWidth() + 8;
+ if (getWidth() < minWidth)
+ setWidth(minWidth);
+ }
+}
+
+void ItemPopup::setItem(const ItemInfo &item, bool showImage)
+{
+ if (!mIcon || item.getName() == mItemName->getCaption())
+ return;
+
+ int space = 0;
+
+ Image *oldImage = mIcon->getImage();
+ if (oldImage)
+ oldImage->decRef();
+
+ if (showImage)
+ {
+ ResourceManager *resman = ResourceManager::getInstance();
+ Image *image = resman->getImage(
+ paths.getStringValue("itemIcons")
+ + item.getDisplay().image);
+
+ mIcon->setImage(image);
+ if (image)
+ {
+ int x = getPadding();
+ int y = getPadding();
+ mIcon->setPosition(x, y);
+ space = mIcon->getWidth();
+ }
+ }
+ else
+ {
+ mIcon->setImage(0);
+ }
+
+ mItemType = item.getType();
+
+ mItemName->setCaption(item.getName() + _(", ") + toString(item.getId()));
+ mItemName->adjustSize();
+ mItemName->setForegroundColor(getColor(mItemType));
+ mItemName->setPosition(getPadding() + space, getPadding());
+
+ mItemDesc->setTextWrapped(item.getDescription(), 196);
+ mItemEffect->setTextWrapped(item.getEffect(), 196);
+ mItemWeight->setTextWrapped(strprintf(_("Weight: %s"),
+ Units::formatWeight(item.getWeight()).c_str()),
+ 196);
+
+ int minWidth = mItemName->getWidth() + space;
+
+ if (mItemName->getWidth() + space > minWidth)
+ minWidth = mItemName->getWidth() + space;
+ if (mItemDesc->getMinWidth() > minWidth)
+ minWidth = mItemDesc->getMinWidth();
+ if (mItemEffect->getMinWidth() > minWidth)
+ minWidth = mItemEffect->getMinWidth();
+ if (mItemWeight->getMinWidth() > minWidth)
+ minWidth = mItemWeight->getMinWidth();
+
+ minWidth += 8;
+ setWidth(minWidth);
+
+ const int numRowsDesc = mItemDesc->getNumberOfRows();
+ const int numRowsEffect = mItemEffect->getNumberOfRows();
+ const int numRowsWeight = mItemWeight->getNumberOfRows();
+ const int height = getFont()->getHeight();
+
+ if (item.getEffect().empty())
+ {
+ setContentSize(minWidth, (numRowsDesc + numRowsWeight + getPadding()) *
+ height);
+
+ mItemWeight->setPosition(getPadding(), (numRowsDesc + getPadding()) *
+ height);
+ }
+ else
+ {
+ setContentSize(minWidth, (numRowsDesc + numRowsEffect + numRowsWeight +
+ getPadding()) * height);
+
+ mItemWeight->setPosition(getPadding(), (numRowsDesc + numRowsEffect +
+ getPadding()) * height);
+ }
+
+ mItemDesc->setPosition(getPadding(), 2 * height);
+ mItemEffect->setPosition(getPadding(),
+ (numRowsDesc + getPadding()) * height);
+}
+
+gcn::Color ItemPopup::getColor(ItemType type)
+{
+ switch (type)
+ {
+ case ITEM_UNUSABLE:
+ return Theme::getThemeColor(Theme::GENERIC);
+ case ITEM_USABLE:
+ return Theme::getThemeColor(Theme::USABLE);
+ case ITEM_EQUIPMENT_ONE_HAND_WEAPON:
+ return Theme::getThemeColor(Theme::ONEHAND);
+ case ITEM_EQUIPMENT_TWO_HANDS_WEAPON:
+ return Theme::getThemeColor(Theme::TWOHAND);
+ case ITEM_EQUIPMENT_TORSO:
+ return Theme::getThemeColor(Theme::TORSO);
+ case ITEM_EQUIPMENT_ARMS:
+ return Theme::getThemeColor(Theme::ARMS);
+ case ITEM_EQUIPMENT_HEAD:
+ return Theme::getThemeColor(Theme::HEAD);
+ case ITEM_EQUIPMENT_LEGS:
+ return Theme::getThemeColor(Theme::LEGS);
+ case ITEM_EQUIPMENT_SHIELD:
+ return Theme::getThemeColor(Theme::SHIELD);
+ case ITEM_EQUIPMENT_RING:
+ return Theme::getThemeColor(Theme::RING);
+ case ITEM_EQUIPMENT_NECKLACE:
+ return Theme::getThemeColor(Theme::NECKLACE);
+ case ITEM_EQUIPMENT_FEET:
+ return Theme::getThemeColor(Theme::FEET);
+ case ITEM_EQUIPMENT_AMMO:
+ return Theme::getThemeColor(Theme::AMMO);
+ default:
+ return Theme::getThemeColor(Theme::UNKNOWN_ITEM);
+ }
+}
+
+void ItemPopup::mouseMoved(gcn::MouseEvent &event)
+{
+ Popup::mouseMoved(event);
+
+ // When the mouse moved on top of the popup, hide it
+ setVisible(false);
+} \ No newline at end of file