Jump to content
Sign in to follow this  
IndeedPete

Auto-Resizing Dialog Based on Interface Size

Recommended Posts

Hello,

I'm facing the problem that some of my dialogs are "falling" out of the game window if I change the Interface Size in Arma 3's options. (Also other users reported the same issue with my dialogs.)

How do I calculate the correct coordinates? I've looked at other people's code and tried to apply it on my problem - no luck so far. They're calculating some fancy stuff using the safeZone values and abra kadabra: the dialog fits in every possible interface size. My problem is that I don't even understand what the safeZones actually mean. Documentation on safeZoneX, safeZoneY, safeZoneW and safeZoneH is way too thin for me to get the differences. Anybody able to enlighten my simple mind? Or even provide some piece of code?

Thank you!

Share this post


Link to post
Share on other sites

The safeZone area is an area that is visible on any screen no matter what the resolution or interface size is. Hence the word "safe" in it.

If you do not use the safeZone values, then it will fall off people their screens like you described.

It sounds kind of funny to me though that you have made a dialog but you do not know what safeZone does.... xD

Anyways, to answer your question:

try and find a dialog script that is using the safeZone parameters. For example; the virtual ammobox script. Then, fiddle around with the values to get a full understanding of what those values actually do. The best way to learn it is to see it yourself.

Share this post


Link to post
Share on other sites

Frankly, I've just used the GUI editor and read somewhere that the game adjusts sizes automatically. And the editor output shows the coordinates as "x = 62 * GUI_GRID_W + GUI_GRID_X;" for example - are those also safeZones?

I had a look at TPW's hud script since it has a quite similar box in the lower right corner of the screen but I wasn't able to make up proper parameters to feed his code. Fiddling around with this GUI size stuff is truly a pain in the ass if you ask me.^^ But I'll retry making up proper factors...

---------- Post added at 04:40 PM ---------- Previous post was at 02:49 PM ----------

Maybe I'm a bit stupid but I gave this stuff some more thoughts. I understand that safeZoneW and safeZoneH are giving me lengths. So far so good, but safeZoneX and safeZoneY are negative values. What exactly do these values stand for? What are they representing?

The wiki says:

Safezones serves only as references to absolute positions. Result of safezoneX can for example be -0.452381, which means it's left from absolute area.

Well, cool.

Share this post


Link to post
Share on other sites

Yeah well that bloody wiki hasn't helped me either back in the day when I started fitteling with ArmA 2. Most info on it makes it even more complicated than it already is.

The only best way to find out how it actually works is to use it yourself. Here; let me show you a script I launched a while back. (it also uses an area in the lower right corner, maybe it will help you find out what is going on)

https://gist.github.com/IT07/6210573

Share this post


Link to post
Share on other sites

Thanks for you reply! I've tried some example from the wiki and I'm able to align stuff in the lower right corner. But of course it looks shitty because every element is aligned down right:

2014-05-29_00007f3k8v.jpg

How can I calculate relative x/y coordinates so the controls will keep their correct positions within the box? I'm really just looking for a dead simple line of code saying:

_adjustedX = _x * _scaleCoefficient;

Is it really that hard to get a simple calculation rule working in all possible combinations?

Share this post


Link to post
Share on other sites

I am not sure where you are aiming for. Can you explain a bit more what you are trying to achieve?

Share this post


Link to post
Share on other sites

Sure, I have a dialog displayed as RscTitle. I've built this dialog with the GUI editor while I had my interface size set to "small" (simply forgot to think about that). I've placed the box down to the right corner outside the marked grid of the GUI editor so it would perferctly fit. Now, when I change the interface size (or if other users play on other sizes by default) the box is "falling out". In my simple mind, I'd have lower x/y coordinates based on chosen interface size to prevent it from falling out. The safeZoneW and safeZoneH are increasing with decreasing interface size settings. Means I need higher x/y values on smaller interface sizes to keep the box into the lower right corner. As I said, I'm looking for a factor to multiply the given x/y coordinates based on chosen interface size.

There's a number given in (getResolution select 5) which reflects the interface size setting. I thought this would be the factor I'm looking for and it is used to resize all other ingame diolgs like main menu, HUD etc. but my first attempts were fruitless.

I really wish for a simple align="right/bottom" property for Arma dialogs like in many other GUI builders. :/

Share this post


Link to post
Share on other sites

Thank you for clearing this up. I understand what you mean now.

Anyways, the credits script I linked to you; it should have the correct safezone numbers which means that it should not fall off the screen. Try using the safeZone values from the script.

Share this post


Link to post
Share on other sites

IndeedPete - when you go in the dialog editor, are you setting the "Position Type" (down the bottom) to GUI_GRID or SafeZone?

If you use GUI GRID, then you are at the whims of interface size issues.

Try changing all of the elements for your dialog to Safezone and then export again.

