All pastes #1420262 Raw Edit

Mine

public diff v1 · immutable
#1420262 ·published 2009-05-12 09:26 UTC
rendered paste body
From 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