From e8d219033e673fae2d0c152fa7fb7f97f8204fab Mon Sep 17 00:00:00 2001 From: nakst <> Date: Thu, 2 Sep 2021 14:20:54 +0100 Subject: [PATCH] bugfixes; tasks button; improve shadows --- desktop/api.cpp | 19 +++++++- desktop/desktop.cpp | 63 +++++++++++++++++++++++++- desktop/gui.cpp | 6 ++- desktop/renderer.cpp | 13 ++++++ desktop/theme.cpp | 9 ++++ res/System Configuration Template.ini | 5 -- res/Theme Source.dat | Bin 51041 -> 51597 bytes res/Themes/Theme.dat | Bin 52724 -> 52944 bytes util/designer/designer.c | 9 +++- 9 files changed, 112 insertions(+), 12 deletions(-) diff --git a/desktop/api.cpp b/desktop/api.cpp index 5208913..0666a54 100644 --- a/desktop/api.cpp +++ b/desktop/api.cpp @@ -203,6 +203,10 @@ struct APIInstance { EsFileStore *fileStore; + // Do not propagate messages about this instance to the application. + // Currently only used for inspectors. + bool internalOnly; + union { EsInstanceClassEditorSettings editorSettings; EsInstanceClassViewerSettings viewerSettings; @@ -714,8 +718,13 @@ const EsApplicationStartupInformation *EsInstanceGetStartupInformation(EsInstanc void EsInstanceDestroy(EsInstance *instance) { InspectorWindow **inspector = &((APIInstance *) instance->_private)->attachedInspector; - if (*inspector) EsInstanceDestroy(*inspector); - *inspector = nullptr; + + if (*inspector) { + EsInstanceDestroy(*inspector); + (*inspector)->window->InternalDestroy(); + *inspector = nullptr; + } + UndoManagerDestroy(instance->undoManager); EsAssert(instance->window->instance == instance); instance->window->destroyInstanceAfterClose = true; @@ -957,6 +966,12 @@ EsMessage *EsMessageReceive() { return &message.message; } } + } else if (type == ES_MSG_INSTANCE_DESTROY) { + APIInstance *instance = (APIInstance *) message.message.instanceDestroy.instance->_private; + + if (!instance->internalOnly) { + return &message.message; + } } else { return &message.message; } diff --git a/desktop/desktop.cpp b/desktop/desktop.cpp index bc4b811..8bbe113 100644 --- a/desktop/desktop.cpp +++ b/desktop/desktop.cpp @@ -729,6 +729,65 @@ int TaskBarMessage(EsElement *element, EsMessage *message) { return 0; } +int TaskBarTasksButtonMessage(EsElement *element, EsMessage *message) { + if (message->type == ES_MSG_GET_WIDTH) { + message->measure.width = GetConstantNumber("taskBarTasksButtonWidth"); + return ES_HANDLED; + } else if (message->type == ES_MSG_PAINT_ICON) { + float progress = 0.33f; + + uint32_t color1 = GetConstantNumber("taskBarTasksButtonWheelColor1"); + uint32_t color2 = GetConstantNumber("taskBarTasksButtonWheelColor2"); + + EsPainter *painter = message->painter; + + EsRectangle destination = EsPainterBoundsClient(painter); + destination = EsRectangleFit(destination, ES_RECT_2S(1, 1), true); // Center with a 1:1 aspect ratio. + + RastSurface surface = {}; + surface.buffer = (uint32_t *) painter->target->bits; + surface.stride = painter->target->stride; + + if (RastSurfaceInitialise(&surface, painter->target->width, painter->target->height, true)) { + RastVertex center = { (destination.l + destination.r) * 0.5f, (destination.t + destination.b) * 0.5f }; + + RastContourStyle style = {}; + style.internalWidth = 5.0f * theming.scale; + style.capMode = RAST_LINE_CAP_FLAT; + + RastPaint paint = {}; + paint.type = RAST_PAINT_SOLID; + + { + paint.solid.color = color1 & 0xFFFFFF; + paint.solid.alpha = (color1 >> 24) / 255.0f; + + RastPath path = {}; + RastPathAppendArc(&path, center, Width(destination) * 0.45f, ES_PI * 2.0f, 0.0f); + RastShape shape = RastShapeCreateContour(&path, style, true); + RastSurfaceFill(surface, shape, paint, false); + RastPathDestroy(&path); + } + + { + paint.solid.color = color2 & 0xFFFFFF; + paint.solid.alpha = (color2 >> 24) / 255.0f; + + RastPath path = {}; + RastPathAppendArc(&path, center, Width(destination) * 0.45f, ES_PI * 1.5f + progress * ES_PI * 2.0f, ES_PI * 1.5f); + RastShape shape = RastShapeCreateContour(&path, style, true); + RastSurfaceFill(surface, shape, paint, false); + RastPathDestroy(&path); + } + } + + RastSurfaceDestroy(&surface); + return ES_HANDLED; + } + + return 0; +} + void ShutdownModalCreate() { if (desktop.shutdownWindowOpen) { return; @@ -1824,13 +1883,15 @@ void DesktopSetup() { desktop.taskBar.taskList.Initialise(panel, ES_CELL_FILL, ReorderListMessage, nullptr); desktop.taskBar.taskList.cName = "task list"; + EsButton *tasksButton = EsButtonCreate(panel, ES_ELEMENT_HIDDEN, ES_STYLE_TASK_BAR_BUTTON, "Copying files" ELLIPSIS, -1); + tasksButton->messageUser = TaskBarTasksButtonMessage; + EsButton *shutdownButton = EsButtonCreate(panel, ES_FLAGS_DEFAULT, ES_STYLE_TASK_BAR_EXTRA); EsButtonSetIcon(shutdownButton, ES_ICON_SYSTEM_SHUTDOWN_SYMBOLIC); EsButtonOnCommand(shutdownButton, [] (EsInstance *, EsElement *, EsCommand *) { ShutdownModalCreate(); }); - } } diff --git a/desktop/gui.cpp b/desktop/gui.cpp index e008ea0..84f2929 100644 --- a/desktop/gui.cpp +++ b/desktop/gui.cpp @@ -6818,7 +6818,7 @@ struct InspectorElementEntry { }; struct InspectorWindow : EsInstance { - EsInstance *instance; + EsInstance *instance; // The instance being inspected. EsListView *elementList; Array elements; @@ -6854,7 +6854,8 @@ int InspectorElementItemCallback(EsElement *element, EsMessage *message) { else entry->element->Repaint(true); inspector->hoveredElement = *entry; } else if (message->type == ES_MSG_HOVERED_END || message->type == ES_MSG_DESTROY) { - InspectorElementEntry *entry = &inspector->elements[EsListViewGetIndexFromItem(element)]; + EsListViewIndex index = EsListViewGetIndexFromItem(element); + InspectorElementEntry *entry = &inspector->elements[index]; if (entry->element->parent) entry->element->parent->Repaint(true); else entry->element->Repaint(true); inspector->hoveredElement = {}; @@ -7304,6 +7305,7 @@ void InspectorSetup(EsWindow *window) { inspector->window = window; InstanceSetup(inspector); inspector->instance = window->instance; + ((APIInstance *) inspector->_private)->internalOnly = true; window->instance = inspector; inspector->selectedElement = -1; diff --git a/desktop/renderer.cpp b/desktop/renderer.cpp index fbbde89..47cf175 100644 --- a/desktop/renderer.cpp +++ b/desktop/renderer.cpp @@ -815,6 +815,19 @@ void RastPathAppendLinear(RastPath *path, RastVertex *vertices, size_t vertexCou } } +void RastPathAppendArc(RastPath *path, RastVertex center, float radius, float startAngle, float endAngle) { + float deltaAngle = EsCRTacosf(1 - 0.5f * RAST_FLATTEN_TOLERANCE * RAST_FLATTEN_TOLERANCE / radius / radius); // From cosine rule. + size_t steps = EsCRTfabsf(endAngle - startAngle) / deltaAngle; + + for (uintptr_t i = 0; i <= steps; i++) { + float angle = (endAngle - startAngle) / steps * i + startAngle; + RastVertex vertex; + vertex.x = center.x + radius * EsCRTcosf(angle); + vertex.y = center.y + radius * EsCRTsinf(angle); + _RastPathAddVertex(path, vertex); + } +} + void RastPathTranslate(RastPath *path, float x, float y) { if (!x && !y) return; diff --git a/desktop/theme.cpp b/desktop/theme.cpp index e16314f..56655b0 100644 --- a/desktop/theme.cpp +++ b/desktop/theme.cpp @@ -542,6 +542,15 @@ void ThemeFillCorner(EsPainter *painter, EsRectangle bounds, int cx, int cy, uint32_t borderAlpha = borderColor >> 24; if (outsideCount == (1 << (2 * STYLE_CORNER_OVERSAMPLING))) { + } else if (mainPaint.type == THEME_PAINT_OVERWRITE) { + // TODO Support borders when using an overwrite main paint. + uint32_t m1 = ((mainCount << 8) >> STYLE_CORNER_OVERSAMPLING * 2); + uint32_t m2 = 256 - m1; + uint32_t r2 = m2 * (*b & 0x00FF00FF); + uint32_t g2 = m2 * ((*b >> 8) & 0x00FF00FF); + uint32_t r1 = m1 * (mainColor & 0x00FF00FF); + uint32_t g1 = m1 * ((mainColor >> 8) & 0x00FF00FF); + *b = (0xFF00FF00 & (g1 + g2)) | (0x00FF00FF & ((r1 + r2) >> 8)); } else if (outsideCount || ((borderColor & 0xFF000000) != 0xFF000000) || (mainColor & 0xFF000000) != 0xFF000000) { BlendPixel(b, (mainColor & 0x00FFFFFF) | (((mainAlpha * mainCount) << (24 - STYLE_CORNER_OVERSAMPLING * 2)) & 0xFF000000), painter->target->fullAlpha); diff --git a/res/System Configuration Template.ini b/res/System Configuration Template.ini index 7a02d48..85f44aa 100644 --- a/res/System Configuration Template.ini +++ b/res/System Configuration Template.ini @@ -1,18 +1,13 @@ [general] -; General settings. -startup_sound=0:/Essence/Media/Startup Sound.wav fonts_path=0:/Essence/Fonts temporary_path=0:/Essence/Temporary default_settings_path=0:/Settings default_user_documents_path=0:/ -installation_state=0 click_chain_timeout_ms=500 show_cursor_shadow=1 -use_cursor_alt_slow=1 scroll_lines_per_notch=3 [ui] -; User interface settings that are accessible by all applications. font_fallback=Inter font_sans=Inter font_serif=Inter diff --git a/res/Theme Source.dat b/res/Theme Source.dat index 4ba3ad02dbac7a772aa097282a68ec458485c722..bec4f9066e4f1dccd85faba3c628798601021aee 100644 GIT binary patch delta 450 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 delta 4779 zcmZ9Q4N#QF8OL{*JLKcQL(n@AkS`S#5YAHwf}R!ROw?fI<52Jmh@gOonBWvWGGP)M zs3qNN$C;oZ6FOxkrakl8j>%xvskU^)hz*m{7F#mXNcBu48p-&x%MljDStD5$5DkgO&`DE`D{$0gbvuv#q>-5Hh#c0)7E zD6TDF_q7@^Y}x@jXA1=W}X2!t&CT(sU>~lM!R!?>T-qTE{&^vhw?EW-!M=c!cjuMjT2~dpl z#}xtgP|89y*dvK0f&J6N_!JGWrvPNAoQVa@VE>XL&H|g`?|Vc!U|(amI$cnx2t;Jc z3ie~IZw89M-jl%U5Sl=g-dfs!RBKPcmBO+HvwpnCQpJzO6)1vLdoG2Sd7F-Gu~a8t9}ay zfCbOi8@Fq;c0E|Uw1yEZQN_fG#DOhVF_Elfu%!}92U{k^Vg_3wu`IAutyF^+z?G6i zD_Dj!c?;Moi4}saMpo4y6Xjr;lD{gjJ1XWrg*w3JB!`V)YgGfqj$6QTeHbNeVCyAz z3hbsYqg`Mdq|)lP18$UHA6UM`E`k++iOX9uSHU(*Y!K`PiH(45mDo7g9}%EW4Y~kd zlm}!@9c-7xvcM`NW&ta} zQ$&62g)h?n2DZm1W=gBT_G$gxcF!j~A&r2Qo<-d0#!CxWwa;Wc`@rr=!E}Nh zn0^q?oKiQ~A*r-_z*1EoQSJzO0qdoKePBP7*mAE?z9?Eo$;IAwQKO z)bRMg@SV}HTvofltYolPwR406j|WQfz+RI)Si!cd=8BLu1is&E+!eC>aWFp}xFB*W z7>^;inSQ_!GFE)cq?y+oN%-YJLu7!C5cjtO_fjb9Pi)$2-Ip)w`6E~(VAXmoqRHMr zH?#j%e|$8L2{J?`dFFaOKQaaV%-)otP2pQ%O@~#z?w3K$Uv@74+HB@0V9k=&ZE@xN z{A$D9rxyM}kRih=Sxx-GyJtQO{iqNe+nKpGH2K%eyQZI4&U1qekyX-)pZcY(JO28u zFKT!_taTor-e})=^pDWBmHR(v=4WATg*9--FCpEZb-h{kX#SH^{8q3bs!N)C@AR6l ze(gB4`;3l%8@wQ@8)os{&g=UA=l)~+j@-P^qvL71I{vZlLz=?tLmpD2QWkoJvXQw; zl>TK#3;A2~els@^3#n%ENjY*MN%^hm zGfHjztoa@G)Xdkd{x_Rk&122+O6i(<%Gxub^swo{k;wT@Tk z*qJNGW2nv*2Js5RIy>uK$9IOta?SciYF3V|&($X2aI5e~lSv@1U|eBz`m~=td-exd zTY1l+Jbra+G#@L8=7ss~tSg^?Qku<%^7(@T6VKaJ&U!ZS2b=eEO+f@T^2mbQtgisJ zH8hULTW_;TD~~E@QmQs<7_}(1FW4C$+#924w<#Ld@?G8#a+)Ub%{zX~RTarA^FSin1u7sN~YMY^u~e>!ASj*2ZXJivhx%jfaDYjj&mr1uLMG6fci;m)1jZyREc!)+=ob@G z2RS{`Ex{s?6VfNc1|==S&XF0>4tVaHJ@>Yy_>UGEJpv^ntC*Js{|-A|&TOAu(2B(h zw;)|mUj-cRCS-g89&b=L)Q75TOTiBU&?uCZ3Z}ymtRciU4~szQ`>-LXMvp8)4s50^ z6q(6G_VVEq?EvIJHtbn=8O5YLfI$>d`4_Rnx!56Ofs@A7utS=1LiR!~Fe}FQ zLVa+q!8p;Tpl#oUT7kNvact{gi@}i@@#_Xeim`kA)ZyvdN!vmM08Qm0N>9HPN8#;H ztyT4NFcFLQ8xRyE+B)p$Ov!9t{Dk7=lZ#N8ki*k%i9?W(x9!v6{EaXcp=zCwv0=Ip zQw}4_Mnqqaf`o_(jvzAvvu0q|km%c1A>~ku8Fd8NkfC85nHl{NaM5ZuA|n;~tuTEYD+6h?HR-)B}kzeaKvV)+U@4I!?671vm;D&Kkz+k%YwIoQRV8 I%6p~%2R{bq=Kufz diff --git a/util/designer/designer.c b/util/designer/designer.c index 96eacae..bccf10b 100644 --- a/util/designer/designer.c +++ b/util/designer/designer.c @@ -769,6 +769,11 @@ void LayerBoxOp(RfState *state, RfItem *item, void *pointer) { ExportState *export = (ExportState *) state; LayerBox *box = (LayerBox *) pointer; +#if 0 +#define EsContainerOf(type, member, pointer) ((type *) ((uint8_t *) pointer - offsetof(type, member))) + uint64_t layerID = EsContainerOf(Layer, base.box, box)->id; +#endif + ThemeLayerBox themeBox = { 0 }; ExportAddPathToOffset2(export, LayerBox_borders, Rectangle8_l, offsetof(ThemeLayerBox, borders.l)); ExportAddPathToOffset2(export, LayerBox_borders, Rectangle8_r, offsetof(ThemeLayerBox, borders.r)); @@ -1943,8 +1948,8 @@ int CanvasMessage(UIElement *element, UIMessage message, int di, void *dp) { } if (previewShowGuides->e.flags & UI_BUTTON_CHECKED) { - UIDrawBlock(painter, UIRectangleAdd(generalBounds, UI_RECT_1I(-5)), 0xFFA2A0A4); - UIDrawBlock(painter, UIRectangleAdd(generalBounds, UI_RECT_1I(-3)), 0xFFC2C0C4); + UIDrawBlock(painter, UIRectangleAdd(generalBounds, UI_RECT_1I(-2)), 0xFFA2A0A4); + UIDrawBlock(painter, UIRectangleAdd(generalBounds, UI_RECT_1I(0)), 0xFFC2C0C4); } Rectangle8 opaqueInsets = StyleCalculateOpaqueInsets(selected.style->layers);