Exemple #1
0
        private void UpdateActors(DBNode <DBMovieInfo> node)
        {
            // get list of movies to find actors
            var movies = node.GetFilteredItems().ToList();

            // store a list of nodes to remove later
            var toRemove = node.Children.Where(n => n.AutoGenerated).ToList();

            // get actors available in all movies
            var actors = new List <string>();

            foreach (var movie in movies)
            {
                actors.AddRange(movie.Actors.ToString().Split('|'));
            }

            // remove invalid actors and sort list
            actors.RemoveAll(a => string.IsNullOrEmpty(a));
            actors.Sort();

            // now get a unique list of actors where they appear in atleast x movies
            var actorsToAdd = actors.GroupBy(a => a).Where(a => a.Count() >= MovingPicturesCore.Settings.ActorLimit).Select(a => a.Key);

            foreach (var actor in actorsToAdd)
            {
                if (!toRemove.Any(n => n.Name.Equals(actor)))
                {
                    // actor not found, add it
                    DBNode <DBMovieInfo> newSubNode = new DBNode <DBMovieInfo>();
                    newSubNode.AutoGenerated = true;
                    newSubNode.Name          = actor;

                    DBFilter <DBMovieInfo> newFilter = new DBFilter <DBMovieInfo>();
                    newFilter.Name             = actor;
                    newFilter.CriteriaGrouping = DBFilter <DBMovieInfo> .CriteriaGroupingEnum.ALL;
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.EQUAL, actor));

                    newSubNode.Filter             = newFilter;
                    newSubNode.AdditionalSettings = new DBMovieNodeSettings();

                    node.Children.Add(newSubNode);
                    newSubNode.Parent = node;
                }
                else
                {
                    // we want to keep the existing node so don't remove it
                    toRemove.RemoveAll(n => n.Name.Equals(actor));
                }
            }

            // remove any nodes left over with no items
            foreach (var currNode in toRemove)
            {
                node.Children.Remove(currNode);
            }
        }
Exemple #2
0
        private void UpdateYear(DBNode <DBMovieInfo> node)
        {
            // grab list of possible years
            HashSet <string> allYears = node.DBManager.GetAllValues(node.BasicFilteringField,
                                                                    node.BasicFilteringRelation,
                                                                    node.GetFilteredItems());

            // build list of decades, each will correspond to one subnode
            HashSet <int> decades = new HashSet <int>();

            foreach (string year in allYears)
            {
                int iYear;
                if (int.TryParse(year, out iYear))
                {
                    decades.Add(iYear / 10);
                }
            }

            // build lookup for subnodes and build list of nodes to remove
            List <DBNode <DBMovieInfo> >            toRemove   = new List <DBNode <DBMovieInfo> >();
            Dictionary <int, DBNode <DBMovieInfo> > nodeLookup = new Dictionary <int, DBNode <DBMovieInfo> >();

            foreach (DBNode <DBMovieInfo> currSubNode in node.Children)
            {
                if (!currSubNode.AutoGenerated)
                {
                    continue;
                }

                int decade = 0;
                if (int.TryParse(currSubNode.Filter.Criteria[0].Value.ToString(), out decade))
                {
                    decade = (decade + 1) / 10;
                    if (decades.Contains(decade))
                    {
                        nodeLookup[decade] = currSubNode;
                    }
                }
                else
                {
                    toRemove.Add(currSubNode);
                }
            }

            // remove subnodes that are no longer valid
            foreach (DBNode <DBMovieInfo> currSubNode in toRemove)
            {
                node.Children.Remove(currSubNode);
                currSubNode.Delete();
            }

            // add subnodes that are missing
            foreach (int currDecade in decades)
            {
                if (nodeLookup.ContainsKey(currDecade))
                {
                    continue;
                }

                DBNode <DBMovieInfo> newSubNode = new DBNode <DBMovieInfo>();
                newSubNode.Name          = (currDecade == 0) ? Translation.Unknown : Translation.GetByName("DecadeShort", currDecade);
                newSubNode.AutoGenerated = true;
                newSubNode.SortPosition  = currDecade;

                DBFilter <DBMovieInfo> newFilter = new DBFilter <DBMovieInfo>();
                newFilter.CriteriaGrouping = DBFilter <DBMovieInfo> .CriteriaGroupingEnum.ALL;
                newFilter.Name             = currDecade.ToString();

                newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.GREATER_THAN, ((currDecade * 10) - 1)));
                newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.LESS_THAN, ((currDecade * 10) + 10)));

                newSubNode.Filter = newFilter;

                // set the default sortorder for the gui
                DBMovieNodeSettings settings = new DBMovieNodeSettings();
                settings.UseDefaultSorting = false;
                settings.SortField         = SortingFields.Year;

                newSubNode.AdditionalSettings = settings;


                node.Children.Add(newSubNode);
                newSubNode.Parent = node;
            }

            node.Children.Sort();
        }
