ADDED: support for 45 degree crosshairs

Fixes https://gitlab.com/kicad/code/kicad/-/issues/6047
This commit is contained in:
Seth Hillbrand 2025-08-22 18:19:28 -07:00
parent d02358da2f
commit 26f0c03e61
85 changed files with 1233 additions and 130 deletions

View File

@ -448,6 +448,8 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
aBitmapInfoCache[BITMAPS::convert].emplace_back( BITMAPS::convert, wxT( "convert_24.png" ), 24, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::copy].emplace_back( BITMAPS::copy, wxT( "copy_24.png" ), 24, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::copy_pad_settings].emplace_back( BITMAPS::copy_pad_settings, wxT( "copy_pad_settings_24.png" ), 24, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen].emplace_back( BITMAPS::cursor_fullscreen, wxT( "cursor_fullscreen_24.png" ), 24, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen45].emplace_back( BITMAPS::cursor_fullscreen45, wxT( "cursor_fullscreen45_24.png" ), 24, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_shape].emplace_back( BITMAPS::cursor_shape, wxT( "cursor_shape_24.png" ), 24, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor].emplace_back( BITMAPS::cursor, wxT( "cursor_24.png" ), 24, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::custom_pad_to_primitives].emplace_back( BITMAPS::custom_pad_to_primitives, wxT( "custom_pad_to_primitives_24.png" ), 24, wxT( "light" ) );
@ -885,6 +887,8 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
aBitmapInfoCache[BITMAPS::convert].emplace_back( BITMAPS::convert, wxT( "convert_dark_24.png" ), 24, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::copy].emplace_back( BITMAPS::copy, wxT( "copy_dark_24.png" ), 24, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::copy_pad_settings].emplace_back( BITMAPS::copy_pad_settings, wxT( "copy_pad_settings_dark_24.png" ), 24, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen].emplace_back( BITMAPS::cursor_fullscreen, wxT( "cursor_fullscreen_dark_24.png" ), 24, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen45].emplace_back( BITMAPS::cursor_fullscreen45, wxT( "cursor_fullscreen45_dark_24.png" ), 24, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_shape].emplace_back( BITMAPS::cursor_shape, wxT( "cursor_shape_dark_24.png" ), 24, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor].emplace_back( BITMAPS::cursor, wxT( "cursor_dark_24.png" ), 24, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::custom_pad_to_primitives].emplace_back( BITMAPS::custom_pad_to_primitives, wxT( "custom_pad_to_primitives_dark_24.png" ), 24, wxT( "dark" ) );
@ -1322,6 +1326,8 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
aBitmapInfoCache[BITMAPS::convert].emplace_back( BITMAPS::convert, wxT( "convert_16.png" ), 16, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::copy].emplace_back( BITMAPS::copy, wxT( "copy_16.png" ), 16, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::copy_pad_settings].emplace_back( BITMAPS::copy_pad_settings, wxT( "copy_pad_settings_16.png" ), 16, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen].emplace_back( BITMAPS::cursor_fullscreen, wxT( "cursor_fullscreen_16.png" ), 16, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen45].emplace_back( BITMAPS::cursor_fullscreen45, wxT( "cursor_fullscreen45_16.png" ), 16, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_shape].emplace_back( BITMAPS::cursor_shape, wxT( "cursor_shape_16.png" ), 16, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor].emplace_back( BITMAPS::cursor, wxT( "cursor_16.png" ), 16, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::custom_pad_to_primitives].emplace_back( BITMAPS::custom_pad_to_primitives, wxT( "custom_pad_to_primitives_16.png" ), 16, wxT( "light" ) );
@ -1759,6 +1765,8 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
aBitmapInfoCache[BITMAPS::convert].emplace_back( BITMAPS::convert, wxT( "convert_dark_16.png" ), 16, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::copy].emplace_back( BITMAPS::copy, wxT( "copy_dark_16.png" ), 16, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::copy_pad_settings].emplace_back( BITMAPS::copy_pad_settings, wxT( "copy_pad_settings_dark_16.png" ), 16, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen].emplace_back( BITMAPS::cursor_fullscreen, wxT( "cursor_fullscreen_dark_16.png" ), 16, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen45].emplace_back( BITMAPS::cursor_fullscreen45, wxT( "cursor_fullscreen45_dark_16.png" ), 16, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_shape].emplace_back( BITMAPS::cursor_shape, wxT( "cursor_shape_dark_16.png" ), 16, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor].emplace_back( BITMAPS::cursor, wxT( "cursor_dark_16.png" ), 16, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::custom_pad_to_primitives].emplace_back( BITMAPS::custom_pad_to_primitives, wxT( "custom_pad_to_primitives_dark_16.png" ), 16, wxT( "dark" ) );
@ -2196,6 +2204,8 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
aBitmapInfoCache[BITMAPS::convert].emplace_back( BITMAPS::convert, wxT( "convert_32.png" ), 32, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::copy].emplace_back( BITMAPS::copy, wxT( "copy_32.png" ), 32, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::copy_pad_settings].emplace_back( BITMAPS::copy_pad_settings, wxT( "copy_pad_settings_32.png" ), 32, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen].emplace_back( BITMAPS::cursor_fullscreen, wxT( "cursor_fullscreen_32.png" ), 32, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen45].emplace_back( BITMAPS::cursor_fullscreen45, wxT( "cursor_fullscreen45_32.png" ), 32, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_shape].emplace_back( BITMAPS::cursor_shape, wxT( "cursor_shape_32.png" ), 32, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor].emplace_back( BITMAPS::cursor, wxT( "cursor_32.png" ), 32, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::custom_pad_to_primitives].emplace_back( BITMAPS::custom_pad_to_primitives, wxT( "custom_pad_to_primitives_32.png" ), 32, wxT( "light" ) );
@ -2633,6 +2643,8 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
aBitmapInfoCache[BITMAPS::convert].emplace_back( BITMAPS::convert, wxT( "convert_dark_32.png" ), 32, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::copy].emplace_back( BITMAPS::copy, wxT( "copy_dark_32.png" ), 32, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::copy_pad_settings].emplace_back( BITMAPS::copy_pad_settings, wxT( "copy_pad_settings_dark_32.png" ), 32, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen].emplace_back( BITMAPS::cursor_fullscreen, wxT( "cursor_fullscreen_dark_32.png" ), 32, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen45].emplace_back( BITMAPS::cursor_fullscreen45, wxT( "cursor_fullscreen45_dark_32.png" ), 32, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_shape].emplace_back( BITMAPS::cursor_shape, wxT( "cursor_shape_dark_32.png" ), 32, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor].emplace_back( BITMAPS::cursor, wxT( "cursor_dark_32.png" ), 32, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::custom_pad_to_primitives].emplace_back( BITMAPS::custom_pad_to_primitives, wxT( "custom_pad_to_primitives_dark_32.png" ), 32, wxT( "dark" ) );
@ -3070,6 +3082,8 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
aBitmapInfoCache[BITMAPS::convert].emplace_back( BITMAPS::convert, wxT( "convert_48.png" ), 48, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::copy].emplace_back( BITMAPS::copy, wxT( "copy_48.png" ), 48, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::copy_pad_settings].emplace_back( BITMAPS::copy_pad_settings, wxT( "copy_pad_settings_48.png" ), 48, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen].emplace_back( BITMAPS::cursor_fullscreen, wxT( "cursor_fullscreen_48.png" ), 48, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen45].emplace_back( BITMAPS::cursor_fullscreen45, wxT( "cursor_fullscreen45_48.png" ), 48, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_shape].emplace_back( BITMAPS::cursor_shape, wxT( "cursor_shape_48.png" ), 48, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor].emplace_back( BITMAPS::cursor, wxT( "cursor_48.png" ), 48, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::custom_pad_to_primitives].emplace_back( BITMAPS::custom_pad_to_primitives, wxT( "custom_pad_to_primitives_48.png" ), 48, wxT( "light" ) );
@ -3507,6 +3521,8 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
aBitmapInfoCache[BITMAPS::convert].emplace_back( BITMAPS::convert, wxT( "convert_dark_48.png" ), 48, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::copy].emplace_back( BITMAPS::copy, wxT( "copy_dark_48.png" ), 48, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::copy_pad_settings].emplace_back( BITMAPS::copy_pad_settings, wxT( "copy_pad_settings_dark_48.png" ), 48, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen].emplace_back( BITMAPS::cursor_fullscreen, wxT( "cursor_fullscreen_dark_48.png" ), 48, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen45].emplace_back( BITMAPS::cursor_fullscreen45, wxT( "cursor_fullscreen45_dark_48.png" ), 48, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_shape].emplace_back( BITMAPS::cursor_shape, wxT( "cursor_shape_dark_48.png" ), 48, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor].emplace_back( BITMAPS::cursor, wxT( "cursor_dark_48.png" ), 48, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::custom_pad_to_primitives].emplace_back( BITMAPS::custom_pad_to_primitives, wxT( "custom_pad_to_primitives_dark_48.png" ), 48, wxT( "dark" ) );
@ -3944,6 +3960,8 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
aBitmapInfoCache[BITMAPS::convert].emplace_back( BITMAPS::convert, wxT( "convert_64.png" ), 64, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::copy].emplace_back( BITMAPS::copy, wxT( "copy_64.png" ), 64, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::copy_pad_settings].emplace_back( BITMAPS::copy_pad_settings, wxT( "copy_pad_settings_64.png" ), 64, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen].emplace_back( BITMAPS::cursor_fullscreen, wxT( "cursor_fullscreen_64.png" ), 64, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen45].emplace_back( BITMAPS::cursor_fullscreen45, wxT( "cursor_fullscreen45_64.png" ), 64, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor_shape].emplace_back( BITMAPS::cursor_shape, wxT( "cursor_shape_64.png" ), 64, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::cursor].emplace_back( BITMAPS::cursor, wxT( "cursor_64.png" ), 64, wxT( "light" ) );
aBitmapInfoCache[BITMAPS::custom_pad_to_primitives].emplace_back( BITMAPS::custom_pad_to_primitives, wxT( "custom_pad_to_primitives_64.png" ), 64, wxT( "light" ) );
@ -4381,6 +4399,8 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
aBitmapInfoCache[BITMAPS::convert].emplace_back( BITMAPS::convert, wxT( "convert_dark_64.png" ), 64, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::copy].emplace_back( BITMAPS::copy, wxT( "copy_dark_64.png" ), 64, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::copy_pad_settings].emplace_back( BITMAPS::copy_pad_settings, wxT( "copy_pad_settings_dark_64.png" ), 64, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen].emplace_back( BITMAPS::cursor_fullscreen, wxT( "cursor_fullscreen_dark_64.png" ), 64, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_fullscreen45].emplace_back( BITMAPS::cursor_fullscreen45, wxT( "cursor_fullscreen45_dark_64.png" ), 64, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor_shape].emplace_back( BITMAPS::cursor_shape, wxT( "cursor_shape_dark_64.png" ), 64, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::cursor].emplace_back( BITMAPS::cursor, wxT( "cursor_dark_64.png" ), 64, wxT( "dark" ) );
aBitmapInfoCache[BITMAPS::custom_pad_to_primitives].emplace_back( BITMAPS::custom_pad_to_primitives, wxT( "custom_pad_to_primitives_dark_64.png" ), 64, wxT( "dark" ) );

