Exemple #1
0
        /// <summary>
        /// All xml roads lead through here
        /// </summary>
        private async Task <IVisualElement> InflateXmlImpl(String xml,
                                                           IDictionary <String, String> searchSeed)
        {
            var sw = Stopwatch.StartNew();

            var node = GetRootNode(xml);

            var nsAsmSearch = _visualTypeResolver.GetNamespaceAssemblySearch(node, searchSeed);

            var lineage = new VisualLineage();

            var res = await GetVisualAsync(node, null, nsAsmSearch, lineage,
                                           _appliedStyleBuilder.ApplyVisualStylesAsync).ConfigureAwait(false);

            Debug.WriteLine("Inflated visual in " + sw.ElapsedMilliseconds + " ms");


            lineage.AssertPopVisual(res);

            if (lineage.Count > 0)
            {
                throw new InvalidOperationException();
            }

            return(res);
        }
Exemple #2
0
        public virtual ValueSize MeasureElement <TRenderSize>(IVisualElement element,
                                                              TRenderSize availableSpace)
            where TRenderSize : IRenderSize
        {
            if (!element.IsRequiresMeasure)
            {
                lock (_measureLock)
                {
                    if (_lastMeasurements.TryGetValue(element, out var val))
                    {
                        LayoutQueue.RemoveVisualFromMeasureQueue(element);
                        return(val);
                    }
                }
            }

            // measure anyways if we know nothing of it...?
            //return ValueSize.Empty;

            VisualLineage.PushVisual(element);
            //_styleContext.PushVisual(element);

            var layoutElement = GetElementForLayout(element);

            ////////////////////////
            var res = MeasureElementImpl(layoutElement, availableSpace);

            ////////////////////////

            LayoutQueue.RemoveVisualFromMeasureQueue(element);
            element.AcceptChanges(ChangeType.Measure);
            return(res);
        }
        private void Init(IWindowManager windowManager,
                          IThemeProvider themeProvider,
                          IViewPerspective viewPerspective,
                          DisplayMetrics displayMetrics,
                          AndroidFontProvider fontProvider,
                          IViewState viewState,
                          IUiProvider uiProvider,
                          ref AndroidMeasureKit measureContext,
                          ref AndroidRenderContext renderContext,
                          ref RefreshRenderContext refreshRenderContext)
        {
            var imageProvider = new AndroidImageProvider(displayMetrics);

            var visualLineage = new VisualLineage();

            var lastMeasures = new Dictionary <IVisualElement, ValueSize>();

            var layoutQueue = new LayoutQueue();

            measureContext = new AndroidMeasureKit(windowManager, fontProvider,
                                                   this, lastMeasures, themeProvider, displayMetrics, visualLineage, layoutQueue);

            var visualPositions = new Dictionary <IVisualElement, ValueCube>();

            renderContext = new AndroidRenderContext(viewPerspective,
                                                     fontProvider, viewState, this, visualPositions,
                                                     lastMeasures, themeProvider, visualLineage, layoutQueue);

            refreshRenderContext = new RefreshRenderContext(viewPerspective, this,
                                                            visualPositions, lastMeasures, themeProvider, visualLineage, layoutQueue);

            Container.ResolveTo <IImageProvider>(imageProvider);
            Container.ResolveTo(uiProvider);
            Container.ResolveTo(themeProvider);
        }
Exemple #4
0
        private void Init(IWindowProvider <IVisualHost> windowProvider,
                          IThemeProvider themeProvider,
                          IViewPerspective viewPerspective,
                          Dictionary <IVisualElement, ValueCube> renderPositions,
                          ref GdiImageProvider?imageProvider,
                          ref GdiMeasureContext measureContext,
                          ref GdiRenderContext renderContext)
        {
            imageProvider = new GdiImageProvider();
            var lastMeasure   = new Dictionary <IVisualElement, ValueSize>();
            var visualLineage = new VisualLineage();

            measureContext = new GdiMeasureContext(this, lastMeasure,
                                                   themeProvider, visualLineage, VisualBootstrapper.LayoutQueue);

            renderContext = new GdiRenderContext(viewPerspective,
                                                 MeasureContext.Graphics, this, lastMeasure,
                                                 renderPositions, themeProvider, visualLineage, VisualBootstrapper.LayoutQueue);

            Container.ResolveTo <IImageProvider>(imageProvider);
            Container.ResolveTo <IUiProvider>(new GdiUiProvider(windowProvider));
            Container.ResolveTo(themeProvider);

            windowProvider.WindowShown += OnWindowShown;

            RegisterSurrogate <HtmlPanel>(GetHtmlPanelSurrogate);
        }
