From bb63553186034e556a909a2fc00e93c65616b5fd Mon Sep 17 00:00:00 2001 From: nakst <> Date: Fri, 27 Aug 2021 22:27:02 +0100 Subject: [PATCH] cleanup application properties; fix columns + choice list view insets --- desktop/list_view.cpp | 7 ++-- desktop/settings.cpp | 67 +++++++++++++++++++++++++++++---------- desktop/styles.header | 1 + res/Theme Source.dat | Bin 50824 -> 51041 bytes res/Themes/Theme.dat | Bin 52516 -> 52724 bytes shared/strings.cpp | 2 +- util/build_core.c | 22 +++---------- util/designer/designer.c | 3 +- 8 files changed, 64 insertions(+), 38 deletions(-) diff --git a/desktop/list_view.cpp b/desktop/list_view.cpp index 6edaa23..63d5de5 100644 --- a/desktop/list_view.cpp +++ b/desktop/list_view.cpp @@ -55,6 +55,7 @@ struct EsListView : EsElement { // TODO Updating these when the style changes. UIStyle *primaryCellStyle; UIStyle *secondaryCellStyle; + UIStyle *selectedCellStyle; bool hasFocusedItem; EsListViewIndex focusedItemGroup; @@ -1145,8 +1146,8 @@ struct EsListView : EsElement { if (EsRectangleClip(drawBounds, message->painter->clip, nullptr) && ES_HANDLED == EsMessageSend(this, &m)) { - UIStyle *style = (flags & ES_LIST_VIEW_CHOICE_SELECT) ? ((UIStyle *) message->painter->style) - : i ? secondaryCellStyle : primaryCellStyle; + bool useSelectedCellStyle = (item->element->customStyleState & THEME_STATE_SELECTED) && (flags & ES_LIST_VIEW_CHOICE_SELECT); + UIStyle *style = useSelectedCellStyle ? selectedCellStyle : i ? secondaryCellStyle : primaryCellStyle; uint8_t previousTextAlign = style->textAlign; @@ -1636,6 +1637,7 @@ struct EsListView : EsElement { primaryCellStyle->CloseReference(); secondaryCellStyle->CloseReference(); + selectedCellStyle->CloseReference(); fixedItems.Free(); visibleItems.Free(); groups.Free(); @@ -1955,6 +1957,7 @@ EsListView *EsListViewCreate(EsElement *parent, uint64_t flags, const EsStyle *s view->primaryCellStyle = GetStyle(MakeStyleKey(ES_STYLE_LIST_PRIMARY_CELL, 0), false); view->secondaryCellStyle = GetStyle(MakeStyleKey(ES_STYLE_LIST_SECONDARY_CELL, 0), false); + view->selectedCellStyle = GetStyle(MakeStyleKey(ES_STYLE_LIST_SELECTED_CHOICE_CELL, 0), false); // Only used for choice list views. view->Initialise(parent, flags | ES_ELEMENT_FOCUSABLE, ListViewProcessMessage, style ?: ES_STYLE_LIST_VIEW); view->cName = "list view"; diff --git a/desktop/settings.cpp b/desktop/settings.cpp index 16f7a81..76d3b5f 100644 --- a/desktop/settings.cpp +++ b/desktop/settings.cpp @@ -1,6 +1,5 @@ -// TODO Undo button overlapped slightly when scrollbar shown. -// Maybe we should use a toolbar for these buttons? -// Need to make an animation for showing/hiding the toolbar. +// TODO We can't wait for the worker thread if we have the message mutex, or it'll cause deadlock! +// TODO Waiting for the worker thread to exit when destroying instance. struct SettingsInstance : CommonDesktopInstance { EsPanel *switcher; @@ -11,6 +10,7 @@ struct SettingsInstance : CommonDesktopInstance { // Applications page: EsHandle workerThread; EsListView *applicationsList; + EsPanel *applicationInspector; volatile bool workerStop; }; @@ -129,12 +129,18 @@ const EsStyle styleSliderRow = { }, }; -const EsStyle styleApplicationsList = { - .inherit = ES_STYLE_LIST_CHOICE_BORDERED, - +const EsStyle styleSettingsApplicationsPage = { .metrics = { - .mask = ES_THEME_METRICS_PREFERRED_HEIGHT, - .preferredHeight = 0, + .mask = ES_THEME_METRICS_INSETS | ES_THEME_METRICS_GAP_MAJOR, + .insets = ES_RECT_1(10), + .gapMajor = 10, + }, +}; + +const EsStyle styleSettingsApplicationsPage2 = { + .metrics = { + .mask = ES_THEME_METRICS_GAP_MAJOR, + .gapMajor = 10, }, }; @@ -236,7 +242,10 @@ void SettingsPageUnimplemented(EsElement *element, SettingsPage *page) { 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); SettingsAddTitle(container, page); - EsTextDisplayCreate(container, ES_CELL_H_CENTER, 0, "Work in progress" ELLIPSIS); + + EsPanel *warningRow = EsPanelCreate(container, ES_CELL_H_CENTER | ES_PANEL_HORIZONTAL, &styleSettingsTable); + EsIconDisplayCreate(warningRow, ES_FLAGS_DEFAULT, 0, ES_ICON_DIALOG_WARNING); + EsTextDisplayCreate(warningRow, ES_FLAGS_DEFAULT, 0, "Work in progress" ELLIPSIS); } void SettingsCheckboxCommand(EsInstance *_instance, EsElement *element, EsCommand *) { @@ -469,6 +478,10 @@ void SettingsPageKeyboard(EsElement *element, SettingsPage *page) { EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL | ES_CELL_H_SHRINK, &styleSettingsGroupContainer2); SettingsAddTitle(container, page); + EsPanel *warningRow = EsPanelCreate(container, ES_CELL_H_CENTER | ES_PANEL_HORIZONTAL, &styleSettingsTable); + 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, &styleSettingsTable); EsPanelSetBands(table, 2); @@ -498,6 +511,11 @@ void SettingsPageKeyboard(EsElement *element, SettingsPage *page) { EsTextboxCreate(testBox, ES_CELL_H_LEFT)->accessKey = 'T'; } +void SettingsPageApplicationsRefresh(SettingsInstance *instance) { + EsElementDestroyContents(instance->applicationInspector); + EsTextDisplayCreate(instance->applicationInspector, ES_CELL_H_FILL, 0, INTERFACE_STRING(DesktopSettingsApplicationSelectItem)); +} + void SettingsPageApplicationsWorkerThread(EsGeneric context) { SettingsInstance *instance = (SettingsInstance *) context.p; EsListViewIndex index; @@ -540,21 +558,24 @@ void SettingsPageApplicationsWorkerThread(EsGeneric context) { if (EsListViewFixedItemFindIndex(instance->applicationsList, application, &index)) { EsListViewFixedItemAddString(instance->applicationsList, index, buffer, EsStringFormat(buffer, sizeof(buffer), "%D", application->totalSize)); + + EsGeneric selected; + + if (EsListViewFixedItemGetSelected(instance->applicationsList, &selected) && selected.p == application) { + SettingsPageApplicationsRefresh(instance); + } } EsMessageMutexRelease(); } } - -void SettingsPageApplications(EsElement *element, SettingsPage *page) { + +void SettingsPageApplications(EsElement *element, SettingsPage *) { SettingsInstance *instance = (SettingsInstance *) element->instance; - EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO, &styleNewTabContent); - EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL | ES_CELL_H_SHRINK, &styleSettingsGroupContainer3); - SettingsAddTitle(container, page); + EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_HORIZONTAL, &styleSettingsApplicationsPage); - EsTextDisplayCreate(container, ES_CELL_H_FILL, 0, INTERFACE_STRING(DesktopSettingsApplicationSelectItem)); - uint64_t listFlags = ES_CELL_H_FILL | ES_LIST_VIEW_CHOICE_SELECT | ES_LIST_VIEW_FIXED_ITEMS | ES_LIST_VIEW_COLUMNS; - EsListView *list = EsListViewCreate(container, listFlags, &styleApplicationsList); + uint64_t listFlags = ES_CELL_FILL | ES_LIST_VIEW_CHOICE_SELECT | ES_LIST_VIEW_FIXED_ITEMS | ES_LIST_VIEW_COLUMNS; + EsListView *list = EsListViewCreate(content, listFlags, ES_STYLE_LIST_CHOICE_BORDERED); instance->applicationsList = list; EsListViewSetColumns(list, settingsApplicationListColumns, sizeof(settingsApplicationListColumns) / sizeof(settingsApplicationListColumns[0])); list->accessKey = 'L'; @@ -580,6 +601,18 @@ void SettingsPageApplications(EsElement *element, SettingsPage *page) { EsThreadInformation thread; EsThreadCreate(SettingsPageApplicationsWorkerThread, &thread, instance); instance->workerThread = thread.handle; + + list->messageUser = [] (EsElement *element, EsMessage *message) { + if (message->type == ES_MSG_LIST_VIEW_SELECT) { + SettingsInstance *instance = (SettingsInstance *) element->instance; + SettingsPageApplicationsRefresh(instance); + } + + return 0; + }; + + instance->applicationInspector = EsPanelCreate(content, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO, &styleSettingsApplicationsPage2); + SettingsPageApplicationsRefresh(instance); } SettingsPage settingsPages[] = { diff --git a/desktop/styles.header b/desktop/styles.header index bcaecb7..35fd5c6 100644 --- a/desktop/styles.header +++ b/desktop/styles.header @@ -39,6 +39,7 @@ define ES_STYLE_LIST_ITEM_GROUP_HEADER (ES_STYLE_CAST(1283)) define ES_STYLE_LIST_ITEM_TILE (ES_STYLE_CAST(1285)) define_private ES_STYLE_LIST_PRIMARY_CELL (ES_STYLE_CAST(1287)) define_private ES_STYLE_LIST_SECONDARY_CELL (ES_STYLE_CAST(1289)) +define_private ES_STYLE_LIST_SELECTED_CHOICE_CELL (ES_STYLE_CAST(1621)) define_private ES_STYLE_LIST_SELECTION_BOX (ES_STYLE_CAST(1291)) define ES_STYLE_LIST_VIEW (ES_STYLE_CAST(1293)) define ES_STYLE_LIST_VIEW_BORDERED (ES_STYLE_CAST(1295)) diff --git a/res/Theme Source.dat b/res/Theme Source.dat index 719c1e7331f7a11758254e504997c8f3fe128a2b..38fd39fed16704f6c02f267a8bcf1be097071bd4 100644 GIT binary patch delta 185 zcmeC^Wq#Pl%r45nz@Xh$xsg4WMYd79ZMsipafx1VYEEi$NotC7Mt){;s&i^ij#k^| zB9;XlEc{K3jgt?WOHXoQ-E77?Z3Ppf=H$fnijxh**kw2v8bAPOAVXsV1Bhk>vB6++ sfSd@UHcY8GKBYkQ0!%<+Qb=k=iJnhlQfiK8URi1p&^?>aY~3RO03jtYod5s; delta 42 ycmaFZ$K27&%r45nz@Xk%v5`HOW%Fc~c^oXfO^l6`8MUQ12k_2bv3cpXJpup_qYeQ8 diff --git a/res/Themes/Theme.dat b/res/Themes/Theme.dat index 8b0318cc2fc532857cdca7e4d3a535c9aa4ddd9b..4a093e5567272450ecef305d6403bba12290d0ef 100644 GIT binary patch delta 4549 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[0]), NULL, NULL)); UIElementRefresh(&stylesTable->e); } }