View File

@ -1203,11 +1203,20 @@ void CAIRO_GAL_BASE::blitCursor( wxMemoryDC& clientDC )
255 );
clientDC.SetPen( wxPen( color ) );
if( m_fullscreenCursor )
if( m_crossHairMode == CROSS_HAIR_MODE::FULLSCREEN_CROSS )
{
clientDC.DrawLine( 0, p.y, m_screenSize.x, p.y );
clientDC.DrawLine( p.x, 0, p.x, m_screenSize.y );
}
else if( m_crossHairMode == CROSS_HAIR_MODE::FULLSCREEN_DIAGONAL )
{
// Oversized but that's ok
int diagonalSize = m_screenSize.x + m_screenSize.y;
clientDC.DrawLine( p.x - diagonalSize, p.y - diagonalSize,
p.x + diagonalSize, p.y + diagonalSize );
clientDC.DrawLine( p.x - diagonalSize, p.y + diagonalSize,
p.x + diagonalSize, p.y - diagonalSize );
}
else
{
const int cursorSize = 80;

View File

@ -50,7 +50,7 @@ GAL_DISPLAY_OPTIONS::GAL_DISPLAY_OPTIONS()
m_gridLineWidth( 1.0 ),
m_gridMinSpacing( 10.0 ),
m_axesEnabled( false ),
m_fullscreenCursor( false ),
m_crossHairMode( CROSS_HAIR_MODE::SMALL_CROSS ),
m_forceDisplayCursor( false ),
m_scaleFactor( DPI_SCALING::GetDefaultScaleFactor() )
{

View File

@ -79,7 +79,7 @@ GAL::GAL( GAL_DISPLAY_OPTIONS& aDisplayOptions ) :
// Initialize the cursor shape
SetCursorColor( COLOR4D( 1.0, 1.0, 1.0, 1.0 ) );
m_fullscreenCursor = false;
m_crossHairMode = CROSS_HAIR_MODE::SMALL_CROSS;
m_forceDisplayCursor = false;
SetCursorEnabled( false );
@ -142,9 +142,9 @@ bool GAL::updatedGalDisplayOptions( const GAL_DISPLAY_OPTIONS& aOptions )
refresh = true;
}
if( m_options.m_fullscreenCursor != m_fullscreenCursor )
if( m_options.GetCursorMode() != m_crossHairMode )
{
m_fullscreenCursor = m_options.m_fullscreenCursor;
m_crossHairMode = m_options.GetCursorMode();
refresh = true;
}

View File

@ -2648,12 +2648,12 @@ void OPENGL_GAL::blitCursor()
VECTOR2D cursorEnd;
VECTOR2D cursorCenter = m_cursorPosition;
if( m_fullscreenCursor )
if( m_crossHairMode == CROSS_HAIR_MODE::FULLSCREEN_CROSS )
{
cursorBegin = m_screenWorldMatrix * VECTOR2D( 0.0, 0.0 );
cursorEnd = m_screenWorldMatrix * VECTOR2D( m_screenSize );
}
else
else if( m_crossHairMode == CROSS_HAIR_MODE::SMALL_CROSS )
{
const int cursorSize = 80;
cursorBegin = m_cursorPosition - cursorSize / ( 2 * m_worldScale );
@ -2671,11 +2671,46 @@ void OPENGL_GAL::blitCursor()
glColor4d( color.r, color.g, color.b, color.a );
glBegin( GL_LINES );
glVertex2d( cursorCenter.x, cursorBegin.y );
glVertex2d( cursorCenter.x, cursorEnd.y );
glVertex2d( cursorBegin.x, cursorCenter.y );
glVertex2d( cursorEnd.x, cursorCenter.y );
if( m_crossHairMode == CROSS_HAIR_MODE::FULLSCREEN_DIAGONAL )
{
// Calculate screen bounds in world coordinates
VECTOR2D screenTopLeft = m_screenWorldMatrix * VECTOR2D( 0.0, 0.0 );
VECTOR2D screenBottomRight = m_screenWorldMatrix * VECTOR2D( m_screenSize );
// For 45-degree lines passing through cursor position
// Line equation: y = x + (cy - cx) for positive slope
// Line equation: y = -x + (cy + cx) for negative slope
double cx = m_cursorPosition.x;
double cy = m_cursorPosition.y;
// Calculate intersections for positive slope diagonal (y = x + offset)
double offset1 = cy - cx;
VECTOR2D pos_start( screenTopLeft.x, screenTopLeft.x + offset1 );
VECTOR2D pos_end( screenBottomRight.x, screenBottomRight.x + offset1 );
// Draw positive slope diagonal
glVertex2d( pos_start.x, pos_start.y );
glVertex2d( pos_end.x, pos_end.y );
// Calculate intersections for negative slope diagonal (y = -x + offset)
double offset2 = cy + cx;
VECTOR2D neg_start( screenTopLeft.x, offset2 - screenTopLeft.x );
VECTOR2D neg_end( screenBottomRight.x, offset2 - screenBottomRight.x );
// Draw negative slope diagonal
glVertex2d( neg_start.x, neg_start.y );
glVertex2d( neg_end.x, neg_end.y );
}
else
{
glVertex2d( cursorCenter.x, cursorBegin.y );
glVertex2d( cursorCenter.x, cursorEnd.y );
glVertex2d( cursorBegin.x, cursorCenter.y );
glVertex2d( cursorEnd.x, cursorCenter.y );
}
glEnd();
}

View File

@ -71,7 +71,7 @@ void GAL_DISPLAY_OPTIONS_IMPL::ReadWindowSettings( WINDOW_SETTINGS& aCfg )
m_gridMinSpacing = aCfg.grid.min_spacing;
m_axesEnabled = aCfg.grid.axes_enabled;
m_fullscreenCursor = aCfg.cursor.fullscreen_cursor;
m_crossHairMode = aCfg.cursor.cross_hair_mode;
m_forceDisplayCursor = aCfg.cursor.always_show_cursor;
NotifyChanged();
@ -112,7 +112,7 @@ void GAL_DISPLAY_OPTIONS_IMPL::WriteConfig( WINDOW_SETTINGS& aCfg )
aCfg.grid.line_width = m_gridLineWidth;
aCfg.grid.min_spacing = m_gridMinSpacing;
aCfg.grid.axes_enabled = m_axesEnabled;
aCfg.cursor.fullscreen_cursor = m_fullscreenCursor;
aCfg.cursor.cross_hair_mode = m_crossHairMode;
aCfg.cursor.always_show_cursor = m_forceDisplayCursor;
}

View File