Exemple #5
0
        //public StaticGdiRenderKit(IViewPerspective viewPerspective,
        //                          IMultiSerializer xmlSerializer)
        //: this(viewPerspective, xmlSerializer)
        //{}

        public StaticGdiRenderKit(IViewPerspective viewPerspective,
                                  IMultiSerializer xmlSerializer)
            : base(new GdiImageProvider(), xmlSerializer,
                   NullSvgBuilder.Instance, null)
        {
            var defaultSurrogates = new BaseSurrogateProvider();

            var lastMeasure   = new Dictionary <IVisualElement, ValueSize>();
            var visualLineage = new VisualLineage();
            var layoutQueue   = new LayoutQueue();

            MeasureContext = new GdiMeasureContext(defaultSurrogates, lastMeasure,
                                                   BaselineThemeProvider.Instance, visualLineage, layoutQueue);

            RenderContext = new GdiRenderContext(viewPerspective,
                                                 MeasureContext.Graphics, defaultSurrogates, lastMeasure,
                                                 new Dictionary <IVisualElement, ValueCube>(),
                                                 BaselineThemeProvider.Instance, visualLineage, layoutQueue);
        }
        public OpenGLRenderKit(IFontProvider fontProvider,
                               IGLContext glContext,
                               IThemeProvider themeProvider,
                               IImageProvider imageProvider)
            : base(imageProvider, Serializer,
                   new SvgPathBuilder(imageProvider, Serializer), null)
            //: base(themeProvider, Serializer.AttributeParser,
            //    Serializer.TypeInferrer, Serializer.TypeManipulator,
            //    new Dictionary<IVisualElement, ValueCube>(), imageProvider,
            //    Serializer.AssemblyList, Serializer)
        {
            var lastMeasurements = new Dictionary <IVisualElement, ValueSize>();
            var lastRender       = new Dictionary <IVisualElement, ValueCube>();
            var visualLineage    = new VisualLineage();
            var layoutQueue      = new LayoutQueue();

            MeasureContext = new GLMeasureContext(fontProvider, this,
                                                  lastMeasurements, themeProvider, visualLineage, layoutQueue);

            RenderContext = new GLRenderContext(new BasePerspective(),
                                                glContext, fontProvider, this, themeProvider,
                                                visualLineage, lastRender, layoutQueue);
        }
Exemple #7
0
        private ValueSize MeasureElementImpl <TRenderSize>(IVisualElement element,
                                                           TRenderSize availableSpace)
            where TRenderSize : IRenderSize
        {
            if (element.Visibility == Visibility.Collapsed)
            {
                return(ValueSize.Empty);
            }

            var margin          = element.Margin.GetValue(availableSpace);
            var border          = element.Border;
            var borderThickness = border.GetThickness(availableSpace);

            ValueSize desiredSize;
            Double    extraWidth;
            Double    extraHeight;

            if (margin.IsEmpty && border.IsEmpty)
            {
                desiredSize = element.Measure(availableSpace, this);

                extraWidth  = 0;
                extraHeight = 0;
            }

            else
            {
                extraWidth  = margin.Width + borderThickness.Width;
                extraHeight = margin.Height + borderThickness.Height;

                desiredSize = element.Measure(
                    new ValueRenderSize(availableSpace.Width - extraWidth,
                                        availableSpace.Height - extraHeight), this);
            }

            var h = desiredSize.Height;

            switch (element.Height?.Units ?? LengthUnits.Invalid)
            {
            case LengthUnits.Invalid:
            case LengthUnits.Percent:
                h = desiredSize.Height + extraHeight;
                break;

            case LengthUnits.Px:
                h = element.Height !.Value.GetQuantity(availableSpace.Height) + extraHeight;
                break;
            }


            var w = desiredSize.Width;

            switch (element.Width?.Units ?? LengthUnits.Invalid)
            {
            case LengthUnits.Invalid:
            case LengthUnits.Percent:
                w = desiredSize.Width + margin.Width + borderThickness.Width;
                break;

            case LengthUnits.Px:
                w = element.Width !.Value.GetQuantity(availableSpace.Width) + extraWidth;
                break;
            }


            desiredSize = new ValueSize(w, h);

            var useHeight = desiredSize.Height;
            var useWidth  = desiredSize.Width;


            if (element.BeforeLabel is { } beforeLabel)
            {
                VisualLineage.PushVisual(beforeLabel);
                var beforeLabelMeasured = MeasureElementImpl(beforeLabel, availableSpace);
                useHeight = Math.Max(useHeight, beforeLabelMeasured.Height);
                useWidth += beforeLabelMeasured.Width;
            }

            if (element.AfterLabel is { } afterLabel)
            {
                VisualLineage.PushVisual(afterLabel);
                var afterLabelMeasured = MeasureElementImpl(afterLabel, availableSpace);
                useHeight = Math.Max(useHeight, afterLabelMeasured.Height);
                useWidth += afterLabelMeasured.Width;
            }

            desiredSize = new ValueSize(useWidth, useHeight);

            SetLastMeasured(element, desiredSize);

            VisualLineage.PopVisual();

            return(desiredSize);
        }