mirror of https://github.com/OpenTTD/OpenTTD
(svn r25683) -Add: Support for a marked/selected range to the textbuf.
parent
cbdfd31a3c
commit
64d2fc4d1e
|
@ -216,6 +216,9 @@ struct IConsoleWindow : Window
|
||||||
delta = 0;
|
delta = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we have a marked area, draw a background highlight. */
|
||||||
|
if (_iconsole_cmdline.marklength != 0) GfxFillRect(this->line_offset + delta + _iconsole_cmdline.markxoffs, this->height - this->line_height, this->line_offset + delta + _iconsole_cmdline.markxoffs + _iconsole_cmdline.marklength, this->height - 1, PC_DARK_RED);
|
||||||
|
|
||||||
DrawString(this->line_offset + delta, right, this->height - this->line_height, _iconsole_cmdline.buf, (TextColour)CC_COMMAND, SA_LEFT | SA_FORCE);
|
DrawString(this->line_offset + delta, right, this->height - this->line_height, _iconsole_cmdline.buf, (TextColour)CC_COMMAND, SA_LEFT | SA_FORCE);
|
||||||
|
|
||||||
if (_focused_window == this && _iconsole_cmdline.caret) {
|
if (_focused_window == this && _iconsole_cmdline.caret) {
|
||||||
|
|
|
@ -775,6 +775,9 @@ void QueryString::DrawEditBox(const Window *w, int wid) const
|
||||||
|
|
||||||
if (tb->caretxoffs + delta < 0) delta = -tb->caretxoffs;
|
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);
|
||||||
|
|
||||||
DrawString(delta, tb->pixels, 0, tb->buf, TC_YELLOW);
|
DrawString(delta, tb->pixels, 0, tb->buf, TC_YELLOW);
|
||||||
bool focussed = w->IsWidgetGloballyFocused(wid) || IsOSKOpenedFor(w, wid);
|
bool focussed = w->IsWidgetGloballyFocused(wid) || IsOSKOpenedFor(w, wid);
|
||||||
if (focussed && tb->caret) {
|
if (focussed && tb->caret) {
|
||||||
|
|
|
@ -103,6 +103,7 @@ bool Textbuf::DeleteChar(uint16 keycode)
|
||||||
this->UpdateStringIter();
|
this->UpdateStringIter();
|
||||||
this->UpdateWidth();
|
this->UpdateWidth();
|
||||||
this->UpdateCaretPosition();
|
this->UpdateCaretPosition();
|
||||||
|
this->UpdateMarkedText();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -115,6 +116,7 @@ void Textbuf::DeleteAll()
|
||||||
memset(this->buf, 0, this->max_bytes);
|
memset(this->buf, 0, this->max_bytes);
|
||||||
this->bytes = this->chars = 1;
|
this->bytes = this->chars = 1;
|
||||||
this->pixels = this->caretpos = this->caretxoffs = 0;
|
this->pixels = this->caretpos = this->caretxoffs = 0;
|
||||||
|
this->markpos = this->markend = this->markxoffs = this->marklength = 0;
|
||||||
this->UpdateStringIter();
|
this->UpdateStringIter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,6 +140,7 @@ bool Textbuf::InsertChar(WChar key)
|
||||||
this->UpdateStringIter();
|
this->UpdateStringIter();
|
||||||
this->UpdateWidth();
|
this->UpdateWidth();
|
||||||
this->UpdateCaretPosition();
|
this->UpdateCaretPosition();
|
||||||
|
this->UpdateMarkedText();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -181,6 +184,7 @@ bool Textbuf::InsertString(const char *str)
|
||||||
this->UpdateStringIter();
|
this->UpdateStringIter();
|
||||||
this->UpdateWidth();
|
this->UpdateWidth();
|
||||||
this->UpdateCaretPosition();
|
this->UpdateCaretPosition();
|
||||||
|
this->UpdateMarkedText();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -200,6 +204,45 @@ bool Textbuf::InsertClipboard()
|
||||||
return this->InsertString(utf8_buf);
|
return this->InsertString(utf8_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Discard any marked text.
|
||||||
|
* @param update Set to true if the internal state should be updated.
|
||||||
|
*/
|
||||||
|
void Textbuf::DiscardMarkedText(bool update)
|
||||||
|
{
|
||||||
|
if (this->markend == 0) return;
|
||||||
|
|
||||||
|
/* Count marked characters. */
|
||||||
|
uint c = 0;
|
||||||
|
const char *s = this->buf + this->markpos;
|
||||||
|
while (s < this->buf + this->markend) {
|
||||||
|
Utf8Consume(&s);
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Strip marked characters from buffer. */
|
||||||
|
memmove(this->buf + this->markpos, this->buf + this->markend, this->bytes - this->markend);
|
||||||
|
this->bytes -= this->markend - this->markpos;
|
||||||
|
this->chars -= c;
|
||||||
|
|
||||||
|
/* Fixup caret if needed. */
|
||||||
|
if (this->caretpos > this->markpos) {
|
||||||
|
if (this->caretpos <= this->markend) {
|
||||||
|
this->caretpos = this->markpos;
|
||||||
|
} else {
|
||||||
|
this->caretpos -= this->markend - this->markpos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this->markpos = this->markend = 0;
|
||||||
|
|
||||||
|
if (update) {
|
||||||
|
this->UpdateStringIter();
|
||||||
|
this->UpdateCaretPosition();
|
||||||
|
this->UpdateMarkedText();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Update the character iter after the text has changed. */
|
/** Update the character iter after the text has changed. */
|
||||||
void Textbuf::UpdateStringIter()
|
void Textbuf::UpdateStringIter()
|
||||||
{
|
{
|
||||||
|
@ -220,6 +263,17 @@ void Textbuf::UpdateCaretPosition()
|
||||||
this->caretxoffs = this->chars > 1 ? GetCharPosInString(this->buf, this->buf + this->caretpos, FS_NORMAL).x : 0;
|
this->caretxoffs = this->chars > 1 ? GetCharPosInString(this->buf, this->buf + this->caretpos, FS_NORMAL).x : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Update pixel positions of the marked text area. */
|
||||||
|
void Textbuf::UpdateMarkedText()
|
||||||
|
{
|
||||||
|
if (this->markend != 0) {
|
||||||
|
this->markxoffs = GetCharPosInString(this->buf, this->buf + this->markpos, FS_NORMAL).x;
|
||||||
|
this->marklength = GetCharPosInString(this->buf, this->buf + this->markend, FS_NORMAL).x - this->markxoffs;
|
||||||
|
} else {
|
||||||
|
this->markxoffs = this->marklength = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle text navigation with arrow keys left/right.
|
* Handle text navigation with arrow keys left/right.
|
||||||
* This defines where the caret will blink and the next character interaction will occur
|
* This defines where the caret will blink and the next character interaction will occur
|
||||||
|
@ -355,6 +409,7 @@ void Textbuf::UpdateSize()
|
||||||
this->caretpos = this->bytes - 1;
|
this->caretpos = this->bytes - 1;
|
||||||
this->UpdateStringIter();
|
this->UpdateStringIter();
|
||||||
this->UpdateWidth();
|
this->UpdateWidth();
|
||||||
|
this->UpdateMarkedText();
|
||||||
|
|
||||||
this->UpdateCaretPosition();
|
this->UpdateCaretPosition();
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,10 @@ struct Textbuf {
|
||||||
bool caret; ///< is the caret ("_") visible or not
|
bool caret; ///< is the caret ("_") visible or not
|
||||||
uint16 caretpos; ///< the current position of the caret in the buffer, in bytes
|
uint16 caretpos; ///< the current position of the caret in the buffer, in bytes
|
||||||
uint16 caretxoffs; ///< the current position of the caret in pixels
|
uint16 caretxoffs; ///< the current position of the caret in pixels
|
||||||
|
uint16 markpos; ///< the start position of the marked area in the buffer, in bytes
|
||||||
|
uint16 markend; ///< the end position of the marked area in the buffer, in bytes
|
||||||
|
uint16 markxoffs; ///< the start position of the marked area in pixels
|
||||||
|
uint16 marklength; ///< the length of the marked area in pixels
|
||||||
|
|
||||||
explicit Textbuf(uint16 max_bytes, uint16 max_chars = UINT16_MAX);
|
explicit Textbuf(uint16 max_bytes, uint16 max_chars = UINT16_MAX);
|
||||||
~Textbuf();
|
~Textbuf();
|
||||||
|
@ -62,6 +66,8 @@ struct Textbuf {
|
||||||
bool HandleCaret();
|
bool HandleCaret();
|
||||||
void UpdateSize();
|
void UpdateSize();
|
||||||
|
|
||||||
|
void DiscardMarkedText(bool update = true);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
StringIterator *char_iter;
|
StringIterator *char_iter;
|
||||||
|
|
||||||
|
@ -70,6 +76,7 @@ private:
|
||||||
void UpdateStringIter();
|
void UpdateStringIter();
|
||||||
void UpdateWidth();
|
void UpdateWidth();
|
||||||
void UpdateCaretPosition();
|
void UpdateCaretPosition();
|
||||||
|
void UpdateMarkedText();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* TEXTBUF_TYPE_H */
|
#endif /* TEXTBUF_TYPE_H */
|
||||||
|
|
Loading…
Reference in New Issue