@ -21,6 +21,7 @@
#include <class_draw_panel_gal.h>
#include <common.h>
#include <eda_units.h>
#include <gal/gal_display_options.h>
#include <layer_ids.h>
#include <pgm_base.h>
#include <settings/app_settings.h>
@ -386,8 +387,8 @@ bool APP_SETTINGS_BASE::migrateWindowConfig( wxConfigBase* aCfg, const std::stri
ret &= fromLegacy<bool>( aCfg, frameGDO + "ForceDisplayCursor",
cursorPath + ".always_show_cursor" );
ret &= fromLegacy<bool>( aCfg, frameGDO + "CursorFullscreen",
cursorPath + ".fullscreen_cursor" );
ret &= fromLegacy<int>( aCfg, frameGDO + "CursorFullscreen",
cursorPath + ".cross_hair_mode" );
ret &= fromLegacy<int>( aCfg, aFrame + "_LastGridSize", gridPath + ".last_size" );
@ -539,8 +540,8 @@ void APP_SETTINGS_BASE::addParamsForWindow( WINDOW_SETTINGS* aWindow, const std:
m_params.emplace_back( new PARAM<bool>( aJsonPath + ".cursor.always_show_cursor",
&aWindow->cursor.always_show_cursor, true ) );
m_params.emplace_back( new PARAM<bool>( aJsonPath + ".cursor.fullscreen_cursor",
&aWindow->cursor.fullscreen_cursor, false ) );
m_params.emplace_back( new PARAM<KIGFX::CROSS_HAIR_MODE>( aJsonPath + ".cursor.cross_hair_mode",
&aWindow->cursor.cross_hair_mode, KIGFX::CROSS_HAIR_MODE::SMALL_CROSS ) );
}

View File

@ -651,6 +651,8 @@ template KICOMMON_API std::optional<wxRect>
JSON_SETTINGS::Get<wxRect>( const std::string& aPath ) const;
template KICOMMON_API std::optional<wxAuiPaneInfo>
JSON_SETTINGS::Get<wxAuiPaneInfo>( const std::string& aPath ) const;
template KICOMMON_API std::optional<KIGFX::CROSS_HAIR_MODE>
JSON_SETTINGS::Get<KIGFX::CROSS_HAIR_MODE>( const std::string& aPath ) const;
template<typename ValueType>
void JSON_SETTINGS::Set( const std::string& aPath, ValueType aVal )
@ -688,6 +690,8 @@ template KICOMMON_API void JSON_SETTINGS::Set<wxSize>( const std::string& aPath,
template KICOMMON_API void JSON_SETTINGS::Set<wxRect>( const std::string& aPath, wxRect aValue );
template KICOMMON_API void JSON_SETTINGS::Set<wxAuiPaneInfo>( const std::string& aPath,
wxAuiPaneInfo aValue );
template KICOMMON_API void JSON_SETTINGS::Set<KIGFX::CROSS_HAIR_MODE>( const std::string& aPath,
KIGFX::CROSS_HAIR_MODE aValue );
void JSON_SETTINGS::registerMigration( int aOldSchemaVersion, int aNewSchemaVersion,

View File

@ -1169,14 +1169,30 @@ TOOL_ACTION ACTIONS::toggleCursor( TOOL_ACTION_ARGS()
.Tooltip( _( "Display crosshairs even when not drawing objects" ) )
.Icon( BITMAPS::cursor ) );
TOOL_ACTION ACTIONS::toggleCursorStyle( TOOL_ACTION_ARGS()
.Name( "common.Control.toggleCursorStyle" )
TOOL_ACTION ACTIONS::cursorSmallCrosshairs( TOOL_ACTION_ARGS()
.Name( "common.Control.cursorSmallCrosshairs" )
.Scope( AS_GLOBAL )
.FriendlyName( _( "Full-Window Crosshairs" ) )
.Tooltip( _( "Switch display of full-window crosshairs" ) )
.FriendlyName( _( "Small crosshairs" ) )
.Tooltip( _( "Use small crosshairs aligned at 0 and 90 degrees" ) )
.ToolbarState( TOOLBAR_STATE::TOGGLE )
.Icon( BITMAPS::cursor_shape ) );
TOOL_ACTION ACTIONS::cursorFullCrosshairs( TOOL_ACTION_ARGS()
.Name( "common.Control.cursorFullCrosshairs" )
.Scope( AS_GLOBAL )
.FriendlyName( _( "Full-Window Crosshairs" ) )
.Tooltip( _( "Display full-window crosshairs aligned at 0 and 90 degrees" ) )
.ToolbarState( TOOLBAR_STATE::TOGGLE )
.Icon( BITMAPS::cursor_fullscreen ) );
TOOL_ACTION ACTIONS::cursor45Crosshairs( TOOL_ACTION_ARGS()
.Name( "common.Control.cursor45Crosshairs" )
.Scope( AS_GLOBAL )
.FriendlyName( _( "45 Degree Crosshairs" ) )
.Tooltip( _( "Display full-window crosshairs aligned at 45 and 135 degrees" ) )
.ToolbarState( TOOLBAR_STATE::TOGGLE )
.Icon( BITMAPS::cursor_fullscreen45 ) );
TOOL_ACTION ACTIONS::highContrastMode( TOOL_ACTION_ARGS()
.Name( "common.Control.highContrastMode" )
.Scope( AS_GLOBAL )

View File

@ -710,11 +710,35 @@ int COMMON_TOOLS::ToggleCursor( const TOOL_EVENT& aEvent )
}
int COMMON_TOOLS::ToggleCursorStyle( const TOOL_EVENT& aEvent )
int COMMON_TOOLS::CursorSmallCrosshairs( const TOOL_EVENT& aEvent )
{
GAL_DISPLAY_OPTIONS_IMPL& galOpts = m_frame->GetGalDisplayOptions();
galOpts.m_fullscreenCursor = !galOpts.m_fullscreenCursor;
galOpts.SetCursorMode( KIGFX::CROSS_HAIR_MODE::SMALL_CROSS );
galOpts.WriteConfig( *m_frame->GetWindowSettings( m_toolMgr->GetSettings() ) );
galOpts.NotifyChanged();
return 0;
}
int COMMON_TOOLS::CursorFullCrosshairs( const TOOL_EVENT& aEvent )
{
GAL_DISPLAY_OPTIONS_IMPL& galOpts = m_frame->GetGalDisplayOptions();
galOpts.SetCursorMode( KIGFX::CROSS_HAIR_MODE::FULLSCREEN_CROSS );
galOpts.WriteConfig( *m_frame->GetWindowSettings( m_toolMgr->GetSettings() ) );
galOpts.NotifyChanged();
return 0;
}
int COMMON_TOOLS::Cursor45Crosshairs( const TOOL_EVENT& aEvent )
{
GAL_DISPLAY_OPTIONS_IMPL& galOpts = m_frame->GetGalDisplayOptions();
galOpts.SetCursorMode( KIGFX::CROSS_HAIR_MODE::FULLSCREEN_DIAGONAL );
galOpts.WriteConfig( *m_frame->GetWindowSettings( m_toolMgr->GetSettings() ) );
galOpts.NotifyChanged();
@ -800,6 +824,8 @@ void COMMON_TOOLS::setTransitions()
// Misc
Go( &COMMON_TOOLS::ToggleCursor, ACTIONS::toggleCursor.MakeEvent() );
Go( &COMMON_TOOLS::ToggleCursorStyle, ACTIONS::toggleCursorStyle.MakeEvent() );
Go( &COMMON_TOOLS::CursorSmallCrosshairs, ACTIONS::cursorSmallCrosshairs.MakeEvent() );
Go( &COMMON_TOOLS::CursorFullCrosshairs, ACTIONS::cursorFullCrosshairs.MakeEvent() );
Go( &COMMON_TOOLS::Cursor45Crosshairs, ACTIONS::cursor45Crosshairs.MakeEvent() );
Go( &COMMON_TOOLS::ToggleBoundingBoxes, ACTIONS::toggleBoundingBoxes.MakeEvent() );
}

View File

@ -28,6 +28,7 @@
#include <class_draw_panel_gal.h>
#include <eda_base_frame.h>
#include <eda_draw_frame.h>
#include <gal/gal_display_options.h>
#include <tool/editor_conditions.h>
#include <tool/selection.h>
@ -106,14 +107,36 @@ SELECTION_CONDITION EDITOR_CONDITIONS::PolarCoordinates()
}
SELECTION_CONDITION EDITOR_CONDITIONS::FullscreenCursor()
SELECTION_CONDITION EDITOR_CONDITIONS::CursorSmallCrosshairs()
{
// The fullscreen cursor requires a draw frame
EDA_DRAW_FRAME* drwFrame = dynamic_cast<EDA_DRAW_FRAME*>( m_frame );
wxASSERT( drwFrame );
return std::bind( &EDITOR_CONDITIONS::cursorFunc, _1, drwFrame );
return std::bind( &EDITOR_CONDITIONS::cursorFunc, _1, drwFrame,
KIGFX::CROSS_HAIR_MODE::SMALL_CROSS );
}
SELECTION_CONDITION EDITOR_CONDITIONS::CursorFullCrosshairs()
{
EDA_DRAW_FRAME* drwFrame = dynamic_cast<EDA_DRAW_FRAME*>( m_frame );
wxASSERT( drwFrame );
return std::bind( &EDITOR_CONDITIONS::cursorFunc, _1, drwFrame,
KIGFX::CROSS_HAIR_MODE::FULLSCREEN_CROSS );
}
SELECTION_CONDITION EDITOR_CONDITIONS::Cursor45Crosshairs()
{
EDA_DRAW_FRAME* drwFrame = dynamic_cast<EDA_DRAW_FRAME*>( m_frame );
wxASSERT( drwFrame );
return std::bind( &EDITOR_CONDITIONS::cursorFunc, _1, drwFrame,
KIGFX::CROSS_HAIR_MODE::FULLSCREEN_DIAGONAL );
}
@ -193,9 +216,10 @@ bool EDITOR_CONDITIONS::polarCoordFunc( const SELECTION& aSelection, EDA_DRAW_FR
}
bool EDITOR_CONDITIONS::cursorFunc( const SELECTION& aSelection, EDA_DRAW_FRAME* aFrame )
bool EDITOR_CONDITIONS::cursorFunc( const SELECTION& aSelection, EDA_DRAW_FRAME* aFrame,
KIGFX::CROSS_HAIR_MODE aMode )
{
return aFrame->GetGalDisplayOptions().m_fullscreenCursor;
return aFrame->GetGalDisplayOptions().GetCursorMode() == aMode;
}

View File

@ -23,6 +23,7 @@
#include <widgets/gal_options_panel.h>
#include <settings/app_settings.h>
#include <gal/gal_display_options.h>
#include <eda_draw_frame.h>
#include <config_map.h>
@ -92,10 +93,12 @@ bool GAL_OPTIONS_PANEL::TransferDataToWindow()
m_gridMinSpacing->SetValue( m_cfg->m_Window.grid.min_spacing );
if( m_cfg->m_Window.cursor.fullscreen_cursor )
m_rbFullWindowCrosshairs->SetValue( true );
else
if( m_cfg->m_Window.cursor.cross_hair_mode == KIGFX::CROSS_HAIR_MODE::SMALL_CROSS )
m_rbSmallCrosshairs->SetValue( true );
else if( m_cfg->m_Window.cursor.cross_hair_mode == KIGFX::CROSS_HAIR_MODE::FULLSCREEN_DIAGONAL )
m_rb45DegreeCrosshairs->SetValue( true );
else
m_rbFullWindowCrosshairs->SetValue( true );
m_forceCursorDisplay->SetValue( m_cfg->m_Window.cursor.always_show_cursor );
@ -119,7 +122,12 @@ bool GAL_OPTIONS_PANEL::TransferDataFromWindow()
m_cfg->m_Window.grid.min_spacing = m_gridMinSpacing->GetValue();
m_cfg->m_Window.cursor.fullscreen_cursor = m_rbFullWindowCrosshairs->GetValue();
if( m_rbFullWindowCrosshairs->GetValue() )
m_cfg->m_Window.cursor.cross_hair_mode = KIGFX::CROSS_HAIR_MODE::FULLSCREEN_CROSS;
else if( m_rb45DegreeCrosshairs->GetValue() )
m_cfg->m_Window.cursor.cross_hair_mode = KIGFX::CROSS_HAIR_MODE::FULLSCREEN_DIAGONAL;
else
m_cfg->m_Window.cursor.cross_hair_mode = KIGFX::CROSS_HAIR_MODE::SMALL_CROSS;
m_cfg->m_Window.cursor.always_show_cursor = m_forceCursorDisplay->GetValue();
return true;

View File

@ -102,8 +102,11 @@ GAL_OPTIONS_PANEL_BASE::GAL_OPTIONS_PANEL_BASE( wxWindow* parent, wxWindowID id,
m_rbSmallCrosshairs = new wxRadioButton( this, wxID_ANY, _("Small crosshairs"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
fgSizer1->Add( m_rbSmallCrosshairs, 0, wxTOP|wxLEFT, 5 );
m_rbFullWindowCrosshairs = new wxRadioButton( this, wxID_ANY, _("Full window crosshairs"), wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_rbFullWindowCrosshairs, 0, wxLEFT, 5 );
m_rbFullWindowCrosshairs = new wxRadioButton( this, wxID_ANY, _("Full window crosshairs"), wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_rbFullWindowCrosshairs, 0, wxLEFT, 5 );
m_rb45DegreeCrosshairs = new wxRadioButton( this, wxID_ANY, _("45 degree crosshairs"), wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_rb45DegreeCrosshairs, 0, wxLEFT, 5 );
fgSizer1->Add( 0, 8, 0, wxEXPAND, 5 );

View File

@ -1267,6 +1267,71 @@
<property name="value">0</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxLEFT</property>
<property name="proportion">0</property>
<object class="wxRadioButton" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">45 degree crosshairs</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_rb45DegreeCrosshairs</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value">0</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>

View File

@ -51,9 +51,10 @@ class GAL_OPTIONS_PANEL_BASE : public wxPanel
wxChoice* m_gridSnapOptions;
wxStaticText* m_stGridLabel;
wxStaticLine* m_staticline2;
wxRadioButton* m_rbSmallCrosshairs;
wxRadioButton* m_rbFullWindowCrosshairs;
wxCheckBox* m_forceCursorDisplay;
wxRadioButton* m_rbSmallCrosshairs;
wxRadioButton* m_rbFullWindowCrosshairs;
wxRadioButton* m_rb45DegreeCrosshairs;
wxCheckBox* m_forceCursorDisplay;
public:

View File

@ -198,7 +198,9 @@ void DISPLAY_FOOTPRINTS_FRAME::setupUIConditions()
mgr->SetConditions( ACTIONS::measureTool, CHECK( cond.CurrentTool( ACTIONS::measureTool ) ) );
mgr->SetConditions( ACTIONS::toggleGrid, CHECK( cond.GridVisible() ) );
mgr->SetConditions( ACTIONS::toggleCursorStyle, CHECK( cond.FullscreenCursor() ) );
mgr->SetConditions( ACTIONS::cursorSmallCrosshairs, CHECK( cond.CursorSmallCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursorFullCrosshairs, CHECK( cond.CursorFullCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursor45Crosshairs, CHECK( cond.Cursor45Crosshairs() ) );
mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MM ) ) );
mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCH ) ) );

View File

@ -46,7 +46,10 @@ std::optional<TOOLBAR_CONFIGURATION> DISPLAY_FOOTPRINTS_TOOLBAR_SETTINGS::Defaul
.AppendAction( ACTIONS::inchesUnits )
.AppendAction( ACTIONS::milsUnits )
.AppendAction( ACTIONS::millimetersUnits )
.AppendAction( ACTIONS::toggleCursorStyle );
.AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Crosshair modes" ) )
.AddAction( ACTIONS::cursorSmallCrosshairs )
.AddAction( ACTIONS::cursorFullCrosshairs )
.AddAction( ACTIONS::cursor45Crosshairs ) );
config.AppendSeparator()
.AppendAction( PCB_ACTIONS::showPadNumbers )

View File

@ -637,7 +637,9 @@ void SCH_EDIT_FRAME::setupUIConditions()
mgr->SetConditions( SCH_ACTIONS::showDesignBlockPanel, CHECK( designBlockCond ) );
mgr->SetConditions( ACTIONS::toggleGrid, CHECK( cond.GridVisible() ) );
mgr->SetConditions( ACTIONS::toggleGridOverrides, CHECK( cond.GridOverrides() ) );
mgr->SetConditions( ACTIONS::toggleCursorStyle, CHECK( cond.FullscreenCursor() ) );
mgr->SetConditions( ACTIONS::cursorSmallCrosshairs, CHECK( cond.CursorSmallCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursorFullCrosshairs, CHECK( cond.CursorFullCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursor45Crosshairs, CHECK( cond.Cursor45Crosshairs() ) );
mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MM ) ) );
mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCH ) ) );
mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );

