s.i = -1; // make it invalid again
}
+ bool identical = (m_selected_item != NULL) && s.isValid() &&
+ (inv_selected == inv_s) &&
+ (m_selected_item->listname == s.listname) &&
+ (m_selected_item->i == s.i);
+
// buttons: 0 = left, 1 = right, 2 = middle
// up/down: 0 = down (press), 1 = up (release), 2 = unknown event
int button = 0;
if(s.isValid())
{
- // Clicked another slot: move
+ // Clicked a slot: move
if(button == 1) // right
move_amount = 1;
else if(button == 2) // middle
move_amount = MYMIN(m_selected_amount, 10);
else // left
move_amount = m_selected_amount;
+
+ if(identical)
+ {
+ if(move_amount >= m_selected_amount)
+ m_selected_amount = 0;
+ else
+ m_selected_amount -= move_amount;
+ move_amount = 0;
+ }
}
else if(getAbsoluteClippingRect().isPointInside(m_pointer))
{
if(m_selected_item != NULL && m_selected_dragging && s.isValid())
{
- if((inv_selected != inv_s) ||
- (m_selected_item->listname != s.listname) ||
- (m_selected_item->i != s.i))
+ if(!identical)
{
// Dragged to different slot: move all selected
move_amount = m_selected_amount;
if(leftover.count == stack_from.count)
{
// Swap the stacks
+ m_selected_amount -= stack_to.count;
}
else if(leftover.empty())
{
// Item fits
+ m_selected_amount -= move_amount;
}
else
{
// Item only fits partially
move_amount -= leftover.count;
+ m_selected_amount -= move_amount;
}
- assert(move_amount > 0 && move_amount <= m_selected_amount);
- m_selected_amount -= move_amount;
infostream<<"Handing IACTION_MOVE to manager"<<std::endl;
IMoveAction *a = new IMoveAction();
{
delete m_selected_item;
m_selected_item = NULL;
+ m_selected_amount = 0;
m_selected_dragging = false;
}
}