mirror of
https://github.com/xpipe-io/xpipe.git
synced 2024-10-02 18:17:27 +13:00
Add support for connection colors
This commit is contained in:
parent
45e3323828
commit
993e1d5446
9 changed files with 295 additions and 51 deletions
|
@ -17,7 +17,9 @@ import io.xpipe.app.fxcomps.util.BindingsHelper;
|
||||||
import io.xpipe.app.fxcomps.util.PlatformThread;
|
import io.xpipe.app.fxcomps.util.PlatformThread;
|
||||||
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
|
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
|
||||||
import io.xpipe.app.prefs.AppPrefs;
|
import io.xpipe.app.prefs.AppPrefs;
|
||||||
|
import io.xpipe.app.storage.DataStoreColor;
|
||||||
import io.xpipe.app.update.XPipeDistributionType;
|
import io.xpipe.app.update.XPipeDistributionType;
|
||||||
|
import io.xpipe.app.util.DataStoreFormatter;
|
||||||
import io.xpipe.app.util.DesktopHelper;
|
import io.xpipe.app.util.DesktopHelper;
|
||||||
import io.xpipe.app.util.DesktopShortcuts;
|
import io.xpipe.app.util.DesktopShortcuts;
|
||||||
import io.xpipe.app.util.ThreadHelper;
|
import io.xpipe.app.util.ThreadHelper;
|
||||||
|
@ -43,13 +45,14 @@ import java.awt.*;
|
||||||
import java.awt.datatransfer.Clipboard;
|
import java.awt.datatransfer.Clipboard;
|
||||||
import java.awt.datatransfer.StringSelection;
|
import java.awt.datatransfer.StringSelection;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
public abstract class StoreEntryComp extends SimpleComp {
|
public abstract class StoreEntryComp extends SimpleComp {
|
||||||
|
|
||||||
public static StoreEntryComp create(
|
public static StoreEntryComp create(
|
||||||
StoreEntryWrapper entry, boolean showIcon, Comp<?> content, boolean preferLarge) {
|
StoreEntryWrapper entry, boolean showIcon, Comp<?> content, boolean preferLarge) {
|
||||||
if (!preferLarge) {
|
if (!preferLarge) {
|
||||||
return new DenseStoreEntryComp(entry, showIcon, content);
|
return new DenseStoreEntryComp(entry, true, content);
|
||||||
} else {
|
} else {
|
||||||
return new StandardStoreEntryComp(entry, content);
|
return new StandardStoreEntryComp(entry, content);
|
||||||
}
|
}
|
||||||
|
@ -345,12 +348,32 @@ public abstract class StoreEntryComp extends SimpleComp {
|
||||||
MenuItem m = new MenuItem(storeCategoryWrapper.getName());
|
MenuItem m = new MenuItem(storeCategoryWrapper.getName());
|
||||||
m.setOnAction(event -> {
|
m.setOnAction(event -> {
|
||||||
wrapper.moveTo(storeCategoryWrapper.getCategory());
|
wrapper.moveTo(storeCategoryWrapper.getCategory());
|
||||||
|
event.consume();
|
||||||
});
|
});
|
||||||
move.getItems().add(m);
|
move.getItems().add(m);
|
||||||
});
|
});
|
||||||
contextMenu.getItems().add(move);
|
contextMenu.getItems().add(move);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var color = new Menu(AppI18n.get("color"), new FontIcon("mdi2f-format-color-fill"));
|
||||||
|
var none = new MenuItem("None");
|
||||||
|
none.setOnAction(event -> {
|
||||||
|
wrapper.getEntry().setColor(null);
|
||||||
|
event.consume();
|
||||||
|
});
|
||||||
|
color.getItems().add(none);
|
||||||
|
Arrays.stream(DataStoreColor.values()).forEach(dataStoreColor -> {
|
||||||
|
MenuItem m = new MenuItem(DataStoreFormatter.capitalize(dataStoreColor.getId()));
|
||||||
|
m.setOnAction(event -> {
|
||||||
|
wrapper.getEntry().setColor(dataStoreColor);
|
||||||
|
event.consume();
|
||||||
|
});
|
||||||
|
color.getItems().add(m);
|
||||||
|
});
|
||||||
|
contextMenu.getItems().add(color);
|
||||||
|
}
|
||||||
|
|
||||||
var del = new MenuItem(AppI18n.get("remove"), new FontIcon("mdal-delete_outline"));
|
var del = new MenuItem(AppI18n.get("remove"), new FontIcon("mdal-delete_outline"));
|
||||||
del.disableProperty().bind(wrapper.getDeletable().not());
|
del.disableProperty().bind(wrapper.getDeletable().not());
|
||||||
del.setOnAction(event -> wrapper.delete());
|
del.setOnAction(event -> wrapper.delete());
|
||||||
|
|
|
@ -7,6 +7,7 @@ import io.xpipe.app.issue.ErrorEvent;
|
||||||
import io.xpipe.app.prefs.AppPrefs;
|
import io.xpipe.app.prefs.AppPrefs;
|
||||||
import io.xpipe.app.storage.DataStorage;
|
import io.xpipe.app.storage.DataStorage;
|
||||||
import io.xpipe.app.storage.DataStoreCategory;
|
import io.xpipe.app.storage.DataStoreCategory;
|
||||||
|
import io.xpipe.app.storage.DataStoreColor;
|
||||||
import io.xpipe.app.storage.DataStoreEntry;
|
import io.xpipe.app.storage.DataStoreEntry;
|
||||||
import io.xpipe.app.util.ThreadHelper;
|
import io.xpipe.app.util.ThreadHelper;
|
||||||
import javafx.beans.binding.Bindings;
|
import javafx.beans.binding.Bindings;
|
||||||
|
@ -37,6 +38,7 @@ public class StoreEntryWrapper {
|
||||||
private final BooleanProperty expanded = new SimpleBooleanProperty();
|
private final BooleanProperty expanded = new SimpleBooleanProperty();
|
||||||
private final Property<Object> persistentState = new SimpleObjectProperty<>();
|
private final Property<Object> persistentState = new SimpleObjectProperty<>();
|
||||||
private final MapProperty<String, Object> cache = new SimpleMapProperty<>(FXCollections.observableHashMap());
|
private final MapProperty<String, Object> cache = new SimpleMapProperty<>(FXCollections.observableHashMap());
|
||||||
|
private final Property<DataStoreColor> color = new SimpleObjectProperty<>();
|
||||||
|
|
||||||
public StoreEntryWrapper(DataStoreEntry entry) {
|
public StoreEntryWrapper(DataStoreEntry entry) {
|
||||||
this.entry = entry;
|
this.entry = entry;
|
||||||
|
@ -146,6 +148,7 @@ public class StoreEntryWrapper {
|
||||||
observing.setValue(entry.isObserving());
|
observing.setValue(entry.isObserving());
|
||||||
persistentState.setValue(entry.getStorePersistentState());
|
persistentState.setValue(entry.getStorePersistentState());
|
||||||
cache.putAll(entry.getStoreCache());
|
cache.putAll(entry.getStoreCache());
|
||||||
|
color.setValue(entry.getColor());
|
||||||
|
|
||||||
inRefresh.setValue(entry.isInRefresh());
|
inRefresh.setValue(entry.isInRefresh());
|
||||||
deletable.setValue(entry.getConfiguration().isDeletable()
|
deletable.setValue(entry.getConfiguration().isDeletable()
|
||||||
|
|
|
@ -9,16 +9,20 @@ import io.xpipe.app.fxcomps.impl.IconButtonComp;
|
||||||
import io.xpipe.app.fxcomps.impl.VerticalComp;
|
import io.xpipe.app.fxcomps.impl.VerticalComp;
|
||||||
import io.xpipe.app.fxcomps.util.BindingsHelper;
|
import io.xpipe.app.fxcomps.util.BindingsHelper;
|
||||||
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
|
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
|
||||||
|
import io.xpipe.app.storage.DataStoreColor;
|
||||||
import javafx.beans.binding.Bindings;
|
import javafx.beans.binding.Bindings;
|
||||||
import javafx.css.PseudoClass;
|
import javafx.css.PseudoClass;
|
||||||
import javafx.scene.layout.HBox;
|
import javafx.scene.layout.HBox;
|
||||||
import javafx.scene.layout.Priority;
|
import javafx.scene.layout.Priority;
|
||||||
import javafx.scene.layout.VBox;
|
import javafx.scene.layout.VBox;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class StoreSectionComp extends Comp<CompStructure<VBox>> {
|
public class StoreSectionComp extends Comp<CompStructure<VBox>> {
|
||||||
|
|
||||||
|
private static final PseudoClass ROOT = PseudoClass.getPseudoClass("root");
|
||||||
|
private static final PseudoClass SUB = PseudoClass.getPseudoClass("sub");
|
||||||
private static final PseudoClass ODD = PseudoClass.getPseudoClass("odd-depth");
|
private static final PseudoClass ODD = PseudoClass.getPseudoClass("odd-depth");
|
||||||
private static final PseudoClass EVEN = PseudoClass.getPseudoClass("even-depth");
|
private static final PseudoClass EVEN = PseudoClass.getPseudoClass("even-depth");
|
||||||
public static final PseudoClass EXPANDED = PseudoClass.getPseudoClass("expanded");
|
public static final PseudoClass EXPANDED = PseudoClass.getPseudoClass("expanded");
|
||||||
|
@ -80,6 +84,23 @@ public class StoreSectionComp extends Comp<CompStructure<VBox>> {
|
||||||
});
|
});
|
||||||
struc.get().pseudoClassStateChanged(EVEN, section.getDepth() % 2 == 0);
|
struc.get().pseudoClassStateChanged(EVEN, section.getDepth() % 2 == 0);
|
||||||
struc.get().pseudoClassStateChanged(ODD, section.getDepth() % 2 != 0);
|
struc.get().pseudoClassStateChanged(ODD, section.getDepth() % 2 != 0);
|
||||||
|
}).apply(struc -> SimpleChangeListener.apply(section.getWrapper().getColor(), val -> {
|
||||||
|
if (!topLevel) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
struc.get().getStyleClass().removeIf(s -> Arrays.stream(DataStoreColor.values())
|
||||||
|
.anyMatch(dataStoreColor -> dataStoreColor.getId().equals(s)));
|
||||||
|
struc.get().getStyleClass().remove("none");
|
||||||
|
if (val != null) {
|
||||||
|
struc.get().getStyleClass().add(val.getId());
|
||||||
|
} else {
|
||||||
|
struc.get().getStyleClass().add("none");
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
.apply(struc -> {
|
||||||
|
struc.get().pseudoClassStateChanged(ROOT, topLevel);
|
||||||
|
struc.get().pseudoClassStateChanged(SUB, !topLevel);
|
||||||
})
|
})
|
||||||
.createStructure();
|
.createStructure();
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ import javafx.scene.layout.Pane;
|
||||||
import javafx.stage.Window;
|
import javafx.stage.Window;
|
||||||
import javafx.util.Duration;
|
import javafx.util.Duration;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
@ -40,6 +41,9 @@ public class AppTheme {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Theme.ALL.forEach(theme -> stage.getScene().getRoot().getStyleClass().remove(theme.getCssId()));
|
||||||
|
stage.getScene().getRoot().getStyleClass().add(t.getCssId());
|
||||||
|
|
||||||
stage.getScene().getRoot().pseudoClassStateChanged(LIGHT, !t.isDark());
|
stage.getScene().getRoot().pseudoClassStateChanged(LIGHT, !t.isDark());
|
||||||
stage.getScene().getRoot().pseudoClassStateChanged(DARK, t.isDark());
|
stage.getScene().getRoot().pseudoClassStateChanged(DARK, t.isDark());
|
||||||
SimpleChangeListener.apply(AppPrefs.get().performanceMode(),val -> {
|
SimpleChangeListener.apply(AppPrefs.get().performanceMode(),val -> {
|
||||||
|
@ -130,8 +134,8 @@ public class AppTheme {
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
public DerivedTheme(String id, String name, atlantafx.base.theme.Theme theme) {
|
public DerivedTheme(String id, String cssId, String name, atlantafx.base.theme.Theme theme) {
|
||||||
super(id, theme);
|
super(id, cssId, theme);
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,16 +169,16 @@ public class AppTheme {
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public static class Theme implements PrefsChoiceValue {
|
public static class Theme implements PrefsChoiceValue {
|
||||||
|
|
||||||
public static final Theme PRIMER_LIGHT = new Theme("light", new PrimerLight());
|
public static final Theme PRIMER_LIGHT = new Theme("light", "primer", new PrimerLight());
|
||||||
public static final Theme PRIMER_DARK = new Theme("dark", new PrimerDark());
|
public static final Theme PRIMER_DARK = new Theme("dark", "primer", new PrimerDark());
|
||||||
public static final Theme NORD_LIGHT = new Theme("nordLight", new NordLight());
|
public static final Theme NORD_LIGHT = new Theme("nordLight", "nord", new NordLight());
|
||||||
public static final Theme NORD_DARK = new Theme("nordDark", new NordDark());
|
public static final Theme NORD_DARK = new Theme("nordDark", "nord", new NordDark());
|
||||||
public static final Theme CUPERTINO_LIGHT = new Theme("cupertinoLight", new CupertinoLight());
|
public static final Theme CUPERTINO_LIGHT = new Theme("cupertinoLight", "cupertino", new CupertinoLight());
|
||||||
public static final Theme CUPERTINO_DARK = new Theme("cupertinoDark", new CupertinoDark());
|
public static final Theme CUPERTINO_DARK = new Theme("cupertinoDark", "cupertino", new CupertinoDark());
|
||||||
public static final Theme DRACULA = new Theme("dracula", new Dracula());
|
public static final Theme DRACULA = new Theme("dracula", "dracula", new Dracula());
|
||||||
|
|
||||||
// Adjust this to create your own theme
|
// Adjust this to create your own theme
|
||||||
public static final Theme CUSTOM = new DerivedTheme("custom", "Custom", new PrimerDark());
|
public static final Theme CUSTOM = new DerivedTheme("custom", "primer", "Custom", new PrimerDark());
|
||||||
|
|
||||||
// Also include your custom theme here
|
// Also include your custom theme here
|
||||||
public static final List<Theme> ALL = List.of(PRIMER_LIGHT, PRIMER_DARK, NORD_LIGHT, NORD_DARK, CUPERTINO_LIGHT, CUPERTINO_DARK, DRACULA);
|
public static final List<Theme> ALL = List.of(PRIMER_LIGHT, PRIMER_DARK, NORD_LIGHT, NORD_DARK, CUPERTINO_LIGHT, CUPERTINO_DARK, DRACULA);
|
||||||
|
@ -196,6 +200,8 @@ public class AppTheme {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final String id;
|
protected final String id;
|
||||||
|
@Getter
|
||||||
|
protected final String cssId;
|
||||||
protected final atlantafx.base.theme.Theme theme;
|
protected final atlantafx.base.theme.Theme theme;
|
||||||
|
|
||||||
public boolean isDark() {
|
public boolean isDark() {
|
||||||
|
|
27
app/src/main/java/io/xpipe/app/storage/DataStoreColor.java
Normal file
27
app/src/main/java/io/xpipe/app/storage/DataStoreColor.java
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
package io.xpipe.app.storage;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public enum DataStoreColor {
|
||||||
|
@JsonProperty("red")
|
||||||
|
RED("red", "\uD83D\uDFE5"),
|
||||||
|
|
||||||
|
@JsonProperty("green")
|
||||||
|
GREEN("green", "\uD83D\uDFE9"),
|
||||||
|
|
||||||
|
@JsonProperty("yellow")
|
||||||
|
YELLOW("yellow", "\uD83D\uDFE8"),
|
||||||
|
|
||||||
|
@JsonProperty("blue")
|
||||||
|
BLUE("blue", "\uD83D\uDFE6");
|
||||||
|
|
||||||
|
private final String id;
|
||||||
|
private final String emoji;
|
||||||
|
|
||||||
|
DataStoreColor(String id, String emoji) {
|
||||||
|
this.id = id;
|
||||||
|
this.emoji = emoji;
|
||||||
|
}
|
||||||
|
}
|
|
@ -62,6 +62,10 @@ public class DataStoreEntry extends StorageElement {
|
||||||
|
|
||||||
@NonFinal
|
@NonFinal
|
||||||
JsonNode storePersistentStateNode;
|
JsonNode storePersistentStateNode;
|
||||||
|
|
||||||
|
@NonFinal
|
||||||
|
DataStoreColor color;
|
||||||
|
|
||||||
private DataStoreEntry(
|
private DataStoreEntry(
|
||||||
Path directory,
|
Path directory,
|
||||||
UUID uuid,
|
UUID uuid,
|
||||||
|
@ -74,7 +78,8 @@ public class DataStoreEntry extends StorageElement {
|
||||||
Validity validity,
|
Validity validity,
|
||||||
Configuration configuration,
|
Configuration configuration,
|
||||||
JsonNode storePersistentState,
|
JsonNode storePersistentState,
|
||||||
boolean expanded) {
|
boolean expanded, DataStoreColor color
|
||||||
|
) {
|
||||||
super(directory, uuid, name, lastUsed, lastModified, dirty);
|
super(directory, uuid, name, lastUsed, lastModified, dirty);
|
||||||
this.categoryUuid = categoryUuid;
|
this.categoryUuid = categoryUuid;
|
||||||
this.store = DataStorageParser.storeFromNode(storeNode);
|
this.store = DataStorageParser.storeFromNode(storeNode);
|
||||||
|
@ -82,6 +87,7 @@ public class DataStoreEntry extends StorageElement {
|
||||||
this.validity = validity;
|
this.validity = validity;
|
||||||
this.configuration = configuration;
|
this.configuration = configuration;
|
||||||
this.expanded = expanded;
|
this.expanded = expanded;
|
||||||
|
this.color = color;
|
||||||
this.provider = store != null
|
this.provider = store != null
|
||||||
? DataStoreProviders.byStoreClass(store.getClass()).orElse(null)
|
? DataStoreProviders.byStoreClass(store.getClass()).orElse(null)
|
||||||
: null;
|
: null;
|
||||||
|
@ -103,7 +109,8 @@ public class DataStoreEntry extends StorageElement {
|
||||||
store.isComplete() ? Validity.COMPLETE : Validity.INCOMPLETE,
|
store.isComplete() ? Validity.COMPLETE : Validity.INCOMPLETE,
|
||||||
Configuration.defaultConfiguration(),
|
Configuration.defaultConfiguration(),
|
||||||
null,
|
null,
|
||||||
false);
|
false, null
|
||||||
|
);
|
||||||
entry.refresh();
|
entry.refresh();
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
@ -119,7 +126,8 @@ public class DataStoreEntry extends StorageElement {
|
||||||
JsonNode storeNode,
|
JsonNode storeNode,
|
||||||
Configuration configuration,
|
Configuration configuration,
|
||||||
JsonNode storePersistentState,
|
JsonNode storePersistentState,
|
||||||
boolean expanded) {
|
boolean expanded,
|
||||||
|
DataStoreColor color) {
|
||||||
return new DataStoreEntry(
|
return new DataStoreEntry(
|
||||||
directory,
|
directory,
|
||||||
uuid,
|
uuid,
|
||||||
|
@ -132,7 +140,8 @@ public class DataStoreEntry extends StorageElement {
|
||||||
Validity.INCOMPLETE,
|
Validity.INCOMPLETE,
|
||||||
configuration,
|
configuration,
|
||||||
storePersistentState,
|
storePersistentState,
|
||||||
expanded);
|
expanded, color
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DataStoreEntry fromDirectory(Path dir) throws Exception {
|
public static DataStoreEntry fromDirectory(Path dir) throws Exception {
|
||||||
|
@ -178,6 +187,15 @@ public class DataStoreEntry extends StorageElement {
|
||||||
var expanded = Optional.ofNullable(stateJson.get("expanded"))
|
var expanded = Optional.ofNullable(stateJson.get("expanded"))
|
||||||
.map(jsonNode -> jsonNode.booleanValue())
|
.map(jsonNode -> jsonNode.booleanValue())
|
||||||
.orElse(true);
|
.orElse(true);
|
||||||
|
var color = Optional.ofNullable(stateJson.get("color"))
|
||||||
|
.map(node -> {
|
||||||
|
try {
|
||||||
|
return mapper.treeToValue(node, DataStoreColor.class);
|
||||||
|
} catch (JsonProcessingException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.orElse(null);
|
||||||
|
|
||||||
// Store loading is prone to errors.
|
// Store loading is prone to errors.
|
||||||
JsonNode storeNode = null;
|
JsonNode storeNode = null;
|
||||||
|
@ -196,7 +214,8 @@ public class DataStoreEntry extends StorageElement {
|
||||||
storeNode,
|
storeNode,
|
||||||
configuration,
|
configuration,
|
||||||
persistentState,
|
persistentState,
|
||||||
expanded);
|
expanded,
|
||||||
|
color);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setInRefresh(boolean newRefresh) {
|
public void setInRefresh(boolean newRefresh) {
|
||||||
|
@ -274,6 +293,15 @@ public class DataStoreEntry extends StorageElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setColor(DataStoreColor newColor) {
|
||||||
|
var changed = !Objects.equals(color, newColor);
|
||||||
|
this.color = newColor;
|
||||||
|
if (changed) {
|
||||||
|
dirty = true;
|
||||||
|
notifyUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isDisabled() {
|
public boolean isDisabled() {
|
||||||
return validity == Validity.LOAD_FAILED;
|
return validity == Validity.LOAD_FAILED;
|
||||||
}
|
}
|
||||||
|
@ -431,6 +459,7 @@ public class DataStoreEntry extends StorageElement {
|
||||||
obj.put("categoryUuid", categoryUuid.toString());
|
obj.put("categoryUuid", categoryUuid.toString());
|
||||||
stateObj.put("lastUsed", lastUsed.toString());
|
stateObj.put("lastUsed", lastUsed.toString());
|
||||||
stateObj.put("lastModified", lastModified.toString());
|
stateObj.put("lastModified", lastModified.toString());
|
||||||
|
stateObj.set("color", mapper.valueToTree(color));
|
||||||
stateObj.set("persistentState", storePersistentStateNode);
|
stateObj.set("persistentState", storePersistentStateNode);
|
||||||
obj.set("configuration", mapper.valueToTree(configuration));
|
obj.set("configuration", mapper.valueToTree(configuration));
|
||||||
stateObj.put("expanded", expanded);
|
stateObj.put("expanded", expanded);
|
||||||
|
|
|
@ -5,6 +5,7 @@ lf=LF (Linux)
|
||||||
none=None
|
none=None
|
||||||
common=Common
|
common=Common
|
||||||
key=Key
|
key=Key
|
||||||
|
color=Color
|
||||||
passwordManager=Password manager
|
passwordManager=Password manager
|
||||||
prompt=Prompt
|
prompt=Prompt
|
||||||
customCommand=Custom command
|
customCommand=Custom command
|
||||||
|
|
|
@ -13,6 +13,16 @@
|
||||||
-fx-spacing: 0.8em;
|
-fx-spacing: 0.8em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.root.nord .store-header-bar {
|
||||||
|
-fx-background-radius: 0;
|
||||||
|
-fx-border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root.nord .bar {
|
||||||
|
-fx-background-radius: 0;
|
||||||
|
-fx-border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.bar .filter-bar .text-field {
|
.bar .filter-bar .text-field {
|
||||||
-fx-padding: 0.35em;
|
-fx-padding: 0.35em;
|
||||||
-fx-text-fill: -color-fg-default;
|
-fx-text-fill: -color-fg-default;
|
||||||
|
@ -49,6 +59,11 @@
|
||||||
-fx-spacing: 0.2em;
|
-fx-spacing: 0.2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.root.nord .store-creation-bar, .root.nord .store-sort-bar, .root.nord .store-category-bar {
|
||||||
|
-fx-background-radius: 0;
|
||||||
|
-fx-border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.store-category-bar {
|
.store-category-bar {
|
||||||
-fx-padding: 0.8em 0.5em 0.8em 0.5em;
|
-fx-padding: 0.8em 0.5em 0.8em 0.5em;
|
||||||
-fx-background-color: -color-bg-subtle;
|
-fx-background-color: -color-bg-subtle;
|
||||||
|
|
|
@ -1,3 +1,12 @@
|
||||||
|
.store-list-comp .top {
|
||||||
|
-fx-border-width: 0 0 0.5em 0;
|
||||||
|
-fx-background-insets: 0 0 0.5em 0;
|
||||||
|
-fx-border-color: transparent;
|
||||||
|
-fx-background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Grid */
|
||||||
|
|
||||||
.store-entry-grid .date, .store-entry-grid .summary {
|
.store-entry-grid .date, .store-entry-grid .summary {
|
||||||
-fx-text-fill: -color-fg-muted;
|
-fx-text-fill: -color-fg-muted;
|
||||||
}
|
}
|
||||||
|
@ -24,6 +33,10 @@
|
||||||
-fx-background-radius: 5px;
|
-fx-background-radius: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.root.nord .store-entry-grid .icon {
|
||||||
|
-fx-background-radius: 3;
|
||||||
|
}
|
||||||
|
|
||||||
.root:pretty .store-entry-grid .icon {
|
.root:pretty .store-entry-grid .icon {
|
||||||
-fx-effect: dropshadow(three-pass-box, -color-shadow-default, 2px, 0.5, 0, 1);
|
-fx-effect: dropshadow(three-pass-box, -color-shadow-default, 2px, 0.5, 0, 1);
|
||||||
|
|
||||||
|
@ -41,34 +54,16 @@
|
||||||
-fx-padding: 1px 6px 1px 6px;
|
-fx-padding: 1px 6px 1px 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.store-list-comp .top {
|
/* Entry */
|
||||||
-fx-border-width: 0 0 0.7em 0;
|
|
||||||
-fx-background-insets: 0 0 0.7em 0;
|
|
||||||
-fx-border-color: transparent;
|
|
||||||
-fx-background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-entry-section-comp:expanded:odd-depth {
|
|
||||||
-fx-background-color: -color-bg-default;
|
|
||||||
-fx-background-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-entry-section-comp:expanded:even-depth {
|
|
||||||
-fx-background-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.root:light .store-entry-section-comp:expanded:even-depth {
|
|
||||||
-fx-background-color: derive(-color-bg-default, -3%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.root:dark .store-entry-section-comp:expanded:even-depth {
|
|
||||||
-fx-background-color: derive(-color-bg-default, 5%);
|
|
||||||
-fx-border-color: -color-border-subtle;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-entry-comp {
|
.store-entry-comp {
|
||||||
-fx-border-color: transparent;
|
-fx-border-color: transparent;
|
||||||
-fx-background-color: transparent;
|
-fx-background-color: transparent;
|
||||||
|
-fx-background-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root.nord .store-entry-comp {
|
||||||
|
-fx-background-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.store-entry-comp:hover {
|
.store-entry-comp:hover {
|
||||||
|
@ -99,6 +94,8 @@
|
||||||
-fx-padding: 6px;
|
-fx-padding: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Section */
|
||||||
|
|
||||||
.store-entry-section-comp .separator {
|
.store-entry-section-comp .separator {
|
||||||
-fx-padding: 0 0.75em 0 0.75em;
|
-fx-padding: 0 0.75em 0 0.75em;
|
||||||
-fx-border-insets: 0px;
|
-fx-border-insets: 0px;
|
||||||
|
@ -115,24 +112,146 @@
|
||||||
-fx-pref-height: 1;
|
-fx-pref-height: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.top > .store-entry-section-comp {
|
.root:pretty .top > .store-entry-section-comp {
|
||||||
-fx-background-color: -color-bg-default;
|
-fx-effect: dropshadow(three-pass-box, -color-shadow-default, 2px, 0.5, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.store-entry-section-comp {
|
||||||
|
-fx-border-radius: 4px;
|
||||||
-fx-background-radius: 4px;
|
-fx-background-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.root:pretty .top > .store-entry-section-comp {
|
.root.nord .store-entry-section-comp {
|
||||||
-fx-effect: dropshadow(three-pass-box, -color-shadow-default, 3px, 0.5, 0, 1);
|
-fx-border-radius: 0;
|
||||||
}
|
-fx-background-radius: 0;
|
||||||
|
|
||||||
.store-entry-section-comp:expanded {
|
|
||||||
-fx-border-radius: 4px;
|
|
||||||
-fx-border-width: 1px;
|
|
||||||
-fx-border-color: -color-border-default;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.store-entry-section-comp .list-box-view-comp .content {
|
.store-entry-section-comp .list-box-view-comp .content {
|
||||||
-fx-spacing: 0.2em;
|
-fx-spacing: 0.2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.store-entry-section-comp.none {
|
||||||
|
-fx-background-color: -color-bg-default;
|
||||||
|
-fx-border-color: -color-border-default;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Colors */
|
||||||
|
|
||||||
|
.root:light .top > .store-entry-section-comp.blue {
|
||||||
|
-fx-background-color: linear-gradient(from 100% 0% to 0% 100% , rgb(130, 130, 250, 0.2) 40%, rgb(57, 57, 200, 0.2) 50%, rgb(137, 137, 250, 0.2) 100%);
|
||||||
|
-fx-border-color: rgba(80, 100, 150, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:light .top > .store-entry-section-comp.blue > .separator .line {
|
||||||
|
-fx-border-color: rgba(80, 100, 150, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:dark .top > .store-entry-section-comp.blue {
|
||||||
|
-fx-background-color: linear-gradient(from 100% 0% to 0% 100% , rgb(30, 30, 80, 0.8) 40%, rgb(27, 27, 65, 0.8) 50%, rgb(37, 37, 100, 0.8) 100%);
|
||||||
|
-fx-border-color: rgba(80, 100, 150, 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:dark .top > .store-entry-section-comp.blue > .separator .line {
|
||||||
|
-fx-border-color: rgba(80, 100, 150, 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:light .top > .store-entry-section-comp.red {
|
||||||
|
-fx-background-color: linear-gradient(from 100% 0% to 0% 100% , rgb(220, 100, 100, 0.15) 40%, rgb(205, 50, 50, 0.15) 50%, rgb(200, 90, 90, 0.15) 100%);
|
||||||
|
-fx-border-color: rgba(150, 100, 80, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:light .top > .store-entry-section-comp.red > .separator .line {
|
||||||
|
-fx-border-color: rgba(150, 100, 80, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:dark .top > .store-entry-section-comp.red {
|
||||||
|
-fx-background-color: linear-gradient(from 100% 0% to 0% 100% , rgb(80, 30, 30, 0.4) 40%, rgb(65, 27, 27, 0.4) 50%, rgb(100, 37, 37, 0.4) 100%);
|
||||||
|
-fx-border-color: rgba(150, 100, 80, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:dark .top > .store-entry-section-comp.red > .separator .line {
|
||||||
|
-fx-border-color: rgba(150, 100, 80, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:light .top > .store-entry-section-comp.yellow {
|
||||||
|
-fx-background-color: linear-gradient(from 100% 0% to 0% 100% , rgb(180, 180, 30, 0.2) 40%, rgb(135, 135, 27, 0.2) 50%, rgb(200, 200, 37, 0.2) 100%);
|
||||||
|
-fx-border-color: rgba(170, 170, 80, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:light .top > .store-entry-section-comp.yellow > .separator .line {
|
||||||
|
-fx-border-color: rgba(170, 170, 80, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:dark .top > .store-entry-section-comp.yellow {
|
||||||
|
-fx-background-color: linear-gradient(from 100% 0% to 0% 100% , rgb(80, 80, 30, 0.4) 40%, rgb(65, 65, 27, 0.4) 50%, rgb(100, 100, 37, 0.4) 100%);
|
||||||
|
-fx-border-color: rgba(150, 150, 80, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:dark .top > .store-entry-section-comp.yellow > .separator .line {
|
||||||
|
-fx-border-color: rgba(170, 170, 80, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:light .top > .store-entry-section-comp.green {
|
||||||
|
-fx-background-color: linear-gradient(from 100% 0% to 0% 100% , rgb(30, 180, 30, 0.1) 40%, rgb(20, 120, 20, 0.15) 50%, rgb(37, 200, 37, 0.1) 100%);
|
||||||
|
-fx-border-color: rgba(100, 150, 80, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:light .top > .store-entry-section-comp.green > .separator .line {
|
||||||
|
-fx-border-color: rgba(100, 150, 80, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:dark .top > .store-entry-section-comp.green {
|
||||||
|
-fx-background-color: linear-gradient(from 100% 0% to 0% 100% , rgb(30, 80, 30, 0.3) 40%, rgb(20, 60, 20, 0.3) 50%, rgb(37, 100, 37, 0.3) 100%);
|
||||||
|
-fx-border-color: rgba(100, 190, 80, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:dark .top > .store-entry-section-comp.green > .separator .line {
|
||||||
|
-fx-border-color: rgba(100, 190, 80, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Light sub backgrounds */
|
||||||
|
|
||||||
|
.root:light .store-entry-section-comp:sub:expanded {
|
||||||
|
-fx-border-color: #9999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:light .store-entry-section-comp.none .store-entry-section-comp:expanded:even-depth {
|
||||||
|
-fx-background-color: derive(-color-bg-default, -3%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:light .store-entry-section-comp.none .store-entry-section-comp:expanded:odd-depth {
|
||||||
|
-fx-background-color: -color-bg-default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:light .store-entry-section-comp:sub:expanded:even-depth {
|
||||||
|
-fx-background-color: #ddd5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:light .store-entry-section-comp:sub:expanded:odd-depth {
|
||||||
|
-fx-background-color: #aaa3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dark sub backgrounds */
|
||||||
|
|
||||||
|
.root:dark .store-entry-section-comp:sub:expanded {
|
||||||
|
-fx-border-color: #4449;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:dark .store-entry-section-comp.none .store-entry-section-comp:expanded:even-depth {
|
||||||
|
-fx-background-color: derive(-color-bg-default, 5%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:dark .store-entry-section-comp.none .store-entry-section-comp:expanded:odd-depth {
|
||||||
|
-fx-background-color: -color-bg-default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:dark .store-entry-section-comp:sub:expanded:even-depth {
|
||||||
|
-fx-background-color: #1114;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root:dark .store-entry-section-comp:sub:expanded:odd-depth {
|
||||||
|
-fx-background-color: #2224;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue