From f6321e277bc423a0878ae239a73ad2cd6393106c Mon Sep 17 00:00:00 2001 From: sruz25 Date: Fri, 19 Sep 2014 15:27:48 +0200 Subject: [PATCH] Add inventory right click drag and drop --- src/guiFormSpecMenu.cpp | 23 +++++++++++++++++++---- src/guiFormSpecMenu.h | 2 ++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp index 3fdb5bd26..65dbc0187 100644 --- a/src/guiFormSpecMenu.cpp +++ b/src/guiFormSpecMenu.cpp @@ -2950,9 +2950,11 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) } - if(event.EventType==EET_MOUSE_INPUT_EVENT - && event.MouseInput.Event != EMIE_MOUSE_MOVED) { - // Mouse event other than movement + if((event.EventType==EET_MOUSE_INPUT_EVENT && + event.MouseInput.Event != EMIE_MOUSE_MOVED) || + (event.MouseInput.Event == EMIE_MOUSE_MOVED && + event.MouseInput.isRightPressed() && getItemAtPos(m_pointer).i != getItemAtPos(m_old_pointer).i)){ + // Mouse event other than movement or crossing the border of inventory field while holding rmb // Get selected item and hovered/clicked item (s) @@ -3008,7 +3010,7 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) (m_selected_item->i == s.i); // buttons: 0 = left, 1 = right, 2 = middle - // up/down: 0 = down (press), 1 = up (release), 2 = unknown event + // up/down: 0 = down (press), 1 = up (release), 2 = unknown event, -1 movement int button = 0; int updown = 2; if(event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) @@ -3023,6 +3025,8 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) { button = 1; updown = 1; } else if(event.MouseInput.Event == EMIE_MMOUSE_LEFT_UP) { button = 2; updown = 1; } + else if(event.MouseInput.Event == EMIE_MOUSE_MOVED) + { updown = -1;} // Set this number to a positive value to generate a move action // from m_selected_item to s. @@ -3113,6 +3117,16 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) m_selected_dragging = false; } + else if(updown == -1) { + // Mouse has been moved and rmb is down and mouse pointer just + // entered a new inventory field (checked in the entry-if, this + // is the only action here that is generated by mouse movement) + if(m_selected_item != NULL && s.isValid()){ + // Move 1 item + // TODO: middle mouse to move 10 items might be handy + move_amount = 1; + } + } // Possibly send inventory action to server if(move_amount > 0) @@ -3212,6 +3226,7 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) m_selected_dragging = false; m_selected_content_guess = ItemStack(); } + m_old_pointer = m_pointer; } if(event.EventType==EET_GUI_EVENT) { diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h index 583cad4a2..2ffa05308 100644 --- a/src/guiFormSpecMenu.h +++ b/src/guiFormSpecMenu.h @@ -301,6 +301,7 @@ protected: std::string m_formspec_string; InventoryLocation m_current_inventory_location; + std::vector m_inventorylists; std::vector m_backgrounds; std::vector m_images; @@ -323,6 +324,7 @@ protected: InventoryLocation m_selected_content_guess_inventory; v2s32 m_pointer; + v2s32 m_old_pointer; // Mouse position after previous mouse event gui::IGUIStaticText *m_tooltip_element; u32 m_tooltip_show_delay;