mirror of
https://github.com/SerenityOS/serenity
synced 2024-07-23 19:15:55 +00:00
LibGUI+HackStudio: Fix cursor appearance and crash while debugging
HackStudio uses a TreeView to display the list of current variables while debugging, and when the program completes, it sets that view's model to a null model. This would trip an assertion if the TreeView had something selected at the time, so this patch lessens the assertion into a simple null check. Additionally, the cursor would look laggy when moving about the editor because the code was waiting for a window repaint to update the cursor's look when it makes more sense to update the cursor when it actually moves. This change also requires the base GUI::TextEditor to expose a getter to tell if its currently in a drag selection. Finally, requesting a context menu in the line ruler on the side of the editor would also place/remove breakpoints, which was counter intuitive, so this requires a left click to modify breakpoint placement.
This commit is contained in:
parent
77039e5354
commit
12fe546be9
|
@ -107,11 +107,6 @@ void Editor::paint_event(GUI::PaintEvent& event)
|
|||
painter.draw_rect(rect, palette().selection());
|
||||
}
|
||||
|
||||
if (m_hovering_lines_ruler)
|
||||
window()->set_override_cursor(GUI::StandardCursor::Arrow);
|
||||
else if (m_hovering_editor)
|
||||
window()->set_override_cursor(m_hovering_link && m_holding_ctrl ? GUI::StandardCursor::Hand : GUI::StandardCursor::IBeam);
|
||||
|
||||
if (ruler_visible()) {
|
||||
size_t first_visible_line = text_position_at(event.rect().top_left()).line();
|
||||
size_t last_visible_line = text_position_at(event.rect().bottom_right()).line();
|
||||
|
@ -217,12 +212,16 @@ void Editor::mousemove_event(GUI::MouseEvent& event)
|
|||
if (!highlighter)
|
||||
return;
|
||||
|
||||
auto ruler_line_rect = ruler_content_rect(text_position.line());
|
||||
m_hovering_lines_ruler = (event.position().x() < ruler_line_rect.width());
|
||||
|
||||
bool hide_tooltip = true;
|
||||
bool is_over_link = false;
|
||||
|
||||
auto ruler_line_rect = ruler_content_rect(text_position.line());
|
||||
auto hovering_lines_ruler = (event.position().x() < ruler_line_rect.width());
|
||||
if (hovering_lines_ruler && !is_in_drag_select())
|
||||
window()->set_override_cursor(GUI::StandardCursor::Arrow);
|
||||
else if (m_hovering_editor)
|
||||
window()->set_override_cursor(m_hovering_link && m_holding_ctrl ? GUI::StandardCursor::Hand : GUI::StandardCursor::IBeam);
|
||||
|
||||
for (auto& span : document().spans()) {
|
||||
if (span.range.contains(m_previous_text_position) && !span.range.contains(text_position)) {
|
||||
if (highlighter->is_navigatable(span.data) && span.is_underlined) {
|
||||
|
@ -272,7 +271,7 @@ void Editor::mousedown_event(GUI::MouseEvent& event)
|
|||
|
||||
auto text_position = text_position_at(event.position());
|
||||
auto ruler_line_rect = ruler_content_rect(text_position.line());
|
||||
if (event.position().x() < ruler_line_rect.width()) {
|
||||
if (event.button() == GUI::MouseButton::Left && event.position().x() < ruler_line_rect.width()) {
|
||||
if (!m_breakpoint_lines.contains_slow(text_position.line())) {
|
||||
m_breakpoint_lines.append(text_position.line());
|
||||
on_breakpoint_change(wrapper().filename_label().text(), text_position.line(), BreakpointChange::Added);
|
||||
|
|
|
@ -77,7 +77,6 @@ private:
|
|||
bool m_hovering_editor { false };
|
||||
bool m_hovering_link { false };
|
||||
bool m_holding_ctrl { false };
|
||||
bool m_hovering_lines_ruler { false };
|
||||
|
||||
Vector<size_t> m_breakpoint_lines;
|
||||
Optional<size_t> m_execution_position;
|
||||
|
|
|
@ -129,6 +129,8 @@ public:
|
|||
const SyntaxHighlighter* syntax_highlighter() const;
|
||||
void set_syntax_highlighter(OwnPtr<SyntaxHighlighter>);
|
||||
|
||||
bool is_in_drag_select() const { return m_in_drag_select; }
|
||||
|
||||
protected:
|
||||
explicit TextEditor(Type = Type::MultiLine);
|
||||
|
||||
|
|
|
@ -377,7 +377,8 @@ void TreeView::did_update_model(unsigned flags)
|
|||
void TreeView::did_update_selection()
|
||||
{
|
||||
AbstractView::did_update_selection();
|
||||
ASSERT(model());
|
||||
if (!model())
|
||||
return;
|
||||
auto index = selection().first();
|
||||
if (!index.is_valid())
|
||||
return;
|
||||
|
|
Loading…
Reference in a new issue