Multiple selection improvements

This commit is contained in:
dexy 2020-01-12 19:25:41 +11:00
parent 581ae73db5
commit dab6c7101e
3 changed files with 622 additions and 855 deletions

View File

@ -707,7 +707,7 @@ namespace CodeWalker.Project
ShowProjectItemInProcess = false; ShowProjectItemInProcess = false;
} }
public void SetProjectItem(object item) public void SetProjectItem(object item, bool refreshUI = true)
{ {
CurrentYmapFile = item as YmapFile; CurrentYmapFile = item as YmapFile;
CurrentMloEntity = item as MCEntityDef; CurrentMloEntity = item as MCEntityDef;
@ -870,7 +870,10 @@ namespace CodeWalker.Project
CurrentAudioFile = CurrentAudioInteriorRoom.Rel; CurrentAudioFile = CurrentAudioInteriorRoom.Rel;
} }
if (refreshUI)
{
RefreshUI(); RefreshUI();
}
} }
public void SetCurrentArchetype(Archetype arch) public void SetCurrentArchetype(Archetype arch)
@ -1488,6 +1491,80 @@ namespace CodeWalker.Project
public object NewObject(MapSelection sel, bool copyPosition = false, bool selectNew = true)
{
//general method to add a new object, given a map selection
SelectObject(ref sel);
if (sel.MultipleSelectionItems != null)
{
var objs = new List<object>();
for (int i = 0; i < sel.MultipleSelectionItems.Length; i++)
{
objs.Add(NewObject(sel.MultipleSelectionItems[i], copyPosition, false));
}
LoadProjectTree();
return objs.ToArray();
}
else if (sel.EntityDef != null) return NewEntity(sel.EntityDef, copyPosition, selectNew);
else if (sel.CarGenerator != null) return NewCarGen(sel.CarGenerator, copyPosition, selectNew);
else if (sel.PathNode != null) return NewPathNode(sel.PathNode, copyPosition, selectNew);
else if (sel.NavPoly != null) return NewNavPoly(sel.NavPoly, copyPosition, selectNew);
else if (sel.NavPoint != null) return NewNavPoint(sel.NavPoint, copyPosition, selectNew);
else if (sel.NavPortal != null) return NewNavPortal(sel.NavPortal, copyPosition, selectNew);
else if (sel.TrainTrackNode != null) return NewTrainNode(sel.TrainTrackNode, copyPosition, selectNew);
else if (sel.ScenarioNode != null) return NewScenarioNode(sel.ScenarioNode, copyPosition, selectNew);
else if (sel.Audio?.AudioZone != null) return NewAudioZone(sel.Audio, copyPosition, selectNew);
else if (sel.Audio?.AudioEmitter != null) return NewAudioEmitter(sel.Audio, copyPosition, selectNew);
return null;
}
public void DeleteObject(MapSelection sel)
{
SelectObject(ref sel);
if (sel.MultipleSelectionItems != null)
{
for (int i = 0; i < sel.MultipleSelectionItems.Length; i++)
{
DeleteObject(sel.MultipleSelectionItems[i]);
}
}
else if (sel.EntityDef != null) DeleteEntity();
else if (sel.CarGenerator != null) DeleteCarGen();
else if (sel.PathNode != null) DeletePathNode();
else if (sel.NavPoly != null) DeleteNavPoly();
else if (sel.NavPoint != null) DeleteNavPoint();
else if (sel.NavPortal != null) DeleteNavPortal();
else if (sel.TrainTrackNode != null) DeleteTrainNode();
else if (sel.ScenarioNode != null) DeleteScenarioNode();
else if (sel.Audio?.AudioZone != null) DeleteAudioZone();
else if (sel.Audio?.AudioEmitter != null) DeleteAudioEmitter();
else if (sel.CollisionVertex != null) DeleteCollisionVertex();
else if (sel.CollisionPoly != null) DeleteCollisionPoly();
else if (sel.CollisionBounds != null) DeleteCollisionBounds();
}
public void SelectObject(ref MapSelection sel)
{
if (sel.MultipleSelectionItems != null) { } //todo...
else if (sel.EntityDef != null) SetProjectItem(sel.EntityDef, false);
else if (sel.CarGenerator != null) SetProjectItem(sel.CarGenerator, false);
else if (sel.PathNode != null) SetProjectItem(sel.PathNode, false);
else if (sel.NavPoly != null) SetProjectItem(sel.NavPoly, false);
else if (sel.NavPoint != null) SetProjectItem(sel.NavPoint, false);
else if (sel.NavPortal != null) SetProjectItem(sel.NavPortal, false);
else if (sel.TrainTrackNode != null) SetProjectItem(sel.TrainTrackNode, false);
else if (sel.ScenarioNode != null) SetProjectItem(sel.ScenarioNode, false);
else if (sel.Audio?.AudioZone != null) SetProjectItem(sel.Audio, false);
else if (sel.Audio?.AudioEmitter != null) SetProjectItem(sel.Audio, false);
else if (sel.CollisionVertex != null) SetProjectItem(sel.CollisionVertex, false);
else if (sel.CollisionPoly != null) SetProjectItem(sel.CollisionPoly, false);
else if (sel.CollisionBounds != null) SetProjectItem(sel.CollisionBounds, false);
}
public void NewYmap() public void NewYmap()
{ {
if (CurrentProjectFile == null) if (CurrentProjectFile == null)
@ -1669,9 +1746,21 @@ namespace CodeWalker.Project
return CurrentProjectFile.ContainsYmap(ymap); return CurrentProjectFile.ContainsYmap(ymap);
} }
public void NewEntity(YmapEntityDef copy = null, bool copyPosition = false) public YmapEntityDef NewEntity(YmapEntityDef copy = null, bool copyPosition = false, bool selectNew = true)
{ {
if (CurrentYmapFile == null) return; if (copy != null)
{
//create the entity in MLO instead of a ymap, if the copy is in an MLO
var instance = copy.MloParent?.MloInstance;
var entdef = instance?.TryGetArchetypeEntity(copy);
if (entdef != null)
{
return NewMloEntity(copy, copyPosition, selectNew);
}
}
if (CurrentYmapFile == null) return null;
float spawndist = 5.0f; //use archetype BSradius if starting with a copy... float spawndist = 5.0f; //use archetype BSradius if starting with a copy...
if (copy != null) if (copy != null)
@ -1724,12 +1813,17 @@ namespace CodeWalker.Project
} }
LoadProjectTree();
if (selectNew)
{
LoadProjectTree();
ProjectExplorer?.TrySelectEntityTreeNode(ent); ProjectExplorer?.TrySelectEntityTreeNode(ent);
CurrentEntity = ent; CurrentEntity = ent;
ShowEditYmapEntityPanel(false); ShowEditYmapEntityPanel(false);
} }
return ent;
}
public void AddEntityToProject() public void AddEntityToProject()
{ {
try try
@ -1803,10 +1897,10 @@ namespace CodeWalker.Project
} }
} }
if (MessageBox.Show("Are you sure you want to delete this entity?\n" + CurrentEntity._CEntityDef.archetypeName.ToString() + "\n" + CurrentEntity.Position.ToString() + "\n\nThis operation cannot be undone. Continue?", "Confirm delete", MessageBoxButtons.YesNo) != DialogResult.Yes) //if (MessageBox.Show("Are you sure you want to delete this entity?\n" + CurrentEntity._CEntityDef.archetypeName.ToString() + "\n" + CurrentEntity.Position.ToString() + "\n\nThis operation cannot be undone. Continue?", "Confirm delete", MessageBoxButtons.YesNo) != DialogResult.Yes)
{ //{
return true; // return true;
} //}
bool res = false; bool res = false;
if (WorldForm != null) if (WorldForm != null)
@ -1843,9 +1937,9 @@ namespace CodeWalker.Project
return CurrentEntity == ent; return CurrentEntity == ent;
} }
public void NewGrassBatch(YmapGrassInstanceBatch copy = null) public YmapGrassInstanceBatch NewGrassBatch(YmapGrassInstanceBatch copy = null)
{ {
if (CurrentYmapFile == null) return; if (CurrentYmapFile == null) return null;
rage__fwGrassInstanceListDef fwBatch = new rage__fwGrassInstanceListDef(); rage__fwGrassInstanceListDef fwBatch = new rage__fwGrassInstanceListDef();
rage__fwGrassInstanceListDef__InstanceData[] instances = new rage__fwGrassInstanceListDef__InstanceData[0]; rage__fwGrassInstanceListDef__InstanceData[] instances = new rage__fwGrassInstanceListDef__InstanceData[0];
@ -1895,6 +1989,8 @@ namespace CodeWalker.Project
ProjectExplorer?.TrySelectGrassBatchTreeNode(batch); ProjectExplorer?.TrySelectGrassBatchTreeNode(batch);
CurrentGrassBatch = batch; CurrentGrassBatch = batch;
ShowEditYmapGrassBatchPanel(false); ShowEditYmapGrassBatchPanel(false);
return batch;
} }
public void AddGrassBatchToProject() public void AddGrassBatchToProject()
{ {
@ -1992,9 +2088,9 @@ namespace CodeWalker.Project
return false; return false;
} }
public void NewCarGen(YmapCarGen copy = null, bool copyPosition = false) public YmapCarGen NewCarGen(YmapCarGen copy = null, bool copyPosition = false, bool selectNew = true)
{ {
if (CurrentYmapFile == null) return; if (CurrentYmapFile == null) return null;
Vector3 pos = GetSpawnPos(10.0f); Vector3 pos = GetSpawnPos(10.0f);
@ -2037,12 +2133,15 @@ namespace CodeWalker.Project
} }
if (selectNew)
{
LoadProjectTree(); LoadProjectTree();
ProjectExplorer?.TrySelectCarGenTreeNode(cg); ProjectExplorer?.TrySelectCarGenTreeNode(cg);
CurrentCarGen = cg; CurrentCarGen = cg;
ShowEditYmapCarGenPanel(false); ShowEditYmapCarGenPanel(false);
} }
return cg;
}
public void AddCarGenToProject() public void AddCarGenToProject()
{ {
if (CurrentCarGen == null) return; if (CurrentCarGen == null) return;
@ -2426,9 +2525,9 @@ namespace CodeWalker.Project
return CurrentProjectFile.ContainsYtyp(ytyp); return CurrentProjectFile.ContainsYtyp(ytyp);
} }
public void NewArchetype(Archetype copy = null, bool copyPosition = false) public Archetype NewArchetype(Archetype copy = null)
{ {
if (CurrentYtypFile == null) return; if (CurrentYtypFile == null) return null;
var archetype = CurrentYtypFile.AddArchetype(); var archetype = CurrentYtypFile.AddArchetype();
var archetypeDef = archetype._BaseArchetypeDef; var archetypeDef = archetype._BaseArchetypeDef;
if (copy == null) if (copy == null)
@ -2447,13 +2546,15 @@ namespace CodeWalker.Project
CurrentArchetype = archetype; CurrentArchetype = archetype;
AddProjectArchetype(archetype); AddProjectArchetype(archetype);
return archetype;
} }
public void NewMloEntity(YmapEntityDef copy = null, bool copyTransform = false) public YmapEntityDef NewMloEntity(YmapEntityDef copy = null, bool copyTransform = false, bool selectNew = true)
{ {
if ((CurrentArchetype == null) || !(CurrentArchetype is MloArchetype mloArch)) if ((CurrentArchetype == null) || !(CurrentArchetype is MloArchetype mloArch))
{ {
mloArch = (CurrentEntity?.MloParent.Archetype as MloArchetype) ?? CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo; mloArch = (CurrentEntity?.MloParent.Archetype as MloArchetype) ?? CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo;
if (mloArch == null) return; if (mloArch == null) return null;
CurrentArchetype = mloArch; CurrentArchetype = mloArch;
} }
@ -2461,7 +2562,7 @@ namespace CodeWalker.Project
if (mloInstance == null) if (mloInstance == null)
{ {
MessageBox.Show("Unable to find MLO instance for this interior! Try adding an MLO instance ymap to the project."); MessageBox.Show("Unable to find MLO instance for this interior! Try adding an MLO instance ymap to the project.");
return; return null;
} }
if ((CurrentMloEntity == null) && (CurrentEntity != null)) if ((CurrentMloEntity == null) && (CurrentEntity != null))
@ -2482,7 +2583,7 @@ namespace CodeWalker.Project
if ((mloArch.rooms?.Length??0) <= 0) if ((mloArch.rooms?.Length??0) <= 0)
{ {
MessageBox.Show($@"Mlo {mloArch.Name} has no rooms! Cannot create entity."); MessageBox.Show($@"Mlo {mloArch.Name} has no rooms! Cannot create entity.");
return; return null;
} }
CurrentMloRoom = mloArch.rooms[0]; CurrentMloRoom = mloArch.rooms[0];
} }
@ -2493,21 +2594,21 @@ namespace CodeWalker.Project
if (roomIndex >= (mloArch.rooms?.Length ?? 0)) if (roomIndex >= (mloArch.rooms?.Length ?? 0))
{ {
MessageBox.Show($@"Room at index {roomIndex} does not exist in {mloArch.Name}! {mloArch.Name} only has {(mloArch.rooms?.Length ?? 0)} rooms."); MessageBox.Show($@"Room at index {roomIndex} does not exist in {mloArch.Name}! {mloArch.Name} only has {(mloArch.rooms?.Length ?? 0)} rooms.");
return; return null;
} }
int portalIndex = CurrentMloPortal?.Index ?? -1; int portalIndex = CurrentMloPortal?.Index ?? -1;
if (portalIndex >= (mloArch.portals?.Length ?? 0)) if (portalIndex >= (mloArch.portals?.Length ?? 0))
{ {
MessageBox.Show($@"Portal at index {portalIndex} does not exist in {mloArch.Name}! {mloArch.Name} only has {(mloArch.portals?.Length ?? 0)} portals."); MessageBox.Show($@"Portal at index {portalIndex} does not exist in {mloArch.Name}! {mloArch.Name} only has {(mloArch.portals?.Length ?? 0)} portals.");
return; return null;
} }
int entsetIndex = CurrentMloEntitySet?.Index ?? -1; int entsetIndex = CurrentMloEntitySet?.Index ?? -1;
if (entsetIndex >= (mloArch.entitySets?.Length ?? 0)) if (entsetIndex >= (mloArch.entitySets?.Length ?? 0))
{ {
MessageBox.Show($@"EntitySet at index {entsetIndex} does not exist in {mloArch.Name}! {mloArch.Name} only has {(mloArch.entitySets?.Length ?? 0)} entitySets."); MessageBox.Show($@"EntitySet at index {entsetIndex} does not exist in {mloArch.Name}! {mloArch.Name} only has {(mloArch.entitySets?.Length ?? 0)} entitySets.");
return; return null;
} }
@ -2572,21 +2673,26 @@ namespace CodeWalker.Project
catch(Exception e) catch(Exception e)
{ {
MessageBox.Show(this, e.Message, "Create MLO Entity Error", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show(this, e.Message, "Create MLO Entity Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; return null;
} }
ment = mloInstance.TryGetArchetypeEntity(outEnt); ment = mloInstance.TryGetArchetypeEntity(outEnt);
if (selectNew)
{
LoadProjectTree(); LoadProjectTree();
ProjectExplorer?.TrySelectMloEntityTreeNode(ment); ProjectExplorer?.TrySelectMloEntityTreeNode(ment);
CurrentEntity = outEnt; CurrentEntity = outEnt;
CurrentMloEntity = ment; CurrentMloEntity = ment;
CurrentYtypFile = CurrentEntity.MloParent?.Archetype?.Ytyp; CurrentYtypFile = CurrentEntity.MloParent?.Archetype?.Ytyp;
} }
public void NewMloRoom(MCMloRoomDef copy = null)
return outEnt;
}
public MCMloRoomDef NewMloRoom(MCMloRoomDef copy = null)
{ {
var mlo = CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo ?? (CurrentEntity?.MloParent.Archetype as MloArchetype) ?? (CurrentArchetype as MloArchetype); var mlo = CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo ?? (CurrentEntity?.MloParent.Archetype as MloArchetype) ?? (CurrentArchetype as MloArchetype);
if (mlo == null) return; if (mlo == null) return null;
if (copy == null) if (copy == null)
{ {
@ -2618,11 +2724,13 @@ namespace CodeWalker.Project
ProjectExplorer?.TrySelectMloRoomTreeNode(room); ProjectExplorer?.TrySelectMloRoomTreeNode(room);
CurrentMloRoom = room; CurrentMloRoom = room;
CurrentYtypFile = room?.OwnerMlo?.Ytyp; CurrentYtypFile = room?.OwnerMlo?.Ytyp;
return room;
} }
public void NewMloPortal(MCMloPortalDef copy = null) public MCMloPortalDef NewMloPortal(MCMloPortalDef copy = null)
{ {
var mlo = CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo ?? (CurrentEntity?.MloParent.Archetype as MloArchetype) ?? (CurrentArchetype as MloArchetype); var mlo = CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo ?? (CurrentEntity?.MloParent.Archetype as MloArchetype) ?? (CurrentArchetype as MloArchetype);
if (mlo == null) return; if (mlo == null) return null;
if (copy == null) if (copy == null)
{ {
@ -2656,11 +2764,13 @@ namespace CodeWalker.Project
ProjectExplorer?.TrySelectMloPortalTreeNode(portal); ProjectExplorer?.TrySelectMloPortalTreeNode(portal);
CurrentMloPortal = portal; CurrentMloPortal = portal;
CurrentYtypFile = portal?.OwnerMlo?.Ytyp; CurrentYtypFile = portal?.OwnerMlo?.Ytyp;
return portal;
} }
public void NewMloEntitySet(MCMloEntitySet copy = null) public MCMloEntitySet NewMloEntitySet(MCMloEntitySet copy = null)
{ {
var mlo = CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo ?? (CurrentEntity?.MloParent.Archetype as MloArchetype) ?? (CurrentArchetype as MloArchetype); var mlo = CurrentMloRoom?.OwnerMlo ?? CurrentMloPortal?.OwnerMlo ?? CurrentMloEntitySet?.OwnerMlo ?? (CurrentEntity?.MloParent.Archetype as MloArchetype) ?? (CurrentArchetype as MloArchetype);
if (mlo == null) return; if (mlo == null) return null;
if (copy == null) if (copy == null)
{ {
@ -2690,6 +2800,8 @@ namespace CodeWalker.Project
ProjectExplorer?.TrySelectMloEntitySetTreeNode(set); ProjectExplorer?.TrySelectMloEntitySetTreeNode(set);
CurrentMloEntitySet = set; CurrentMloEntitySet = set;
CurrentYtypFile = set?.OwnerMlo?.Ytyp; CurrentYtypFile = set?.OwnerMlo?.Ytyp;
return set;
} }
public bool DeleteArchetype() public bool DeleteArchetype()
{ {
@ -3091,12 +3203,13 @@ namespace CodeWalker.Project
return CurrentProjectFile.ContainsYbn(ybn); return CurrentProjectFile.ContainsYbn(ybn);
} }
public void NewCollisionBounds(BoundsType type, Bounds copy = null) public Bounds NewCollisionBounds(BoundsType type, Bounds copy = null, bool copyPosition = false, bool selectNew = true)
{ {
if (CurrentYbnFile == null) return; if (CurrentYbnFile == null) return null;
//////// TODO!! //////// TODO!!
return null;
} }
public void AddCollisionBoundsToProject() public void AddCollisionBoundsToProject()
{ {
@ -3194,12 +3307,13 @@ namespace CodeWalker.Project
return bounds == CurrentCollisionBounds; return bounds == CurrentCollisionBounds;
} }
public void NewCollisionPoly(BoundPolygonType type, BoundPolygon copy = null) public BoundPolygon NewCollisionPoly(BoundPolygonType type, BoundPolygon copy = null, bool copyPosition = false, bool selectNew = true)
{ {
if (CurrentYbnFile == null) return; if (CurrentYbnFile == null) return null;
//////// TODO!! //////// TODO!!
return null;
} }
public void AddCollisionPolyToProject() public void AddCollisionPolyToProject()
{ {
@ -3538,9 +3652,9 @@ namespace CodeWalker.Project
return CurrentProjectFile.ContainsYnd(ynd); return CurrentProjectFile.ContainsYnd(ynd);
} }
public void NewPathNode(YndNode copy = null, bool copyPosition = false) public YndNode NewPathNode(YndNode copy = null, bool copyPosition = false, bool selectNew = true)
{ {
if (CurrentYndFile == null) return; if (CurrentYndFile == null) return null;
var n = CurrentYndFile.AddNode(); var n = CurrentYndFile.AddNode();
var areaid = n.AreaID; var areaid = n.AreaID;
@ -3590,18 +3704,22 @@ namespace CodeWalker.Project
CurrentYndFile.BuildBVH(); CurrentYndFile.BuildBVH();
if (selectNew)
{
LoadProjectTree(); LoadProjectTree();
ProjectExplorer?.TrySelectPathNodeTreeNode(n); ProjectExplorer?.TrySelectPathNodeTreeNode(n);
CurrentPathNode = n; CurrentPathNode = n;
//ShowEditYndPanel(false);; //ShowEditYndPanel(false);;
ShowEditYndNodePanel(false); ShowEditYndNodePanel(false);
}
if (WorldForm != null) if (WorldForm != null)
{ {
WorldForm.UpdatePathYndGraphics(CurrentYndFile, false); WorldForm.UpdatePathYndGraphics(CurrentYndFile, false);
} }
return n;
} }
public bool DeletePathNode() public bool DeletePathNode()
{ {
@ -3830,8 +3948,9 @@ namespace CodeWalker.Project
return CurrentProjectFile.ContainsYnv(ynv); return CurrentProjectFile.ContainsYnv(ynv);
} }
public void NewNavPoly(YnvPoly copy = null, bool copyposition = false)//TODO! public YnvPoly NewNavPoly(YnvPoly copy = null, bool copyposition = false, bool selectNew = true)//TODO!
{ {
return null;
} }
public bool DeleteNavPoly()//TODO! public bool DeleteNavPoly()//TODO!
{ {
@ -3842,8 +3961,9 @@ namespace CodeWalker.Project
return poly == CurrentNavPoly; return poly == CurrentNavPoly;
} }
public void NewNavPoint(YnvPoint copy = null, bool copyposition = false)//TODO! public YnvPoint NewNavPoint(YnvPoint copy = null, bool copyposition = false, bool selectNew = true)//TODO!
{ {
return null;
} }
public bool DeleteNavPoint()//TODO! public bool DeleteNavPoint()//TODO!
{ {
@ -3854,8 +3974,9 @@ namespace CodeWalker.Project
return point == CurrentNavPoint; return point == CurrentNavPoint;
} }
public void NewNavPortal(YnvPortal copy = null, bool copyposition = false)//TODO! public YnvPortal NewNavPortal(YnvPortal copy = null, bool copyposition = false, bool selectNew = true)//TODO!
{ {
return null;
} }
public bool DeleteNavPortal()//TODO! public bool DeleteNavPortal()//TODO!
{ {
@ -4042,9 +4163,9 @@ namespace CodeWalker.Project
return CurrentProjectFile.ContainsTrainTrack(track); return CurrentProjectFile.ContainsTrainTrack(track);
} }
public void NewTrainNode(TrainTrackNode copy = null, bool copyPosition = false) public TrainTrackNode NewTrainNode(TrainTrackNode copy = null, bool copyPosition = false, bool selectNew = true)
{ {
if (CurrentTrainTrack == null) return; if (CurrentTrainTrack == null) return null;
var afternode = copyPosition ? copy : null; var afternode = copyPosition ? copy : null;
@ -4067,17 +4188,21 @@ namespace CodeWalker.Project
CurrentTrainTrack.BuildBVH(); CurrentTrainTrack.BuildBVH();
if (selectNew)
{
LoadProjectTree(); LoadProjectTree();
ProjectExplorer?.TrySelectTrainNodeTreeNode(n); ProjectExplorer?.TrySelectTrainNodeTreeNode(n);
CurrentTrainNode = n; CurrentTrainNode = n;
ShowEditTrainNodePanel(false); ShowEditTrainNodePanel(false);
}
if (WorldForm != null) if (WorldForm != null)
{ {
WorldForm.UpdateTrainTrackGraphics(CurrentTrainTrack, false); WorldForm.UpdateTrainTrackGraphics(CurrentTrainTrack, false);
} }
return n;
} }
public bool DeleteTrainNode() public bool DeleteTrainNode()
{ {
@ -4319,10 +4444,10 @@ namespace CodeWalker.Project
return CurrentProjectFile.ContainsScenario(ymt); return CurrentProjectFile.ContainsScenario(ymt);
} }
public void NewScenarioNode(ScenarioNode copy = null, bool copyPosition = false) public ScenarioNode NewScenarioNode(ScenarioNode copy = null, bool copyPosition = false, bool selectNew = true)
{ {
if (CurrentScenario == null) return; if (CurrentScenario == null) return null;
if (CurrentScenario.ScenarioRegion == null) return; if (CurrentScenario.ScenarioRegion == null) return null;
if (copy == null) if (copy == null)
{ {
@ -4338,12 +4463,14 @@ namespace CodeWalker.Project
n.SetOrientation(ori); n.SetOrientation(ori);
if (selectNew)
{
LoadProjectTree(); LoadProjectTree();
ProjectExplorer?.TrySelectScenarioNodeTreeNode(n); ProjectExplorer?.TrySelectScenarioNodeTreeNode(n);
CurrentScenarioNode = n; CurrentScenarioNode = n;
//ShowEditScenarioPanel(false); //ShowEditScenarioPanel(false);
ShowEditScenarioNodePanel(false); ShowEditScenarioNodePanel(false);
}
if (WorldForm != null) if (WorldForm != null)
@ -4355,6 +4482,8 @@ namespace CodeWalker.Project
CurrentScenario.ScenarioRegion.BuildBVH(); CurrentScenario.ScenarioRegion.BuildBVH();
CurrentScenario.ScenarioRegion.BuildVertices(); //for the graphics... CurrentScenario.ScenarioRegion.BuildVertices(); //for the graphics...
} }
return n;
} }
public bool DeleteScenarioNode() public bool DeleteScenarioNode()
{ {
@ -5461,9 +5590,9 @@ namespace CodeWalker.Project
return CurrentProjectFile.ContainsAudioRel(rel); return CurrentProjectFile.ContainsAudioRel(rel);
} }
public void NewAudioZone(AudioPlacement copy = null, bool copyPosition = false) public AudioPlacement NewAudioZone(AudioPlacement copy = null, bool copyPosition = false, bool selectNew = true)
{ {
if (CurrentAudioFile == null) return; if (CurrentAudioFile == null) return null;
if (copy == null) if (copy == null)
{ {
@ -5517,18 +5646,22 @@ namespace CodeWalker.Project
CurrentAudioFile.AddRelData(zone); CurrentAudioFile.AddRelData(zone);
if (selectNew)
{
LoadProjectTree(); LoadProjectTree();
ProjectExplorer?.TrySelectAudioZoneTreeNode(ap); ProjectExplorer?.TrySelectAudioZoneTreeNode(ap);
CurrentAudioZone = ap; CurrentAudioZone = ap;
ShowEditAudioZonePanel(false); ShowEditAudioZonePanel(false);
}
if (WorldForm != null) if (WorldForm != null)
{ {
WorldForm.UpdateAudioPlacementGraphics(CurrentAudioFile); WorldForm.UpdateAudioPlacementGraphics(CurrentAudioFile);
} }
return ap;
} }
public bool DeleteAudioZone() public bool DeleteAudioZone()
{ {
@ -5587,9 +5720,9 @@ namespace CodeWalker.Project
return zone == CurrentAudioZone; return zone == CurrentAudioZone;
} }
public void NewAudioEmitter(AudioPlacement copy = null, bool copyPosition = false) public AudioPlacement NewAudioEmitter(AudioPlacement copy = null, bool copyPosition = false, bool selectNew = true)
{ {
if (CurrentAudioFile == null) return; if (CurrentAudioFile == null) return null;
if (copy == null) if (copy == null)
{ {
@ -5634,18 +5767,22 @@ namespace CodeWalker.Project
CurrentAudioFile.AddRelData(emitter); CurrentAudioFile.AddRelData(emitter);
if (selectNew)
{
LoadProjectTree(); LoadProjectTree();
ProjectExplorer?.TrySelectAudioEmitterTreeNode(ap); ProjectExplorer?.TrySelectAudioEmitterTreeNode(ap);
CurrentAudioEmitter = ap; CurrentAudioEmitter = ap;
ShowEditAudioEmitterPanel(false); ShowEditAudioEmitterPanel(false);
}
if (WorldForm != null) if (WorldForm != null)
{ {
WorldForm.UpdateAudioPlacementGraphics(CurrentAudioFile); WorldForm.UpdateAudioPlacementGraphics(CurrentAudioFile);
} }
return ap;
} }
public bool DeleteAudioEmitter() public bool DeleteAudioEmitter()
{ {

View File

@ -782,6 +782,31 @@ namespace CodeWalker
} }
} }
public bool CanCopyPaste
{
get
{
if (MultipleSelectionItems != null)
{
for (int i = 0; i < MultipleSelectionItems.Length; i++)
{
if (MultipleSelectionItems[i].CanCopyPaste) return true;
}
return false;
}
else if (EntityDef != null) return true;
else if (CarGenerator != null) return true;
else if (PathNode != null) return true;
else if (NavPoly != null) return true;
else if (NavPoint != null) return true;
else if (NavPortal != null) return true;
else if (TrainTrackNode != null) return true;
else if (ScenarioNode != null) return true;
else if (Audio?.AudioZone != null) return true;
else if (Audio?.AudioEmitter != null) return true;
return false;
}
}
public void SetMultipleSelectionItems(MapSelection[] items) public void SetMultipleSelectionItems(MapSelection[] items)

File diff suppressed because it is too large Load Diff