From d8290c4ac3e7dc3ff37b2d091ddd1331ac8cd8a0 Mon Sep 17 00:00:00 2001 From: Garux Date: Mon, 6 Jan 2025 02:36:49 +0500 Subject: [PATCH] * update SelectionSystem highlights, manipulations immediately onModifierDown(), onModifierUp() --- radiant/selection.cpp | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/radiant/selection.cpp b/radiant/selection.cpp index 114271cc..0ddc5545 100644 --- a/radiant/selection.cpp +++ b/radiant/selection.cpp @@ -8402,7 +8402,7 @@ class Selector_ } const DeviceVector& m_epsilon; - ModifierFlags m_state; + const ModifierFlags& m_state; public: DeviceVector m_start; DeviceVector m_current; @@ -8413,9 +8413,9 @@ public: const View* m_view; RectangleCallback m_window_update; - Selector_( const DeviceVector& epsilon ) : + Selector_( const DeviceVector& epsilon, const ModifierFlags& state ) : m_epsilon( epsilon ), - m_state( c_modifierNone ), + m_state( state ), m_start( 0.f, 0.f ), m_current( 0.f, 0.f ), m_mouse2( false ), @@ -8450,19 +8450,10 @@ public: getSelectionSystem().SelectPoint( *m_view, device_constrained( position ), m_epsilon, m_mouseMoved ? RadiantSelectionSystem::eReplace : RadiantSelectionSystem::eCycle, false ); } - bool selecting() const { return m_state != c_modifier_manipulator && m_mouse2; } - void setState( ModifierFlags state ){ - const bool was_selecting = selecting(); - m_state = state; - if ( was_selecting ^ selecting() ) { - draw_area(); - } - } - void mouseDown( DeviceVector position ){ m_start = m_current = device_constrained( position ); if( !m_mouse2 && m_state != c_modifierNone ){ @@ -8567,6 +8558,9 @@ class RadiantWindowObserver final : public SelectionSystemWindowObserver float m_movePressed; /* pressed move after m_moveStart, for decision: m1 tunnel selector or manipulate and if to do tunnel selector at all */ DeviceVector m_moveStart; DeviceVector m_moveEnd; + // track latest onMouseMotion() interaction to trigger update onModifierDown(), onModifierUp() + inline static RadiantWindowObserver *m_latestObserver = nullptr; + inline static WindowVector m_latestPosition; Selector_ m_selector; Manipulator_ m_manipulator; @@ -8577,10 +8571,13 @@ public: m_state( c_modifierNone ), m_mouse_down( false ), m_moveEpsilon( .01f ), - m_selector( m_epsilon ), + m_selector( m_epsilon, m_state ), m_manipulator( m_epsilon, m_state ), m_texmanipulator( m_epsilon, m_state ){ } + ~RadiantWindowObserver(){ + m_latestObserver = nullptr; + } void release() override { delete this; } @@ -8649,6 +8646,8 @@ public: else{ m_manipulator.highlight( device( position ) ); } + m_latestObserver = this; + m_latestPosition = position; } void onMouseUp( const WindowVector& position, ButtonIdentifier button, ModifierFlags modifiers ) override { if ( button != c_buttonInvalid && !g_mouseUpCallback.empty() ) { @@ -8678,11 +8677,13 @@ public: } void onModifierDown( ModifierFlags type ) override { g_modifiers = m_state = bitfield_enable( m_state, type ); - m_selector.setState( m_state ); + if( this == m_latestObserver ) + onMouseMotion( m_latestPosition, m_state ); } void onModifierUp( ModifierFlags type ) override { g_modifiers = m_state = bitfield_disable( m_state, type ); - m_selector.setState( m_state ); + if( this == m_latestObserver ) + onMouseMotion( m_latestPosition, m_state ); } DeviceVector device( WindowVector window ) const { return window_to_normalised_device( window, m_width, m_height );