From 5d4c3402dfe71f4977e8a22c29f5e563d0a5e5ac Mon Sep 17 00:00:00 2001 From: Twan van Laarhoven Date: Sat, 25 Apr 2020 23:59:56 +0200 Subject: [PATCH] Added fancy mouseover effect to field borders. This might be slow, if this becomes a problem I could add a setting to disable it. --- src/data/draw_what.hpp | 3 ++- src/gui/control/card_editor.cpp | 17 +++++++++++------ src/render/value/viewer.cpp | 2 ++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/data/draw_what.hpp b/src/data/draw_what.hpp index 99979f6b..a9301d9d 100644 --- a/src/data/draw_what.hpp +++ b/src/data/draw_what.hpp @@ -22,7 +22,8 @@ enum DrawWhat , DRAW_EDITING = 0x40 // draw other editor stuff, can be disabled. , DRAW_ERRORS = 0x80 // draw error indicators, can't be disabled , DRAW_ACTIVE = 0x100 // draw active editor stuff, such as hidden separators and atom highlights -, DRAW_NATIVELOOK = 0x200 // use a native look +, DRAW_HOVER = 0x200 // draw mouse over stuff, such as a highlighted border +, DRAW_NATIVELOOK = 0x400 // use a native look }; // ----------------------------------------------------------------------------- : EOF diff --git a/src/gui/control/card_editor.cpp b/src/gui/control/card_editor.cpp index 26d93e4e..caf10b5c 100644 --- a/src/gui/control/card_editor.cpp +++ b/src/gui/control/card_editor.cpp @@ -41,7 +41,8 @@ ValueViewerP DataEditor::makeViewer(const StyleP& style) { DrawWhat DataEditor::drawWhat(const ValueViewer* viewer) const { int what = DRAW_NORMAL - | DRAW_ACTIVE * viewerIsCurrent(viewer); + | DRAW_ACTIVE * viewerIsCurrent(viewer) + | DRAW_HOVER * (viewer == hovered_viewer); if (nativeLook()) { what |= DRAW_BOXES | DRAW_EDITING | DRAW_NATIVELOOK | DRAW_ERRORS; } else { @@ -256,20 +257,23 @@ void DataEditor::onMotion(wxMouseEvent& ev) { } if (!HasCapture()) { // find editor under mouse - ValueViewer* new_hovered_viewer = nullptr; + ValueViewer* old_hovered_viewer = hovered_viewer; FOR_EACH_REVERSE(v,viewers) { // find high z index fields first RealPoint pos = mousePoint(ev, *v); if (v->containsPoint(pos) && v->getField()->editable) { - new_hovered_viewer = v.get(); + hovered_viewer = v.get(); break; } } - if (hovered_viewer && hovered_viewer != new_hovered_viewer) { - ValueEditor* e = hovered_viewer->getEditor(); + if (old_hovered_viewer && hovered_viewer != old_hovered_viewer) { + ValueEditor* e = old_hovered_viewer->getEditor(); RealPoint pos = mousePoint(ev, *hovered_viewer); if (e) e->onMouseLeave(pos, ev); + redraw(*old_hovered_viewer); + } + if (hovered_viewer && hovered_viewer != old_hovered_viewer) { + redraw(*hovered_viewer); } - hovered_viewer = new_hovered_viewer; // change cursor and set status text wxFrame* frame = dynamic_cast( wxGetTopLevelParent(this) ); if (hovered_viewer) { @@ -293,6 +297,7 @@ void DataEditor::onMouseLeave(wxMouseEvent& ev) { if (hovered_viewer) { ValueEditor* e = hovered_viewer->getEditor(); if (e) e->onMouseLeave(mousePoint(ev,*hovered_viewer), ev); + if (hovered_viewer) redraw(*hovered_viewer); hovered_viewer = nullptr; } // clear status text diff --git a/src/render/value/viewer.cpp b/src/render/value/viewer.cpp index f09f34d1..76ffac57 100644 --- a/src/render/value/viewer.cpp +++ b/src/render/value/viewer.cpp @@ -59,6 +59,8 @@ bool ValueViewer::setFieldBorderPen(RotatedDC& dc) { if (!(what & DRAW_BORDERS)) return false; if (what & DRAW_ACTIVE) { dc.SetPen(wxPen(Color(0, 128, 255), 1, wxPENSTYLE_SOLID)); + } else if (what & DRAW_HOVER) { + dc.SetPen(dotted_pen(Color(0, 128, 255))); } else { dc.SetPen(dotted_pen(Color(128, 128, 128))); }