Schematic: Add icons for Any/90/45 angle modes
Also add a dark mode icon for existing 45hv icon. Fixes: https://gitlab.com/kicad/code/kicad/-/issues/11332
This commit is contained in:
parent
7ede2c70bd
commit
8d51b6b6d3
|
@ -329,6 +329,7 @@ set( BMAPS_MID
|
||||||
library_archive_as
|
library_archive_as
|
||||||
library
|
library
|
||||||
library_table
|
library_table
|
||||||
|
lines_any
|
||||||
lines90
|
lines90
|
||||||
list_nets
|
list_nets
|
||||||
load_drill
|
load_drill
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 236 B |
Binary file not shown.
After Width: | Height: | Size: 276 B |
Binary file not shown.
After Width: | Height: | Size: 378 B |
|
@ -0,0 +1,84 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
height="24"
|
||||||
|
width="24"
|
||||||
|
version="1.1"
|
||||||
|
id="svg2"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
sodipodi:docname="hv45mode.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
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="metadata20">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs18" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1498"
|
||||||
|
inkscape:window-height="857"
|
||||||
|
id="namedview16"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="23.501099"
|
||||||
|
inkscape:cx="15.509913"
|
||||||
|
inkscape:cy="11.999439"
|
||||||
|
inkscape:window-x="519"
|
||||||
|
inkscape:window-y="90"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
inkscape:document-rotation="0"
|
||||||
|
inkscape:pagecheckerboard="0">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid2997"
|
||||||
|
empspacing="2"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true"
|
||||||
|
spacingx="0.5"
|
||||||
|
spacingy="0.5" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#e0e0e0;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-variation-settings:normal;opacity:1;vector-effect:none;fill-opacity:1;stroke-dashoffset:0;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
|
||||||
|
d="m 4,12.5 h 7.5 V 20"
|
||||||
|
id="path3771"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#666666;stroke:#ded3dd;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-variation-settings:normal;opacity:1;vector-effect:none;fill-opacity:1;stroke-dashoffset:0;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
|
||||||
|
d="M 4,2.0000001 V 22"
|
||||||
|
id="path2999"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3769"
|
||||||
|
d="M 22,20 H 2.0000001"
|
||||||
|
style="fill:#666666;stroke:#ded3dd;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-variation-settings:normal;opacity:1;vector-effect:none;fill-opacity:1;stroke-dashoffset:0;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
style="fill:#666666;stroke:#ded3dd;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-variation-settings:normal;opacity:1;vector-effect:none;fill-opacity:1;stroke-dashoffset:0;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
|
||||||
|
d="M 4.0000044,20.000002 18.5,5.5"
|
||||||
|
id="path841"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.4 KiB |
|
@ -0,0 +1,88 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
height="24"
|
||||||
|
width="24"
|
||||||
|
version="1.1"
|
||||||
|
id="svg2"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
sodipodi:docname="lines_any.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
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="metadata20">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs18" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="987"
|
||||||
|
id="namedview16"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="33.235573"
|
||||||
|
inkscape:cx="11.027341"
|
||||||
|
inkscape:cy="10.891944"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
inkscape:document-rotation="0"
|
||||||
|
inkscape:pagecheckerboard="0">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid2997"
|
||||||
|
empspacing="2"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true"
|
||||||
|
spacingx="0.5"
|
||||||
|
spacingy="0.5" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<path
|
||||||
|
style="fill:#666666;stroke:#DED3DD;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 4,2.0000001 V 22"
|
||||||
|
id="path2999"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3769"
|
||||||
|
d="M 22,20 H 2.0000001"
|
||||||
|
style="fill:#666666;stroke:#DED3DD;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
style="fill:#666666;stroke:#ded3dd;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-variation-settings:normal;opacity:1;fill-opacity:1;stroke-dashoffset:0;stop-color:#000000;stop-opacity:1"
|
||||||
|
d="M 10.5,5.5 4.0000038,20.000002"
|
||||||
|
id="path841"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
style="fill:#666666;stroke:#ded3dd;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-variation-settings:normal;opacity:1;fill-opacity:1;stroke-dashoffset:0;stop-color:#000000;stop-opacity:1"
|
||||||
|
d="M 15.5,14.500001 10.5,5.5"
|
||||||
|
id="path2947"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
style="fill:#666666;stroke:#ded3dd;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-variation-settings:normal;opacity:1;fill-opacity:1;stroke-dashoffset:0;stop-color:#000000;stop-opacity:1"
|
||||||
|
d="m 20.5,10 -5,4.5"
|
||||||
|
id="path2949"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.3 KiB |
|
@ -0,0 +1,88 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
height="24"
|
||||||
|
width="24"
|
||||||
|
version="1.1"
|
||||||
|
id="svg2"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
sodipodi:docname="lines_any.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
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="metadata20">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs18" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1049"
|
||||||
|
id="namedview16"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="20.456599"
|
||||||
|
inkscape:cx="-4.2773483"
|
||||||
|
inkscape:cy="11.389968"
|
||||||
|
inkscape:window-x="1920"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
inkscape:document-rotation="0"
|
||||||
|
inkscape:pagecheckerboard="0">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid2997"
|
||||||
|
empspacing="2"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true"
|
||||||
|
spacingx="0.5"
|
||||||
|
spacingy="0.5" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<path
|
||||||
|
style="fill:#666666;stroke:#545454;stroke-width:1.99937008;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 4,2.0000001 V 22"
|
||||||
|
id="path2999"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3769"
|
||||||
|
d="M 22,20 H 2.0000001"
|
||||||
|
style="fill:#666666;stroke:#545454;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#545454;stroke-width:0.999997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 10.5,5.4999998 4.0000038,20.000002"
|
||||||
|
id="path841"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#545454;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 15.5,14.500001 10.5,5.5"
|
||||||
|
id="path2947"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#545454;stroke-width:0.999997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="m 20.5,10 -5,4.5"
|
||||||
|
id="path2949"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.0 KiB |
|
@ -35,7 +35,6 @@ enum LINE_MODE
|
||||||
LINE_MODE_FREE = 0,
|
LINE_MODE_FREE = 0,
|
||||||
LINE_MODE_90 = 1,
|
LINE_MODE_90 = 1,
|
||||||
LINE_MODE_45 = 2,
|
LINE_MODE_45 = 2,
|
||||||
LINE_MODE_135 = 3,
|
|
||||||
|
|
||||||
LINE_MODE_COUNT,
|
LINE_MODE_COUNT,
|
||||||
};
|
};
|
||||||
|
|
|
@ -441,7 +441,6 @@ void SCH_EDIT_FRAME::setupUIConditions()
|
||||||
mgr->SetConditions( EE_ACTIONS::lineModeFree, CHECK( cond.LineMode( LINE_MODE::LINE_MODE_FREE ) ) );
|
mgr->SetConditions( EE_ACTIONS::lineModeFree, CHECK( cond.LineMode( LINE_MODE::LINE_MODE_FREE ) ) );
|
||||||
mgr->SetConditions( EE_ACTIONS::lineMode90, CHECK( cond.LineMode( LINE_MODE::LINE_MODE_90 ) ) );
|
mgr->SetConditions( EE_ACTIONS::lineMode90, CHECK( cond.LineMode( LINE_MODE::LINE_MODE_90 ) ) );
|
||||||
mgr->SetConditions( EE_ACTIONS::lineMode45, CHECK( cond.LineMode( LINE_MODE::LINE_MODE_45 ) ) );
|
mgr->SetConditions( EE_ACTIONS::lineMode45, CHECK( cond.LineMode( LINE_MODE::LINE_MODE_45 ) ) );
|
||||||
mgr->SetConditions( EE_ACTIONS::lineMode135, CHECK( cond.LineMode( LINE_MODE::LINE_MODE_135 ) ) );
|
|
||||||
|
|
||||||
mgr->SetConditions( ACTIONS::cut, ENABLE( hasElements ) );
|
mgr->SetConditions( ACTIONS::cut, ENABLE( hasElements ) );
|
||||||
mgr->SetConditions( ACTIONS::copy, ENABLE( hasElements ) );
|
mgr->SetConditions( ACTIONS::copy, ENABLE( hasElements ) );
|
||||||
|
|
|
@ -205,7 +205,6 @@ void SCH_EDIT_FRAME::ReCreateOptToolbar()
|
||||||
m_optionsToolBar->Add( EE_ACTIONS::lineModeFree, ACTION_TOOLBAR::TOGGLE );
|
m_optionsToolBar->Add( EE_ACTIONS::lineModeFree, ACTION_TOOLBAR::TOGGLE );
|
||||||
m_optionsToolBar->Add( EE_ACTIONS::lineMode90, ACTION_TOOLBAR::TOGGLE );
|
m_optionsToolBar->Add( EE_ACTIONS::lineMode90, ACTION_TOOLBAR::TOGGLE );
|
||||||
m_optionsToolBar->Add( EE_ACTIONS::lineMode45, ACTION_TOOLBAR::TOGGLE );
|
m_optionsToolBar->Add( EE_ACTIONS::lineMode45, ACTION_TOOLBAR::TOGGLE );
|
||||||
m_optionsToolBar->Add( EE_ACTIONS::lineMode135, ACTION_TOOLBAR::TOGGLE );
|
|
||||||
|
|
||||||
m_optionsToolBar->AddScaledSeparator( this );
|
m_optionsToolBar->AddScaledSeparator( this );
|
||||||
m_optionsToolBar->Add( EE_ACTIONS::toggleAnnotateAuto, ACTION_TOOLBAR::TOGGLE );
|
m_optionsToolBar->Add( EE_ACTIONS::toggleAnnotateAuto, ACTION_TOOLBAR::TOGGLE );
|
||||||
|
|
|
@ -687,7 +687,7 @@ TOOL_ACTION EE_ACTIONS::toggleERCExclusions( "eeschema.EditorControl.showERCExcl
|
||||||
TOOL_ACTION EE_ACTIONS::lineModeFree( "eeschema.EditorControl.lineModeFree",
|
TOOL_ACTION EE_ACTIONS::lineModeFree( "eeschema.EditorControl.lineModeFree",
|
||||||
AS_GLOBAL, 0, "",
|
AS_GLOBAL, 0, "",
|
||||||
_( "Line Mode for Wires and Buses" ), _( "Lines drawn at any angle" ),
|
_( "Line Mode for Wires and Buses" ), _( "Lines drawn at any angle" ),
|
||||||
BITMAPS::unknown, AF_NONE, (void*) LINE_MODE::LINE_MODE_FREE );
|
BITMAPS::lines_any, AF_NONE, (void*) LINE_MODE::LINE_MODE_FREE );
|
||||||
|
|
||||||
TOOL_ACTION EE_ACTIONS::lineMode90( "eeschema.EditorControl.lineModeOrthonal",
|
TOOL_ACTION EE_ACTIONS::lineMode90( "eeschema.EditorControl.lineModeOrthonal",
|
||||||
AS_GLOBAL, 0, "",
|
AS_GLOBAL, 0, "",
|
||||||
|
@ -696,13 +696,8 @@ TOOL_ACTION EE_ACTIONS::lineMode90( "eeschema.EditorControl.lineModeOrthonal",
|
||||||
|
|
||||||
TOOL_ACTION EE_ACTIONS::lineMode45( "eeschema.EditorControl.lineMode45",
|
TOOL_ACTION EE_ACTIONS::lineMode45( "eeschema.EditorControl.lineMode45",
|
||||||
AS_GLOBAL, 0, "",
|
AS_GLOBAL, 0, "",
|
||||||
_( "Line Mode for Wires and Buses" ), _( "Lines drawn horizontally and vertically, with a 45 degree angle end" ),
|
_( "Line Mode for Wires and Buses" ), _( "Lines drawn horizontally, vertically, and at a 45 degree angle" ),
|
||||||
BITMAPS::unknown, AF_NONE, (void*) LINE_MODE::LINE_MODE_45);
|
BITMAPS::hv45mode, AF_NONE, (void*) LINE_MODE::LINE_MODE_45);
|
||||||
|
|
||||||
TOOL_ACTION EE_ACTIONS::lineMode135( "eeschema.EditorControl.lineMode135",
|
|
||||||
AS_GLOBAL, 0, "",
|
|
||||||
_( "Line Mode for Wires and Buses" ), _( "Lines drawn horizontally and vertically, with a 45 degree angle start" ),
|
|
||||||
BITMAPS::unknown, AF_NONE, (void*) LINE_MODE::LINE_MODE_135);
|
|
||||||
|
|
||||||
TOOL_ACTION EE_ACTIONS::lineModeNext( "eeschema.EditorControl.lineModeNext",
|
TOOL_ACTION EE_ACTIONS::lineModeNext( "eeschema.EditorControl.lineModeNext",
|
||||||
AS_GLOBAL, MD_SHIFT + WXK_SPACE, "",
|
AS_GLOBAL, MD_SHIFT + WXK_SPACE, "",
|
||||||
|
|
|
@ -230,7 +230,6 @@ public:
|
||||||
static TOOL_ACTION lineModeFree;
|
static TOOL_ACTION lineModeFree;
|
||||||
static TOOL_ACTION lineMode90;
|
static TOOL_ACTION lineMode90;
|
||||||
static TOOL_ACTION lineMode45;
|
static TOOL_ACTION lineMode45;
|
||||||
static TOOL_ACTION lineMode135;
|
|
||||||
static TOOL_ACTION lineModeNext;
|
static TOOL_ACTION lineModeNext;
|
||||||
|
|
||||||
// Annotation
|
// Annotation
|
||||||
|
|
|
@ -2190,21 +2190,6 @@ int SCH_EDITOR_CONTROL::NextLineMode( const TOOL_EVENT& aEvent )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int SCH_EDITOR_CONTROL::SwitchSegmentPosture( const TOOL_EVENT& aEvent )
|
|
||||||
{
|
|
||||||
// The 45/135 angle modes are the only ones with fixed postures, so
|
|
||||||
// only toggle them if we're already in one of these modes
|
|
||||||
if (m_frame->eeconfig()->m_Drawing.line_mode == LINE_MODE::LINE_MODE_45)
|
|
||||||
m_frame->eeconfig()->m_Drawing.line_mode = LINE_MODE::LINE_MODE_135;
|
|
||||||
else if (m_frame->eeconfig()->m_Drawing.line_mode == LINE_MODE::LINE_MODE_135)
|
|
||||||
m_frame->eeconfig()->m_Drawing.line_mode = LINE_MODE::LINE_MODE_45;
|
|
||||||
|
|
||||||
m_toolMgr->RunAction( ACTIONS::refreshPreview );
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int SCH_EDITOR_CONTROL::ToggleAnnotateAuto( const TOOL_EVENT& aEvent )
|
int SCH_EDITOR_CONTROL::ToggleAnnotateAuto( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
EESCHEMA_SETTINGS* cfg = m_frame->eeconfig();
|
EESCHEMA_SETTINGS* cfg = m_frame->eeconfig();
|
||||||
|
@ -2394,9 +2379,7 @@ void SCH_EDITOR_CONTROL::setTransitions()
|
||||||
Go( &SCH_EDITOR_CONTROL::ChangeLineMode, EE_ACTIONS::lineModeFree.MakeEvent() );
|
Go( &SCH_EDITOR_CONTROL::ChangeLineMode, EE_ACTIONS::lineModeFree.MakeEvent() );
|
||||||
Go( &SCH_EDITOR_CONTROL::ChangeLineMode, EE_ACTIONS::lineMode90.MakeEvent() );
|
Go( &SCH_EDITOR_CONTROL::ChangeLineMode, EE_ACTIONS::lineMode90.MakeEvent() );
|
||||||
Go( &SCH_EDITOR_CONTROL::ChangeLineMode, EE_ACTIONS::lineMode45.MakeEvent() );
|
Go( &SCH_EDITOR_CONTROL::ChangeLineMode, EE_ACTIONS::lineMode45.MakeEvent() );
|
||||||
Go( &SCH_EDITOR_CONTROL::ChangeLineMode, EE_ACTIONS::lineMode135.MakeEvent() );
|
|
||||||
Go( &SCH_EDITOR_CONTROL::NextLineMode, EE_ACTIONS::lineModeNext.MakeEvent() );
|
Go( &SCH_EDITOR_CONTROL::NextLineMode, EE_ACTIONS::lineModeNext.MakeEvent() );
|
||||||
Go( &SCH_EDITOR_CONTROL::SwitchSegmentPosture, EE_ACTIONS::switchSegmentPosture.MakeEvent() );
|
|
||||||
Go( &SCH_EDITOR_CONTROL::ToggleAnnotateAuto, EE_ACTIONS::toggleAnnotateAuto.MakeEvent() );
|
Go( &SCH_EDITOR_CONTROL::ToggleAnnotateAuto, EE_ACTIONS::toggleAnnotateAuto.MakeEvent() );
|
||||||
|
|
||||||
Go( &SCH_EDITOR_CONTROL::TogglePythonConsole, EE_ACTIONS::showPythonConsole.MakeEvent() );
|
Go( &SCH_EDITOR_CONTROL::TogglePythonConsole, EE_ACTIONS::showPythonConsole.MakeEvent() );
|
||||||
|
|
|
@ -141,7 +141,6 @@ public:
|
||||||
int ToggleERCExclusions( const TOOL_EVENT& aEvent );
|
int ToggleERCExclusions( const TOOL_EVENT& aEvent );
|
||||||
int ChangeLineMode( const TOOL_EVENT& aEvent );
|
int ChangeLineMode( const TOOL_EVENT& aEvent );
|
||||||
int NextLineMode( const TOOL_EVENT& aEvent );
|
int NextLineMode( const TOOL_EVENT& aEvent );
|
||||||
int SwitchSegmentPosture( const TOOL_EVENT& aEvent );
|
|
||||||
int ToggleAnnotateAuto( const TOOL_EVENT& aEvent );
|
int ToggleAnnotateAuto( const TOOL_EVENT& aEvent );
|
||||||
int ToggleAnnotateRecursive( const TOOL_EVENT& aEvent );
|
int ToggleAnnotateRecursive( const TOOL_EVENT& aEvent );
|
||||||
int TogglePythonConsole( const TOOL_EVENT& aEvent );
|
int TogglePythonConsole( const TOOL_EVENT& aEvent );
|
||||||
|
|
|
@ -425,7 +425,8 @@ const SCH_SHEET_PIN* SCH_LINE_WIRE_BUS_TOOL::getSheetPin( const VECTOR2I& aPosit
|
||||||
|
|
||||||
void SCH_LINE_WIRE_BUS_TOOL::computeBreakPoint( const std::pair<SCH_LINE*, SCH_LINE*>& aSegments,
|
void SCH_LINE_WIRE_BUS_TOOL::computeBreakPoint( const std::pair<SCH_LINE*, SCH_LINE*>& aSegments,
|
||||||
VECTOR2I& aPosition,
|
VECTOR2I& aPosition,
|
||||||
LINE_MODE mode )
|
LINE_MODE mode,
|
||||||
|
bool posture )
|
||||||
{
|
{
|
||||||
wxCHECK_RET( aSegments.first && aSegments.second,
|
wxCHECK_RET( aSegments.first && aSegments.second,
|
||||||
wxT( "Cannot compute break point of NULL line segment." ) );
|
wxT( "Cannot compute break point of NULL line segment." ) );
|
||||||
|
@ -442,7 +443,7 @@ void SCH_LINE_WIRE_BUS_TOOL::computeBreakPoint( const std::pair<SCH_LINE*, SCH_L
|
||||||
bool preferHorizontal;
|
bool preferHorizontal;
|
||||||
bool preferVertical;
|
bool preferVertical;
|
||||||
|
|
||||||
if( mode == LINE_MODE_135 )
|
if( ( mode == LINE_MODE_45 ) && posture )
|
||||||
{
|
{
|
||||||
preferHorizontal = ( nextSegment->GetEndPoint().x - nextSegment->GetStartPoint().x ) != 0;
|
preferHorizontal = ( nextSegment->GetEndPoint().x - nextSegment->GetStartPoint().x ) != 0;
|
||||||
preferVertical = ( nextSegment->GetEndPoint().y - nextSegment->GetStartPoint().y ) != 0;
|
preferVertical = ( nextSegment->GetEndPoint().y - nextSegment->GetStartPoint().y ) != 0;
|
||||||
|
@ -475,12 +476,16 @@ void SCH_LINE_WIRE_BUS_TOOL::computeBreakPoint( const std::pair<SCH_LINE*, SCH_L
|
||||||
switch( mode )
|
switch( mode )
|
||||||
{
|
{
|
||||||
case LINE_MODE_45:
|
case LINE_MODE_45:
|
||||||
midPoint.x = segment->GetStartPoint().x;
|
if( !posture )
|
||||||
midPoint.y = aPosition.y - yDir * abs( delta.x );
|
{
|
||||||
break;
|
midPoint.x = segment->GetStartPoint().x;
|
||||||
case LINE_MODE_135:
|
midPoint.y = aPosition.y - yDir * abs( delta.x );
|
||||||
midPoint.x = aPosition.x;
|
}
|
||||||
midPoint.y = segment->GetStartPoint().y + yDir * abs( delta.x );
|
else
|
||||||
|
{
|
||||||
|
midPoint.x = aPosition.x;
|
||||||
|
midPoint.y = segment->GetStartPoint().y + yDir * abs( delta.x );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
midPoint.x = segment->GetStartPoint().x;
|
midPoint.x = segment->GetStartPoint().x;
|
||||||
|
@ -494,12 +499,16 @@ void SCH_LINE_WIRE_BUS_TOOL::computeBreakPoint( const std::pair<SCH_LINE*, SCH_L
|
||||||
switch( mode )
|
switch( mode )
|
||||||
{
|
{
|
||||||
case LINE_MODE_45:
|
case LINE_MODE_45:
|
||||||
midPoint.x = aPosition.x - xDir * abs( delta.y );
|
if( !posture )
|
||||||
midPoint.y = segment->GetStartPoint().y;
|
{
|
||||||
break;
|
midPoint.x = aPosition.x - xDir * abs( delta.y );
|
||||||
case LINE_MODE_135:
|
midPoint.y = segment->GetStartPoint().y;
|
||||||
midPoint.x = segment->GetStartPoint().x + xDir * abs( delta.y );
|
}
|
||||||
midPoint.y = aPosition.y;
|
else
|
||||||
|
{
|
||||||
|
midPoint.x = segment->GetStartPoint().x + xDir * abs( delta.y );
|
||||||
|
midPoint.y = aPosition.y;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
midPoint.x = aPosition.x;
|
midPoint.x = aPosition.x;
|
||||||
|
@ -522,14 +531,14 @@ void SCH_LINE_WIRE_BUS_TOOL::computeBreakPoint( const std::pair<SCH_LINE*, SCH_L
|
||||||
// /__________
|
// /__________
|
||||||
VECTOR2I deltaMidpoint = midPoint - segment->GetStartPoint();
|
VECTOR2I deltaMidpoint = midPoint - segment->GetStartPoint();
|
||||||
|
|
||||||
if( mode == LINE_MODE::LINE_MODE_45
|
if( mode == LINE_MODE::LINE_MODE_45 && !posture
|
||||||
&& ( ( alg::signbit( deltaMidpoint.x ) != alg::signbit( delta.x ) )
|
&& ( ( alg::signbit( deltaMidpoint.x ) != alg::signbit( delta.x ) )
|
||||||
|| ( alg::signbit( deltaMidpoint.y ) != alg::signbit( delta.y ) ) ) )
|
|| ( alg::signbit( deltaMidpoint.y ) != alg::signbit( delta.y ) ) ) )
|
||||||
{
|
{
|
||||||
preferVertical = false;
|
preferVertical = false;
|
||||||
preferHorizontal = false;
|
preferHorizontal = false;
|
||||||
}
|
}
|
||||||
else if( mode == LINE_MODE::LINE_MODE_135
|
else if( mode == LINE_MODE::LINE_MODE_45 && posture
|
||||||
&& ( ( abs( deltaMidpoint.x ) > abs( delta.x ) )
|
&& ( ( abs( deltaMidpoint.x ) > abs( delta.x ) )
|
||||||
|| ( abs( deltaMidpoint.y ) > abs( delta.y ) ) ) )
|
|| ( abs( deltaMidpoint.y ) > abs( delta.y ) ) ) )
|
||||||
{
|
{
|
||||||
|
@ -558,6 +567,7 @@ int SCH_LINE_WIRE_BUS_TOOL::doDrawSegments( const std::string& aTool, int aType,
|
||||||
EE_GRID_HELPER grid( m_toolMgr );
|
EE_GRID_HELPER grid( m_toolMgr );
|
||||||
KIGFX::VIEW_CONTROLS* controls = getViewControls();
|
KIGFX::VIEW_CONTROLS* controls = getViewControls();
|
||||||
int lastMode = m_frame->eeconfig()->m_Drawing.line_mode;
|
int lastMode = m_frame->eeconfig()->m_Drawing.line_mode;
|
||||||
|
static bool posture = false;
|
||||||
|
|
||||||
auto setCursor =
|
auto setCursor =
|
||||||
[&]()
|
[&]()
|
||||||
|
@ -774,11 +784,8 @@ int SCH_LINE_WIRE_BUS_TOOL::doDrawSegments( const std::string& aTool, int aType,
|
||||||
// When placing lines with the forty-five degree end, the user is
|
// When placing lines with the forty-five degree end, the user is
|
||||||
// targetting the endpoint with the angled portion, so it's more
|
// targetting the endpoint with the angled portion, so it's more
|
||||||
// intuitive to place both segments at the same time.
|
// intuitive to place both segments at the same time.
|
||||||
if( currentMode == LINE_MODE::LINE_MODE_45
|
if( currentMode == LINE_MODE::LINE_MODE_45 )
|
||||||
|| currentMode == LINE_MODE::LINE_MODE_135 )
|
|
||||||
{
|
|
||||||
placedSegments++;
|
placedSegments++;
|
||||||
}
|
|
||||||
|
|
||||||
segment->SetEndPoint( cursorPos );
|
segment->SetEndPoint( cursorPos );
|
||||||
|
|
||||||
|
@ -799,7 +806,7 @@ int SCH_LINE_WIRE_BUS_TOOL::doDrawSegments( const std::string& aTool, int aType,
|
||||||
{
|
{
|
||||||
if( twoSegments && m_wires.size() >= 2 )
|
if( twoSegments && m_wires.size() >= 2 )
|
||||||
computeBreakPoint( { m_wires[m_wires.size() - 2], segment }, cursorPos,
|
computeBreakPoint( { m_wires[m_wires.size() - 2], segment }, cursorPos,
|
||||||
currentMode );
|
currentMode, posture );
|
||||||
|
|
||||||
finishSegments();
|
finishSegments();
|
||||||
segment = nullptr;
|
segment = nullptr;
|
||||||
|
@ -860,7 +867,7 @@ int SCH_LINE_WIRE_BUS_TOOL::doDrawSegments( const std::string& aTool, int aType,
|
||||||
if( twoSegments && m_wires.size() >= 2 )
|
if( twoSegments && m_wires.size() >= 2 )
|
||||||
{
|
{
|
||||||
computeBreakPoint( { m_wires[m_wires.size() - 2], segment }, cursorPos,
|
computeBreakPoint( { m_wires[m_wires.size() - 2], segment }, cursorPos,
|
||||||
currentMode );
|
currentMode, posture );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -892,7 +899,7 @@ int SCH_LINE_WIRE_BUS_TOOL::doDrawSegments( const std::string& aTool, int aType,
|
||||||
if( twoSegments && m_wires.size() >= 2 )
|
if( twoSegments && m_wires.size() >= 2 )
|
||||||
{
|
{
|
||||||
computeBreakPoint( { m_wires[m_wires.size() - 2], segment }, cursorPos,
|
computeBreakPoint( { m_wires[m_wires.size() - 2], segment }, cursorPos,
|
||||||
currentMode );
|
currentMode, posture );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -910,12 +917,14 @@ int SCH_LINE_WIRE_BUS_TOOL::doDrawSegments( const std::string& aTool, int aType,
|
||||||
wxBell();
|
wxBell();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( evt->IsAction( &EE_ACTIONS::switchSegmentPosture ) )
|
else if( evt->IsAction( &EE_ACTIONS::switchSegmentPosture ) && m_wires.size() >= 2 )
|
||||||
{
|
{
|
||||||
|
posture = !posture;
|
||||||
|
|
||||||
// The 90 degree mode doesn't have a forced posture like
|
// The 90 degree mode doesn't have a forced posture like
|
||||||
// the 45 and 135 degree modes, so we don't have a mode to toggle
|
// the 45 degree mode and computeBreakPoint maintains existing 90s' postures.
|
||||||
// in the UI. Instead, just swap the 90 angle here.
|
// Instead, just swap the 90 angle here.
|
||||||
if( currentMode == LINE_MODE::LINE_MODE_90 && m_wires.size() >= 2 )
|
if( currentMode == LINE_MODE::LINE_MODE_90 )
|
||||||
{
|
{
|
||||||
m_view->ClearPreview();
|
m_view->ClearPreview();
|
||||||
|
|
||||||
|
@ -936,9 +945,10 @@ int SCH_LINE_WIRE_BUS_TOOL::doDrawSegments( const std::string& aTool, int aType,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Posture change for 45/135 will come back around as a mode
|
computeBreakPoint( { m_wires[m_wires.size() - 2], segment }, cursorPos, currentMode,
|
||||||
// change and we'll refresh as needed
|
posture );
|
||||||
evt->SetPassEvent();
|
|
||||||
|
m_toolMgr->RunAction( ACTIONS::refreshPreview );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
|
|
|
@ -131,9 +131,10 @@ private:
|
||||||
* @param aPosition A reference to a wxPoint object containing the coordinates of the
|
* @param aPosition A reference to a wxPoint object containing the coordinates of the
|
||||||
* position used to calculate the line break point.
|
* position used to calculate the line break point.
|
||||||
* @param mode LINE_MODE specifying the way to break the line
|
* @param mode LINE_MODE specifying the way to break the line
|
||||||
|
* @param posture Toggles the posture of the line
|
||||||
*/
|
*/
|
||||||
void computeBreakPoint( const std::pair<SCH_LINE*, SCH_LINE*>& aSegments, VECTOR2I& aPosition,
|
void computeBreakPoint( const std::pair<SCH_LINE*, SCH_LINE*>& aSegments, VECTOR2I& aPosition,
|
||||||
LINE_MODE mode );
|
LINE_MODE mode, bool posture );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_inDrawingTool; // Reentrancy guard
|
bool m_inDrawingTool; // Reentrancy guard
|
||||||
|
|
|
@ -365,6 +365,7 @@ const std::vector<BITMAP_INFO> g_BitmapInfo = {
|
||||||
{ BITMAPS::library_archive_as, wxT( "library_archive_as_24.png" ), 24, wxT( "light" ) },
|
{ BITMAPS::library_archive_as, wxT( "library_archive_as_24.png" ), 24, wxT( "light" ) },
|
||||||
{ BITMAPS::library, wxT( "library_24.png" ), 24, wxT( "light" ) },
|
{ BITMAPS::library, wxT( "library_24.png" ), 24, wxT( "light" ) },
|
||||||
{ BITMAPS::library_table, wxT( "library_table_24.png" ), 24, wxT( "light" ) },
|
{ BITMAPS::library_table, wxT( "library_table_24.png" ), 24, wxT( "light" ) },
|
||||||
|
{ BITMAPS::lines_any, wxT( "lines_any_24.png" ), 24, wxT( "light" ) },
|
||||||
{ BITMAPS::lines90, wxT( "lines90_24.png" ), 24, wxT( "light" ) },
|
{ BITMAPS::lines90, wxT( "lines90_24.png" ), 24, wxT( "light" ) },
|
||||||
{ BITMAPS::list_nets, wxT( "list_nets_24.png" ), 24, wxT( "light" ) },
|
{ BITMAPS::list_nets, wxT( "list_nets_24.png" ), 24, wxT( "light" ) },
|
||||||
{ BITMAPS::load_drill, wxT( "load_drill_24.png" ), 24, wxT( "light" ) },
|
{ BITMAPS::load_drill, wxT( "load_drill_24.png" ), 24, wxT( "light" ) },
|
||||||
|
@ -705,6 +706,7 @@ const std::vector<BITMAP_INFO> g_BitmapInfo = {
|
||||||
{ BITMAPS::hotkeys, wxT( "hotkeys_dark_24.png" ), 24, wxT( "dark" ) },
|
{ BITMAPS::hotkeys, wxT( "hotkeys_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
{ BITMAPS::hole_to_hole_clearance, wxT( "hole_to_hole_clearance_dark_24.png" ), 24, wxT( "dark" ) },
|
{ BITMAPS::hole_to_hole_clearance, wxT( "hole_to_hole_clearance_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
{ BITMAPS::hole_to_copper_clearance, wxT( "hole_to_copper_clearance_dark_24.png" ), 24, wxT( "dark" ) },
|
{ BITMAPS::hole_to_copper_clearance, wxT( "hole_to_copper_clearance_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
|
{ BITMAPS::hv45mode, wxT( "hv45mode_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
{ BITMAPS::icon_cvpcb_24, wxT( "icon_cvpcb_24_dark_24.png" ), 24, wxT( "dark" ) },
|
{ BITMAPS::icon_cvpcb_24, wxT( "icon_cvpcb_24_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
{ BITMAPS::icon_footprint_browser, wxT( "icon_footprint_browser_dark_24.png" ), 24, wxT( "dark" ) },
|
{ BITMAPS::icon_footprint_browser, wxT( "icon_footprint_browser_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
{ BITMAPS::icon_gerbview_24, wxT( "icon_gerbview_24_dark_24.png" ), 24, wxT( "dark" ) },
|
{ BITMAPS::icon_gerbview_24, wxT( "icon_gerbview_24_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
|
@ -734,6 +736,7 @@ const std::vector<BITMAP_INFO> g_BitmapInfo = {
|
||||||
{ BITMAPS::library_archive_as, wxT( "library_archive_as_dark_24.png" ), 24, wxT( "dark" ) },
|
{ BITMAPS::library_archive_as, wxT( "library_archive_as_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
{ BITMAPS::library, wxT( "library_dark_24.png" ), 24, wxT( "dark" ) },
|
{ BITMAPS::library, wxT( "library_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
{ BITMAPS::library_table, wxT( "library_table_dark_24.png" ), 24, wxT( "dark" ) },
|
{ BITMAPS::library_table, wxT( "library_table_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
|
{ BITMAPS::lines_any, wxT( "lines_any_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
{ BITMAPS::lines90, wxT( "lines90_dark_24.png" ), 24, wxT( "dark" ) },
|
{ BITMAPS::lines90, wxT( "lines90_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
{ BITMAPS::list_nets, wxT( "list_nets_dark_24.png" ), 24, wxT( "dark" ) },
|
{ BITMAPS::list_nets, wxT( "list_nets_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
{ BITMAPS::load_drill, wxT( "load_drill_dark_24.png" ), 24, wxT( "dark" ) },
|
{ BITMAPS::load_drill, wxT( "load_drill_dark_24.png" ), 24, wxT( "dark" ) },
|
||||||
|
|
|
@ -307,6 +307,7 @@ enum class BITMAPS : unsigned int
|
||||||
library_archive_as,
|
library_archive_as,
|
||||||
library_browser,
|
library_browser,
|
||||||
library_table,
|
library_table,
|
||||||
|
lines_any,
|
||||||
lines90,
|
lines90,
|
||||||
list_nets,
|
list_nets,
|
||||||
list_nets_16,
|
list_nets_16,
|
||||||
|
|
Loading…
Reference in New Issue