From cb059fc081b617be17ba6a9edad020848ecd9a03 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 17 Oct 2022 19:24:47 +0100 Subject: [PATCH] Change: Use Rect for QueryString editor. --- src/misc_gui.cpp | 62 +++++++++++++++++++----------------------------- 1 file changed, 24 insertions(+), 38 deletions(-) diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index a46a9304fb..3c59414ae9 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -798,24 +798,21 @@ void QueryString::DrawEditBox(const Window *w, int wid) const Dimension sprite_size = GetSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT); int clearbtn_width = sprite_size.width + WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT; - int clearbtn_left = wi->pos_x + (rtl ? 0 : wi->current_x - clearbtn_width); - int clearbtn_right = wi->pos_x + (rtl ? clearbtn_width : wi->current_x) - 1; - int left = wi->pos_x + (rtl ? clearbtn_width : 0); - int right = wi->pos_x + (rtl ? wi->current_x : wi->current_x - clearbtn_width) - 1; + Rect r = wi->GetCurrentRect(); + Rect cr = r.WithWidth(clearbtn_width, !rtl); + Rect fr = r.Indent(clearbtn_width, !rtl); - int top = wi->pos_y; - int bottom = wi->pos_y + wi->current_y - 1; + DrawFrameRect(cr, wi->colour, wi->IsLowered() ? FR_LOWERED : FR_NONE); + DrawSprite(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT, PAL_NONE, cr.left + WD_IMGBTN_LEFT + (wi->IsLowered() ? 1 : 0), CenterBounds(r.top, r.bottom, sprite_size.height) + (wi->IsLowered() ? 1 : 0)); + if (this->text.bytes == 1) GfxFillRect(cr.Shrink(WD_BEVEL_LEFT, WD_BEVEL_TOP, WD_BEVEL_RIGHT, WD_BEVEL_BOTTOM), _colour_gradient[wi->colour & 0xF][2], FILLRECT_CHECKER); - DrawFrameRect(clearbtn_left, top, clearbtn_right, bottom, wi->colour, wi->IsLowered() ? FR_LOWERED : FR_NONE); - DrawSprite(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT, PAL_NONE, clearbtn_left + WD_IMGBTN_LEFT + (wi->IsLowered() ? 1 : 0), CenterBounds(top, bottom, sprite_size.height) + (wi->IsLowered() ? 1 : 0)); - if (this->text.bytes == 1) GfxFillRect(clearbtn_left + 1, top + 1, clearbtn_right - 1, bottom - 1, _colour_gradient[wi->colour & 0xF][2], FILLRECT_CHECKER); - - DrawFrameRect(left, top, right, bottom, wi->colour, FR_LOWERED | FR_DARKENED); - GfxFillRect(left + 1, top + 1, right - 1, bottom - 1, PC_BLACK); + DrawFrameRect(fr, wi->colour, FR_LOWERED | FR_DARKENED); + GfxFillRect(fr.Shrink(WD_BEVEL_LEFT, WD_BEVEL_TOP, WD_BEVEL_RIGHT, WD_BEVEL_BOTTOM), PC_BLACK); + fr = fr.Shrink(WD_FRAMERECT_LEFT, WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM); /* Limit the drawing of the string inside the widget boundaries */ DrawPixelInfo dpi; - if (!FillDrawPixelInfo(&dpi, left + WD_FRAMERECT_LEFT, top + WD_FRAMERECT_TOP, right - left - WD_FRAMERECT_RIGHT, bottom - top - WD_FRAMERECT_BOTTOM)) return; + if (!FillDrawPixelInfo(&dpi, fr.left, fr.top, fr.Width(), fr.Height())) return; DrawPixelInfo *old_dpi = _cur_dpi; _cur_dpi = &dpi; @@ -823,12 +820,12 @@ void QueryString::DrawEditBox(const Window *w, int wid) const /* We will take the current widget length as maximum width, with a small * space reserved at the end for the caret to show */ const Textbuf *tb = &this->text; - int delta = std::min(0, (right - left) - tb->pixels - 10); + int delta = std::min(0, (fr.right - fr.left) - tb->pixels - 10); if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs; /* If we have a marked area, draw a background highlight. */ - if (tb->marklength != 0) GfxFillRect(delta + tb->markxoffs, 0, delta + tb->markxoffs + tb->marklength - 1, bottom - top, PC_GREY); + if (tb->marklength != 0) GfxFillRect(delta + tb->markxoffs, 0, delta + tb->markxoffs + tb->marklength - 1, fr.bottom - fr.top, PC_GREY); DrawString(delta, tb->pixels, 0, tb->buf, TC_YELLOW); bool focussed = w->IsWidgetGloballyFocused(wid) || IsOSKOpenedFor(w, wid); @@ -856,15 +853,14 @@ Point QueryString::GetCaretPosition(const Window *w, int wid) const Dimension sprite_size = GetSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT); int clearbtn_width = sprite_size.width + WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT; - int left = wi->pos_x + (rtl ? clearbtn_width : 0); - int right = wi->pos_x + (rtl ? wi->current_x : wi->current_x - clearbtn_width) - 1; + Rect r = wi->GetCurrentRect().Indent(clearbtn_width, !rtl).Shrink(WD_FRAMERECT_LEFT, WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM); /* Clamp caret position to be inside out current width. */ const Textbuf *tb = &this->text; - int delta = std::min(0, (right - left) - tb->pixels - 10); + int delta = std::min(0, (r.right - r.left) - tb->pixels - 10); if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs; - Point pt = {left + WD_FRAMERECT_LEFT + tb->caretxoffs + delta, (int)wi->pos_y + WD_FRAMERECT_TOP}; + Point pt = {r.left + tb->caretxoffs + delta, r.top}; return pt; } @@ -886,24 +882,18 @@ Rect QueryString::GetBoundingRect(const Window *w, int wid, const char *from, co Dimension sprite_size = GetSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT); int clearbtn_width = sprite_size.width + WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT; - int left = wi->pos_x + (rtl ? clearbtn_width : 0); - int right = wi->pos_x + (rtl ? wi->current_x : wi->current_x - clearbtn_width) - 1; - - int top = wi->pos_y + WD_FRAMERECT_TOP; - int bottom = wi->pos_y + wi->current_y - 1 - WD_FRAMERECT_BOTTOM; + Rect r = wi->GetCurrentRect().Indent(clearbtn_width, !rtl).Shrink(WD_FRAMERECT_LEFT, WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM); /* Clamp caret position to be inside our current width. */ const Textbuf *tb = &this->text; - int delta = std::min(0, (right - left) - tb->pixels - 10); + int delta = std::min(0, r.Width() - tb->pixels - 10); if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs; /* Get location of first and last character. */ Point p1 = GetCharPosInString(tb->buf, from, FS_NORMAL); Point p2 = from != to ? GetCharPosInString(tb->buf, to, FS_NORMAL) : p1; - Rect r = { Clamp(left + p1.x + delta + WD_FRAMERECT_LEFT, left, right), top, Clamp(left + p2.x + delta + WD_FRAMERECT_LEFT, left, right - WD_FRAMERECT_RIGHT), bottom }; - - return r; + return { Clamp(r.left + p1.x + delta, r.left, r.right), r.top, Clamp(r.left + p2.x + delta, r.left, r.right), r.bottom }; } /** @@ -923,20 +913,16 @@ const char *QueryString::GetCharAtPosition(const Window *w, int wid, const Point Dimension sprite_size = GetSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT); int clearbtn_width = sprite_size.width + WD_IMGBTN_LEFT + WD_IMGBTN_RIGHT; - int left = wi->pos_x + (rtl ? clearbtn_width : 0); - int right = wi->pos_x + (rtl ? wi->current_x : wi->current_x - clearbtn_width) - 1; + Rect r = wi->GetCurrentRect().Indent(clearbtn_width, !rtl).Shrink(WD_FRAMERECT_LEFT, WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM); - int top = wi->pos_y + WD_FRAMERECT_TOP; - int bottom = wi->pos_y + wi->current_y - 1 - WD_FRAMERECT_BOTTOM; - - if (!IsInsideMM(pt.y, top, bottom)) return nullptr; + if (!IsInsideMM(pt.y, r.top, r.bottom)) return nullptr; /* Clamp caret position to be inside our current width. */ const Textbuf *tb = &this->text; - int delta = std::min(0, (right - left) - tb->pixels - 10); + int delta = std::min(0, r.Width() - tb->pixels - 10); if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs; - return ::GetCharAtPosition(tb->buf, pt.x - delta - left); + return ::GetCharAtPosition(tb->buf, pt.x - delta - r.left); } void QueryString::ClickEditBox(Window *w, Point pt, int wid, int click_count, bool focus_changed) @@ -948,9 +934,9 @@ void QueryString::ClickEditBox(Window *w, Point pt, int wid, int click_count, bo bool rtl = _current_text_dir == TD_RTL; int clearbtn_width = GetSpriteSize(rtl ? SPR_IMG_DELETE_RIGHT : SPR_IMG_DELETE_LEFT).width; - int clearbtn_left = wi->pos_x + (rtl ? 0 : wi->current_x - clearbtn_width); + Rect cr = wi->GetCurrentRect().WithWidth(clearbtn_width, !rtl); - if (IsInsideBS(pt.x, clearbtn_left, clearbtn_width)) { + if (IsInsideMM(pt.x, cr.left, cr.right)) { if (this->text.bytes > 1) { this->text.DeleteAll(); w->HandleButtonClick(wid);