コード例 #1
0
        private void HandleGroupOpacityChange(GuidStructureItem group, float value)
        {
            if (LayerCommandsViewModel.Owner?.BitmapManager?.ActiveDocument != null)
            {
                var doc = LayerCommandsViewModel.Owner.BitmapManager.ActiveDocument;

                if (group.Opacity == value)
                {
                    return;
                }

                var processArgs        = new object[] { group.GroupGuid, value };
                var reverseProcessArgs = new object[] { group.GroupGuid, group.Opacity };

                ChangeGroupOpacityProcess(processArgs);

                LayerCommandsViewModel.Owner.BitmapManager.ActiveDocument.LayerStructure.ExpandParentGroups(group);

                doc.UndoManager.AddUndoChange(
                    new Change(
                        ChangeGroupOpacityProcess,
                        reverseProcessArgs,
                        ChangeGroupOpacityProcess,
                        processArgs,
                        $"Change {group.Name} opacity"), false);
            }
        }
コード例 #2
0
        public static SerializableGuidStructureItem ToSerializable(this GuidStructureItem group, SerializableGuidStructureItem parent = null)
        {
            var serializedGroup = new SerializableGuidStructureItem(
                group.GroupGuid,
                group.Name,
                group.StartLayerGuid,
                group.EndLayerGuid,
                null, group.IsVisible, group.Opacity);

            serializedGroup.Subgroups = group.Subgroups.Select(x => x.ToSerializable(serializedGroup)).ToArray();
            return(serializedGroup);
        }
コード例 #3
0
        private bool StructureMismatch(GuidStructureItem first, GuidStructureItem second)
        {
            bool rootMismatch = first.EndLayerGuid != second.EndLayerGuid || first.StartLayerGuid != second.StartLayerGuid || first.IsVisible != second.IsVisible || first.IsExpanded != second.IsExpanded || first.Opacity != second.Opacity || first.Subgroups.Count != second.Subgroups.Count || second.Name != first.Name;

            if (!rootMismatch && first.Subgroups.Count > 0)
            {
                for (int i = 0; i < first.Subgroups.Count; i++)
                {
                    if (StructureMismatch(first.Subgroups[i], second.Subgroups[i]))
                    {
                        return(true);
                    }
                }
            }
            return(rootMismatch);
        }
コード例 #4
0
        private IEnumerable <GuidStructureItem> GetSubGroups(GuidStructureItem group)
        {
            List <GuidStructureItem> groups = new List <GuidStructureItem>()
            {
                group
            };

            foreach (var subGroup in group.Subgroups)
            {
                groups.Add(subGroup);
                if (subGroup.Subgroups.Count > 0)
                {
                    groups.AddRange(GetSubGroups(subGroup));
                }
            }

            return(groups.Distinct());
        }
コード例 #5
0
        /// <summary>
        /// Gets final layer opacity taking into consideration parent groups.
        /// </summary>
        /// <param name="layer">Layer to check.</param>
        /// <returns>Float from range 0-1.</returns>
        public static float GetFinalLayerOpacity(Layer layer, LayerStructure structure)
        {
            if (layer.Opacity == 0)
            {
                return(0f);
            }

            var group = structure.GetGroupByLayer(layer.LayerGuid);
            GuidStructureItem groupToCheck = group;
            float             finalOpacity = layer.Opacity;

            while (groupToCheck != null)
            {
                finalOpacity *= groupToCheck.Opacity;
                groupToCheck  = groupToCheck.Parent;
            }

            return(Math.Clamp(finalOpacity, 0f, 1f));
        }
コード例 #6
0
        private static GuidStructureItem ToGroup(SerializableGuidStructureItem group, GuidStructureItem parent = null)
        {
            if (group == null)
            {
                return(null);
            }
            var parsedGroup = new GuidStructureItem(
                group.Name,
                group.StartLayerGuid,
                group.EndLayerGuid,
                new ObservableCollection <GuidStructureItem>(),
                parent)
            {
                Opacity = group.Opacity, IsVisible = group.IsVisible, GroupGuid = group.GroupGuid, IsExpanded = true
            };

            parsedGroup.Subgroups = ToGroups(group.Subgroups, parsedGroup);
            return(parsedGroup);
        }
コード例 #7
0
        public void NewGroup(object parameter)
        {
            GuidStructureItem control = GetGroupFromParameter(parameter);
            var doc = Owner.BitmapManager.ActiveDocument;

            if (doc != null)
            {
                var lastGroups = doc.LayerStructure.CloneGroups();
                if (parameter is Layer or LayerStructureItemContainer)
                {
                    GuidStructureItem group = doc.LayerStructure.AddNewGroup($"{doc.ActiveLayer.Name} Group", doc.ActiveLayer.LayerGuid);

                    Owner.BitmapManager.ActiveDocument.LayerStructure.ExpandParentGroups(group);
                }
                else if (control != null)
                {
                    doc.LayerStructure.AddNewGroup($"{control.Name} Group", control);
                }

                doc.AddLayerStructureToUndo(lastGroups);
                doc.RaisePropertyChange(nameof(doc.LayerStructure));
            }
コード例 #8
0
        /// <summary>
        /// Gets final layer IsVisible taking into consideration group visibility.
        /// </summary>
        /// <param name="layer">Layer to check.</param>
        /// <returns>True if is visible, false if at least parent is not visible or layer itself is invisible.</returns>
        public static bool GetFinalLayerIsVisible(Layer layer, LayerStructure structure)
        {
            if (!layer.IsVisible)
            {
                return(false);
            }

            var  group = structure.GetGroupByLayer(layer.GuidValue);
            bool atLeastOneParentIsInvisible = false;
            GuidStructureItem groupToCheck   = group;

            while (groupToCheck != null)
            {
                if (!groupToCheck.IsVisible)
                {
                    atLeastOneParentIsInvisible = true;
                    break;
                }

                groupToCheck = groupToCheck.Parent;
            }

            return(!atLeastOneParentIsInvisible);
        }
コード例 #9
0
        private static ObservableCollection <GuidStructureItem> ToGroups(SerializableGuidStructureItem[] serializableGroups, GuidStructureItem parent = null)
        {
            ObservableCollection <GuidStructureItem> groups = new ObservableCollection <GuidStructureItem>();

            if (serializableGroups == null)
            {
                return(groups);
            }

            foreach (var serializableGroup in serializableGroups)
            {
                groups.Add(ToGroup(serializableGroup, parent));
            }
            return(groups);
        }