It should be fine then

I did a little test last night to check this and it seems fine on my PC. I got sidetracked watching the Usual Suspects on TV so I forgot to post this up.

If you are still having problems then either post your dialog config here or PM me it and I'll see if I can sort it for you

Share this post


Link to post
Share on other sites

Hey, thanks for all your great answers here as well as Larrow's PM, much appreciated!

I've rebuilt the dialog (while having interface size set to "Very Large") and set to safezone. Now, the dialogs are not falling out anymore. *yay* However, scaling still seems to be messed up.

Here's a screnshot with interface size set to "Very Large":

2014-05-30_000010vux4.jpg

Looks good so far. Now I've changed the option to "Small" which I usually use. This shot is right after switching:

2014-05-30_00002m4ubh.jpg

Correct scaling but false position. Sure, because I haven't restarted the game yet. Now, a shot after restarting:

2014-05-30_00003cyu80.jpg

What the hell? oO

Just for reference, here is the dialog class:

class IP_DLG_GLASSSTATUS
{
idd = 20005;
movingenable = false;
duration = 1e+1000;
onLoad = "UINamespace setVariable ['DLG_GlassStatus', _this select 0]";

class Controls
{
	class IP_BOX_MAIN: BOX
	{
		idc = -1;
		text = ""; //--- ToDo: Localize;
		x = 0.666875 * safezoneW + safezoneX;
		y = 0.795 * safezoneH + safezoneY;
		w = 0.328125 * safezoneW;
		h = 0.2 * safezoneH;
	};

	////////////////////////////////////////////////////////
	// GUI EDITOR OUTPUT START (by IndeedPete, v1.063, #Zucyle)
	////////////////////////////////////////////////////////

	class IP_FRM_GLASSSTATUS: RscFrame
	{
		idc = 1800;
		text = "Operator Status"; //--- ToDo: Localize;
		x = 0.666875 * safezoneW + safezoneX;
		y = 0.795 * safezoneH + safezoneY;
		w = 0.328125 * safezoneW;
		h = 0.2 * safezoneH;
	};
	class IP_STX_GRID: RscStructuredText
	{
		idc = 1100;
		text = "Grid: 000000"; //--- ToDo: Localize;
		x = 0.66875 * safezoneW + safezoneX;
		y = 0.82 * safezoneH + safezoneY;
		w = 0.13125 * safezoneW;
		h = 0.04 * safezoneH;
	};
	class IP_STX_CONDITION: RscStructuredText
	{
		idc = 1101;
		text = "Condition: Healthy"; //--- ToDo: Localize;
		x = 0.66875 * safezoneW + safezoneX;
		y = 0.94 * safezoneH + safezoneY;
		w = 0.31875 * safezoneW;
		h = 0.04 * safezoneH;
	};
	class IP_STX_HEADING: RscStructuredText
	{
		idc = 1102;
		text = "Heading: NNW"; //--- ToDo: Localize;
		x = 0.81875 * safezoneW + safezoneX;
		y = 0.82 * safezoneH + safezoneY;
		w = 0.140625 * safezoneW;
		h = 0.04 * safezoneH;
	};
	class IP_STX_PULSE: RscStructuredText
	{
		idc = 1103;
		text = "Pulse: 180/min"; //--- ToDo: Localize;
		x = 0.66875 * safezoneW + safezoneX;
		y = 0.88 * safezoneH + safezoneY;
		w = 0.140625 * safezoneW;
		h = 0.04 * safezoneH;
	};
	class IP_STX_BREATHING: RscStructuredText
	{
		idc = 1104;
		text = "Breathing: 15/min"; //--- ToDo: Localize;
		x = 0.81875 * safezoneW + safezoneX;
		y = 0.88 * safezoneH + safezoneY;
		w = 0.16875 * safezoneW;
		h = 0.04 * safezoneH;
	};
	////////////////////////////////////////////////////////
	// GUI EDITOR OUTPUT END
	////////////////////////////////////////////////////////
};
};

---------- Post added at 05:44 PM ---------- Previous post was at 05:37 PM ----------

Oh, and here's the script handling the dialog. Just to make sure there's nothing wrong on that end:

#define CHECK ((alive player) && (goggles player in _goggles) && (player getVariable ["IP_Glass_Boot", false]) && (player getVariable ["IP_Glass_Status", false]))

private ["_bearing", "_rate"];
_goggles = _this select 0;
65 cutRsc ["IP_DLG_GLASSSTATUS", "PLAIN"];
disableSerialization;
_display = uiNamespace getVariable "DLG_GlassStatus";

