summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-12-20 06:35:23 +0200
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-12-20 06:35:23 +0200
commitc4df3339fb9d554075a044425b17fa34fe0c43c1 (patch)
tree5bc5261c92b5167fd54fa7928b91c3793b83b70a /src
parent1fc35259649d3f3206e0b28e51ca2e0ca7776d33 (diff)
LinkInfo: More concise presentation
Bold hostname, including scheme if not `gemini`. Info is now on a single wrapped line.
Diffstat (limited to 'src')
-rw-r--r--src/ui/linkinfo.c104
1 files changed, 51 insertions, 53 deletions
diff --git a/src/ui/linkinfo.c b/src/ui/linkinfo.c
index cb1404fc..fb608d41 100644
--- a/src/ui/linkinfo.c
+++ b/src/ui/linkinfo.c
@@ -51,10 +51,11 @@ iInt2 size_LinkInfo(const iLinkInfo *d) {
51 return add_I2(d->buf->size, init_I2(2 * hPad_LinkInfo_, 2 * vPad_LinkInfo_)); 51 return add_I2(d->buf->size, init_I2(2 * hPad_LinkInfo_, 2 * vPad_LinkInfo_));
52} 52}
53 53
54iBool update_LinkInfo(iLinkInfo *d, const iGmDocument *doc, iGmLinkId linkId, int maxWidth) { 54iBool update_LinkInfo(iLinkInfo *d, const iGmDocument *doc, iGmLinkId linkId, int maxWidth) {
55 if (!d) { 55 if (!d) {
56 return iFalse; 56 return iFalse;
57 } 57 }
58 const iBool isAnimated = prefs_App()->uiAnimations;
58 if (d->linkId != linkId || d->maxWidth != maxWidth) { 59 if (d->linkId != linkId || d->maxWidth != maxWidth) {
59 d->linkId = linkId; 60 d->linkId = linkId;
60 d->maxWidth = maxWidth; 61 d->maxWidth = maxWidth;
@@ -62,79 +63,81 @@ iBool update_LinkInfo(iLinkInfo *d, const iGmDocument *doc, iGmLinkId linkId, in
62 if (linkId) { 63 if (linkId) {
63 /* Measure and draw. */ 64 /* Measure and draw. */
64 if (targetValue_Anim(&d->opacity) < 1) { 65 if (targetValue_Anim(&d->opacity) < 1) {
65 setValue_Anim(&d->opacity, 1, 75); 66 setValue_Anim(&d->opacity, 1, isAnimated ? 75 : 0);
66 } 67 }
67 const int avail = iMax(minWidth_LinkInfo_, maxWidth) - 2 * hPad_LinkInfo_; 68 const int avail = iMax(minWidth_LinkInfo_, maxWidth) - 2 * hPad_LinkInfo_;
68 const iString *url = linkUrl_GmDocument(doc, linkId); 69 const iString *url = linkUrl_GmDocument(doc, linkId);
69 iUrl parts; 70 iUrl parts;
70 init_Url(&parts, url); 71 init_Url(&parts, url);
71 const int flags = linkFlags_GmDocument(doc, linkId); 72 const int flags = linkFlags_GmDocument(doc, linkId);
72 const enum iGmLinkScheme scheme = scheme_GmLinkFlag(flags); 73 const enum iGmLinkScheme scheme = scheme_GmLinkFlag(flags);
73 const iBool showHost = (flags & humanReadable_GmLinkFlag && 74 const iBool isImage = (flags & imageFileExtension_GmLinkFlag) != 0;
74 (!isEmpty_Range(&parts.host) || 75 const iBool isAudio = (flags & audioFileExtension_GmLinkFlag) != 0;
75 scheme == mailto_GmLinkScheme)); 76 // int fg = linkColor_GmDocument(doc, linkId,
76 const iBool showImage = (flags & imageFileExtension_GmLinkFlag) != 0; 77 // textHover_GmLinkPart);
77 const iBool showAudio = (flags & audioFileExtension_GmLinkFlag) != 0;
78// int fg = linkColor_GmDocument(doc, linkId, textHover_GmLinkPart);
79 iString str; 78 iString str;
80 init_String(&str); 79 init_String(&str);
81 if ((showHost || 80 /* Most important info first: the identity that will be used. */
82 (flags & (imageFileExtension_GmLinkFlag | audioFileExtension_GmLinkFlag))) && 81 const iGmIdentity *ident = identityForUrl_GmCerts(certs_App(), url);
83 scheme != mailto_GmLinkScheme) { 82 if (ident) {
83 appendFormat_String(&str, person_Icon " %s",
84 //escape_Color(tmBannerItemTitle_ColorId),
85 cstr_String(name_GmIdentity(ident)));
86 }
87 /* Possibly inlined content. */
88 if (isImage || isAudio) {
84 if (!isEmpty_String(&str)) { 89 if (!isEmpty_String(&str)) {
85 appendCStr_String(&str, "\n"); 90 appendCStr_String(&str, "\n");
86 } 91 }
87 if (showHost && scheme != gemini_GmLinkScheme) { 92 appendCStr_String(
88 append_String( 93 &str,
89 &str, collect_String(upper_String(collectNewRange_String(parts.scheme)))); 94 format_CStr(isImage ? photo_Icon " %s " : "\U0001f3b5 %s",
90 appendCStr_String(&str, " \u2014 "); 95 cstr_Lang(isImage ? "link.hint.image" : "link.hint.audio")));
91 } 96 }
92 if (showHost) { 97 if (!isEmpty_String(&str)) {
93 appendFormat_String(&str, "\x1b[1m%s\x1b[0m", cstr_Rangecc(parts.host)); 98 appendCStr_String(&str, " \u2014 ");
94 } 99 }
95 if (showImage || showAudio) { 100 /* Indicate non-Gemini schemes. */
96 appendFormat_String( 101 if (scheme == mailto_GmLinkScheme) {
97 &str, 102 appendCStr_String(&str, envelope_Icon " ");
98 "%s%s", 103 append_String(&str, url);
99 showHost ? " \u2014" : "", 104 }
100 format_CStr(showImage ? photo_Icon " %s " : "\U0001f3b5 %s", 105 else if (scheme != gemini_GmLinkScheme && !isEmpty_Range(&parts.host)) {
101 cstr_Lang(showImage ? "link.hint.image" : "link.hint.audio"))); 106 appendCStr_String(&str, globe_Icon " \x1b[1m");
102 } 107 appendRange_String(&str, (iRangecc){ constBegin_String(url),
108 parts.host.end });
109 appendCStr_String(&str, "\x1b[0m");
110 appendRange_String(&str, (iRangecc){ parts.path.start, constEnd_String(url) });
103 } 111 }
112 else if (scheme != gemini_GmLinkScheme) {
113 appendCStr_String(&str, globe_Icon " ");
114 append_String(&str, url);
115 }
116 else {
117 appendCStr_String(&str, "\x1b[1m");
118 appendRange_String(&str, parts.host);
119 appendCStr_String(&str, "\x1b[0m");
120 appendRange_String(&str, (iRangecc){ parts.path.start, constEnd_String(url) });
121 }
122 /* Date of last visit. */
104 if (flags & visited_GmLinkFlag) { 123 if (flags & visited_GmLinkFlag) {
105 iDate date; 124 iDate date;
106 init_Date(&date, linkTime_GmDocument(doc, linkId)); 125 init_Date(&date, linkTime_GmDocument(doc, linkId));
107 if (!isEmpty_String(&str)) { 126 if (!isEmpty_String(&str)) {
108 appendCStr_String(&str, " \u2014 "); 127 appendCStr_String(&str, " \u2014 ");
109 } 128 }
110// appendCStr_String(&str, escape_Color(tmQuoteIcon_ColorId));
111 iString *dateStr = format_Date(&date, "%b %d"); 129 iString *dateStr = format_Date(&date, "%b %d");
112 append_String(&str, dateStr); 130 append_String(&str, dateStr);
113 delete_String(dateStr); 131 delete_String(dateStr);
114 } 132 }
115 /* Identity that will be used. */ 133 /* Draw to a buffer, wrapped. */
116 const iGmIdentity *ident = identityForUrl_GmCerts(certs_App(), url);
117 if (ident) {
118 if (!isEmpty_String(&str)) {
119 appendCStr_String(&str, " \u2014 ");
120 }
121 appendFormat_String(&str, person_Icon " %s",
122 //escape_Color(tmBannerItemTitle_ColorId),
123 cstr_String(name_GmIdentity(ident)));
124 }
125 /* Show scheme and host. */
126 if (!isEmpty_String(&str)) {
127 appendCStr_String(&str, "\n");
128 }
129 appendRange_String(&str, range_String(url));
130 /* Draw the text. */
131 iWrapText wt = { .text = range_String(&str), .maxWidth = avail, .mode = word_WrapTextMode }; 134 iWrapText wt = { .text = range_String(&str), .maxWidth = avail, .mode = word_WrapTextMode };
132 d->buf = new_TextBuf(&wt, uiLabel_FontId, tmQuote_ColorId); 135 d->buf = new_TextBuf(&wt, uiLabel_FontId, tmQuote_ColorId);
133 deinit_String(&str); 136 deinit_String(&str);
134 } 137 }
135 else { 138 else {
136 if (targetValue_Anim(&d->opacity) > 0) { 139 if (targetValue_Anim(&d->opacity) > 0) {
137 setValue_Anim(&d->opacity, 0, 150); 140 setValue_Anim(&d->opacity, 0, isAnimated ? 150 : 0);
138 } 141 }
139 } 142 }
140 return iTrue; 143 return iTrue;
@@ -144,13 +147,8 @@ iBool update_LinkInfo(iLinkInfo *d, const iGmDocument *doc, iGmLinkId linkId, in
144 147
145void invalidate_LinkInfo(iLinkInfo *d) { 148void invalidate_LinkInfo(iLinkInfo *d) {
146 if (targetValue_Anim(&d->opacity) > 0) { 149 if (targetValue_Anim(&d->opacity) > 0) {
147 setValue_Anim(&d->opacity, 0, 150); 150 setValue_Anim(&d->opacity, 0, prefs_App()->uiAnimations ? 150 : 0);
148 } 151 }
149
150 // if (d->buf) {
151// delete_TextBuf(d->buf);
152// d->buf = NULL;
153// }
154} 152}
155 153
156void draw_LinkInfo(const iLinkInfo *d, iInt2 topLeft) { 154void draw_LinkInfo(const iLinkInfo *d, iInt2 topLeft) {