aboutsummaryrefslogtreecommitdiff
path: root/src/guiFormSpecMenu.cpp
diff options
context:
space:
mode:
authorWeblate <42@minetest.ru>2013-06-21 10:24:16 +0200
committerWeblate <42@minetest.ru>2013-06-21 10:24:16 +0200
commit3af90db5b51da0c37f77fe6410e488c8c27acd67 (patch)
tree12edd6f0661b464e36863517241b5ec0b87b5ec1 /src/guiFormSpecMenu.cpp
parent58f3cd3eb598a7cf79983fe9e48c738591c6e004 (diff)
parentb1ebd9f79c63cf78b0e0fb2ea6f52d82cdfb95b6 (diff)
downloadminetest-3af90db5b51da0c37f77fe6410e488c8c27acd67.tar.gz
minetest-3af90db5b51da0c37f77fe6410e488c8c27acd67.tar.bz2
minetest-3af90db5b51da0c37f77fe6410e488c8c27acd67.zip
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'src/guiFormSpecMenu.cpp')
-rw-r--r--src/guiFormSpecMenu.cpp98
1 files changed, 49 insertions, 49 deletions
diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp
index 3e0d7fd46..c1b256f08 100644
--- a/src/guiFormSpecMenu.cpp
+++ b/src/guiFormSpecMenu.cpp
@@ -698,7 +698,7 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase)
bool selected = m_selected_item
&& m_invmgr->getInventory(m_selected_item->inventoryloc) == inv
&& m_selected_item->listname == s.listname
- && m_selected_item->i == i;
+ && m_selected_item->i == item_i;
bool hovering = rect.isPointInside(m_pointer);
if(phase == 0)
@@ -912,11 +912,20 @@ void GUIFormSpecMenu::drawMenu()
void GUIFormSpecMenu::updateSelectedItem()
{
+ // If the selected stack has become empty for some reason, deselect it.
+ // If the selected stack has become inaccessible, deselect it.
+ // If the selected stack has become smaller, adjust m_selected_amount.
+ ItemStack selected = verifySelectedItem();
+
// WARNING: BLACK MAGIC
// See if there is a stack suited for our current guess.
// If such stack does not exist, clear the guess.
- if(m_selected_content_guess.name != "")
- {
+ if(m_selected_content_guess.name != "" &&
+ selected.name == m_selected_content_guess.name &&
+ selected.count == m_selected_content_guess.count){
+ // Selected item fits the guess. Skip the black magic.
+ }
+ else if(m_selected_content_guess.name != ""){
bool found = false;
for(u32 i=0; i<m_inventorylists.size() && !found; i++){
const ListDrawSpec &s = m_inventorylists[i];
@@ -934,23 +943,12 @@ void GUIFormSpecMenu::updateSelectedItem()
if(stack.name == m_selected_content_guess.name &&
stack.count == m_selected_content_guess.count){
found = true;
- if(m_selected_item){
- // If guessed stack is already selected, all is fine
- if(m_selected_item->inventoryloc == s.inventoryloc &&
- m_selected_item->listname == s.listname &&
- m_selected_item->i == (s32)item_i &&
- m_selected_amount == stack.count){
- break;
- }
- delete m_selected_item;
- m_selected_item = NULL;
- }
infostream<<"Client: Changing selected content guess to "
<<s.inventoryloc.dump()<<" "<<s.listname
<<" "<<item_i<<std::endl;
+ delete m_selected_item;
m_selected_item = new ItemSpec(s.inventoryloc, s.listname, item_i);
m_selected_amount = stack.count;
- break;
}
}
}
@@ -960,35 +958,6 @@ void GUIFormSpecMenu::updateSelectedItem()
m_selected_content_guess.name = "";
}
}
- // If the selected stack has become empty for some reason, deselect it.
- // If the selected stack has become smaller, adjust m_selected_amount.
- if(m_selected_item)
- {
- bool selection_valid = false;
- if(m_selected_item->isValid())
- {
- Inventory *inv = m_invmgr->getInventory(m_selected_item->inventoryloc);
- if(inv)
- {
- InventoryList *list = inv->getList(m_selected_item->listname);
- if(list && (u32) m_selected_item->i < list->getSize())
- {
- ItemStack stack = list->getItem(m_selected_item->i);
- if(m_selected_amount > stack.count)
- m_selected_amount = stack.count;
- if(!stack.empty())
- selection_valid = true;
- }
- }
- }
- if(!selection_valid)
- {
- delete m_selected_item;
- m_selected_item = NULL;
- m_selected_amount = 0;
- m_selected_dragging = false;
- }
- }
// If craftresult is nonempty and nothing else is selected, select it now.
if(!m_selected_item)
@@ -1017,12 +986,43 @@ void GUIFormSpecMenu::updateSelectedItem()
// If craftresult is selected, keep the whole stack selected
if(m_selected_item && m_selected_item->listname == "craftresult")
{
- Inventory *inv = m_invmgr->getInventory(m_selected_item->inventoryloc);
- assert(inv);
- InventoryList *list = inv->getList(m_selected_item->listname);
- assert(list);
- m_selected_amount = list->getItem(m_selected_item->i).count;
+ m_selected_amount = verifySelectedItem().count;
+ }
+}
+
+ItemStack GUIFormSpecMenu::verifySelectedItem()
+{
+ // If the selected stack has become empty for some reason, deselect it.
+ // If the selected stack has become inaccessible, deselect it.
+ // If the selected stack has become smaller, adjust m_selected_amount.
+ // Return the selected stack.
+
+ if(m_selected_item)
+ {
+ if(m_selected_item->isValid())
+ {
+ Inventory *inv = m_invmgr->getInventory(m_selected_item->inventoryloc);
+ if(inv)
+ {
+ InventoryList *list = inv->getList(m_selected_item->listname);
+ if(list && (u32) m_selected_item->i < list->getSize())
+ {
+ ItemStack stack = list->getItem(m_selected_item->i);
+ if(m_selected_amount > stack.count)
+ m_selected_amount = stack.count;
+ if(!stack.empty())
+ return stack;
+ }
+ }
+ }
+
+ // selection was not valid
+ delete m_selected_item;
+ m_selected_item = NULL;
+ m_selected_amount = 0;
+ m_selected_dragging = false;
}
+ return ItemStack();
}
void GUIFormSpecMenu::acceptInput()