Try reusing the TOOL_DISPATCHER menu hack for libtree previews.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/16493
This commit is contained in:
parent
23f35e1c8b
commit
169ece3b71
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013 CERN
|
* Copyright (C) 2013 CERN
|
||||||
* Copyright (C) 2013-2023 KiCad Developers, see CHANGELOG.txt for contributors.
|
* Copyright (C) 2013-2024 KiCad Developers, see CHANGELOG.txt for contributors.
|
||||||
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
@ -115,17 +115,16 @@ struct TOOL_DISPATCHER::BUTTON_STATE
|
||||||
return mouseState.Aux2IsDown();
|
return mouseState.Aux2IsDown();
|
||||||
|
|
||||||
default:
|
default:
|
||||||
assert( false );
|
wxFAIL_MSG( wxT( "unknown button" ) );
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
TOOL_DISPATCHER::TOOL_DISPATCHER( TOOL_MANAGER* aToolMgr ) :
|
TOOL_DISPATCHER::TOOL_DISPATCHER( TOOL_MANAGER* aToolMgr ) :
|
||||||
m_toolMgr( aToolMgr )
|
m_toolMgr( aToolMgr ),
|
||||||
|
m_currentMenu( nullptr )
|
||||||
{
|
{
|
||||||
m_sysDragMinX = wxSystemSettings::GetMetric( wxSYS_DRAG_X );
|
m_sysDragMinX = wxSystemSettings::GetMetric( wxSYS_DRAG_X );
|
||||||
m_sysDragMinY = wxSystemSettings::GetMetric( wxSYS_DRAG_Y );
|
m_sysDragMinY = wxSystemSettings::GetMetric( wxSYS_DRAG_Y );
|
||||||
|
@ -550,8 +549,6 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
|
||||||
// hotkey. So we keep track of menu highlighting so we can differentiate.
|
// hotkey. So we keep track of menu highlighting so we can differentiate.
|
||||||
//
|
//
|
||||||
|
|
||||||
static ACTION_MENU* currentMenu;
|
|
||||||
|
|
||||||
wxMenuEvent* tmp = dynamic_cast<wxMenuEvent*>( &aEvent );
|
wxMenuEvent* tmp = dynamic_cast<wxMenuEvent*>( &aEvent );
|
||||||
|
|
||||||
wxCHECK( tmp, /* void */ );
|
wxCHECK( tmp, /* void */ );
|
||||||
|
@ -560,22 +557,22 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
|
||||||
|
|
||||||
if( type == wxEVT_MENU_OPEN )
|
if( type == wxEVT_MENU_OPEN )
|
||||||
{
|
{
|
||||||
currentMenu = dynamic_cast<ACTION_MENU*>( menuEvent.GetMenu() );
|
m_currentMenu = dynamic_cast<ACTION_MENU*>( menuEvent.GetMenu() );
|
||||||
|
|
||||||
if( currentMenu )
|
if( m_currentMenu )
|
||||||
currentMenu->OnMenuEvent( menuEvent );
|
m_currentMenu->OnMenuEvent( menuEvent );
|
||||||
}
|
}
|
||||||
else if( type == wxEVT_MENU_HIGHLIGHT )
|
else if( type == wxEVT_MENU_HIGHLIGHT )
|
||||||
{
|
{
|
||||||
if( currentMenu )
|
if( m_currentMenu )
|
||||||
currentMenu->OnMenuEvent( menuEvent );
|
m_currentMenu->OnMenuEvent( menuEvent );
|
||||||
}
|
}
|
||||||
else if( type == wxEVT_MENU_CLOSE )
|
else if( type == wxEVT_MENU_CLOSE )
|
||||||
{
|
{
|
||||||
if( currentMenu )
|
if( m_currentMenu )
|
||||||
currentMenu->OnMenuEvent( menuEvent );
|
m_currentMenu->OnMenuEvent( menuEvent );
|
||||||
|
|
||||||
currentMenu = nullptr;
|
m_currentMenu = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
aEvent.Skip();
|
aEvent.Skip();
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
|
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
|
||||||
* Copyright (C) 2014-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2014-2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -32,6 +32,7 @@
|
||||||
#include <tool/tool_manager.h>
|
#include <tool/tool_manager.h>
|
||||||
#include <tool/action_manager.h>
|
#include <tool/action_manager.h>
|
||||||
#include <tool/actions.h>
|
#include <tool/actions.h>
|
||||||
|
#include <tool/tool_dispatcher.h>
|
||||||
#include <widgets/wx_dataviewctrl.h>
|
#include <widgets/wx_dataviewctrl.h>
|
||||||
#include <wx/settings.h>
|
#include <wx/settings.h>
|
||||||
#include <wx/sizer.h>
|
#include <wx/sizer.h>
|
||||||
|
@ -752,7 +753,9 @@ void LIB_TREE::onHoverTimer( wxTimerEvent& aEvent )
|
||||||
{
|
{
|
||||||
hidePreview();
|
hidePreview();
|
||||||
|
|
||||||
if( !m_tree_ctrl->IsShownOnScreen() || m_previewDisabled )
|
TOOL_DISPATCHER* toolDispatcher = m_adapter->GetToolDispatcher();
|
||||||
|
|
||||||
|
if( !m_tree_ctrl->IsShownOnScreen() || m_previewDisabled || toolDispatcher->GetCurrentMenu() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wxDataViewItem item;
|
wxDataViewItem item;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* Copyright (C) 2017 Chris Pavlina <pavlina.chris@gmail.com>
|
* Copyright (C) 2017 Chris Pavlina <pavlina.chris@gmail.com>
|
||||||
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
|
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
|
||||||
* Copyright (C) 2023 CERN
|
* Copyright (C) 2023 CERN
|
||||||
* Copyright (C) 2014-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2014-2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify it
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License as published by the
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
@ -23,6 +23,7 @@
|
||||||
#ifndef LIB_TREE_MODEL_ADAPTER_H
|
#ifndef LIB_TREE_MODEL_ADAPTER_H
|
||||||
#define LIB_TREE_MODEL_ADAPTER_H
|
#define LIB_TREE_MODEL_ADAPTER_H
|
||||||
|
|
||||||
|
#include <eda_base_frame.h>
|
||||||
#include <lib_id.h>
|
#include <lib_id.h>
|
||||||
#include <lib_tree_model.h>
|
#include <lib_tree_model.h>
|
||||||
#include <wx/hashmap.h>
|
#include <wx/hashmap.h>
|
||||||
|
@ -259,6 +260,8 @@ public:
|
||||||
virtual bool HasPreview( const wxDataViewItem& aItem ) { return false; }
|
virtual bool HasPreview( const wxDataViewItem& aItem ) { return false; }
|
||||||
virtual void ShowPreview( wxWindow* aParent, const wxDataViewItem& aItem ) {}
|
virtual void ShowPreview( wxWindow* aParent, const wxDataViewItem& aItem ) {}
|
||||||
|
|
||||||
|
TOOL_DISPATCHER* GetToolDispatcher() const { return m_parent->GetToolDispatcher(); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the number of symbols loaded in the tree.
|
* Return the number of symbols loaded in the tree.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013 CERN
|
* Copyright (C) 2013 CERN
|
||||||
* Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2020-2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
||||||
*
|
*
|
||||||
|
@ -24,8 +24,8 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __TOOL_DISPATCHER_H
|
#ifndef TOOL_DISPATCHER_H
|
||||||
#define __TOOL_DISPATCHER_H
|
#define TOOL_DISPATCHER_H
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <wx/event.h>
|
#include <wx/event.h>
|
||||||
|
@ -34,6 +34,7 @@
|
||||||
class TOOL_MANAGER;
|
class TOOL_MANAGER;
|
||||||
class PCB_BASE_FRAME;
|
class PCB_BASE_FRAME;
|
||||||
class ACTIONS;
|
class ACTIONS;
|
||||||
|
class ACTION_MENU;
|
||||||
|
|
||||||
namespace KIGFX
|
namespace KIGFX
|
||||||
{
|
{
|
||||||
|
@ -76,24 +77,15 @@ public:
|
||||||
*/
|
*/
|
||||||
std::optional<TOOL_EVENT> GetToolEvent( wxKeyEvent* aKeyEvent, bool* aSpecialKeyFlag );
|
std::optional<TOOL_EVENT> GetToolEvent( wxKeyEvent* aKeyEvent, bool* aSpecialKeyFlag );
|
||||||
|
|
||||||
|
ACTION_MENU* GetCurrentMenu() const { return m_currentMenu; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
///< The time threshold for a mouse button press that distinguishes between a single mouse
|
|
||||||
///< click and a beginning of drag event (expressed in milliseconds).
|
|
||||||
static const int DragTimeThreshold = 300;
|
|
||||||
|
|
||||||
///< The distance threshold for mouse cursor that distinguishes between a single mouse click
|
|
||||||
///< and a beginning of drag event (expressed in screen pixels).
|
|
||||||
///< System drag preferences take precedence if available
|
|
||||||
static const int DragDistanceThreshold = 8;
|
|
||||||
|
|
||||||
///< Mininum distance before drag is activated in the X axis
|
|
||||||
int m_sysDragMinX;
|
|
||||||
///< Maximum distance before drag is activated in the Y axis
|
|
||||||
int m_sysDragMinY;
|
|
||||||
|
|
||||||
///< Handles mouse related events (click, motion, dragging).
|
///< Handles mouse related events (click, motion, dragging).
|
||||||
bool handleMouseButton( wxEvent& aEvent, int aIndex, bool aMotion );
|
bool handleMouseButton( wxEvent& aEvent, int aIndex, bool aMotion );
|
||||||
|
|
||||||
|
///< Returns the instance of VIEW, used by the application.
|
||||||
|
KIGFX::VIEW* getView();
|
||||||
|
|
||||||
///< Saves the state of key modifiers (Alt, Ctrl and so on).
|
///< Saves the state of key modifiers (Alt, Ctrl and so on).
|
||||||
static int decodeModifiers( const wxKeyboardState* aState )
|
static int decodeModifiers( const wxKeyboardState* aState )
|
||||||
{
|
{
|
||||||
|
@ -111,23 +103,31 @@ private:
|
||||||
return mods;
|
return mods;
|
||||||
}
|
}
|
||||||
|
|
||||||
///< Stores all the information regarding a mouse button state.
|
private:
|
||||||
struct BUTTON_STATE;
|
///< The time threshold for a mouse button press that distinguishes between a single mouse
|
||||||
|
///< click and a beginning of drag event (expressed in milliseconds).
|
||||||
|
static const int DragTimeThreshold = 300;
|
||||||
|
|
||||||
///< The last mouse cursor position (in world coordinates).
|
///< The distance threshold for mouse cursor that distinguishes between a single mouse click
|
||||||
VECTOR2D m_lastMousePos;
|
///< and a beginning of drag event (expressed in screen pixels).
|
||||||
|
///< System drag preferences take precedence if available
|
||||||
|
static const int DragDistanceThreshold = 8;
|
||||||
|
|
||||||
///< The last mouse cursor position (in screen coordinates).
|
int m_sysDragMinX; ///< Mininum distance before drag is activated in the X axis
|
||||||
VECTOR2D m_lastMousePosScreen;
|
int m_sysDragMinY; ///< Maximum distance before drag is activated in the Y axis
|
||||||
|
|
||||||
|
VECTOR2D m_lastMousePos; ///< The last mouse cursor position (in world coordinates).
|
||||||
|
VECTOR2D m_lastMousePosScreen; ///< The last mouse cursor position (in screen coordinates).
|
||||||
|
|
||||||
///< State of mouse buttons.
|
///< State of mouse buttons.
|
||||||
|
struct BUTTON_STATE;
|
||||||
std::vector<BUTTON_STATE*> m_buttons;
|
std::vector<BUTTON_STATE*> m_buttons;
|
||||||
|
|
||||||
///< Returns the instance of VIEW, used by the application.
|
|
||||||
KIGFX::VIEW* getView();
|
|
||||||
|
|
||||||
///< Instance of tool manager that cooperates with the dispatcher.
|
///< Instance of tool manager that cooperates with the dispatcher.
|
||||||
TOOL_MANAGER* m_toolMgr;
|
TOOL_MANAGER* m_toolMgr;
|
||||||
|
|
||||||
|
///< The menu from the main menubar currently shown (if any; nullptr otherwise)
|
||||||
|
ACTION_MENU* m_currentMenu;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif // TOOL_DISPATCHER_H
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2020-2024 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -54,6 +54,8 @@ public:
|
||||||
*/
|
*/
|
||||||
TOOL_MANAGER* GetToolManager() const { return m_toolManager; }
|
TOOL_MANAGER* GetToolManager() const { return m_toolManager; }
|
||||||
|
|
||||||
|
TOOL_DISPATCHER* GetToolDispatcher() const { return m_toolDispatcher; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register an action's update conditions with the UI layer to allow the UI to appropriately
|
* Register an action's update conditions with the UI layer to allow the UI to appropriately
|
||||||
* display the state of its controls.
|
* display the state of its controls.
|
||||||
|
|
Loading…
Reference in New Issue