while {CHECK} do {
_pos = getPos player;
_bearing = getDir player;
_fatigue = getFatigue player;
_damage = damage player;
_oldPulse = player getVariable ["IP_Pulse", 80];
_oldBreathng = player getVariable ["IP_Breathing", 15];

_grid = mapGridPosition _pos;

if (_bearing < 0) then {_bearing = _bearing + 360};	
_heading = switch (true) do { 
	case (_bearing <= 22.5 || _bearing > 337.5): {"N"};  
	case (_bearing > 22.5 && _bearing <= 67.5): {"NE"};  
	case (_bearing > 67.5 && _bearing <= 112.5 ): {"E"};  
	case (_bearing > 112.5 && _bearing <= 157.5): {"SE"};  
	case (_bearing > 157.5 && _bearing <= 202.5): {"S"};  
	case (_bearing > 202.5 && _bearing <= 247.5): {"SW"};  
	case (_bearing > 247.5 && _bearing <= 292.5): {"W"};  
	case (_bearing > 292.5 && _bearing <= 337.5): {"NW"};     
	default {"N"};
};

_rate = -0.25;

if (_fatigue > 0) then {_rate = _rate + (_fatigue * 10)};
if (!isNull(player findNearestEnemy player)) then {_rate = _rate + 0.5};
if (!isNull(nearestObject [player, "BulletBase"])) then {_rate = _rate + 1};
if (_damage > 0.7) then {_rate = _rate + 2};

_pulse = if (_rate > 0) then {
	if ((_oldPulse + _rate) > 160) then {160} else {(_oldPulse + _rate)}
} else {
	if ((_oldPulse + _rate) < 80) then {80} else {(_oldPulse + _rate)}
};

_rate = _rate / 2;
_breathing = if (_rate > 0) then {
	if ((_oldBreathng + _rate) > 60) then {60} else {(_oldBreathng + _rate)}
} else {
	if ((_oldBreathng + _rate) < 15) then {15} else {(_oldBreathng + _rate)}
};

player setVariable ["IP_Pulse", _pulse];
player setVariable ["IP_Breathing", _breathing];

_condition = if (_damage > 0) then {
	if (_damage > 0.7) then {
		((uiNamespace getVariable "DLG_GlassStatus") displayCtrl 1101) ctrlSetStructuredText (parseText("Condition: " + "<t color='#FFFF00'>CRITICAL</t>"));
		sleep 0.5;
		"<t color='#FF0000'>CRITICAL</t>"
	} else {
		"<t color='#FFFF00'>Wounded</t>"
	}
} else {
	"Healthy"
};

(_display displayCtrl 1100) ctrlSetStructuredText (parseText("Grid: " + _grid));
(_display displayCtrl 1102) ctrlSetStructuredText (parseText("Heading: " + _heading));
(_display displayCtrl 1103) ctrlSetStructuredText (parseText("Pulse: " + str(round(_pulse)) + "/min"));
(_display displayCtrl 1104) ctrlSetStructuredText (parseText("Breathing: " + str(round(_breathing)) + "/min"));
(_display displayCtrl 1101) ctrlSetStructuredText (parseText("<t align='CENTER'>Condition: " + _condition + "</t>"));

sleep 0.5;
};

65 cutText ["", "PLAIN"];

Edited by IndeedPete

Share this post


Link to post
Share on other sites

Hi mate, been checking some things but I need a bit more info if ok.

So, from the pictures:

Picture 1 - Correct size of box and text, in the right place

Picture 2 - Correct size of box and text, in the wrong place (prior to restart)

Picture 3 - Correct size of text and in the right place, but with the wrong size of box.

Is that correct?

Can you post up the defines you're using? I crashed out with undefined "Box", so I subbed in some definitions I use in my project and it's not working as expected.

Thanks.

Share this post


Link to post
Share on other sites

Hey Das,

yes, your assumptions are correct. The box class is just to add a solid background. More or less optional as I might sacrifice it later on for the sake of visibility (it should enhance the HUD, not limit it). Anyway, here are my defines. They're based on Iceman77's dialog tutorial:

// A3 necessary
#define GUI_GRID_X	(0)
#define GUI_GRID_Y	(0)
#define GUI_GRID_W	(0.025)
#define GUI_GRID_H	(0.04)
#define GUI_GRID_WAbs	(1)
#define GUI_GRID_HAbs	(1)

class BOX
{ 
  type = CT_STATIC;
   idc = -1;
   style = ST_CENTER;
   shadow = 2;
   colorText[] = {1,1,1,1};
   font = "PuristaMedium";
   sizeEx = 0.02;
   colorBackground[] = { 0.2,0.2,0.2, 0.9 }; 
   text = ""; 
};

///////////////////////////////////////////////////////////////////////////
/// Styles
///////////////////////////////////////////////////////////////////////////

