Git Product home page Git Product logo

Comments (1)

LyonJack avatar LyonJack commented on August 27, 2024

LayoutPanelControl.cs
func:
protected override void OnFixChildrenDockLengths()
{
if (ActualWidth == 0.0 || ActualHeight == 0.0) return;

#region Setup DockWidth/Height for children

if (_model.Orientation == Orientation.Horizontal)
{
	if (_model.ContainsChildOfType<LayoutDocumentPane, LayoutDocumentPaneGroup>())
	{
		for (var i = 0; i < _model.Children.Count; i++)
		{
			if (_model.Children[i] as ILayoutContainer != null &&
				((_model.Children[i] as ILayoutContainer).IsOfType<LayoutDocumentPane, LayoutDocumentPaneGroup>() ||
				 (_model.Children[i] as ILayoutContainer).ContainsChildOfType<LayoutDocumentPane, LayoutDocumentPaneGroup>()))
			{
				// Keep set values (from XML for instance)
				if (!(_model.Children[i] as ILayoutPositionableElement).DockWidth.IsStar) (_model.Children[i] as ILayoutPositionableElement).DockWidth = new GridLength(1.0, GridUnitType.Star);
			}
			else if (_model.Children[i] as ILayoutPositionableElement != null && (_model.Children[i] as ILayoutPositionableElement).DockWidth.IsStar)
			{
				var childPositionableModelWidthActualSize = _model.Children[i] as ILayoutPositionableElement as ILayoutPositionableElementWithActualSize;
				var childDockMinWidth = (_model.Children[i] as ILayoutPositionableElement).CalculatedDockMinWidth();
				if (childPositionableModelWidthActualSize.ActualWidth == 0)
				{
					if (childPositionableModelWidthActualSize.DockWidth.IsStar)
					{
						childPositionableModelWidthActualSize.ActualWidth = (ActualWidth - _model.Children.Cast<ILayoutPositionableElement>()
							.Where(j => j.DockWidth.IsAbsolute)
							.Select(j => j.DockWidth.Value)
							.Sum()) * childPositionableModelWidthActualSize.DockWidth.Value / _model.Children.Cast<ILayoutPositionableElement>()
							.Where(j => j.DockWidth.IsStar)
							.Select(j => j.DockWidth.Value)
							.Sum();
					}
					else if (childPositionableModelWidthActualSize.DockWidth.IsAbsolute)
					{
						childPositionableModelWidthActualSize.ActualWidth = childPositionableModelWidthActualSize.DockWidth.Value;
					}
				}
				var widthToSet = Math.Max(childPositionableModelWidthActualSize.ActualWidth, childDockMinWidth);

				widthToSet = Math.Min(widthToSet, ActualWidth / 2.0);
				widthToSet = Math.Max(widthToSet, childDockMinWidth);
				(_model.Children[i] as ILayoutPositionableElement).DockWidth = new GridLength(widthToSet, GridUnitType.Pixel);
			}
		}
	}
	else
	{
		for (var i = 0; i < _model.Children.Count; i++)
		{
			var childPositionableModel = _model.Children[i] as ILayoutPositionableElement;
			if (!childPositionableModel.DockWidth.IsStar)
			{
				// Keep set values (from XML for instance)
				if (!childPositionableModel.DockWidth.IsStar) childPositionableModel.DockWidth = new GridLength(1.0, GridUnitType.Star);
			}
		}
	}
}
else // Vertical
{
	if (_model.ContainsChildOfType<LayoutDocumentPane, LayoutDocumentPaneGroup>())
	{
		for (var i = 0; i < _model.Children.Count; i++)
		{
			if (_model.Children[i] is ILayoutContainer childContainerModel &&
				(childContainerModel.IsOfType<LayoutDocumentPane, LayoutDocumentPaneGroup>() ||
				 childContainerModel.ContainsChildOfType<LayoutDocumentPane, LayoutDocumentPaneGroup>()))
			{
				// Keep set values (from XML for instance)
				if (!(_model.Children[i] as ILayoutPositionableElement).DockHeight.IsStar) (_model.Children[i] as ILayoutPositionableElement).DockHeight = new GridLength(1.0, GridUnitType.Star);
			}
			else if (_model.Children[i] as ILayoutPositionableElement != null && (_model.Children[i] as ILayoutPositionableElement).DockHeight.IsStar)
			{
				var childPositionableModelWidthActualSize = _model.Children[i] as ILayoutPositionableElement as ILayoutPositionableElementWithActualSize;
				var childDockMinHeight = (_model.Children[i] as ILayoutPositionableElement).CalculatedDockMinHeight();
				if (childPositionableModelWidthActualSize.ActualHeight == 0)
				{
					if (childPositionableModelWidthActualSize.DockHeight.IsStar)
					{
						childPositionableModelWidthActualSize.ActualHeight = ((ActualHeight - _model.Children.Cast<ILayoutPositionableElement>()
							.Where(j => j.DockHeight.IsAbsolute)
							.Select(j => j.DockHeight.Value)
							.Sum())) * childPositionableModelWidthActualSize.DockHeight.Value / _model.Children.Cast<ILayoutPositionableElement>()
							.Where(j => j.DockHeight.IsStar)
							.Select(j => j.DockHeight.Value)
							.Sum();
					}
					else if (childPositionableModelWidthActualSize.DockHeight.IsAbsolute)
					{
						childPositionableModelWidthActualSize.ActualHeight = childPositionableModelWidthActualSize.DockHeight.Value;
					}
				}
				var heightToSet = Math.Max(childPositionableModelWidthActualSize.ActualHeight, childDockMinHeight);
				heightToSet = Math.Min(heightToSet, ActualHeight / 2.0);
				heightToSet = Math.Max(heightToSet, childDockMinHeight);
				(_model.Children[i] as ILayoutPositionableElement).DockHeight = new GridLength(heightToSet, GridUnitType.Pixel);
			}
		}
	}
	else
	{
		for (var i = 0; i < _model.Children.Count; i++)
		{
			var childPositionableModel = _model.Children[i] as ILayoutPositionableElement;
			if (!childPositionableModel.DockHeight.IsStar)
			{
				// Keep set values (from XML for instance)
				if (!childPositionableModel.DockHeight.IsStar) childPositionableModel.DockHeight = new GridLength(1.0, GridUnitType.Star);
			}
		}
	}
}

#endregion Setup DockWidth/Height for children

}

from avalondock.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.