mirror of
https://github.com/sirjonasxx/G-Earth.git
synced 2024-11-23 17:00:52 +01:00
Cleanups, added kotlin support, started with auto login support
This commit is contained in:
parent
ea5227cd3a
commit
fe16f85d82
@ -1,9 +1,12 @@
|
||||
import org.gradle.internal.os.OperatingSystem
|
||||
|
||||
plugins {
|
||||
kotlin("jvm") version "1.6.10"
|
||||
kotlin("plugin.serialization") version "1.6.10"
|
||||
id("org.beryx.runtime") version "1.12.5"
|
||||
id("org.openjfx.javafxplugin") version "0.0.11"
|
||||
`java-library`
|
||||
`maven-publish`
|
||||
}
|
||||
|
||||
description = "G-Earth"
|
||||
@ -32,6 +35,7 @@ dependencies {
|
||||
implementation("org.json:json:20190722")
|
||||
implementation("org.jsoup:jsoup:1.14.2")
|
||||
implementation("org.slf4j:slf4j-jdk14:2.0.0-alpha0")
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.3")
|
||||
}
|
||||
|
||||
java {
|
||||
@ -56,7 +60,16 @@ application {
|
||||
mainClass.set("gearth.GEarthLauncher")
|
||||
applicationName = "G-Earth"
|
||||
}
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
create<MavenPublication>("maven") {
|
||||
groupId = "dorving"
|
||||
artifactId = "gearth"
|
||||
version = "1.5.3"
|
||||
from(components["java"])
|
||||
}
|
||||
}
|
||||
}
|
||||
runtime {
|
||||
addModules(
|
||||
"java.datatransfer", "java.desktop", "java.prefs",
|
||||
|
@ -2,15 +2,12 @@ package gearth.extensions;
|
||||
|
||||
import gearth.misc.HostInfo;
|
||||
import gearth.misc.listenerpattern.Observable;
|
||||
import gearth.protocol.HMessage;
|
||||
import gearth.protocol.HPacket;
|
||||
import gearth.services.packet_info.PacketInfoManager;
|
||||
import javafx.application.HostServices;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.InvalidationListener;
|
||||
import javafx.stage.Stage;
|
||||
import gearth.protocol.HMessage;
|
||||
import gearth.protocol.HPacket;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Created by Jonas on 22/09/18.
|
||||
|
@ -1,8 +1,10 @@
|
||||
package gearth.services.extension_handler.extensions;
|
||||
|
||||
import gearth.extensions.InternalExtensionBuilder;
|
||||
import gearth.misc.HostInfo;
|
||||
import gearth.misc.listenerpattern.Observable;
|
||||
import gearth.misc.listenerpattern.SynchronizedObservable;
|
||||
import gearth.services.extension_handler.extensions.implementations.network.NetworkExtension;
|
||||
import gearth.services.packet_info.PacketInfoManager;
|
||||
import gearth.protocol.HMessage;
|
||||
import gearth.protocol.HPacket;
|
||||
@ -11,6 +13,13 @@ import gearth.services.extension_handler.extensions.listeners.OmRemoveClickListe
|
||||
import gearth.services.extension_handler.extensions.listeners.OnClickListener;
|
||||
import gearth.services.extension_handler.extensions.listeners.OnDeleteListener;
|
||||
|
||||
/**
|
||||
* Represents a type of extension created with one of the extension APIs.
|
||||
*
|
||||
* @see NetworkExtension extensions connecting to G-Earth from a different process.
|
||||
* @see InternalExtensionBuilder internal extensions (JAR files) that follow
|
||||
* the same communication protocol as {@link NetworkExtension network extensions}.
|
||||
*/
|
||||
public abstract class GEarthExtension {
|
||||
|
||||
|
||||
|
@ -76,13 +76,15 @@ public class NetworkExtension extends GEarthExtension {
|
||||
byte side = message.readByte();
|
||||
int byteLength = message.readInteger();
|
||||
byte[] packetAsByteArray = message.readBytes(byteLength);
|
||||
|
||||
HPacket packet = new HPacket(packetAsByteArray);
|
||||
if (!packet.isCorrupted()) {
|
||||
log("Forwarding incoming packet (packet="+packet+")");
|
||||
sendMessage(
|
||||
side == 0 ? HMessage.Direction.TOCLIENT : HMessage.Direction.TOSERVER,
|
||||
packet
|
||||
);
|
||||
} else {
|
||||
log("Received corrupted packet (packet="+packet+")");
|
||||
}
|
||||
}
|
||||
else if (message.headerId() == NetworkExtensionInfo.INCOMING_MESSAGES_IDS.MANIPULATEDPACKET) {
|
||||
|
@ -1,5 +1,7 @@
|
||||
package gearth.services.extension_handler.extensions.implementations.network;
|
||||
|
||||
import gearth.Configuration;
|
||||
import gearth.ConfigurationKt;
|
||||
import gearth.protocol.HPacket;
|
||||
import gearth.services.extension_handler.extensions.extensionproducers.ExtensionProducer;
|
||||
import gearth.services.extension_handler.extensions.extensionproducers.ExtensionProducerObserver;
|
||||
@ -31,6 +33,7 @@ public class NetworkExtensionsProducer implements ExtensionProducer {
|
||||
port++;
|
||||
}
|
||||
|
||||
final Configuration configuration = ConfigurationKt.configuration(port);
|
||||
|
||||
new Thread(() -> {
|
||||
try {
|
||||
|
@ -3,7 +3,6 @@ package gearth.services.internal_extensions.extensionstore;
|
||||
import gearth.extensions.ExtensionForm;
|
||||
import gearth.extensions.ExtensionInfo;
|
||||
import gearth.services.internal_extensions.extensionstore.application.GExtensionStoreController;
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.queriedoverviews.ByDateOverview;
|
||||
import gearth.services.internal_extensions.extensionstore.repository.StoreFetch;
|
||||
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
|
||||
import javafx.application.HostServices;
|
||||
@ -16,7 +15,7 @@ import javafx.application.HostServices;
|
||||
)
|
||||
public class GExtensionStore extends ExtensionForm {
|
||||
|
||||
public static final int PAGESIZE = 20;
|
||||
public static final int MAX_PAGES = 20;
|
||||
|
||||
private StoreRepository repository = null;
|
||||
private GExtensionStoreController extensionStoreController = null;
|
||||
|
@ -5,7 +5,6 @@ import gearth.services.internal_extensions.extensionstore.application.entities.C
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.HOverview;
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.categories.CategoryOverview;
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.installed.InstalledOverview;
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.queriedoverviews.ByDateOverview;
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.queriedoverviews.ByRatingOverview;
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.queriedoverviews.ByUpdateOverview;
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.search.SearchOverview;
|
||||
@ -55,10 +54,10 @@ public class GExtensionStoreController implements Initializable {
|
||||
Element seach_link = webView.getEngine().getDocument().getElementById("search_page");
|
||||
|
||||
Map<Element, Supplier<HOverview>> hOverviewSupplier = new HashMap<>();
|
||||
hOverviewSupplier.put(by_update_link, () -> new ByUpdateOverview(null, 0, GExtensionStore.PAGESIZE, getStoreRepository()));
|
||||
hOverviewSupplier.put(by_rating_link, () -> new ByRatingOverview(null, 0, GExtensionStore.PAGESIZE, getStoreRepository()));
|
||||
hOverviewSupplier.put(by_category_link, () -> new CategoryOverview(null, 0, GExtensionStore.PAGESIZE, getStoreRepository()));
|
||||
hOverviewSupplier.put(installed_link, () -> new InstalledOverview(null, 0, GExtensionStore.PAGESIZE, getStoreRepository()));
|
||||
hOverviewSupplier.put(by_update_link, () -> new ByUpdateOverview(null, 0, GExtensionStore.MAX_PAGES, getStoreRepository()));
|
||||
hOverviewSupplier.put(by_rating_link, () -> new ByRatingOverview(null, 0, GExtensionStore.MAX_PAGES, getStoreRepository()));
|
||||
hOverviewSupplier.put(by_category_link, () -> new CategoryOverview(null, 0, GExtensionStore.MAX_PAGES, getStoreRepository()));
|
||||
hOverviewSupplier.put(installed_link, () -> new InstalledOverview(null, 0, GExtensionStore.MAX_PAGES, getStoreRepository()));
|
||||
hOverviewSupplier.put(seach_link, () -> new SearchOverview(null, getStoreRepository()));
|
||||
|
||||
Arrays.asList(by_update_link, by_rating_link, by_category_link, installed_link, seach_link).forEach(l ->
|
||||
@ -74,18 +73,18 @@ public class GExtensionStoreController implements Initializable {
|
||||
|
||||
Map<Element, Supplier<Integer>> newStartIndex = new HashMap<>();
|
||||
newStartIndex.put(first_btn, () -> 0);
|
||||
newStartIndex.put(prev_btn, () -> getCurrentOverview().getStartIndex() - GExtensionStore.PAGESIZE);
|
||||
newStartIndex.put(next_btn, () -> getCurrentOverview().getStartIndex() + GExtensionStore.PAGESIZE);
|
||||
newStartIndex.put(prev_btn, () -> getCurrentOverview().getStartIndex() - GExtensionStore.MAX_PAGES);
|
||||
newStartIndex.put(next_btn, () -> getCurrentOverview().getStartIndex() + GExtensionStore.MAX_PAGES);
|
||||
newStartIndex.put(last_btn, () -> {
|
||||
int lastPageSize = getCurrentOverview().getMaxAmount() % GExtensionStore.PAGESIZE;
|
||||
if (lastPageSize == 0) lastPageSize = GExtensionStore.PAGESIZE;
|
||||
int lastPageSize = getCurrentOverview().getMaxAmount() % GExtensionStore.MAX_PAGES;
|
||||
if (lastPageSize == 0) lastPageSize = GExtensionStore.MAX_PAGES;
|
||||
return getCurrentOverview().getMaxAmount() - lastPageSize;
|
||||
});
|
||||
|
||||
Arrays.asList(first_btn, prev_btn, next_btn, last_btn).forEach(l ->
|
||||
((EventTarget) l).addEventListener("click", event ->{
|
||||
if (!initialized || l.getAttribute("class").contains("gdisabled")) return;
|
||||
overwriteCurrentOverview(getCurrentOverview().getNewPage(newStartIndex.get(l).get(), GExtensionStore.PAGESIZE));
|
||||
overwriteCurrentOverview(getCurrentOverview().getNewPage(newStartIndex.get(l).get(), GExtensionStore.MAX_PAGES));
|
||||
}, true));
|
||||
|
||||
|
||||
@ -164,7 +163,7 @@ public class GExtensionStoreController implements Initializable {
|
||||
WebUtils.removeClass(last_btn, "gdisabled");
|
||||
|
||||
boolean isLast = overview.getMaxAmount() <= overview.getAmount() + overview.getStartIndex();
|
||||
boolean isFirst = overview.getStartIndex() < GExtensionStore.PAGESIZE;
|
||||
boolean isFirst = overview.getStartIndex() < GExtensionStore.MAX_PAGES;
|
||||
if (isLast) {
|
||||
WebUtils.addClass(next_btn, "gdisabled");
|
||||
WebUtils.addClass(last_btn, "gdisabled");
|
||||
@ -173,8 +172,8 @@ public class GExtensionStoreController implements Initializable {
|
||||
WebUtils.addClass(first_btn, "gdisabled");
|
||||
WebUtils.addClass(prev_btn, "gdisabled");
|
||||
}
|
||||
int thispage = Math.max(1, 1 + (overview.getStartIndex() / GExtensionStore.PAGESIZE));
|
||||
int lastpage = Math.max(1, 1 + ((overview.getMaxAmount() - 1) / GExtensionStore.PAGESIZE));
|
||||
int thispage = Math.max(1, 1 + (overview.getStartIndex() / GExtensionStore.MAX_PAGES));
|
||||
int lastpage = Math.max(1, 1 + ((overview.getMaxAmount() - 1) / GExtensionStore.MAX_PAGES));
|
||||
webView.getEngine().executeScript("document.getElementById('paging_lbl').innerHTML = '" + thispage + " / " + lastpage + "';");
|
||||
|
||||
|
||||
@ -211,7 +210,7 @@ public class GExtensionStoreController implements Initializable {
|
||||
|
||||
private void onFullInitialize() {
|
||||
initialized = true;
|
||||
setRootOverview(new ByUpdateOverview(null, 0, GExtensionStore.PAGESIZE, getStoreRepository()));
|
||||
setRootOverview(new ByUpdateOverview(null, 0, GExtensionStore.MAX_PAGES, getStoreRepository()));
|
||||
}
|
||||
|
||||
public void gExtensionStore(GExtensionStore gExtensionStore) {
|
||||
|
@ -1,12 +1,9 @@
|
||||
package gearth.services.internal_extensions.extensionstore.application.entities;
|
||||
|
||||
import gearth.protocol.HMessage;
|
||||
import gearth.protocol.HPacket;
|
||||
import gearth.services.internal_extensions.extensionstore.GExtensionStore;
|
||||
import gearth.services.internal_extensions.extensionstore.application.GExtensionStoreController;
|
||||
import gearth.services.internal_extensions.extensionstore.application.WebUtils;
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.extensiondetails.StoreExtensionDetailsOverview;
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.queriedoverviews.CategorizedOverview;
|
||||
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
|
||||
import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension;
|
||||
import netscape.javascript.JSObject;
|
||||
@ -25,7 +22,7 @@ public class StoreExtensionItem implements ContentItem {
|
||||
new StoreExtensionDetailsOverview(
|
||||
gExtensionStore.getController().getCurrentOverview(),
|
||||
0,
|
||||
GExtensionStore.PAGESIZE,
|
||||
GExtensionStore.MAX_PAGES,
|
||||
storeExtension,
|
||||
gExtensionStore.getRepository()
|
||||
)
|
||||
|
@ -10,7 +10,6 @@ import gearth.services.internal_extensions.extensionstore.repository.models.ExtC
|
||||
import gearth.services.internal_extensions.extensionstore.repository.querying.ExtensionOrdering;
|
||||
import netscape.javascript.JSObject;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
|
||||
public class CategoryItem implements ContentItem {
|
||||
@ -27,7 +26,7 @@ public class CategoryItem implements ContentItem {
|
||||
new CategorizedOverview(
|
||||
gExtensionStore.getController().getCurrentOverview(),
|
||||
0,
|
||||
GExtensionStore.PAGESIZE,
|
||||
GExtensionStore.MAX_PAGES,
|
||||
gExtensionStore.getRepository(),
|
||||
category
|
||||
)
|
||||
|
@ -33,7 +33,9 @@ public abstract class QueriedExtensionOverview extends HOverview {
|
||||
|
||||
@Override
|
||||
public List<? extends ContentItem> getContentItems() {
|
||||
return query(startIndex, limit).stream().map(StoreExtensionItem::new).collect(Collectors.toList());
|
||||
final List<StoreExtension> extensions = query(startIndex, limit);
|
||||
System.out.println("found "+extensions.size()+" extensions");
|
||||
return extensions.stream().map(StoreExtensionItem::new).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -3,7 +3,6 @@ package gearth.services.internal_extensions.extensionstore.application.entities.
|
||||
import gearth.services.internal_extensions.extensionstore.GExtensionStore;
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.ContentItem;
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.HOverview;
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.extensiondetails.StoreExtensionDetailsOverview;
|
||||
import gearth.services.internal_extensions.extensionstore.application.entities.queriedoverviews.SearchedQueryOverview;
|
||||
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
|
||||
|
||||
@ -51,7 +50,7 @@ public class SearchOverview extends HOverview {
|
||||
new SearchedQueryOverview(
|
||||
gExtensionStore.getController().getCurrentOverview(),
|
||||
0,
|
||||
GExtensionStore.PAGESIZE,
|
||||
GExtensionStore.MAX_PAGES,
|
||||
storeRepository,
|
||||
searchComponent.getSearchKeyword(),
|
||||
searchComponent.getOrdering(),
|
||||
|
@ -43,7 +43,14 @@ public class StoreRepository {
|
||||
|
||||
String queryLower = queryString.toLowerCase();
|
||||
|
||||
Stream<StoreExtension> stream = getExtensions().stream()
|
||||
final List<StoreExtension> extensions = getExtensions();
|
||||
for (StoreExtension extension : extensions) {
|
||||
System.out.println(extension.getTitle());
|
||||
for (String system : extension.getCompatibility().getSystems()) {
|
||||
System.out.println(system);
|
||||
}
|
||||
}
|
||||
Stream<StoreExtension> stream = extensions.stream()
|
||||
.filter(ext -> ext.getTitle().toLowerCase().contains(queryLower) || ext.getDescription().toLowerCase().contains(queryLower)
|
||||
|| ext.getAuthors().stream().anyMatch(author -> author.getName().toLowerCase().contains(queryLower)
|
||||
|| author.getUsername() != null && author.getUsername().toLowerCase().contains(queryLower))
|
||||
|
@ -1,12 +1,14 @@
|
||||
package gearth.ui.subforms.connection;
|
||||
|
||||
import gearth.GEarth;
|
||||
import gearth.PropertiesKt;
|
||||
import gearth.misc.Cacher;
|
||||
import gearth.protocol.connection.HClient;
|
||||
import gearth.protocol.connection.HState;
|
||||
import gearth.protocol.connection.proxy.ProxyProviderFactory;
|
||||
import gearth.services.Constants;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.scene.control.*;
|
||||
import gearth.protocol.HConnection;
|
||||
@ -36,6 +38,10 @@ public class ConnectionController extends SubForm {
|
||||
public TextField txtfield_hotelversion;
|
||||
|
||||
private final Object lock = new Object();
|
||||
public TextField outEmail;
|
||||
public TextField outPassword;
|
||||
public Button loginButton;
|
||||
|
||||
private volatile int fullyInitialized = 0;
|
||||
|
||||
|
||||
@ -158,6 +164,13 @@ public class ConnectionController extends SubForm {
|
||||
inpPort.setDisable(getHConnection().getState() != HState.NOT_CONNECTED || cbx_autodetect.isSelected());
|
||||
|
||||
cbx_autodetect.setDisable(!useFlash());
|
||||
if (useFlash()) {
|
||||
final BooleanProperty autoConnectProperty = PropertiesKt.getAutoConnectSelected();
|
||||
cbx_autodetect.selectedProperty().bindBidirectional(autoConnectProperty);
|
||||
if (autoConnectProperty.get())
|
||||
btnConnect_clicked(null);
|
||||
}
|
||||
|
||||
outHost.setDisable(!useFlash());
|
||||
outPort.setDisable(!useFlash());
|
||||
|
||||
|
25
G-Earth/src/main/kotlin/gearth/Configuration.kt
Normal file
25
G-Earth/src/main/kotlin/gearth/Configuration.kt
Normal file
@ -0,0 +1,25 @@
|
||||
package gearth
|
||||
|
||||
import kotlinx.serialization.ExperimentalSerializationApi
|
||||
import kotlinx.serialization.encodeToString
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.json.decodeFromStream
|
||||
import java.io.File
|
||||
|
||||
@kotlinx.serialization.Serializable
|
||||
data class Configuration(val port: Int, val email: String, val password: String)
|
||||
|
||||
private val json = Json {
|
||||
prettyPrint = true
|
||||
}
|
||||
|
||||
@ExperimentalSerializationApi
|
||||
val configurations by lazy {
|
||||
val file = File("configurations.json")
|
||||
if (file.exists()) {
|
||||
json.decodeFromStream<Array<Configuration>>(file.inputStream())
|
||||
} else
|
||||
emptyArray()
|
||||
}
|
||||
|
||||
fun configuration(port: Int) = configurations.find { it.port == port }
|
14
G-Earth/src/main/kotlin/gearth/Properties.kt
Normal file
14
G-Earth/src/main/kotlin/gearth/Properties.kt
Normal file
@ -0,0 +1,14 @@
|
||||
package gearth
|
||||
|
||||
import javafx.beans.property.SimpleBooleanProperty
|
||||
import java.nio.file.Paths
|
||||
|
||||
private val propertiesManager by lazy { PropertiesManager(Paths.get("session.properties")) }
|
||||
|
||||
|
||||
val autoConnectSelected by lazy {
|
||||
booleanProperty("autoConnectSelected", true)
|
||||
}
|
||||
|
||||
private fun booleanProperty(name: String, default: Boolean) =
|
||||
SimpleBooleanProperty(default).apply { propertiesManager.bindBoolean(name, this) }
|
90
G-Earth/src/main/kotlin/gearth/PropertiesManager.kt
Normal file
90
G-Earth/src/main/kotlin/gearth/PropertiesManager.kt
Normal file
@ -0,0 +1,90 @@
|
||||
package gearth
|
||||
|
||||
import javafx.beans.property.*
|
||||
import javafx.scene.paint.Color
|
||||
import javafx.scene.paint.Material
|
||||
import javafx.scene.paint.PhongMaterial
|
||||
import org.slf4j.LoggerFactory
|
||||
import java.nio.file.Path
|
||||
import java.nio.file.Paths
|
||||
import java.util.*
|
||||
|
||||
class PropertiesManager(private val saveFilePath: Path) {
|
||||
|
||||
private val logger = LoggerFactory.getLogger(PropertiesManager::class.java)
|
||||
private val properties = Properties()
|
||||
private lateinit var saveThread: Thread
|
||||
|
||||
fun loadFromFile(): Boolean {
|
||||
|
||||
if (!saveFilePath.toFile().exists())
|
||||
return false
|
||||
|
||||
try {
|
||||
properties.load(saveFilePath.toFile().reader())
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
fun startSaveThread() {
|
||||
if (!this::saveThread.isInitialized) {
|
||||
saveThread = Thread {
|
||||
saveToFile()
|
||||
Thread.sleep(2500L)
|
||||
}
|
||||
saveThread.start()
|
||||
}
|
||||
}
|
||||
|
||||
fun saveToFile() {
|
||||
logger.info("Saving properties to $saveFilePath")
|
||||
try {
|
||||
val saveFile = saveFilePath.toFile()
|
||||
if (!saveFile.parentFile.exists())
|
||||
saveFile.parentFile.mkdir()
|
||||
properties.store(saveFile.writer(), "Contains properties for the Qodat application.")
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
fun <T> bind(key: String, property: Property<T>, transformer: (String) -> T) {
|
||||
val value = properties.getProperty(key)
|
||||
if (value != null)
|
||||
property.value = transformer.invoke(value)
|
||||
property.addListener { _ ->
|
||||
properties.setProperty(key, property.value.toString())
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: finish
|
||||
*/
|
||||
fun bindMaterial(key: String, property: ObjectProperty<Material>) =
|
||||
bind(key, property) { PhongMaterial() }
|
||||
|
||||
fun bindPath(key: String, property: ObjectProperty<Path>) =
|
||||
bind(key, property) { Paths.get(it) }
|
||||
|
||||
inline fun <reified T : Enum<T>> bindEnum(key: String, property: ObjectProperty<T>) =
|
||||
bind(key, property) { enumValueOf<T>(it) }
|
||||
|
||||
fun bindColor(key: String, property: ObjectProperty<Color>) =
|
||||
bind(key, property) { Color.valueOf(it) }
|
||||
|
||||
fun bindBoolean(key: String, property: BooleanProperty) =
|
||||
bind(key, property) { java.lang.Boolean.parseBoolean(it) }
|
||||
|
||||
fun bindDouble(key: String, property: DoubleProperty) =
|
||||
bind(key, property) { java.lang.Double.parseDouble(it) }
|
||||
|
||||
fun bindInt(key: String, property: IntegerProperty) =
|
||||
bind(key, property) { Integer.parseInt(it) }
|
||||
|
||||
fun bindString(key: String, property: StringProperty) =
|
||||
bind(key, property) { it }
|
||||
|
||||
}
|
||||
|
@ -1,11 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.*?>
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
<?import javafx.scene.text.*?>
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.CheckBox?>
|
||||
<?import javafx.scene.control.ComboBox?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.control.RadioButton?>
|
||||
<?import javafx.scene.control.TextField?>
|
||||
<?import javafx.scene.control.ToggleGroup?>
|
||||
<?import javafx.scene.layout.ColumnConstraints?>
|
||||
<?import javafx.scene.layout.GridPane?>
|
||||
<?import javafx.scene.layout.RowConstraints?>
|
||||
<?import javafx.scene.text.Font?>
|
||||
|
||||
<GridPane alignment="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="258.0" prefWidth="650.0" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1" fx:controller="gearth.ui.subforms.connection.ConnectionController">
|
||||
<GridPane alignment="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="258.0" prefWidth="650.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="gearth.ui.subforms.connection.ConnectionController">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
@ -176,8 +184,9 @@
|
||||
</GridPane>
|
||||
<GridPane alignment="CENTER" GridPane.rowIndex="1">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="340.0" minWidth="10.0" prefWidth="208.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="380.0" minWidth="10.0" prefWidth="357.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="340.0" minWidth="10.0" prefWidth="144.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="380.0" minWidth="10.0" prefWidth="251.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="380.0" minWidth="10.0" prefWidth="265.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
@ -185,13 +194,13 @@
|
||||
<GridPane.margin>
|
||||
<Insets />
|
||||
</GridPane.margin>
|
||||
<GridPane>
|
||||
<GridPane prefHeight="106.0" prefWidth="50.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints maxHeight="62.0" minHeight="10.0" prefHeight="53.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="107.0" minHeight="10.0" prefHeight="85.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="62.0" minHeight="10.0" prefHeight="37.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="107.0" minHeight="10.0" prefHeight="69.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<GridPane.margin>
|
||||
<Insets bottom="14.0" left="20.0" right="20.0" />
|
||||
@ -212,8 +221,8 @@
|
||||
</GridPane>
|
||||
<GridPane style="-fx-border-color: #888888; -fx-border-radius: 5px; " GridPane.columnIndex="1">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="140.0" minWidth="10.0" prefWidth="103.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="191.0" minWidth="10.0" prefWidth="190.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="140.0" minWidth="10.0" prefWidth="82.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="191.0" minWidth="10.0" prefWidth="149.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
@ -235,7 +244,7 @@
|
||||
<Insets left="10.0" />
|
||||
</GridPane.margin>
|
||||
</Label>
|
||||
<TextField fx:id="outHost" editable="false" GridPane.columnIndex="1">
|
||||
<TextField fx:id="outHost" editable="false" prefHeight="25.0" prefWidth="122.0" GridPane.columnIndex="1">
|
||||
<opaqueInsets>
|
||||
<Insets />
|
||||
</opaqueInsets>
|
||||
@ -249,5 +258,45 @@
|
||||
</GridPane.margin>
|
||||
</TextField>
|
||||
</GridPane>
|
||||
<GridPane layoutX="170.0" layoutY="22.0" prefHeight="96.0" prefWidth="262.0" style="-fx-border-color: #888888; -fx-border-radius: 5px; " GridPane.columnIndex="2">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="140.0" minWidth="10.0" prefWidth="56.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="209.0" minWidth="10.0" prefWidth="204.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<padding>
|
||||
<Insets bottom="7.0" top="7.0" />
|
||||
</padding>
|
||||
<children>
|
||||
<Label text="Email" textFill="#000000cc">
|
||||
<GridPane.margin>
|
||||
<Insets left="10.0" />
|
||||
</GridPane.margin>
|
||||
</Label>
|
||||
<Label text="Pass" textFill="#000000cc" GridPane.rowIndex="1">
|
||||
<GridPane.margin>
|
||||
<Insets left="10.0" />
|
||||
</GridPane.margin>
|
||||
</Label>
|
||||
<TextField fx:id="outEmail" editable="false" prefHeight="25.0" prefWidth="122.0" GridPane.columnIndex="1">
|
||||
<opaqueInsets>
|
||||
<Insets />
|
||||
</opaqueInsets>
|
||||
<GridPane.margin>
|
||||
<Insets left="5.0" right="10.0" />
|
||||
</GridPane.margin>
|
||||
</TextField>
|
||||
<TextField fx:id="outPassword" editable="false" GridPane.columnIndex="1" GridPane.rowIndex="1">
|
||||
<GridPane.margin>
|
||||
<Insets left="5.0" right="10.0" />
|
||||
</GridPane.margin>
|
||||
</TextField>
|
||||
<Button fx:id="loginButton" mnemonicParsing="false" text="Login" GridPane.columnIndex="1" GridPane.rowIndex="2" />
|
||||
</children>
|
||||
</GridPane>
|
||||
</GridPane>
|
||||
</GridPane>
|
||||
|
Loading…
Reference in New Issue
Block a user