View File

@ -488,7 +488,9 @@ void SYMBOL_EDIT_FRAME::setupUIConditions()
mgr->SetConditions( ACTIONS::toggleGrid, CHECK( cond.GridVisible() ) );
mgr->SetConditions( ACTIONS::toggleGridOverrides, CHECK( cond.GridOverrides() ) );
mgr->SetConditions( ACTIONS::toggleCursorStyle, CHECK( cond.FullscreenCursor() ) );
mgr->SetConditions( ACTIONS::cursorSmallCrosshairs, CHECK( cond.CursorSmallCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursorFullCrosshairs, CHECK( cond.CursorFullCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursor45Crosshairs, CHECK( cond.Cursor45Crosshairs() ) );
mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MM ) ) );
mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCH ) ) );
mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );

View File

@ -62,7 +62,10 @@ std::optional<TOOLBAR_CONFIGURATION> SYMBOL_EDIT_TOOLBAR_SETTINGS::DefaultToolba
.AppendAction( ACTIONS::inchesUnits )
.AppendAction( ACTIONS::milsUnits )
.AppendAction( ACTIONS::millimetersUnits )
.AppendAction( ACTIONS::toggleCursorStyle );
.AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Crosshair modes" ) )
.AddAction( ACTIONS::cursorSmallCrosshairs )
.AddAction( ACTIONS::cursorFullCrosshairs )
.AddAction( ACTIONS::cursor45Crosshairs ) );
config.AppendSeparator()
.AppendAction( SCH_ACTIONS::showElectricalTypes )

