예제 #1
0
    private void Update()
    {
        if (Lerps)
        {
            // Lerping size
            SegmentSize target = MinSize;
            if (Extended)
            {
                target = MaxSize;
            }
            if (ExtraPanel)
            {
                target = ExtraSize;
            }

            // Display/screen segment
            Segment.Min   = Vector2.Lerp(Segment.Min, target.Min, Time.deltaTime * LerpSpeed);
            Segment.Max   = Vector2.Lerp(Segment.Max, target.Max, Time.deltaTime * LerpSpeed);
            Segment.Scale = Mathf.Lerp(Segment.Scale, target.Scale, Time.deltaTime * LerpSpeed);
            Segment.UpdateTriggerSize();

            // Handles
            HandleTop.localPosition    = Vector3.zero;
            HandleBottom.localPosition = new Vector3(0, -Canvas.sizeDelta.y * Canvas.localScale.y, -Canvas.sizeDelta.x * Canvas.localScale.x);
            //Vector3.Lerp( HandleBottom.localPosition, targetpos, Time.deltaTime * LerpSpeed );
        }

        // Input
        if (Grabbed)
        {
        }
    }
예제 #2
0
        public void Run()
        {
            SegmentSize segmentSize = _chartArea.SegmentSize;
            long        offset      = _chartArea.Offset;
            int         width       = _chartArea.Width;
            int         height      = _chartArea.Height;

            var dataAdapter = _dataAdapterFactory.Get();

            if (dataAdapter == null)
            {
                return;
            }

            double translateX = 0;

            if (_lastRenderingRequest.Covers(offset, segmentSize, width, height))
            {
                translateX = (offset - _lastRenderingRequest.Offset) / (double)-segmentSize.DisplayedValue;
            }
            else
            {
                // TODO: Определять буферную зону динамически в зависимости от текущего масштаба и расстоянием между начальным и конечным событием
                long bufferedOffset = Math.Max(0, offset - segmentSize.DisplayedValue * 2 * width);
                var  request        = new RenderingRequest(bufferedOffset, segmentSize, width * 5, height);

                translateX = (bufferedOffset - offset) / (double)segmentSize.DisplayedValue;

                var figures = dataAdapter.GetFiguresToDraw(
                    request.Offset,
                    request.Width,
                    segmentSize);

                _visualizer.Redraw(figures);

                _lastRenderingRequest = request;
            }

            var translateTransform = _chartArea.Canvas.RenderTransform as TranslateTransform;

            if (translateTransform == null)
            {
                _chartArea.Canvas.RenderTransform = translateTransform = new TranslateTransform(0, 0);
            }

            translateTransform.X = translateX;


            if (segmentSize.NeedToScale)
            {
                _chartArea.Canvas.LayoutTransform = new ScaleTransform(segmentSize.ScaleCoefficient, 1);
            }
            else
            {
                _chartArea.Canvas.LayoutTransform = null;
            }
        }
예제 #3
0
        private static object CoerceSegmentSize(DependencyObject d, object value)
        {
            SegmentSize newValue = (SegmentSize)value;

            if (d is EventsChart chart)
            {
                if (newValue.DisplayedValue == -1 || chart.BucketContainer == null)
                {
                    return(newValue);
                }

                if (chart._prefferedSegmentSizes.Length > 0 && !chart._prefferedSegmentSizes.Contains(newValue))
                {
                    return(chart._prefferedSegmentSizes[chart._prefferedSegmentSizes.Length - 1]);
                }
            }

            return(newValue);
        }
        public IEnumerable <IFigure> GetFiguresToDraw(long offset, long width, SegmentSize segmentSize)
        {
            if (ChartHeight <= 0)
            {
                return(Enumerable.Empty <IFigure>());
            }

            long firstTimestamp = _container.FirstTimestamp;
            long start          = firstTimestamp + offset;
            long end            = firstTimestamp + offset + width * segmentSize.DisplayedValue;

            if (segmentSize.RequestedValue > 1)
            {
                Span <double> densities = _container.GetDensities(start, end, segmentSize.RequestedValue, ref _targetBuffer);
                return(GetFiguresFromDensities(_targetBuffer, 0, densities.Length));
            }
            else if (segmentSize.RequestedValue == 1)
            {
                var events = _container.GetRealEvents(start, end + 1);
                return(GetFiguresFromEvents(events, offset, start, end));
            }

            return(Enumerable.Empty <IFigure>());
        }
예제 #5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="info"></param>
        /// <param name="stream"></param>
        /// <param name="dataLength">需要上传的总数据长度,不是每种流都支持length属性,所以需要额外的指定</param>
        public void Save(DTObject info, Stream stream, long dataLength, Action <DTObject, Progress> callback, CancelToken token)
        {
            try
            {
                _info = info;
                _info["requestId"] = Guid.NewGuid();
                _token             = token;

                _callback = callback;
                long completedLength = 0;
                using (var temp = SegmentReaderSlim.Borrow(SegmentSize.GetAdviceSize(dataLength)))
                {
                    var reader = temp.Item;
                    reader.Read(stream, (seg) =>
                    {
                        var content    = seg.GetContent();
                        bool sent      = false;
                        bool completed = UseClient((client) =>
                        {
                            var msg = CreateSaveMessage(_info, content);
                            _future = new Future <bool>(); //使用该对象监视进度
                            _future.Start();
                            client.Send(msg);
                            sent    = _future.Result;
                            _future = null;
                        });

                        if (_token.IsCanceled)
                        {
                            //取消
                            UseClient((client) =>
                            {
                                var msg = CreateCancelSaveMessage(_info);
                                client.Send(msg);
                            });
                            return(false);
                        }

                        if (_error != null)
                        {
                            return(false);
                        }

                        if (completed && sent)
                        {
                            completedLength += content.Length;
                            callback(_info, new Progress(dataLength, completedLength, content.Length));
                            return(true);
                        }
                        return(false);
                    });
                }

                if (_error != null)
                {
                    throw new ApplicationException(_error);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                ClearUp(); //全部执行完毕后清理
            }
        }