add 'keep-line-selection' textbox attribute

This commit is contained in:
MihailRis 2025-11-15 14:28:20 +03:00
parent fbc9ceece4
commit aba18ef836
3 changed files with 56 additions and 37 deletions

View File

@ -231,7 +231,7 @@ TextBox::~TextBox() = default;
void TextBox::draw(const DrawContext& pctx, const Assets& assets) { void TextBox::draw(const DrawContext& pctx, const Assets& assets) {
Container::draw(pctx, assets); Container::draw(pctx, assets);
if (!isFocused()) { if (!isFocused() && !keepLineSelection) {
return; return;
} }
const auto& labelText = getText(); const auto& labelText = getText();
@ -252,7 +252,7 @@ void TextBox::draw(const DrawContext& pctx, const Assets& assets) {
float time = gui.getWindow().time(); float time = gui.getWindow().time();
if (editable && static_cast<int>((time - caretLastMove) * 2) % 2 == 0) { if (isFocused() && editable && static_cast<int>((time - caretLastMove) * 2) % 2 == 0) {
uint line = label->getLineByTextIndex(caret); uint line = label->getLineByTextIndex(caret);
uint lcaret = caret - label->getTextLineOffset(line); uint lcaret = caret - label->getTextLineOffset(line);
int width = rawTextCache.metrics.calcWidth(input, 0, lcaret); int width = rawTextCache.metrics.calcWidth(input, 0, lcaret);
@ -308,7 +308,10 @@ void TextBox::draw(const DrawContext& pctx, const Assets& assets) {
} }
} }
if (isFocused() && multiline) { if (!multiline) {
return;
}
auto selectionCtx = subctx.sub(batch); auto selectionCtx = subctx.sub(batch);
selectionCtx.setBlendMode(BlendMode::addition); selectionCtx.setBlendMode(BlendMode::addition);
@ -344,7 +347,6 @@ void TextBox::draw(const DrawContext& pctx, const Assets& assets) {
line++; line++;
} while (line < label->getLinesNumber() && label->isFakeLine(line)); } while (line < label->getLinesNumber() && label->isFakeLine(line));
} }
}
void TextBox::drawBackground(const DrawContext& pctx, const Assets& assets) { void TextBox::drawBackground(const DrawContext& pctx, const Assets& assets) {
auto font = assets.get<Font>(label->getFontName()); auto font = assets.get<Font>(label->getFontName());
@ -605,6 +607,14 @@ size_t TextBox::getSelectionEnd() const {
return selectionEnd; return selectionEnd;
} }
void TextBox::setKeepLineSelection(bool flag) {
keepLineSelection = flag;
}
bool TextBox::isKeepLineSelection() const {
return keepLineSelection;
}
void TextBox::setOnEditStart(runnable oneditstart) { void TextBox::setOnEditStart(runnable oneditstart) {
onEditStart = oneditstart; onEditStart = oneditstart;
} }

View File

@ -62,6 +62,7 @@ namespace gui {
bool editable = true; bool editable = true;
bool autoresize = false; bool autoresize = false;
bool showLineNumbers = false; bool showLineNumbers = false;
bool keepLineSelection = false;
std::string markup; std::string markup;
std::string syntax; std::string syntax;
@ -222,6 +223,9 @@ namespace gui {
size_t getSelectionStart() const; size_t getSelectionStart() const;
size_t getSelectionEnd() const; size_t getSelectionEnd() const;
void setKeepLineSelection(bool flag);
bool isKeepLineSelection() const;
/// @brief Set runnable called on textbox focus /// @brief Set runnable called on textbox focus
virtual void setOnEditStart(runnable oneditstart); virtual void setOnEditStart(runnable oneditstart);

View File

@ -573,6 +573,11 @@ static std::shared_ptr<UINode> read_text_box(
if (element.has("line-numbers")) { if (element.has("line-numbers")) {
textbox->setShowLineNumbers(element.attr("line-numbers").asBool()); textbox->setShowLineNumbers(element.attr("line-numbers").asBool());
} }
if (element.has("keep-line-selection")) {
textbox->setKeepLineSelection(
element.attr("keep-line-selection").asBool()
);
}
if (element.has("markup")) { if (element.has("markup")) {
textbox->setMarkup(element.attr("markup").getText()); textbox->setMarkup(element.attr("markup").getText());
} }