private static void OnBarHeightChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { KGanttChartView view = d as KGanttChartView; if (view != null) { view.UpdateBars(); } }
private static void OnDisplayedTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { KGanttChartView view = d as KGanttChartView; if (view != null) { view.OnDisplayedTimeChanged(); view.UpdateScrollFromDisplayedTime(); } }
private static void OnTimelinePageStartChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { KGanttChartView view = d as KGanttChartView; if (view != null) { view.ClearScheduleCacheValues(); view.CoerceTimelinePage(); view.UpdateComputedWidth(); view.UpdateScales(); view.UpdateBars(); view.UpdateDisplayedTimeFromScroll(); view.OnTimelinePageChanged(); } }
/// <summary> /// S'assure que les zoom opérations existent. /// </summary> /// <param name="zoomable">The zoomable.</param> /// <param name="chart">The chart.</param> private void EnsureOperations(IZoommerGantt zoomable, KGanttChartView chart) { if (_zoomOperations == null) { _zoomOperations = new Subject <ZoomAction>(); _zoomOperations .BufferWithInactivity(TimeSpan.FromMilliseconds(200)) .Take(1) .ObserveOnDispatcher() .Subscribe(actions => { ExecuteZoomActions(zoomable, chart, actions); _zoomOperations.OnCompleted(); _zoomOperations.Dispose(); _zoomOperations = null; }); } }
/// <summary> /// Met en attente un auto-scale qui sera exécuté dès que le gantt sera prêt. /// </summary> /// <param name="horizontal"><c>true</c> pour scaler horizontalement.</param> /// <param name="vertical"><c>true</c> pour scaler verticalement.</param> /// <param name="resetZooms"><c>true</c> pour RAZ le zoom.</param> public void EnqueueAutoScale(bool horizontal, bool vertical, bool resetZooms) { if (!this.Gantts.Any()) { return; } if (resetZooms) { _ignoreZoomChanges = true; if (horizontal) { this.ZoomX = 1; } if (vertical) { this.ZoomY = 1; } foreach (var chart in this.Gantts) { KGanttChartView ganttChart = null; var grid = chart as GanttChartDataGrid; if (grid != null && grid.GanttChartView != null) { ganttChart = grid.GanttChartView as KGanttChartView; } else { var v = chart as GanttChartView; if (v != null) { ganttChart = v as KGanttChartView; } } if (ganttChart != null) { if (horizontal) { ganttChart.DeferScrollToHorizontalOffset(0); } if (vertical) { ganttChart.DeferScrollToVerticalOffset(0); } } } _ignoreZoomChanges = false; } if (this.Gantts.Any(g => g.IsReadyForAutoScale)) { this.AutoScale(horizontal, vertical); } else if (this.Gantts.Any(g => !g.IsReadyForAutoScale)) { this.AutoScaleEnqueued = () => this.AutoScale(horizontal, vertical); foreach (var gantt in this.Gantts.Where(g => !g.IsReadyForAutoScale)) { gantt.ReadyForAutoScale -= OnReadyForAutoScale; gantt.ReadyForAutoScale += OnReadyForAutoScale; } } }
/// <summary> /// Execute les différentes actions de zoom mise en file. /// </summary> /// <param name="zoomable">Le gantt.</param> /// <param name="chart">Le chart.</param> /// <param name="actions">Les actions.</param> private void ExecuteZoomActions(IZoommerGantt zoomable, KGanttChartView chart, IEnumerable <ZoomAction> actions) { double zoomX = zoomable.ZoomX; double zoomY = zoomable.ZoomY; double verticalOffset = chart.ScrollVerticalOffset; double horizontalOffset = chart.ScrollHorizontalOffset; bool scrollHorizontal = false; bool scrollVertical = false; foreach (var action in actions) { switch (action.Action) { case ZoomActionEnum.ZoomXIn: { double delta = zoomX * 1.2 - zoomX; zoomX += delta; horizontalOffset += action.MousePosition.X * delta; scrollHorizontal = true; } break; case ZoomActionEnum.ZoomXOut: { double delta = zoomX / 1.2 - zoomX; zoomX += delta; horizontalOffset += action.MousePosition.X * delta; scrollHorizontal = true; } break; case ZoomActionEnum.ZoomYIn: { double delta = zoomY * 1.2 - zoomY; zoomY += delta; verticalOffset += action.MousePosition.Y * delta; scrollVertical = true; } break; case ZoomActionEnum.ZoomYOut: { double delta = zoomY / 1.2 - zoomY; zoomY += delta; verticalOffset += action.MousePosition.Y * delta; scrollVertical = true; } break; case ZoomActionEnum.ScrollRight: horizontalOffset += 48; scrollHorizontal = true; break; case ZoomActionEnum.ScrollLeft: horizontalOffset -= 48; scrollHorizontal = true; break; default: throw new ArgumentOutOfRangeException("action"); } } ApplyZoom(zoomX, zoomY); if (scrollHorizontal) { chart.DeferScrollToHorizontalOffset(horizontalOffset); } if (scrollVertical) { chart.DeferScrollToVerticalOffset(verticalOffset); } SetBusy(false, chart); }
/// <summary> /// Définit l'état occupé d'un chart. /// </summary> /// <param name="isBusy"><c>true</c> si occupé.</param> /// <param name="chart">Le chart.</param> private void SetBusy(bool isBusy, KGanttChartView chart) { chart.SpinnerVisibility = isBusy ? Visibility.Visible : Visibility.Collapsed; }