public void FilterRowsByValueAtPosition(Double x, Double y) { ColumnViewModel columnViewModel = SheetViewModel.ColumnViewModels.First(cvm => cvm.X <= x && x < cvm.X + cvm.Width); if (columnViewModel == null) { return; } RowViewModel rowViewModel = null; if (mainPageViewModel.ExplorationViewModel.ViewStatus.IsN) { return; } if (mainPageViewModel.ExplorationViewModel.ViewStatus.CategoricalCount > 0) { if (columnViewModel.Type == ColumnType.Numerical) { return; } if (mainPageViewModel.ExplorationViewModel.ViewStatus.SelectedColumnViewModels.IndexOf(columnViewModel) < 0) { return; } } if (State == TableViewState.AllRow || State == TableViewState.SelectedRow) { rowViewModel = allRowViewModels.First(rvm => rvm.Y <= y && y < rvm.Y + Const.RowHeight); } else if (State == TableViewState.GroupedRow) { rowViewModel = groupedRowViewModels.First(rvm => rvm.Y <= y && y < rvm.Y + Const.RowHeight); } if (rowViewModel == null) { return; } if (columnViewModel.Type == ColumnType.Categorical) { Category category = rowViewModel.Cells[columnViewModel.Index].Content as Category; category.IsKept = false; ColumnViewModel cvm = category.ColumnViewModel; if (cvm.Categories.All(c => c.IsKept)) { cvm.IsKept = true; } else if (cvm.Categories.All(c => !c.IsKept)) { cvm.IsKept = false; } else { cvm.IsKept = null; } mainPageViewModel.SheetViewModel.UpdateFilter(); mainPageViewModel.ReflectAll(ReflectReason.RowFiltered); } }
/// <summary> /// 바뀐 state는 이미 pageViewModel.State에 할당된 상태임. 이전 상태는 OldState에서 확인할 수 있음 /// </summary> /// <param name="pageViewModel"></param> /// <param name="pageView"></param> /// <param name="isUndo"></param> public void PageViewStateChanged(PageViewModel pageViewModel, PageView pageView /*, Boolean isUndo*/) { PageViewModel.PageViewState state = pageViewModel.State, oldState = pageViewModel.OldState; if (oldState == PageViewModel.PageViewState.Undoing && state == PageViewModel.PageViewState.Selected) // undo 하는 경우 { Debug.Assert(selectedPageViews.IndexOf(pageView) < 0); mainPageViewModel.TableViewModel.StashViewStatus(ViewStatus, AnimationHint.AnimationType.DependOnViewStatus); selectedPageViews.Add(pageView); // 새로운 page 만들기 view.ExplorationView.AddNewPage(); mainPageViewModel.ReflectAll(ReflectReason.Undo); view.TableView.ScrollToColumnViewModel(mainPageViewModel.SheetViewModel.ColumnViewModels.OrderBy(c => c.Order).First()); // Preview 풀기 mainPageViewModel.TableViewModel.CancelIndexing(false); // Page View 위로 보내기 pageView.ReflectState(); } else if (state == PageViewModel.PageViewState.Selected) // 현재 선택하는 경우 { Debug.Assert(pageView == TopPageView); Debug.Assert(previewingColumnViewModel != null); Debug.Assert(ViewStatus.SelectedColumnViewModels.IndexOf(previewingColumnViewModel) < 0); // 이미 선택한 걸 또 선택하는 경우는 없도록 이 함수 호출전에 미리 체크해야함 mainPageViewModel.TableViewModel.StashViewStatus(ViewStatus, AnimationHint.AnimationType.DependOnViewStatus); // 현재 탭된 컬럼의 viewStatus에는 previewingColumn이 추가되어 있는 상태임. selectedPageViews.Add(pageView); // 차트 새로 반영 (타이틀이 업데이트 될 것임) //pageViewModel.Reflect(true); // 새로운 page 만들기 view.ExplorationView.AddNewPage(); Logger.Instance.Log($"column selected,{String.Join(",", ViewStatus.SelectedColumnViewModels.Select(cvm => cvm.Column.Name))}"); mainPageViewModel.ReflectAll(ReflectReason.ColumnSelected); //view.TableView.ScrollToColumnViewModel(mainPageViewModel.SheetViewModel.ColumnViewModels.OrderBy(c => c.Order).First()); //항상 움직이면 안됨. 애니메이션이 있으면 시작점으로 움직여야 하지만 애니메이션이 없는 경우 그대로 있어야함. // Preview 풀기 mainPageViewModel.TableViewModel.CancelIndexing(false); pageView.ReflectState(); } else if (state == PageViewModel.PageViewState.Undoing || state == PageViewModel.PageViewState.Empty) // 선택해제하는 경우 혹은 스트로크로 바로 컬럼 지우는 경우 { mainPageViewModel.TableViewModel.StashViewStatus(ViewStatus, AnimationHint.AnimationType.DependOnViewStatus); selectedPageViews.Remove(pageView); // Preview 풀기 (만약 되어있다면) mainPageViewModel.TableViewModel.CancelIndexing(false); // 기존 탑 페이지 지우고 이걸 탑 페이지로 지정 view.ExplorationView.RemoveTopPage(pageView); //mainPageViewModel.ReflectAll(true, ReflectReason.ColumnViewModelUnselected); mainPageViewModel.ReflectAll(ReflectReason.ColumnUnselected); // ReflectReason2.ColumnViewModelUnselected); // performance 이슈로 위에것만 업데이트 해봄 Logger.Instance.Log($"column unselected,{String.Join(",", ViewStatus.SelectedColumnViewModels.Select(cvm => cvm.Column.Name))}"); view.TableView.ScrollToColumnViewModel(mainPageViewModel.SheetViewModel.ColumnViewModels.OrderBy(c => c.Order).First()); // Page View 위로 올리기 pageView.ReflectState(); } }