diff options
-rw-r--r-- | src/ui/labelwidget.c | 22 | ||||
-rw-r--r-- | src/ui/labelwidget.h | 1 | ||||
-rw-r--r-- | src/ui/root.c | 10 | ||||
-rw-r--r-- | src/ui/sidebarwidget.c | 8 | ||||
-rw-r--r-- | src/ui/text.c | 37 | ||||
-rw-r--r-- | src/ui/text.h | 2 |
6 files changed, 61 insertions, 19 deletions
diff --git a/src/ui/labelwidget.c b/src/ui/labelwidget.c index febaa15b..09c5812b 100644 --- a/src/ui/labelwidget.c +++ b/src/ui/labelwidget.c | |||
@@ -44,6 +44,7 @@ struct Impl_LabelWidget { | |||
44 | struct { | 44 | struct { |
45 | uint8_t alignVisual : 1; /* align according to visible bounds, not font metrics */ | 45 | uint8_t alignVisual : 1; /* align according to visible bounds, not font metrics */ |
46 | uint8_t noAutoMinHeight : 1; /* minimum height is not set automatically */ | 46 | uint8_t noAutoMinHeight : 1; /* minimum height is not set automatically */ |
47 | uint8_t drawAsOutline : 1; /* draw as outline, filled with background color */ | ||
47 | } flags; | 48 | } flags; |
48 | }; | 49 | }; |
49 | 50 | ||
@@ -348,14 +349,14 @@ static void draw_LabelWidget_(const iLabelWidget *d) { | |||
348 | cstr_String(&d->label)); | 349 | cstr_String(&d->label)); |
349 | } | 350 | } |
350 | else { | 351 | else { |
351 | drawCentered_Text(d->font, | 352 | drawCenteredOutline_Text( |
352 | adjusted_Rect(bounds, | 353 | d->font, |
353 | add_I2(zero_I2(), init_I2(iconPad, 0)), | 354 | adjusted_Rect(bounds, add_I2(zero_I2(), init_I2(iconPad, 0)), neg_I2(zero_I2())), |
354 | neg_I2(zero_I2())), | 355 | d->flags.alignVisual, |
355 | d->flags.alignVisual, | 356 | d->flags.drawAsOutline ? fg : none_ColorId, |
356 | fg, | 357 | d->flags.drawAsOutline ? d->widget.bgColor : fg, |
357 | "%s", | 358 | "%s", |
358 | cstr_String(&d->label)); | 359 | cstr_String(&d->label)); |
359 | } | 360 | } |
360 | if (flags & chevron_WidgetFlag) { | 361 | if (flags & chevron_WidgetFlag) { |
361 | const iRect chRect = rect; | 362 | const iRect chRect = rect; |
@@ -442,6 +443,7 @@ void init_LabelWidget(iLabelWidget *d, const char *label, const char *cmd) { | |||
442 | setFlags_Widget(w, hover_WidgetFlag, d->click.button != 0); | 443 | setFlags_Widget(w, hover_WidgetFlag, d->click.button != 0); |
443 | d->flags.alignVisual = iFalse; | 444 | d->flags.alignVisual = iFalse; |
444 | d->flags.noAutoMinHeight = iFalse; | 445 | d->flags.noAutoMinHeight = iFalse; |
446 | d->flags.drawAsOutline = iFalse; | ||
445 | updateSize_LabelWidget(d); | 447 | updateSize_LabelWidget(d); |
446 | updateKey_LabelWidget_(d); /* could be bound to another key */ | 448 | updateKey_LabelWidget_(d); /* could be bound to another key */ |
447 | } | 449 | } |
@@ -481,6 +483,10 @@ void setNoAutoMinHeight_LabelWidget(iLabelWidget *d, iBool noAutoMinHeight) { | |||
481 | } | 483 | } |
482 | } | 484 | } |
483 | 485 | ||
486 | void setOutline_LabelWidget(iLabelWidget *d, iBool drawAsOutline) { | ||
487 | d->flags.drawAsOutline = drawAsOutline; | ||
488 | } | ||
489 | |||
484 | void updateText_LabelWidget(iLabelWidget *d, const iString *text) { | 490 | void updateText_LabelWidget(iLabelWidget *d, const iString *text) { |
485 | set_String(&d->label, text); | 491 | set_String(&d->label, text); |
486 | set_String(&d->srcLabel, text); | 492 | set_String(&d->srcLabel, text); |
diff --git a/src/ui/labelwidget.h b/src/ui/labelwidget.h index 25cde95c..25c873fc 100644 --- a/src/ui/labelwidget.h +++ b/src/ui/labelwidget.h | |||
@@ -31,6 +31,7 @@ iDeclareObjectConstructionArgs(LabelWidget, const char *label, const char *comma | |||
31 | 31 | ||
32 | void setAlignVisually_LabelWidget(iLabelWidget *, iBool alignVisual); | 32 | void setAlignVisually_LabelWidget(iLabelWidget *, iBool alignVisual); |
33 | void setNoAutoMinHeight_LabelWidget(iLabelWidget *, iBool noAutoMinHeight); | 33 | void setNoAutoMinHeight_LabelWidget(iLabelWidget *, iBool noAutoMinHeight); |
34 | void setOutline_LabelWidget (iLabelWidget *, iBool drawAsOutline); | ||
34 | void setFont_LabelWidget (iLabelWidget *, int fontId); | 35 | void setFont_LabelWidget (iLabelWidget *, int fontId); |
35 | void setTextColor_LabelWidget (iLabelWidget *, int color); | 36 | void setTextColor_LabelWidget (iLabelWidget *, int color); |
36 | void setText_LabelWidget (iLabelWidget *, const iString *text); /* resizes widget */ | 37 | void setText_LabelWidget (iLabelWidget *, const iString *text); /* resizes widget */ |
diff --git a/src/ui/root.c b/src/ui/root.c index c3a9596f..71f51ef0 100644 --- a/src/ui/root.c +++ b/src/ui/root.c | |||
@@ -432,9 +432,9 @@ static void updateNavBarIdentity_(iWidget *navBar) { | |||
432 | const iGmIdentity *ident = | 432 | const iGmIdentity *ident = |
433 | identityForUrl_GmCerts(certs_App(), url_DocumentWidget(document_App())); | 433 | identityForUrl_GmCerts(certs_App(), url_DocumentWidget(document_App())); |
434 | iWidget *button = findChild_Widget(navBar, "navbar.ident"); | 434 | iWidget *button = findChild_Widget(navBar, "navbar.ident"); |
435 | iWidget *tool = findWidget_App("toolbar.ident"); | 435 | iLabelWidget *toolButton = findWidget_App("toolbar.ident"); |
436 | setFlags_Widget(button, selected_WidgetFlag, ident != NULL); | 436 | setFlags_Widget(button, selected_WidgetFlag, ident != NULL); |
437 | setFlags_Widget(tool, selected_WidgetFlag, ident != NULL); | 437 | setOutline_LabelWidget(toolButton, ident == NULL); |
438 | /* Update menu. */ | 438 | /* Update menu. */ |
439 | iLabelWidget *idItem = child_Widget(findChild_Widget(button, "menu"), 0); | 439 | iLabelWidget *idItem = child_Widget(findChild_Widget(button, "menu"), 0); |
440 | const iString *subjectName = ident ? name_GmIdentity(ident) : NULL; | 440 | const iString *subjectName = ident ? name_GmIdentity(ident) : NULL; |
@@ -519,12 +519,14 @@ void updateToolbarColors_Root(iRoot *d) { | |||
519 | iWidget *toolBar = findChild_Widget(d->widget, "toolbar"); | 519 | iWidget *toolBar = findChild_Widget(d->widget, "toolbar"); |
520 | if (toolBar) { | 520 | if (toolBar) { |
521 | const iBool isSidebarVisible = isVisible_Widget(findChild_Widget(d->widget, "sidebar")); | 521 | const iBool isSidebarVisible = isVisible_Widget(findChild_Widget(d->widget, "sidebar")); |
522 | setBackgroundColor_Widget(toolBar, isSidebarVisible ? uiBackgroundSidebar_ColorId : | 522 | const int bg = isSidebarVisible ? uiBackgroundSidebar_ColorId : |
523 | tmBannerBackground_ColorId); | 523 | tmBannerBackground_ColorId; |
524 | setBackgroundColor_Widget(toolBar, bg); | ||
524 | iForEach(ObjectList, i, children_Widget(toolBar)) { | 525 | iForEach(ObjectList, i, children_Widget(toolBar)) { |
525 | iLabelWidget *btn = i.object; | 526 | iLabelWidget *btn = i.object; |
526 | setTextColor_LabelWidget(i.object, isSidebarVisible ? uiTextDim_ColorId : | 527 | setTextColor_LabelWidget(i.object, isSidebarVisible ? uiTextDim_ColorId : |
527 | tmBannerIcon_ColorId); | 528 | tmBannerIcon_ColorId); |
529 | setBackgroundColor_Widget(i.object, bg); /* using noBackground, but ident has outline */ | ||
528 | } | 530 | } |
529 | } | 531 | } |
530 | #else | 532 | #else |
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c index 5b836670..b4948821 100644 --- a/src/ui/sidebarwidget.c +++ b/src/ui/sidebarwidget.c | |||
@@ -1806,13 +1806,7 @@ static void draw_SidebarItem_(const iSidebarItem *d, iPaint *p, iRect itemRect, | |||
1806 | : uiTextFramelessHover_ColorId) | 1806 | : uiTextFramelessHover_ColorId) |
1807 | : uiTextDim_ColorId; | 1807 | : uiTextDim_ColorId; |
1808 | if (!d->listItem.isSelected && !isUsedOnDomain) { | 1808 | if (!d->listItem.isSelected && !isUsedOnDomain) { |
1809 | /* Draw an outline of the icon. */ | 1809 | drawOutline_Text(font, cPos, metaFg, none_ColorId, range_String(&icon)); |
1810 | for (int off = 0; off < 4; ++off) { | ||
1811 | drawRange_Text(font, | ||
1812 | add_I2(cPos, init_I2(off % 2 == 0 ? -1 : 1, off / 2 == 0 ? -1 : 1)), | ||
1813 | metaFg, | ||
1814 | range_String(&icon)); | ||
1815 | } | ||
1816 | } | 1810 | } |
1817 | drawRange_Text(font, | 1811 | drawRange_Text(font, |
1818 | cPos, | 1812 | cPos, |
diff --git a/src/ui/text.c b/src/ui/text.c index 27be1bec..8a70e4db 100644 --- a/src/ui/text.c +++ b/src/ui/text.c | |||
@@ -1315,6 +1315,18 @@ void drawRangeN_Text(int fontId, iInt2 pos, int color, iRangecc text, size_t max | |||
1315 | drawBoundedN_Text_(fontId, pos, 0, color, text, maxChars); | 1315 | drawBoundedN_Text_(fontId, pos, 0, color, text, maxChars); |
1316 | } | 1316 | } |
1317 | 1317 | ||
1318 | void drawOutline_Text(int fontId, iInt2 pos, int outlineColor, int fillColor, iRangecc text) { | ||
1319 | for (int off = 0; off < 4; ++off) { | ||
1320 | drawRange_Text(fontId, | ||
1321 | add_I2(pos, init_I2(off % 2 == 0 ? -1 : 1, off / 2 == 0 ? -1 : 1)), | ||
1322 | outlineColor, | ||
1323 | text); | ||
1324 | } | ||
1325 | if (fillColor != none_ColorId) { | ||
1326 | drawRange_Text(fontId, pos, fillColor, text); | ||
1327 | } | ||
1328 | } | ||
1329 | |||
1318 | iInt2 advanceWrapRange_Text(int fontId, int maxWidth, iRangecc text) { | 1330 | iInt2 advanceWrapRange_Text(int fontId, int maxWidth, iRangecc text) { |
1319 | iInt2 size = zero_I2(); | 1331 | iInt2 size = zero_I2(); |
1320 | const char *endp; | 1332 | const char *endp; |
@@ -1356,6 +1368,31 @@ void drawCentered_Text(int fontId, iRect rect, iBool alignVisual, int color, con | |||
1356 | deinit_Block(&chars); | 1368 | deinit_Block(&chars); |
1357 | } | 1369 | } |
1358 | 1370 | ||
1371 | void drawCenteredOutline_Text(int fontId, iRect rect, iBool alignVisual, int outlineColor, | ||
1372 | int fillColor, const char *format, ...) { | ||
1373 | iBlock chars; | ||
1374 | init_Block(&chars, 0); { | ||
1375 | va_list args; | ||
1376 | va_start(args, format); | ||
1377 | vprintf_Block(&chars, format, args); | ||
1378 | va_end(args); | ||
1379 | } | ||
1380 | if (outlineColor != none_ColorId) { | ||
1381 | for (int off = 0; off < 4; ++off) { | ||
1382 | drawCenteredRange_Text( | ||
1383 | fontId, | ||
1384 | moved_Rect(rect, init_I2(off % 2 == 0 ? -1 : 1, off / 2 == 0 ? -1 : 1)), | ||
1385 | alignVisual, | ||
1386 | outlineColor, | ||
1387 | range_Block(&chars)); | ||
1388 | } | ||
1389 | } | ||
1390 | if (fillColor != none_ColorId) { | ||
1391 | drawCenteredRange_Text(fontId, rect, alignVisual, fillColor, range_Block(&chars)); | ||
1392 | } | ||
1393 | deinit_Block(&chars); | ||
1394 | } | ||
1395 | |||
1359 | void drawCenteredRange_Text(int fontId, iRect rect, iBool alignVisual, int color, iRangecc text) { | 1396 | void drawCenteredRange_Text(int fontId, iRect rect, iBool alignVisual, int color, iRangecc text) { |
1360 | iRect textBounds = alignVisual ? visualBounds_Text(fontId, text) | 1397 | iRect textBounds = alignVisual ? visualBounds_Text(fontId, text) |
1361 | : (iRect){ zero_I2(), advanceRange_Text(fontId, text) }; | 1398 | : (iRect){ zero_I2(), advanceRange_Text(fontId, text) }; |
diff --git a/src/ui/text.h b/src/ui/text.h index 2f2bcf3a..64a8352f 100644 --- a/src/ui/text.h +++ b/src/ui/text.h | |||
@@ -162,9 +162,11 @@ void draw_Text (int fontId, iInt2 pos, int color, const char *t | |||
162 | void drawAlign_Text (int fontId, iInt2 pos, int color, enum iAlignment align, const char *text, ...); | 162 | void drawAlign_Text (int fontId, iInt2 pos, int color, enum iAlignment align, const char *text, ...); |
163 | void drawCentered_Text (int fontId, iRect rect, iBool alignVisual, int color, const char *text, ...); | 163 | void drawCentered_Text (int fontId, iRect rect, iBool alignVisual, int color, const char *text, ...); |
164 | void drawCenteredRange_Text (int fontId, iRect rect, iBool alignVisual, int color, iRangecc text); | 164 | void drawCenteredRange_Text (int fontId, iRect rect, iBool alignVisual, int color, iRangecc text); |
165 | void drawCenteredOutline_Text(int fontId, iRect rect, iBool alignVisual, int outlineColor, int fillColor, const char *text, ...); | ||
165 | void drawString_Text (int fontId, iInt2 pos, int color, const iString *text); | 166 | void drawString_Text (int fontId, iInt2 pos, int color, const iString *text); |
166 | void drawRange_Text (int fontId, iInt2 pos, int color, iRangecc text); | 167 | void drawRange_Text (int fontId, iInt2 pos, int color, iRangecc text); |
167 | void drawRangeN_Text (int fontId, iInt2 pos, int color, iRangecc text, size_t maxLen); | 168 | void drawRangeN_Text (int fontId, iInt2 pos, int color, iRangecc text, size_t maxLen); |
169 | void drawOutline_Text (int fontId, iInt2 pos, int outlineColor, int fillColor, iRangecc text); | ||
168 | void drawBoundRange_Text (int fontId, iInt2 pos, int boundWidth, int color, iRangecc text); /* bound does not wrap */ | 170 | void drawBoundRange_Text (int fontId, iInt2 pos, int boundWidth, int color, iRangecc text); /* bound does not wrap */ |
169 | int drawWrapRange_Text (int fontId, iInt2 pos, int maxWidth, int color, iRangecc text); /* returns new Y */ | 171 | int drawWrapRange_Text (int fontId, iInt2 pos, int maxWidth, int color, iRangecc text); /* returns new Y */ |
170 | 172 | ||