Tabs sync fixes

This commit is contained in:
crschnick
2024-11-25 14:03:09 +00:00
parent 315d411c1b
commit dc9b40acda
4 changed files with 73 additions and 46 deletions
@@ -12,6 +12,9 @@ import javafx.collections.ObservableList;
import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
@Getter
public class BrowserAbstractSessionModel<T extends BrowserSessionTab> {
@@ -43,4 +46,10 @@ public class BrowserAbstractSessionModel<T extends BrowserSessionTab> {
this.sessionEntries.remove(e);
}
}
public List<T> getSessionEntriesSnapshot() {
synchronized (this) {
return new ArrayList<>(sessionEntries);
}
}
}
@@ -25,6 +25,7 @@ import javafx.collections.ListChangeListener;
import javafx.collections.ObservableMap;
import lombok.Getter;
import lombok.SneakyThrows;
import java.util.*;
@@ -34,7 +35,12 @@ public class BrowserFullSessionModel extends BrowserAbstractSessionModel<Browser
public static final BrowserFullSessionModel DEFAULT = new BrowserFullSessionModel();
static {
DEFAULT.getSessionEntries().add(new BrowserHistoryTabModel(DEFAULT));
init();
}
@SneakyThrows
private static void init() {
DEFAULT.openSync(new BrowserHistoryTabModel(DEFAULT), null);
if (AppPrefs.get().pinLocalMachineOnStartup().get()) {
var tab = new BrowserFileSystemTabModel(
DEFAULT, DataStorage.get().local().ref(), BrowserFileSystemTabModel.SelectionMode.ALL);
@@ -77,38 +77,17 @@ public class BrowserSessionTabsComp extends SimpleComp {
Styles.toggleStyleClass(tabs, TabPane.STYLE_CLASS_FLOATING);
toggleStyleClass(tabs, DENSE);
tabs.skinProperty().subscribe(newValue -> {
if (newValue != null) {
Platform.runLater(() -> {
tabs.setClip(null);
tabs.setPickOnBounds(false);
tabs.lookupAll(".tab-header-area").forEach(node -> {
node.setClip(null);
node.setPickOnBounds(false);
setupCustomStyle(tabs);
// Sync to guarantee that no external changes are made during this
synchronized (model) {
setupTabEntries(tabs);
}
setupKeyEvents(tabs);
var r = (Region) node;
r.prefHeightProperty().bind(r.maxHeightProperty());
r.setMinHeight(Region.USE_PREF_SIZE);
});
tabs.lookupAll(".headers-region").forEach(node -> {
node.setClip(null);
node.setPickOnBounds(false);
var r = (Region) node;
r.prefHeightProperty().bind(r.maxHeightProperty());
r.setMinHeight(Region.USE_PREF_SIZE);
});
Region headerArea = (Region) tabs.lookup(".tab-header-area");
headerArea
.paddingProperty()
.bind(Bindings.createObjectBinding(
() -> new Insets(2, 0, 4, -leftPadding.get() + 2), leftPadding));
headerHeight.bind(headerArea.heightProperty());
});
}
});
return tabs;
}
private void setupTabEntries(TabPane tabs) {
var map = new HashMap<BrowserSessionTab, Tab>();
// Restore state
@@ -117,9 +96,7 @@ public class BrowserSessionTabsComp extends SimpleComp {
map.put(v, t);
tabs.getTabs().add(t);
});
tabs.getSelectionModel()
.select(model.getSessionEntries()
.indexOf(model.getSelectedEntry().getValue()));
tabs.getSelectionModel().select(model.getSessionEntries().indexOf(model.getSelectedEntry().getValue()));
// Used for ignoring changes by the tabpane when new tabs are added. We want to perform the selections manually!
var addingTab = new SimpleBooleanProperty();
@@ -135,9 +112,9 @@ public class BrowserSessionTabsComp extends SimpleComp {
return;
}
var source = map.entrySet().stream()
.filter(openFileSystemModelTabEntry ->
openFileSystemModelTabEntry.getValue().equals(newValue))
var source = map.entrySet()
.stream()
.filter(openFileSystemModelTabEntry -> openFileSystemModelTabEntry.getValue().equals(newValue))
.findAny()
.map(Map.Entry::getKey)
.orElse(null);
@@ -152,9 +129,9 @@ public class BrowserSessionTabsComp extends SimpleComp {
return;
}
var toSelect = map.entrySet().stream()
.filter(openFileSystemModelTabEntry ->
openFileSystemModelTabEntry.getKey().equals(newValue))
var toSelect = map.entrySet()
.stream()
.filter(openFileSystemModelTabEntry -> openFileSystemModelTabEntry.getKey().equals(newValue))
.findAny()
.map(Map.Entry::getValue)
.orElse(null);
@@ -194,9 +171,9 @@ public class BrowserSessionTabsComp extends SimpleComp {
tabs.getTabs().addListener((ListChangeListener<? super Tab>) c -> {
while (c.next()) {
for (var r : c.getRemoved()) {
var source = map.entrySet().stream()
.filter(openFileSystemModelTabEntry ->
openFileSystemModelTabEntry.getValue().equals(r))
var source = map.entrySet()
.stream()
.filter(openFileSystemModelTabEntry -> openFileSystemModelTabEntry.getValue().equals(r))
.findAny()
.orElse(null);
@@ -209,7 +186,43 @@ public class BrowserSessionTabsComp extends SimpleComp {
}
}
});
}
private void setupCustomStyle(TabPane tabs) {
tabs.skinProperty().subscribe(newValue -> {
if (newValue != null) {
Platform.runLater(() -> {
tabs.setClip(null);
tabs.setPickOnBounds(false);
tabs.lookupAll(".tab-header-area").forEach(node -> {
node.setClip(null);
node.setPickOnBounds(false);
var r = (Region) node;
r.prefHeightProperty().bind(r.maxHeightProperty());
r.setMinHeight(Region.USE_PREF_SIZE);
});
tabs.lookupAll(".headers-region").forEach(node -> {
node.setClip(null);
node.setPickOnBounds(false);
var r = (Region) node;
r.prefHeightProperty().bind(r.maxHeightProperty());
r.setMinHeight(Region.USE_PREF_SIZE);
});
Region headerArea = (Region) tabs.lookup(".tab-header-area");
headerArea
.paddingProperty()
.bind(Bindings.createObjectBinding(
() -> new Insets(2, 0, 4, -leftPadding.get() + 2), leftPadding));
headerHeight.bind(headerArea.heightProperty());
});
}
});
}
private static void setupKeyEvents(TabPane tabs) {
tabs.addEventHandler(KeyEvent.KEY_PRESSED, keyEvent -> {
var current = tabs.getSelectionModel().getSelectedItem();
if (current == null) {
@@ -255,8 +268,6 @@ public class BrowserSessionTabsComp extends SimpleComp {
keyEvent.consume();
}
});
return tabs;
}
private ContextMenu createContextMenu(TabPane tabs, Tab tab, BrowserSessionTab tabModel) {
+2 -1
View File
@@ -447,7 +447,8 @@ copyPassword=copyPassword
lockVaultOnHibernation=Tresor im Ruhezustand des Computers sperren
lockVaultOnHibernationDescription=Wenn diese Funktion aktiviert ist, wird der Tresor automatisch gesperrt, sobald dein Computer in den Ruhezustand versetzt wird. Nach dem Aufwachen musst du deine Tresor-Passphrase erneut eingeben.
overview=Übersicht
history=Geschichte
#custom
history=Verlauf
skipAll=Alles überspringen
notes=Anmerkungen
addNotes=Notizen hinzufügen