// Control types
#define CT_STATIC           0
#define CT_BUTTON           1
#define CT_EDIT             2
#define CT_SLIDER           3
#define CT_COMBO            4
#define CT_LISTBOX          5
#define CT_TOOLBOX          6
#define CT_CHECKBOXES       7
#define CT_PROGRESS         8
#define CT_HTML             9
#define CT_STATIC_SKEW      10
#define CT_ACTIVETEXT       11
#define CT_TREE             12
#define CT_STRUCTURED_TEXT  13
#define CT_CONTEXT_MENU     14
#define CT_CONTROLS_GROUP   15
#define CT_SHORTCUTBUTTON   16
#define CT_XKEYDESC         40
#define CT_XBUTTON          41
#define CT_XLISTBOX         42
#define CT_XSLIDER          43
#define CT_XCOMBO           44
#define CT_ANIMATED_TEXTURE 45
#define CT_OBJECT           80
#define CT_OBJECT_ZOOM      81
#define CT_OBJECT_CONTAINER 82
#define CT_OBJECT_CONT_ANIM 83
#define CT_LINEBREAK        98
#define CT_USER             99
#define CT_MAP              100
#define CT_MAP_MAIN         101
#define CT_LISTNBOX         102

// Static styles
#define ST_POS            0x0F
#define ST_HPOS           0x03
#define ST_VPOS           0x0C
#define ST_LEFT           0x00
#define ST_RIGHT          0x01
#define ST_CENTER         0x02
#define ST_DOWN           0x04
#define ST_UP             0x08
#define ST_VCENTER        0x0C

#define ST_TYPE           0xF0
#define ST_SINGLE         0x00
#define ST_MULTI          0x10
#define ST_TITLE_BAR      0x20
#define ST_PICTURE        0x30
#define ST_FRAME          0x40
#define ST_BACKGROUND     0x50
#define ST_GROUP_BOX      0x60
#define ST_GROUP_BOX2     0x70
#define ST_HUD_BACKGROUND 0x80
#define ST_TILE_PICTURE   0x90
#define ST_WITH_RECT      0xA0
#define ST_LINE           0xB0

#define ST_SHADOW         0x100
#define ST_NO_RECT        0x200
#define ST_KEEP_ASPECT_RATIO  0x800

#define ST_TITLE          ST_TITLE_BAR + ST_CENTER

// Slider styles
#define SL_DIR            0x400
#define SL_VERT           0
#define SL_HORZ           0x400

#define SL_TEXTURES       0x10

// progress bar 
#define ST_VERTICAL       0x01
#define ST_HORIZONTAL     0

// Listbox styles
#define LB_TEXTURES       0x10
#define LB_MULTI          0x20

// Tree styles
#define TR_SHOWROOT       1
#define TR_AUTOCOLLAPSE   2

// MessageBox styles
#define MB_BUTTON_OK      1
#define MB_BUTTON_CANCEL  2
#define MB_BUTTON_USER    4


