Ejemplo n.º 1
0
        private RenderNode CreateNode(PlacementNode node)
        {
            var position = RenderPosition(node);
            var elements = _layoutBuilder.Build(position, _config);

            return(new RenderNode(
                       task: node.Task,
                       position: position,
                       dimensions: _config.Dimensions,
                       elements: elements.ToList()
                       ));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Updates the specified layout using the current properties, and the specified new size.
        /// </summary>
        private Size UpdateLayout(ref LayoutBuilder layout, Size availableSize, bool exactWidth)
        {
            // Normally this is a no-op since it's called in Measure. We call it again to prevent a crash in the edge case where Text changes in between calling Measure and Arrange.
            Update();

            var newLayout = new LayoutBuilder(
                _textFormatted,
                _paint,
                IsLayoutConstrainedByMaxLines ? TruncateEnd : _ellipsize,                 // .SetMaxLines() won't work on Android unless the ellipsize "END" is used.
                _layoutAlignment,
                _justificationMode,
                TextWrapping,
                MaxLines,
                availableSize,
                exactWidth,
                (float)(LineHeight * ViewHelper.Scale),
                LineStackingStrategy,
                layout
                );

            if (!newLayout.Equals(layout))
            {
                layout = newLayout;
                using (
                    _trace.WriteEventActivity(
                        TraceProvider.TextBlock_MakeLayoutStart,
                        TraceProvider.TextBlock_MakeLayoutStop
                        )
                    )
                {
                    layout.Build();
                }
            }

            if (Foreground is GradientBrush gb)
            {
                layout.Layout.Paint.SetShader(gb.GetShader(_measureLayout.MeasuredSize.LogicalToPhysicalPixels()));
            }

            if (_textFormatted is UnoSpannableString textFormatted)
            {
                foreach (var inline in GetEffectiveInlines())
                {
                    // TODO: This doesn't work when the Inline background is a GradientBrush, but works for SolidColorBrush
                    textFormatted.SetPaintSpan(inline.inline.GetPaint(_measureLayout.MeasuredSize), inline.start, inline.end);
                }
            }

            return(layout.MeasuredSize);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Updates the specified layout using the current properties, and the specified new size.
        /// </summary>
        private Size UpdateLayout(ref LayoutBuilder layout, Size availableSize, bool exactWidth)
        {
            // Normally this is a no-op since it's called in Measure. We call it again to prevent a crash in the edge case where Text changes in between calling Measure and Arrange.
            Update();

            var newLayout = new LayoutBuilder(
                _textFormatted,
                _paint,
                IsLayoutConstrainedByMaxLines ? TruncateEnd : _ellipsize,                 // .SetMaxLines() won't work on Android unless the ellipsize "END" is used.
                _layoutAlignment,
                _justificationMode,
                TextWrapping,
                MaxLines,
                availableSize,
                exactWidth,
                (float)(LineHeight * ViewHelper.Scale),
                LineStackingStrategy,
                layout
                );

            if (!newLayout.Equals(layout))
            {
                layout = newLayout;

                using (
                    _trace.WriteEventActivity(
                        TraceProvider.TextBlock_MakeLayoutStart,
                        TraceProvider.TextBlock_MakeLayoutStop
                        )
                    )
                {
                    layout.Build();
                }
            }

            return(layout.MeasuredSize);
        }
Ejemplo n.º 4
0
        public void Render(XElement imageXml, Stream output)
        {
            var image = renderer.Render(builder.Build(imageXml));

            image.Save(output, ImageFormat.Png);
        }
        public static IServiceCollection AddHardware(this IServiceCollection serviceCollection)
        {
            return(serviceCollection
                   .AddCompositeDispenser((sp) =>
            {
                KioskSettings kioskSettings = sp.GetRequiredService <KioskSettings>();

                if (kioskSettings.Dispenser.Mode == OptionUseCase.Off)
                {
                    return null;
                }

                return new CompositeDispenserBuilder()
                .AddStrategy(sp.GetRequiredService <IDispensingStrategy>())
                .AddDispensers(() =>
                               kioskSettings.Dispenser.SlaveMachines.Select(x =>
                {
                    if (x.Model.Equals("VisionEsPlus", StringComparison.InvariantCultureIgnoreCase))
                    {
                        VisionEsPlusSettings settings = new VisionEsPlusSettings
                        {
                            PortNumber = (ushort)x.Port,
                            Address = x.Address,
                            IpAddress = x.IpAddress
                        };

                        ICommunicationChannel channel = null;

                        if (kioskSettings.Dispenser.Mode != OptionUseCase.Off)
                        {
                            switch (x.Protocol)
                            {
                            case Utils.Common.Enum.CommunicationProtocol.Serial:
                                channel = new SerialPortChannel(settings.PortNumber, settings.BaudRate, settings.Timeout, settings.CommandsSendDelay);
                                break;

                            case Utils.Common.Enum.CommunicationProtocol.TCP:
                                channel = new TcpChannel(settings.IpAddress, settings.PortNumber);
                                break;

                            default:
                                break;
                            }
                        }

                        return new VisionEsPlusVendingMachine(x.Number.ToString(), new VisionEsPlus(channel, settings));
                    }
                    else
                    {
                        throw new ArgumentException("Unknown dispenser model");
                    }
                })
                               ).Build();
            })
                   .AddLayout((sp) =>
            {
                KioskSettings kioskSettings = sp.GetRequiredService <KioskSettings>();

                if (kioskSettings.Dispenser.Mode == OptionUseCase.Off)
                {
                    return null;
                }

                ILayoutBuilder layoutBuilder = new LayoutBuilder();

                if (kioskSettings.Dispenser.SlaveMachines.Any(x => !x.Number.HasValue || x.Number == 0))
                {
                    throw new ArgumentException("Machine number is mandatory");
                }

                kioskSettings.Dispenser.SlaveMachines.ToList().ForEach(x =>
                {
                    if (x.Model.Equals("VisionEsPlus", StringComparison.InvariantCultureIgnoreCase))
                    {
                        // TODO: Refactor this stub
                        if (x.Number == 1)
                        {
                            layoutBuilder.AddMachine <VisionEspMachine, VisionEspTray, VisionEspBelt>(x.Number.Value)
                            .AddTray(11)
                            .AddBelt(2).CommitTray()
                            .AddTray(18)
                            .AddBelt(0).AddBelt(1).AddBelt(2).AddBelt(3).AddBelt(4).AddBelt(5).CommitTray().CommitMachine();
                        }

                        if (x.Number == 2)
                        {
                            layoutBuilder.AddMachine <VisionEspMachine, VisionEspTray, VisionEspBelt>(x.Number.Value)
                            .AddTray(11)
                            .AddBelt(0).AddBelt(1).AddBelt(2).AddBelt(3).AddBelt(4).CommitTray().CommitMachine();
                        }
                    }
                    else
                    {
                        throw new ArgumentException("Unknown dispenser model");
                    }
                });

                return layoutBuilder.Build();
            })
                   .AddCashPayment((sp, cs) =>
            {
                KioskSettings kioskSettings = sp.GetRequiredService <KioskSettings>();

                IEnumerable <ICashDeviceAdapter> cashDevices = null;

                switch (kioskSettings.Cashbox.Mode)
                {
                case OptionUseCase.Emulation:
                    cashDevices = new ICashDeviceAdapter[] {
                        new MockBillAcceptor(sp.GetRequiredService <ICurrencyConverter>(), (s) => {
                            s.IssueIndex = 1;
                            s.BaseCurrency = kioskSettings.BaseCurrency;                                                                                // Stub
                            s.BillsToReceive = new Money[] { Money.Create(100, CurrencyCode.USDollar), Money.Create(500, CurrencyCode.RussianRouble) }; // Stub
                            s.BillsToGiveChange = new Money[] { Money.Create(50, CurrencyCode.RussianRouble), Money.Create(1, CurrencyCode.USDollar) }; // Stub
                        })
                    };
                    break;

                case OptionUseCase.Off:
                    cashDevices = null;
                    break;

                case OptionUseCase.On:
                    // ...
                    break;
                }

                cs.CashDevices = cashDevices;

                return cs;
            })
                   .AddEcommerce((sp, es) =>
            {
                KioskSettings kioskSettings = sp.GetRequiredService <KioskSettings>();

                foreach (var provider in kioskSettings.ECommerceSettings.PaymentProviders)
                {
                    switch (provider.Source)
                    {
                    case PaymentSource.UVS:
                        if (kioskSettings.ECommerceSettings.Mode == OptionUseCase.Emulation)
                        {
                            es.Add(new UvsMockEcommerceService(sp.GetRequiredService <ICurrencyConverter>(), (settings) => { settings.BaseCurrency = kioskSettings.BaseCurrency; }));
                        }
                        else if (kioskSettings.ECommerceSettings.Mode == OptionUseCase.On)
                        {
                            // ...
                        }
                        break;

                    default:
                        throw new ArgumentException("Invalid ecommerce source");
                    }
                }

                return es;
            })
                   .AddEventMediation((sp, broker) =>
            {
                broker.AppendProducer(sp.GetRequiredService <IPaymentProvider>() as IEventProducer);
                broker.AppendProducer(sp.GetRequiredService <ICashPaymentService>() as IEventProducer);
                broker.AppendProducer(sp.GetRequiredService <ICompositeDispenser>() as IEventProducer);
                broker.AppendProducer(sp.GetRequiredService <IStorageService>() as IEventProducer);
                broker.AppendProducer(sp.GetRequiredService <IAttendant>() as IEventProducer);
                broker.AppendProducer(sp.GetRequiredService <ISlipService>() as IEventProducer);
            })
                   .AddSingleton((sp) => new EventConsumer()
                                 .AppendWriter <IPaymentProvider>(new EventWriter <IPaymentProvider>(sp.GetRequiredService <ILogger <IPaymentProvider> >()))
                                 .AppendWriter <ICashPaymentService>(new EventWriter <ICashPaymentService>(sp.GetRequiredService <ILogger <ICashPaymentService> >()))
                                 .AppendWriter <ICompositeDispenser>(new EventWriter <ICompositeDispenser>(sp.GetRequiredService <ILogger <ICompositeDispenser> >()))
                                 .AppendWriter <IStorageService>(new EventWriter <IStorageService>(sp.GetRequiredService <ILogger <IStorageService> >()))
                                 .AppendWriter <IAttendant>(new EventWriter <IAttendant>(sp.GetRequiredService <ILogger <IAttendant> >()))
                                 .AppendWriter <ISlipService>(new EventWriter <ISlipService>(sp.GetRequiredService <ILogger <ISlipService> >()))));
        }