View File

@ -61,7 +61,10 @@ std::optional<TOOLBAR_CONFIGURATION> SCH_EDIT_TOOLBAR_SETTINGS::DefaultToolbarCo
.AppendAction( ACTIONS::inchesUnits )
.AppendAction( ACTIONS::milsUnits )
.AppendAction( ACTIONS::millimetersUnits )
.AppendAction( ACTIONS::toggleCursorStyle );
.AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Crosshair modes" ) )
.AddAction( ACTIONS::cursorSmallCrosshairs )
.AddAction( ACTIONS::cursorFullCrosshairs )
.AddAction( ACTIONS::cursor45Crosshairs ) );
config.AppendSeparator()
.AppendAction( SCH_ACTIONS::toggleHiddenPins );

View File

@ -1103,7 +1103,9 @@ void GERBVIEW_FRAME::setupUIConditions()
mgr->SetConditions( ACTIONS::toggleGrid, CHECK( cond.GridVisible() ) );
mgr->SetConditions( ACTIONS::togglePolarCoords, CHECK( cond.PolarCoordinates() ) );
mgr->SetConditions( ACTIONS::toggleCursorStyle, CHECK( cond.FullscreenCursor() ) );
mgr->SetConditions( ACTIONS::cursorSmallCrosshairs, CHECK( cond.CursorSmallCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursorFullCrosshairs, CHECK( cond.CursorFullCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursor45Crosshairs, CHECK( cond.Cursor45Crosshairs() ) );
mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MM ) ) );
mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCH ) ) );

View File

@ -58,7 +58,10 @@ std::optional<TOOLBAR_CONFIGURATION> GERBVIEW_TOOLBAR_SETTINGS::DefaultToolbarCo
.AppendAction( ACTIONS::inchesUnits )
.AppendAction( ACTIONS::milsUnits )
.AppendAction( ACTIONS::millimetersUnits )
.AppendAction( ACTIONS::toggleCursorStyle );
.AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Crosshair modes" ) )
.AddAction( ACTIONS::cursorSmallCrosshairs )
.AddAction( ACTIONS::cursorFullCrosshairs )
.AddAction( ACTIONS::cursor45Crosshairs ) );
config.AppendSeparator()
.AppendAction( GERBVIEW_ACTIONS::flashedDisplayOutlines )

View File

@ -143,6 +143,8 @@ enum class BITMAPS : unsigned int
cpw,
cpw_back,
cursor,
cursor_fullscreen,
cursor_fullscreen45,
cursor_shape,
curved_ratsnest,
custom_pad_to_primitives,

View File

@ -64,6 +64,13 @@ namespace KIGFX
NEVER
};
enum class CROSS_HAIR_MODE : int
{
SMALL_CROSS,
FULLSCREEN_CROSS,
FULLSCREEN_DIAGONAL
};
class GAL_DISPLAY_OPTIONS;
class GAL_API GAL_DISPLAY_OPTIONS_OBSERVER
@ -101,8 +108,8 @@ namespace KIGFX
///< Whether or not to draw the coordinate system axes
bool m_axesEnabled;
///< Fullscreen crosshair or small cross
bool m_fullscreenCursor;
///< Crosshair drawing mode
CROSS_HAIR_MODE m_crossHairMode;
///< Force cursor display
bool m_forceDisplayCursor;
@ -110,6 +117,10 @@ namespace KIGFX
///< The pixel scale factor (>1 for hi-DPI scaled displays)
double m_scaleFactor;
void SetCursorMode( CROSS_HAIR_MODE aMode ) { m_crossHairMode = aMode; }
CROSS_HAIR_MODE GetCursorMode() const { return m_crossHairMode; }
void NotifyChanged();
};

View File

@ -1113,7 +1113,7 @@ protected:
bool m_isCursorEnabled; ///< Is the cursor enabled?
bool m_forceDisplayCursor; ///< Always show cursor
COLOR4D m_cursorColor; ///< Cursor color
bool m_fullscreenCursor; ///< Shape of the cursor (fullscreen or small cross)
KIGFX::CROSS_HAIR_MODE m_crossHairMode; ///< Crosshair drawing mode
VECTOR2D m_cursorPosition; ///< Current cursor position (world coordinates)
KICURSOR m_currentNativeCursor; ///< Current cursor

View File

@ -36,13 +36,18 @@ struct KICOMMON_API CROSS_PROBING_SETTINGS
bool auto_highlight; ///< Automatically turn on highlight mode in the target frame.
};
namespace KIGFX
{
enum class CROSS_HAIR_MODE : int;
}
/**
* Common cursor settings, available to every frame.
*/
struct KICOMMON_API CURSOR_SETTINGS
{
bool always_show_cursor;
bool fullscreen_cursor;
KIGFX::CROSS_HAIR_MODE cross_hair_mode;
};
/**

View File

@ -22,6 +22,7 @@
#define _JSON_SETTINGS_H
#include <core/wx_stl_compat.h>
#include <gal/gal_display_options.h>
#include <utility>
#include <wx/string.h>
@ -388,5 +389,6 @@ extern template std::optional<wxPoint> JSON_SETTINGS::Get<wxPoint>( const std::s
extern template std::optional<wxSize> JSON_SETTINGS::Get<wxSize>( const std::string& aPath ) const;
extern template std::optional<wxRect> JSON_SETTINGS::Get<wxRect>( const std::string& aPath ) const;
extern template std::optional<wxAuiPaneInfo> JSON_SETTINGS::Get<wxAuiPaneInfo>( const std::string& aPath ) const;
extern template std::optional<KIGFX::CROSS_HAIR_MODE> JSON_SETTINGS::Get<KIGFX::CROSS_HAIR_MODE>( const std::string& aPath ) const;
#endif

View File

@ -148,7 +148,9 @@ public:
static TOOL_ACTION centerContents;
static TOOL_ACTION centerSelection;
static TOOL_ACTION toggleCursor;
static TOOL_ACTION toggleCursorStyle;
static TOOL_ACTION cursorSmallCrosshairs;
static TOOL_ACTION cursorFullCrosshairs;
static TOOL_ACTION cursor45Crosshairs;
static TOOL_ACTION highContrastMode;
static TOOL_ACTION highContrastModeCycle;
static TOOL_ACTION toggleBoundingBoxes;

View File

@ -64,7 +64,9 @@ public:
// Cursor control
int CursorControl( const TOOL_EVENT& aEvent );
int ToggleCursor( const TOOL_EVENT& aEvent );
int ToggleCursorStyle( const TOOL_EVENT& aEvent );
int CursorSmallCrosshairs( const TOOL_EVENT& aEvent );
int CursorFullCrosshairs( const TOOL_EVENT& aEvent );
int Cursor45Crosshairs( const TOOL_EVENT& aEvent );
int ToggleBoundingBoxes( const TOOL_EVENT& aEvent );

View File

@ -34,6 +34,11 @@ class EDA_BASE_FRAME;
class EDA_DRAW_FRAME;
class TOOL_ACTION;
namespace KIGFX
{
enum class CROSS_HAIR_MODE;
}
/**
* Class that groups generic conditions for editor states.
*/
@ -125,7 +130,9 @@ public:
*
* @return Functor testing if the cursor is full screen
*/
SELECTION_CONDITION FullscreenCursor();
SELECTION_CONDITION CursorSmallCrosshairs();
SELECTION_CONDITION CursorFullCrosshairs();
SELECTION_CONDITION Cursor45Crosshairs();
SELECTION_CONDITION BoundingBoxes();
@ -168,7 +175,8 @@ protected:
static bool polarCoordFunc( const SELECTION& aSelection, EDA_DRAW_FRAME* aFrame );
/// Helper function used by FullscreenCursor().
static bool cursorFunc( const SELECTION& aSelection, EDA_DRAW_FRAME* aFrame );
static bool cursorFunc( const SELECTION& aSelection, EDA_DRAW_FRAME* aFrame,
KIGFX::CROSS_HAIR_MODE aMode );
/// Helper function used by DrawBoundingBoxes().
static bool bboxesFunc( const SELECTION& aSelection, EDA_DRAW_FRAME* aFrame );

View File

@ -313,7 +313,9 @@ void PL_EDITOR_FRAME::setupUIConditions()
mgr->SetConditions( ACTIONS::redo, ENABLE( cond.RedoAvailable() ) );
mgr->SetConditions( ACTIONS::toggleGrid, CHECK( cond.GridVisible() ) );
mgr->SetConditions( ACTIONS::toggleCursorStyle, CHECK( cond.FullscreenCursor() ) );
mgr->SetConditions( ACTIONS::cursorSmallCrosshairs, CHECK( cond.CursorSmallCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursorFullCrosshairs, CHECK( cond.CursorFullCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursor45Crosshairs, CHECK( cond.Cursor45Crosshairs() ) );
mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MM ) ) );
mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCH ) ) );
mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );

