]> git.lizzy.rs Git - minetest.git/blobdiff - src/guiFormSpecMenu.cpp
Fix logic of checkbox formspec element validity checking
[minetest.git] / src / guiFormSpecMenu.cpp
index 0a7a823999002acfedf4519345cd5c0d870fd576..a80347b12cf5220ead79de6a39357b0149ed19d6 100644 (file)
@@ -124,6 +124,7 @@ GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
        m_tooltip_element(NULL),
        m_hovered_time(0),
        m_old_tooltip_id(-1),
+       m_rmouse_auto_place(false),
        m_allowclose(true),
        m_lock(false),
        m_form_src(fsrc),
@@ -384,7 +385,7 @@ void GUIFormSpecMenu::parseCheckbox(parserData* data,std::string element)
 {
        std::vector<std::string> parts = split(element,';');
 
-       if (((parts.size() >= 3) || (parts.size() <= 4)) ||
+       if (((parts.size() >= 3) && (parts.size() <= 4)) ||
                ((parts.size() > 4) && (m_formspec_version > FORMSPEC_API_VERSION)))
        {
                std::vector<std::string> v_pos = split(parts[0],',');
@@ -1934,7 +1935,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
                        // wide, including border) just fit into the
                        // default window (800 pixels wide) at 96 DPI
                        // and default scaling (1.00).
-                       use_imgsize = 0.53 * screen_dpi * gui_scaling;
+                       use_imgsize = 0.5555 * screen_dpi * gui_scaling;
                } else {
                        // In variable-size mode, we prefer to make the
                        // inventory image size 1/15 of screen height,
@@ -1974,6 +1975,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
                spacing = v2s32(use_imgsize*5.0/4, use_imgsize*15.0/13);
                padding = v2s32(use_imgsize*3.0/8, use_imgsize*3.0/8);
                double target_font_height = use_imgsize*15.0/13 * 0.4;
+               target_font_height *= g_settings->getFloat("font_size")/TTF_DEFAULT_FONT_SIZE;
                m_btn_height = use_imgsize*15.0/13 * 0.35;
 
                m_font = select_font_by_line_height(target_font_height);
@@ -2217,10 +2219,23 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase)
                                m_tooltip_element->setVisible(true);
                                this->bringToFront(m_tooltip_element);
                                m_tooltip_element->setText(narrow_to_wide(tooltip_text).c_str());
-                               s32 tooltip_x = m_pointer.X + m_btn_height;
-                               s32 tooltip_y = m_pointer.Y + m_btn_height;
                                s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height;
                                s32 tooltip_height = m_tooltip_element->getTextHeight() * tt_rows.size() + 5;
+                               v2u32 screenSize = driver->getScreenSize();
+                               int tooltip_offset_x = m_btn_height;
+                               int tooltip_offset_y = m_btn_height;
+#ifdef __ANDROID__
+                               tooltip_offset_x *= 3;
+                               tooltip_offset_y  = 0;
+                               if (m_pointer.X > (s32)screenSize.X / 2)
+                                       tooltip_offset_x = (tooltip_offset_x + tooltip_width) * -1;
+#endif
+                               s32 tooltip_x = m_pointer.X + tooltip_offset_x;
+                               s32 tooltip_y = m_pointer.Y + tooltip_offset_y;
+                               if (tooltip_x + tooltip_width > (s32)screenSize.X)
+                                       tooltip_x = (s32)screenSize.X - tooltip_width  - m_btn_height;
+                               if (tooltip_y + tooltip_height > (s32)screenSize.Y)
+                                       tooltip_y = (s32)screenSize.Y - tooltip_height - m_btn_height;
                                m_tooltip_element->setRelativePosition(core::rect<s32>(
                                                core::position2d<s32>(tooltip_x, tooltip_y),
                                                core::dimension2d<s32>(tooltip_width, tooltip_height)));
@@ -2436,13 +2451,23 @@ void GUIFormSpecMenu::drawMenu()
                                        if (m_old_tooltip != m_tooltips[iter->fname].tooltip) {
                                                m_old_tooltip = m_tooltips[iter->fname].tooltip;
                                                m_tooltip_element->setText(narrow_to_wide(m_tooltips[iter->fname].tooltip).c_str());
-                                               s32 tooltip_x = m_pointer.X + m_btn_height;
-                                               s32 tooltip_y = m_pointer.Y + m_btn_height;
-                                               s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height;
-                                               if (tooltip_x + tooltip_width > (s32)screenSize.X)
-                                                       tooltip_x = (s32)screenSize.X - tooltip_width - m_btn_height;
                                                std::vector<std::string> tt_rows = str_split(m_tooltips[iter->fname].tooltip, '\n');
+                                               s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height;
                                                s32 tooltip_height = m_tooltip_element->getTextHeight() * tt_rows.size() + 5;
+                                               int tooltip_offset_x = m_btn_height;
+                                               int tooltip_offset_y = m_btn_height;
+#ifdef __ANDROID__
+                                               tooltip_offset_x *= 3;
+                                               tooltip_offset_y  = 0;
+                                               if (m_pointer.X > (s32)screenSize.X / 2)
+                                                       tooltip_offset_x = (tooltip_offset_x + tooltip_width) * -1;
+#endif
+                                               s32 tooltip_x = m_pointer.X + tooltip_offset_x;
+                                               s32 tooltip_y = m_pointer.Y + tooltip_offset_y;
+                                               if (tooltip_x + tooltip_width > (s32)screenSize.X)
+                                                       tooltip_x = (s32)screenSize.X - tooltip_width  - m_btn_height;
+                                               if (tooltip_y + tooltip_height > (s32)screenSize.Y)
+                                                       tooltip_y = (s32)screenSize.Y - tooltip_height - m_btn_height;
                                                m_tooltip_element->setRelativePosition(core::rect<s32>(
                                                core::position2d<s32>(tooltip_x, tooltip_y),
                                                core::dimension2d<s32>(tooltip_width, tooltip_height)));
@@ -2732,7 +2757,8 @@ bool GUIFormSpecMenu::preprocessEvent(const SEvent& event)
                gui::IGUIElement *hovered =
                        Environment->getRootGUIElement()->getElementFromPoint(
                                core::position2d<s32>(x, y));
-               if (hovered->getType() == gui::EGUIET_TAB_CONTROL) {
+               if (hovered && isMyChild(hovered) &&
+                               hovered->getType() == gui::EGUIET_TAB_CONTROL) {
                        gui::IGUISkin* skin = Environment->getSkin();
                        assert(skin != NULL);
                        gui::IGUIFont *old_font = skin->getFont();
@@ -3153,6 +3179,7 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
                                                m_selected_amount = s_count;
 
                                        m_selected_dragging = true;
+                                       m_rmouse_auto_place = false;
                                }
                        }
                        else { // m_selected_item != NULL
@@ -3205,6 +3232,11 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
                        }
 
                        m_selected_dragging = false;
+                       // Keep count of how many times right mouse button has been
+                       // clicked. One click is drag without dropping. Click + release
+                       // + click changes to drop one item when moved mode
+                       if(button == 1 && m_selected_item != NULL)
+                               m_rmouse_auto_place = !m_rmouse_auto_place;
                }
                else if(updown == -1) {
                        // Mouse has been moved and rmb is down and mouse pointer just
@@ -3213,7 +3245,18 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
                        if(m_selected_item != NULL && s.isValid()){
                                // Move 1 item
                                // TODO: middle mouse to move 10 items might be handy
-                               move_amount = 1;
+                               if (m_rmouse_auto_place) {
+                                       // Only move an item if the destination slot is empty
+                                       // or contains the same item type as what is going to be
+                                       // moved
+                                       InventoryList *list_from = inv_selected->getList(m_selected_item->listname);
+                                       InventoryList *list_to = inv_s->getList(s.listname);
+                                       assert(list_from && list_to);
+                                       ItemStack stack_from = list_from->getItem(m_selected_item->i);
+                                       ItemStack stack_to = list_to->getItem(s.i);
+                                       if (stack_to.empty() || stack_to.name == stack_from.name)
+                                               move_amount = 1;
+                               }
                        }
                }