コード例 #1
0
ファイル: VoteCounter.cs プロジェクト: MizMahem/NetTally
        /// <summary>
        /// Add a collection of votes to the vote counter.
        /// </summary>
        /// <param name="votePartitions">A string list of all the parts of the vote to be added.</param>
        /// <param name="voter">The voter for this vote.</param>
        /// <param name="postID">The post ID for this vote.</param>
        /// <param name="voteType">The type of vote being added.</param>
        public void AddVotes(IEnumerable <VoteLineBlock> votePartitions, Origin voter)
        {
            if (!votePartitions.Any())
            {
                return;
            }

            // Remove the voter from any existing votes
            VoteStorage.RemoveVoterFromVotes(voter);

            // Add/update all segments of the provided vote
            foreach (var partition in votePartitions)
            {
                VoteStorage.AddSupporterToVote(partition, voter);
                AddPotentialVoteTask(partition.Task);
            }

            // Cleanup any votes that no longer have any support
            VoteStorage.RemoveUnsupportedVotes();
        }
コード例 #2
0
ファイル: VoteCounter.cs プロジェクト: MizMahem/NetTally
        public bool Join(List <Origin> voters, Origin voterToJoin)
        {
            bool joined = false;

            UndoBuffer.Push(new UndoAction(UndoActionType.Join, VoteStorage));

            foreach (var voter in voters)
            {
                joined = JoinImpl(voter, voterToJoin) || joined;
            }

            if (joined)
            {
                OnPropertyChanged("Votes");
                OnPropertyChanged("Voters");
                OnPropertyChanged(nameof(HasUndoActions));
            }
            else
            {
                UndoBuffer.Pop();
            }

            return(joined);

            /// <summary>
            /// Implement joining logic per voter.
            /// </summary>
            /// <param name="joiningVoter">The voter being moved to a new voting support set.</param>
            /// <param name="voterToJoin">The voter being joined.</param>
            /// <returns>Returns true if the join was completed.</returns>
            bool JoinImpl(Origin joiningVoter, Origin voterToJoin)
            {
                var source = GetVotesBy(joiningVoter);
                var dest   = GetVotesBy(voterToJoin);

                if (!source.Any() || !dest.Any())
                {
                    return(false);
                }

                bool joined = false;

                // Remove support from any votes where the target voter isn't also present.
                foreach (var vote in source)
                {
                    if (!VoteStorage.DoesVoterSupportVote(voterToJoin, vote))
                    {
                        VoteStorage.RemoveSupporterFromVote(vote, joiningVoter);
                    }
                }

                VoteStorage.RemoveUnsupportedVotes();

                foreach (var vote in dest)
                {
                    if (!VoteStorage.DoesVoterSupportVote(joiningVoter, vote))
                    {
                        VoteStorage.AddSupporterToVote(vote, joiningVoter);
                        joined = true;
                    }
                }

                return(joined);
            }
        }