Skip to content

Commit d74c377

Browse files
committedJun 17, 2013
Formspec: Don't perform black magic if selected item fits the guess
1 parent c8ed61b commit d74c377

File tree

2 files changed

+49
-48
lines changed

2 files changed

+49
-48
lines changed
 

‎src/guiFormSpecMenu.cpp

+48-48
Original file line numberDiff line numberDiff line change
@@ -912,11 +912,20 @@ void GUIFormSpecMenu::drawMenu()
912912

913913
void GUIFormSpecMenu::updateSelectedItem()
914914
{
915+
// If the selected stack has become empty for some reason, deselect it.
916+
// If the selected stack has become inaccessible, deselect it.
917+
// If the selected stack has become smaller, adjust m_selected_amount.
918+
ItemStack selected = verifySelectedItem();
919+
915920
// WARNING: BLACK MAGIC
916921
// See if there is a stack suited for our current guess.
917922
// If such stack does not exist, clear the guess.
918-
if(m_selected_content_guess.name != "")
919-
{
923+
if(m_selected_content_guess.name != "" &&
924+
selected.name == m_selected_content_guess.name &&
925+
selected.count == m_selected_content_guess.count){
926+
// Selected item fits the guess. Skip the black magic.
927+
}
928+
else if(m_selected_content_guess.name != ""){
920929
bool found = false;
921930
for(u32 i=0; i<m_inventorylists.size() && !found; i++){
922931
const ListDrawSpec &s = m_inventorylists[i];
@@ -934,23 +943,12 @@ void GUIFormSpecMenu::updateSelectedItem()
934943
if(stack.name == m_selected_content_guess.name &&
935944
stack.count == m_selected_content_guess.count){
936945
found = true;
937-
if(m_selected_item){
938-
// If guessed stack is already selected, all is fine
939-
if(m_selected_item->inventoryloc == s.inventoryloc &&
940-
m_selected_item->listname == s.listname &&
941-
m_selected_item->i == (s32)item_i &&
942-
m_selected_amount == stack.count){
943-
break;
944-
}
945-
delete m_selected_item;
946-
m_selected_item = NULL;
947-
}
948946
infostream<<"Client: Changing selected content guess to "
949947
<<s.inventoryloc.dump()<<" "<<s.listname
950948
<<" "<<item_i<<std::endl;
949+
delete m_selected_item;
951950
m_selected_item = new ItemSpec(s.inventoryloc, s.listname, item_i);
952951
m_selected_amount = stack.count;
953-
break;
954952
}
955953
}
956954
}
@@ -960,35 +958,6 @@ void GUIFormSpecMenu::updateSelectedItem()
960958
m_selected_content_guess.name = "";
961959
}
962960
}
963-
// If the selected stack has become empty for some reason, deselect it.
964-
// If the selected stack has become smaller, adjust m_selected_amount.
965-
if(m_selected_item)
966-
{
967-
bool selection_valid = false;
968-
if(m_selected_item->isValid())
969-
{
970-
Inventory *inv = m_invmgr->getInventory(m_selected_item->inventoryloc);
971-
if(inv)
972-
{
973-
InventoryList *list = inv->getList(m_selected_item->listname);
974-
if(list && (u32) m_selected_item->i < list->getSize())
975-
{
976-
ItemStack stack = list->getItem(m_selected_item->i);
977-
if(m_selected_amount > stack.count)
978-
m_selected_amount = stack.count;
979-
if(!stack.empty())
980-
selection_valid = true;
981-
}
982-
}
983-
}
984-
if(!selection_valid)
985-
{
986-
delete m_selected_item;
987-
m_selected_item = NULL;
988-
m_selected_amount = 0;
989-
m_selected_dragging = false;
990-
}
991-
}
992961

993962
// If craftresult is nonempty and nothing else is selected, select it now.
994963
if(!m_selected_item)
@@ -1017,12 +986,43 @@ void GUIFormSpecMenu::updateSelectedItem()
1017986
// If craftresult is selected, keep the whole stack selected
1018987
if(m_selected_item && m_selected_item->listname == "craftresult")
1019988
{
1020-
Inventory *inv = m_invmgr->getInventory(m_selected_item->inventoryloc);
1021-
assert(inv);
1022-
InventoryList *list = inv->getList(m_selected_item->listname);
1023-
assert(list);
1024-
m_selected_amount = list->getItem(m_selected_item->i).count;
989+
m_selected_amount = verifySelectedItem().count;
990+
}
991+
}
992+
993+
ItemStack GUIFormSpecMenu::verifySelectedItem()
994+
{
995+
// If the selected stack has become empty for some reason, deselect it.
996+
// If the selected stack has become inaccessible, deselect it.
997+
// If the selected stack has become smaller, adjust m_selected_amount.
998+
// Return the selected stack.
999+
1000+
if(m_selected_item)
1001+
{
1002+
if(m_selected_item->isValid())
1003+
{
1004+
Inventory *inv = m_invmgr->getInventory(m_selected_item->inventoryloc);
1005+
if(inv)
1006+
{
1007+
InventoryList *list = inv->getList(m_selected_item->listname);
1008+
if(list && (u32) m_selected_item->i < list->getSize())
1009+
{
1010+
ItemStack stack = list->getItem(m_selected_item->i);
1011+
if(m_selected_amount > stack.count)
1012+
m_selected_amount = stack.count;
1013+
if(!stack.empty())
1014+
return stack;
1015+
}
1016+
}
1017+
}
1018+
1019+
// selection was not valid
1020+
delete m_selected_item;
1021+
m_selected_item = NULL;
1022+
m_selected_amount = 0;
1023+
m_selected_dragging = false;
10251024
}
1025+
return ItemStack();
10261026
}
10271027

10281028
void GUIFormSpecMenu::acceptInput()

‎src/guiFormSpecMenu.h

+1
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ class GUIFormSpecMenu : public GUIModalMenu
186186
void drawSelectedItem();
187187
void drawMenu();
188188
void updateSelectedItem();
189+
ItemStack verifySelectedItem();
189190

190191
void acceptInput();
191192
bool OnEvent(const SEvent& event);

0 commit comments

Comments
 (0)
Please sign in to comment.