summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibGUI/AbstractView.cpp6
-rw-r--r--Userland/Libraries/LibGUI/AbstractView.h1
-rw-r--r--Userland/Libraries/LibGUI/ColumnsView.cpp4
-rw-r--r--Userland/Libraries/LibGUI/IconView.cpp23
-rw-r--r--Userland/Libraries/LibGUI/IconView.h1
-rw-r--r--Userland/Libraries/LibGUI/ModelEditingDelegate.h11
6 files changed, 42 insertions, 4 deletions
diff --git a/Userland/Libraries/LibGUI/AbstractView.cpp b/Userland/Libraries/LibGUI/AbstractView.cpp
index dd426ec8be..e86826437b 100644
--- a/Userland/Libraries/LibGUI/AbstractView.cpp
+++ b/Userland/Libraries/LibGUI/AbstractView.cpp
@@ -160,6 +160,9 @@ void AbstractView::begin_editing(const ModelIndex& index)
VERIFY(model());
stop_editing();
};
+ m_editing_delegate->on_change = [this, index] {
+ editing_widget_did_change(index);
+ };
}
void AbstractView::stop_editing()
@@ -670,6 +673,9 @@ bool AbstractView::is_highlighting_searching(const ModelIndex& index) const
void AbstractView::draw_item_text(Gfx::Painter& painter, const ModelIndex& index, bool is_selected, const Gfx::IntRect& text_rect, const StringView& item_text, const Gfx::Font& font, Gfx::TextAlignment alignment, Gfx::TextElision elision, size_t search_highlighting_offset)
{
+ if (m_edit_index == index)
+ return;
+
Color text_color;
if (is_selected)
text_color = is_focused() ? palette().selection_text() : palette().inactive_selection_text();
diff --git a/Userland/Libraries/LibGUI/AbstractView.h b/Userland/Libraries/LibGUI/AbstractView.h
index 2fbb86ae64..fce68e8bc7 100644
--- a/Userland/Libraries/LibGUI/AbstractView.h
+++ b/Userland/Libraries/LibGUI/AbstractView.h
@@ -152,6 +152,7 @@ protected:
virtual void toggle_selection(const ModelIndex&);
virtual void did_change_hovered_index([[maybe_unused]] const ModelIndex& old_index, [[maybe_unused]] const ModelIndex& new_index) { }
virtual void did_change_cursor_index([[maybe_unused]] const ModelIndex& old_index, [[maybe_unused]] const ModelIndex& new_index) { }
+ virtual void editing_widget_did_change([[maybe_unused]] const ModelIndex& index) { }
void draw_item_text(Gfx::Painter&, const ModelIndex&, bool, const Gfx::IntRect&, const StringView&, const Gfx::Font&, Gfx::TextAlignment, Gfx::TextElision, size_t search_highlighting_offset = 0);
diff --git a/Userland/Libraries/LibGUI/ColumnsView.cpp b/Userland/Libraries/LibGUI/ColumnsView.cpp
index c11857bd34..d02898b345 100644
--- a/Userland/Libraries/LibGUI/ColumnsView.cpp
+++ b/Userland/Libraries/LibGUI/ColumnsView.cpp
@@ -105,7 +105,9 @@ void ColumnsView::paint_event(PaintEvent& event)
}
Gfx::IntRect row_rect { column_x, row * item_height(), column.width, item_height() };
- painter.fill_rect(row_rect, background_color);
+
+ if (m_edit_index.row() != row)
+ painter.fill_rect(row_rect, background_color);
auto icon = index.data(ModelRole::Icon);
Gfx::IntRect icon_rect = { column_x + icon_spacing(), 0, icon_size(), icon_size() };
diff --git a/Userland/Libraries/LibGUI/IconView.cpp b/Userland/Libraries/LibGUI/IconView.cpp
index 0718515be4..b894c67ca1 100644
--- a/Userland/Libraries/LibGUI/IconView.cpp
+++ b/Userland/Libraries/LibGUI/IconView.cpp
@@ -8,8 +8,10 @@
#include <LibCore/Timer.h>
#include <LibGUI/IconView.h>
#include <LibGUI/Model.h>
+#include <LibGUI/ModelEditingDelegate.h>
#include <LibGUI/Painter.h>
#include <LibGUI/Scrollbar.h>
+
#include <LibGfx/Palette.h>
REGISTER_WIDGET(GUI, IconView);
@@ -401,10 +403,24 @@ Gfx::IntRect IconView::editing_rect(ModelIndex const& index) const
if (!index.is_valid())
return {};
auto& item_data = get_item_data(index.row());
- return item_data.text_rect.inflated(4, 4);
+ auto editing_rect = item_data.text_rect;
+ editing_rect.set_height(font_for_index(index)->glyph_height() + 8);
+ editing_rect.set_y(item_data.text_rect.y() - 2);
+ return editing_rect;
+}
+
+void IconView::editing_widget_did_change(const ModelIndex& index)
+{
+ if (m_editing_delegate->value().is_string()) {
+ auto text_width = font_for_index(index)->width(m_editing_delegate->value().as_string());
+ m_edit_widget_content_rect.set_width(min(text_width + 8, effective_item_size().width()));
+ m_edit_widget_content_rect.center_horizontally_within(editing_rect(index).translated(frame_thickness(), frame_thickness()));
+ update_edit_widget_position();
+ }
}
-Gfx::IntRect IconView::paint_invalidation_rect(const ModelIndex& index) const
+Gfx::IntRect
+IconView::paint_invalidation_rect(const ModelIndex& index) const
{
if (!index.is_valid())
return {};
@@ -548,7 +564,8 @@ void IconView::paint_event(PaintEvent& event)
const auto& text_rect = item_data.text_rect;
- painter.fill_rect(text_rect, background_color);
+ if (m_edit_index != item_data.index)
+ painter.fill_rect(text_rect, background_color);
if (is_focused() && item_data.index == cursor_index()) {
painter.draw_rect(text_rect, widget_background_color);
diff --git a/Userland/Libraries/LibGUI/IconView.h b/Userland/Libraries/LibGUI/IconView.h
index 8157a9da34..53da8f638b 100644
--- a/Userland/Libraries/LibGUI/IconView.h
+++ b/Userland/Libraries/LibGUI/IconView.h
@@ -57,6 +57,7 @@ private:
virtual void mouseup_event(MouseEvent&) override;
virtual void did_change_hovered_index(const ModelIndex& old_index, const ModelIndex& new_index) override;
virtual void did_change_cursor_index(const ModelIndex& old_index, const ModelIndex& new_index) override;
+ virtual void editing_widget_did_change(const ModelIndex& index) override;
virtual void move_cursor(CursorMovement, SelectionUpdate) override;
diff --git a/Userland/Libraries/LibGUI/ModelEditingDelegate.h b/Userland/Libraries/LibGUI/ModelEditingDelegate.h
index a910b67b05..faf11d276a 100644
--- a/Userland/Libraries/LibGUI/ModelEditingDelegate.h
+++ b/Userland/Libraries/LibGUI/ModelEditingDelegate.h
@@ -35,6 +35,7 @@ public:
Function<void()> on_commit;
Function<void()> on_rollback;
+ Function<void()> on_change;
virtual Variant value() const = 0;
virtual void set_value(Variant const&, SelectionBehavior selection_behavior = SelectionBehavior::SelectAll) = 0;
@@ -55,6 +56,11 @@ protected:
if (on_rollback)
on_rollback();
}
+ void change()
+ {
+ if (on_change)
+ on_change();
+ }
const ModelIndex& index() const { return m_index; }
@@ -72,12 +78,17 @@ public:
virtual RefPtr<Widget> create_widget() override
{
auto textbox = TextBox::construct();
+ textbox->set_frame_shape(Gfx::FrameShape::NoFrame);
+
textbox->on_return_pressed = [this] {
commit();
};
textbox->on_escape_pressed = [this] {
rollback();
};
+ textbox->on_change = [this] {
+ change();
+ };
return textbox;
}
virtual Variant value() const override { return static_cast<const TextBox*>(widget())->text(); }