///////////////////////////////////////////////////////////////////////////
/// Base Classes
///////////////////////////////////////////////////////////////////////////
class RscText
{
access = 0;
type = 0;
idc = -1;
colorBackground[] = 
{
	0,
	0,
	0,
	0
};
colorText[] = 
{
	1,
	1,
	1,
	1
};
text = "";
fixedWidth = 0;
x = 0;
y = 0;
h = 0.037;
w = 0.3;
style = 0;
shadow = 1;
colorShadow[] = 
{
	0,
	0,
	0,
	0.5
};
font = "PuristaMedium";
SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
linespacing = 1;
tooltipColorText[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorBox[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorShade[] = 
{
	0,
	0,
	0,
	0.65
};
};
class RscStructuredText
{
access = 0;
type = 13;
idc = -1;
style = 0;
colorText[] = 
{
	1,
	1,
	1,
	1
};
class Attributes
{
	font = "PuristaMedium";
	color = "#ffffff";
	align = "left";
	shadow = 1;
};

// Doesn't work
autoScrollSpeed = -1;
autoScrollDelay = 5;
autoScrollRewind = 0;
arrowEmpty = "#(argb,8,8,3)color(1,1,1,1)";
arrowFull = "#(argb,8,8,3)color(1,1,1,1)";
class StructeredTextScrollBar
{
	color[] = 
	{
		1,
		1,
		1,
		1
	};
	autoScrollEnabled = 1;
};
// Doesn't work

x = 0;
y = 0;
h = 0.035;
w = 0.1;
text = "";
size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
shadow = 1;
};
class RscPicture
{
access = 0;
type = 0;
idc = -1;
style = 48;
colorBackground[] = 
{
	0,
	0,
	0,
	0
};
colorText[] = 
{
	1,
	1,
	1,
	1
};
font = "TahomaB";
sizeEx = 0;
lineSpacing = 0;
text = "";
fixedWidth = 0;
shadow = 0;
x = 0;
y = 0;
w = 0.2;
h = 0.15;
tooltipColorText[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorBox[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorShade[] = 
{
	0,
	0,
	0,
	0.65
};
};
class RscEdit
{
access = 0;
type = 2;
x = 0;
y = 0;
h = 0.04;
w = 0.2;
colorBackground[] = 
{
	0,
	0,
	0,
	1
};
colorText[] = 
{
	0.95,
	0.95,
	0.95,
	1
};
colorDisabled[] = 
{
	1,
	1,
	1,
	0.25
};
colorSelection[] = 
{
	"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])",
	"(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])",
	"(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",
	1
};
autocomplete = "";
text = "";
size = 0.2;
style = "0x00 + 0x40";
font = "PuristaMedium";
shadow = 2;
sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
canModify = 1;
tooltipColorText[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorBox[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorShade[] = 
{
	0,
	0,
	0,
	0.65
};
};
class RscCombo
{
access = 0;
type = 4;
colorSelect[] = 
{
	0,
	0,
	0,
	1
};
colorText[] = 
{
	1,
	1,
	1,
	1
};
colorBackground[] = 
{
	0,
	0,
	0,
	1
};
colorScrollbar[] = 
{
	1,
	0,
	0,
	1
};
soundSelect[] = 
{
	"\A3\ui_f\data\sound\RscCombo\soundSelect",
	0.1,
	1
};
soundExpand[] = 
{
	"\A3\ui_f\data\sound\RscCombo\soundExpand",
	0.1,
	1
};
soundCollapse[] = 
{
	"\A3\ui_f\data\sound\RscCombo\soundCollapse",
	0.1,
	1
};
maxHistoryDelay = 1;
class ComboScrollBar
{
	color[] = 
	{
		1,
		1,
		1,
		1
	};
};
style = "0x10 + 0x200";
x = 0;
y = 0;
w = 0.12;
h = 0.035;
shadow = 0;
colorSelectBackground[] = 
{
	1,
	1,
	1,
	0.7
};
arrowEmpty = "\A3\ui_f\data\GUI\RscCommon\rsccombo\arrow_combo_ca.paa";
arrowFull = "\A3\ui_f\data\GUI\RscCommon\rsccombo\arrow_combo_active_ca.paa";
wholeHeight = 0.45;
colorActive[] = 
{
	1,
	0,
	0,
	1
};
colorDisabled[] = 
{
	1,
	1,
	1,
	0.25
};
font = "PuristaMedium";
sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
tooltipColorText[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorBox[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorShade[] = 
{
	0,
	0,
	0,
	0.65
};
};
class RscListBox
{
access = 0;
type = 5;
w = 0.4;
h = 0.4;
rowHeight = 0;
colorText[] = 
{
	1,
	1,
	1,
	1
};
colorDisabled[] = 
{
	1,
	1,
	1,
	0.25
};
colorScrollbar[] = 
{
	1,
	0,
	0,
	0
};
colorSelect[] = 
{
	0,
	0,
	0,
	1
};
colorSelect2[] = 
{
	0,
	0,
	0,
	1
};
colorSelectBackground[] = 
{
	0.95,
	0.95,
	0.95,
	1
};
colorSelectBackground2[] = 
{
	1,
	1,
	1,
	0.5
};
colorBackground[] = 
{
	0,
	0,
	0,
	0.3
};
soundSelect[] = 
{
	"\A3\ui_f\data\sound\RscListbox\soundSelect",
	0.09,
	1
};
autoScrollSpeed = -1;
autoScrollDelay = 5;
autoScrollRewind = 0;
arrowEmpty = "#(argb,8,8,3)color(1,1,1,1)";
arrowFull = "#(argb,8,8,3)color(1,1,1,1)";
class ListScrollBar
{
	color[] = 
	{
		1,
		1,
		1,
		1
	};
	autoScrollEnabled = 1;
};
style = 16;
font = "PuristaMedium";
sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
shadow = 0;
colorShadow[] = 
{
	0,
	0,
	0,
	0.5
};
period = 1.2;
maxHistoryDelay = 1;
tooltipColorText[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorBox[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorShade[] = 
{
	0,
	0,
	0,
	0.65
};
};
class RscButton
{
access = 0;
type = 1;
text = "";
colorText[] = 
{
	1,
	1,
	1,
	1
};
colorDisabled[] = 
{
	1,
	1,
	1,
	0.25
};
colorBackground[] = 
{
	0,
	0,
	0,
	0.5
};
colorBackgroundDisabled[] = 
{
	0,
	0,
	0,
	0.5
};
colorBackgroundActive[] = 
{
	0,
	0,
	0,
	1
};
colorFocused[] = 
{
	0,
	0,
	0,
	1
};
colorShadow[] = 
{
	0,
	0,
	0,
	0
};
colorBorder[] = 
{
	0,
	0,
	0,
	1
};
soundEnter[] = 
{
	"\A3\ui_f\data\sound\RscButton\soundEnter",
	0.09,
	1
};
soundPush[] = 
{
	"\A3\ui_f\data\sound\RscButton\soundPush",
	0.09,
	1
};
soundClick[] = 
{
	"\A3\ui_f\data\sound\RscButton\soundClick",
	0.09,
	1
};
soundEscape[] = 
{
	"\A3\ui_f\data\sound\RscButton\soundEscape",
	0.09,
	1
};
style = 2;
x = 0;
y = 0;
w = 0.095589;
h = 0.039216;
shadow = 2;
font = "PuristaMedium";
sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
borderSize = 0;
offsetX = 0;
offsetY = 0;
offsetPressedX = 0;
offsetPressedY = 0;
period = 1.2;
periodFocus = 1.2;
periodOver = 1.2;
};
class RscShortcutButton
{
type = 16;
x = 0.1;
y = 0.1;
class HitZone
{
	left = 0;
	top = 0;
	right = 0;
	bottom = 0;
};
class ShortcutPos
{
	left = 0;
	top = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2";
	w = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)";
	h = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
};
class TextPos
{
	left = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)";
	top = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2";
	right = 0.005;
	bottom = 0;
};
shortcuts[] = 
{
};
textureNoShortcut = "#(argb,8,8,3)color(0,0,0,0)";
color[] = 
{
	1,
	1,
	1,
	1
};
colorFocused[] = 
{
	1,
	1,
	1,
	1
};
color2[] = 
{
	0.95,
	0.95,
	0.95,
	1
};
colorDisabled[] = 
{
	1,
	1,
	1,
	0.25
};
colorBackground[] = 
{
	"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])",
	"(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])",
	"(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",
	1
};
colorBackgroundFocused[] = 
{
	"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])",
	"(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])",
	"(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",
	1
};
colorBackground2[] = 
{
	1,
	1,
	1,
	1
};
soundEnter[] = 
{
	"\A3\ui_f\data\sound\RscButton\soundEnter",
	0.09,
	1
};
soundPush[] = 
{
	"\A3\ui_f\data\sound\RscButton\soundPush",
	0.09,
	1
};
soundClick[] = 
{
	"\A3\ui_f\data\sound\RscButton\soundClick",
	0.09,
	1
};
soundEscape[] = 
{
	"\A3\ui_f\data\sound\RscButton\soundEscape",
	0.09,
	1
};
class Attributes
{
	font = "PuristaMedium";
	color = "#E5E5E5";
	align = "left";
	shadow = "true";
};
idc = -1;
style = 0;
default = 0;
shadow = 1;
w = 0.183825;
h = "((((safezoneW / safezoneH) min 1.2) / 1.2) / 20)";
animTextureDefault = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa";
animTextureNormal = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa";
animTextureDisabled = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa";
animTextureOver = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\over_ca.paa";
animTextureFocused = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\focus_ca.paa";
animTexturePressed = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\down_ca.paa";
periodFocus = 1.2;
periodOver = 0.8;
period = 0.4;
font = "PuristaMedium";
size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
text = "";
action = "";
class AttributesImage
{
	font = "PuristaMedium";
	color = "#E5E5E5";
	align = "left";
};
};
class RscShortcutButtonMain
{
idc = -1;
style = 0;
default = 0;
w = 0.313726;
h = 0.104575;
color[] = 
{
	1,
	1,
	1,
	1
};
colorDisabled[] = 
{
	1,
	1,
	1,
	0.25
};
class HitZone
{
	left = 0;
	top = 0;
	right = 0;
	bottom = 0;
};
class ShortcutPos
{
	left = 0.0145;
	top = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)) / 2";
	w = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2) * (3/4)";
	h = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)";
};
class TextPos
{
	left = "(((safezoneW / safezoneH) min 1.2) / 32) * 1.5";
	top = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 20)*2 - (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)) / 2";
	right = 0.005;
	bottom = 0;
};
animTextureNormal = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButtonMain\normal_ca.paa";
animTextureDisabled = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButtonMain\disabled_ca.paa";
animTextureOver = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButtonMain\over_ca.paa";
animTextureFocused = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButtonMain\focus_ca.paa";
animTexturePressed = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButtonMain\down_ca.paa";
animTextureDefault = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButtonMain\normal_ca.paa";
period = 0.5;
font = "PuristaMedium";
size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)";
sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)";
text = "";
action = "";
class Attributes
{
	font = "PuristaMedium";
	color = "#E5E5E5";
	align = "left";
	shadow = "false";
};
class AttributesImage
{
	font = "PuristaMedium";
	color = "#E5E5E5";
	align = "false";
};
};
class RscFrame
{
type = 0;
idc = -1;
style = 64;
shadow = 2;
colorBackground[] = 
{
	0,
	0,
	0,
	0
};
colorText[] = 
{
	1,
	1,
	1,
	1
};
font = "PuristaMedium";
sizeEx = 0.02;
text = "";
};
class RscSlider
{
access = 0;
type = 3;
style = 1024;
w = 0.3;
color[] = 
{
	1,
	1,
	1,
	0.8
};
colorActive[] = 
{
	1,
	1,
	1,
	1
};
shadow = 0;
h = 0.025;
};
class IGUIBack
{
type = 0;
idc = 124;
style = 128;
text = "";
colorText[] = 
{
	0,
	0,
	0,
	0
};
font = "PuristaMedium";
sizeEx = 0;
shadow = 0;
x = 0.1;
y = 0.1;
w = 0.1;
h = 0.1;
colorbackground[] = 
{
	"(profilenamespace getvariable ['IGUI_BCG_RGB_R',0])",
	"(profilenamespace getvariable ['IGUI_BCG_RGB_G',1])",
	"(profilenamespace getvariable ['IGUI_BCG_RGB_B',1])",
	"(profilenamespace getvariable ['IGUI_BCG_RGB_A',0.8])"
};
};
class RscCheckbox
{
idc = -1;
type = 7;
style = 0;
x = "LINE_X(XVAL)";
y = "LINE_Y";
w = "LINE_W(WVAL)";
h = 0.029412;
colorText[] = 
{
	1,
	0,
	0,
	1
};
color[] = 
{
	0,
	0,
	0,
	0
};
colorBackground[] = 
{
	0,
	0,
	1,
	1
};
colorTextSelect[] = 
{
	0,
	0.8,
	0,
	1
};
colorSelectedBg[] = 
{
	"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])",
	"(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])",
	"(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",
	1
};
colorSelect[] = 
{
	0,
	0,
	0,
	1
};
colorTextDisable[] = 
{
	0.4,
	0.4,
	0.4,
	1
};
colorDisable[] = 
{
	0.4,
	0.4,
	0.4,
	1
};
tooltipColorText[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorBox[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorShade[] = 
{
	0,
	0,
	0,
	0.65
};
font = "PuristaMedium";
sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)";
rows = 1;
columns = 1;
strings[] = 
{
	"UNCHECKED"
};
checked_strings[] = 
{
	"CHECKED"
};
};
class RscButtonMenu
{
idc = -1;
type = 16;
style = "0x02 + 0xC0";
default = 0;
shadow = 0;
x = 0;
y = 0;
w = 0.095589;
h = 0.039216;
animTextureNormal = "#(argb,8,8,3)color(1,1,1,1)";
animTextureDisabled = "#(argb,8,8,3)color(1,1,1,1)";
animTextureOver = "#(argb,8,8,3)color(1,1,1,1)";
animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)";
animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)";
animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)";
colorBackground[] = 
{
	0,
	0,
	0,
	0.8
};
colorBackgroundFocused[] = 
{
	1,
	1,
	1,
	1
};
colorBackground2[] = 
{
	0.75,
	0.75,
	0.75,
	1
};
color[] = 
{
	1,
	1,
	1,
	1
};
colorFocused[] = 
{
	0,
	0,
	0,
	1
};
color2[] = 
{
	0,
	0,
	0,
	1
};
colorText[] = 
{
	1,
	1,
	1,
	1
};
colorDisabled[] = 
{
	1,
	1,
	1,
	0.25
};
period = 1.2;
periodFocus = 1.2;
periodOver = 1.2;
size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
tooltipColorText[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorBox[] = 
{
	1,
	1,
	1,
	1
};
tooltipColorShade[] = 
{
	0,
	0,
	0,
	0.65
};
class TextPos
{
	left = "0.25 * (((safezoneW / safezoneH) min 1.2) / 40)";
	top = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) - (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2";
	right = 0.005;
	bottom = 0;
};
class Attributes
{
	font = "PuristaLight";
	color = "#E5E5E5";
	align = "left";
	shadow = "false";
};
class ShortcutPos
{
	left = "(6.25 * (((safezoneW / safezoneH) min 1.2) / 40)) - 0.0225 - 0.005";
	top = 0.005;
	w = 0.0225;
	h = 0.03;
};
soundEnter[] = 
{
	"\A3\ui_f\data\sound\RscButtonMenu\soundEnter",
	0.09,
	1
};
soundPush[] = 
{
	"\A3\ui_f\data\sound\RscButtonMenu\soundPush",
	0.09,
	1
};
soundClick[] = 
{
	"\A3\ui_f\data\sound\RscButtonMenu\soundClick",
	0.09,
	1
};
soundEscape[] = 
{
	"\A3\ui_f\data\sound\RscButtonMenu\soundEscape",
	0.09,
	1
};
};
class RscButtonMenuOK
{
idc = 1;
shortcuts[] = 
{
	"0x00050000 + 0",
	28,
	57,
	156
};
default = 1;
text = "OK";
soundPush[] = 
{
	"\A3\ui_f\data\sound\RscButtonMenuOK\soundPush",
	0.09,
	1
};
};
class RscButtonMenuCancel
{
idc = 2;
shortcuts[] = 
{
	"0x00050000 + 1"
};
text = "Cancel";
};
class RscControlsGroup
{
class VScrollbar
{
	color[] = 
	{
		1,
		1,
		1,
		1
	};
	width = 0.021;
	autoScrollEnabled = 1;
};
class HScrollbar
{
	color[] = 
	{
		1,
		1,
		1,
		1
	};
	height = 0.028;
};
class Controls
{
};
type = 15;
idc = -1;
x = 0;
y = 0;
w = 1;
h = 1;
shadow = 0;
style = 16;
};

