]> git.lizzy.rs Git - minetest.git/blobdiff - src/gui/guiConfirmRegistration.cpp
Settings: Purge getDefault, clean FontEngine
[minetest.git] / src / gui / guiConfirmRegistration.cpp
index 92ca94d425c0c3863ce7fc695e24376be7662e9c..020a2796a4d6c58591a910086ec266db064e208c 100644 (file)
@@ -19,29 +19,35 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 
 #include "guiConfirmRegistration.h"
-#include "client.h"
+#include "client/client.h"
+#include "guiButton.h"
 #include <IGUICheckBox.h>
 #include <IGUIButton.h>
 #include <IGUIStaticText.h>
 #include <IGUIFont.h>
 #include "intlGUIEditBox.h"
+#include "porting.h"
 
 #include "gettext.h"
 
 // Continuing from guiPasswordChange.cpp
 const int ID_confirmPassword = 262;
 const int ID_confirm = 263;
-const int ID_message = 264;
+const int ID_intotext = 264;
 const int ID_cancel = 265;
+const int ID_message = 266;
 
 GUIConfirmRegistration::GUIConfirmRegistration(gui::IGUIEnvironment *env,
                gui::IGUIElement *parent, s32 id, IMenuManager *menumgr, Client *client,
                const std::string &playername, const std::string &password,
-               const std::string &address, bool *aborted) :
+               bool *aborted, ISimpleTextureSource *tsrc) :
                GUIModalMenu(env, parent, id, menumgr),
                m_client(client), m_playername(playername), m_password(password),
-               m_address(address), m_aborted(aborted)
+               m_aborted(aborted), m_tsrc(tsrc)
 {
+#ifdef __ANDROID__
+       m_touchscreen_visible = false;
+#endif
 }
 
 GUIConfirmRegistration::~GUIConfirmRegistration()
@@ -58,6 +64,7 @@ void GUIConfirmRegistration::removeChildren()
        for (gui::IGUIElement *i : children_copy)
                i->remove();
 }
+
 void GUIConfirmRegistration::regenerateGui(v2u32 screensize)
 {
        acceptInput();
@@ -66,13 +73,20 @@ void GUIConfirmRegistration::regenerateGui(v2u32 screensize)
        /*
                Calculate new sizes and positions
        */
-       core::rect<s32> rect(screensize.X / 2 - 600 / 2, screensize.Y / 2 - 360 / 2,
-                       screensize.X / 2 + 600 / 2, screensize.Y / 2 + 360 / 2);
-
-       DesiredRect = rect;
+#ifdef __ANDROID__
+       const float s = m_gui_scale * porting::getDisplayDensity() / 2;
+#else
+       const float s = m_gui_scale;
+#endif
+       DesiredRect = core::rect<s32>(
+               screensize.X / 2 - 600 * s / 2,
+               screensize.Y / 2 - 360 * s / 2,
+               screensize.X / 2 + 600 * s / 2,
+               screensize.Y / 2 + 360 * s / 2
+       );
        recalculateAbsolutePosition(false);
 
-       v2s32 size = rect.getSize();
+       v2s32 size = DesiredRect.getSize();
        v2s32 topleft_client(0, 0);
 
        const wchar_t *text;
@@ -80,61 +94,59 @@ void GUIConfirmRegistration::regenerateGui(v2u32 screensize)
        /*
                Add stuff
        */
-       s32 ypos = 30;
+       s32 ypos = 30 * s;
        {
-               std::string address = m_address;
-               if (address.empty())
-                       address = "localhost";
-               core::rect<s32> rect2(0, 0, 540, 180);
-               rect2 += topleft_client + v2s32(30, ypos);
+               core::rect<s32> rect2(0, 0, 540 * s, 180 * s);
+               rect2 += topleft_client + v2s32(30 * s, ypos);
                static const std::string info_text_template = strgettext(
-                               "You are about to join the server at %1$s with the "
-                               "name \"%2$s\" for the first time. If you proceed, a "
-                               "new account using your credentials will be created "
-                               "on this server.\n"
-                               "Please retype your password and click Register and "
-                               "Join to confirm account creation or click Cancel to "
-                               "abort.");
+                               "You are about to join this server with the name \"%s\" for the "
+                               "first time.\n"
+                               "If you proceed, a new account using your credentials will be "
+                               "created on this server.\n"
+                               "Please retype your password and click 'Register and Join' to "
+                               "confirm account creation, or click 'Cancel' to abort.");
                char info_text_buf[1024];
-               snprintf(info_text_buf, sizeof(info_text_buf), info_text_template.c_str(),
-                               address.c_str(), m_playername.c_str());
+               porting::mt_snprintf(info_text_buf, sizeof(info_text_buf),
+                               info_text_template.c_str(), m_playername.c_str());
 
-               gui::IGUIEditBox *e = new gui::intlGUIEditBox(
-                               utf8_to_wide_c(info_text_buf), true, Environment, this,
-                               ID_message, rect2, false, true);
+               wchar_t *info_text_buf_wide = utf8_to_wide_c(info_text_buf);
+               gui::IGUIEditBox *e = new gui::intlGUIEditBox(info_text_buf_wide, true,
+                               Environment, this, ID_intotext, rect2, false, true);
+               delete[] info_text_buf_wide;
                e->drop();
                e->setMultiLine(true);
                e->setWordWrap(true);
                e->setTextAlignment(gui::EGUIA_UPPERLEFT, gui::EGUIA_CENTER);
        }
 
