From df0ce23f3942892f8368d5f8a5aa2eac762c9b68 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Thu, 23 Jul 2020 16:03:08 +0300 Subject: Added a basic navigation bar with buttons and URL field Not wired into anything yet. --- src/ui/documentwidget.c | 17 +++++++++-------- src/ui/inputwidget.c | 6 ++++++ src/ui/inputwidget.h | 1 + src/ui/scrollwidget.c | 2 +- src/ui/window.c | 24 +++++++++++++++++++++++- 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 38c19fdd..9d95957a 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c @@ -353,12 +353,10 @@ static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e } else if (ev->type == SDL_MOUSEMOTION) { const iGmRun *oldHoverLink = d->hoverLink; - d->hoverLink = NULL; + d->hoverLink = NULL; const iRect docBounds = documentBounds_DocumentWidget_(d); - const iInt2 hoverPos = - addY_I2(sub_I2(localCoord_Widget(w, init_I2(ev->motion.x, ev->motion.y)), - topLeft_Rect(docBounds)), - d->scrollY); + const iInt2 hoverPos = addY_I2( + sub_I2(init_I2(ev->motion.x, ev->motion.y), topLeft_Rect(docBounds)), d->scrollY); iConstForEach(PtrArray, i, &d->visibleLinks) { const iGmRun *run = i.ptr; if (contains_Rect(run->bounds, hoverPos)) { @@ -425,15 +423,18 @@ static void draw_DocumentWidget_(const iDocumentWidget *d) { m->state = ready_DocumentState; updateVisible_DocumentWidget_(m); } - if (d->state != ready_DocumentState) return; + if (d->state != ready_DocumentState) return; iDrawContext ctx = { .widget = d, .bounds = documentBounds_DocumentWidget_(d) }; - init_Paint(&ctx.paint); - fillRect_Paint(&ctx.paint, bounds_Widget(w), gray25_ColorId); + const iRect bounds = bounds_Widget(w); + init_Paint(&ctx.paint); + fillRect_Paint(&ctx.paint, bounds, gray25_ColorId); + setClip_Paint(&ctx.paint, bounds); render_GmDocument( d->doc, visibleRange_DocumentWidget_(d), drawRun_DrawContext_, &ctx); + clearClip_Paint(&ctx.paint); draw_Widget(w); } diff --git a/src/ui/inputwidget.c b/src/ui/inputwidget.c index 7a2b7d1c..1a692907 100644 --- a/src/ui/inputwidget.c +++ b/src/ui/inputwidget.c @@ -70,6 +70,12 @@ void setText_InputWidget(iInputWidget *d, const iString *text) { } } +void setTextCStr_InputWidget(iInputWidget *d, const char *cstr) { + iString *str = newCStr_String(cstr); + setText_InputWidget(d, str); + delete_String(str); +} + void setCursor_InputWidget(iInputWidget *d, size_t pos) { d->cursor = iMin(pos, size_Array(&d->text)); } diff --git a/src/ui/inputwidget.h b/src/ui/inputwidget.h index b606f974..6ee2760d 100644 --- a/src/ui/inputwidget.h +++ b/src/ui/inputwidget.h @@ -13,6 +13,7 @@ enum iInputMode { void setMode_InputWidget (iInputWidget *, enum iInputMode mode); 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 begin_InputWidget (iInputWidget *); void end_InputWidget (iInputWidget *, iBool accept); diff --git a/src/ui/scrollwidget.c b/src/ui/scrollwidget.c index 1be62bb8..1961677b 100644 --- a/src/ui/scrollwidget.c +++ b/src/ui/scrollwidget.c @@ -41,7 +41,7 @@ static iRect thumbRect_ScrollWidget_(const iScrollWidget *d) { const int tsize = thumbSize_ScrollWidget_(d); const int tpos = iClamp((float) d->thumb / (float) total, 0, 1) * (height_Rect(bounds) - tsize); - rect.pos.y = tpos; + rect.pos.y = bounds.pos.y + tpos; rect.size.y = tsize; } return rect; diff --git a/src/ui/window.c b/src/ui/window.c index 2bfecd8c..dbbd04b7 100644 --- a/src/ui/window.c +++ b/src/ui/window.c @@ -75,7 +75,29 @@ static void setupUserInterface_Window(iWindow *d) { setFlags_Widget(d->root, resizeChildren_WidgetFlag, iTrue); setCommandHandler_Widget(d->root, handleRootCommands_); - addChild_Widget(d->root, iClob(new_DocumentWidget())); + iWidget *div = makeVDiv_Widget(); + setId_Widget(div, "navdiv"); + addChild_Widget(d->root, iClob(div)); + + /* Navigation bar. */ { + iWidget *navBar = new_Widget(); + setId_Widget(navBar, "navbar"); + setFlags_Widget(navBar, + arrangeHeight_WidgetFlag | resizeChildren_WidgetFlag | + arrangeHorizontal_WidgetFlag, + iTrue); + addChild_Widget(div, iClob(navBar)); + setBackgroundColor_Widget(div, gray25_ColorId); + + addChild_Widget(navBar, iClob(new_LabelWidget("Back", 0, 0, "navigate.back"))); + addChild_Widget(navBar, iClob(new_LabelWidget("Fwd", 0, 0, "navigate.forward"))); + addChild_Widget(navBar, iClob(new_LabelWidget("Home", 0, 0, "navigate.home"))); + iInputWidget *url = new_InputWidget(0); + setTextCStr_InputWidget(url, "gemini://"); + addChildFlags_Widget(navBar, iClob(url), expand_WidgetFlag); + } + + addChildFlags_Widget(div, iClob(new_DocumentWidget()), expand_WidgetFlag); #if 0 iWidget *mainDiv = makeHDiv_Widget(); -- cgit v1.2.3