Exemple #3
0
        private void UpdateAlphas(DBNode <DBMovieInfo> node)
        {
            var movies = node.GetFilteredItems();

            // store a list of nodes to remove
            var toRemove = node.Children.Where(n => n.AutoGenerated).ToList();

            // any movies starting with numeral for '#' entry
            if (movies.Any(m => !string.IsNullOrEmpty(m.SortBy) && Char.IsDigit(m.SortBy.TrimStart(), 0)))
            {
                if (!toRemove.Any(n => n.Name.Equals("#")))
                {
                    // node not found, add it
                    DBNode <DBMovieInfo> newSubNode = new DBNode <DBMovieInfo>();
                    newSubNode.AutoGenerated = true;
                    newSubNode.Name          = "#";
                    newSubNode.SortPosition  = Convert.ToInt32('#');

                    DBFilter <DBMovieInfo> newFilter = new DBFilter <DBMovieInfo>();
                    newFilter.Name             = "Alphas #";
                    newFilter.CriteriaGrouping = DBFilter <DBMovieInfo> .CriteriaGroupingEnum.ONE;
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.BEGINS_WITH, "0"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.BEGINS_WITH, "1"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.BEGINS_WITH, "2"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.BEGINS_WITH, "3"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.BEGINS_WITH, "4"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.BEGINS_WITH, "5"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.BEGINS_WITH, "6"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.BEGINS_WITH, "7"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.BEGINS_WITH, "8"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.BEGINS_WITH, "9"));

                    newSubNode.Filter             = newFilter;
                    newSubNode.AdditionalSettings = new DBMovieNodeSettings();

                    node.Children.Add(newSubNode);
                    newSubNode.Parent = node;
                }
                else
                {
                    // we want to keep the existing node so don't remove it
                    toRemove.RemoveAll(n => n.Name.Equals("#"));
                }
            }

            // get list of unique starting letters from collection
            var moviesStartingWithLetter = movies.Where(m => !string.IsNullOrEmpty(m.SortBy) && !Char.IsDigit(m.SortBy, 0));

            foreach (var alpha in moviesStartingWithLetter.Select(m => m.SortBy.TrimStart().ToUpperInvariant()[0]).Distinct().OrderBy(m => m))
            {
                string startLetter = alpha.ToString();

                if (!toRemove.Any(n => n.Name.Equals(startLetter)))
                {
                    // node not found, add it
                    DBNode <DBMovieInfo> newSubNode = new DBNode <DBMovieInfo>();
                    newSubNode.AutoGenerated = true;
                    newSubNode.Name          = startLetter;
                    newSubNode.SortPosition  = Convert.ToInt32(alpha);

                    DBFilter <DBMovieInfo> newFilter = new DBFilter <DBMovieInfo>();
                    newFilter.Name             = "Alphas - " + startLetter;
                    newFilter.CriteriaGrouping = DBFilter <DBMovieInfo> .CriteriaGroupingEnum.ALL;
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.BEGINS_WITH, startLetter));

                    newSubNode.Filter             = newFilter;
                    newSubNode.AdditionalSettings = new DBMovieNodeSettings();

                    node.Children.Add(newSubNode);
                    newSubNode.Parent = node;
                }
                else
                {
                    // we want to keep the existing node so don't remove it
                    toRemove.RemoveAll(n => n.Name.Equals(startLetter));
                }
            }

            // remove any nodes left over with no items
            foreach (var currNode in toRemove)
            {
                node.Children.Remove(currNode);
            }

            node.Children.Sort();
        }