Share this post


Link to post
Share on other sites
Picture 3 - Correct size of text and in the right place, but with the wrong size of box.
The box is the correct size it is set to be 66% across and 79% down and 33% width with 20% height. Flick between picture 1 and 2 and you will see the box takes up the same amount of room.

I think the scaling of the text is wrong. Maybe try playing with the text size

size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";

Trying playing with a set value in here rather than this scaling factor?

Share this post


Link to post
Share on other sites

Thanks Larrow, I'll try your code and see what happens.

---------- Post added at 10:28 PM ---------- Previous post was at 09:42 PM ----------

Hm, I've applied fixed sizes now. It works a little bit better but still - if you switch down to interface size small or very small it looks just wrong.

Share this post


Link to post
Share on other sites

I'm sorry to bump this one again but I'm still stuck. The dialog windows are now aligned perfectly on all interface sizes.

However, the font sizes are still messed up. Even if I use fixed sizes for the RscStructeredText in the defines or the control class itself the game seems to scale the font size. I have two solutions: First one shows the text correctly on all interface sizes but it looks like **** on the lower ones. Second option looks good on the lower sizes but you can't read it on larger sizes because the text is falling out. Is there no way to ignore the damn interface size settings and just have a completely fixed dialog size? I'm getting tired after countless hours of tweaking with basically no resut. :/

