layout bugfixes for scroll panes; update design of settings

This commit is contained in:
nakst 2022-01-02 22:25:12 +00:00
parent eb2eab872f
commit 8ed2750df1
7 changed files with 106 additions and 60 deletions

View File

@ -2293,7 +2293,7 @@ void LayoutStackSecondary(EsPanel *panel, EsMessage *message) {
if (panel->state & UI_STATE_INSPECTING) {
InspectorNotifyElementEvent(panel, "layout", "Measuring stack on secondary axis with %d children, insets %R; provided primary size is %d.\n",
panel, childCount, insets, primary);
childCount, insets, primary);
}
if (primary) {
@ -2339,6 +2339,13 @@ void LayoutStackPrimary(EsPanel *panel, EsMessage *message) {
int hBase = message->type == ES_MSG_GET_HEIGHT ? message->measure.width : Width(bounds);
int vBase = message->type == ES_MSG_GET_WIDTH ? message->measure.height : Height(bounds);
if (message->type == ES_MSG_LAYOUT) {
// If we scroll on a given axis, assume it extends to infinity during layout.
// During measurement, ScrollPane::ReceivedMessage does this for us.
if (panel->scroll.mode[0]) hBase = 0;
if (panel->scroll.mode[1]) vBase = 0;
}
int hSpace = hBase ? (hBase - insets.l - insets.r) : 0;
int vSpace = vBase ? (vBase - insets.t - insets.b) : 0;
int available = horizontal ? hSpace : vSpace;
@ -2424,11 +2431,10 @@ int EsElement::GetWidth(int height) {
else if (style->preferredHeight && style->preferredHeight < height && (~flags & (ES_CELL_V_EXPAND))) height = style->preferredHeight;
else if (style->metrics->minimumHeight && style->metrics->minimumHeight > height) height = style->metrics->minimumHeight;
else if (style->metrics->maximumHeight && style->metrics->maximumHeight < height) height = style->metrics->maximumHeight;
if (height) height -= internalOffsetTop + internalOffsetBottom;
EsMessage m = { ES_MSG_GET_WIDTH };
m.measure.height = height;
EsMessageSend(this, &m);
int width = m.measure.width + internalOffsetLeft + internalOffsetRight;
int width = m.measure.width;
if (style->metrics->minimumWidth && style->metrics->minimumWidth > width) width = style->metrics->minimumWidth;
if (style->metrics->maximumWidth && style->metrics->maximumWidth < width) width = style->metrics->maximumWidth;
return width;
@ -2441,11 +2447,10 @@ int EsElement::GetHeight(int width) {
else if (style->preferredWidth && style->preferredWidth < width && (~flags & (ES_CELL_H_EXPAND))) width = style->preferredWidth;
else if (style->metrics->minimumWidth && style->metrics->minimumWidth > width) width = style->metrics->minimumWidth;
else if (style->metrics->maximumWidth && style->metrics->maximumWidth < width) width = style->metrics->maximumWidth;
if (width) width -= internalOffsetLeft + internalOffsetRight;
EsMessage m = { ES_MSG_GET_HEIGHT };
m.measure.width = width;
EsMessageSend(this, &m);
int height = m.measure.height + internalOffsetTop + internalOffsetBottom;
int height = m.measure.height;
if (style->metrics->minimumHeight && style->metrics->minimumHeight > height) height = style->metrics->minimumHeight;
if (style->metrics->maximumHeight && style->metrics->maximumHeight < height) height = style->metrics->maximumHeight;
return height;
@ -2889,25 +2894,61 @@ int ScrollPane::ReceivedMessage(EsMessage *message) {
if (deltaY && (flags & ES_SCROLL_Y_DRAG)) SetY(position[1] + deltaY, true);
message->animate.complete = false;
}
} else if (message->type == ES_MSG_GET_HEIGHT) {
if (message->measure.width && (mode[0] == ES_SCROLL_MODE_AUTO) && (mode[1] != ES_SCROLL_MODE_AUTO)) {
// To accurately measure the height of the element for this width,
// we need to determine whether the horizontal scrollbar will be present.
// TODO This assumes that the element will be send a LAYOUT message after measurements are complete,
// in order for the scrollbars to be updated. But I think this will always happen..?
EsMessage m = {};
m.type = ES_MSG_GET_WIDTH;
EsMessageSend(parent, &m);
parent->internalOffsetBottom = (m.measure.width + fixedViewport[0] > message->measure.width) ? bar[0]->style->preferredHeight : 0;
} else if (message->type == ES_MSG_GET_HEIGHT && !message->measure.internalMeasurement) {
int width = message->measure.width;
// If there is a prescribed internal width, we would need to subtract the width of the vertical scroll bar.
// But we are measuring the external height here, so if this height value gets used then
// the vertical scroll bar can only show if it is in the fixed mode.
if (width && mode[1] == ES_SCROLL_MODE_FIXED) {
width -= bar[1]->style->preferredWidth;
}
} else if (message->type == ES_MSG_GET_WIDTH) {
if (message->measure.width && (mode[1] == ES_SCROLL_MODE_AUTO) && (mode[0] != ES_SCROLL_MODE_AUTO)) {
// As above.
EsMessage m = {};
m.type = ES_MSG_GET_HEIGHT;
EsMessageSend(parent, &m);
parent->internalOffsetRight = (m.measure.height + fixedViewport[1] > message->measure.height) ? bar[1]->style->preferredWidth : 0;
// Get the internal measurement on this axis.
EsMessage m = {};
m.type = ES_MSG_GET_HEIGHT;
m.measure.width = mode[0] ? 0 : width; // If the opposite axis is being scrolled, then ignore a prescribed measurement -- that will be an external measurement.
m.measure.internalMeasurement = true;
EsMessageSend(parent, &m); // Send it to ourself for internal measurement.
message->measure.height = m.measure.height;
bool horizontalScrollBarWillShow = false;
if (mode[0] == ES_SCROLL_MODE_FIXED) {
horizontalScrollBarWillShow = true;
} else if (mode[0] == ES_SCROLL_MODE_AUTO) {
if (!width) {
// If there is no prescribed external width,
// then we have no way to determine whether the scroll bar will be shown in this case.
} else {
EsMessage m = {};
m.type = ES_MSG_GET_WIDTH;
EsMessageSend(parent, &m);
horizontalScrollBarWillShow = m.measure.width + fixedViewport[0] > width;
}
}
// Add the height of the horizontal scroll bar, if it will be shown, to calculate the external height.
if (horizontalScrollBarWillShow) message->measure.height += bar[0]->style->preferredHeight;
return ES_HANDLED;
} else if (message->type == ES_MSG_GET_WIDTH && !message->measure.internalMeasurement) {
// Algorithm copied from above, in the GET_HEIGHT case.
int height = message->measure.height;
if (height && mode[0] == ES_SCROLL_MODE_FIXED) height -= bar[0]->style->preferredHeight;
EsMessage m = { .type = ES_MSG_GET_WIDTH, .measure = { .height = mode[1] ? 0 : height, .internalMeasurement = true } };
EsMessageSend(parent, &m);
message->measure.width = m.measure.width;
bool verticalScrollBarWillShow = mode[1] == ES_SCROLL_MODE_FIXED;
if (mode[1] == ES_SCROLL_MODE_AUTO && height) {
EsMessage m = { .type = ES_MSG_GET_HEIGHT };
EsMessageSend(parent, &m);
verticalScrollBarWillShow = m.measure.height + fixedViewport[1] > height;
}
if (verticalScrollBarWillShow) message->measure.width += bar[1]->style->preferredWidth;
return ES_HANDLED;
} else if (message->type == ES_MSG_SCROLL_WHEEL) {
SetPosition(0, position[0] + 60 * message->scrollWheel.dx / ES_SCROLL_WHEEL_NOTCH, true);
SetPosition(1, position[1] - 60 * message->scrollWheel.dy / ES_SCROLL_WHEEL_NOTCH, true);
@ -2944,6 +2985,7 @@ bool ScrollPane::RefreshLimit(int axis, int64_t *contentSize) {
EsMessage m = {};
m.type = axis ? ES_MSG_GET_HEIGHT : ES_MSG_GET_WIDTH;
m.measure.internalMeasurement = true;
if (axis) m.measure.width = bounds.r;
else m.measure.height = bounds.b;
EsMessageSend(parent, &m);
@ -3365,7 +3407,7 @@ int ProcessPanelMessage(EsElement *element, EsMessage *message) {
}
if (childCount < 100) {
return 0;
return 0; // Don't bother if there are only a small number of child elements.
}
message->beforeZOrder.nonClient = childCount;
@ -6358,7 +6400,7 @@ EsElement *UIFindHoverElementRecursively(EsElement *element, int offsetX, int of
EsMessage zOrder = { ES_MSG_BEFORE_Z_ORDER };
zOrder.beforeZOrder.nonClient = zOrder.beforeZOrder.end = element->children.Length();
zOrder.beforeZOrder.clip = Translate(ES_RECT_4(0, element->width, 0, element->height), offsetX, offsetY);
zOrder.beforeZOrder.clip = Translate(ES_RECT_4(0, element->width, 0, element->height), -offsetX, -offsetY);
EsMessageSend(element, &zOrder);
EsElement *result = nullptr;

View File

@ -233,7 +233,8 @@ void InspectorNotifyElementEvent(EsElement *element, const char *cCategory, cons
if (cCategory) EsBufferFormat(&buffer, "%z: ", cCategory);
EsBufferFormatV(&buffer, cFormat, arguments);
va_end(arguments);
EsListViewFixedItemInsert(inspector->listEvents, _buffer, buffer.position);
EsListViewIndex index = EsListViewFixedItemInsert(inspector->listEvents);
EsListViewFixedItemSetString(inspector->listEvents, index, 0, _buffer, buffer.position);
EsListViewScrollToEnd(inspector->listEvents);
}

View File

@ -1600,6 +1600,7 @@ struct EsMessageWindowResized {
struct EsMessageMeasure {
int width, height;
bool internalMeasurement; // Used by scroll panes; ignore.
};
struct EsMessageHitTest {

View File

@ -46,12 +46,13 @@ const EsStyle styleAllSettingsGroupContainer = {
},
};
const EsStyle styleSettingsGroupContainer2 = {
.inherit = ES_STYLE_BUTTON_GROUP_CONTAINER,
const EsStyle styleSettingsGroupContainer = {
};
const EsStyle styleSettingsGroupContainer2 = {
.metrics = {
.mask = ES_THEME_METRICS_PREFERRED_WIDTH | ES_THEME_METRICS_INSETS | ES_THEME_METRICS_GAP_MAJOR,
.insets = ES_RECT_1(15),
.insets = ES_RECT_1(30),
.preferredWidth = 400,
.gapMajor = 15,
},
@ -284,11 +285,11 @@ void SettingsAddTitle(EsElement *container, SettingsPage *page) {
EsIconDisplayCreate(row, ES_FLAGS_DEFAULT, ES_STYLE_ICON_DISPLAY, page->iconID);
EsSpacerCreate(row, ES_FLAGS_DEFAULT, 0, 10, 0);
EsTextDisplayCreate(row, ES_CELL_H_FILL, ES_STYLE_TEXT_HEADING2, page->string, page->stringBytes);
EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_BUTTON_GROUP_SEPARATOR);
EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_SEPARATOR_HORIZONTAL);
}
void SettingsPageUnimplemented(EsElement *element, SettingsPage *page) {
EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO, &styleNewTabContent);
EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO | ES_PANEL_H_SCROLL_AUTO, &styleSettingsGroupContainer);
EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL | ES_CELL_H_SHRINK, &styleSettingsGroupContainer2);
SettingsAddTitle(container, page);
@ -404,8 +405,8 @@ void SettingsAddNumberBox(EsElement *table, const char *string, ptrdiff_t string
control->dragSpeed = dragSpeed;
control->discreteStep = discreteStep;
EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, string, stringBytes);
EsTextbox *textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED | ES_ELEMENT_FREE_USER_DATA, ES_STYLE_TEXTBOX_BORDERED_SINGLE_MEDIUM);
EsTextDisplayCreate(table, ES_CELL_H_RIGHT, 0, string, stringBytes);
EsTextbox *textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_TEXTBOX_EDIT_BASED | ES_ELEMENT_FREE_USER_DATA, ES_STYLE_TEXTBOX_BORDERED_SINGLE_MEDIUM);
EsTextboxUseNumberOverlay(textbox, false);
textbox->userData = control;
textbox->accessKey = accessKey;
@ -529,7 +530,7 @@ EsListView *SettingsAddChoiceList(EsElement *table, const char *string, ptrdiff_
control->cConfigurationKey = cConfigurationKey;
EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_V_TOP, 0, string, stringBytes);
EsListView *list = EsListViewCreate(table, ES_CELL_H_EXPAND | ES_CELL_H_PUSH | ES_LIST_VIEW_CHOICE_SELECT | ES_LIST_VIEW_FIXED_ITEMS, ES_STYLE_LIST_CHOICE_BORDERED);
EsListView *list = EsListViewCreate(table, ES_CELL_H_FILL | ES_LIST_VIEW_CHOICE_SELECT | ES_LIST_VIEW_FIXED_ITEMS, ES_STYLE_LIST_CHOICE_BORDERED);
list->accessKey = accessKey;
list->userData = control;
list->messageUser = SettingsChoiceListMessage;
@ -555,8 +556,8 @@ int SettingsDoubleClickTestMessage(EsElement *element, EsMessage *message) {
void SettingsPageMouse(EsElement *element, SettingsPage *page) {
EsElementSetHidden(((SettingsInstance *) element->instance)->undoButton, false);
EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO, &styleNewTabContent);
EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL | ES_CELL_H_SHRINK, &styleSettingsGroupContainer2);
EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO | ES_PANEL_H_SCROLL_AUTO, &styleSettingsGroupContainer);
EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL, &styleSettingsGroupContainer2);
SettingsAddTitle(container, page);
EsPanel *table;
@ -568,14 +569,12 @@ void SettingsPageMouse(EsElement *element, SettingsPage *page) {
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseUseAcceleration), 'C', "general", "use_cursor_acceleration");
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseSlowOnAlt), 'O', "general", "use_cursor_alt_slow");
EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_BUTTON_GROUP_SEPARATOR);
EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_SEPARATOR_HORIZONTAL);
SettingsAddSlider(container, INTERFACE_STRING(DesktopSettingsMouseCursorTrails), 'T', "general", "cursor_trails", 0, 7, 8,
INTERFACE_STRING(DesktopSettingsMouseCursorTrailsNone), INTERFACE_STRING(DesktopSettingsMouseCursorTrailsMany));
table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
EsPanelSetBands(table, 2);
table = EsPanelCreate(container, ES_CELL_H_CENTER | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
SettingsAddNumberBox(table, INTERFACE_STRING(DesktopSettingsMouseLinesPerScrollNotch), 'S', "general", "scroll_lines_per_notch",
1, 100, nullptr, 0, 0.04, 1);
@ -584,11 +583,9 @@ void SettingsPageMouse(EsElement *element, SettingsPage *page) {
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseShowShadow), 'W', "general", "show_cursor_shadow");
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseLocateCursorOnCtrl), 'L', "general", "locate_cursor_on_ctrl");
EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_BUTTON_GROUP_SEPARATOR);
table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
EsPanelSetBands(table, 2);
EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_SEPARATOR_HORIZONTAL);
table = EsPanelCreate(container, ES_CELL_H_CENTER | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
SettingsAddNumberBox(table, INTERFACE_STRING(DesktopSettingsMouseDoubleClickSpeed), 'D', "general", "click_chain_timeout_ms",
100, 1500, INTERFACE_STRING(CommonUnitMilliseconds), 1.0, 1);
@ -601,8 +598,8 @@ void SettingsPageMouse(EsElement *element, SettingsPage *page) {
void SettingsPageKeyboard(EsElement *element, SettingsPage *page) {
EsElementSetHidden(((SettingsInstance *) element->instance)->undoButton, false);
EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO, &styleNewTabContent);
EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL | ES_CELL_H_SHRINK, &styleSettingsGroupContainer2);
EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO | ES_PANEL_H_SCROLL_AUTO, &styleSettingsGroupContainer);
EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL, &styleSettingsGroupContainer2);
SettingsAddTitle(container, page);
EsPanel *table;
@ -634,29 +631,29 @@ void SettingsPageKeyboard(EsElement *element, SettingsPage *page) {
table = EsPanelCreate(container, ES_CELL_H_FILL, &styleSettingsCheckboxGroup);
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsKeyboardUseSmartQuotes), 'Q', "general", "use_smart_quotes");
EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_BUTTON_GROUP_SEPARATOR);
EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_SEPARATOR_HORIZONTAL);
EsPanel *warningRow = EsPanelCreate(container, ES_CELL_H_CENTER | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
EsIconDisplayCreate(warningRow, ES_FLAGS_DEFAULT, 0, ES_ICON_DIALOG_WARNING);
EsTextDisplayCreate(warningRow, ES_FLAGS_DEFAULT, 0, "Work in progress" ELLIPSIS);
table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
table = EsPanelCreate(container, ES_CELL_H_CENTER | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
EsPanelSetBands(table, 2);
EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatDelay)); // TODO.
textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, ES_STYLE_TEXTBOX_BORDERED_SINGLE_MEDIUM);
EsTextDisplayCreate(table, ES_CELL_H_RIGHT, 0, INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatDelay)); // TODO.
textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_TEXTBOX_EDIT_BASED, ES_STYLE_TEXTBOX_BORDERED_SINGLE_MEDIUM);
textbox->accessKey = 'D';
EsTextboxUseNumberOverlay(textbox, false);
EsTextboxInsert(textbox, "400 ms");
EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatRate)); // TODO.
textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, ES_STYLE_TEXTBOX_BORDERED_SINGLE_MEDIUM);
EsTextDisplayCreate(table, ES_CELL_H_RIGHT, 0, INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatRate)); // TODO.
textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_TEXTBOX_EDIT_BASED, ES_STYLE_TEXTBOX_BORDERED_SINGLE_MEDIUM);
textbox->accessKey = 'R';
EsTextboxUseNumberOverlay(textbox, false);
EsTextboxInsert(textbox, "40 ms");
EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsKeyboardCaretBlinkRate)); // TODO.
textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, ES_STYLE_TEXTBOX_BORDERED_SINGLE_MEDIUM);
EsTextDisplayCreate(table, ES_CELL_H_RIGHT, 0, INTERFACE_STRING(DesktopSettingsKeyboardCaretBlinkRate)); // TODO.
textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_TEXTBOX_EDIT_BASED, ES_STYLE_TEXTBOX_BORDERED_SINGLE_MEDIUM);
textbox->accessKey = 'B';
EsTextboxUseNumberOverlay(textbox, false);
EsTextboxInsert(textbox, "500 ms");
@ -672,15 +669,15 @@ void SettingsPageDisplay(EsElement *element, SettingsPage *page) {
EsElementSetHidden(((SettingsInstance *) element->instance)->undoButton, false);
EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO, &styleNewTabContent);
EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL | ES_CELL_H_SHRINK, &styleSettingsGroupContainer2);
EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO | ES_PANEL_H_SCROLL_AUTO, &styleSettingsGroupContainer);
EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL, &styleSettingsGroupContainer2);
SettingsAddTitle(container, page);
EsPanel *warningRow = EsPanelCreate(container, ES_CELL_H_CENTER | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
EsIconDisplayCreate(warningRow, ES_FLAGS_DEFAULT, 0, ES_ICON_DIALOG_WARNING);
EsTextDisplayCreate(warningRow, ES_FLAGS_DEFAULT, 0, "Work in progress" ELLIPSIS);
EsPanel *table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
EsPanel *table = EsPanelCreate(container, ES_CELL_H_CENTER | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
EsPanelSetBands(table, 2);
SettingsAddNumberBox(table, INTERFACE_STRING(DesktopSettingsDisplayUIScale), 'S', "general", "ui_scale",
100, 400, INTERFACE_STRING(CommonUnitPercent), 0.05, 5);
@ -747,8 +744,8 @@ void SettingsColorButtonCommand(EsInstance *, EsElement *element, EsCommand *) {
void SettingsPageTheme(EsElement *element, SettingsPage *page) {
// TODO Fonts, theme file, etc.
EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO, &styleNewTabContent);
EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL | ES_CELL_H_SHRINK, &styleSettingsGroupContainer2);
EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO | ES_PANEL_H_SCROLL_AUTO, &styleSettingsGroupContainer);
EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL, &styleSettingsGroupContainer2);
SettingsAddTitle(container, page);
EsPanel *warningRow = EsPanelCreate(container, ES_CELL_H_CENTER | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_FORM_TABLE);
@ -759,7 +756,7 @@ void SettingsPageTheme(EsElement *element, SettingsPage *page) {
EsPanelSetBands(table, 2);
EsTextDisplayCreate(table, ES_CELL_H_RIGHT, 0, INTERFACE_STRING(DesktopSettingsThemeWallpaper));
EsTextbox *textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED | ES_ELEMENT_FREE_USER_DATA, ES_STYLE_TEXTBOX_BORDERED_SINGLE);
EsTextbox *textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_TEXTBOX_EDIT_BASED | ES_ELEMENT_FREE_USER_DATA, ES_STYLE_TEXTBOX_BORDERED_SINGLE);
size_t currentWallpaperBytes;
char *currentWallpaper = EsSystemConfigurationReadString(EsLiteral("general"), EsLiteral("wallpaper"), &currentWallpaperBytes);
EsTextboxInsert(textbox, currentWallpaper, currentWallpaperBytes);

5
help/UI Layout.md Normal file
View File

@ -0,0 +1,5 @@
# Debugging
This file has not been written yet. `Notes from Discord.txt` may contain a few unorganized pointers, though.
TODO

Binary file not shown.

View File

@ -181,7 +181,7 @@ DEFINE_INTERFACE_STRING(DesktopSettingsDisplayUIScale, "Interface scale:");
DEFINE_INTERFACE_STRING(DesktopSettingsThemeWindowColor, "Window color:");
DEFINE_INTERFACE_STRING(DesktopSettingsThemeEnableHoverState, "Highlight the item the cursor is over");
DEFINE_INTERFACE_STRING(DesktopSettingsThemeEnableAnimations, "Animate the user interface");
DEFINE_INTERFACE_STRING(DesktopSettingsThemeWallpaper, "Wallpaper");
DEFINE_INTERFACE_STRING(DesktopSettingsThemeWallpaper, "Wallpaper:");
// File operations.