Exemple #4
0
        private void UpdateDateAdded(DBNode <DBMovieInfo> node)
        {
            // get all items that these nodes will apply to
            HashSet <DBMovieInfo> items = node.GetFilteredItems();

            // get all available periods
            string[] periods = new string[] {
                "WithinLastSevenDays",
                "WithinLastTwoWeeks",
                "WithinLastThirtyDays",
                "LastMonth",
                "TwoMonthsAgo",
                "ThreeMonthsAgo",
                "ThisYear",
                "LastYear",
                "Older"
            };

            // build lookup for subnodes and build list of nodes to remove
            List <DBNode <DBMovieInfo> > toRemove = new List <DBNode <DBMovieInfo> >();
            Dictionary <string, DBNode <DBMovieInfo> > nodeLookup = new Dictionary <string, DBNode <DBMovieInfo> >();

            foreach (DBNode <DBMovieInfo> currSubNode in node.Children)
            {
                if (!currSubNode.AutoGenerated)
                {
                    continue;
                }

                string period = currSubNode.Filter.Name;
                if (!periods.Contains(period))
                {
                    toRemove.Add(currSubNode);
                }
                else
                {
                    nodeLookup[period] = currSubNode;
                }
            }

            // remove subnodes that are no longer valid
            foreach (DBNode <DBMovieInfo> currSubNode in toRemove)
            {
                node.Children.Remove(currSubNode);
                currSubNode.Delete();
            }

            // add subnodes that are missing
            int index = 0;

            foreach (string period in periods)
            {
                index++;

                if (nodeLookup.ContainsKey(period))
                {
                    continue;
                }

                DBFilter <DBMovieInfo> newFilter = new DBFilter <DBMovieInfo>();
                newFilter.Name = period;

                DBNode <DBMovieInfo> newSubNode = new DBNode <DBMovieInfo>();
                newSubNode.AutoGenerated = true;
                newSubNode.SortPosition  = index;

                switch (period)
                {
                case "WithinLastSevenDays":
                    newSubNode.Name            = Translation.GetByName("DatePartWithinDays", "7");
                    newFilter.CriteriaGrouping = DBFilter <DBMovieInfo> .CriteriaGroupingEnum.ONE;
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.EQUAL, "-7d"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.GREATER_THAN, "-7d"));
                    break;

                case "WithinLastTwoWeeks":
                    newSubNode.Name            = Translation.GetByName("DatePartWithinDays", "14");
                    newFilter.CriteriaGrouping = DBFilter <DBMovieInfo> .CriteriaGroupingEnum.ONE;
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.EQUAL, "-14d"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.GREATER_THAN, "-14d"));
                    break;

                case "WithinLastThirtyDays":
                    newSubNode.Name            = Translation.GetByName("DatePartWithinDays", "30");
                    newFilter.CriteriaGrouping = DBFilter <DBMovieInfo> .CriteriaGroupingEnum.ONE;
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.EQUAL, "-30d"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.GREATER_THAN, "-30d"));
                    break;

                case "LastMonth":
                    newSubNode.Name            = Translation.LastMonth;
                    newFilter.CriteriaGrouping = DBFilter <DBMovieInfo> .CriteriaGroupingEnum.ALL;
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.LESS_THAN, "M"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.GREATER_THAN, "-1M"));
                    break;

                case "TwoMonthsAgo":
                    newSubNode.Name            = Translation.GetByName("DatePartAgo", 2, Translation.DateMonths);
                    newFilter.CriteriaGrouping = DBFilter <DBMovieInfo> .CriteriaGroupingEnum.ALL;
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.LESS_THAN, "-1M"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.GREATER_THAN, "-2M"));
                    break;

                case "ThreeMonthsAgo":
                    newSubNode.Name            = Translation.GetByName("DatePartAgo", 3, Translation.DateMonths);
                    newFilter.CriteriaGrouping = DBFilter <DBMovieInfo> .CriteriaGroupingEnum.ALL;
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.LESS_THAN, "-2M"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.GREATER_THAN, "-3M"));
                    break;

                case "ThisYear":
                    newSubNode.Name            = Translation.ThisYear;
                    newFilter.CriteriaGrouping = DBFilter <DBMovieInfo> .CriteriaGroupingEnum.ONE;
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.EQUAL, "Y"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.GREATER_THAN, "Y"));
                    break;

                case "LastYear":
                    newSubNode.Name            = Translation.LastYear;
                    newFilter.CriteriaGrouping = DBFilter <DBMovieInfo> .CriteriaGroupingEnum.ALL;
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.LESS_THAN, "Y"));
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.GREATER_THAN, "-1Y"));
                    break;

                case "Older":
                    newSubNode.Name            = Translation.Older;
                    newFilter.CriteriaGrouping = DBFilter <DBMovieInfo> .CriteriaGroupingEnum.ALL;
                    newFilter.Criteria.Add(createCriteria(node, DBCriteria <DBMovieInfo> .OperatorEnum.LESS_THAN, "-1Y"));
                    break;
                }


                newSubNode.Filter = newFilter;

                // set the default sortorder for the gui
                DBMovieNodeSettings settings = new DBMovieNodeSettings();
                settings.UseDefaultSorting = false;
                settings.SortField         = SortingFields.DateAdded;
                settings.SortDirection     = SortingDirections.Descending;

                newSubNode.AdditionalSettings = settings;

                node.Children.Add(newSubNode);
                newSubNode.Parent = node;
            }

            node.Children.Sort();
        }
