mirror of https://github.com/OpenTTD/OpenTTD
* Fix: Use width of caret symbol '_' for text entry. This replaces an arbitrary pixel width with the space actually required. * Fix #8971: Update QueryString sizes with interface scale change.pull/10215/head
parent
3451c0a82c
commit
23eec0b7b3
|
@ -789,6 +789,11 @@ void QueryString::HandleEditBox(Window *w, int wid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int GetCaretWidth()
|
||||||
|
{
|
||||||
|
return GetCharacterWidth(FS_NORMAL, '_');
|
||||||
|
}
|
||||||
|
|
||||||
void QueryString::DrawEditBox(const Window *w, int wid) const
|
void QueryString::DrawEditBox(const Window *w, int wid) const
|
||||||
{
|
{
|
||||||
const NWidgetLeaf *wi = w->GetWidget<NWidgetLeaf>(wid);
|
const NWidgetLeaf *wi = w->GetWidget<NWidgetLeaf>(wid);
|
||||||
|
@ -821,7 +826,7 @@ void QueryString::DrawEditBox(const Window *w, int wid) const
|
||||||
/* We will take the current widget length as maximum width, with a small
|
/* We will take the current widget length as maximum width, with a small
|
||||||
* space reserved at the end for the caret to show */
|
* space reserved at the end for the caret to show */
|
||||||
const Textbuf *tb = &this->text;
|
const Textbuf *tb = &this->text;
|
||||||
int delta = std::min(0, (fr.right - fr.left) - tb->pixels - 10);
|
int delta = std::min(0, (fr.right - fr.left) - tb->pixels - GetCaretWidth());
|
||||||
|
|
||||||
if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs;
|
if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs;
|
||||||
|
|
||||||
|
@ -858,7 +863,7 @@ Point QueryString::GetCaretPosition(const Window *w, int wid) const
|
||||||
|
|
||||||
/* Clamp caret position to be inside out current width. */
|
/* Clamp caret position to be inside out current width. */
|
||||||
const Textbuf *tb = &this->text;
|
const Textbuf *tb = &this->text;
|
||||||
int delta = std::min(0, (r.right - r.left) - tb->pixels - 10);
|
int delta = std::min(0, (r.right - r.left) - tb->pixels - GetCaretWidth());
|
||||||
if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs;
|
if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs;
|
||||||
|
|
||||||
Point pt = {r.left + tb->caretxoffs + delta, r.top};
|
Point pt = {r.left + tb->caretxoffs + delta, r.top};
|
||||||
|
@ -887,7 +892,7 @@ Rect QueryString::GetBoundingRect(const Window *w, int wid, const char *from, co
|
||||||
|
|
||||||
/* Clamp caret position to be inside our current width. */
|
/* Clamp caret position to be inside our current width. */
|
||||||
const Textbuf *tb = &this->text;
|
const Textbuf *tb = &this->text;
|
||||||
int delta = std::min(0, r.Width() - tb->pixels - 10);
|
int delta = std::min(0, r.Width() - tb->pixels - GetCaretWidth());
|
||||||
if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs;
|
if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs;
|
||||||
|
|
||||||
/* Get location of first and last character. */
|
/* Get location of first and last character. */
|
||||||
|
@ -920,7 +925,7 @@ const char *QueryString::GetCharAtPosition(const Window *w, int wid, const Point
|
||||||
|
|
||||||
/* Clamp caret position to be inside our current width. */
|
/* Clamp caret position to be inside our current width. */
|
||||||
const Textbuf *tb = &this->text;
|
const Textbuf *tb = &this->text;
|
||||||
int delta = std::min(0, r.Width() - tb->pixels - 10);
|
int delta = std::min(0, r.Width() - tb->pixels - GetCaretWidth());
|
||||||
if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs;
|
if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs;
|
||||||
|
|
||||||
return ::GetCharAtPosition(tb->buf, pt.x - delta - r.left);
|
return ::GetCharAtPosition(tb->buf, pt.x - delta - r.left);
|
||||||
|
|
|
@ -354,6 +354,17 @@ QueryString *Window::GetQueryString(uint widnum)
|
||||||
return query != this->querystrings.End() ? query->second : nullptr;
|
return query != this->querystrings.End() ? query->second : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update size of all QueryStrings of this window.
|
||||||
|
*/
|
||||||
|
void Window::UpdateQueryStringSize()
|
||||||
|
{
|
||||||
|
for (auto &qs : this->querystrings)
|
||||||
|
{
|
||||||
|
qs.second->text.UpdateSize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the current input text if an edit box has the focus.
|
* Get the current input text if an edit box has the focus.
|
||||||
* @return The currently focused input text or nullptr if no input focused.
|
* @return The currently focused input text or nullptr if no input focused.
|
||||||
|
@ -3353,7 +3364,10 @@ void HideVitalWindows()
|
||||||
void ReInitWindow(Window *w, bool zoom_changed)
|
void ReInitWindow(Window *w, bool zoom_changed)
|
||||||
{
|
{
|
||||||
if (w == nullptr) return;
|
if (w == nullptr) return;
|
||||||
if (zoom_changed) w->nested_root->AdjustPaddingForZoom();
|
if (zoom_changed) {
|
||||||
|
w->nested_root->AdjustPaddingForZoom();
|
||||||
|
w->UpdateQueryStringSize();
|
||||||
|
}
|
||||||
w->ReInit();
|
w->ReInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -276,6 +276,7 @@ public:
|
||||||
|
|
||||||
const QueryString *GetQueryString(uint widnum) const;
|
const QueryString *GetQueryString(uint widnum) const;
|
||||||
QueryString *GetQueryString(uint widnum);
|
QueryString *GetQueryString(uint widnum);
|
||||||
|
void UpdateQueryStringSize();
|
||||||
|
|
||||||
virtual const char *GetFocusedText() const;
|
virtual const char *GetFocusedText() const;
|
||||||
virtual const char *GetCaret() const;
|
virtual const char *GetCaret() const;
|
||||||
|
|
Loading…
Reference in New Issue