Skip to content

Commit

Permalink
Fixed exposed variable crash from previous commit
Browse files Browse the repository at this point in the history
  • Loading branch information
vchelaru committed Jan 24, 2025
1 parent 7edf39c commit 154c3ce
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 35 deletions.
19 changes: 12 additions & 7 deletions Gum/Logic/RenameLogic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -625,7 +625,7 @@ public static void HandleRename(ElementSave containerElement, EventSave eventSav

#region Variable

public VariableChangeResponse GetVariableChangesForRenamedVariable(IStateContainer owner, VariableSave variableSave, string oldStrippedName)
public VariableChangeResponse GetVariableChangesForRenamedVariable(IStateContainer owner, string oldFullName, string oldStrippedOrExposedName)
{
List<VariableChange> variableChanges = new List<VariableChange>();
List<VariableReferenceChange> variableReferenceChanges = new List<VariableReferenceChange>();
Expand All @@ -650,7 +650,7 @@ public VariableChangeResponse GetVariableChangesForRenamedVariable(IStateContain
{
foreach (var variable in state.Variables)
{
if (variable.ExposedAsName == oldStrippedName)
if (variable.ExposedAsName == oldStrippedOrExposedName)
{
variableChanges.Add(new VariableChange
{
Expand All @@ -671,7 +671,7 @@ public VariableChangeResponse GetVariableChangesForRenamedVariable(IStateContain
{
foreach (var variable in state.Variables)
{
if (variable.GetRootName() == oldStrippedName && !string.IsNullOrEmpty(variable.SourceObject))
if (variable.GetRootName() == oldStrippedOrExposedName && !string.IsNullOrEmpty(variable.SourceObject))
{
var instance = element.GetInstance(variable.SourceObject);
if (instance != null)
Expand Down Expand Up @@ -716,7 +716,7 @@ public VariableChangeResponse GetVariableChangesForRenamedVariable(IStateContain
{
var line = variableList.ValueAsIList[i];

if(line is not string asString || asString.StartsWith("//") || asString.Contains("=") == false || asString.Contains(oldStrippedName) == false)
if(line is not string asString || asString.StartsWith("//") || asString.Contains("=") == false || asString.Contains(oldStrippedOrExposedName) == false)
{
continue;
}
Expand All @@ -726,18 +726,23 @@ public VariableChangeResponse GetVariableChangesForRenamedVariable(IStateContain


var matchesLeft = false;
if(leftSide == oldStrippedName)
if(leftSide == oldStrippedOrExposedName)
{
string oldSourceObject = null;
if(oldFullName.Contains("."))
{
oldSourceObject = oldFullName.Substring(0, oldFullName.IndexOf("."));
}
// See if the element that contains the left side variable is a match...
matchesLeft = changedVariableOwnerElement == rootLeftSideElement || inheritingElements.Contains(rootLeftSideElement) ||
// or if we are in the same instance as the one that owns the variable reference...
(element == changedVariableOwnerElement && variableList.SourceObject == variableSave.SourceObject);
(element == changedVariableOwnerElement && variableList.SourceObject == oldSourceObject);
}

var stateContainingRightSideVariable = state;
GumRuntime.ElementSaveExtensions.GetRightSideAndState(ref right, ref stateContainingRightSideVariable);
var matchesRight = false;
if(right == oldStrippedName || right.EndsWith("." + oldStrippedName))
if(right == oldStrippedOrExposedName || right.EndsWith("." + oldStrippedOrExposedName))
{
// see if the owner of the right side is this element or an inheriting element:
// finish here....
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ private GeneralResponse GetIfCanDeleteVariable(VariableSave variable, IStateCont
return GeneralResponse.UnsuccessfulWith($"The variable {variable} is not contained in {stateContainer}");
}

var renames = _renameLogic.GetVariableChangesForRenamedVariable(stateContainer, variable, variable.GetRootName());
var renames = _renameLogic.GetVariableChangesForRenamedVariable(stateContainer, variable.Name, variable.GetRootName());

if (renames.VariableReferenceChanges.Count > 0)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -530,8 +530,9 @@ private void HandleUnexposeVariableClick(object sender, System.Windows.RoutedEve

private void HandleExposeVariableClick(object sender, System.Windows.RoutedEventArgs e)
{
var variableToExpose = this.VariableSave;
_exposeVariableService.HandleExposeVariableClick(SelectedState.Self.SelectedInstance,
this.VariableSave, this.RootVariableName);
variableToExpose, this.RootVariableName);
}


Expand Down
4 changes: 2 additions & 2 deletions Gum/Services/EditVariableService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ private void ShowEditExposedUi(VariableSave variable, IStateContainer container)



var changes = _renameLogic.GetVariableChangesForRenamedVariable(container, variable, variable.ExposedAsName);
var changes = _renameLogic.GetVariableChangesForRenamedVariable(container, variable.Name, variable.ExposedAsName);
string changesDetails = GetChangesDetails(changes);

if(!string.IsNullOrEmpty(changesDetails))
Expand Down Expand Up @@ -256,7 +256,7 @@ private void ShowFullEditUi(VariableSave variable, IStateContainer container)
var window = new AddVariableWindow(vm);
window.Title = "Edit Variable";

var changes = _renameLogic.GetVariableChangesForRenamedVariable(container, variable, variable.Name);
var changes = _renameLogic.GetVariableChangesForRenamedVariable(container, variable.Name, variable.Name);

var isReferencedInVariableReference = changes.VariableReferenceChanges.Count > 0;
vm.VariableChangeResponse = changes;
Expand Down
57 changes: 33 additions & 24 deletions Gum/Services/ExposeVariableService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ public ExposeVariableService(UndoManager undoManager, GuiCommands guiCommands, F

public void HandleExposeVariableClick(InstanceSave instanceSave, VariableSave variableSave, string rootVariableName)
{
// This variable may not exist yet if it hasn't been assigned.
//if (variableSave == null)
//{
// throw new ArgumentNullException(nameof(variableSave));
//}
var canExpose = GetIfCanExpose(instanceSave, variableSave, rootVariableName);

if(canExpose.Succeeded == false)
Expand All @@ -56,7 +61,8 @@ public void HandleExposeVariableClick(InstanceSave instanceSave, VariableSave va
// We want to use the name without the dots.
// So something like TextInstance.Text would be
// TextInstanceText
tiw.Result = variableSave.Name.Replace(".", "");
var fullVariableName = instanceSave.Name + "." + rootVariableName;
tiw.Result = fullVariableName.Replace(".", "").Replace(" ", "");

DialogResult result = tiw.ShowDialog();

Expand Down Expand Up @@ -94,6 +100,21 @@ public void HandleExposeVariableClick(InstanceSave instanceSave, VariableSave va

}

if(variableSave == null)
{
StateSave stateToExposeOn = SelectedState.Self.SelectedElement.DefaultState;

var variableInDefault = ObjectFinder.Self.GetRootVariable(fullVariableName, instanceSave.ParentContainer);
string variableType = variableInDefault.Type;
stateToExposeOn.SetValue(fullVariableName, null, instanceSave, variableType);

variableSave = stateToExposeOn.GetVariableSave(fullVariableName);

// Not sure if we need this, but setting SetsValue to false matches the old behavior when
// this code used to be part of validation
variableSave.SetsValue = false;
}

variableSave.ExposedAsName = tiw.Result;

PluginManager.Self.VariableAdd(elementSave, tiw.Result);
Expand Down Expand Up @@ -129,37 +150,25 @@ private GeneralResponse GetIfCanExpose(InstanceSave instanceSave, VariableSave v

ElementSave elementForInstance = ObjectFinder.Self.GetElementSave(instanceSave.BaseType);
var variableInDefault = elementForInstance.DefaultState.GetVariableSave(rawVariableName);
while (variableInDefault == null && !string.IsNullOrEmpty(elementForInstance.BaseType))

if(variableInDefault == null)
{
elementForInstance = ObjectFinder.Self.GetElementSave(elementForInstance.BaseType);
if (elementForInstance?.DefaultState == null)
{
break;
}
variableInDefault = elementForInstance.DefaultState.GetVariableSave(rawVariableName);
variableInDefault = ObjectFinder.Self.GetRootVariable(variableName, instanceSave.ParentContainer);
}

if (variableInDefault != null)
if (variableInDefault == null)
{
string variableType = variableInDefault.Type;

stateToExposeOn.SetValue(variableName, null, instanceSave, variableType);

// Now the variable should be created so we can access it
variableSave = stateToExposeOn.GetVariableSave(variableName);
// Since it's newly-created, there is no value being set:
variableSave.SetsValue = false;
return GeneralResponse.UnsuccessfulWith("This variable cannot be exposed.");
}
}

if (variableSave == null)
{
return GeneralResponse.UnsuccessfulWith("This variable cannot be exposed.");
}

// if the variable is used on a left-side, it should not be exposable:
var selectedElement = SelectedState.Self.SelectedElement;
var renames = _renameLogic.GetVariableChangesForRenamedVariable(selectedElement, variableSave, variableSave.GetRootName());

var fullVariableName = instanceSave.Name + "." + rootVariableName;

var renames = _renameLogic.GetVariableChangesForRenamedVariable(selectedElement, fullVariableName, rootVariableName);

var renamesOnThis = renames.VariableReferenceChanges
.Where(item => item.Container == selectedElement && item.ChangedSide == SideOfEquals.Left)
Expand All @@ -168,7 +177,7 @@ private GeneralResponse GetIfCanExpose(InstanceSave instanceSave, VariableSave v
if (renamesOnThis.Length > 0)
{
var firstRename = renamesOnThis[0];
string message = $"Cannot expose variable {variableSave} because it is assigned in a variable reference:\n\n" +
string message = $"Cannot expose variable {fullVariableName} because it is assigned in a variable reference:\n\n" +
$"{firstRename.VariableReferenceList.ValueAsIList[firstRename.LineIndex]}";

return GeneralResponse.UnsuccessfulWith(message);
Expand Down Expand Up @@ -199,7 +208,7 @@ public void HandleUnexposeVariableClick(VariableSave variableSave, ElementSave e

private GeneralResponse GetIfCanUnexposeVariable(VariableSave variableSave, ElementSave elementSave)
{
var renames = _renameLogic.GetVariableChangesForRenamedVariable(elementSave, variableSave, variableSave.ExposedAsName);
var renames = _renameLogic.GetVariableChangesForRenamedVariable(elementSave, variableSave.Name, variableSave.ExposedAsName);

if (renames.VariableReferenceChanges.Count > 0)
{
Expand Down

0 comments on commit 154c3ce

Please sign in to comment.