Exemple #5
0
        private void updateFilteredItems(TreeNode treeNode, bool forcePopulation)
        {
            DBNode <T> node = treeNode.Tag as DBNode <T>;

            // make sure we have an updatable node and we are not already processing
            if (node == null)
            {
                return;
            }
            if (updatingNodes.Contains(node))
            {
                return;
            }
            updatingNodes.Add(node);

            // if this is a dynamic node, update the children at model level
            if (node.DynamicNode)
            {
                node.UpdateDynamicNode();
            }

            // if the node is not expanded and is a leaf node, don't worry about populating it for now
            if (!forcePopulation && !treeNode.IsExpanded && node.Children.Count == 0 && node.Filter != null)
            {
                if (treeNode.Nodes.Count == 0)
                {
                    treeNode.Nodes.Add(new TreeNode("dummy"));
                }

                updatingNodes.Remove(node);
                return;
            }

            treeNode.Nodes.Clear();

            // if this node has children, add, update those children, then exit
            if (node.Children.Count > 0)
            {
                foreach (DBNode <T> currSubNode in node.Children)
                {
                    if (treeNodeLookup.ContainsKey(currSubNode))
                    {
                        treeNode.Nodes.Add(treeNodeLookup[currSubNode]);
                        updateFilteredItems(treeNodeLookup[currSubNode], false);
                    }
                }

                updatingNodes.Remove(node);
                return;
            }

            // if this is a dynamic node, add any missing children
            if (node.DynamicNode)
            {
                foreach (DBNode <T> currSubNode in node.Children)
                {
                    TreeNode child = createTreeNode(currSubNode);
                    if (!treeNode.Nodes.Contains(child))
                    {
                        treeNode.Nodes.Add(child);
                    }
                }

                updatingNodes.Remove(node);
                return;
            }

            // add all leaf nodes
            node.DBManager = DBManager;
            if (node.Children.Count == 0)
            {
                foreach (T currItem in node.GetFilteredItems().OrderBy((item) => item.ToString()))
                {
                    TreeNode itemNode = new TreeNode(currItem.ToString());
                    itemNode.Tag = currItem;
                    treeNode.Nodes.Add(itemNode);
                    setVisualProperties(itemNode);
                }

                updatingNodes.Remove(node);
                return;
            }

            updatingNodes.Remove(node);
        }