1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 08:08:12 +00:00

GTextEditor: Add selected_text() function.

I don't have a clipboard to actually put the copied selection onto yet,
so just print the selected text to stdout so we can see what it is.
This commit is contained in:
Andreas Kling 2019-03-08 01:59:59 +01:00
parent 77359a5360
commit 6576ac8332
3 changed files with 33 additions and 5 deletions

View file

@ -83,7 +83,7 @@ int main(int argc, char** argv)
}); });
auto copy_action = GAction::create("Copy", { Mod_Ctrl, Key_C }, GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/copyfile16.rgb", { 16, 16 }), [&] (const GAction&) { auto copy_action = GAction::create("Copy", { Mod_Ctrl, Key_C }, GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/copyfile16.rgb", { 16, 16 }), [&] (const GAction&) {
dbgprintf("FIXME: Implement Edit/Copy"); printf("Copy: \"%s\"\n", text_editor->selected_text().characters());
}); });
auto paste_action = GAction::create("Paste", { Mod_Ctrl, Key_V }, GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/paste16.rgb", { 16, 16 }), [&] (const GAction&) { auto paste_action = GAction::create("Paste", { Mod_Ctrl, Key_V }, GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/paste16.rgb", { 16, 16 }), [&] (const GAction&) {

View file

@ -3,6 +3,7 @@
#include <LibGUI/GFontDatabase.h> #include <LibGUI/GFontDatabase.h>
#include <SharedGraphics/Painter.h> #include <SharedGraphics/Painter.h>
#include <Kernel/KeyCode.h> #include <Kernel/KeyCode.h>
#include <AK/StringBuilder.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <stdio.h> #include <stdio.h>
@ -272,22 +273,22 @@ void GTextEditor::keydown_event(GKeyEvent& event)
} }
return; return;
} }
if (event.key() == KeyCode::Key_Home) { if (!event.ctrl() && event.key() == KeyCode::Key_Home) {
toggle_selection_if_needed_for_event(event); toggle_selection_if_needed_for_event(event);
set_cursor(m_cursor.line(), 0); set_cursor(m_cursor.line(), 0);
return; return;
} }
if (event.key() == KeyCode::Key_End) { if (!event.ctrl() && event.key() == KeyCode::Key_End) {
toggle_selection_if_needed_for_event(event); toggle_selection_if_needed_for_event(event);
set_cursor(m_cursor.line(), current_line().length()); set_cursor(m_cursor.line(), current_line().length());
return; return;
} }
if (event.key() == KeyCode::Key_Home) { if (event.ctrl() && event.key() == KeyCode::Key_Home) {
toggle_selection_if_needed_for_event(event); toggle_selection_if_needed_for_event(event);
set_cursor(0, 0); set_cursor(0, 0);
return; return;
} }
if (event.key() == KeyCode::Key_End) { if (event.ctrl() && event.key() == KeyCode::Key_End) {
toggle_selection_if_needed_for_event(event); toggle_selection_if_needed_for_event(event);
set_cursor(line_count() - 1, m_lines[line_count() - 1]->length()); set_cursor(line_count() - 1, m_lines[line_count() - 1]->length());
return; return;
@ -571,3 +572,27 @@ bool GTextEditor::write_to_file(const String& path)
close(fd); close(fd);
return true; return true;
} }
String GTextEditor::selected_text() const
{
if (!has_selection())
return { };
auto normalized_selection_start = m_selection_start;
auto normalized_selection_end = m_cursor;
if (m_cursor < m_selection_start)
swap(normalized_selection_start, normalized_selection_end);
StringBuilder builder;
for (int i = normalized_selection_start.line(); i <= normalized_selection_end.line(); ++i) {
auto& line = *m_lines[i];
int selection_start_column_on_line = normalized_selection_start.line() == i ? normalized_selection_start.column() : 0;
int selection_end_column_on_line = normalized_selection_end.line() == i ? normalized_selection_end.column() : line.length();
builder.append(line.characters() + selection_start_column_on_line, selection_end_column_on_line - selection_start_column_on_line);
if (i != normalized_selection_end.line())
builder.append('\n');
}
return builder.to_string();
}

View file

@ -53,6 +53,9 @@ public:
bool write_to_file(const String& path); bool write_to_file(const String& path);
bool has_selection() const { return m_selection_start.is_valid(); }
String selected_text() const;
private: private:
virtual void paint_event(GPaintEvent&) override; virtual void paint_event(GPaintEvent&) override;
virtual void resize_event(GResizeEvent&) override; virtual void resize_event(GResizeEvent&) override;