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) { } }
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; } }
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>()); }
/// <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(); //全部执行完毕后清理 } }