From 78092e44e6ba554c6ed31df5bfa3d7c38d2341d2 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Tue, 23 Feb 2021 11:48:06 +0200 Subject: Show a search indicator in the URL bar Indicate to user when entered text will be user for a search engine query. IssueID #157 --- src/app.c | 9 ++++++++- src/ui/inputwidget.c | 14 +++++++++++++- src/ui/inputwidget.h | 1 + src/ui/window.c | 37 ++++++++++++++++++++++++++++++++++--- 4 files changed, 56 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/app.c b/src/app.c index 0f642314..f7819c03 100644 --- a/src/app.c +++ b/src/app.c @@ -1355,7 +1355,14 @@ iBool handleCommand_App(const char *cmd) { return iTrue; } else if (equal_Command(cmd, "searchurl")) { - setCStr_String(&d->prefs.searchUrl, suffixPtr_Command(cmd, "address")); + iString *url = &d->prefs.searchUrl; + setCStr_String(url, suffixPtr_Command(cmd, "address")); + if (startsWith_String(url, "//")) { + prependCStr_String(url, "gemini:"); + } + if (!startsWithCase_String(url, "gemini://")) { + prependCStr_String(url, "gemini://"); + } return iTrue; } else if (equal_Command(cmd, "proxy.gemini")) { diff --git a/src/ui/inputwidget.c b/src/ui/inputwidget.c index 25c3e145..58a47610 100644 --- a/src/ui/inputwidget.c +++ b/src/ui/inputwidget.c @@ -81,6 +81,8 @@ struct Impl_InputWidget { iArray text; /* iChar[] */ iArray oldText; /* iChar[] */ iString hint; + int leftPadding; + int rightPadding; size_t cursor; size_t lastCursor; iRanges mark; @@ -114,6 +116,8 @@ void init_InputWidget(iInputWidget *d, size_t maxLen) { init_String(&d->hint); init_Array(&d->undoStack, sizeof(iInputUndo)); d->font = uiInput_FontId | alwaysVariableFlag_FontId; + d->leftPadding = 0; + d->rightPadding = 0; d->cursor = 0; d->lastCursor = 0; d->inFlags = eatEscape_InputWidgetFlag; @@ -196,6 +200,12 @@ void setHint_InputWidget(iInputWidget *d, const char *hintText) { setCStr_String(&d->hint, hintText); } +void setContentPadding_InputWidget(iInputWidget *d, int left, int right) { + d->leftPadding = left; + d->rightPadding = right; + refresh_Widget(d); +} + static const iChar sensitiveChar_ = 0x25cf; /* black circle */ static iString *visText_InputWidget_(const iInputWidget *d) { @@ -488,7 +498,9 @@ iLocalDef iInt2 padding_(void) { static iInt2 textOrigin_InputWidget_(const iInputWidget *d, const char *visText) { const iWidget *w = constAs_Widget(d); - iRect bounds = adjusted_Rect(bounds_Widget(w), padding_(), neg_I2(padding_())); + iRect bounds = adjusted_Rect(bounds_Widget(w), + addX_I2(padding_(), d->leftPadding), + neg_I2(addX_I2(padding_(), d->rightPadding))); const iInt2 emSize = advance_Text(d->font, "M"); const int textWidth = advance_Text(d->font, visText).x; const int cursorX = advanceN_Text(d->font, visText, d->cursor).x; diff --git a/src/ui/inputwidget.h b/src/ui/inputwidget.h index 654433ea..3c7b2ffb 100644 --- a/src/ui/inputwidget.h +++ b/src/ui/inputwidget.h @@ -38,6 +38,7 @@ void setMaxLen_InputWidget (iInputWidget *, size_t maxLen); void setText_InputWidget (iInputWidget *, const iString *text); void setTextCStr_InputWidget (iInputWidget *, const char *cstr); void setCursor_InputWidget (iInputWidget *, size_t pos); +void setContentPadding_InputWidget (iInputWidget *, int left, int right); /* only affects the text entry */ void begin_InputWidget (iInputWidget *); void end_InputWidget (iInputWidget *, iBool accept); void selectAll_InputWidget (iInputWidget *); diff --git a/src/ui/window.c b/src/ui/window.c index 510fe2fe..b545cc10 100644 --- a/src/ui/window.c +++ b/src/ui/window.c @@ -480,6 +480,21 @@ static void dismissPortraitPhoneSidebars_(void) { } } +static iBool willPerformSearchQuery_(const iString *userInput) { + const iString *clean = collect_String(trimmed_String(userInput)); + if (isEmpty_String(clean)) { + return iFalse; + } + return !isEmpty_String(&prefs_App()->searchUrl) && !isLikelyUrl_String(userInput); +} + +static void showSearchQueryIndicator_(iBool show) { + iWidget *indicator = findWidget_App("input.indicator.search"); + setFlags_Widget(indicator, hidden_WidgetFlag, !show); + setContentPadding_InputWidget( + (iInputWidget *) parent_Widget(indicator), 0, show ? width_Widget(indicator) : 0); +} + static iBool handleNavBarCommands_(iWidget *navBar, const char *cmd) { if (equal_Command(cmd, "window.resized")) { const iBool isPhone = deviceType_App() == phone_AppDeviceType; @@ -534,14 +549,18 @@ static iBool handleNavBarCommands_(iWidget *navBar, const char *cmd) { return iTrue; } else if (equal_Command(cmd, "input.edited")) { - iAnyObject *url = findChild_Widget(navBar, "url"); + iAnyObject * url = findChild_Widget(navBar, "url"); + const iString *text = text_InputWidget(url); + const iBool show = willPerformSearchQuery_(text); + showSearchQueryIndicator_(show); if (pointer_Command(cmd) == url) { - submit_LookupWidget(findWidget_App("lookup"), text_InputWidget(url)); + submit_LookupWidget(findWidget_App("lookup"), text); return iTrue; } } else if (startsWith_CStr(cmd, "input.ended id:url ")) { iInputWidget *url = findChild_Widget(navBar, "url"); + showSearchQueryIndicator_(iFalse); if (isEmpty_String(text_InputWidget(url))) { /* User entered nothing; restore the current URL. */ setText_InputWidget(url, url_DocumentWidget(document_App())); @@ -551,7 +570,7 @@ static iBool handleNavBarCommands_(iWidget *navBar, const char *cmd) { !isFocused_Widget(findWidget_App("lookup"))) { iString *newUrl = copy_String(text_InputWidget(url)); trim_String(newUrl); - if (!isEmpty_String(&prefs_App()->searchUrl) && !isLikelyUrl_String(newUrl)) { + if (willPerformSearchQuery_(newUrl)) { postCommandf_App("open url:%s", cstr_String(searchQueryUrl_App(newUrl))); } else { @@ -886,6 +905,18 @@ static void setupUserInterface_Window(iWindow *d) { iClob(progress), moveToParentRightEdge_WidgetFlag); } + /* Feeds refresh indicator is inside the input field. */ { + iLabelWidget *queryInd = + new_LabelWidget(uiTextAction_ColorEscape "\u21d2 Search Query", NULL); + setId_Widget(as_Widget(queryInd), "input.indicator.search"); + setBackgroundColor_Widget(as_Widget(queryInd), uiBackground_ColorId); + setFrameColor_Widget(as_Widget(queryInd), uiTextAction_ColorId); + setAlignVisually_LabelWidget(queryInd, iTrue); + shrink_Rect(&as_Widget(queryInd)->rect, init_I2(0, gap_UI)); + addChildFlags_Widget(as_Widget(url), + iClob(queryInd), + moveToParentRightEdge_WidgetFlag | hidden_WidgetFlag); + } } setId_Widget(addChild_Widget( navBar, iClob(newIcon_LabelWidget(reloadCStr_, 0, 0, "navigate.reload"))), -- cgit v1.2.3