private async void ClassifyTree_Drop(object sender, DragEventArgs e) { ClassifyTree.AllowDrop = false; if (e.Data.GetDataPresent("classify")) { var from = e.Data.GetData("classify") as string; var to = "/"; var iscopy = (e.AllowedEffects & DragDropEffects.Copy) != 0 && Keyboard.IsKeyDown(Key.LeftCtrl); lock (drop_lock) if (drop_checker == true) { return; } if (!iscopy && (from == to || from.Count(x => x == '/') == 1)) { var dialog = new BookmarkMessageOk($"같은 분류 또는 하위 분류로는 {(iscopy ? "복사할" : "옮길")} 수 없어요!"); await DialogHost.Show(dialog, "BookmarkDialog"); return; } await classify_move(from, to, iscopy); } }
private async void Button_ClickAsync(object sender, RoutedEventArgs e) { var tag = (sender as Button).Tag.ToString(); switch (tag) { case "Import": case "Export": break; case "Dangling": { var classes = new HashSet<string>(); foreach (var rc in BookmarkModelManager.Instance.Model.root_classes) classes.Add(rc); foreach (var sc in BookmarkModelManager.Instance.Model.sub_classes) classes.Add($"{sc.Item1}/{sc.Item2}"); var dangling_articles = new List<Tuple<string, BookmarkItemModel>>(); var dangling_artists = new List<Tuple<string, BookmarkItemModel>>(); var dangling_groups = new List<Tuple<string, BookmarkItemModel>>(); var dangling_etcs = new List<Tuple<string, BookmarkEtcItemModel>>(); foreach (var elem in BookmarkModelManager.Instance.Model.articles) if (!classes.Contains(elem.Item1)) dangling_articles.Add(elem); foreach (var elem in BookmarkModelManager.Instance.Model.artists) if (!classes.Contains(elem.Item1)) dangling_artists.Add(elem); foreach (var elem in BookmarkModelManager.Instance.Model.groups) if (!classes.Contains(elem.Item1)) dangling_groups.Add(elem); foreach (var elem in BookmarkModelManager.Instance.Model.etcs) if (!classes.Contains(elem.Item1)) dangling_etcs.Add(elem); var total_cnt = dangling_articles.Count + dangling_artists.Count + dangling_etcs.Count + dangling_groups.Count; if (total_cnt > 0) { var builder = new StringBuilder(); builder.Append($"총 {total_cnt}개의 떠돌이 항목이 검색됨\r\n\r\n"); if (dangling_articles.Count > 0) { builder.Append($"작품 떠돌이 항목 {dangling_articles.Count}개\r\n"); foreach (var item in dangling_articles) builder.Append($"{item.Item1} - {item.Item2.content} {item.Item2.etc} {item.Item2.stamp}\r\n"); builder.Append("\r\n"); } if (dangling_artists.Count > 0) { builder.Append($"작가 떠돌이 항목 {dangling_artists.Count}개\r\n"); foreach (var item in dangling_artists) builder.Append($"{item.Item1} - {item.Item2.content} {item.Item2.etc} {item.Item2.stamp}\r\n"); builder.Append("\r\n"); } if (dangling_groups.Count > 0) { builder.Append($"그룹 떠돌이 항목 {dangling_groups.Count}개\r\n"); foreach (var item in dangling_groups) builder.Append($"{item.Item1} - {item.Item2.content} {item.Item2.etc} {item.Item2.stamp}\r\n"); builder.Append("\r\n"); } if (dangling_etcs.Count > 0) { builder.Append($"기타 떠돌이 항목 {dangling_etcs.Count}개\r\n"); foreach (var item in dangling_etcs) builder.Append($"{item.Item1} - {item.Item2.content} {item.Item2.etc} {item.Item2.stamp}\r\n"); builder.Append("\r\n"); } var dialog = new BookmarkToolDangling(builder.ToString()); if ((bool)(await DialogHost.Show(dialog, "ToolDialog"))) { var n_classes = new HashSet<string>(); foreach (var ic in dangling_articles) { n_classes.Add(ic.Item1); BookmarkModelManager.Instance.Model.articles.Remove(ic); BookmarkModelManager.Instance.Model.articles.Add(new Tuple<string, BookmarkItemModel>("/떠돌이 항목" + ic.Item1, ic.Item2)); } foreach (var ic in dangling_artists) { n_classes.Add(ic.Item1); BookmarkModelManager.Instance.Model.artists.Remove(ic); BookmarkModelManager.Instance.Model.artists.Add(new Tuple<string, BookmarkItemModel>("/떠돌이 항목" + ic.Item1, ic.Item2)); } foreach (var ic in dangling_groups) { n_classes.Add(ic.Item1); BookmarkModelManager.Instance.Model.groups.Remove(ic); BookmarkModelManager.Instance.Model.groups.Add(new Tuple<string, BookmarkItemModel>("/떠돌이 항목" + ic.Item1, ic.Item2)); } foreach (var ic in dangling_etcs) { n_classes.Add(ic.Item1); BookmarkModelManager.Instance.Model.etcs.Remove(ic); BookmarkModelManager.Instance.Model.etcs.Add(new Tuple<string, BookmarkEtcItemModel>("/떠돌이 항목" + ic.Item1, ic.Item2)); } var used = new HashSet<string>(); var sub_classes = new List<Tuple<string, string>>(); foreach (var cc in n_classes) { var nname = "/떠돌이 항목" + cc; if (classes.Contains(nname)) continue; var ss = nname.Split('/'); var root = "/" + ss[1]; var parent = root; for (int i = 2; i < ss.Length; i++) { if (!used.Contains(parent + "/" + ss[i])) { used.Add(parent + "/" + ss[i]); sub_classes.Add(new Tuple<string, string>(parent, ss[i])); } parent += "/" + ss[i]; } } if (!BookmarkModelManager.Instance.Model.root_classes.Contains("/떠돌이 항목")) BookmarkModelManager.Instance.Model.root_classes.Add("/떠돌이 항목"); BookmarkModelManager.Instance.Model.sub_classes.AddRange(sub_classes); BookmarkModelManager.Instance.Save(); } } else { var dialog = new BookmarkMessageOk("떠돌이 항목이 없습니다!"); await DialogHost.Show(dialog, "ToolDialog"); } } break; } }
private async Task classify_move(string from, string to, bool copy) { var name = from.Split('/').Last(); var from_parent = from.Remove(from.Length - name.Length); var warning = false; var not_valid = false; if (to == "/") { foreach (var ss in BookmarkModelManager.Instance.Model.root_classes) { if (ss == "/" + name) { warning = true; } } } else { foreach (var ss in BookmarkModelManager.Instance.Model.sub_classes) { if (ss.Item1 == to && ss.Item2 == name) { warning = true; } } } if (from.Remove(from.Length - from.Split('/').Last().Length - 1) == to) { not_valid = true; } if (warning || not_valid) { if (!not_valid) { var dialog_error = new BookmarkMessage($"경고! {to}에 이미 {name}이 존재하기 때문에 {(copy ? "복사할" : "옮길")} 수 없어요!\r\n그래도 모든 경고를 무시하고 {(copy ? "복사를" : "이동을")} 진행할까요?\r\n하위 항목들은 자동으로 합쳐져요."); if (!(bool)(await DialogHost.Show(dialog_error, "BookmarkDialog"))) { return; } } else { var dialog_error = new BookmarkMessageOk($"부모로 바로 연결되는 상위 분류로는 {(copy ? "복사할" : "옮길")} 수 없어요!"); await DialogHost.Show(dialog_error, "BookmarkDialog"); return; } } if (to == "/") { to = ""; } var dialog = new BookmarkMessage($"{name}을 {from_parent}에서 {to + "/"}로 {(copy ? "복사할" : "옮길")}까요?"); if ((bool)(await DialogHost.Show(dialog, "BookmarkDialog"))) { if (copy) { copyto(from, to); } else { moveto(from, to); } BookmarkModelManager.Instance.Save(); init(); } }
private async void Tvi_DropAsync(object sender, DragEventArgs e) { // Drop 이벤트에선 Bubbling이 일어나기 때문에 e.Handled를 true로 조작하거나 // lock을 사용하여 처리해줄 필요가 있음 // 단, lock을 사용할경우 unlock처리 지연을 위한 루틴이 하나이상 있어야함 ClassifyTree.AllowDrop = false; var iscopy = (e.AllowedEffects & DragDropEffects.Copy) != 0 && Keyboard.IsKeyDown(Key.LeftCtrl); if (e.Data.GetDataPresent("registries")) { var tt = e.Data.GetData("registries") as Tuple <string, List <BookmarkPageDataGridItemViewModel> >; lock (drop_lock) if (drop_checker == true) { var tvi = sender as TreeViewItem; tvi.Foreground = Brushes.Black; return; } lock (drop_lock) drop_checker = true; var message = $"{tt.Item2.Count}개 항목을 {tt.Item1}에서 {(sender as TreeViewItem).Tag}로 {(iscopy ? "복사할" : "옮길")}까요?"; var dialog = new BookmarkMessage(message); if ((bool)(await DialogHost.Show(dialog, "BookmarkDialog"))) { if (iscopy == false) { // 기존항목들 삭제 foreach (var ll in tt.Item2) { List <Tuple <string, BookmarkItemModel> > rl; if (ll.형 == "작가") { rl = BookmarkModelManager.Instance.Model.artists; } else if (ll.형 == "그룹") { rl = BookmarkModelManager.Instance.Model.groups; } else { rl = BookmarkModelManager.Instance.Model.articles; } for (int i = 0; i < rl.Count; i++) { if (rl[i].Item1 == tt.Item1 && rl[i].Item2.Equals(ll.BIM)) { rl.RemoveAt(i); break; } } } } // 추가 foreach (var ll in tt.Item2) { List <Tuple <string, BookmarkItemModel> > rl; if (ll.형 == "작가") { rl = BookmarkModelManager.Instance.Model.artists; } else if (ll.형 == "그룹") { rl = BookmarkModelManager.Instance.Model.groups; } else { rl = BookmarkModelManager.Instance.Model.articles; } rl.Add(new Tuple <string, BookmarkItemModel>((sender as TreeViewItem).Tag.ToString(), ll.BIM)); } BookmarkModelManager.Instance.Save(); refresh(); } } else if (e.Data.GetDataPresent("classify")) { var from = e.Data.GetData("classify") as string; var to = (sender as TreeViewItem).Tag as string; lock (drop_lock) if (drop_checker == true) { var tvi = sender as TreeViewItem; tvi.Foreground = Brushes.Black; return; } lock (drop_lock) drop_checker = true; if (from == to || (to.StartsWith(from) && !iscopy)) { var dialog = new BookmarkMessageOk($"같은 분류 또는 하위 분류로는 {(iscopy ? "복사할" : "옮길")} 수 없어요!"); await DialogHost.Show(dialog, "BookmarkDialog"); goto END; } await classify_move(from, to, iscopy); } END: lock (drop_lock) drop_checker = false; var tvi2 = sender as TreeViewItem; tvi2.Foreground = Brushes.Black; }