diff --git a/NetTally/MergeVotesWindow.xaml.cs b/NetTally/MergeVotesWindow.xaml.cs index fd26e1d3..f442d409 100644 --- a/NetTally/MergeVotesWindow.xaml.cs +++ b/NetTally/MergeVotesWindow.xaml.cs @@ -225,9 +225,20 @@ private void merge_Click(object sender, RoutedEventArgs e) try { + var votesPrior = VoteCounter.GetVotesCollection(CurrentVoteType).Keys.ToList(); + if (VoteCounter.Merge(fromVote, toVote, CurrentVoteType)) { + var votesAfter = VoteCounter.GetVotesCollection(CurrentVoteType).Keys.ToList(); + var votesDiff = votesAfter.Except(votesPrior); + VoteCollection.Remove(fromVote); + if (votesDiff.Count() == 1) + { + VoteCollection.Add(votesDiff.First()); + } + + VoterView1.Refresh(); VoterView2.Refresh(); } diff --git a/TallyCore/VoteCounter.cs b/TallyCore/VoteCounter.cs index fe0489ba..9cf224b1 100644 --- a/TallyCore/VoteCounter.cs +++ b/TallyCore/VoteCounter.cs @@ -192,6 +192,22 @@ public bool Merge(string fromVote, string toVote, VoteType voteType) if (!votesSet.TryGetValue(toVote, out toVoters)) throw new ArgumentException(nameof(toVote) + " does not exist."); + if (voteType == VoteType.Rank) + { + string markFrom = VoteString.GetVoteMarker(fromVote); + string markTo = VoteString.GetVoteMarker(toVote); + + // If ranked votes are being merged, but of different ranks, the "to" vote will simply be a text change + if (markFrom != markTo) + { + string toContent = VoteString.GetVoteContent(toVote); + string revisedFrom = VoteString.ModifyVoteLine(fromVote, content: toContent); + Rename(fromVote, revisedFrom, voteType); + return true; + } + } + + toVoters.UnionWith(fromVoters); votesSet.Remove(fromVote);