From b7ffd26d408567828e0acbec0f12f0f98cb0fd21 Mon Sep 17 00:00:00 2001 From: Vadim Mostovoy Date: Fri, 29 Aug 2025 17:24:54 +0700 Subject: [PATCH] Little improvements - Delete extra images - Move common.css - Add AppProps.kt --- .../ru/nucodelabs/gem/app/GemApplication.kt | 55 ++++++++-------- .../gem/app/StartGemApplication.java | 3 + .../ru/nucodelabs/gem/config/AppModule.java | 57 ++++++++-------- .../java/ru/nucodelabs/gem/config/AppProps.kt | 12 ++++ .../nucodelabs/gem/config/ChartsModule.java | 26 -------- .../nucodelabs/gem/config/DialogsModule.java | 7 +- .../gem/config/FileChoosersModule.java | 8 +-- .../gem/config/GemLogbackConfigurator.kt | 10 +-- .../gem/config/{ArgNames.kt => Name.kt} | 6 +- .../java/ru/nucodelabs/gem/config/Style.kt | 3 +- .../main/AnisotropyMainViewController.kt | 8 +-- .../controller/charts/ColorAxisController.kt | 6 +- .../charts/MisfitStacksController.kt | 19 ++++-- .../charts/ModelSectionSwitcherController.kt | 4 +- .../charts/PseudoSectionSwitcherController.kt | 4 +- .../controller/charts/VesCurvesController.kt | 62 ++++++------------ .../main/CalculateErrorScreenController.kt | 6 +- .../controller/main/MainViewController.kt | 24 +++---- .../tables/ExperimentalTableController.kt | 6 +- .../nucodelabs/gem/view => css}/common.css | 0 .../ui_icons/add/1x/round_add_black_24dp.png | Bin 96 -> 0 bytes .../1x/round_chevron_left_black_24dp.png | Bin 120 -> 0 bytes .../1x/round_chevron_right_black_24dp.png | Bin 118 -> 0 bytes .../1x/round_backspace_black_24dp.png | Bin 220 -> 0 bytes .../bolt/1x/round_bolt_black_24dp.png | Bin 201 -> 0 bytes .../anisotropy/main/AnisotropyMainView.fxml | 2 +- .../gem/view/controller/charts/ColorAxis.fxml | 2 +- .../charts/CurvesPseudoSection.fxml | 2 +- .../charts/HorizontalColorAxis.fxml | 2 +- .../controller/charts/MapPseudoSection.fxml | 2 +- .../view/controller/charts/MisfitStacks.fxml | 2 +- .../gem/view/controller/charts/VesCurves.fxml | 37 ++++++----- .../controller/main/AddExperimentalData.fxml | 2 +- .../controller/main/CalculateErrorScreen.fxml | 6 +- .../main/InitialModelConfigurationView.fxml | 2 +- .../controller/main/MainSplitLayoutView.fxml | 14 ++-- .../view/controller/main/NoFileScreen.fxml | 2 +- .../controller/main/NormalizationScreen.fxml | 2 +- .../gem/view/controller/main/PicketsBar.fxml | 2 +- .../controller/tables/ExperimentalTable.fxml | 2 +- .../view/controller/tables/ModelTable.fxml | 4 +- 41 files changed, 196 insertions(+), 215 deletions(-) create mode 100644 src/main/java/ru/nucodelabs/gem/config/AppProps.kt rename src/main/java/ru/nucodelabs/gem/config/{ArgNames.kt => Name.kt} (85%) rename src/main/resources/{ru/nucodelabs/gem/view => css}/common.css (100%) delete mode 100644 src/main/resources/img/ui_icons/add/1x/round_add_black_24dp.png delete mode 100644 src/main/resources/img/ui_icons/arrow_left/1x/round_chevron_left_black_24dp.png delete mode 100644 src/main/resources/img/ui_icons/arrow_right/1x/round_chevron_right_black_24dp.png delete mode 100644 src/main/resources/img/ui_icons/backspace/1x/round_backspace_black_24dp.png delete mode 100644 src/main/resources/img/ui_icons/bolt/1x/round_bolt_black_24dp.png diff --git a/src/main/java/ru/nucodelabs/gem/app/GemApplication.kt b/src/main/java/ru/nucodelabs/gem/app/GemApplication.kt index 3e962e48..0291c308 100644 --- a/src/main/java/ru/nucodelabs/gem/app/GemApplication.kt +++ b/src/main/java/ru/nucodelabs/gem/app/GemApplication.kt @@ -10,7 +10,7 @@ import javafx.stage.Window import javafx.stage.WindowEvent import javafx.stage.WindowEvent.WINDOW_CLOSE_REQUEST import ru.nucodelabs.gem.config.AppModule -import ru.nucodelabs.gem.config.ArgNames +import ru.nucodelabs.gem.config.Name import ru.nucodelabs.gem.config.slf4j import ru.nucodelabs.gem.view.AlertsFactory import ru.nucodelabs.gem.view.controller.main.MainViewController @@ -56,16 +56,17 @@ class GemApplication : GuiceApplication(AppModule()) { @Throws(Exception::class) override fun start(primaryStage: Stage) { Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler(alertsFactory)) + val params: List = parameters.raw + macOSHandledFiles - if ( - params.any { - it.endsWith(".EXP", ignoreCase = true) || it.endsWith(".json", ignoreCase = true) - } - ) { - processParams(params) - } else { + log.info("Parameters are $params") + if (!handleFileParameters(params)) { log.info("Starting MainView without parameters") - guiceInjector.getInstance(Key.get(Stage::class.java, Names.named(ArgNames.View.MAIN_VIEW))).show() + guiceInjector.getInstance( + Key.get( + Stage::class.java, + Names.named(Name.View.MAIN_VIEW) + ) + ).show() } } @@ -74,34 +75,30 @@ class GemApplication : GuiceApplication(AppModule()) { log.info("Exiting") } - private fun processParams(params: List): Boolean { - log.info("Parameters are $params") - val expFiles = mutableListOf() - for (param in params) { - if (param.endsWith(".EXP", ignoreCase = true)) { - expFiles += File(param) - } else if (param.endsWith(".json", ignoreCase = true)) { - loadMainViewWithJsonFile(File(param)) - return true - } - } - if (expFiles.isNotEmpty()) { - loadMainViewWithEXPFiles(expFiles) - return true - } - return false + /** + * true if files handled, false if no files to open detected + */ + private fun handleFileParameters(params: List): Boolean { + + val expFiles = params.filter { it.endsWith(".EXP", ignoreCase = true) } + val jsonFiles = params.filter { it.endsWith(".json", ignoreCase = true) } + + loadMainViewWithEXPFiles(expFiles.map { File(it) }) + jsonFiles.forEach { jsonFile -> loadMainViewWithJsonFile(File(jsonFile)) } + + return expFiles.isNotEmpty() or jsonFiles.isNotEmpty() } private fun loadMainViewWithJsonFile(jsonFile: File) = fxmlLoaderAfterShow().getController().run { - log.info("Open JSON Section, file: ${jsonFile.absolutePath}") + log.info("Starting - Open JSON Section, file: ${jsonFile.name}") openJsonSection(jsonFile) } private fun loadMainViewWithEXPFiles(expFiles: List) = fxmlLoaderAfterShow().getController().run { - expFiles.forEach { - log.info("Import EXP, file: ${it.absolutePath}") + expFiles.filter { it.exists() }.forEach { + log.info("Starting - Import EXP file: ${it.name}") importEXP(it) } } @@ -109,5 +106,5 @@ class GemApplication : GuiceApplication(AppModule()) { private fun fxmlLoaderAfterShow(): FXMLLoader = mainViewFxmlLoader().also { it.load().show() } private fun mainViewFxmlLoader() = - guiceInjector.getInstance(Key.get(FXMLLoader::class.java, Names.named(ArgNames.View.MAIN_VIEW))) + guiceInjector.getInstance(Key.get(FXMLLoader::class.java, Names.named(Name.View.MAIN_VIEW))) } \ No newline at end of file diff --git a/src/main/java/ru/nucodelabs/gem/app/StartGemApplication.java b/src/main/java/ru/nucodelabs/gem/app/StartGemApplication.java index dfd03fab..745fb1fa 100644 --- a/src/main/java/ru/nucodelabs/gem/app/StartGemApplication.java +++ b/src/main/java/ru/nucodelabs/gem/app/StartGemApplication.java @@ -4,6 +4,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Locale; + /** * Main, запускает приложение JavaFX */ @@ -12,6 +14,7 @@ public class StartGemApplication { private static final Logger log = LoggerFactory.getLogger(StartGemApplication.class); public static void main(String[] args) { + Locale.setDefault(Locale.Category.DISPLAY, Locale.of("ru")); // TODO: en locale support try { Application.launch(GemApplication.class, args); } catch (Exception e) { diff --git a/src/main/java/ru/nucodelabs/gem/config/AppModule.java b/src/main/java/ru/nucodelabs/gem/config/AppModule.java index 327d2833..6dd384b3 100644 --- a/src/main/java/ru/nucodelabs/gem/config/AppModule.java +++ b/src/main/java/ru/nucodelabs/gem/config/AppModule.java @@ -63,37 +63,35 @@ protected void configure() { @Provides @Singleton - private ResourceBundle uiProperties() { - // TODO support en locale - return ResourceBundle.getBundle("ui", Locale.of("ru")); + private Locale currentLocale() { + return Locale.getDefault(Locale.Category.DISPLAY); } @Provides - @Named(ArgNames.CSS) @Singleton - private String provideStylesheet() { - return "ru/nucodelabs/gem/view/common.css"; + private ResourceBundle uiProperties() { + return ResourceBundle.getBundle("ui", currentLocale()); } @Provides - @Named(ArgNames.View.MAIN_VIEW) + @Named(Name.View.MAIN_VIEW) private URL provideMainViewFXML() { return MainViewController.class.getResource("MainSplitLayoutView.fxml"); } @Provides - @Named(ArgNames.View.ANISOTROPY_MAIN_VIEW) + @Named(Name.View.ANISOTROPY_MAIN_VIEW) URL anisotropyMainView() { return AnisotropyMainViewController.class.getResource("AnisotropyMainView.fxml"); } @Provides - @Named(ArgNames.View.ANISOTROPY_MAIN_VIEW) + @Named(Name.View.ANISOTROPY_MAIN_VIEW) private Stage anisotropyMainViewWindow( ResourceBundle uiProperties, Injector injector, - @Named(ArgNames.View.ANISOTROPY_MAIN_VIEW) URL url, - @Named(ArgNames.View.MAIN_VIEW) Stage mainStage + @Named(Name.View.ANISOTROPY_MAIN_VIEW) URL url, + @Named(Name.View.MAIN_VIEW) Stage mainStage ) throws IOException { FXMLLoader fxmlLoader = new FXMLLoader(url, uiProperties); fxmlLoader.setControllerFactory(injector.createChildInjector(new AnisotropyProjectModule())::getInstance); @@ -105,22 +103,26 @@ private Stage anisotropyMainViewWindow( return stage; } - @Provides - @Named(ArgNames.View.MAIN_VIEW) - private FXMLLoader provideFXMLLoader(ResourceBundle uiProperties, Injector injector, @Named(ArgNames.View.MAIN_VIEW) URL url) { + @Named(Name.View.MAIN_VIEW) + private FXMLLoader provideFXMLLoader( + ResourceBundle uiProperties, + Injector injector, + @Named(Name.View.MAIN_VIEW) URL url + ) { FXMLLoader fxmlLoader = new FXMLLoader(url, uiProperties); fxmlLoader.setControllerFactory(injector.createChildInjector(new MainViewModule())::getInstance); return fxmlLoader; } @Provides - @Named(ArgNames.View.MAIN_VIEW) - private Stage create(@Named(ArgNames.View.MAIN_VIEW) FXMLLoader loader) throws IOException { + @Named(Name.View.MAIN_VIEW) + private Stage create(@Named(Name.View.MAIN_VIEW) FXMLLoader loader) throws IOException { return loader.load(); } @Provides + @Singleton private Validator provideValidator() { try (var factory = Validation.buildDefaultValidatorFactory()) { return factory.getValidator(); @@ -146,7 +148,7 @@ private Preferences preferences() { } @Provides - @Named(ArgNames.PRECISE) + @Named(Name.PRECISE_FORMAT) DecimalFormat preciseFormat() { DecimalFormat decimalFormat = new DecimalFormat(); decimalFormat.setRoundingMode(RoundingMode.HALF_UP); @@ -190,7 +192,7 @@ public Double fromString(String string) { try { return decimalFormat.parse(string).doubleValue(); } catch (ParseException e) { - throw new IllegalArgumentException(e); + return Double.NaN; } } }; @@ -213,7 +215,7 @@ public Number fromString(String string) { @Provides @Singleton - @Named(ArgNames.DEFAULT_CLR) + @Named(Name.DEFAULT_CLR) ClrInfo clrInfo() throws IOException { // Firstly lookup next to executable var externalFile = Paths.get("colormap/default.clr").toFile(); @@ -224,6 +226,7 @@ ClrInfo clrInfo() throws IOException { "Resource colormap/default.clr is null" ); try (defaultResourceStream) { + log.info("Loading default .clr file from resources"); return new ClrInfo( "Default", new String(defaultResourceStream.readAllBytes(), StandardCharsets.UTF_8) @@ -231,6 +234,7 @@ ClrInfo clrInfo() throws IOException { } } try (var externalFileStream = new FileInputStream(externalFile)) { + log.info("Loading external .clr file"); return new ClrInfo( externalFile.getAbsolutePath(), new String(externalFileStream.readAllBytes(), StandardCharsets.UTF_8) @@ -240,28 +244,29 @@ ClrInfo clrInfo() throws IOException { @Provides @Singleton - @Named(ArgNames.CLR_SOURCE) - String clrSource(@Named(ArgNames.DEFAULT_CLR) ClrInfo clrInfo) { + @Named(Name.CLR_SOURCE) + String clrSource(@Named(Name.DEFAULT_CLR) ClrInfo clrInfo) { return clrInfo.source(); } @Provides - @Named(ArgNames.DEFAULT_CLR) - ClrParser clrParser(@Named(ArgNames.DEFAULT_CLR) ClrInfo clrInfo) { + @Named(Name.DEFAULT_CLR) + @Singleton + ClrParser clrParser(@Named(Name.DEFAULT_CLR) ClrInfo clrInfo) { return new ClrParser(clrInfo.content()); } @Provides @Singleton - ColorMapper colorMapper(@Named(ArgNames.DEFAULT_CLR) ClrParser clrParser) { + ColorMapper colorMapper(@Named(Name.DEFAULT_CLR) ClrParser clrParser) { List valueColorList = clrParser.getColorNodes(); return new ColorPalette(valueColorList, 0, 1500, 15); } @Provides @Singleton - @Named(ArgNames.DIFF) - ColorMapper diffColorMapper(@Named(ArgNames.DEFAULT_CLR) ClrParser clrParser) { + @Named(Name.DIFF) + ColorMapper diffColorMapper(@Named(Name.DEFAULT_CLR) ClrParser clrParser) { List valueColorList = clrParser.getColorNodes(); return new ColorPalette(valueColorList, 0, 2, 15); } diff --git a/src/main/java/ru/nucodelabs/gem/config/AppProps.kt b/src/main/java/ru/nucodelabs/gem/config/AppProps.kt new file mode 100644 index 00000000..d260c6d8 --- /dev/null +++ b/src/main/java/ru/nucodelabs/gem/config/AppProps.kt @@ -0,0 +1,12 @@ +package ru.nucodelabs.gem.config + +object AppProps { + const val APP_NAME = "gem" + const val FULL_APP_NAME = "ru.nucodelabs.$APP_NAME" + + const val DEFAULT_LOG_LEVEL = "INFO" + const val DEFAULT_LOG_STDOUT = false + + val logLevel: String = System.getProperty("app.gem.log.level", DEFAULT_LOG_LEVEL) + val logStdout: Boolean = System.getProperty("app.gem.log.stdout", DEFAULT_LOG_STDOUT.toString()).toBoolean() +} \ No newline at end of file diff --git a/src/main/java/ru/nucodelabs/gem/config/ChartsModule.java b/src/main/java/ru/nucodelabs/gem/config/ChartsModule.java index db3df32f..f05ab0cc 100644 --- a/src/main/java/ru/nucodelabs/gem/config/ChartsModule.java +++ b/src/main/java/ru/nucodelabs/gem/config/ChartsModule.java @@ -2,36 +2,10 @@ import com.google.inject.AbstractModule; import com.google.inject.Provides; -import com.google.inject.name.Named; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleObjectProperty; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import javafx.scene.chart.XYChart; import ru.nucodelabs.geo.forward.ForwardSolver; import ru.nucodelabs.geo.ves.calc.graph.MisfitsFunction; -import java.util.ArrayList; - -import static ru.nucodelabs.gem.view.controller.charts.VesCurvesController.TOTAL_COUNT; - public class ChartsModule extends AbstractModule { - @Provides - private ObjectProperty>> emptyChartData() { - return new SimpleObjectProperty<>( - FXCollections.observableArrayList(new ArrayList<>())); - } - - @Provides - @Named("VESCurves") - private ObjectProperty>> provideVESCurvesData() { - ObjectProperty>> dataProperty = - new SimpleObjectProperty<>(FXCollections.observableArrayList()); - for (int i = 0; i < TOTAL_COUNT; i++) { - dataProperty.get().add(new XYChart.Series<>()); - } - return dataProperty; - } @Provides MisfitsFunction misfitValuesFactory(ForwardSolver forwardSolver) { diff --git a/src/main/java/ru/nucodelabs/gem/config/DialogsModule.java b/src/main/java/ru/nucodelabs/gem/config/DialogsModule.java index b183062a..43621fcd 100644 --- a/src/main/java/ru/nucodelabs/gem/config/DialogsModule.java +++ b/src/main/java/ru/nucodelabs/gem/config/DialogsModule.java @@ -7,9 +7,10 @@ import javafx.scene.control.Dialog; public class DialogsModule extends AbstractModule { + @Provides - @Named(ArgNames.SAVE) - Dialog provideSaveDialog(@Named(ArgNames.CSS) String stylesheet) { + @Named(Name.SAVE) + Dialog provideSaveDialog() { Dialog saveDialog = new Dialog<>(); saveDialog.setTitle("Сохранение"); saveDialog.setContentText("Сохранить изменения?"); @@ -17,7 +18,7 @@ Dialog provideSaveDialog(@Named(ArgNames.CSS) String stylesheet) { .addAll(ButtonType.YES, ButtonType.NO, ButtonType.CANCEL); - saveDialog.getDialogPane().getStylesheets().add(stylesheet); + saveDialog.getDialogPane().getStylesheets().add(Style.COMMON_STYLESHEET); return saveDialog; } } diff --git a/src/main/java/ru/nucodelabs/gem/config/FileChoosersModule.java b/src/main/java/ru/nucodelabs/gem/config/FileChoosersModule.java index 66b352fd..432ebabf 100644 --- a/src/main/java/ru/nucodelabs/gem/config/FileChoosersModule.java +++ b/src/main/java/ru/nucodelabs/gem/config/FileChoosersModule.java @@ -18,7 +18,7 @@ public class FileChoosersModule extends AbstractModule { @Provides @Singleton - @Named(ArgNames.File.EXP) + @Named(Name.File.EXP) private FileChooser provideEXPFileChooser(ResourceBundle ui, Preferences preferences) { FileChooser chooser = new FileChooser(); chooser.getExtensionFilters().addAll( @@ -34,7 +34,7 @@ private FileChooser provideEXPFileChooser(ResourceBundle ui, Preferences prefere @Provides @Singleton - @Named(ArgNames.File.JSON) + @Named(Name.File.JSON) private FileChooser provideJSONFileChooser(ResourceBundle ui, Preferences preferences) { FileChooser chooser = new FileChooser(); chooser.getExtensionFilters().addAll( @@ -53,7 +53,7 @@ private FileChooser provideJSONFileChooser(ResourceBundle ui, Preferences prefer @Provides @Singleton - @Named(ArgNames.File.MOD) + @Named(Name.File.MOD) private FileChooser provideMODFileChooser(ResourceBundle ui, Preferences preferences) { FileChooser chooser = new FileChooser(); chooser.getExtensionFilters().addAll( @@ -69,7 +69,7 @@ private FileChooser provideMODFileChooser(ResourceBundle ui, Preferences prefere @Provides @Singleton - @Named(ArgNames.File.PNG) + @Named(Name.File.PNG) private FileChooser pngFileChooser(Preferences preferences) { FileChooser chooser = new FileChooser(); chooser.getExtensionFilters().addAll( diff --git a/src/main/java/ru/nucodelabs/gem/config/GemLogbackConfigurator.kt b/src/main/java/ru/nucodelabs/gem/config/GemLogbackConfigurator.kt index 5f87a97d..9914d090 100644 --- a/src/main/java/ru/nucodelabs/gem/config/GemLogbackConfigurator.kt +++ b/src/main/java/ru/nucodelabs/gem/config/GemLogbackConfigurator.kt @@ -14,14 +14,14 @@ import ru.nucodelabs.logback.appender.AppLogFileAppender class GemLogbackConfigurator : ContextAwareBase(), Configurator { override fun configure(loggerContext: LoggerContext?): Configurator.ExecutionStatus? { - if (System.getProperty("app.gem.log.stdout", "false").toBoolean()) { + if (AppProps.logStdout) { BasicConfigurator().also { it.context = loggerContext }.configure(loggerContext) } - val appender = AppLogFileAppender().apply { + val appLogFileAppender = AppLogFileAppender().apply { context = loggerContext name = "APP_FILE" - appName = "ru.nucodelabs.gem" + appName = AppProps.FULL_APP_NAME logFileName = "last_session.log" isAppend = false encoder = LayoutWrappingEncoder().apply { @@ -32,8 +32,8 @@ class GemLogbackConfigurator : ContextAwareBase(), Configurator { loggerContext?.getLogger(Logger.ROOT_LOGGER_NAME)?.let { root -> root.isAdditive = false - root.level = Level.valueOf(System.getProperty("app.gem.log.level", "INFO")) - root.addAppender(appender) + root.level = Level.toLevel(AppProps.logLevel, Level.INFO) + root.addAppender(appLogFileAppender) } return Configurator.ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY diff --git a/src/main/java/ru/nucodelabs/gem/config/ArgNames.kt b/src/main/java/ru/nucodelabs/gem/config/Name.kt similarity index 85% rename from src/main/java/ru/nucodelabs/gem/config/ArgNames.kt rename to src/main/java/ru/nucodelabs/gem/config/Name.kt index f4543cf4..e6bf8d37 100644 --- a/src/main/java/ru/nucodelabs/gem/config/ArgNames.kt +++ b/src/main/java/ru/nucodelabs/gem/config/Name.kt @@ -1,10 +1,10 @@ package ru.nucodelabs.gem.config -object ArgNames { - const val CSS = "CSS" +object Name { + const val CLR_SOURCE = "CLR_SOURCE" const val DEFAULT_CLR = "Default CLR" - const val PRECISE = "Precise" + const val PRECISE_FORMAT = "Precise" const val SAVE = "SAVE" const val DIFF = "DIFF" diff --git a/src/main/java/ru/nucodelabs/gem/config/Style.kt b/src/main/java/ru/nucodelabs/gem/config/Style.kt index 79e685fe..d5f39fc8 100644 --- a/src/main/java/ru/nucodelabs/gem/config/Style.kt +++ b/src/main/java/ru/nucodelabs/gem/config/Style.kt @@ -1,7 +1,8 @@ package ru.nucodelabs.gem.config object Style { - const val SHEET = "ru/nucodelabs/gem/view/common.css" + + const val COMMON_STYLESHEET = "css/common.css" object Class { diff --git a/src/main/java/ru/nucodelabs/gem/view/controller/anisotropy/main/AnisotropyMainViewController.kt b/src/main/java/ru/nucodelabs/gem/view/controller/anisotropy/main/AnisotropyMainViewController.kt index ab9423f4..8c52ead7 100644 --- a/src/main/java/ru/nucodelabs/gem/view/controller/anisotropy/main/AnisotropyMainViewController.kt +++ b/src/main/java/ru/nucodelabs/gem/view/controller/anisotropy/main/AnisotropyMainViewController.kt @@ -16,7 +16,7 @@ import javafx.stage.FileChooser import javafx.util.Callback import javafx.util.StringConverter import ru.nucodelabs.gem.app.pref.JSON_FILES_DIR -import ru.nucodelabs.gem.config.ArgNames +import ru.nucodelabs.gem.config.Name import ru.nucodelabs.gem.config.Style import ru.nucodelabs.gem.fxmodel.anisotropy.ObservableAzimuthSignals import ru.nucodelabs.gem.fxmodel.anisotropy.ObservableModelLayer @@ -55,11 +55,11 @@ private const val ERR_LOWER_SIGNALS = "Нижняя граница погреш class AnisotropyMainViewController @Inject constructor( private val appModel: AnisotropyFxAppModel, - @Named(ArgNames.File.JSON) private val fileChooser: FileChooser, + @Named(Name.File.JSON) private val fileChooser: FileChooser, private val preferences: Preferences, private val colorMapper: ColorMapper, - @Named(ArgNames.DIFF) private val diffColorMapper: ColorMapper, - @Named(ArgNames.PRECISE) private val preciseDecimalFormat: DecimalFormat, + @Named(Name.DIFF) private val diffColorMapper: ColorMapper, + @Named(Name.PRECISE_FORMAT) private val preciseDecimalFormat: DecimalFormat, private val df: DecimalFormat, private val alertsFactory: AlertsFactory, private val formatter: StringConverter, diff --git a/src/main/java/ru/nucodelabs/gem/view/controller/charts/ColorAxisController.kt b/src/main/java/ru/nucodelabs/gem/view/controller/charts/ColorAxisController.kt index dc5ca485..202b9203 100644 --- a/src/main/java/ru/nucodelabs/gem/view/controller/charts/ColorAxisController.kt +++ b/src/main/java/ru/nucodelabs/gem/view/controller/charts/ColorAxisController.kt @@ -18,7 +18,7 @@ import ru.nucodelabs.gem.app.pref.COLOR_MAX_VALUE import ru.nucodelabs.gem.app.pref.COLOR_MIN_VALUE import ru.nucodelabs.gem.app.pref.COLOR_SEGMENTS import ru.nucodelabs.gem.app.pref.PNG_FILES_DIR -import ru.nucodelabs.gem.config.ArgNames +import ru.nucodelabs.gem.config.Name import ru.nucodelabs.gem.view.color.ColorMapper import ru.nucodelabs.gem.view.control.chart.NucodeNumberAxis import ru.nucodelabs.gem.view.control.chart.PolygonChart @@ -37,12 +37,12 @@ import java.util.prefs.Preferences class ColorAxisController @Inject constructor( - @Named(ArgNames.CLR_SOURCE) private val clrFilePath: String, + @Named(Name.CLR_SOURCE) private val clrFilePath: String, private val colorMapper: ColorMapper, private val fxPreferences: FXPreferences, private val stringConverter: StringConverter, private val decimalFormat: DecimalFormat, - @Named(ArgNames.File.PNG) private val fc: FileChooser, + @Named(Name.File.PNG) private val fc: FileChooser, private val prefs: Preferences ) : AbstractViewController() { diff --git a/src/main/java/ru/nucodelabs/gem/view/controller/charts/MisfitStacksController.kt b/src/main/java/ru/nucodelabs/gem/view/controller/charts/MisfitStacksController.kt index b4664a6e..3fafb8c7 100644 --- a/src/main/java/ru/nucodelabs/gem/view/controller/charts/MisfitStacksController.kt +++ b/src/main/java/ru/nucodelabs/gem/view/controller/charts/MisfitStacksController.kt @@ -2,7 +2,9 @@ package ru.nucodelabs.gem.view.controller.charts import jakarta.inject.Inject import javafx.beans.property.ObjectProperty +import javafx.beans.property.SimpleObjectProperty import javafx.beans.value.ObservableObjectValue +import javafx.collections.FXCollections import javafx.collections.ObservableList import javafx.fxml.FXML import javafx.scene.chart.LineChart @@ -41,16 +43,17 @@ const val ERROR_DESCRIPTION = "Погрешность - это \n" + "экспериментальных в процентах, относительно \n" + "погрешности измерения \n" const val TARGET_FUNCTION_FORMULA_IMAGE_PATH = "/img/targetFunction.png" -const val MISFIT_FORMULA_IMAGE_PATH ="/img/misfit.png" +const val MISFIT_FORMULA_IMAGE_PATH = "/img/misfit.png" const val ERROR_FORMULA_IMAGE_PATH = "/img/error.png" class MisfitStacksController @Inject constructor( private val picketObservable: ObservableObjectValue, private val alertsFactory: AlertsFactory, - private val dataProperty: ObjectProperty>>, private val decimalFormat: DecimalFormat, private val appModel: VesFxAppModel, ) : AbstractViewController() { + private val dataProperty = emptyData() + @FXML private lateinit var targetFunctionText: Label @@ -138,11 +141,11 @@ class MisfitStacksController @Inject constructor( val imageForTargetFunction = Image( javaClass.getResourceAsStream(TARGET_FUNCTION_FORMULA_IMAGE_PATH) ) - val tooltipForTargetFunction = Tooltip() + val tooltipForTargetFunction = Tooltip() tooltipForTargetFunction.text = TARGET_FUNCTION_DESCRIPTION tooltipForTargetFunction.graphic = ImageView(imageForTargetFunction) tooltipForTargetFunction.contentDisplay = ContentDisplay.BOTTOM - Tooltip.install(targetFunctionText, tooltipForTargetFunction.forCharts()) + Tooltip.install(targetFunctionText, tooltipForTargetFunction.forCharts()) val imageForMisfit = Image( javaClass.getResourceAsStream(MISFIT_FORMULA_IMAGE_PATH) @@ -175,4 +178,10 @@ class MisfitStacksController @Inject constructor( } } } -} \ No newline at end of file +} + +fun emptyData(): ObjectProperty>> = SimpleObjectProperty( + FXCollections.observableArrayList( + ArrayList() + ) +) diff --git a/src/main/java/ru/nucodelabs/gem/view/controller/charts/ModelSectionSwitcherController.kt b/src/main/java/ru/nucodelabs/gem/view/controller/charts/ModelSectionSwitcherController.kt index b080f1b0..ddaab82b 100644 --- a/src/main/java/ru/nucodelabs/gem/view/controller/charts/ModelSectionSwitcherController.kt +++ b/src/main/java/ru/nucodelabs/gem/view/controller/charts/ModelSectionSwitcherController.kt @@ -11,7 +11,7 @@ import javafx.scene.layout.VBox import javafx.stage.FileChooser import javafx.stage.Stage import ru.nucodelabs.gem.app.pref.PNG_FILES_DIR -import ru.nucodelabs.gem.config.ArgNames +import ru.nucodelabs.gem.config.Name import ru.nucodelabs.gem.view.controller.AbstractController import ru.nucodelabs.kfx.ext.bindTo import ru.nucodelabs.kfx.ext.saveSnapshotAsPng @@ -20,7 +20,7 @@ import java.util.* import java.util.prefs.Preferences class ModelSectionSwitcherController @Inject constructor( - @Named(ArgNames.File.PNG) private val fc: FileChooser, + @Named(Name.File.PNG) private val fc: FileChooser, private val prefs: Preferences ) : AbstractController() { @FXML diff --git a/src/main/java/ru/nucodelabs/gem/view/controller/charts/PseudoSectionSwitcherController.kt b/src/main/java/ru/nucodelabs/gem/view/controller/charts/PseudoSectionSwitcherController.kt index 5b99979d..e762ea29 100644 --- a/src/main/java/ru/nucodelabs/gem/view/controller/charts/PseudoSectionSwitcherController.kt +++ b/src/main/java/ru/nucodelabs/gem/view/controller/charts/PseudoSectionSwitcherController.kt @@ -10,7 +10,7 @@ import javafx.scene.layout.VBox import javafx.stage.FileChooser import javafx.stage.Stage import ru.nucodelabs.gem.app.pref.PNG_FILES_DIR -import ru.nucodelabs.gem.config.ArgNames +import ru.nucodelabs.gem.config.Name import ru.nucodelabs.gem.view.controller.AbstractController import ru.nucodelabs.kfx.ext.bindTo import ru.nucodelabs.kfx.ext.saveSnapshotAsPng @@ -19,7 +19,7 @@ import java.util.* import java.util.prefs.Preferences class PseudoSectionSwitcherController @Inject constructor( - @Named(ArgNames.File.PNG) private val fc: FileChooser, + @Named(Name.File.PNG) private val fc: FileChooser, private val prefs: Preferences ) : AbstractController() { @FXML diff --git a/src/main/java/ru/nucodelabs/gem/view/controller/charts/VesCurvesController.kt b/src/main/java/ru/nucodelabs/gem/view/controller/charts/VesCurvesController.kt index 25d7b1ad..13d3bfe2 100644 --- a/src/main/java/ru/nucodelabs/gem/view/controller/charts/VesCurvesController.kt +++ b/src/main/java/ru/nucodelabs/gem/view/controller/charts/VesCurvesController.kt @@ -1,12 +1,10 @@ package ru.nucodelabs.gem.view.controller.charts -import com.google.inject.name.Named import jakarta.inject.Inject -import javafx.beans.property.BooleanProperty -import javafx.beans.property.IntegerProperty -import javafx.beans.property.ObjectProperty -import javafx.beans.property.SimpleBooleanProperty +import jakarta.inject.Named +import javafx.beans.property.* import javafx.beans.value.ObservableObjectValue +import javafx.collections.FXCollections import javafx.collections.ObservableList import javafx.event.EventHandler import javafx.fxml.FXML @@ -22,7 +20,7 @@ import javafx.stage.FileChooser import javafx.stage.Stage import javafx.util.StringConverter import ru.nucodelabs.gem.app.pref.PNG_FILES_DIR -import ru.nucodelabs.gem.config.ArgNames +import ru.nucodelabs.gem.config.Name import ru.nucodelabs.gem.config.Style import ru.nucodelabs.gem.fxmodel.ves.ObservableSection import ru.nucodelabs.gem.view.AlertsFactory @@ -55,20 +53,10 @@ import kotlin.math.log10 private const val X_AXIS_PADDING_LOG = 0.1 private const val Y_AXIS_PADDING_LOG = 0.1 -private const val X_MIN_LOG = -2.0 -private const val X_MIN = 1e-2 -private const val X_MAX_LOG = 10.0 -private const val X_MAX = 1e10 -private const val Y_MIN_LOG = -2.0 -private const val Y_MIN = 1e-2 -private const val Y_MAX_LOG = 10.0 -private const val Y_MAX = 1e10 -private const val ZOOM_DELTA_LOG = 0.1 -private const val ZOOM_DELTA_REL = 0.1 +private const val ZOOM_DELTA_LOG = 0.05 class VesCurvesController @Inject constructor( private val picketObservable: ObservableObjectValue, - @Named("VESCurves") private val dataProperty: ObjectProperty>>, private val _picketIndex: IntegerProperty, private val alertsFactory: AlertsFactory, private val observableSection: ObservableSection, @@ -76,10 +64,12 @@ class VesCurvesController @Inject constructor( private val decimalFormat: DecimalFormat, private val formatter: StringConverter, private val forwardSolver: ForwardSolver, - @Named(ArgNames.File.PNG) private val fc: FileChooser, + @Named(Name.File.PNG) private val fc: FileChooser, private val prefs: Preferences ) : AbstractController() { + private val dataProperty: ObjectProperty>> = initData() + private val picketIndex get() = _picketIndex.get() @@ -152,6 +142,14 @@ class VesCurvesController @Inject constructor( setupContextMenu() } + private fun initData(): ObjectProperty>> { + return SimpleObjectProperty( + FXCollections.observableArrayList>().also { + for (i in 0..() + } + ) + } + private fun setupContextMenu() { val contextMenu = ContextMenu( CheckMenuItem("Модель").also { @@ -455,31 +453,11 @@ class VesCurvesController @Inject constructor( // } // } -// @FXML -// private fun zoomIn() = zoomSupport.zoomIn(ZOOM_DELTA_LOG) -// -// @FXML -// private fun zoomOut() = zoomSupport.zoomOut(ZOOM_DELTA_LOG) - -// fun zoomUsingScroll(scrollEvent: ScrollEvent) { -// if (scrollEvent.isShortcutDown) { -// val start = pointInSceneToValue(Point2D(scrollEvent.sceneX, scrollEvent.sceneY)) -// val now = pointInSceneToValue( -// Point2D(scrollEvent.sceneY + scrollEvent.deltaY, scrollEvent.sceneX + scrollEvent.deltaX) -// ) -// -// val sensitivity = 0.1 -// val distX = (now.xValue - start.xValue) * sensitivity -// val distY = (start.xValue - start.yValue) * sensitivity -// -// lineChartXAxis.lowerBound += distX -// lineChartXAxis.upperBound -= distX -// -// lineChartYAxis.lowerBound += distY -// lineChartYAxis.upperBound -= distY -// } -// } + @FXML + private fun zoomIn() = zoom.zoom(1 + ZOOM_DELTA_LOG) + @FXML + private fun zoomOut() = zoom.zoom(1 - ZOOM_DELTA_LOG) companion object Order { const val EXP_CURVE_SERIES_INDEX = 3 diff --git a/src/main/java/ru/nucodelabs/gem/view/controller/main/CalculateErrorScreenController.kt b/src/main/java/ru/nucodelabs/gem/view/controller/main/CalculateErrorScreenController.kt index f9985c8b..b4ed408d 100644 --- a/src/main/java/ru/nucodelabs/gem/view/controller/main/CalculateErrorScreenController.kt +++ b/src/main/java/ru/nucodelabs/gem/view/controller/main/CalculateErrorScreenController.kt @@ -1,7 +1,7 @@ package ru.nucodelabs.gem.view.controller.main -import com.google.inject.name.Named import jakarta.inject.Inject +import jakarta.inject.Named import javafx.beans.binding.Bindings.createStringBinding import javafx.beans.property.IntegerProperty import javafx.beans.value.ObservableObjectValue @@ -13,7 +13,7 @@ import javafx.scene.chart.XYChart.Series import javafx.scene.control.* import javafx.stage.Stage import javafx.util.Callback -import ru.nucodelabs.gem.config.ArgNames +import ru.nucodelabs.gem.config.Name import ru.nucodelabs.gem.fxmodel.ves.ObservableExperimentalData import ru.nucodelabs.gem.fxmodel.ves.ObservableSection import ru.nucodelabs.gem.fxmodel.ves.mapper.VesFxModelMapper @@ -43,7 +43,7 @@ const val DEFAULT_I_B_ERROR = 0.5 // mA const val LEQ_SIGN = '≤' class CalculateErrorScreenController @Inject constructor( - @Named(ArgNames.PRECISE) private val preciseFormat: DecimalFormat, + @Named(Name.PRECISE_FORMAT) private val preciseFormat: DecimalFormat, private val df: DecimalFormat, private val observableSection: ObservableSection, private val historyManager: HistoryManager
, diff --git a/src/main/java/ru/nucodelabs/gem/view/controller/main/MainViewController.kt b/src/main/java/ru/nucodelabs/gem/view/controller/main/MainViewController.kt index 6ba10398..76a237b7 100644 --- a/src/main/java/ru/nucodelabs/gem/view/controller/main/MainViewController.kt +++ b/src/main/java/ru/nucodelabs/gem/view/controller/main/MainViewController.kt @@ -1,7 +1,7 @@ package ru.nucodelabs.gem.view.controller.main -import com.google.inject.name.Named import jakarta.inject.Inject +import jakarta.inject.Named import jakarta.inject.Provider import jakarta.validation.Validator import javafx.application.Platform @@ -24,7 +24,8 @@ import javafx.stage.Screen import javafx.stage.Stage import ru.nucodelabs.gem.app.io.StorageManager import ru.nucodelabs.gem.app.pref.* -import ru.nucodelabs.gem.config.ArgNames +import ru.nucodelabs.gem.config.Name +import ru.nucodelabs.gem.config.Style import ru.nucodelabs.gem.fxmodel.ves.ObservableSection import ru.nucodelabs.gem.view.AlertsFactory import ru.nucodelabs.gem.view.controller.AbstractController @@ -57,13 +58,12 @@ import java.util.prefs.PreferenceChangeEvent import java.util.prefs.Preferences class MainViewController @Inject constructor( - @Named(ArgNames.View.MAIN_VIEW) private val mainViewProvider: Provider, - @Named(ArgNames.View.ANISOTROPY_MAIN_VIEW) private val anisotropyMainViewProvider: Provider, - @Named(ArgNames.File.EXP) private val expFileChooser: FileChooser, - @Named(ArgNames.File.MOD) private val modFileChooser: FileChooser, - @Named(ArgNames.File.JSON) private val jsonFileChooser: FileChooser, - @Named(ArgNames.SAVE) private val saveDialogProvider: Provider>, - @Named(ArgNames.CSS) private val stylesheet: String, + @Named(Name.View.MAIN_VIEW) private val mainViewProvider: Provider, + @Named(Name.View.ANISOTROPY_MAIN_VIEW) private val anisotropyMainViewProvider: Provider, + @Named(Name.File.EXP) private val expFileChooser: FileChooser, + @Named(Name.File.MOD) private val modFileChooser: FileChooser, + @Named(Name.File.JSON) private val jsonFileChooser: FileChooser, + @Named(Name.SAVE) private val saveDialogProvider: Provider>, private val picketObservable: ObservableObjectValue, private val picketIndexProperty: IntegerProperty, private val observableSection: ObservableSection, @@ -73,7 +73,7 @@ class MainViewController @Inject constructor( private val validator: Validator, private val preferences: Preferences, private val decimalFormat: DecimalFormat, - @FXML private val fxPreferences: FXPreferences, + private val fxPreferences: FXPreferences, private val inverseSolver: InverseSolver ) : AbstractController(), FileImporter, FileOpener { @@ -337,7 +337,7 @@ class MainViewController @Inject constructor( onCloseRequest = EventHandler { menuViewSectionInSeparateWindow.isSelected = false } prepareToSeparateSection() scene = Scene(sectionBox).apply { - stylesheets += stylesheet + stylesheets += Style.COMMON_STYLESHEET } }.show() } else { @@ -679,7 +679,7 @@ class MainViewController @Inject constructor( Stage().apply { title = "Добавить измерение" initOwner(this@MainViewController.stage) - addExperimentalData.stylesheets += stylesheet + addExperimentalData.stylesheets += Style.COMMON_STYLESHEET scene = Scene(addExperimentalData) isResizable = false }.show() diff --git a/src/main/java/ru/nucodelabs/gem/view/controller/tables/ExperimentalTableController.kt b/src/main/java/ru/nucodelabs/gem/view/controller/tables/ExperimentalTableController.kt index 60100348..094d7edd 100644 --- a/src/main/java/ru/nucodelabs/gem/view/controller/tables/ExperimentalTableController.kt +++ b/src/main/java/ru/nucodelabs/gem/view/controller/tables/ExperimentalTableController.kt @@ -1,6 +1,5 @@ package ru.nucodelabs.gem.view.controller.tables -import com.google.inject.name.Named import jakarta.inject.Inject import jakarta.inject.Provider import jakarta.validation.Validator @@ -20,7 +19,7 @@ import javafx.scene.input.KeyEvent import javafx.stage.Stage import javafx.util.Callback import javafx.util.StringConverter -import ru.nucodelabs.gem.config.ArgNames +import ru.nucodelabs.gem.config.Style import ru.nucodelabs.gem.fxmodel.ves.ObservableExperimentalData import ru.nucodelabs.gem.fxmodel.ves.ObservableSection import ru.nucodelabs.gem.fxmodel.ves.mapper.VesFxModelMapper @@ -73,7 +72,6 @@ class ExperimentalTableController @Inject constructor( private val alertsFactory: AlertsFactory, private val doubleStringConverter: StringConverter, private val decimalFormat: DecimalFormat, - @Named(ArgNames.CSS) private val css: String, fileImporterProvider: Provider, private val mapper: VesFxModelMapper ) : AbstractController(), FileImporter by fileImporterProvider.get() { @@ -227,7 +225,7 @@ class ExperimentalTableController @Inject constructor( MenuItem("Установить погрешность").apply { val dialog = TextInputDialog().apply { initOwner(stage) - stylesheets += css + stylesheets += Style.COMMON_STYLESHEET headerText = "Введите значение погрешности [%]" contentText = "δρₐ = " editor.also { tf -> diff --git a/src/main/resources/ru/nucodelabs/gem/view/common.css b/src/main/resources/css/common.css similarity index 100% rename from src/main/resources/ru/nucodelabs/gem/view/common.css rename to src/main/resources/css/common.css diff --git a/src/main/resources/img/ui_icons/add/1x/round_add_black_24dp.png b/src/main/resources/img/ui_icons/add/1x/round_add_black_24dp.png deleted file mode 100644 index a77cfcd943fa2be37ba49027ef9c671cdb42e4a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1bx#+^5R22v2@*4YH0#rSp2Q`Z{L3eP;`noFW`}?x$1Bgz2Ch*~9#=oLnCy3%{A@*F0|Ud)BFQ;E TzNIUGMlpE0`njxgN@xNA7W*h% diff --git a/src/main/resources/img/ui_icons/arrow_right/1x/round_chevron_right_black_24dp.png b/src/main/resources/img/ui_icons/arrow_right/1x/round_chevron_right_black_24dp.png deleted file mode 100644 index e1cf86cbd0f7b27b7f9a12bc19bf1f4e158b0a8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1TTd6q5R22v2@T&c7I70=kmqVG=fZBCM?_2=633^M=)RK4yj9%+>T`YTfoD>@cgTcvzmFo Q4$vS5Pgg&ebxsLQ0J$zEs{jB1 diff --git a/src/main/resources/img/ui_icons/backspace/1x/round_backspace_black_24dp.png b/src/main/resources/img/ui_icons/backspace/1x/round_backspace_black_24dp.png deleted file mode 100644 index f8d61c528c00bb9c0c467696bb53fe4f0539529e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+i#hxyXAr_~T6C|!2nD$WbaQ&VS zhRy6wJ2eh#Go5n$An0^hOKD28f=G+d%0KpJEcGY0yfZXWwtO!-p`1UKc~$YOMkT8N zc|Ec zi8ysbgO-WUG6f=h6(XW9m@cs5Hh%OjS*_RL(j>NJn>#KjxMh7(vt;I#VqloQ(}z8& S;ZHTtxeT7JelF{r5}E+ll}w8O diff --git a/src/main/resources/img/ui_icons/bolt/1x/round_bolt_black_24dp.png b/src/main/resources/img/ui_icons/bolt/1x/round_bolt_black_24dp.png deleted file mode 100644 index a06a83dcde51d1438adbf914f6188f26db4b5bea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+i37#&FAr_~T6C|7tOns=Lc`8z3 z-GpU|-4E>#2R)j~ZLo(eD?=sDSw7%reOpA*)YV3RSh6>$gdKL<@aaE~(h<$_Hm&x9 z?LVd(8^<_Zp3oofEH&%XYo0YfOz${ee&9RDzGcCwasg?-w1lVoCAV~36=1z)F!RTZ zbkQetz5F?>f@GX;n?Qi0;gUvSTA-q4_K+<0dyOKr>mdKI;Vst08(mC Aq5uE@ diff --git a/src/main/resources/ru/nucodelabs/gem/view/controller/anisotropy/main/AnisotropyMainView.fxml b/src/main/resources/ru/nucodelabs/gem/view/controller/anisotropy/main/AnisotropyMainView.fxml index b049ad95..093fc956 100644 --- a/src/main/resources/ru/nucodelabs/gem/view/controller/anisotropy/main/AnisotropyMainView.fxml +++ b/src/main/resources/ru/nucodelabs/gem/view/controller/anisotropy/main/AnisotropyMainView.fxml @@ -8,7 +8,7 @@ xmlns="http://javafx.com/javafx" fx:controller="ru.nucodelabs.gem.view.controller.anisotropy.main.AnisotropyMainViewController" maxHeight="Infinity" maxWidth="Infinity" - stylesheets="@../../../common.css, @AnisotropyMainView.css, @../../../controller/charts/VesCurves.css" + stylesheets="/css/common.css, @AnisotropyMainView.css, @../../../controller/charts/VesCurves.css" prefWidth="1280" prefHeight="720" fx:id="root"> diff --git a/src/main/resources/ru/nucodelabs/gem/view/controller/charts/ColorAxis.fxml b/src/main/resources/ru/nucodelabs/gem/view/controller/charts/ColorAxis.fxml index d5d009c1..d714cfbe 100644 --- a/src/main/resources/ru/nucodelabs/gem/view/controller/charts/ColorAxis.fxml +++ b/src/main/resources/ru/nucodelabs/gem/view/controller/charts/ColorAxis.fxml @@ -17,7 +17,7 @@ - +