View File

@ -846,7 +846,9 @@ void FOOTPRINT_CHOOSER_FRAME::setupUIConditions()
#define CHECK( x ) ACTION_CONDITIONS().Check( x )
mgr->SetConditions( ACTIONS::toggleGrid, CHECK( cond.GridVisible() ) );
mgr->SetConditions( ACTIONS::toggleCursorStyle, CHECK( cond.FullscreenCursor() ) );
mgr->SetConditions( ACTIONS::cursorSmallCrosshairs, CHECK( cond.CursorSmallCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursorFullCrosshairs, CHECK( cond.CursorFullCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursor45Crosshairs, CHECK( cond.Cursor45Crosshairs() ) );
mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MM ) ) );
mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCH ) ) );

View File

@ -1340,7 +1340,9 @@ void FOOTPRINT_EDIT_FRAME::setupUIConditions()
mgr->SetConditions( ACTIONS::toggleGrid, CHECK( cond.GridVisible() ) );
mgr->SetConditions( ACTIONS::toggleGridOverrides, CHECK( cond.GridOverrides() ) );
mgr->SetConditions( ACTIONS::toggleCursorStyle, CHECK( cond.FullscreenCursor() ) );
mgr->SetConditions( ACTIONS::cursorSmallCrosshairs, CHECK( cond.CursorSmallCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursorFullCrosshairs, CHECK( cond.CursorFullCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursor45Crosshairs, CHECK( cond.Cursor45Crosshairs() ) );
mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MM ) ) );
mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCH ) ) );
mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );

View File

@ -349,7 +349,9 @@ void FOOTPRINT_VIEWER_FRAME::setupUIConditions()
#define CHECK( x ) ACTION_CONDITIONS().Check( x )
mgr->SetConditions( ACTIONS::toggleGrid, CHECK( cond.GridVisible() ) );
mgr->SetConditions( ACTIONS::toggleCursorStyle, CHECK( cond.FullscreenCursor() ) );
mgr->SetConditions( ACTIONS::cursorSmallCrosshairs, CHECK( cond.CursorSmallCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursorFullCrosshairs, CHECK( cond.CursorFullCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursor45Crosshairs, CHECK( cond.Cursor45Crosshairs() ) );
mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MM ) ) );
mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCH ) ) );
mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );

View File

@ -28,6 +28,7 @@
#include <pcb_draw_panel_gal.h>
#include <pcb_edit_frame.h>
#include <3d_viewer/eda_3d_viewer_frame.h>
#include <gal/gal_display_options.h>
#include <widgets/msgpanel.h>
#include <bitmaps.h>
#include <grid_tricks.h>
@ -197,7 +198,7 @@ FOOTPRINT_WIZARD_FRAME::FOOTPRINT_WIZARD_FRAME( KIWAY* aKiway, wxWindow* aParent
m_auimgr.AddPane( GetCanvas(), wxAuiPaneInfo().Name( "DrawFrame" ).CentrePane() );
auto& galOpts = GetGalDisplayOptions();
galOpts.m_fullscreenCursor = true;
galOpts.SetCursorMode( KIGFX::CROSS_HAIR_MODE::FULLSCREEN_CROSS );
galOpts.m_forceDisplayCursor = true;
galOpts.m_axesEnabled = true;

View File

@ -823,7 +823,9 @@ void PCB_EDIT_FRAME::setupUIConditions()
mgr->SetConditions( ACTIONS::toggleGrid, CHECK( cond.GridVisible() ) );
mgr->SetConditions( ACTIONS::toggleGridOverrides, CHECK( cond.GridOverrides() ) );
mgr->SetConditions( ACTIONS::toggleCursorStyle, CHECK( cond.FullscreenCursor() ) );
mgr->SetConditions( ACTIONS::cursorSmallCrosshairs, CHECK( cond.CursorSmallCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursorFullCrosshairs, CHECK( cond.CursorFullCrosshairs() ) );
mgr->SetConditions( ACTIONS::cursor45Crosshairs, CHECK( cond.Cursor45Crosshairs() ) );
mgr->SetConditions( ACTIONS::togglePolarCoords, CHECK( cond.PolarCoordinates() ) );
mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MM ) ) );
mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCH ) ) );

View File

@ -54,7 +54,10 @@ std::optional<TOOLBAR_CONFIGURATION> FOOTPRINT_EDIT_TOOLBAR_SETTINGS::DefaultToo
.AppendAction( ACTIONS::inchesUnits )
.AppendAction( ACTIONS::milsUnits )
.AppendAction( ACTIONS::millimetersUnits )
.AppendAction( ACTIONS::toggleCursorStyle );
.AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Crosshair modes" ) )
.AddAction( ACTIONS::cursorSmallCrosshairs )
.AddAction( ACTIONS::cursorFullCrosshairs )
.AddAction( ACTIONS::cursor45Crosshairs ) );
config.AppendSeparator()
.AppendAction( PCB_ACTIONS::toggleHV45Mode );

View File

@ -80,7 +80,10 @@ std::optional<TOOLBAR_CONFIGURATION> FOOTPRINT_VIEWER_TOOLBAR_SETTINGS::DefaultT
.AppendAction( ACTIONS::inchesUnits )
.AppendAction( ACTIONS::milsUnits )
.AppendAction( ACTIONS::millimetersUnits )
.AppendAction( ACTIONS::toggleCursorStyle );
.AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Crosshair modes" ) )
.AddAction( ACTIONS::cursorSmallCrosshairs )
.AddAction( ACTIONS::cursorFullCrosshairs )
.AddAction( ACTIONS::cursor45Crosshairs ) );
config.AppendSeparator()
.AppendAction( PCB_ACTIONS::showPadNumbers )

View File

@ -140,7 +140,10 @@ std::optional<TOOLBAR_CONFIGURATION> PCB_EDIT_TOOLBAR_SETTINGS::DefaultToolbarCo
.AppendAction( ACTIONS::inchesUnits )
.AppendAction( ACTIONS::milsUnits )
.AppendAction( ACTIONS::millimetersUnits )
.AppendAction( ACTIONS::toggleCursorStyle );
.AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Crosshair modes" ) )
.AddAction( ACTIONS::cursorSmallCrosshairs )
.AddAction( ACTIONS::cursorFullCrosshairs )
.AddAction( ACTIONS::cursor45Crosshairs ) );
config.AppendSeparator()
.AppendAction( PCB_ACTIONS::toggleHV45Mode );

View File

@ -38,7 +38,9 @@ bool FOOTPRINT_CHOOSER_SELECTION_TOOL::Init()
menu.AddSeparator( 1 );
menu.AddCheckItem( ACTIONS::toggleGrid, SELECTION_CONDITIONS::ShowAlways, 1 );
menu.AddCheckItem( ACTIONS::toggleCursorStyle, SELECTION_CONDITIONS::ShowAlways, 1 );
menu.AddCheckItem( ACTIONS::cursorSmallCrosshairs, SELECTION_CONDITIONS::ShowAlways, 1 );
menu.AddCheckItem( ACTIONS::cursorFullCrosshairs, SELECTION_CONDITIONS::ShowAlways, 1 );
menu.AddCheckItem( ACTIONS::cursor45Crosshairs, SELECTION_CONDITIONS::ShowAlways, 1 );
menu.AddSeparator( 10 );
menu.AddCheckItem( ACTIONS::inchesUnits, SELECTION_CONDITIONS::ShowAlways, 10 );

View File

