6.5 KiB
6.5 KiB
name, overview, todos, isProject
| name | overview | todos | isProject | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Vormenknop | Een nieuwe werkbalkknop "Vormen" naast Rechthoek en Ellips, met in de eigenschappenbalk een keuzelijst voor 11 vormen (driehoek, pijl, ster, wolk, ballon, hart, maan, druppel, ei, bliksemschicht, spiraal). Je tekent een vorm door een kader te slepen, net als bij een rechthoek. |
|
false |
Vormenknop met 11 vormen
Gedrag
- Er komt een nieuwe gereedschapsknop Vormen direct na Ellips. Rechthoek en Ellips blijven zoals ze zijn.
- In de eigenschappenbalk staat een keuzelijst Vorm (icoon plus naam): Driehoek, Pijl, Ster, Wolk, Ballon, Hart, Maan, Druppel, Ei, Bliksemschicht, Spiraal.
- Het icoon op de werkbalkknop toont de laatst gekozen vorm. De keuze wordt per gereedschap onthouden, net als de andere stijlinstellingen.
- Tekenen gaat door een kader te slepen; de vorm vult dat kader. Met Shift wordt het kader vierkant. Er zijn 8 formaatgrepen, net als bij een rechthoek.
- Eigenschappen: randkleur, vulkleur, dikte, stippellijn en schaduw. De spiraal is een open lijn en krijgt geen vulling.
- Bij een geselecteerde vorm kun je via de keuzelijst een andere vorm kiezen (met undo).
- Spiegelen (horizontaal en verticaal) werkt voor vormen, zodat de pijl, maan, bliksem, ballon en spiraal ook de andere kant op kunnen.
- Sneltoets F (figuur), want de meeste voor de hand liggende letters zijn al bezet.
- Aanname: Ballon is hier een tekstballon zonder tekst (afgeronde rechthoek met een staart linksonder) en Wolk een gedachtewolk zonder staart, als losse vorm. Voor een ballon of wolk met tekst blijft het tekstgereedschap bestaan.
Technische aanpak
1. Model in src/Kniip/Editor/StyleSet.cs
ToolKind.Shapeachteraan toevoegen. Instellingen worden als tekst opgeslagen (JsonStringEnumConverter), dus de volgorde breekt niets.- Nieuwe enum
ShapeKind { Triangle, BlockArrow, Star, Cloud, Balloon, Heart, Moon, Drop, Egg, Lightning, Spiral }. StyleSet.ShapeKind(standaardTriangle) en vlagStyleProps.ShapeKind.PropsFor(ToolKind.Shape)= Stroke, Fill, Thickness, Dash, Shadow, ShapeKind.DefaultForgebruikt de gewone standaard (rode rand, geen vulling).
2. Geometrie in een nieuw bestand src/Kniip/Editor/Annotations/ShapeGeometries.cs
Geometry For(ShapeKind kind)bouwt elke vorm in een eenheidsvierkant (0..1), gecachet en bevroren, zoals CursorGeometries.cs:- Driehoek, Pijl (blokpijl naar rechts), Ster (5 punten), Bliksemschicht: rechte polygonen.
- Hart, Druppel, Ei, Maan, Ballon: Bezier- en boogsegmenten in een
StreamGeometry. De maan wordt een cirkel min een verschoven cirkel (GeometryCombineMode.Exclude). - Wolk: een vereniging van cirkels, zoals
TextAnnotationdat al doet. - Spiraal: een open polyline langs een Archimedes-spiraal (ongeveer 3 omwentelingen).
bool IsOpen(ShapeKind)geeft true voor Spiraal.Geometry Icon(ShapeKind)schaalt dezelfde vorm naar 20x20 voor de knop en de keuzelijst. Er komt eenShapeIconConverternaar het voorbeeld van CursorIconConverter.cs.
3. Annotatie: nieuw src/Kniip/Editor/Annotations/FigureAnnotation.cs, afgeleid van RectAnnotation.cs, zodat grepen, verplaatsen en Shift al werken.
Kind => ToolKind.Shape. De vorm komt uitStyle.ShapeKind, zodat wisselen viaChangeStylemeteen werkt.Render: de eenheidsgeometrie klonen met eenMatrixTransformnaarRect(plus een spiegeling metFlipX/FlipY). De lijndikte schaalt daardoor niet mee. Tekenen gebeurt viaRenderHelpers.DrawWithShadow, zonder vulling bij een open vorm.HitTest:FillContainsvoor gesloten vormen,StrokeContainsmet tolerantie voor de spiraal.CanFlip => true;FlipwisseltFlipXofFlipY.
4. Editor in src/Kniip/Editor/EditorWindow.xaml en EditorWindow.xaml.cs
- XAML: een
RadioButton Tag="Shape" ItemId="Shape" Title="Vormen"na Ellips, met eenPath x:Name="ShapeToolIcon". Daarnaast eenShapeKindTemplate(icoon via de converter, plus een label per waarde, net alsCursorKindTemplate) en eenShapeGroupmetShapeKindComboin de eigenschappenbalk. - Code:
ShapeKindValuesalsItemsSource."Shape"na"Ellipse"inDefaultSplitOrder.MergeToolbarOrderzet de nieuwe knop bij bestaande gebruikers automatisch na Ellips.CreateAnnotation:ToolKind.Shape => new FigureAnnotation { Rect = new Rect(p, p), Style = style }.UpdatePropsPanel: zichtbaarheid vanShapeGroupen selectie vanShapeKindCombo. De vulling wordt verborgen bij Spiraal.- Handler
ShapeKind_ChangedroeptChangeStyle("shape", s => s.ShapeKind = kind)aan en werktShapeToolIconbij. Bij het starten wordt het icoon ook gezet. - Sneltoets
Key.Fen een hinttekst: "Sleep om de gekozen vorm te tekenen. Shift = gelijke breedte en hoogte. Kies een andere vorm in de balk eronder."
flowchart LR
ShapeKindCombo --> ChangeStyle --> StyleShapeKind["StyleSet.ShapeKind"]
StyleShapeKind --> ShapeGeometries
ShapeGeometries --> FigureAnnotation
ShapeGeometries --> ShapeIconConverter
ShapeIconConverter --> ShapeToolIcon
ShapeIconConverter --> ShapeKindTemplate
Buiten scope
- Draaien van vormen. Een pijl omhoog of omlaag kan daardoor niet; links en rechts wel, via spiegelen.
- Tekst in een vorm. Daarvoor blijft het tekstgereedschap met ballon en wolk.
- Instelbare details per vorm, zoals het aantal punten van de ster, de dikte van de maan of het aantal windingen van de spiraal.