Skip to content

Commit 3b11288

Browse files
stujones11nerzhul
authored andcommittedNov 18, 2018
Android: Improve UI scaling on smaller high-density displays (#7834)
* Android: Improve UI scaling on smaller high-density displays
1 parent e5a3754 commit 3b11288

File tree

7 files changed

+58
-15
lines changed

7 files changed

+58
-15
lines changed
 

‎builtin/mainmenu/tab_settings.lua

+4-3
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,10 @@ local function formspec(tabview, name, tabdata)
237237

238238
if core.settings:get("touchscreen_threshold") ~= nil then
239239
tab_string = tab_string ..
240-
"label[4.3,4.1;" .. fgettext("Touchthreshold (px)") .. "]" ..
241-
"dropdown[3.85,4.55;3.85;dd_touchthreshold;0,10,20,30,40,50;" ..
242-
((tonumber(core.settings:get("touchscreen_threshold")) / 10) + 1) .. "]"
240+
"label[4.3,4.2;" .. fgettext("Touchthreshold: (px)") .. "]" ..
241+
"dropdown[4.25,4.65;3.5;dd_touchthreshold;0,10,20,30,40,50;" ..
242+
((tonumber(core.settings:get("touchscreen_threshold")) / 10) + 1) ..
243+
"]box[4.0,4.5;3.75,1.0;#999999]"
243244
end
244245

245246
if shaders_enabled then

‎src/client/clientlauncher.cpp

+27-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
3838
#if USE_SOUND
3939
#include "sound_openal.h"
4040
#endif
41+
#ifdef __ANDROID__
42+
#include "porting.h"
43+
#endif
4144

4245
/* mainmenumanager.h
4346
*/
@@ -127,7 +130,30 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args)
127130
skin->setColor(gui::EGDC_3D_SHADOW, video::SColor(255, 0, 0, 0));
128131
skin->setColor(gui::EGDC_HIGH_LIGHT, video::SColor(255, 70, 120, 50));
129132
skin->setColor(gui::EGDC_HIGH_LIGHT_TEXT, video::SColor(255, 255, 255, 255));
130-
133+
#ifdef __ANDROID__
134+
float density = porting::getDisplayDensity();
135+
skin->setSize(gui::EGDS_CHECK_BOX_WIDTH, (s32)(17.0f * density));
136+
skin->setSize(gui::EGDS_SCROLLBAR_SIZE, (s32)(14.0f * density));
137+
skin->setSize(gui::EGDS_WINDOW_BUTTON_WIDTH, (s32)(15.0f * density));
138+
if (density > 1.5f) {
139+
std::string sprite_path = porting::path_user + "/textures/base/pack/";
140+
if (density > 3.5f)
141+
sprite_path.append("checkbox_64.png");
142+
else if (density > 2.0f)
143+
sprite_path.append("checkbox_32.png");
144+
else
145+
sprite_path.append("checkbox_16.png");
146+
// Texture dimensions should be a power of 2
147+
gui::IGUISpriteBank *sprites = skin->getSpriteBank();
148+
video::IVideoDriver *driver = RenderingEngine::get_video_driver();
149+
video::ITexture *sprite_texture = driver->getTexture(sprite_path.c_str());
150+
if (sprite_texture) {
151+
s32 sprite_id = sprites->addTextureAsSprite(sprite_texture);
152+
if (sprite_id != -1)
153+
skin->setIcon(gui::EGDI_CHECK_BOX_CHECKED, sprite_id);
154+
}
155+
}
156+
#endif
131157
g_fontengine = new FontEngine(g_settings, guienv);
132158
FATAL_ERROR_IF(g_fontengine == NULL, "Font engine creation failed.");
133159

‎src/gui/guiFormSpecMenu.cpp

+22-8
Original file line numberDiff line numberDiff line change
@@ -284,12 +284,13 @@ void GUIFormSpecMenu::parseSize(parserData* data, const std::string &element)
284284
data->invsize.Y = MYMAX(0, stof(parts[1]));
285285

