コード例 #1
0
        private int GetRowCount(Size constraint)
        {
            var host = GetAncestorControl();

            int    rowCount      = 1;
            double currentOffset = 0;

            var pinned = InternalChildren.OfType <UIElement>().Where(t => DockManager.GetIsPinned(t));

            foreach (var item in pinned)
            {
                if (currentOffset > 0 && currentOffset + item.DesiredSize.Width > constraint.Width)
                {
                    currentOffset = 0;
                    rowCount++;
                }
                currentOffset += item.DesiredSize.Width;
            }

            if (pinned.Any() && host?.PinOnSeparateRow == true)
            {
                rowCount++;
            }

            return(rowCount);
        }
コード例 #2
0
        private IEnumerable <UIElement> GetItemsOnRow(Size constraint, int rowIndex)
        {
            var host = GetAncestorControl();

            int    rowNum        = 0;
            double currentOffset = 0;
            var    pinned        = InternalChildren.OfType <UIElement>().Where(t => DockManager.GetIsPinned(t));
            var    notPinned     = InternalChildren.OfType <UIElement>().Except(pinned);

            foreach (var item in pinned)
            {
                if (currentOffset > 0 && currentOffset + item.DesiredSize.Width > constraint.Width)
                {
                    currentOffset = 0;
                    rowNum++;
                }
                currentOffset += item.DesiredSize.Width;
                if (rowNum == rowIndex)
                {
                    yield return(item);
                }
            }

            if (pinned.Any() && host?.PinOnSeparateRow == true)
            {
                rowNum++;
                currentOffset = 0;
            }

            foreach (var item in notPinned)
            {
                if (currentOffset > 0 && currentOffset + item.DesiredSize.Width > constraint.Width)
                {
                    if (host != null)
                    {
                        SetHasOverflowItems(host, true);
                    }

                    if (rowIndex == -1)
                    {
                        yield return(item);

                        continue;
                    }
                    else
                    {
                        yield break;
                    }
                }

                currentOffset += item.DesiredSize.Width;

                if (rowNum == rowIndex)
                {
                    yield return(item);
                }
            }

            if (host != null)
            {
                SetHasOverflowItems(host, false);
            }
        }
コード例 #3
0
ファイル: DocumentWell.cs プロジェクト: Gravemind2401/Studio
        private void PinTabCommandExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            var container = (e.OriginalSource as FrameworkElement)?.FindVisualAncestor <TabItem>();

            DockManager.SetIsPinned(container, !DockManager.GetIsPinned(container));
        }
コード例 #4
0
ファイル: TabWellBase.cs プロジェクト: Gravemind2401/Studio
        //internal command - OriginalSource is TabWellItem, Parameter is MouseEventArgs
        private void TabMouseMoveCommandExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            var tab       = (TabWellItem)e.OriginalSource;
            var mouseArgs = (MouseEventArgs)e.Parameter;

            if (!tab.IsMouseCaptured || !tab.IsLoaded)
            {
                return;
            }

            var item  = ItemContainerGenerator.ItemFromContainer(tab);
            var index = Items.IndexOf(item);
            var pos   = mouseArgs.GetPosition(tab);

            var offset      = mouseArgs.GetPosition(this);
            var floatBounds = new Rect(
                pos.X - offset.X,
                -floatThreshold,
                this.ActualWidth,
                tab.ActualHeight + floatThreshold * 2
                );

            if (!floatBounds.Contains(pos))
            {
                var args = new FloatEventArgs(this, tab, mouseArgs);
                tab.ReleaseMouseCapture();
                DockManager.SetIsPinned(tab, false);
                FloatTabCommand?.TryExecute(args);
                return;
            }

            if (pos.X > 0 && pos.X < tab.ActualWidth)
            {
                swapThreshold = 0;
            }

            var isPinned = DockManager.GetIsPinned(tab);
            var grouped  = Items.OfType <object>()
                           .Select(i => ItemContainerGenerator.ContainerFromItem(i))
                           .Where(c => DockManager.GetIsPinned(c) == isPinned);

            var collection = ItemsSource as IList ?? Items as IList;

            if (pos.X < -swapThreshold && index > 0)
            {
                var prevTab = grouped.TakeWhile(c => c != tab).LastOrDefault() as FrameworkElement;
                if (prevTab != null)
                {
                    swapThreshold  = (int)Math.Ceiling(Math.Max(0, prevTab.ActualWidth - tab.ActualWidth));
                    floatThreshold = maxFloatThreshold;

                    collection.Remove(item);
                    collection.Insert(index - 1, item);

                    tab = (TabWellItem)ItemContainerGenerator.ContainerFromIndex(index - 1);
                }
            }
            else if (pos.X > tab.ActualWidth + swapThreshold && index < Items.Count - 1)
            {
                var nextTab = grouped.SkipWhile(c => c != tab).Skip(1).FirstOrDefault() as FrameworkElement;
                if (nextTab != null)
                {
                    swapThreshold  = (int)Math.Ceiling(Math.Max(0, nextTab.ActualWidth - tab.ActualWidth));
                    floatThreshold = maxFloatThreshold;

                    collection.Remove(item);
                    collection.Insert(index + 1, item);

                    tab = (TabWellItem)ItemContainerGenerator.ContainerFromIndex(index + 1);
                }
            }

            SelectedItem = item;
            tab.CaptureMouse();
        }