mirror of
https://github.com/xpipe-io/xpipe.git
synced 2026-09-26 02:15:47 +00:00
Rework
This commit is contained in:
@@ -15,6 +15,7 @@ import javafx.scene.image.ImageView;
|
||||
import javafx.scene.layout.Region;
|
||||
import javafx.scene.layout.StackPane;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class PrettyImageComp extends SimpleRegionBuilder {
|
||||
@@ -113,8 +114,12 @@ public class PrettyImageComp extends SimpleRegionBuilder {
|
||||
|
||||
value.subscribe(update);
|
||||
if (AppPrefs.get() != null) {
|
||||
var ref = new WeakReference<>(update);
|
||||
AppPrefs.get().theme().addListener((observable, oldValue, newValue) -> {
|
||||
update.accept(value.getValue());
|
||||
var v = ref.get();
|
||||
if (v != null) {
|
||||
v.accept(value.getValue());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -58,13 +58,18 @@ public class SideMenuBarComp extends RegionBuilder<VBox> {
|
||||
value.setValue(e);
|
||||
}
|
||||
});
|
||||
b.describe(d -> d.name(e.name()));
|
||||
|
||||
var stack = createStyle(e, b);
|
||||
var shortcut = e.combination();
|
||||
if (shortcut != null) {
|
||||
stack.apply(struc -> struc.getProperties().put("shortcut", shortcut));
|
||||
}
|
||||
b.describe(d -> {
|
||||
d.name(e.name());
|
||||
if (shortcut != null) {
|
||||
d.shortcut(shortcut);
|
||||
}
|
||||
});
|
||||
vbox.getChildren().add(stack.build());
|
||||
}
|
||||
|
||||
|
||||
@@ -118,7 +118,7 @@ public class AppMainWindow {
|
||||
AppWindowStyle.addStylesheets(stage.getScene());
|
||||
AppWindowStyle.addClickShield(stage);
|
||||
AppWindowStyle.addMaximizedPseudoClass(stage);
|
||||
AppWindowStyle.addFontSize(stage);
|
||||
AppWindowStyle.addFontSize(scene);
|
||||
AppTheme.initThemeHandlers(stage);
|
||||
|
||||
AppWindowTitle.getTitle().subscribe(s -> {
|
||||
|
||||
@@ -39,7 +39,7 @@ public class AppSideWindow {
|
||||
event.consume();
|
||||
});
|
||||
AppWindowBounds.fixInvalidStagePosition(s);
|
||||
AppWindowStyle.addFontSize(s);
|
||||
AppWindowStyle.addFontSize(s.getScene());
|
||||
a.getDialogPane().getScene().addEventHandler(KeyEvent.KEY_PRESSED, event -> {
|
||||
if (new KeyCodeCombination(KeyCode.W, KeyCombination.SHORTCUT_DOWN).match(event)) {
|
||||
s.close();
|
||||
|
||||
@@ -27,8 +27,8 @@ public class AppWindowStyle {
|
||||
});
|
||||
}
|
||||
|
||||
public static void addFontSize(Stage stage) {
|
||||
stage.getScene().rootProperty().subscribe(root -> {
|
||||
public static void addFontSize(Scene scene) {
|
||||
scene.rootProperty().subscribe(root -> {
|
||||
AppFontSizes.base(root);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -47,7 +47,8 @@ public abstract class ProcessControlProvider {
|
||||
public abstract ShellStore subShellEnvironment(DataStoreEntryRef<ShellStore> s, ShellDialect dialect);
|
||||
|
||||
public abstract RemoteDesktopDockContentEntry createVncSession(
|
||||
DataStoreEntryRef<VncBaseStore> ref
|
||||
DataStoreEntryRef<VncBaseStore> ref,
|
||||
Runnable onKill
|
||||
);
|
||||
|
||||
public abstract DataStoreEntryRef<ShellStore> elevated(DataStoreEntryRef<ShellStore> e);
|
||||
|
||||
@@ -23,15 +23,21 @@ import javafx.stage.Window;
|
||||
public class AskpassAlert {
|
||||
|
||||
public static SecretQueryResult queryRaw(String prompt, InPlaceSecretValue secretValue, boolean stealFocus) {
|
||||
prompt = prompt.strip();
|
||||
if (prompt.endsWith(":") || prompt.endsWith("?")) {
|
||||
prompt = prompt.substring(0, prompt.length() - 1);
|
||||
}
|
||||
|
||||
var prop = new SimpleObjectProperty<>(secretValue);
|
||||
var finalPrompt = prompt;
|
||||
var r = AppSideWindow.showBlockingAlert(alert -> {
|
||||
alert.initModality(Modality.NONE);
|
||||
alert.setTitle(AppI18n.get("askpassAlertTitle"));
|
||||
alert.setHeaderText(prompt);
|
||||
alert.setHeaderText(finalPrompt);
|
||||
alert.setAlertType(Alert.AlertType.CONFIRMATION);
|
||||
|
||||
// Link to help page for double prompt
|
||||
if (SecretManager.disableCachingForPrompt(prompt)) {
|
||||
if (SecretManager.disableCachingForPrompt(finalPrompt)) {
|
||||
var type = new ButtonType("Help", ButtonBar.ButtonData.HELP);
|
||||
alert.getButtonTypes().add(type);
|
||||
var button = alert.getDialogPane().lookupButton(type);
|
||||
|
||||
@@ -81,15 +81,20 @@ public class RemoteDesktopDockComp extends SimpleRegionBuilder {
|
||||
|
||||
private void fillToolbar(Region content, ToolBar bar, List<? extends RemoteDesktopDockEntry> list) {
|
||||
var w = RemoteDesktopWindow.get();
|
||||
bar.getItems().forEach(node -> node.getProperties().clear());
|
||||
bar.getItems().clear();
|
||||
for (var entry : list) {
|
||||
var entryRef = new WeakReference<>(entry);
|
||||
var graphic = PrettyImageHelper.ofFixedSizeSquare(entry.getIcon(), 16).style("graphic").build();
|
||||
|
||||
var label = new LabelComp(entry.getName()).build();
|
||||
label.setGraphic(graphic);
|
||||
|
||||
var close = new IconButtonComp("mdi2c-close", () -> {
|
||||
w.close(entry);
|
||||
var v = entryRef.get();
|
||||
if (v != null) {
|
||||
w.close(v);
|
||||
}
|
||||
}).style("close-button")
|
||||
.describe(d -> d.nameKey("close")).build();
|
||||
AppFontSizes.sm(close);
|
||||
@@ -108,7 +113,10 @@ public class RemoteDesktopDockComp extends SimpleRegionBuilder {
|
||||
b.getStyleClass().add("tab-button");
|
||||
b.getProperties().put("entry", entry);
|
||||
b.setOnAction(event -> {
|
||||
w.select(entry);
|
||||
var v = entryRef.get();
|
||||
if (v != null) {
|
||||
w.select(v);
|
||||
}
|
||||
event.consume();
|
||||
});
|
||||
bar.getItems().add(b);
|
||||
|
||||
@@ -6,6 +6,10 @@ import lombok.Getter;
|
||||
@Getter
|
||||
public abstract class RemoteDesktopDockContentEntry {
|
||||
|
||||
private final Runnable onKill;
|
||||
|
||||
protected RemoteDesktopDockContentEntry(Runnable onKill) {this.onKill = onKill;}
|
||||
|
||||
public abstract BaseRegionBuilder<?, ?> comp();
|
||||
|
||||
public abstract void init() throws Exception;
|
||||
|
||||
@@ -115,7 +115,8 @@ public class RemoteDesktopWindow {
|
||||
AppWindowStyle.addStylesheets(stage.getScene());
|
||||
AppWindowStyle.addClickShield(stage);
|
||||
AppWindowStyle.addMaximizedPseudoClass(stage);
|
||||
AppWindowStyle.addFontSize(stage);
|
||||
AppWindowStyle.addFontSize(scene);
|
||||
AppWindowStyle.addNavigationPseudoClasses(scene);
|
||||
AppTheme.initThemeHandlers(stage);
|
||||
|
||||
setupWindowListeners();
|
||||
@@ -179,9 +180,10 @@ public class RemoteDesktopWindow {
|
||||
model.closeWindow(entry);
|
||||
}
|
||||
|
||||
public void trackInternal(String name, String icon, DataStoreColor color, DataStoreEntry e, RemoteDesktopDockContentEntry entry) {
|
||||
public RemoteDesktopDockEntry trackInternal(String name, String icon, DataStoreColor color, DataStoreEntry e, RemoteDesktopDockContentEntry entry) {
|
||||
var toTrack = new RemoteDesktopDockEntry(name, icon, color, e, null, entry, null, null);
|
||||
model.track(toTrack);
|
||||
return toTrack;
|
||||
}
|
||||
|
||||
public void trackExternal(String name, String icon, DataStoreColor color, DataStoreEntry e, int w, int h, Process process, Duration maxWait, Predicate<ControllableWindowProcess> filter) {
|
||||
|
||||
@@ -8,11 +8,14 @@ import io.xpipe.app.storage.DataStorage;
|
||||
import io.xpipe.app.util.DocumentationLink;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonTypeName;
|
||||
import io.xpipe.app.util.RemoteDesktopDockEntry;
|
||||
import io.xpipe.app.util.RemoteDesktopWindow;
|
||||
import javafx.beans.property.ReadOnlyBooleanWrapper;
|
||||
import lombok.Builder;
|
||||
import lombok.extern.jackson.Jacksonized;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
@Builder
|
||||
@Jacksonized
|
||||
@JsonTypeName("integratedXPipeVncClient")
|
||||
@@ -22,12 +25,16 @@ public class InternalVncClient implements ExternalVncClient {
|
||||
public void launch(VncLaunchConfig configuration) throws Exception {
|
||||
var w = RemoteDesktopWindow.get();
|
||||
w.show();
|
||||
var session = ProcessControlProvider.get().createVncSession(configuration.getEntry());
|
||||
w.trackInternal(DataStorage.get().getStoreEntryDisplayName(configuration.getEntry().get()),
|
||||
var ref = new AtomicReference<RemoteDesktopDockEntry>();
|
||||
var session = ProcessControlProvider.get().createVncSession(configuration.getEntry(), () -> {
|
||||
w.close(ref.get());
|
||||
});
|
||||
ref.set(w.trackInternal(
|
||||
DataStorage.get().getStoreEntryDisplayName(configuration.getEntry().get()),
|
||||
configuration.getEntry().get().getEffectiveIconFile(),
|
||||
DataStorage.get().getEffectiveColor(configuration.getEntry().get()),
|
||||
configuration.getEntry().get(),
|
||||
session);
|
||||
session));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user