Skip to content

Commit 76dfd6b

Browse files
committed
Begin priority system for listener registration
1 parent 84a939c commit 76dfd6b

File tree

5 files changed

+57
-8
lines changed

5 files changed

+57
-8
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package software.coley.recaf.behavior;
2+
3+
import jakarta.annotation.Nonnull;
4+
import software.coley.collections.Lists;
5+
6+
import java.util.List;
7+
8+
/**
9+
* Priority sortable item.
10+
*
11+
* @author Matt Coley
12+
*/
13+
public interface PrioritySortable extends Comparable<PrioritySortable> {
14+
/**
15+
* @return This item's priority value.
16+
*/
17+
default int getPriority() {
18+
return 0;
19+
}
20+
21+
@Override
22+
default int compareTo(@Nonnull PrioritySortable o) {
23+
return Integer.compare(getPriority(), o.getPriority());
24+
}
25+
26+
/**
27+
* Add a sortable item to a sortable list.
28+
*
29+
* @param items
30+
* List to add to.
31+
* @param item
32+
* Item to add.
33+
* @param <T>
34+
* Child priority-sortable type.
35+
*
36+
* @return {@code true} on add. {@code false} on failure <i>(Insertion index cannot be computed)</i>,
37+
*/
38+
static <T extends PrioritySortable> boolean add(@Nonnull List<T> items, @Nonnull T item) {
39+
return Lists.sortedInsert(PrioritySortable::compareTo, items, item);
40+
}
41+
}

recaf-core/src/main/java/software/coley/recaf/services/workspace/BasicWorkspaceManager.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
import jakarta.enterprise.inject.Produces;
77
import jakarta.inject.Inject;
88
import org.slf4j.Logger;
9+
import software.coley.collections.Lists;
910
import software.coley.collections.Unchecked;
1011
import software.coley.recaf.analytics.logging.Logging;
12+
import software.coley.recaf.behavior.PrioritySortable;
1113
import software.coley.recaf.workspace.model.EmptyWorkspace;
1214
import software.coley.recaf.workspace.model.Workspace;
1315
import software.coley.recaf.workspace.model.WorkspaceModificationListener;
1416
import software.coley.recaf.workspace.model.resource.WorkspaceResource;
1517

18+
import java.util.Comparator;
1619
import java.util.List;
1720
import java.util.concurrent.CopyOnWriteArrayList;
1821

@@ -91,7 +94,7 @@ public List<WorkspaceOpenListener> getWorkspaceOpenListeners() {
9194

9295
@Override
9396
public void addWorkspaceOpenListener(@Nonnull WorkspaceOpenListener listener) {
94-
openListeners.add(listener);
97+
PrioritySortable.add(openListeners, listener);
9598
}
9699

97100
@Override
@@ -107,7 +110,7 @@ public List<WorkspaceCloseListener> getWorkspaceCloseListeners() {
107110

108111
@Override
109112
public void addWorkspaceCloseListener(@Nonnull WorkspaceCloseListener listener) {
110-
closeListeners.add(listener);
113+
PrioritySortable.add(closeListeners, listener);
111114
}
112115

113116
@Override

recaf-core/src/main/java/software/coley/recaf/services/workspace/WorkspaceCloseListener.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package software.coley.recaf.services.workspace;
22

33
import jakarta.annotation.Nonnull;
4+
import software.coley.recaf.behavior.PrioritySortable;
45
import software.coley.recaf.workspace.model.Workspace;
56

67
/**
78
* Listener for when old workspaces are closed.
89
*
910
* @author Matt Coley
1011
*/
11-
public interface WorkspaceCloseListener {
12+
public interface WorkspaceCloseListener extends PrioritySortable {
1213
/**
1314
* Called when {@link WorkspaceManager#setCurrent(Workspace)} passes and a prior workspace is removed.
1415
*

recaf-core/src/main/java/software/coley/recaf/services/workspace/WorkspaceOpenListener.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package software.coley.recaf.services.workspace;
22

33
import jakarta.annotation.Nonnull;
4+
import software.coley.recaf.behavior.PrioritySortable;
45
import software.coley.recaf.workspace.model.Workspace;
56

67
/**
78
* Listener for when new workspaces are opened.
89
*
910
* @author Matt Coley
1011
*/
11-
public interface WorkspaceOpenListener {
12+
public interface WorkspaceOpenListener extends PrioritySortable {
1213
/**
1314
* Called when {@link WorkspaceManager#setCurrent(Workspace)} passes.
1415
*

recaf-ui/src/main/java/software/coley/recaf/ui/docking/DockingManager.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -394,14 +394,17 @@ public void onWorkspaceOpened(@Nonnull Workspace workspace) {
394394
@Override
395395
public void onWorkspaceClosed(@Nonnull Workspace workspace) {
396396
// When a workspace is closed, show the welcome screen.
397-
// TODO: Combining 'DockingManager' and 'DockingLayoutManager' made this fire earlier which
398-
// happens before 'NavigationManager' does. The nav manager closes this if we open it immediately.
399-
// - Need to have an order of operation system...
400-
FxThreadUtil.delayedRun(25, () -> {
397+
FxThreadUtil.run(() -> {
401398
if (!bento.search().replaceContainer(ID_CONTAINER_ROOT_TOP, DockingManager.this::newWelcomeContainer))
402399
logger.error("Failed replacing root on workspace close");
403400
});
404401
}
402+
403+
@Override
404+
public int getPriority() {
405+
// TODO: Arbitrary number to ensure this happens later than other close listeners
406+
return 100;
407+
}
405408
}
406409

407410
/**

0 commit comments

Comments
 (0)