@ -227,7 +227,7 @@
"window": {
"cursor": {
"always_show_cursor": true,
"fullscreen_cursor": false
"cross_hair_mode": 0
},
"display": 0,
"grid": {

View File

@ -40,7 +40,7 @@
"autozoom": true,
"cursor": {
"always_show_cursor": true,
"fullscreen_cursor": false
"cross_hair_mode": 0
},
"display": 0,
"grid": {
@ -257,7 +257,7 @@
"window": {
"cursor": {
"always_show_cursor": true,
"fullscreen_cursor": false
"cross_hair_mode": 0
},
"display": 0,
"grid": {

View File

@ -202,7 +202,7 @@
"window": {
"cursor": {
"always_show_cursor": true,
"fullscreen_cursor": false
"cross_hair_mode": 0
},
"display": 0,
"grid": {
@ -362,7 +362,7 @@
"window": {
"cursor": {
"always_show_cursor": true,
"fullscreen_cursor": false
"cross_hair_mode": 0
},
"display": 0,
"grid": {
@ -466,7 +466,7 @@
"window": {
"cursor": {
"always_show_cursor": true,
"fullscreen_cursor": false
"cross_hair_mode": 0
},
"display": 0,
"grid": {

View File

@ -171,7 +171,7 @@
"window": {
"cursor": {
"always_show_cursor": true,
"fullscreen_cursor": false
"cross_hair_mode": 0
},
"display": 0,
"footprint_text_shown_columns": "0 1 2 3 4 5 7",

View File

@ -107,7 +107,7 @@
"window": {
"cursor": {
"always_show_cursor": true,
"fullscreen_cursor": false
"cross_hair_mode": 0
},
"display": 0,
"grid": {

View File

@ -153,7 +153,7 @@
"autozoom": true,
"cursor": {
"always_show_cursor": true,
"fullscreen_cursor": false
"cross_hair_mode": 0
},
"display": 0,
"fp_list_width": 300,
@ -326,7 +326,7 @@
"footprint_wizard": {
"cursor": {
"always_show_cursor": true,
"fullscreen_cursor": false
"cross_hair_mode": 0
},
"display": 0,
"grid": {
@ -635,7 +635,7 @@
"window": {
"cursor": {
"always_show_cursor": true,
"fullscreen_cursor": false
"cross_hair_mode": 0
},
"display": 0,
"footprint_text_shown_columns": "0 1 2 3 4 5 7",

View File

@ -124,7 +124,7 @@
"window": {
"cursor": {
"always_show_cursor": true,
"fullscreen_cursor": false
"cross_hair_mode": 0
},
"display": 0,
"grid": {

View File

@ -239,6 +239,8 @@ set( BMAPS_MID
convert
copy
copy_pad_settings
cursor_fullscreen
cursor_fullscreen45
cursor_shape
cursor
custom_pad_to_primitives

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 466 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 610 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 536 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 B

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 303 B

After

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 497 B

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 526 B

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 882 B

After

Width:  |  Height:  |  Size: 795 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 B

After

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 318 B

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 507 B

After

Width:  |  Height:  |  Size: 460 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 527 B

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 906 B

After

Width:  |  Height:  |  Size: 815 B

View File

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="Слой_1"
data-name="Слой 1"
viewBox="0 0 24 24"
version="1.1"
sodipodi:docname="cursor_fullscreen.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
inkscape:export-filename="/tmp/cursor_shape.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata2369">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>cursor_shape</dc:title>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#545454"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2285"
inkscape:window-height="1629"
id="namedview2367"
showgrid="true"
inkscape:zoom="45.254834"
inkscape:cx="10.551359"
inkscape:cy="13.368738"
inkscape:window-x="1453"
inkscape:window-y="97"
inkscape:window-maximized="0"
inkscape:current-layer="Слой_1"
inkscape:document-rotation="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid2947"
originx="0"
originy="0"
spacingy="1"
spacingx="1"
units="px" />
</sodipodi:namedview>
<defs
id="defs2348">
<linearGradient
id="linearGradient1556"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop1552"
style="stop-opacity:0;stop-color:#ebebeb" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop1554" />
</linearGradient>
<linearGradient
id="linearGradient1550"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop1546" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop1548"
style="stop-opacity:0" />
</linearGradient>
<linearGradient
id="linearGradient2979"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop2975" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop2977" />
</linearGradient>
<style
id="style2338">.cls-1{fill:url(#Безымянный_градиент_19);}.cls-2{fill:url(#Безымянный_градиент_19-2);}.cls-3{fill:url(#Безымянный_градиент_19-3);}.cls-4{fill:url(#Безымянный_градиент_19-4);}.cls-5{fill:#42B8EB;}.cls-6{fill:#DED3DD;}</style>
<linearGradient
id="Безымянный_градиент_19"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop2340" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop2342" />
</linearGradient>
<linearGradient
id="Безымянный_градиент_19-2"
x1="12.7525"
y1="23.0164"
x2="12.7525"
y2="14.658"
xlink:href="#Безымянный_градиент_19" />
<linearGradient
id="Безымянный_градиент_19-3"
x1="15.5046"
y1="2.2432"
x2="15.5046"
y2="10.6016"
gradientTransform="translate(25.5094 -2.5136) rotate(90)"
xlink:href="#Безымянный_градиент_19" />
<linearGradient
id="Безымянный_градиент_19-4"
x1="15.4919"
y1="23.5134"
x2="15.4919"
y2="14.8985"
gradientTransform="translate(25.5094 -2.5136) rotate(90)"
xlink:href="#Безымянный_градиент_19" />
</defs>
<title
id="title2350">cursor_shape</title>
<g
id="g1564">
<path
style="fill:none;stroke:#8f8f8f;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 0.52,12.499724 22.972201,0"
id="path1558"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#8f8f8f;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 12.5,23.497496 0,-22.97749515"
id="path1560"
sodipodi:nodetypes="cc" />
</g>
<path
style="fill:none;stroke:#42B8EB;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 8.5,12.5 h 8"
id="path3015" />
<path
style="fill:none;stroke:#42B8EB;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 12.5,16.5 v -8"
id="path3017" />
<path
class="cls-6"
d="m 12,12 -9.32e-4,10.882159 2.415252,-2.312217 c 0.325669,0.741356 0.803185,1.836142 1.220872,2.791856 a 1.2338,1.2338 0 0 0 1.627633,0.634824 v 0 a 1.2337,1.2337 0 0 0 0.635719,-1.623937 c -0.417615,-0.955901 -0.895724,-2.05243 -1.222119,-2.796018 l 3.337183,-0.213478 z"
id="path25"
style="fill:#DED3DD" />
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -0,0 +1,207 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="Слой_1"
data-name="Слой 1"
viewBox="0 0 24 24"
version="1.1"
sodipodi:docname="cursor_fullscreen45.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
inkscape:export-filename="/tmp/cursor_shape.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata2369">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>cursor_shape</dc:title>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#545454"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2285"
inkscape:window-height="1629"
id="namedview2367"
showgrid="true"
inkscape:zoom="22.627417"
inkscape:cx="11.114835"
inkscape:cy="11.667262"
inkscape:window-x="1453"
inkscape:window-y="97"
inkscape:window-maximized="0"
inkscape:current-layer="g1564"
inkscape:document-rotation="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid2947"
originx="0"
originy="0"
spacingy="1"
spacingx="1"
units="px" />
</sodipodi:namedview>
<defs
id="defs2348">
<linearGradient
id="linearGradient1556"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop1552"
style="stop-opacity:0;stop-color:#ebebeb" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop1554" />
</linearGradient>
<linearGradient
id="linearGradient1550"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop1546" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop1548"
style="stop-opacity:0" />
</linearGradient>
<linearGradient
id="linearGradient2979"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop2975" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop2977" />
</linearGradient>
<style
id="style2338">.cls-1{fill:url(#Безымянный_градиент_19);}.cls-2{fill:url(#Безымянный_градиент_19-2);}.cls-3{fill:url(#Безымянный_градиент_19-3);}.cls-4{fill:url(#Безымянный_градиент_19-4);}.cls-5{fill:#42B8EB;}.cls-6{fill:#DED3DD;}</style>
<linearGradient
id="Безымянный_градиент_19"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop2340" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop2342" />
</linearGradient>
<linearGradient
id="Безымянный_градиент_19-2"
x1="12.7525"
y1="23.0164"
x2="12.7525"
y2="14.658"
xlink:href="#Безымянный_градиент_19" />
<linearGradient
id="Безымянный_градиент_19-3"
x1="15.5046"
y1="2.2432"
x2="15.5046"
y2="10.6016"
gradientTransform="translate(25.5094 -2.5136) rotate(90)"
xlink:href="#Безымянный_градиент_19" />
<linearGradient
id="Безымянный_градиент_19-4"
x1="15.4919"
y1="23.5134"
x2="15.4919"
y2="14.8985"
gradientTransform="translate(25.5094 -2.5136) rotate(90)"
xlink:href="#Безымянный_градиент_19" />
</defs>
<title
id="title2350">cursor_shape</title>
<g
id="g1564"
transform="rotate(-45,12.006101,12.008748)">
<path
style="fill:none;stroke:#8f8f8f;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -4.96259,11.998248 33.941125,0"
id="path1558"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#8f8f8f;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 12.007973,28.968811 0,-33.9411256"
id="path1560"
sodipodi:nodetypes="cc" />
</g>
<path
style="fill:none;stroke:#42b8eb;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 9,15 15,9"
id="path3015"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#42b8eb;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 15,15 9,9"
id="path3017"
sodipodi:nodetypes="cc" />
<path
class="cls-6"
d="m 12,12 -9.32e-4,10.882159 2.415252,-2.312217 c 0.325669,0.741356 0.803185,1.836142 1.220872,2.791856 a 1.2338,1.2338 0 0 0 1.627633,0.634824 v 0 a 1.2337,1.2337 0 0 0 0.635719,-1.623937 c -0.417615,-0.955901 -0.895724,-2.05243 -1.222119,-2.796018 l 3.337183,-0.213478 z"
id="path25"
style="fill:#DED3DD" />
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@ -1,22 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="Слой_1"
data-name="Слой 1"
viewBox="0 0 24 24"
version="1.1"
sodipodi:docname="cursor_shape.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
inkscape:export-filename="/tmp/cursor_shape.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata2369">
<rdf:RDF>
@ -60,16 +60,24 @@
id="namedview2367"
showgrid="true"
inkscape:zoom="45.254834"
inkscape:cx="10.543725"
inkscape:cy="13.371759"
inkscape:cx="10.551359"
inkscape:cy="13.368738"
inkscape:window-x="1453"
inkscape:window-y="97"
inkscape:window-maximized="0"
inkscape:current-layer="Слой_1"
inkscape:document-rotation="0">
inkscape:current-layer="g1564"
inkscape:document-rotation="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid2947" />
id="grid2947"
originx="0"
originy="0"
spacingy="1"
spacingx="1"
units="px" />
</sodipodi:namedview>
<defs
id="defs2348">
@ -168,18 +176,7 @@
<title
id="title2350">cursor_shape</title>
<g
id="g1564">
<path
style="fill:none;stroke:#8f8f8f;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 0.52,12.499724 22.972201,0"
id="path1558"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#8f8f8f;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 12.5,23.497496 0,-22.97749515"
id="path1560"
sodipodi:nodetypes="cc" />
</g>
id="g1564" />
<path
style="fill:none;stroke:#42B8EB;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 8.5,12.5 h 8"

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="Слой_1"
data-name="Слой 1"
viewBox="0 0 24 24"
version="1.1"
sodipodi:docname="cursor_fullscreen.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
inkscape:export-filename="/tmp/cursor_shape.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata2369">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>cursor_shape</dc:title>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#f5f5f5"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3840"
inkscape:window-height="2109"
id="namedview2367"
showgrid="true"
inkscape:zoom="45.254834"
inkscape:cx="10.54031"
inkscape:cy="13.368738"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="Слой_1"
inkscape:document-rotation="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid2947"
originx="0"
originy="0"
spacingy="1"
spacingx="1"
units="px" />
</sodipodi:namedview>
<defs
id="defs2348">
<linearGradient
id="linearGradient1556"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop1552"
style="stop-opacity:0;stop-color:#ebebeb" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop1554" />
</linearGradient>
<linearGradient
id="linearGradient1550"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop1546" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop1548"
style="stop-opacity:0" />
</linearGradient>
<linearGradient
id="linearGradient2979"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop2975" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop2977" />
</linearGradient>
<style
id="style2338">.cls-1{fill:url(#Безымянный_градиент_19);}.cls-2{fill:url(#Безымянный_градиент_19-2);}.cls-3{fill:url(#Безымянный_градиент_19-3);}.cls-4{fill:url(#Безымянный_градиент_19-4);}.cls-5{fill:#1a81c4;}.cls-6{fill:#545454;}</style>
<linearGradient
id="Безымянный_градиент_19"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop2340" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop2342" />
</linearGradient>
<linearGradient
id="Безымянный_градиент_19-2"
x1="12.7525"
y1="23.0164"
x2="12.7525"
y2="14.658"
xlink:href="#Безымянный_градиент_19" />
<linearGradient
id="Безымянный_градиент_19-3"
x1="15.5046"
y1="2.2432"
x2="15.5046"
y2="10.6016"
gradientTransform="translate(25.5094 -2.5136) rotate(90)"
xlink:href="#Безымянный_градиент_19" />
<linearGradient
id="Безымянный_градиент_19-4"
x1="15.4919"
y1="23.5134"
x2="15.4919"
y2="14.8985"
gradientTransform="translate(25.5094 -2.5136) rotate(90)"
xlink:href="#Безымянный_градиент_19" />
</defs>
<title
id="title2350">cursor_shape</title>
<g
id="g1564">
<path
style="fill:none;stroke:#b9b9b9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 0.52,12.499724 22.972201,0"
id="path1558"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#b9b9b9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 12.5,23.497496 0,-22.97749515"
id="path1560"
sodipodi:nodetypes="cc" />
</g>
<path
style="fill:none;stroke:#1a81c4;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 8.5,12.5 h 8"
id="path3015" />
<path
style="fill:none;stroke:#1a81c4;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 12.5,16.5 v -8"
id="path3017" />
<path
class="cls-6"
d="m 12,12 -9.32e-4,10.882159 2.415252,-2.312217 c 0.325669,0.741356 0.803185,1.836142 1.220872,2.791856 a 1.2338,1.2338 0 0 0 1.627633,0.634824 v 0 a 1.2337,1.2337 0 0 0 0.635719,-1.623937 c -0.417615,-0.955901 -0.895724,-2.05243 -1.222119,-2.796018 l 3.337183,-0.213478 z"
id="path25"
style="fill:#545454" />
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -0,0 +1,206 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="Слой_1"
data-name="Слой 1"
viewBox="0 0 24 24"
version="1.1"
sodipodi:docname="cursor_fullscreen45.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
inkscape:export-filename="/tmp/cursor_shape.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata2369">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>cursor_shape</dc:title>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#f5f5f5"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3840"
inkscape:window-height="2109"
id="namedview2367"
showgrid="true"
inkscape:zoom="45.254834"
inkscape:cx="10.54031"
inkscape:cy="13.368738"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="Слой_1"
inkscape:document-rotation="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid2947"
originx="0"
originy="0"
spacingy="1"
spacingx="1"
units="px" />
</sodipodi:namedview>
<defs
id="defs2348">
<linearGradient
id="linearGradient1556"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop1552"
style="stop-opacity:0;stop-color:#ebebeb" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop1554" />
</linearGradient>
<linearGradient
id="linearGradient1550"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop1546" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop1548"
style="stop-opacity:0" />
</linearGradient>
<linearGradient
id="linearGradient2979"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop2975" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop2977" />
</linearGradient>
<style
id="style2338">.cls-1{fill:url(#Безымянный_градиент_19);}.cls-2{fill:url(#Безымянный_градиент_19-2);}.cls-3{fill:url(#Безымянный_градиент_19-3);}.cls-4{fill:url(#Безымянный_градиент_19-4);}.cls-5{fill:#1a81c4;}.cls-6{fill:#545454;}</style>
<linearGradient
id="Безымянный_градиент_19"
x1="12.7662"
y1="2.0027"
x2="12.7662"
y2="10.3611"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ececec"
id="stop2340" />
<stop
offset="1"
stop-color="#c6c6c5"
id="stop2342" />
</linearGradient>
<linearGradient
id="Безымянный_градиент_19-2"
x1="12.7525"
y1="23.0164"
x2="12.7525"
y2="14.658"
xlink:href="#Безымянный_градиент_19" />
<linearGradient
id="Безымянный_градиент_19-3"
x1="15.5046"
y1="2.2432"
x2="15.5046"
y2="10.6016"
gradientTransform="translate(25.5094 -2.5136) rotate(90)"
xlink:href="#Безымянный_градиент_19" />
<linearGradient
id="Безымянный_градиент_19-4"
x1="15.4919"
y1="23.5134"
x2="15.4919"
y2="14.8985"
gradientTransform="translate(25.5094 -2.5136) rotate(90)"
xlink:href="#Безымянный_градиент_19" />
</defs>
<title
id="title2350">cursor_shape</title>
<g
id="g1564">
<path
style="fill:none;stroke:#b9b9b9;stroke-width:1.33839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 0,24 24,0"
id="path1558"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#b9b9b9;stroke-width:1.33839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 24,24 0,0"
id="path1560"
sodipodi:nodetypes="cc" />
</g>
<path
style="fill:none;stroke:#1a81c4;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 9,15 15,9"
id="path3015"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#1a81c4;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 15,15 9,9"
id="path3017"
sodipodi:nodetypes="cc" />
<path
class="cls-6"
d="m 12,12 -9.32e-4,10.882159 2.415252,-2.312217 c 0.325669,0.741356 0.803185,1.836142 1.220872,2.791856 a 1.2338,1.2338 0 0 0 1.627633,0.634824 v 0 a 1.2337,1.2337 0 0 0 0.635719,-1.623937 c -0.417615,-0.955901 -0.895724,-2.05243 -1.222119,-2.796018 l 3.337183,-0.213478 z"
id="path25"
style="fill:#545454" />
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -1,22 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="Слой_1"
data-name="Слой 1"
viewBox="0 0 24 24"
version="1.1"
sodipodi:docname="cursor_shape.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
inkscape:export-filename="/tmp/cursor_shape.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata2369">
<rdf:RDF>
@ -60,16 +60,24 @@
id="namedview2367"
showgrid="true"
inkscape:zoom="45.254834"
inkscape:cx="10.543725"
inkscape:cy="13.371759"
inkscape:cx="10.551359"
inkscape:cy="13.368738"
inkscape:window-x="1453"
inkscape:window-y="97"
inkscape:window-maximized="0"
inkscape:current-layer="Слой_1"
inkscape:document-rotation="0">
inkscape:current-layer="g1564"
inkscape:document-rotation="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid2947" />
id="grid2947"
originx="0"
originy="0"
spacingy="1"
spacingx="1"
units="px" />
</sodipodi:namedview>
<defs
id="defs2348">
@ -168,18 +176,7 @@
<title
id="title2350">cursor_shape</title>
<g
id="g1564">
<path
style="fill:none;stroke:#b9b9b9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 0.52,12.499724 22.972201,0"
id="path1558"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#b9b9b9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 12.5,23.497496 0,-22.97749515"
id="path1560"
sodipodi:nodetypes="cc" />
</g>
id="g1564" />
<path
style="fill:none;stroke:#1a81c4;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 8.5,12.5 h 8"

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB