]> git.lizzy.rs Git - minetest.git/blobdiff - src/guiFormSpecMenu.cpp
Fix logic of checkbox formspec element validity checking
[minetest.git] / src / guiFormSpecMenu.cpp
index d3c2a0b883abca3152786bfb0c2e7a7a2fd05a1f..a80347b12cf5220ead79de6a39357b0149ed19d6 100644 (file)
@@ -76,21 +76,6 @@ static unsigned int font_line_height(gui::IGUIFont *font)
 
 static gui::IGUIFont *select_font_by_line_height(double target_line_height)
 {
-       return g_fontengine->getFont();
-
-/* I have no idea what this is trying to achieve, but scaling the font according
- * to the size of a formspec/dialog does not seem to be a standard (G)UI
- * design and AFAIK no existing nor proposed GUI does this. Besides that it:
- * a) breaks most (current) formspec layouts
- * b) font sizes change depending on the size of the formspec/dialog (see above)
- *    meaning that there is no UI consistency
- * c) the chosen fonts are, in general, probably too large
- *
- * Disabling for now.
- *
- * FIXME
- */
-#if 0
        // We don't get to directly select a font according to its
        // baseline-to-baseline height.  Rather, we select by em size.
        // The ratio between these varies between fonts.  The font
@@ -120,7 +105,6 @@ static gui::IGUIFont *select_font_by_line_height(double target_line_height)
                }
        }
        return g_fontengine->getFont(target_line_height - lohgt < hihgt - target_line_height ? loreq : hireq);
-#endif
 }
 
 GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
@@ -401,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],',');
@@ -1951,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,
@@ -1991,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);
@@ -2234,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)));
@@ -2453,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)));
@@ -2749,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();