Share this post


Link to post
Share on other sites

In Arma 2 OA I've divided the font size by (getResolution select 5)

e.g.

sizeEx = "0.2 / (getResolution select 5)";

to get a fixed font size (independent of the current UI scale).

But I don't know whether it's still working in Arma 3.

Share this post


Link to post
Share on other sites

Tanks for your reply! I've tried that but it had no impact at all. If I change the size attribute something happens but sizeEx is being ignored? What's the difference between those two?

I've also tried to apply the getResolution stuff on the size value but I wasn't able to find the right function yet. In my understanding setting a completely fixed value should result in a completely fixed size in game. But no, it seems like every (absolute) value is being scaled. I'm also confused about how the two size values connect. I can set one in my defines and one in the control itself. Both seem to change the actual size but I don't know if the class value overwrites / extends / multiplies the one from the defines. All very confusing and insanely frustrating. :confused:

Share this post


Link to post
Share on other sites
If I change the size attribute something happens but sizeEx is being ignored? What's the difference between those two?

Quoted from BISim dialog page
size string relative size of text, where 1 would be the same size as the parent class, and 2 would be twice as big. String representation of float (so "1.3" is valid).
sizeEx Float

Defines the block height (or "Em") of the text to be output. This height includes any ascenders or descenders the font may have, and the actual cap height (e.g. of the letter "H") is normally around 70% of the block height. Has no effect on images.

