From 20a9aecae0f3bb409900d3963754afbd9a4c9285 Mon Sep 17 00:00:00 2001 From: nakst <> Date: Fri, 15 Oct 2021 13:17:08 +0100 Subject: [PATCH] fix approximate border calculation; installer time textbox --- apps/installer.cpp | 33 +++++++++++++++++++++++++++++++++ desktop/os.header | 1 + res/Theme Source.dat | Bin 519468 -> 519760 bytes res/Theme.dat | Bin 29472 -> 29520 bytes shared/strings.cpp | 1 + util/api_table.ini | 1 + util/designer2.cpp | 22 +++++++++++++--------- 7 files changed, 49 insertions(+), 9 deletions(-) diff --git a/apps/installer.cpp b/apps/installer.cpp index 39f09b6..fa06bfa 100644 --- a/apps/installer.cpp +++ b/apps/installer.cpp @@ -49,6 +49,15 @@ const EsStyle styleButtonsRow = { }, }; +const EsStyle styleTextboxMedium = { + .inherit = ES_STYLE_TEXTBOX_BORDERED_SINGLE, + + .metrics = { + .mask = ES_THEME_METRICS_PREFERRED_WIDTH, + .preferredWidth = 80, + }, +}; + InstallerMetadata *metadata; Array connectedDrives; EsListView *drivesList; @@ -66,8 +75,10 @@ EsPanel *panelComplete; EsPanel *panelError; EsPanel *panelNotSupported; EsTextbox *userNameTextbox; +EsTextbox *timeTextbox; EsTextDisplay *progressDisplay; const char *cSelectedFont; +int64_t clockOffsetMs; uint8_t progress; bool onWaitScreen; bool startedInstallation; @@ -972,6 +983,15 @@ void Complete() { } void ButtonFinish(EsInstance *, EsElement *, EsCommand *) { + EsDateComponents base, modified; + EsDateNowUTC(&base); + modified = base; + // TODO Proper date/time parsing. + int64_t input = EsTextboxGetContentsAsDouble(timeTextbox); + modified.hour = input / 100; + modified.minute = (input % 100) % 60; + clockOffsetMs = DateToLinear(&modified) - DateToLinear(&base); + if (progress == 100) { Complete(); } else { @@ -1085,6 +1105,19 @@ void _start() { userNameTextbox = EsTextboxCreate(table, ES_CELL_H_LEFT); userNameTextbox->messageUser = UserNameTextboxMessage; + // TODO Proper date formatting. + EsDateComponents date; + EsDateNowUTC(&date); + char timeBuffer[64]; + ptrdiff_t timeBytes = EsStringFormat(timeBuffer, sizeof(timeBuffer), "%d%d:%d%d", + date.hour / 10, date.hour % 10, date.minute / 10, date.minute % 10); + + // TODO Make a date/time entry element or textbox overlay. + EsTextDisplayCreate(table, ES_CELL_H_RIGHT, ES_STYLE_TEXT_LABEL, INTERFACE_STRING(InstallerTime)); + timeTextbox = EsTextboxCreate(table, ES_CELL_H_LEFT, &styleTextboxMedium); + EsTextboxInsert(timeTextbox, timeBuffer, timeBytes); + // TODO A date field. + EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_V_TOP, ES_STYLE_TEXT_RADIO_GROUP_LABEL, INTERFACE_STRING(InstallerSystemFont)); EsPanel *fonts = EsPanelCreate(table, ES_CELL_H_LEFT | ES_PANEL_RADIO_GROUP); EsButton *button = EsButtonCreate(fonts, ES_BUTTON_RADIOBOX | ES_CELL_H_EXPAND, 0, INTERFACE_STRING(InstallerFontDefault)); diff --git a/desktop/os.header b/desktop/os.header index 5f5e955..462dad7 100644 --- a/desktop/os.header +++ b/desktop/os.header @@ -2239,6 +2239,7 @@ function double EsPerformanceTimerPop(); // Returns value in seconds. function double EsTimeStampMs(); // Current value of the performance timer, in ms. function void EsDateNowUTC(EsDateComponents *date); // Don't rely on the accuracy of the millisecond field. +private function uint64_t DateToLinear(const EsDateComponents *date); // Strings. diff --git a/res/Theme Source.dat b/res/Theme Source.dat index 9f99efcfbf142adc10fdf8d4441c039bbeacb32a..7c8aa58a4e1bd65d85886d018ab36e6068832c00 100644 GIT binary patch delta 1307 zcmYjRZ%kWN6z@HKulJRVQN9qy2U-|Vh%D5wn7OgJC6xlJ6A`5>)pS}DO$e*Cux^2+ z`xA*G1a@(!YBy_4HcZN-apson#Z+Zx$#8Zb@WTQwE)Y!?6G-Z}C3@fM8|A}&dHJ1l ze!uhQo|}4L&#l-?h{#ble^Pca%88H()c!DYyZjSPs zqa>(Gl@^nUpK`-qv*go7zBY8-9b38r(jqbI z28DNbLNn1t?=H(#Z1dkfp~;1&pJ+NiEXz)O|AElSykzKTkmh%}hq!RZ8-gRz0|S;q zQBzPylKAIo>SLw<*>Pi#SaC?9cAo18FBE!F^x;?haG)HMHK4Fei-RQaeuwCh;sx}*pe+faOL=Euq(IjAfQPht|x=0^pU!*R+_zPssP%YyPJ2_?q z73}(mFWvL)SBs@rEFRgvU+ly5E4%g7aVBALamPIf5X@&p zlx>JwaeaY2kJaB>9C(bID==9hS@E9$q3B&8m25s=$&z{7HaH>RORH8q_Zz&eHxQq3 zk*Y$*S_j8cIS|LpQ#nbsvDvvMJpGg8LGPO6LUj}zm}sX8i$8IV1s+K}@JN337LZoa zQ}NmO&?1^QZt<~M(u>&EK?4}<5`W?n`S{_Z^iG3VEVk35-FF}VC`|t% z#x-B4*VEw}5$b-rYGTFpz3OJ5;7XLP6jpHRsqelsG$NzaCAg&+4VDzA;nnWF6Js9Q z${&ABn~IBq@rZaBgkdj_PteTE80)u`;PF*j4Q+J#Y6B)$sY+hQBWvJ4{{4_P{twu!-LC)u delta 1251 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 delta 4263 zcmZ9Pe@xWp9mk*N;l6rKw1?B-a9DQR6sI!I~OWf=DU9-bc0*Sx-d z@AY}UpXc{;$IRE<^EHn=aqP~o&N0UJ0sU#lPAURVjJa`X{~NAG8r|UtaQq9r_QHLt zdr_Fj$=TsP*KMrB0r!P2sE+A$L5e?N1>~OtUe@8N zg?kX-v`SjweyapA7Q}-5@Aks|T?c{7@A@c&8*TlFWNmuU9WBEZxUfw+BzQ3%!*GpS z)@P2R#iP{7jqcls)CWW`27DUsWhuifoK31}4(_jLS71M%!2JzQ!R2r33S8@kI?#+> z#{Qw>+kH*)-*m)<(H4x*SGvubd_EsBaH#>+Z^D%b_b+Mq(x?m>G7$H>l^j?PG5lwkrMs@ z_m$LWc7|b1Zrmw)dZ5E{Lu89oy#el+lr;u zMYyd2+fJK~%W#oWh5>3shCxK40wUTt48wJ7$iUeM+(D_PQ5r*r2}Du@GHCVPfqNji zX}F(C8SWC_Y;?~cV%t!fGcVlh0rR6}U4T0xm0N`Se52zlaQQe31J5|!&v5EW`3!KM z1}<2w^Wl&=Qo(4rUq~(y?)-*|8B2qELn>#d<;_N$1Cd-QQUR9_r(OQ-(g0T`xh~4m z8*S$hDUu@naBoUOdKs=nDmO@1^+vY`k-tbS9)&x)v2@S`oLkux&@RsI!Hr4fyl@{# zZUIh}>R5!kq-XL?H7V%%wXjj>9pc=&krmTw}JHC#hiE!3D4Mut*7nUXC0GCrw%4)+XNN($$RbTT=EGII>n*R1FL_@oMN zGTx7&N6E2D^g;aYp-bvP$~-j7(p%F_cpT|=MtysdfN>Ylp6e!z#lY&Z8 ze3hgaY0A8V9;GBGF^2*&32Q2v{|Z@CO`<)OzD&>N)8oHO&EZ@>zMPiBmD+Uw0Mw<& zid*Tly>J(K(yd}H-B;Q{kr}Eom=TbZkJ2Tp%2#neK&w`haM~~;7OJ!D=Oc99rYf^G z#suamj23Msk$ISUcI=|W!&cr)-G|M5ntpRwRaOo^n@k=-kw+%Ej*>Esv~(nsSK&!T zskbs+Je-#C+)ue#F7Cy17~RdXVkXA2jMSB#$uIh!s49CKeVF~S@MhDa>{wyS@pWas zeFxS?EXq~qye?*Q=$(W^q_-Q8c(?ti7_j>m#=G`dK1IK`n|Uam$&DgIZX&l+R<4<2 z;pM7)5%&YMn2XNj(S1iaCFiB{F6z#U6H}TJ_tN+IDleu2$AK;XeDY-N;lqb(9(u!}iWLVkmGfwdEHLv5D#INkU4Y>% z(3b4ubi7&+h83`_Q00BpSeP$n3aKY#7flsf@!F-LFzPk$qS&HWwAYJ#uNSEpwz8s~ z^kvBoS}oEGQ!&+5mh)PwF0SXd>BHhlF{Qaq@O6x3oKKFUPMRp&i}DZ3 zCiw)tU9Kt%<ZsCDZbGyW*g~7V>yo@ z-lV?Uq{EVZoE}AeO&0M(6TRPbL0h@aDz^Sx&1UrAgXTD{r^n4M?xd0ymEWanEiPeb zrP7vi-aw75IpSU`)pgdBa>|Sr*G&w>&09recaiE z1r+IePb|6U53UpZ9PR6RPb_w!z7yKc=#CRz-Sq9A80zVcRffCQkIXo7b_R=8EnuV5 z+jc53J&di7fwRXVuJ=3(?9%!D`=>qJJ%m$RJGuLDSTBGWoWOnHHqg#r?bICwtH5Mt z>>`*2^NEaElJJuS%z?yYC$_b!tPN&M) z*$NExG4v8F0MBtW1SD3%fd$~Hf&&fJa3|2A8pZ~}66mc(9U3Q5c|CqWoW*ShI2%wQ zV2x-1m<2ISNC0%r7-Dc4On`_MGz828ODkjNfEVab!GjrKZNsPmT|3?d!$9AGsRkaf j0unn}5*z5m2QcVD3&B7adJn?8F%4i8tb(c@%q93g6hGbL diff --git a/shared/strings.cpp b/shared/strings.cpp index cf96aa3..5c6dab7 100644 --- a/shared/strings.cpp +++ b/shared/strings.cpp @@ -338,6 +338,7 @@ DEFINE_INTERFACE_STRING(InstallerFinish, "Finish"); DEFINE_INTERFACE_STRING(InstallerCustomizeOptions, "Customize your computer."); DEFINE_INTERFACE_STRING(InstallerCustomizeOptionsHint, "More options will be available in Settings."); DEFINE_INTERFACE_STRING(InstallerUserName, "User name:"); +DEFINE_INTERFACE_STRING(InstallerTime, "Current time:"); DEFINE_INTERFACE_STRING(InstallerSystemFont, "System font:"); DEFINE_INTERFACE_STRING(InstallerFontDefault, "Default"); DEFINE_INTERFACE_STRING(InstallerProgressMessage, "Installing, please wait" ELLIPSIS "\nDo not turn off your computer.\nProgress: \aw6]"); diff --git a/util/api_table.ini b/util/api_table.ini index a5b38d3..a7046d9 100644 --- a/util/api_table.ini +++ b/util/api_table.ini @@ -490,3 +490,4 @@ EsScrollViewIsInDragScroll=488 _EsOpenDocumentEnumerate=489 EsDialogGetContentArea=490 _EsDebugCommand=491 +DateToLinear=492 diff --git a/util/designer2.cpp b/util/designer2.cpp index c4e4deb..c8f2244 100644 --- a/util/designer2.cpp +++ b/util/designer2.cpp @@ -256,9 +256,10 @@ void InspectorPopulate(); void InspectorPickTargetEnd(); void CanvasSelectObject(struct Object *object); void CanvasSwitchView(void *cp); -Rectangle8 ExportCalculatePaintOutsets(Object *object); void ObjectAddCommand(void *cp); void ObjectChangeTypeInternal(void *cp); +Rectangle8 ExportCalculatePaintOutsets(Object *object); +Rectangle8 ExportCalculateApproximateBorders(Object *object); ////////////////////////////////////////////////////////////// @@ -1988,9 +1989,12 @@ void InspectorPopulate() { UIParentPop(); Rectangle8 paintOutsets = ExportCalculatePaintOutsets(PropertyFindOrInheritReadObject(style, "appearance")); - char paintOutsetsText[256]; - snprintf(paintOutsetsText, sizeof(paintOutsetsText), "Paint outsets: %d, %d, %d, %d.", UI_RECT_ALL(paintOutsets)); - UILabelCreate(0, 0, paintOutsetsText, -1); + char text[256]; + snprintf(text, sizeof(text), "Paint outsets: %d, %d, %d, %d.", UI_RECT_ALL(paintOutsets)); + UILabelCreate(0, 0, text, -1); + Rectangle8 approximateBorders = ExportCalculateApproximateBorders(PropertyFindOrInheritReadObject(style, "appearance")); + snprintf(text, sizeof(text), "Approximate borders: %d, %d, %d, %d.", UI_RECT_ALL(approximateBorders)); + UILabelCreate(0, 0, text, -1); } else { UILabelCreate(0, 0, "Select an object to inspect.", -1); } @@ -2146,12 +2150,12 @@ Rectangle8 ExportCalculateApproximateBorders(Object *object) { if (layerObject->type == OBJ_LAYER_BOX && position0 == 0 && position1 == 100 && position2 == 0 && position3 == 100 && !PropertyReadInt32(layerObject, "shadowHiding") && !PropertyReadInt32(layerObject, "isBlurred") - && mode == THEME_LAYER_MODE_BACKGROUND && PropertyFind(layerObject, "borderPaint")) { + && mode == THEME_LAYER_MODE_BACKGROUND && PropertyFindOrInherit(layerObject, "borderPaint")) { return { - (int8_t) PropertyReadInt32(layerObject, "borders0"), - (int8_t) PropertyReadInt32(layerObject, "borders1"), - (int8_t) PropertyReadInt32(layerObject, "borders2"), - (int8_t) PropertyReadInt32(layerObject, "borders3"), + (int8_t) PropertyFindOrInheritReadInt32(layerObject, "borders0"), + (int8_t) PropertyFindOrInheritReadInt32(layerObject, "borders1"), + (int8_t) PropertyFindOrInheritReadInt32(layerObject, "borders2"), + (int8_t) PropertyFindOrInheritReadInt32(layerObject, "borders3"), }; } }