286286
lockSize(false);
287+
#ifndef __ANDROID__
287288
if (parts.size() == 3) {
288289
if (parts[2] == "true") {
289290
lockSize(true,v2u32(800,600));
290291
}
291292
}
292-
293+
#endif
293294
data->explicit_size = true;
294295
return;
295296
}
@@ -437,11 +438,12 @@ void GUIFormSpecMenu::parseCheckbox(parserData* data, const std::string &element
437438
fselected = true;
438439

439440
std::wstring wlabel = translate_string(utf8_to_wide(unescape_string(label)));
441+
s32 spacing = Environment->getSkin()->getSize(gui::EGDS_CHECK_BOX_WIDTH) + 7;
440442

441443
core::rect<s32> rect = core::rect<s32>(
442-
pos.X, pos.Y + ((imgsize.Y/2) - m_btn_height),
443-
pos.X + m_font->getDimension(wlabel.c_str()).Width + 25, // text size + size of checkbox
444-
pos.Y + ((imgsize.Y/2) + m_btn_height));
444+
pos.X, pos.Y + ((imgsize.Y / 2) - m_btn_height),
445+
pos.X + m_font->getDimension(wlabel.c_str()).Width + spacing,
446+
pos.Y + ((imgsize.Y / 2) + m_btn_height));
445447

446448
FieldSpec spec(
447449
name,
@@ -2145,16 +2147,28 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
21452147
// the image size can't be less than 0.3 inch
21462148
// multiplied by gui_scaling, even if this means
21472149
// the form doesn't fit the screen.
2148-
double prefer_imgsize = mydata.screensize.Y / 15 *
2149-
gui_scaling;
2150+
#ifdef __ANDROID__
2151+
// For mobile devices these magic numbers are
2152+
// different and forms should always use the
2153+
// maximum screen space available.
2154+
double prefer_imgsize = mydata.screensize.Y / 10 * gui_scaling;
21502155
double fitx_imgsize = mydata.screensize.X /
2151-
((5.0/4.0) * (0.5 + mydata.invsize.X));
2156+
((12.0 / 8.0) * (0.5 + mydata.invsize.X));
21522157
double fity_imgsize = mydata.screensize.Y /
2153-
((15.0/13.0) * (0.85 * mydata.invsize.Y));
2158+
((15.0 / 11.0) * (0.85 + mydata.invsize.Y));
2159+
use_imgsize = MYMIN(prefer_imgsize,
2160+
MYMIN(fitx_imgsize, fity_imgsize));
2161+
#else
2162+
double prefer_imgsize = mydata.screensize.Y / 15 * gui_scaling;
2163+
double fitx_imgsize = mydata.screensize.X /
2164+
((5.0 / 4.0) * (0.5 + mydata.invsize.X));
2165+
double fity_imgsize = mydata.screensize.Y /
2166+
((15.0 / 13.0) * (0.85 * mydata.invsize.Y));
21542167
double screen_dpi = RenderingEngine::getDisplayDensity() * 96;
21552168
double min_imgsize = 0.3 * screen_dpi * gui_scaling;
21562169
use_imgsize = MYMAX(min_imgsize, MYMIN(prefer_imgsize,
21572170
MYMIN(fitx_imgsize, fity_imgsize)));
2171+
#endif
21582172
}
21592173

21602174
// Everything else is scaled in proportion to the

‎src/gui/guiTable.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,12 @@ GUITable::GUITable(gui::IGUIEnvironment *env,
7878
setTabStop(true);
7979
setTabOrder(-1);
8080
updateAbsolutePosition();
81-
81+
float density = RenderingEngine::getDisplayDensity();
82+
#ifdef __ANDROID__
83+
density = 1; // dp scaling is applied by the skin
84+
#endif
8285
core::rect<s32> relative_rect = m_scrollbar->getRelativePosition();
83-
s32 width = (relative_rect.getWidth()/(2.0/3.0)) *
84-
RenderingEngine::getDisplayDensity() *
86+
s32 width = (relative_rect.getWidth() / (2.0 / 3.0)) * density *
8587
g_settings->getFloat("gui_scaling");
8688
m_scrollbar->setRelativePosition(core::rect<s32>(
8789
relative_rect.LowerRightCorner.X-width,relative_rect.UpperLeftCorner.Y,

‎textures/base/pack/checkbox_16.png

288 Bytes
Loading

‎textures/base/pack/checkbox_32.png

436 Bytes
Loading

‎textures/base/pack/checkbox_64.png

766 Bytes
Loading

0 commit comments

Comments
 (0)
Please sign in to comment.