diff options
Diffstat (limited to 'src/ui/documentwidget.c')
-rw-r--r-- | src/ui/documentwidget.c | 68 |
1 files changed, 53 insertions, 15 deletions
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 048f8ce4..d23e95a6 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c | |||
@@ -304,7 +304,7 @@ void init_DocumentWidget(iDocumentWidget *d) { | |||
304 | iWidget *w = as_Widget(d); | 304 | iWidget *w = as_Widget(d); |
305 | init_Widget(w); | 305 | init_Widget(w); |
306 | setId_Widget(w, format_CStr("document%03d", ++docEnum_)); | 306 | setId_Widget(w, format_CStr("document%03d", ++docEnum_)); |
307 | setFlags_Widget(w, hover_WidgetFlag, iTrue); | 307 | setFlags_Widget(w, hover_WidgetFlag | noBackground_WidgetFlag, iTrue); |
308 | init_PersistentDocumentState(&d->mod); | 308 | init_PersistentDocumentState(&d->mod); |
309 | d->flags = 0; | 309 | d->flags = 0; |
310 | d->phoneToolbar = NULL; | 310 | d->phoneToolbar = NULL; |
@@ -1571,6 +1571,43 @@ static void togglePreFold_DocumentWidget_(iDocumentWidget *d, uint16_t preId) { | |||
1571 | refresh_Widget(as_Widget(d)); | 1571 | refresh_Widget(as_Widget(d)); |
1572 | } | 1572 | } |
1573 | 1573 | ||
1574 | static iString *makeQueryUrl_DocumentWidget_(const iDocumentWidget *d, | ||
1575 | const iString *userEnteredText) { | ||
1576 | iString *url = copy_String(d->mod.url); | ||
1577 | /* Remove the existing query string. */ | ||
1578 | const size_t qPos = indexOfCStr_String(url, "?"); | ||
1579 | if (qPos != iInvalidPos) { | ||
1580 | remove_Block(&url->chars, qPos, iInvalidSize); | ||
1581 | } | ||
1582 | appendCStr_String(url, "?"); | ||
1583 | append_String(url, collect_String(urlEncode_String(userEnteredText))); | ||
1584 | return url; | ||
1585 | } | ||
1586 | |||
1587 | static void inputQueryValidator_(iInputWidget *input, void *context) { | ||
1588 | iDocumentWidget *d = context; | ||
1589 | iString *url = makeQueryUrl_DocumentWidget_(d, text_InputWidget(input)); | ||
1590 | iWidget *dlg = parent_Widget(input); | ||
1591 | iLabelWidget *counter = findChild_Widget(dlg, "valueinput.counter"); | ||
1592 | iAssert(counter); | ||
1593 | int avail = 1024 - (int) size_String(url); | ||
1594 | setFlags_Widget(findChild_Widget(dlg, "default"), disabled_WidgetFlag, avail < 0); | ||
1595 | setEnterKeyEnabled_InputWidget(input, avail >= 0); | ||
1596 | int len = length_String(text_InputWidget(input)); | ||
1597 | if (len > 1024) { | ||
1598 | iString *trunc = copy_String(text_InputWidget(input)); | ||
1599 | truncate_String(trunc, 1024); | ||
1600 | setText_InputWidget(input, trunc); | ||
1601 | delete_String(trunc); | ||
1602 | } | ||
1603 | setTextCStr_LabelWidget(counter, format_CStr("%d", avail)); /* Gemini URL maxlen */ | ||
1604 | setTextColor_LabelWidget(counter, | ||
1605 | avail < 0 ? uiTextCaution_ColorId : | ||
1606 | avail < 128 ? uiTextStrong_ColorId | ||
1607 | : uiTextDim_ColorId); | ||
1608 | delete_String(url); | ||
1609 | } | ||
1610 | |||
1574 | static void checkResponse_DocumentWidget_(iDocumentWidget *d) { | 1611 | static void checkResponse_DocumentWidget_(iDocumentWidget *d) { |
1575 | if (!d->request) { | 1612 | if (!d->request) { |
1576 | return; | 1613 | return; |
@@ -1598,13 +1635,21 @@ static void checkResponse_DocumentWidget_(iDocumentWidget *d) { | |||
1598 | isEmpty_String(&resp->meta) | 1635 | isEmpty_String(&resp->meta) |
1599 | ? format_CStr(cstr_Lang("dlg.input.prompt"), cstr_Rangecc(parts.path)) | 1636 | ? format_CStr(cstr_Lang("dlg.input.prompt"), cstr_Rangecc(parts.path)) |
1600 | : cstr_String(&resp->meta), | 1637 | : cstr_String(&resp->meta), |
1601 | uiTextCaution_ColorEscape "${dlg.input.send} \u21d2", | 1638 | uiTextCaution_ColorEscape "${dlg.input.send}", |
1602 | format_CStr("!document.input.submit doc:%p", d)); | 1639 | format_CStr("!document.input.submit doc:%p", d)); |
1640 | setId_Widget(addChildPosFlags_Widget(findChild_Widget(dlg, "dialogbuttons"), | ||
1641 | iClob(new_LabelWidget("", NULL)), | ||
1642 | front_WidgetAddPos, frameless_WidgetFlag), | ||
1643 | "valueinput.counter"); | ||
1644 | setValidator_InputWidget(findChild_Widget(dlg, "input"), inputQueryValidator_, d); | ||
1603 | setSensitiveContent_InputWidget(findChild_Widget(dlg, "input"), | 1645 | setSensitiveContent_InputWidget(findChild_Widget(dlg, "input"), |
1604 | statusCode == sensitiveInput_GmStatusCode); | 1646 | statusCode == sensitiveInput_GmStatusCode); |
1605 | if (document_App() != d) { | 1647 | if (document_App() != d) { |
1606 | postCommandf_App("tabs.switch page:%p", d); | 1648 | postCommandf_App("tabs.switch page:%p", d); |
1607 | } | 1649 | } |
1650 | else { | ||
1651 | updateTheme_DocumentWidget_(d); | ||
1652 | } | ||
1608 | break; | 1653 | break; |
1609 | } | 1654 | } |
1610 | case categorySuccess_GmStatusCode: | 1655 | case categorySuccess_GmStatusCode: |
@@ -2229,17 +2274,10 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
2229 | return iTrue; | 2274 | return iTrue; |
2230 | } | 2275 | } |
2231 | else if (equal_Command(cmd, "document.input.submit") && document_Command(cmd) == d) { | 2276 | else if (equal_Command(cmd, "document.input.submit") && document_Command(cmd) == d) { |
2232 | iString *value = suffix_Command(cmd, "value"); | 2277 | postCommandf_Root(w->root, |
2233 | set_String(value, collect_String(urlEncode_String(value))); | 2278 | "open url:%s", |
2234 | iString *url = collect_String(copy_String(d->mod.url)); | 2279 | cstrCollect_String(makeQueryUrl_DocumentWidget_ |
2235 | const size_t qPos = indexOfCStr_String(url, "?"); | 2280 | (d, collect_String(suffix_Command(cmd, "value"))))); |
2236 | if (qPos != iInvalidPos) { | ||
2237 | remove_Block(&url->chars, qPos, iInvalidSize); | ||
2238 | } | ||
2239 | appendCStr_String(url, "?"); | ||
2240 | append_String(url, value); | ||
2241 | postCommandf_Root(w->root, "open url:%s", cstr_String(url)); | ||
2242 | delete_String(value); | ||
2243 | return iTrue; | 2281 | return iTrue; |
2244 | } | 2282 | } |
2245 | else if (equal_Command(cmd, "valueinput.cancelled") && | 2283 | else if (equal_Command(cmd, "valueinput.cancelled") && |
@@ -4172,7 +4210,7 @@ static void draw_DocumentWidget_(const iDocumentWidget *d) { | |||
4172 | if (width_Rect(bounds) <= 0) { | 4210 | if (width_Rect(bounds) <= 0) { |
4173 | return; | 4211 | return; |
4174 | } | 4212 | } |
4175 | draw_Widget(w); | 4213 | // draw_Widget(w); |
4176 | if (d->drawBufs->flags & updateTimestampBuf_DrawBufsFlag) { | 4214 | if (d->drawBufs->flags & updateTimestampBuf_DrawBufsFlag) { |
4177 | updateTimestampBuf_DocumentWidget_(d); | 4215 | updateTimestampBuf_DocumentWidget_(d); |
4178 | } | 4216 | } |
@@ -4250,7 +4288,7 @@ static void draw_DocumentWidget_(const iDocumentWidget *d) { | |||
4250 | if (colorTheme_App() == pureWhite_ColorTheme) { | 4288 | if (colorTheme_App() == pureWhite_ColorTheme) { |
4251 | drawHLine_Paint(&ctx.paint, topLeft_Rect(bounds), width_Rect(bounds), uiSeparator_ColorId); | 4289 | drawHLine_Paint(&ctx.paint, topLeft_Rect(bounds), width_Rect(bounds), uiSeparator_ColorId); |
4252 | } | 4290 | } |
4253 | draw_Widget(w); | 4291 | drawChildren_Widget(w); |
4254 | /* Alt text. */ | 4292 | /* Alt text. */ |
4255 | const float altTextOpacity = value_Anim(&d->altTextOpacity) * 6 - 5; | 4293 | const float altTextOpacity = value_Anim(&d->altTextOpacity) * 6 - 5; |
4256 | if (d->hoverAltPre && altTextOpacity > 0) { | 4294 | if (d->hoverAltPre && altTextOpacity > 0) { |