private void RemoveOldIslandsFromView(PythonDataEventArgs pythonData)
        {
            if (RemoveIslandFromView == null)
            {
                return;
            }

            var namesOfIslandsCurrentlyDisplayed = _islands.GetAllNames();

            var newIslandNames = new HashSet <string>();

            foreach (var data in pythonData.ArchipelagoData)
            {
                newIslandNames.Add(data.Item1);
            }

            newIslandNames.SymmetricExceptWith(namesOfIslandsCurrentlyDisplayed);
            var oldIslandNames = newIslandNames;

            foreach (var old in oldIslandNames)
            {
                _islands.Delete(old);
                _branchNames.Remove(old);
                RemoveIslandFromView(this, new DisplayRemoveDrawableDataEventArgs(old));
            }
        }
        private void NewDataReceivedFromPythonScript(object sender, PythonDataEventArgs pythonData)
        {
            AddNewIslandsToView(pythonData);
            RemoveOldIslandsFromView(pythonData);

            _islands.MoveAll();

            // manual tick, so that the label isn't left hanging in the middle of nowhere if the new islands were added or existing ones moved
            __DisplayTextualDataUpdateTimer_Tick(this, new EventArgs());
        }
        private void AddNewIslandsToView(PythonDataEventArgs pythonData)
        {
            if (AddNewIslandToView == null)
            {
                return;
            }

            foreach (var data in pythonData.ArchipelagoData)
            {
                var branchName   = data.Item1;
                var branchExists = _islands.Contains(branchName);
                var branchHasBeenDisplayedBefore = branchExists;
                if (!branchHasBeenDisplayedBefore)
                {
                    var branch = CreateBranch(branchName);
                    AddNewIslandToView(this, new DisplayAddDrawableDataEventArgs(branch.Name, branch.Shape.Drawables()));
                }

                var distance = data.Item2;
                _islands.SetBranchDistance(branchName, distance);
            }
        }