rendered paste bodyFrom 45c7fc683c1db193958d283287cae5aeee2f1438 Mon Sep 17 00:00:00 2001From: Chuck Miller <shadowmil@gmail.com>Date: Tue, 12 May 2009 05:24:26 -0400Subject: [PATCH] Makes ItemContainer use indexes for selected and highlighted items, rather then Item pointers.As suggested by Bjorn--- src/gui/itemcontainer.cpp | 112 ++++++++++++++++++-------------------------- src/gui/itemcontainer.h | 10 ++-- 2 files changed, 52 insertions(+), 70 deletions(-)diff --git a/src/gui/itemcontainer.cpp b/src/gui/itemcontainer.cppindex d2712cb..026b067 100644--- a/src/gui/itemcontainer.cpp+++ b/src/gui/itemcontainer.cpp@@ -53,8 +53,8 @@ ItemContainer::ItemContainer(Inventory *inventory, bool forceQuantity): mInventory(inventory), mGridColumns(1), mGridRows(1),- mSelectedItem(NULL),- mHighlightedItem(NULL),+ mSelectedIndex(-1),+ mHighlightedIndex(-1), mSelectionStatus(SEL_NONE), mForceQuantity(forceQuantity), mSwapItems(false),@@ -101,7 +101,7 @@ void ItemContainer::draw(gcn::Graphics *graphics) Image *image = item->getImage(); if (image) {- if (item == mSelectedItem)+ if ((j * mGridColumns) + i == mSelectedIndex) { if (mSelectionStatus == SEL_DRAGGING) { // Reposition the coords to that of the cursor.@@ -133,11 +133,10 @@ void ItemContainer::draw(gcn::Graphics *graphics) } // Draw an orange box around the selected item- if (isFocused() && mHighlightedItem)+ if (isFocused() && mHighlightedIndex != -1) {- const int i = mHighlightedItem->getInvIndex();- const int itemX = (i % mGridColumns) * BOX_WIDTH;- const int itemY = (i / mGridColumns) * BOX_HEIGHT;+ const int itemX = (mHighlightedIndex % mGridColumns) * BOX_WIDTH;+ const int itemY = (mHighlightedIndex / mGridColumns) * BOX_HEIGHT; g->setColor(gcn::Color(255, 128, 0)); g->drawRectangle(gcn::Rectangle(itemX, itemY, BOX_WIDTH, BOX_HEIGHT)); }@@ -145,14 +144,15 @@ void ItemContainer::draw(gcn::Graphics *graphics) void ItemContainer::selectNone() {- setSelectedItem(NULL);+ setSelectedIndex(-1);+ mSelectionStatus = SEL_NONE; } -void ItemContainer::setSelectedItem(Item *item)+void ItemContainer::setSelectedIndex(int newIndex) {- if (mSelectedItem != item)+ if (mSelectedIndex != newIndex) {- mSelectedItem = item;+ mSelectedIndex = newIndex; distributeValueChangedEvent(); } }@@ -229,21 +229,20 @@ void ItemContainer::mousePressed(gcn::MouseEvent &event) chatWindow->addItemText(item->getInfo().getName()); } - if (mSelectedItem && mSelectedItem == item)+ if (mSelectedIndex == index) { mSelectionStatus = SEL_DESELECTING; } else if (item && item->getId()) {- setSelectedItem(item);+ setSelectedIndex(index); mSelectionStatus = SEL_SELECTING; itemShortcut->setItemSelected(item->getId()); } else {- setSelectedItem(NULL);- mSelectionStatus = SEL_NONE;+ selectNone(); } } }@@ -266,8 +265,7 @@ void ItemContainer::mouseReleased(gcn::MouseEvent &event) mSelectionStatus = SEL_SELECTED; return; case SEL_DESELECTING:- setSelectedItem(NULL);- mSelectionStatus = SEL_NONE;+ selectNone(); return; case SEL_DRAGGING: mSelectionStatus = SEL_SELECTED;@@ -279,12 +277,10 @@ void ItemContainer::mouseReleased(gcn::MouseEvent &event) int index = getSlotIndex(event.getX(), event.getY()); if (index == Inventory::NO_SLOT_INDEX) return;- Item *item = mInventory->getItem(index);- if (item == mSelectedItem)+ if (index == mSelectedIndex || !getSelectedItem()) return;- player_node->moveInvItem(mSelectedItem, index);- setSelectedItem(NULL);- mSelectionStatus = SEL_NONE;+ player_node->moveInvItem(getSelectedItem(), index);+ selectNone(); } @@ -320,20 +316,6 @@ void ItemContainer::widgetResized(const gcn::Event &event) setHeight(mGridRows * BOX_HEIGHT); } -Item *ItemContainer::getSelectedItem()-{- if (!mSelectedItem)- return NULL;-- if (!mInventory->contains(mSelectedItem))- {- mSelectedItem = NULL;- return NULL;- }-- return mSelectedItem;-}- int ItemContainer::getSlotIndex(int x, int y) const { if (x < getWidth() && y < getHeight())@@ -346,49 +328,47 @@ int ItemContainer::getSlotIndex(int x, int y) const void ItemContainer::keyAction() { // If there is no highlight then return.- if (!mHighlightedItem)+ if (mHighlightedIndex == -1) return; // If the highlight is on the selected item, then deselect it.- if (mHighlightedItem == mSelectedItem)+ if (mHighlightedIndex == mSelectedIndex) {- setSelectedItem(NULL);- mSelectionStatus = SEL_NONE;+ selectNone(); } // Check and swap items if necessary. else if (mSwapItems &&- mSelectedItem &&- mHighlightedItem->getId())+ mSelectedIndex != -1 &&+ mHighlightedIndex != -1) { player_node->moveInvItem(- mSelectedItem, mHighlightedItem->getInvIndex());- setSelectedItem(mHighlightedItem);+ getSelectedItem(), mHighlightedIndex);+ setSelectedIndex(mHighlightedIndex); } // If the highlight is on an item then select it.- else if (mHighlightedItem->getId())+ else if (mHighlightedIndex != -1) {- setSelectedItem(mHighlightedItem);+ setSelectedIndex(mHighlightedIndex); mSelectionStatus = SEL_SELECTED; } // If the highlight is on a blank space then move it.- else if (mSelectedItem)+ else if (mSelectedIndex != -1) { player_node->moveInvItem(- mSelectedItem, mHighlightedItem->getInvIndex());- setSelectedItem(NULL);- mSelectionStatus = SEL_NONE;+ getSelectedItem(), mHighlightedIndex);+ selectNone(); } } void ItemContainer::moveHighlight(Direction direction) {- if (!mHighlightedItem)+ if (mHighlightedIndex == -1) {- if (mSelectedItem) {- mHighlightedItem = mSelectedItem;+ if (mSelectedIndex != -1) {+ mHighlightedIndex = mSelectedIndex; } else {- mHighlightedItem = mInventory->getItem(0);+ mHighlightedIndex = 0; } return; }@@ -396,34 +376,34 @@ void ItemContainer::moveHighlight(Direction direction) switch (direction) { case Left:- if (mHighlightedItem->getInvIndex() % mGridColumns == 0)+ if (mHighlightedIndex % mGridColumns == 0) {- mHighlightedItem += mGridColumns;+ mHighlightedIndex += mGridColumns; }- mHighlightedItem--;+ mHighlightedIndex--; break; case Right:- if ((mHighlightedItem->getInvIndex() % mGridColumns) ==+ if ((mHighlightedIndex % mGridColumns) == (mGridColumns - 1)) {- mHighlightedItem -= mGridColumns;+ mHighlightedIndex -= mGridColumns; }- mHighlightedItem++;+ mHighlightedIndex++; break; case Up:- if (mHighlightedItem->getInvIndex() / mGridColumns == 0)+ if (mHighlightedIndex / mGridColumns == 0) {- mHighlightedItem += (mGridColumns * mGridRows);+ mHighlightedIndex += (mGridColumns * mGridRows); }- mHighlightedItem -= mGridColumns;+ mHighlightedIndex -= mGridColumns; break; case Down:- if ((mHighlightedItem->getInvIndex() / mGridColumns) ==+ if ((mHighlightedIndex / mGridColumns) == (mGridRows - 1)) {- mHighlightedItem -= (mGridColumns * mGridRows);+ mHighlightedIndex -= (mGridColumns * mGridRows); }- mHighlightedItem += mGridColumns;+ mHighlightedIndex += mGridColumns; break; } }diff --git a/src/gui/itemcontainer.h b/src/gui/itemcontainer.hindex 54d7c35..3c4a2e6 100644--- a/src/gui/itemcontainer.h+++ b/src/gui/itemcontainer.h@@ -22,6 +22,8 @@ #ifndef ITEMCONTAINER_H #define ITEMCONTAINER_H +#include "inventory.h"+ #include <guichan/keylistener.hpp> #include <guichan/mouselistener.hpp> #include <guichan/widget.hpp>@@ -30,7 +32,6 @@ #include <list> class Image;-class Inventory; class Item; class ItemPopup; @@ -86,7 +87,8 @@ class ItemContainer : public gcn::Widget, /** * Returns the selected item. */- Item *getSelectedItem();+ Item *getSelectedItem() const+ { return mInventory->getItem(mSelectedIndex); } /** * Sets selected item to NULL.@@ -144,7 +146,7 @@ class ItemContainer : public gcn::Widget, /** * Sets the currently selected item. */- void setSelectedItem(Item *item);+ void setSelectedIndex(int index); /** * Find the current item index by the most recently used item ID@@ -173,7 +175,7 @@ class ItemContainer : public gcn::Widget, Inventory *mInventory; int mGridColumns, mGridRows; Image *mSelImg;- Item *mSelectedItem, *mHighlightedItem;+ int mSelectedIndex, mHighlightedIndex; SelectionState mSelectionStatus; bool mForceQuantity; bool mSwapItems;-- 1.5.4.3