diff --git a/IDE/src/BookmarkManager.bf b/IDE/src/BookmarkManager.bf index 1e3c3649..c4d71d42 100644 --- a/IDE/src/BookmarkManager.bf +++ b/IDE/src/BookmarkManager.bf @@ -86,12 +86,12 @@ namespace IDE for (var bookmark in mBookmarkList) bookmark.mIsDisabled = value; - gApp.mBookmarksPanel.mBookmarksDirty = true; + gApp.mBookmarkManager.mBookmarksChangedDelegate(); } } /// Adds the given bookmark to this folder. If needed, removes it from its old folder. - public void AddBookmark(Bookmark bookmark) + internal void AddBookmark(Bookmark bookmark) { if (bookmark.mFolder != null) { @@ -99,8 +99,6 @@ namespace IDE } mBookmarkList.Add(bookmark); bookmark.mFolder = this; - - //gApp.mBookmarksPanel.mBookmarksDirty = true; } } @@ -109,6 +107,8 @@ namespace IDE public BookmarkFolder mRootFolder = new .(); public List mBookmarkFolders = new .() {mRootFolder} ~ DeleteContainerAndItems!(_); + public Event mBookmarksChangedDelegate ~ _.Dispose(); + private int mBookmarkCount; /// Index of the folder that was navigated to last @@ -141,7 +141,7 @@ namespace IDE folder.IsDisabled = value; } - gApp.mBookmarksPanel.mBookmarksDirty = true; + mBookmarksChangedDelegate(); } } @@ -163,7 +163,7 @@ namespace IDE mBookmarkFolders.Add(folder); - gApp.mBookmarksPanel.mBookmarksDirty = true; + mBookmarksChangedDelegate(); return folder; } @@ -187,7 +187,7 @@ namespace IDE if (mBookmarkIdx >= mBookmarkFolders[mFolderIdx].mBookmarkList.Count) mBookmarkIdx = (int32)mBookmarkFolders[mFolderIdx].mBookmarkList.Count - 1; - gApp.mBookmarksPanel.mBookmarksDirty = true; + mBookmarksChangedDelegate(); } public Bookmark CreateBookmark(String fileName, int wantLineNum, int wantColumn, bool isDisabled = false, String title = null, BookmarkFolder folder = null) @@ -212,11 +212,11 @@ namespace IDE bookmark.mIsDisabled = isDisabled; - folder.AddBookmark(bookmark); + folder.[Friend]AddBookmark(bookmark); gApp.mDebugger.mBreakpointsChangedDelegate(); - gApp.mBookmarksPanel.mBookmarksDirty = true; + mBookmarksChangedDelegate(); mBookmarkCount++; @@ -250,7 +250,7 @@ namespace IDE FixupIndices(); - gApp.mBookmarksPanel.mBookmarksDirty = true; + mBookmarksChangedDelegate(); } enum Placement @@ -283,7 +283,7 @@ namespace IDE FixupIndices(); - gApp.mBookmarksPanel.mBookmarksDirty = true; + mBookmarksChangedDelegate(); } /// Make sure that the bookmark and folder indices are valid. @@ -310,7 +310,7 @@ namespace IDE gApp.mDebugger.mBreakpointsChangedDelegate(); bookmark.Kill(); - gApp.mBookmarksPanel.mBookmarksDirty = true; + mBookmarksChangedDelegate(); mBookmarkCount--; } @@ -332,7 +332,7 @@ namespace IDE mBookmarkIdx = 0; gApp.mDebugger.mBreakpointsChangedDelegate(); - gApp.mBookmarksPanel.mBookmarksDirty = true; + mBookmarksChangedDelegate(); } public void PrevBookmark(bool currentFolderOnly = false) diff --git a/IDE/src/ui/BookmarksPanel.bf b/IDE/src/ui/BookmarksPanel.bf index bb5190cf..50d961d2 100644 --- a/IDE/src/ui/BookmarksPanel.bf +++ b/IDE/src/ui/BookmarksPanel.bf @@ -136,6 +136,8 @@ namespace IDE.ui mBookmarksListView.mOnKeyDown.Add(new => BookmarksLV_OnKeyDown); AddWidget(mBookmarksListView); + + gApp.mBookmarkManager.mBookmarksChangedDelegate.Add(new => BookmarksChanged); } private void BookmarksLV_OnKeyDown(KeyDownEvent event) @@ -384,7 +386,13 @@ namespace IDE.ui mBookmarksListView.Resize(0, buttonHeight, width, Math.Max(mHeight - buttonHeight, 0)); } - public bool mBookmarksDirty; + private bool mBookmarksDirty; + + /// Marks the bookmarks list view as dirty so that it will be rebuild in the next update. + private void BookmarksChanged() + { + mBookmarksDirty = true; + } public override void Update() { @@ -400,27 +408,44 @@ namespace IDE.ui base.Update(); } + /// Clears the Panel (does NOT clear the actual bookmarks). public void Clear() { - var root = mBookmarksListView.GetRoot(); - - root.Clear(); + mBookmarksListView.GetRoot().Clear(); mBookmarksDirty = true; } + /// Shows a tooltip with the given text for the specified widget if the widget is hovered. private void ShowTooltip(Widget widget, String text) { - Point mousePoint; - if (DarkTooltipManager.CheckMouseover(widget, 20, out mousePoint)) + if (DarkTooltipManager.CheckMouseover(widget, 20, let mousePoint)) { DarkTooltipManager.ShowTooltip(text, widget, mousePoint.x, mousePoint.y); } } + /// Rebuilds the list view. private void UpdateBookmarks() { - var root = mBookmarksListView.GetRoot(); + var root = (BookmarksListViewItem)mBookmarksListView.GetRoot(); + + var openFolders = scope List(); + + if (root.mChildItems != null) + { + // Find all open Folders so that we can open them again after rebuilding the list view + for (var child in root.mChildItems) + { + if (!child.IsOpen) + continue; + + if (var bookmarkFolder = ((BookmarksListViewItem)child).RefObject as BookmarkFolder) + { + openFolders.Add(bookmarkFolder); + } + } + } root.Clear(); @@ -432,9 +457,7 @@ namespace IDE.ui if (!isRoot) { - FolderItem = (BookmarksListViewItem)root.CreateChildItem(); - - SetupListViewItemFolder(FolderItem, folder); + FolderItem = AddFolderToListView(root, folder); } else { @@ -443,19 +466,31 @@ namespace IDE.ui for (Bookmark bookmark in folder.mBookmarkList) { - var listViewItem = (BookmarksListViewItem)(FolderItem.CreateChildItem()); - SetupListViewItem(listViewItem, bookmark); + AddBookmarkToListView(FolderItem, bookmark); + } + + if (!isRoot) + { + // Open folder if it was open before recreating the list view. + int idx = openFolders.IndexOf(folder); + if (idx >= 0) + { + openFolders.RemoveAtFast(idx); + FolderItem.Open(true, true); + } } } mBookmarksDirty = false; } - private void SetupListViewItemFolder(BookmarksListViewItem listViewItem, BookmarkFolder folder) + /// Creates a new ListViewItem for the given folder. + private BookmarksListViewItem AddFolderToListView(BookmarksListViewItem parent, BookmarkFolder folder) { - listViewItem.AllowDragging = true; - + var listViewItem = (BookmarksListViewItem)parent.CreateChildItem(); + listViewItem.RefObject = folder; + listViewItem.AllowDragging = true; var subViewItem = (DarkListViewItem)listViewItem.GetOrCreateSubItem(0); @@ -470,13 +505,17 @@ namespace IDE.ui subViewItem.Label = folder.mTitle; subViewItem.Resize(GS!(22), 0, 0, 0); + + return listViewItem; } - private void SetupListViewItem(BookmarksListViewItem listViewItem, Bookmark bookmark) + /// Creates a new ListViewItem for the given bookmark. + private BookmarksListViewItem AddBookmarkToListView(BookmarksListViewItem parent, Bookmark bookmark) { - listViewItem.AllowDragging = true; - + var listViewItem = (BookmarksListViewItem)(parent.CreateChildItem()); + listViewItem.RefObject = bookmark; + listViewItem.AllowDragging = true; var subViewItem = (DarkListViewItem)listViewItem.GetOrCreateSubItem(0); @@ -500,6 +539,8 @@ namespace IDE.ui subViewItem = (DarkListViewItem)listViewItem.GetOrCreateSubItem(2); subViewItem.Label = listViewItem.BookmarkLine; + + return listViewItem; } public override void KeyDown(KeyCode keyCode, bool isRepeat)