]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/guiInventoryMenu.cpp
.
[dragonfireclient.git] / src / guiInventoryMenu.cpp
index 88cb8c830592f80e01b9a3bb8c3821861918bd43..d7af0a0b955538627b917dfe7da05b8c6760cc44 100644 (file)
@@ -77,17 +77,14 @@ void drawInventoryItem(gui::IGUIEnvironment* env,
 
 GUIInventoryMenu::GUIInventoryMenu(gui::IGUIEnvironment* env,
                gui::IGUIElement* parent, s32 id,
-               Inventory *inventory):
-       IGUIElement(gui::EGUIET_ELEMENT, env, parent, id,
-                       core::rect<s32>(0,0,100,100))
+               Inventory *inventory,
+               Queue<InventoryAction*> *actions,
+               int *active_menu_count):
+       GUIModalMenu(env, parent, id, active_menu_count)
 {
        m_inventory = inventory;
-       m_screensize_old = v2u32(0,0);
        m_selected_item = NULL;
-
-       resizeGui();
-
-       setVisible(false);
+       m_actions = actions;
 
        /*m_selected_item = new ItemSpec;
        m_selected_item->listname = "main";
@@ -96,25 +93,35 @@ GUIInventoryMenu::GUIInventoryMenu(gui::IGUIEnvironment* env,
 
 GUIInventoryMenu::~GUIInventoryMenu()
 {
+       removeChildren();
+
        if(m_selected_item)
                delete m_selected_item;
 }
 
-void GUIInventoryMenu::resizeGui()
+void GUIInventoryMenu::removeChildren()
 {
-       video::IVideoDriver* driver = Environment->getVideoDriver();
-       v2u32 screensize = driver->getScreenSize();
-       if(screensize == m_screensize_old)
-               return;
-       m_screensize_old = screensize;
+       {
+               gui::IGUIElement *e = getElementFromId(256);
+               if(e != NULL)
+                       e->remove();
+       }
+}
 
+void GUIInventoryMenu::regenerateGui(v2u32 screensize)
+{
+       // Remove children
+       removeChildren();
+       
        padding = v2s32(24,24);
        spacing = v2s32(60,56);
        imgsize = v2s32(48,48);
 
+       s32 helptext_h = 15;
+
        v2s32 size(
                padding.X*2+spacing.X*(8-1)+imgsize.X,
-               padding.Y*2+spacing.Y*(7-1)+imgsize.Y
+               padding.Y*2+spacing.Y*(7-1)+imgsize.Y + helptext_h
        );
 
        core::rect<s32> rect(
@@ -136,6 +143,16 @@ void GUIInventoryMenu::resizeGui()
                        basepos + v2s32(spacing.X*3, spacing.Y*0), v2s32(3, 3)));
        m_draw_positions.push_back(ListDrawSpec("craftresult",
                        basepos + v2s32(spacing.X*7, spacing.Y*1), v2s32(1, 1)));
+       
+       // Add children
+       {
+               core::rect<s32> rect(0, 0, size.X-padding.X*2, helptext_h);
+               rect = rect + v2s32(size.X/2 - rect.getWidth()/2,
+                               size.Y-rect.getHeight()-15);
+               const wchar_t *text =
+               L"Left click: Move all items, Right click: Move single item";
+               Environment->addStaticText(text, rect, false, true, this, 256);
+       }
 }
 
 GUIInventoryMenu::ItemSpec GUIInventoryMenu::getItemAtPos(v2s32 p) const
@@ -194,11 +211,8 @@ void GUIInventoryMenu::drawList(const ListDrawSpec &s)
        }
 }
 
-void GUIInventoryMenu::draw()
+void GUIInventoryMenu::drawMenu()
 {
-       if(!IsVisible)
-               return;
-               
        gui::IGUISkin* skin = Environment->getSkin();
        if (!skin)
                return;
@@ -229,19 +243,21 @@ bool GUIInventoryMenu::OnEvent(const SEvent& event)
        {
                if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
                {
-                       setVisible(false);
+                       quitMenu();
                        return true;
                }
                if(event.KeyInput.Key==KEY_KEY_I && event.KeyInput.PressedDown)
                {
-                       setVisible(false);
+                       quitMenu();
                        return true;
                }
        }
        if(event.EventType==EET_MOUSE_INPUT_EVENT)
        {
-               if(event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN)
+               if(event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN
+                               || event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN)
                {
+                       bool right = (event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN);
                        v2s32 p(event.MouseInput.X, event.MouseInput.Y);
                        //dstream<<"Mouse down at p=("<<p.X<<","<<p.Y<<")"<<std::endl;
                        ItemSpec s = getItemAtPos(p);
@@ -254,21 +270,30 @@ bool GUIInventoryMenu::OnEvent(const SEvent& event)
                                                        m_inventory->getList(m_selected_item->listname);
                                        InventoryList *list_to =
                                                        m_inventory->getList(s.listname);
+                                       // Indicates whether source slot completely empties
+                                       bool source_empties = false;
                                        if(list_from && list_to
                                                        && list_from->getItem(m_selected_item->i) != NULL)
                                        {
                                                dstream<<"Queueing IACTION_MOVE"<<std::endl;
-                                               IMoveAction *a =
-                                                       new IMoveAction();
-                                               a->count = 1;
+                                               IMoveAction *a = new IMoveAction();
+                                               a->count = right ? 1 : 0;
                                                a->from_name = m_selected_item->listname;
                                                a->from_i = m_selected_item->i;
                                                a->to_name = s.listname;
                                                a->to_i = s.i;
-                                               m_actions.push_back(a);
+                                               m_actions->push_back(a);
+                                               
+                                               if(list_from->getItem(m_selected_item->i)->getCount()==1)
+                                                       source_empties = true;
+                                       }
+                                       // Remove selection if target was left-clicked or source
+                                       // slot was emptied
+                                       if(right == false || source_empties)
+                                       {
+                                               delete m_selected_item;
+                                               m_selected_item = NULL;
                                        }
-                                       delete m_selected_item;
-                                       m_selected_item = NULL;
                                }
                                else
                                {
@@ -322,11 +347,5 @@ bool GUIInventoryMenu::OnEvent(const SEvent& event)
        return Parent ? Parent->OnEvent(event) : false;
 }
 
-InventoryAction* GUIInventoryMenu::getNextAction()
-{
-       if(m_actions.size() == 0)
-               return NULL;
-       return m_actions.pop_front();
-}