Found 10 minutes to have a little play with this last night, like you i couldnt get sizeEx to seem to make any difference. Where as size seemed to be a percentage of the screen size so

size = "0.05 * safezoneH"

Seemed to work quite well and kept the text the same size between different resolution and ratio sizes. 5% of * percentage of actual screen height versus the Absolute height. Just change the 0.05 to suit your needs. Maybe needs experimenting with more especially to see how these commands behave as a sub class within the hierarchy.

class myUI {

idd = 30000;
movingenable = true;


class Controls {

	class RscStructuredText_1100: RscStructuredText
	{
		idc = 1100;
		text = "WORLD";
		x = 0 * safezoneW + safezoneX;
		y = 0 * safezoneH + safezoneY;
		w = 1 * safezoneW;
		h = 1 * safezoneH;

		size = "0.05 * safezoneH";

	};

};

};

Share this post


Link to post
Share on other sites

Larrow, you are my shining British knight, saving me from evil in the darkest of times! This simple solution was exactly what I was looking for and does its job almost perfectly. Just had to adjust the constant factor down to 0.023 for the status dialog and 0.02 for the sidebar. Now it's visible (and readable) on all interface sizes; at least on my laptop resolution (1600x900). Users with other resolutions? Too bad, I will never ever touch these values again!

Now I can start regrowing some nerves I've lost fighting this issue, thank you!

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
Sign in to follow this  

×