@@ -912,11 +912,20 @@ void GUIFormSpecMenu::drawMenu()
912
912
913
913
void GUIFormSpecMenu::updateSelectedItem ()
914
914
{
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
+
915
920
// WARNING: BLACK MAGIC
916
921
// See if there is a stack suited for our current guess.
917
922
// 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 != " " ){
920
929
bool found = false ;
921
930
for (u32 i=0 ; i<m_inventorylists.size () && !found; i++){
922
931
const ListDrawSpec &s = m_inventorylists[i];
@@ -934,23 +943,12 @@ void GUIFormSpecMenu::updateSelectedItem()
934
943
if (stack.name == m_selected_content_guess.name &&
935
944
stack.count == m_selected_content_guess.count ){
936
945
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
- }
948
946
infostream<<" Client: Changing selected content guess to "
949
947
<<s.inventoryloc .dump ()<<" " <<s.listname
950
948
<<" " <<item_i<<std::endl;
949
+ delete m_selected_item;
951
950
m_selected_item = new ItemSpec (s.inventoryloc , s.listname , item_i);
952
951
m_selected_amount = stack.count ;
953
- break ;
954
952
}
955
953
}
956
954
}
@@ -960,35 +958,6 @@ void GUIFormSpecMenu::updateSelectedItem()
960
958
m_selected_content_guess.name = " " ;
961
959
}
962
960
}
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
- }
992
961
993
962
// If craftresult is nonempty and nothing else is selected, select it now.
994
963
if (!m_selected_item)
@@ -1017,12 +986,43 @@ void GUIFormSpecMenu::updateSelectedItem()
1017
986
// If craftresult is selected, keep the whole stack selected
1018
987
if (m_selected_item && m_selected_item->listname == " craftresult" )
1019
988
{
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 ;
1025
1024
}
1025
+ return ItemStack ();
1026
1026
}
1027
1027
1028
1028
void GUIFormSpecMenu::acceptInput ()
0 commit comments