Things To Do While Implementing Clusters in Gargoyle
Change SetOrientation to take slice and parts (so we can set parts of clusters)
Fix GGSceneImpl.DeleteSliceParts to call Prune.
If an interpress file is not found for a storebyreference slice, make an empty interpress slice with the bounding box mentioned.
Routines for geting, setting and showing frozen are not yet implemented.
Frozen clusters should move rigidly.
Grep for GGParent.GetParent calls. Replace with GetTopLevelAncestor, where needed.
Combine GGUtilityimplB and C to save GFIs.
OutlineData => ParentData.
OutlineParts => ParentParts.
Routines that might make better use of clustering:
GGEventImplD.Top, Bottom, UpOne ... could rearrange order within clusters(?)
Replace GGOutlineImplB.SaveSelectionsInOutlineAllClasses by GGSelect.SaveSelectionsInSliceAllClasses
SafelyGetCaretTraj doesn't compute partType.
FollowCPNum in GGSegment?
eliminate SegmentsInDescriptors from GGEventImplB.
Move GGScene.IsTopLevel to GGParent.
Move PreviousJoint to GGTraj.
Check if LineIntersection and CircleIntersection are useful anymore.
Used in IntersectionProc matrix in GGMultiGravityImpl:
(32086): ... ----] ← GGSliceOps.LineIntersection[sliceD, line]...
(32356): ... ----] ← GGSliceOps.CircleIntersection[sliceD, cir...
Possible additional selection ops:
Select leaves
Show level (0 => top)
Count levels
Count children
If clusters become large, then our refresh optimization to draw only part of something on the overlay will become essential. See also MovingParts procs.
grep -f -c -p (SetBoxText|SetFillText|GetBoxText) GG*impl*.mesa
[]<>7.0>Gargoyle>GGEventImplA.mesa!213
AddHoles, DeleteHoles. Rework.
[]<>7.0>Gargoyle>GGEventImplE.mesa!191
Set/Show stylekind, stuff/grab. Done.
[]<>7.0>Gargoyle>GGOutlineImplA.mesa!234
Outline Create and Copy. No change.
[]<>7.0>Gargoyle>GGOutlineImplB.mesa!154
SetFillTextImpl.
[]<>7.0>Gargoyle>GGSceneImpl.mesa!123
DeleteSlicePart. VERIFY.
[]<>7.0>Gargoyle>GGSelectImpl.mesa!93
ForEachOutlineRun. VERIFY.
[]<>7.0>Gargoyle>GGSliceImplA.mesa!231
SetBoxText/GetBoxText impls.
BoxCopy: copys fill if TopLevel
BoxTransform: tricky. VERIFY.
BoxFileIn/Out: VERIFY.
GGEventImplB.DeleteCaretSegment
SelectAll followed by walks.
GGEventImplE.ConvertTextToSplines should preserve cluster structure.
GGEventImplC.AddControlPoint, DeleteControlPoint, AddJoint
GGEventImplE.SetStraight, SetArc, SetConic ...,
Add GGSlice.GetDefaultUseLatestIPVersion, to be called by GGUserProfile.GetDefaultUseLatestIPVersion.
CopyStrokeValues doesn't copy from a traj to itself.
ShowNewlineFactor should complain about multiple values instead of "only on text string".
IP slice bounding boxes are too large. They don't need to allow for control point size.
CopyColor, CopyFont, CopyStrokeValues, should all use GGSelect.GetLastSelection.
Cluster numbers should start from 0.
Changing Fill Color should extend to the containing Outline, not to top level.
Unclustering seems to get rid of hotness.
Provide tree-walking operations for clusters. (GrowSelection, SelectForward, SelectRearward, ShrinkToForemost, ShrinktoRearmost)
GGSliceOps.RemakeSelections should just build a SliceDescriptor, rather than changing the scene selection lists. This allows for SaveSelections to be used without affecting scene selections.
AddHoles doesn't work in clusters.
TiogaFill is broken. Make it work in clusters.
Add Cluster to SelectUnseeableObjs in impl C.
Fix GGEventImplC.SelectUnseeableObjs to work for clusters.
Eliminate GGSlice.ParentOfSlice or move it to GGParent. Should not be used in place of GetParent.
Clustering seems to get rid of hotness.
Get rid of the backgndOK: TRUE argument to RestoreScreenAndInvariants. ??? KAP.
GGEventImplC.GetWeldArguments should allow welding to occur within a cluster.
GGEventImplC.WeldToSelf should work within clusters.
GGEventImplD.SelectMatchingAreaColor should allow for finding parts of a cluster.
Circles shouldn't use NoOp StrokeEnd proc, because dash patterns use StrokeEnd.
Get rid of ShowColors button.
Fix all restore procs to restore commented out pieces.
GGSliceOps.GetStrokeColor and GGSliceOps.GetFillColor should return "success" which is FALSE if the color is not unique. GGEventImplD.GetSelectedFillColor should use this feature.
GGEventImplD.AreaColorToColorTool requires a special cased WalkProc to find Fill Colors.
Get rid of SliceDescriptors as procedure input parameters.
Remember to filein "Children", not Trajectories.
Remember to implement Restore for Cluster class.
Fix printout for SceneBag in Debug2 menu.
Fix Address Fault on Clear when there is no HistoryTool.
Fix PolygonInCircle (EventImplC).
Select new cluster after Cluster.
Select children after Uncluster.
Fix copy procs to ignore parts where appropriate and update GGSceneImpl.CopySelectedParts.
Overlap order in cluster copy.
For Copy, which expects selected type instead of type embedded in cluster.
GGScene.SlicesInScene and similar procs return topLevel slices. What is intended?? Probably should retire all such procs and use WalkSlicesInSceneByClass.
List of files containing $Outline:
qfind -f -w "$Outline" GG*.mesa
[]<>7.0>Gargoyle>GGCaretImpl.mesa!36
[]<>7.0>Gargoyle>GGEventImplA.mesa!183
[]<>7.0>Gargoyle>GGEventImplB.mesa!102
[]<>7.0>Gargoyle>GGEventImplC.mesa!124
[]<>7.0>Gargoyle>GGEventImplD.mesa!158
[]<>7.0>Gargoyle>GGEventImplE.mesa!185
[]<>7.0>Gargoyle>GGFileImpl.mesa!43
[]<>7.0>Gargoyle>GGHistoryImpl.mesa!151
[]<>7.0>Gargoyle>GGMouseEventImplB.mesa!69
[]<>7.0>Gargoyle>GGOutlineImplA.mesa!228
[]<>7.0>Gargoyle>GGOutlineImplB.mesa!138
[]<>7.0>Gargoyle>GGRefreshImpl.mesa!43
[]<>7.0>Gargoyle>GGSceneImpl.mesa!101
[]<>7.0>Gargoyle>GGSelectImpl.mesa!86
[]<>7.0>Gargoyle>GGSequenceImpl.mesa!65
[]<>7.0>Gargoyle>GGSliceImplA.mesa!217
[]<>7.0>Gargoyle>GGSliceImplE.mesa!58
[]<>7.0>Gargoyle>GGSliceOpsImpl.mesa!87
Code fragments for dealing with new selections while walking selections
WalkSelectedSlices
SelectEntireSlice
newSelectList, ptr: LIST OF Slice;
[newSelectList, ptr] ← GGUtility.StartSliceList[];
[newSelectList, ptr] ← GGUtility.AddSlice[sliceD.slice, newSelectList, ptr];
FOR list: LIST OF Slice ← newSelectList, list.rest UNTIL list = NIL DO
GGSelect.SelectEntireSlice[list.first, ggData.scene, normal];
ENDLOOP;