Skip to content

Commit 70feac5

Browse files
committed
Improve multi-window support in DevTools
1 parent aa4df9c commit 70feac5

3 files changed

Lines changed: 51 additions & 4 deletions

File tree

shellfx-devtools/src/main/java/com/techsenger/shellfx/devtools/DevToolsTabDockFxView.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,14 @@
4343
import com.techsenger.shellfx.material.icon.FontIconView;
4444
import com.techsenger.shellfx.material.style.Spacing;
4545
import com.techsenger.shellfx.material.style.StyleClasses;
46+
import javafx.geometry.Side;
4647
import javafx.scene.control.Button;
48+
import javafx.scene.control.ContextMenu;
49+
import javafx.scene.control.MenuItem;
4750
import javafx.scene.control.ToggleButton;
4851
import javafx.scene.control.Tooltip;
52+
import javafx.stage.Stage;
53+
import javafx.stage.Window;
4954

5055
/**
5156
*
@@ -191,6 +196,23 @@ protected void addHandlers() {
191196
super.addHandlers();
192197
selectButton.setOnAction(e -> getPresenter().onSelect());
193198
selectionButton.setOnAction(e -> getPresenter().onSelection(selectionButton.isSelected()));
199+
optionsButton.setOnAction(e -> {
200+
var menu = createOptionsMenu();
201+
menu.show(optionsButton, Side.BOTTOM, 0, 0);
202+
});
203+
}
204+
205+
protected ContextMenu createOptionsMenu() {
206+
var menu = new ContextMenu();
207+
for (var window : Window.getWindows()) {
208+
if (window instanceof Stage stage) {
209+
var uid = stage.hashCode();
210+
var item = new MenuItem(stage.getTitle() + " (uid: " + uid + ")");
211+
item.setOnAction(e -> getPresenter().onWindowSelected(uid));
212+
menu.getItems().add(item);
213+
}
214+
}
215+
return menu;
194216
}
195217

196218
@Override

shellfx-devtools/src/main/java/com/techsenger/shellfx/devtools/DevToolsTabDockPresenter.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public DevToolsTabDockPresenter(V view, DevToolsTabDockParams params) {
5353
this.settings = params.getSettings();
5454
this.historyManager = params.getHistoryManager();
5555
themeSubscription = settings.getAppearance().onThemeChanged((oldV, newV) -> updateHighlight(newV));
56-
this.selector = new Selector(view.getConnector());
56+
this.selector = new Selector(view.getConnector(), getDescriptor().getLogPrefix());
5757
}
5858

5959
public boolean isSelectionSelected() {
@@ -127,6 +127,10 @@ protected void onSelection(boolean selected) {
127127
this.selector.setSelectionVisible(selected);
128128
}
129129

130+
protected void onWindowSelected(int uid) {
131+
this.selector.selectWindow(uid);
132+
}
133+
130134
@Override
131135
protected void postInitialize() {
132136
super.postInitialize();

shellfx-devtools/src/main/java/com/techsenger/shellfx/devtools/Selector.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@
1818

1919
import com.techsenger.connectorfx.Connector;
2020
import com.techsenger.connectorfx.HighlightOptions;
21+
import com.techsenger.connectorfx.LocalElement;
2122
import com.techsenger.connectorfx.event.NodeSelectedEvent;
2223
import com.techsenger.connectorfx.scenegraph.Element;
2324
import java.util.ArrayList;
2425
import java.util.List;
2526
import java.util.Objects;
27+
import org.slf4j.Logger;
28+
import org.slf4j.LoggerFactory;
2629

2730
/**
2831
* This is the single point to control the selected node.
@@ -31,13 +34,17 @@
3134
*/
3235
public class Selector {
3336

37+
private static final Logger logger = LoggerFactory.getLogger(Selector.class);
38+
3439
@FunctionalInterface
3540
public interface SelectorListener {
3641
void onSelected(int oldWindowUid, int newWindowUid, Element oldElement, Element newElement);
3742
}
3843

3944
private final Connector connector;
4045

46+
private final String logPrefix;
47+
4148
private final List<SelectorListener> listeners = new ArrayList<>();
4249

4350
private HighlightOptions highlightOptions = new HighlightOptions(false, false, false);
@@ -48,8 +55,9 @@ public interface SelectorListener {
4855

4956
private Element selectedNode;
5057

51-
Selector(Connector connector) {
58+
Selector(Connector connector, String logPrefix) {
5259
this.connector = connector;
60+
this.logPrefix = logPrefix;
5361
// this event is fired only when a node is selected in inspector mode (using select button)
5462
connector.getEventBus().subscribe(NodeSelectedEvent.class, (e) -> {
5563
// When inspect mode is set to false the selection is removed because for selection
@@ -92,6 +100,7 @@ public Element getSelectedNode() {
92100

93101
void setSelectedWindowUid(Integer selectedWindowUid) {
94102
this.selectedWindowUid = selectedWindowUid;
103+
logger.debug("{} Selected window UID: {}", logPrefix, this.selectedWindowUid);
95104
}
96105

97106
void setSelectionVisible(boolean selectionVisible) {
@@ -124,13 +133,25 @@ private void updateSelectedElements(Integer newWindowUid, Element newNode) {
124133
if (!Objects.equals(this.selectedWindowUid, newWindowUid) || !Objects.equals(this.selectedNode, newNode)) {
125134
var oldWindowUid = this.selectedWindowUid;
126135
var oldNode = this.selectedNode;
127-
this.selectedWindowUid = newWindowUid;
128-
this.selectedNode = newNode;
136+
setSelectedWindowUid(newWindowUid);
137+
setSelectedNode(newNode);
129138
notifyListeners(oldWindowUid, newWindowUid, oldNode, newNode);
130139
}
131140
}
132141

133142
private void notifyListeners(int oldWindowUid, int newWindowUid, Element oldElement, Element newElement) {
134143
this.listeners.stream().forEach(l -> l.onSelected(oldWindowUid, newWindowUid, oldElement, newElement));
135144
}
145+
146+
public void setSelectedNode(Element selectedNode) {
147+
this.selectedNode = selectedNode;
148+
if (logger.isDebugEnabled()) {
149+
if (this.selectedNode != null && this.selectedNode.isNodeElement()) {
150+
logger.debug("{} Selected node: {} from window with UID: {}", logPrefix, this.selectedNode,
151+
((LocalElement) this.selectedNode).unwrap().getScene().getWindow().hashCode());
152+
} else {
153+
logger.debug("{} Selected node: {}", logPrefix, this.selectedNode);
154+
}
155+
}
156+
}
136157
}

0 commit comments

Comments
 (0)