-       ypos += 210;
+       ypos += 200 * s;
        {
-               core::rect<s32> rect2(0, 0, 540, 30);
-               rect2 += topleft_client + v2s32(30, ypos);
+               core::rect<s32> rect2(0, 0, 540 * s, 30 * s);
+               rect2 += topleft_client + v2s32(30 * s, ypos);
                gui::IGUIEditBox *e = Environment->addEditBox(m_pass_confirm.c_str(),
                                rect2, true, this, ID_confirmPassword);
                e->setPasswordBox(true);
+               Environment->setFocus(e);
        }
 
-       ypos += 60;
+       ypos += 50 * s;
        {
-               core::rect<s32> rect2(0, 0, 230, 35);
-               rect2 = rect2 + v2s32(size.X / 2 - 220, ypos);
+               core::rect<s32> rect2(0, 0, 230 * s, 35 * s);
+               rect2 = rect2 + v2s32(size.X / 2 - 220 * s, ypos);
                text = wgettext("Register and Join");
-               Environment->addButton(rect2, this, ID_confirm, text);
+               GUIButton::addButton(Environment, rect2, m_tsrc, this, ID_confirm, text);
                delete[] text;
        }
        {
-               core::rect<s32> rect2(0, 0, 120, 35);
-               rect2 = rect2 + v2s32(size.X / 2 + 70, ypos);
+               core::rect<s32> rect2(0, 0, 120 * s, 35 * s);
+               rect2 = rect2 + v2s32(size.X / 2 + 70 * s, ypos);
                text = wgettext("Cancel");
-               Environment->addButton(rect2, this, ID_cancel, text);
+               GUIButton::addButton(Environment, rect2, m_tsrc, this, ID_cancel, text);
                delete[] text;
        }
        {
-               core::rect<s32> rect2(0, 0, 200, 20);
-               rect2 += topleft_client + v2s32(30, ypos - 40);
+               core::rect<s32> rect2(0, 0, 500 * s, 40 * s);
+               rect2 += topleft_client + v2s32(30 * s, ypos + 40 * s);
                text = wgettext("Passwords do not match!");
                IGUIElement *e = Environment->addStaticText(
                                text, rect2, false, true, this, ID_message);
@@ -154,6 +166,9 @@ void GUIConfirmRegistration::drawMenu()
        driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);
 
        gui::IGUIElement::draw();
+#ifdef __ANDROID__
+       getAndroidUIInput();
+#endif
 }
 
 void GUIConfirmRegistration::closeMenu(bool goNext)
@@ -190,10 +205,14 @@ bool GUIConfirmRegistration::processInput()
 bool GUIConfirmRegistration::OnEvent(const SEvent &event)
 {
        if (event.EventType == EET_KEY_INPUT_EVENT) {
-               if (event.KeyInput.Key == KEY_ESCAPE && event.KeyInput.PressedDown) {
+               // clang-format off
+               if ((event.KeyInput.Key == KEY_ESCAPE ||
+                               event.KeyInput.Key == KEY_CANCEL) &&
+                               event.KeyInput.PressedDown) {
                        closeMenu(false);
                        return true;
                }
+               // clang-format on
                if (event.KeyInput.Key == KEY_RETURN && event.KeyInput.PressedDown) {
                        acceptInput();
                        if (processInput())
@@ -207,8 +226,7 @@ bool GUIConfirmRegistration::OnEvent(const SEvent &event)
 
        if (event.GUIEvent.EventType == gui::EGET_ELEMENT_FOCUS_LOST && isVisible()) {
                if (!canTakeFocus(event.GUIEvent.Element)) {
-                       dstream << "GUIConfirmRegistration: Not allowing focus "
-                                  "change."
+                       infostream << "GUIConfirmRegistration: Not allowing focus change."
                                << std::endl;
                        // Returning true disables focus change
                        return true;
@@ -236,3 +254,26 @@ bool GUIConfirmRegistration::OnEvent(const SEvent &event)
 
        return false;
 }
+
+#ifdef __ANDROID__
+bool GUIConfirmRegistration::getAndroidUIInput()
+{
+       if (!hasAndroidUIInput() || m_jni_field_name != "password")
+               return false;
+
+       // still waiting
+       if (porting::getInputDialogState() == -1)
+               return true;
+
+       m_jni_field_name.clear();
+
+       gui::IGUIElement *e = getElementFromId(ID_confirmPassword);
+
+       if (!e || e->getType() != irr::gui::EGUIET_EDIT_BOX)
+               return false;
+
+       std::string text = porting::getInputDialogValue();
+       e->setText(utf8_to_wide(text).c_str());
+       return false;
+}
+#endif