From 907069bf4bed04469dcf0ab84500e3089cae8966 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sat, 15 Apr 2023 14:18:44 +0300 Subject: [PATCH 01/72] \added materialfx dialogs and fixed some bugs --- src/main/kotlin/solve/importer/ProjectParser.kt | 1 + src/main/kotlin/solve/importer/view/LoadingScreen.kt | 1 - src/main/kotlin/solve/importer/view/ProjectTreeView.kt | 5 ++++- src/main/kotlin/solve/menubar/view/MenuBarView.kt | 1 + src/main/kotlin/solve/styles/Style.kt | 3 +++ src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt | 3 ++- src/main/kotlin/solve/utils/ImporterUtils.kt | 2 +- 7 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/solve/importer/ProjectParser.kt b/src/main/kotlin/solve/importer/ProjectParser.kt index 8cfa155ae..9e780c8ff 100644 --- a/src/main/kotlin/solve/importer/ProjectParser.kt +++ b/src/main/kotlin/solve/importer/ProjectParser.kt @@ -178,6 +178,7 @@ object ProjectParser { if (!isImagesExist) { createAlertForError("The images folder is missing in the directory") return null + } images.map { img -> diff --git a/src/main/kotlin/solve/importer/view/LoadingScreen.kt b/src/main/kotlin/solve/importer/view/LoadingScreen.kt index caf7c601c..eadec0151 100644 --- a/src/main/kotlin/solve/importer/view/LoadingScreen.kt +++ b/src/main/kotlin/solve/importer/view/LoadingScreen.kt @@ -16,7 +16,6 @@ class LoadingScreen : View("Loading") { private val primaryColor: Color = Color.valueOf(Style.PrimaryColor) private val controlPanel: ControlPanel by inject() - private val progressSpinner = MFXProgressSpinner().apply { color1 = primaryColor color2 = primaryColor diff --git a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt index 4bbf23c2a..98766a330 100644 --- a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt +++ b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt @@ -7,6 +7,7 @@ import javafx.scene.control.TreeTableColumn import javafx.scene.control.cell.TreeItemPropertyValueFactory import javafx.scene.image.ImageView import javafx.scene.layout.BorderPane +import javafx.scene.text.Font import solve.constants.IconsImporterDescriptionPath import solve.constants.IconsImporterErrorFilePath import solve.constants.IconsImporterErrorFolderPath @@ -107,7 +108,9 @@ open class ProjectTreeView : View() { item?.errors?.toStringWithoutBrackets() } if (!empty && text.isNotEmpty()) { - tooltip(text) + tooltip(text).apply { + style = "-fx-font-family: ${Style.font}; -fx-font-size: ${Style.tooltipFontSize}; -fx-background-color: #${Style.surfaceColor}; -fx-text-fill: #707070;" + } } } } diff --git a/src/main/kotlin/solve/menubar/view/MenuBarView.kt b/src/main/kotlin/solve/menubar/view/MenuBarView.kt index 9193a6d92..90703c902 100644 --- a/src/main/kotlin/solve/menubar/view/MenuBarView.kt +++ b/src/main/kotlin/solve/menubar/view/MenuBarView.kt @@ -35,6 +35,7 @@ class MenuBarView : View() { button("Manage plugins") { } button("Settings") { + } button("Help") { } diff --git a/src/main/kotlin/solve/styles/Style.kt b/src/main/kotlin/solve/styles/Style.kt index 5398663df..c5b9a3a00 100644 --- a/src/main/kotlin/solve/styles/Style.kt +++ b/src/main/kotlin/solve/styles/Style.kt @@ -33,6 +33,9 @@ object Style { const val Font = "Roboto" + const val headerFontSize = "20px" + + const val ListFontColor = "3E4345" const val HeaderFontColor = "1A1A1A" diff --git a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt index 4ed784c5a..0c42ca11a 100644 --- a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt @@ -71,5 +71,6 @@ class TreeTableViewStylesheet : Stylesheet() { minHeight = 0.px } } + } -} +} \ No newline at end of file diff --git a/src/main/kotlin/solve/utils/ImporterUtils.kt b/src/main/kotlin/solve/utils/ImporterUtils.kt index 29a3a4975..e20195baf 100644 --- a/src/main/kotlin/solve/utils/ImporterUtils.kt +++ b/src/main/kotlin/solve/utils/ImporterUtils.kt @@ -21,4 +21,4 @@ fun createAlertForError(content: String) { fun List.toStringWithoutBrackets(): String { return this.toString().replace("[", "").replace("]", "") -} +} \ No newline at end of file From d8992978eb0c643790eaea5e692da26f6fe3f39a Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sat, 15 Apr 2023 14:21:04 +0300 Subject: [PATCH 02/72] removed commented code --- .../kotlin/solve/menubar/view/MenuBarView.kt | 1 - src/main/kotlin/solve/utils/ImporterUtils.kt | 39 ++++++++++++------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/solve/menubar/view/MenuBarView.kt b/src/main/kotlin/solve/menubar/view/MenuBarView.kt index 90703c902..9193a6d92 100644 --- a/src/main/kotlin/solve/menubar/view/MenuBarView.kt +++ b/src/main/kotlin/solve/menubar/view/MenuBarView.kt @@ -35,7 +35,6 @@ class MenuBarView : View() { button("Manage plugins") { } button("Settings") { - } button("Help") { } diff --git a/src/main/kotlin/solve/utils/ImporterUtils.kt b/src/main/kotlin/solve/utils/ImporterUtils.kt index e20195baf..f611e086b 100644 --- a/src/main/kotlin/solve/utils/ImporterUtils.kt +++ b/src/main/kotlin/solve/utils/ImporterUtils.kt @@ -1,20 +1,31 @@ package solve.utils import solve.importer.view.AlertDialog -import solve.importer.view.DirectoryPathView -import solve.utils.materialfx.MaterialFXDialog -import tornadofx.FX.Companion.find - -fun createAlertForError(content: String) { - val container = MaterialFXDialog.createGenericDialog(AlertDialog(content).root) - - val dialog = MaterialFXDialog.createStageDialog( - container, - find().currentStage, - find().root - ).apply { - isDraggable = false - } +import io.github.palexdev.materialfx.dialogs.MFXGenericDialogBuilder +import io.github.palexdev.materialfx.enums.ScrimPriority +import javafx.stage.Modality +import javafx.stage.Window + + +fun createAlertForError(content: String, owner: Window) { + var container = AlertDialog(content) + + val dialogContent = MFXGenericDialogBuilder.build() + .setContent(container.root) + .setShowMinimize(false) + .setShowAlwaysOnTop(false) + .setShowClose(false) + .get() + + + val dialog = MFXGenericDialogBuilder.build(dialogContent) + .toStageDialogBuilder() + .initOwner(owner) + .initModality(Modality.APPLICATION_MODAL) + .setDraggable(true) + .setScrimPriority(ScrimPriority.WINDOW) + .setScrimOwner(true) + .get() dialog.show() } From d8cd2ffc5af5fdb8b3004c3cbb9c2f9191d4ee13 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Fri, 21 Apr 2023 23:36:01 +0300 Subject: [PATCH 03/72] added new style constants --- src/main/kotlin/solve/styles/Style.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/kotlin/solve/styles/Style.kt b/src/main/kotlin/solve/styles/Style.kt index c5b9a3a00..fc365ef56 100644 --- a/src/main/kotlin/solve/styles/Style.kt +++ b/src/main/kotlin/solve/styles/Style.kt @@ -6,6 +6,7 @@ import javafx.scene.control.ToggleButton import javafx.scene.shape.Circle import tornadofx.* + object Style { const val BackgroundColor = "EFF0F0" @@ -33,9 +34,6 @@ object Style { const val Font = "Roboto" - const val headerFontSize = "20px" - - const val ListFontColor = "3E4345" const val HeaderFontColor = "1A1A1A" From d6f3da0ab28f854dfc550223c4b7311e2fa48630 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Fri, 21 Apr 2023 23:55:50 +0300 Subject: [PATCH 04/72] added panels --- .../solve/importer/view/ControlPanel.kt | 11 +++ src/main/kotlin/solve/main/MainView.kt | 2 +- .../kotlin/solve/sidepanel/LeftPanelView.kt | 89 +++++++++++++++++++ src/main/kotlin/solve/utils/ImporterUtils.kt | 13 +++ 4 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/solve/sidepanel/LeftPanelView.kt diff --git a/src/main/kotlin/solve/importer/view/ControlPanel.kt b/src/main/kotlin/solve/importer/view/ControlPanel.kt index 13ccecc9c..64abc2bb3 100644 --- a/src/main/kotlin/solve/importer/view/ControlPanel.kt +++ b/src/main/kotlin/solve/importer/view/ControlPanel.kt @@ -168,6 +168,7 @@ class ControlPanel : View() { MaterialFXDialog.changeContent(mainView.content, loading.root) } +<<<<<<< HEAD private fun importAction(button: MFXButton) { coroutineScope = CoroutineScope(Dispatchers.Main) coroutineScope.launch { @@ -182,6 +183,16 @@ class ControlPanel : View() { } catch (e: Exception) { createAlertForError("Visualization error") } +======= + private fun importAction(button: MFXButton, projectVal: Project) { + try { + mainController.visualizeProject(projectVal.layers, projectVal.frames) + mainController.displayCatalogueFrames(projectVal.frames) + button.isDisable = true + menuBarView.dialog.close() + } catch (e: Exception) { + createAlertForError("Visualization error") +>>>>>>> 8e28c04 (added panels) } } diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 54dec7568..3c7f651c5 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -15,6 +15,7 @@ import javafx.scene.input.KeyCombination import javafx.scene.layout.VBox import javafx.scene.shape.Circle import solve.catalogue.view.CatalogueView +import solve.settings.grid.view.GridSettingsView import solve.constants.IconsHelp import solve.constants.IconsImportFab import solve.constants.IconsPlugins @@ -24,7 +25,6 @@ import solve.importer.view.ImporterView import solve.main.splitpane.SidePanelLocation import solve.main.splitpane.SidePanelSplitPane import solve.scene.view.SceneView -import solve.settings.grid.view.GridSettingsView import solve.settings.visualization.VisualizationSettingsView import solve.sidepanel.SidePanelTab import solve.sidepanel.content.SidePanelContentView diff --git a/src/main/kotlin/solve/sidepanel/LeftPanelView.kt b/src/main/kotlin/solve/sidepanel/LeftPanelView.kt new file mode 100644 index 000000000..0b840ff68 --- /dev/null +++ b/src/main/kotlin/solve/sidepanel/LeftPanelView.kt @@ -0,0 +1,89 @@ +package solve.sidepanel + +import io.github.palexdev.materialfx.dialogs.MFXGenericDialog +import io.github.palexdev.materialfx.dialogs.MFXStageDialog +import javafx.geometry.Insets +import solve.constants.* +import solve.importer.controller.ImporterController +import solve.importer.view.ImporterView +import solve.main.MainView +import solve.utils.* +import tornadofx.* + +class LeftPanelView : View() { + + val importer = find() + + var content = MFXGenericDialog() + var dialog = MFXStageDialog() + + val controller: ImporterController by inject() + +// private val importIcon = loadResourcesImage(IconsImportFAB) +// private val projectIcon = loadResourcesImage(IconsProject) +// private val pluginsIcon = loadResourcesImage(IconsPlugins) +// private val settingsIcon = loadResourcesImage(IconsSettings) +// private val helpIcon = loadResourcesImage(IconsHelp) + + + + override val root = vbox(7) { + +// addStylesheet(MFXButtonStyleSheet::class) +// +// prefWidth = navigationRailSize +// +// style = "-fx-background-color: ${Style.surfaceColor}" +// stylesheets.add("https://fonts.googleapis.com/css2?family=Roboto+Condensed") +// stylesheets.add("https://fonts.googleapis.com/css2?family=Roboto+Condensed:wght@700") +// stylesheets.add("https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700;900") +// +// +// +// +//// label("SOLVE"){ +//// style = "-fx-font-family: ${Style.font}; -fx-font-weight:700; -fx-font-size: 18px" +//// VBox.setMargin(this, Insets(12.0, 6.0,0.0,6.0)) +//// +//// +//// } +// add(importFAB) +//// add(leftSidePanelViews.tabsView.root) +// +// +//// add(projectButton) +//// add(pluginsButton) +//// add(settingsButton) +//// add(helpButton) +// +// +//// button("Import project") { +//// action { +//// controller.directoryPath.set(null) +//// controller.projectAfterPartialParsing.set(null) +//// content = MaterialFXDialog.createGenericDialog(ImporterView().root) +//// dialog = MaterialFXDialog.createStageDialog(content, find().currentStage, find().root) +//// dialog.show() +//// content.padding = Insets(0.0,0.0,10.0,0.0) +//// } +//// } +//// button("Manage plugins") { +//// } +//// button("Settings") { +//// } +//// button("Help") { +//// } + } + + + + fun importAction(){ + controller.directoryPath.set(null) + controller.projectAfterPartialParsing.set(null) + content = MaterialFXDialog.createGenericDialog(ImporterView().root) + dialog = MaterialFXDialog.createStageDialog(content, find().currentStage, find().root) + dialog.show() + content.padding = Insets(0.0,0.0,10.0,0.0) + } + +} diff --git a/src/main/kotlin/solve/utils/ImporterUtils.kt b/src/main/kotlin/solve/utils/ImporterUtils.kt index f611e086b..043c2efd8 100644 --- a/src/main/kotlin/solve/utils/ImporterUtils.kt +++ b/src/main/kotlin/solve/utils/ImporterUtils.kt @@ -1,12 +1,20 @@ package solve.utils +<<<<<<< HEAD import solve.importer.view.AlertDialog import io.github.palexdev.materialfx.dialogs.MFXGenericDialogBuilder import io.github.palexdev.materialfx.enums.ScrimPriority import javafx.stage.Modality import javafx.stage.Window +======= +import solve.importer.view.* +import tornadofx.FX.Companion.find +>>>>>>> 8e28c04 (added panels) +fun createAlertForError(content: String) { + val container = MaterialFXDialog.createGenericDialog(AlertDialog(content).root) +<<<<<<< HEAD fun createAlertForError(content: String, owner: Window) { var container = AlertDialog(content) @@ -26,6 +34,11 @@ fun createAlertForError(content: String, owner: Window) { .setScrimPriority(ScrimPriority.WINDOW) .setScrimOwner(true) .get() +======= + val dialog = MaterialFXDialog.createStageDialog(container, find().currentStage, find().root ).apply { + isDraggable = false + } +>>>>>>> 8e28c04 (added panels) dialog.show() } From 92dbf3a8c39b57efd50a740954ee068cf9dd9a90 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Fri, 21 Apr 2023 23:56:21 +0300 Subject: [PATCH 05/72] removed unused --- src/main/kotlin/solve/main/MainView.kt | 10 ++++++++++ src/main/kotlin/solve/sidepanel/LeftPanelView.kt | 1 - 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 3c7f651c5..0167ecd54 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -43,7 +43,17 @@ class MainView : View() { private val mainView: MainView by inject() +<<<<<<< HEAD val controller: ImporterController by inject() +======= + private val importIcon = loadResourcesImage(IconsImportFAB) + private val pluginsIcon = loadResourcesImage(IconsPlugins) + private val settingsIcon = loadResourcesImage(IconsSettings) + private val helpIcon = loadResourcesImage(IconsHelp) + private val layersIcon = loadResourcesImage(IconsLayers) + private val gridIcon = loadResourcesImage(IconsGrid) + } +>>>>>>> 44262de (removed unused) private val sceneView: SceneView by inject() diff --git a/src/main/kotlin/solve/sidepanel/LeftPanelView.kt b/src/main/kotlin/solve/sidepanel/LeftPanelView.kt index 0b840ff68..99b480d0e 100644 --- a/src/main/kotlin/solve/sidepanel/LeftPanelView.kt +++ b/src/main/kotlin/solve/sidepanel/LeftPanelView.kt @@ -3,7 +3,6 @@ package solve.sidepanel import io.github.palexdev.materialfx.dialogs.MFXGenericDialog import io.github.palexdev.materialfx.dialogs.MFXStageDialog import javafx.geometry.Insets -import solve.constants.* import solve.importer.controller.ImporterController import solve.importer.view.ImporterView import solve.main.MainView From 5bf682cdb133581735637519abc9cd0ce08f6213 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 23 Apr 2023 12:58:01 +0300 Subject: [PATCH 06/72] added borderpane and spaces --- src/main/kotlin/solve/main/MainView.kt | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 0167ecd54..3c7f651c5 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -43,17 +43,7 @@ class MainView : View() { private val mainView: MainView by inject() -<<<<<<< HEAD val controller: ImporterController by inject() -======= - private val importIcon = loadResourcesImage(IconsImportFAB) - private val pluginsIcon = loadResourcesImage(IconsPlugins) - private val settingsIcon = loadResourcesImage(IconsSettings) - private val helpIcon = loadResourcesImage(IconsHelp) - private val layersIcon = loadResourcesImage(IconsLayers) - private val gridIcon = loadResourcesImage(IconsGrid) - } ->>>>>>> 44262de (removed unused) private val sceneView: SceneView by inject() From 50fc61abe0fe5e3a06e196c85e11dfac1b7f40b5 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 23 Apr 2023 12:58:46 +0300 Subject: [PATCH 07/72] added importAction --- src/main/kotlin/solve/main/MainView.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 3c7f651c5..ca889f9bd 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -36,6 +36,7 @@ import solve.utils.createPxBox import solve.utils.loadResourcesImage import solve.utils.materialfx.MaterialFXDialog import solve.utils.materialfx.mfxButton +import solve.utils.mfxButton import tornadofx.* class MainView : View() { From 8173d442acc764a980f8ce985f8c50e10cd8a819 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Wed, 26 Apr 2023 10:14:00 +0300 Subject: [PATCH 08/72] spaces and added paddingAll --- src/main/kotlin/solve/main/MainView.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index ca889f9bd..8c2f6f968 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -32,6 +32,7 @@ import solve.sidepanel.tabs.SidePanelTabsView import solve.styles.MFXButtonStyleSheet import solve.styles.Style import solve.styles.TooltipStyle +import solve.utils.MaterialFXDialog import solve.utils.createPxBox import solve.utils.loadResourcesImage import solve.utils.materialfx.MaterialFXDialog From 8b475032fbeb2a59673628156ba38075f910d9db Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Wed, 26 Apr 2023 13:10:06 +0300 Subject: [PATCH 09/72] fixes --- .../solve/importer/view/LoadingScreen.kt | 2 + src/main/kotlin/solve/main/MainView.kt | 1 - src/main/kotlin/solve/utils/ImporterUtils.kt | 39 ++++--------------- 3 files changed, 9 insertions(+), 33 deletions(-) diff --git a/src/main/kotlin/solve/importer/view/LoadingScreen.kt b/src/main/kotlin/solve/importer/view/LoadingScreen.kt index eadec0151..b230022f0 100644 --- a/src/main/kotlin/solve/importer/view/LoadingScreen.kt +++ b/src/main/kotlin/solve/importer/view/LoadingScreen.kt @@ -16,6 +16,7 @@ class LoadingScreen : View("Loading") { private val primaryColor: Color = Color.valueOf(Style.PrimaryColor) private val controlPanel: ControlPanel by inject() + private val progressSpinner = MFXProgressSpinner().apply { color1 = primaryColor color2 = primaryColor @@ -34,6 +35,7 @@ class LoadingScreen : View("Loading") { } } center { + vbox(15) { BorderPane.setMargin(this, Insets(200.0, 0.0, 0.0, 170.0)) add( diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 8c2f6f968..ca889f9bd 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -32,7 +32,6 @@ import solve.sidepanel.tabs.SidePanelTabsView import solve.styles.MFXButtonStyleSheet import solve.styles.Style import solve.styles.TooltipStyle -import solve.utils.MaterialFXDialog import solve.utils.createPxBox import solve.utils.loadResourcesImage import solve.utils.materialfx.MaterialFXDialog diff --git a/src/main/kotlin/solve/utils/ImporterUtils.kt b/src/main/kotlin/solve/utils/ImporterUtils.kt index 043c2efd8..8f030edf2 100644 --- a/src/main/kotlin/solve/utils/ImporterUtils.kt +++ b/src/main/kotlin/solve/utils/ImporterUtils.kt @@ -1,48 +1,23 @@ package solve.utils -<<<<<<< HEAD import solve.importer.view.AlertDialog -import io.github.palexdev.materialfx.dialogs.MFXGenericDialogBuilder -import io.github.palexdev.materialfx.enums.ScrimPriority -import javafx.stage.Modality -import javafx.stage.Window -======= -import solve.importer.view.* +import solve.importer.view.DirectoryPathView import tornadofx.FX.Companion.find ->>>>>>> 8e28c04 (added panels) fun createAlertForError(content: String) { val container = MaterialFXDialog.createGenericDialog(AlertDialog(content).root) -<<<<<<< HEAD -fun createAlertForError(content: String, owner: Window) { - var container = AlertDialog(content) - - val dialogContent = MFXGenericDialogBuilder.build() - .setContent(container.root) - .setShowMinimize(false) - .setShowAlwaysOnTop(false) - .setShowClose(false) - .get() - - - val dialog = MFXGenericDialogBuilder.build(dialogContent) - .toStageDialogBuilder() - .initOwner(owner) - .initModality(Modality.APPLICATION_MODAL) - .setDraggable(true) - .setScrimPriority(ScrimPriority.WINDOW) - .setScrimOwner(true) - .get() -======= - val dialog = MaterialFXDialog.createStageDialog(container, find().currentStage, find().root ).apply { + val dialog = MaterialFXDialog.createStageDialog( + container, + find().currentStage, + find().root + ).apply { isDraggable = false } ->>>>>>> 8e28c04 (added panels) dialog.show() } fun List.toStringWithoutBrackets(): String { return this.toString().replace("[", "").replace("]", "") -} \ No newline at end of file +} From 642865eda257b6c95b24843b16f5895f68efa20f Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Wed, 26 Apr 2023 13:11:00 +0300 Subject: [PATCH 10/72] removed unused --- src/main/kotlin/solve/importer/view/ControlPanel.kt | 11 ----------- .../kotlin/solve/importer/view/ProjectTreeView.kt | 1 - 2 files changed, 12 deletions(-) diff --git a/src/main/kotlin/solve/importer/view/ControlPanel.kt b/src/main/kotlin/solve/importer/view/ControlPanel.kt index 64abc2bb3..13ccecc9c 100644 --- a/src/main/kotlin/solve/importer/view/ControlPanel.kt +++ b/src/main/kotlin/solve/importer/view/ControlPanel.kt @@ -168,7 +168,6 @@ class ControlPanel : View() { MaterialFXDialog.changeContent(mainView.content, loading.root) } -<<<<<<< HEAD private fun importAction(button: MFXButton) { coroutineScope = CoroutineScope(Dispatchers.Main) coroutineScope.launch { @@ -183,16 +182,6 @@ class ControlPanel : View() { } catch (e: Exception) { createAlertForError("Visualization error") } -======= - private fun importAction(button: MFXButton, projectVal: Project) { - try { - mainController.visualizeProject(projectVal.layers, projectVal.frames) - mainController.displayCatalogueFrames(projectVal.frames) - button.isDisable = true - menuBarView.dialog.close() - } catch (e: Exception) { - createAlertForError("Visualization error") ->>>>>>> 8e28c04 (added panels) } } diff --git a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt index 98766a330..5ba3b8c4c 100644 --- a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt +++ b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt @@ -7,7 +7,6 @@ import javafx.scene.control.TreeTableColumn import javafx.scene.control.cell.TreeItemPropertyValueFactory import javafx.scene.image.ImageView import javafx.scene.layout.BorderPane -import javafx.scene.text.Font import solve.constants.IconsImporterDescriptionPath import solve.constants.IconsImporterErrorFilePath import solve.constants.IconsImporterErrorFolderPath From c4726fd3364db3cf62a53d19713bb8c38f85916a Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Wed, 26 Apr 2023 14:40:12 +0300 Subject: [PATCH 11/72] added grid tab --- src/main/kotlin/solve/main/MainView.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index ca889f9bd..54973427f 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -117,6 +117,10 @@ class MainView : View() { addStylesheet(MFXButtonStyleSheet::class) style = "-fx-background-color: #${Style.SurfaceColor}" add(rightSidePanelViews.tabsView.root) +<<<<<<< HEAD +======= +// add(gridButton) +>>>>>>> 142531b (added grid tab) } private val mainViewBorderPane = borderpane { From b054f53bc3121bd174e3efce8b098867d784c48e Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Wed, 26 Apr 2023 14:43:37 +0300 Subject: [PATCH 12/72] removed grid button --- src/main/kotlin/solve/main/MainView.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 54973427f..94480b9d7 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -36,7 +36,6 @@ import solve.utils.createPxBox import solve.utils.loadResourcesImage import solve.utils.materialfx.MaterialFXDialog import solve.utils.materialfx.mfxButton -import solve.utils.mfxButton import tornadofx.* class MainView : View() { @@ -117,10 +116,6 @@ class MainView : View() { addStylesheet(MFXButtonStyleSheet::class) style = "-fx-background-color: #${Style.SurfaceColor}" add(rightSidePanelViews.tabsView.root) -<<<<<<< HEAD -======= -// add(gridButton) ->>>>>>> 142531b (added grid tab) } private val mainViewBorderPane = borderpane { @@ -247,4 +242,4 @@ class MainSplitPaneStyle : Stylesheet() { } } } -} +} \ No newline at end of file From 75133acbf082687b492486fd60d82bd50a1a6629 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Wed, 26 Apr 2023 14:44:06 +0300 Subject: [PATCH 13/72] removed unused --- src/main/kotlin/solve/main/MainView.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 94480b9d7..562e4e09b 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -39,6 +39,23 @@ import solve.utils.materialfx.mfxButton import tornadofx.* class MainView : View() { +<<<<<<< HEAD +======= + companion object { + private const val LeftSidePanelAndSceneDividerPosition = 0.25 + private const val RightSidePanelAndSceneDividerPosition = 0.88 + + private const val TabsViewLocationParamName = "location" + private const val TabsViewTabsParamName = "tabs" + private const val TabsViewInitialTabParamName = "initialTab" + + private val importIcon = loadResourcesImage(IconsImportFAB) + private val pluginsIcon = loadResourcesImage(IconsPlugins) + private val settingsIcon = loadResourcesImage(IconsSettings) + private val helpIcon = loadResourcesImage(IconsHelp) + } + +>>>>>>> 200e295 (removed unused) val importer: ImporterView by inject() private val mainView: MainView by inject() From 1f4415566374ab47783d40160bd413d6b580e0c4 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Wed, 26 Apr 2023 14:50:42 +0300 Subject: [PATCH 14/72] added correct icons --- src/main/kotlin/solve/main/MainView.kt | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 562e4e09b..8dd1c1d47 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -36,26 +36,10 @@ import solve.utils.createPxBox import solve.utils.loadResourcesImage import solve.utils.materialfx.MaterialFXDialog import solve.utils.materialfx.mfxButton +import solve.utils.mfxButton import tornadofx.* class MainView : View() { -<<<<<<< HEAD -======= - companion object { - private const val LeftSidePanelAndSceneDividerPosition = 0.25 - private const val RightSidePanelAndSceneDividerPosition = 0.88 - - private const val TabsViewLocationParamName = "location" - private const val TabsViewTabsParamName = "tabs" - private const val TabsViewInitialTabParamName = "initialTab" - - private val importIcon = loadResourcesImage(IconsImportFAB) - private val pluginsIcon = loadResourcesImage(IconsPlugins) - private val settingsIcon = loadResourcesImage(IconsSettings) - private val helpIcon = loadResourcesImage(IconsHelp) - } - ->>>>>>> 200e295 (removed unused) val importer: ImporterView by inject() private val mainView: MainView by inject() From 9176b58f883fa201e14831be1ddb0ca41b622aef Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Wed, 26 Apr 2023 16:46:54 +0300 Subject: [PATCH 15/72] by inject() --- src/main/kotlin/solve/main/MainView.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 8dd1c1d47..6f3bc5816 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -32,6 +32,7 @@ import solve.sidepanel.tabs.SidePanelTabsView import solve.styles.MFXButtonStyleSheet import solve.styles.Style import solve.styles.TooltipStyle +import solve.utils.MaterialFXDialog import solve.utils.createPxBox import solve.utils.loadResourcesImage import solve.utils.materialfx.MaterialFXDialog From 222fe0c1613daf0f0fcf1f48bc4a287a220a9e4a Mon Sep 17 00:00:00 2001 From: Stanislav Mishchenko Date: Fri, 28 Apr 2023 22:52:57 +0300 Subject: [PATCH 16/72] Just an automaticly formatted codestyle --- .../view/fields/CatalogueFieldsView.kt | 8 +++ src/main/kotlin/solve/main/MainView.kt | 1 - src/main/kotlin/solve/scene/SceneFacade.kt | 1 + .../scene/view/DelayedFrameUpdatesManager.kt | 24 +++++++ src/main/kotlin/solve/scene/view/FrameView.kt | 1 + .../kotlin/solve/scene/view/FrameViewCache.kt | 24 +++++++ src/main/kotlin/solve/scene/view/SceneView.kt | 36 ++++++++++ .../scene/view/landmarks/KeypointView.kt | 5 ++ .../solve/scene/view/landmarks/LineView.kt | 10 +++ .../solve/scene/view/utils/AnimationUtils.kt | 69 +++++++++++++++++++ .../scene/view/virtualizedfx/VSPExtensions.kt | 6 ++ src/main/kotlin/solve/styles/Style.kt | 3 +- 12 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/solve/scene/view/DelayedFrameUpdatesManager.kt create mode 100644 src/main/kotlin/solve/scene/view/FrameViewCache.kt create mode 100644 src/main/kotlin/solve/scene/view/utils/AnimationUtils.kt diff --git a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt index 81bb9a614..8eb66c955 100644 --- a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt +++ b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt @@ -12,16 +12,24 @@ import javafx.scene.input.DragEvent import javafx.scene.input.TransferMode import javafx.scene.layout.Priority import javafx.scene.paint.Color +<<<<<<< HEAD +======= +import solve.catalogue.* +>>>>>>> 13f8702 (Just an automaticly formatted codestyle) import solve.catalogue.controller.CatalogueController import solve.catalogue.model.CatalogueField import solve.project.model.ProjectFrame import solve.scene.view.SceneView +<<<<<<< HEAD import solve.utils.deselectAllItems import solve.utils.floorToInt import solve.utils.onSelectionChanged import solve.utils.selectAllItems import solve.utils.selectedItems import solve.utils.selectedItemsCount +======= +import solve.utils.* +>>>>>>> 13f8702 (Just an automaticly formatted codestyle) import tornadofx.* import kotlin.math.min diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 6f3bc5816..d8acaaf81 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -61,7 +61,6 @@ class MainView : View() { "Ctrl+P" ) ) - private val rightSidePanelTabs = listOf( SidePanelTab( LayersTabName, diff --git a/src/main/kotlin/solve/scene/SceneFacade.kt b/src/main/kotlin/solve/scene/SceneFacade.kt index ad2c0d697..ac667a3eb 100644 --- a/src/main/kotlin/solve/scene/SceneFacade.kt +++ b/src/main/kotlin/solve/scene/SceneFacade.kt @@ -20,6 +20,7 @@ import solve.scene.model.LayerState import solve.scene.model.Scene import solve.scene.model.VisualizationFrame import tornadofx.find +import java.io.FileInputStream /** * Interaction interface of the scene to another parts of the application. diff --git a/src/main/kotlin/solve/scene/view/DelayedFrameUpdatesManager.kt b/src/main/kotlin/solve/scene/view/DelayedFrameUpdatesManager.kt new file mode 100644 index 000000000..c028493b5 --- /dev/null +++ b/src/main/kotlin/solve/scene/view/DelayedFrameUpdatesManager.kt @@ -0,0 +1,24 @@ +package solve.scene.view + +import solve.scene.model.VisualizationFrame + +object DelayedFrameUpdatesManager { + private val delayedUpdates = mutableMapOf() + + var shouldDelay = false + private set + + fun doLockedAction(action: () -> Unit) { + shouldDelay = true + action() + shouldDelay = false + delayedUpdates.forEach { (view, newFrame) -> + view.setFrame(newFrame) + } + delayedUpdates.clear() + } + + fun delayUpdate(view: FrameView, newFrame: VisualizationFrame?) { + delayedUpdates[view] = newFrame + } +} diff --git a/src/main/kotlin/solve/scene/view/FrameView.kt b/src/main/kotlin/solve/scene/view/FrameView.kt index fa26cb093..104299b5e 100644 --- a/src/main/kotlin/solve/scene/view/FrameView.kt +++ b/src/main/kotlin/solve/scene/view/FrameView.kt @@ -37,6 +37,7 @@ import solve.utils.materialfx.action import solve.utils.materialfx.item import solve.utils.materialfx.lineSeparator import solve.utils.materialfx.mfxContextMenu +import solve.utils.* import tornadofx.* import tornadofx.add import solve.utils.structures.Size as DoubleSize diff --git a/src/main/kotlin/solve/scene/view/FrameViewCache.kt b/src/main/kotlin/solve/scene/view/FrameViewCache.kt new file mode 100644 index 000000000..757a8c782 --- /dev/null +++ b/src/main/kotlin/solve/scene/view/FrameViewCache.kt @@ -0,0 +1,24 @@ +package solve.scene.view + +import solve.scene.model.VisualizationFrame +import solve.utils.structures.Size as DoubleSize + +interface FrameViewStorage { + fun store(frameView: FrameView) +} + +class FrameViewCache(val size: DoubleSize, val canvasBufferDepth: Int, private val factory: (VisualizationFrame?, FrameViewParameters) -> FrameView) : FrameViewStorage { + private val storage = mutableSetOf() + + fun get(frame: VisualizationFrame?, frameViewParameters: FrameViewParameters) = storage.firstOrNull()?.also { frameView -> + frameView.init(frame, frameViewParameters) + storage.remove(frameView) + } ?: factory(frame, frameViewParameters) + + override fun store(frameView: FrameView) { + if (frameView.size != size) { + throw IllegalArgumentException() + } + storage.add(frameView) + } +} diff --git a/src/main/kotlin/solve/scene/view/SceneView.kt b/src/main/kotlin/solve/scene/view/SceneView.kt index 9d3a20dc4..e896eb802 100644 --- a/src/main/kotlin/solve/scene/view/SceneView.kt +++ b/src/main/kotlin/solve/scene/view/SceneView.kt @@ -13,7 +13,10 @@ import solve.scene.model.VisualizationFrame import solve.scene.view.association.AssociationsManager import solve.scene.view.association.OutOfFramesLayer import solve.scene.view.virtualizedfx.VirtualizedFXGridProvider +<<<<<<< HEAD import solve.utils.Cache +======= +>>>>>>> 13f8702 (Just an automaticly formatted codestyle) import tornadofx.View import tornadofx.label import tornadofx.onChange @@ -68,18 +71,27 @@ class SceneView : View() { val columnsNumber = controller.columnsNumber val outOfFramesLayer = OutOfFramesLayer() +<<<<<<< HEAD val associationsManager = AssociationsManager( +======= + val associationsManager = AssociationsManager( +>>>>>>> 13f8702 (Just an automaticly formatted codestyle) frameSize, framesMargin, controller.scaleProperty, scene.frames, +<<<<<<< HEAD controller.installedColumnsNumberProperty, +======= + columnsNumber, +>>>>>>> 13f8702 (Just an automaticly formatted codestyle) outOfFramesLayer ) currentAssociationsManager = associationsManager val frameViewParameters = FrameViewParameters(frameDataLoadingScope, associationsManager, scene) +<<<<<<< HEAD // if frame size or canvas layers count is not equal frame drawer buffer can not be reused. val canReuseCache = frameViewCache?.parameters?.size == frameSize && frameViewCache?.parameters?.canvasDepth == scene.canvasLayersCount @@ -87,6 +99,26 @@ class SceneView : View() { val frameViewSettings = FrameViewSettings(frameSize, scene.canvasLayersCount) val validateFrameView: (FrameView) -> Boolean = { view -> view.size == frameViewSettings.size +======= + val canReuseCache = + frameViewCache?.size == frameSize && frameViewCache?.canvasBufferDepth == scene.canvasLayersCount + frameViewCache = if (canReuseCache) { + frameViewCache!! + } else { + FrameViewCache( + frameSize, + scene.canvasLayersCount + ) { frame, parameters -> + FrameView( + frameSize, + controller.scaleProperty, + frameViewCache!!, + scene.canvasLayersCount, + parameters, + frame + ) + } +>>>>>>> 13f8702 (Just an automaticly formatted codestyle) } // Frame view cache reduces memory allocations by reusing previously created frames with buffers. @@ -106,7 +138,11 @@ class SceneView : View() { } val grid = VirtualizedFXGridProvider.createGrid( +<<<<<<< HEAD scene.frames, +======= + frames, +>>>>>>> 13f8702 (Just an automaticly formatted codestyle) columnsNumber, gridCellSize, controller.scaleProperty, diff --git a/src/main/kotlin/solve/scene/view/landmarks/KeypointView.kt b/src/main/kotlin/solve/scene/view/landmarks/KeypointView.kt index 875ff47ae..c777c0d12 100644 --- a/src/main/kotlin/solve/scene/view/landmarks/KeypointView.kt +++ b/src/main/kotlin/solve/scene/view/landmarks/KeypointView.kt @@ -77,9 +77,14 @@ class KeypointView( * Plays highlighting animation. */ override fun highlightShape(duration: Duration) { +<<<<<<< HEAD val scaleTransition = animationProvider.createScaleTransition(node, HighlightingScaleFactor, HighlightingScaleFactor, duration) val fillTransition = animationProvider.createFillTransition( +======= + val scaleTransition = createScaleTransition(node, HighlightingScaleFactor, HighlightingScaleFactor, duration) + val fillTransition = createFillTransition( +>>>>>>> 13f8702 (Just an automaticly formatted codestyle) node, keypoint.layerSettings.getUniqueColor(keypoint), duration diff --git a/src/main/kotlin/solve/scene/view/landmarks/LineView.kt b/src/main/kotlin/solve/scene/view/landmarks/LineView.kt index 2007e9cef..615163799 100644 --- a/src/main/kotlin/solve/scene/view/landmarks/LineView.kt +++ b/src/main/kotlin/solve/scene/view/landmarks/LineView.kt @@ -82,8 +82,13 @@ class LineView( * Plays highlighting animation. */ override fun highlightShape(duration: Duration) { +<<<<<<< HEAD val scaleTransition = animationProvider.createWidthTransition(node, width, duration) val strokeTransition = animationProvider.createStrokeTransition( +======= + val scaleTransition = Timeline(KeyFrame(duration, KeyValue(node.strokeWidthProperty(), width))) + val strokeTransition = createStrokeTransition( +>>>>>>> 13f8702 (Just an automaticly formatted codestyle) node, line.layerSettings.getUniqueColor(line), duration @@ -100,8 +105,13 @@ class LineView( */ override fun unhighlightShape(duration: Duration) { val targetWidth = line.layerSettings.selectedWidth * (if (scale < 1) scale else 1.0) +<<<<<<< HEAD val scaleTransition = animationProvider.createWidthTransition(node, targetWidth, duration) val strokeTransition = animationProvider.createStrokeTransition( +======= + val scaleTransition = Timeline(KeyFrame(duration, KeyValue(node.strokeWidthProperty(), targetWidth))) + val strokeTransition = createStrokeTransition( +>>>>>>> 13f8702 (Just an automaticly formatted codestyle) node, line.layerSettings.getColor(line), duration diff --git a/src/main/kotlin/solve/scene/view/utils/AnimationUtils.kt b/src/main/kotlin/solve/scene/view/utils/AnimationUtils.kt new file mode 100644 index 000000000..fb3434e61 --- /dev/null +++ b/src/main/kotlin/solve/scene/view/utils/AnimationUtils.kt @@ -0,0 +1,69 @@ +package solve.scene.view.utils + +import javafx.animation.FillTransition +import javafx.animation.KeyFrame +import javafx.animation.KeyValue +import javafx.animation.ScaleTransition +import javafx.animation.StrokeTransition +import javafx.animation.Timeline +import javafx.animation.Transition +import javafx.beans.property.SimpleIntegerProperty +import javafx.scene.Node +import javafx.scene.paint.Color +import javafx.scene.shape.Shape +import javafx.util.Duration +import tornadofx.onChange + +fun createScaleTransition(node: Node, newScaleX: Double, newScaleY: Double, duration: Duration): Transition { + val scaleTransition = ScaleTransition() + scaleTransition.duration = duration + scaleTransition.toX = newScaleX + scaleTransition.toY = newScaleY + scaleTransition.node = node + return scaleTransition +} + +fun createFillTransition(shape: Shape, color: Color, duration: Duration): Transition { + val fillTransition = FillTransition() + fillTransition.duration = duration + fillTransition.toValue = color + fillTransition.shape = shape + return fillTransition +} + +fun createStrokeTransition(shape: Shape, color: Color, duration: Duration): Transition { + val strokeTransition = StrokeTransition() + strokeTransition.duration = duration + strokeTransition.toValue = color + strokeTransition.shape = shape + return strokeTransition +} + +fun createColorTimeline( + duration: Duration, + initialColor: Color, + targetColor: Color, + colorChangedCallback: (Color) -> Unit +) = createProgressTimeline(duration) { percent -> + val red = getIntermediateValue(initialColor.red, targetColor.red, percent) + val green = getIntermediateValue(initialColor.green, targetColor.green, percent) + val blue = getIntermediateValue(initialColor.blue, targetColor.blue, percent) + val opacity = getIntermediateValue(initialColor.opacity, targetColor.opacity, percent) + + val color = Color(red, green, blue, opacity) + colorChangedCallback(color) +} + +private fun getIntermediateValue(initialValue: Double, targetValue: Double, percent: Int): Double = + initialValue + (targetValue - initialValue) * (percent / 100.0) + +// Creates a timeline animation, which transforms percent value from 0 to 100 +// and calls given callback with percent values +fun createProgressTimeline(duration: Duration, callback: (Int) -> Unit): Timeline { + val percentProperty = SimpleIntegerProperty(0) + percentProperty.onChange { + callback(it) + } + + return Timeline(KeyFrame(duration, KeyValue(percentProperty, 100))) +} diff --git a/src/main/kotlin/solve/scene/view/virtualizedfx/VSPExtensions.kt b/src/main/kotlin/solve/scene/view/virtualizedfx/VSPExtensions.kt index f476b4d31..7218cf135 100644 --- a/src/main/kotlin/solve/scene/view/virtualizedfx/VSPExtensions.kt +++ b/src/main/kotlin/solve/scene/view/virtualizedfx/VSPExtensions.kt @@ -76,11 +76,17 @@ fun ?> wrapGridWithVsp( return vsp } +<<<<<<< HEAD /** * This inheritor is needed to put OutOfFramesLayer into visual tree nearby VirtualGrid. */ class VirtualScrollPaneWithOutOfFramesLayer?>( val virtualGrid: VirtualGrid, +======= +// This inheritor is needed to put OutOfFramesLayer into visual tree nearby VirtualGrid +private class VirtualScrollPaneWithOutOfFramesLayer?>( + private val virtualGrid: VirtualGrid, +>>>>>>> 13f8702 (Just an automaticly formatted codestyle) private val outOfFramesLayer: OutOfFramesLayer ) : VirtualScrollPane(virtualGrid) { override fun createDefaultSkin(): Skin<*> { diff --git a/src/main/kotlin/solve/styles/Style.kt b/src/main/kotlin/solve/styles/Style.kt index fc365ef56..5df2f456c 100644 --- a/src/main/kotlin/solve/styles/Style.kt +++ b/src/main/kotlin/solve/styles/Style.kt @@ -59,8 +59,7 @@ object Style { const val tabStyle = "-fx-font-family: $Font; -fx-font-weight:700; -fx-font-size: $ButtonFontSize; " + "-fx-text-fill: $PrimaryColorLight; -fx-background-radius: 36" - - fun circleForRipple(button: MFXButton) = Circle(button.layoutX + 36.0, button.layoutY + 36.0, 35.0) + fun circleForRipple(button: MFXButton) = Circle(button.layoutX + 36.0, button.layoutY + 36.0,35.0) fun circleForRipple(button: ToggleButton) = Circle(button.layoutX + 36.0, button.layoutY + 36.0, 35.0) From fc66c146d1e5e3252d79d5ef17de3e0fa5677fdc Mon Sep 17 00:00:00 2001 From: Stanislav Mishchenko Date: Fri, 28 Apr 2023 23:23:39 +0300 Subject: [PATCH 17/72] Wildcards fix --- .../solve/catalogue/view/fields/CatalogueFieldsView.kt | 8 -------- src/main/kotlin/solve/scene/view/FrameView.kt | 5 ++--- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt index 8eb66c955..81bb9a614 100644 --- a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt +++ b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt @@ -12,24 +12,16 @@ import javafx.scene.input.DragEvent import javafx.scene.input.TransferMode import javafx.scene.layout.Priority import javafx.scene.paint.Color -<<<<<<< HEAD -======= -import solve.catalogue.* ->>>>>>> 13f8702 (Just an automaticly formatted codestyle) import solve.catalogue.controller.CatalogueController import solve.catalogue.model.CatalogueField import solve.project.model.ProjectFrame import solve.scene.view.SceneView -<<<<<<< HEAD import solve.utils.deselectAllItems import solve.utils.floorToInt import solve.utils.onSelectionChanged import solve.utils.selectAllItems import solve.utils.selectedItems import solve.utils.selectedItemsCount -======= -import solve.utils.* ->>>>>>> 13f8702 (Just an automaticly formatted codestyle) import tornadofx.* import kotlin.math.min diff --git a/src/main/kotlin/solve/scene/view/FrameView.kt b/src/main/kotlin/solve/scene/view/FrameView.kt index 104299b5e..6fc36d451 100644 --- a/src/main/kotlin/solve/scene/view/FrameView.kt +++ b/src/main/kotlin/solve/scene/view/FrameView.kt @@ -37,7 +37,6 @@ import solve.utils.materialfx.action import solve.utils.materialfx.item import solve.utils.materialfx.lineSeparator import solve.utils.materialfx.mfxContextMenu -import solve.utils.* import tornadofx.* import tornadofx.add import solve.utils.structures.Size as DoubleSize @@ -82,7 +81,7 @@ class FrameView( private val associationsUpdatedListener = MapChangeListener, - Map>> { + Map>> { hasAssociations.value = getAssociatedLayersNames(currentFrame ?: return@MapChangeListener).isNotEmpty() } @@ -370,4 +369,4 @@ class FrameView( private fun VisualizationFrame.hasPoints() = this.layers.filterIsInstance().any { it.settings.enabled } -} +} \ No newline at end of file From e110d276d1e7054a578c8b0a53da4d4782f8700c Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sat, 15 Apr 2023 14:18:44 +0300 Subject: [PATCH 18/72] added materialfx dialogs and fixed some bugs --- src/main/kotlin/solve/importer/view/ProjectTreeView.kt | 4 +++- src/main/kotlin/solve/menubar/view/MenuBarView.kt | 1 + src/main/kotlin/solve/styles/Style.kt | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt index 5ba3b8c4c..506509eb1 100644 --- a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt +++ b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt @@ -7,6 +7,7 @@ import javafx.scene.control.TreeTableColumn import javafx.scene.control.cell.TreeItemPropertyValueFactory import javafx.scene.image.ImageView import javafx.scene.layout.BorderPane +import javafx.scene.text.Font import solve.constants.IconsImporterDescriptionPath import solve.constants.IconsImporterErrorFilePath import solve.constants.IconsImporterErrorFolderPath @@ -108,7 +109,8 @@ open class ProjectTreeView : View() { } if (!empty && text.isNotEmpty()) { tooltip(text).apply { - style = "-fx-font-family: ${Style.font}; -fx-font-size: ${Style.tooltipFontSize}; -fx-background-color: #${Style.surfaceColor}; -fx-text-fill: #707070;" + style = "-fx-font-family: ${Style.Font}; -fx-font-size: ${Style.TooltipFontSize}; " + + "-fx-background-color: #${Style.SurfaceColor}; -fx-text-fill: #707070;" } } } diff --git a/src/main/kotlin/solve/menubar/view/MenuBarView.kt b/src/main/kotlin/solve/menubar/view/MenuBarView.kt index 9193a6d92..90703c902 100644 --- a/src/main/kotlin/solve/menubar/view/MenuBarView.kt +++ b/src/main/kotlin/solve/menubar/view/MenuBarView.kt @@ -35,6 +35,7 @@ class MenuBarView : View() { button("Manage plugins") { } button("Settings") { + } button("Help") { } diff --git a/src/main/kotlin/solve/styles/Style.kt b/src/main/kotlin/solve/styles/Style.kt index 5df2f456c..34ddc25b8 100644 --- a/src/main/kotlin/solve/styles/Style.kt +++ b/src/main/kotlin/solve/styles/Style.kt @@ -67,3 +67,4 @@ object Style { const val ControlButtonsSpacing = 10.0 } + From 9fcc8020b70e52f6d0c5ee69b03e7b8dd09a0e2d Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sat, 15 Apr 2023 14:21:04 +0300 Subject: [PATCH 19/72] removed commented code --- .../kotlin/solve/menubar/view/MenuBarView.kt | 1 - src/main/kotlin/solve/utils/ImporterUtils.kt | 34 ++++++++++++------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/solve/menubar/view/MenuBarView.kt b/src/main/kotlin/solve/menubar/view/MenuBarView.kt index 90703c902..9193a6d92 100644 --- a/src/main/kotlin/solve/menubar/view/MenuBarView.kt +++ b/src/main/kotlin/solve/menubar/view/MenuBarView.kt @@ -35,7 +35,6 @@ class MenuBarView : View() { button("Manage plugins") { } button("Settings") { - } button("Help") { } diff --git a/src/main/kotlin/solve/utils/ImporterUtils.kt b/src/main/kotlin/solve/utils/ImporterUtils.kt index 8f030edf2..1e69573bc 100644 --- a/src/main/kotlin/solve/utils/ImporterUtils.kt +++ b/src/main/kotlin/solve/utils/ImporterUtils.kt @@ -1,21 +1,31 @@ package solve.utils +import io.github.palexdev.materialfx.dialogs.MFXGenericDialogBuilder +import io.github.palexdev.materialfx.enums.ScrimPriority +import javafx.stage.Modality +import javafx.stage.Window import solve.importer.view.AlertDialog -import solve.importer.view.DirectoryPathView -import tornadofx.FX.Companion.find -fun createAlertForError(content: String) { - val container = MaterialFXDialog.createGenericDialog(AlertDialog(content).root) +fun createAlertForError(content: String, owner: Window) { + var container = AlertDialog(content) - val dialog = MaterialFXDialog.createStageDialog( - container, - find().currentStage, - find().root - ).apply { - isDraggable = false - } + val dialogContent = MFXGenericDialogBuilder.build() + .setContent(container.root) + .setShowMinimize(false) + .setShowAlwaysOnTop(false) + .setShowClose(false) + .get() - dialog.show() + val dialog = MFXGenericDialogBuilder.build(dialogContent) + .toStageDialogBuilder() + .initOwner(owner) + .initModality(Modality.APPLICATION_MODAL) + .setDraggable(true) + .setScrimPriority(ScrimPriority.WINDOW) + .setScrimOwner(true) + .get() + + dialog.show() } fun List.toStringWithoutBrackets(): String { From c56eed7c1e8fe9f25fdf0e09c5fe240a1ced7182 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Fri, 21 Apr 2023 23:36:01 +0300 Subject: [PATCH 20/72] added new style constants --- src/main/kotlin/solve/styles/Style.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/kotlin/solve/styles/Style.kt b/src/main/kotlin/solve/styles/Style.kt index 34ddc25b8..5df2f456c 100644 --- a/src/main/kotlin/solve/styles/Style.kt +++ b/src/main/kotlin/solve/styles/Style.kt @@ -67,4 +67,3 @@ object Style { const val ControlButtonsSpacing = 10.0 } - From 2edfa45a5b2254e950c1a871fd078b4dc594cbda Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Fri, 21 Apr 2023 23:55:50 +0300 Subject: [PATCH 21/72] added panels --- src/main/kotlin/solve/main/MainView.kt | 1 + src/main/kotlin/solve/utils/ImporterUtils.kt | 30 ++++++-------------- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index d8acaaf81..6f3bc5816 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -61,6 +61,7 @@ class MainView : View() { "Ctrl+P" ) ) + private val rightSidePanelTabs = listOf( SidePanelTab( LayersTabName, diff --git a/src/main/kotlin/solve/utils/ImporterUtils.kt b/src/main/kotlin/solve/utils/ImporterUtils.kt index 1e69573bc..d98ff002e 100644 --- a/src/main/kotlin/solve/utils/ImporterUtils.kt +++ b/src/main/kotlin/solve/utils/ImporterUtils.kt @@ -1,31 +1,17 @@ package solve.utils -import io.github.palexdev.materialfx.dialogs.MFXGenericDialogBuilder -import io.github.palexdev.materialfx.enums.ScrimPriority -import javafx.stage.Modality -import javafx.stage.Window -import solve.importer.view.AlertDialog +import solve.importer.view.* +import tornadofx.FX.Companion.find -fun createAlertForError(content: String, owner: Window) { - var container = AlertDialog(content) - val dialogContent = MFXGenericDialogBuilder.build() - .setContent(container.root) - .setShowMinimize(false) - .setShowAlwaysOnTop(false) - .setShowClose(false) - .get() +fun createAlertForError(content: String) { + val container = MaterialFXDialog.createGenericDialog(AlertDialog(content).root) - val dialog = MFXGenericDialogBuilder.build(dialogContent) - .toStageDialogBuilder() - .initOwner(owner) - .initModality(Modality.APPLICATION_MODAL) - .setDraggable(true) - .setScrimPriority(ScrimPriority.WINDOW) - .setScrimOwner(true) - .get() + val dialog = MaterialFXDialog.createStageDialog(container, find().currentStage, find().root ).apply { + isDraggable = false + } - dialog.show() + dialog.show() } fun List.toStringWithoutBrackets(): String { From 7463506bfb7f103d12a5462aafd58e59fef28b09 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 23 Apr 2023 12:51:58 +0300 Subject: [PATCH 22/72] changed SidePanelTab class --- src/main/kotlin/solve/sidepanel/SidePanelTab.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/solve/sidepanel/SidePanelTab.kt b/src/main/kotlin/solve/sidepanel/SidePanelTab.kt index 6e015b1e5..e4e9e5d78 100644 --- a/src/main/kotlin/solve/sidepanel/SidePanelTab.kt +++ b/src/main/kotlin/solve/sidepanel/SidePanelTab.kt @@ -3,3 +3,4 @@ package solve.sidepanel import javafx.scene.Node data class SidePanelTab(val name: String, val contentNode: Node, val tooltip: String) + From b4bfb50b2507d44fa8accf7c1be1b47d839474fb Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Wed, 26 Apr 2023 13:10:06 +0300 Subject: [PATCH 23/72] fixes --- src/main/kotlin/solve/importer/view/ProjectTreeView.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt index 506509eb1..30c673b2f 100644 --- a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt +++ b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt @@ -7,7 +7,6 @@ import javafx.scene.control.TreeTableColumn import javafx.scene.control.cell.TreeItemPropertyValueFactory import javafx.scene.image.ImageView import javafx.scene.layout.BorderPane -import javafx.scene.text.Font import solve.constants.IconsImporterDescriptionPath import solve.constants.IconsImporterErrorFilePath import solve.constants.IconsImporterErrorFolderPath @@ -85,6 +84,7 @@ open class ProjectTreeView : View() { ImageView(imageIcon).apply { fitHeight = 16.0 fitWidth = 16.0 + } } else { ImageView(errorFolderIcon) @@ -104,9 +104,7 @@ open class ProjectTreeView : View() { super.updateItem(item, empty) text = if (empty) { null - } else { - item?.errors?.toStringWithoutBrackets() - } + } else item?.errors?.toStringWithoutBrackets() if (!empty && text.isNotEmpty()) { tooltip(text).apply { style = "-fx-font-family: ${Style.Font}; -fx-font-size: ${Style.TooltipFontSize}; " + From d4f0de6fed1197fe18a72f35e12673a56982113e Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Tue, 9 May 2023 01:51:33 +0300 Subject: [PATCH 24/72] codestyle --- .../kotlin/solve/styles/TreeTableViewStylesheet.kt | 3 +-- src/main/kotlin/solve/utils/ImporterUtils.kt | 10 +++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt index 0c42ca11a..4ed784c5a 100644 --- a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt @@ -71,6 +71,5 @@ class TreeTableViewStylesheet : Stylesheet() { minHeight = 0.px } } - } -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/utils/ImporterUtils.kt b/src/main/kotlin/solve/utils/ImporterUtils.kt index d98ff002e..8f030edf2 100644 --- a/src/main/kotlin/solve/utils/ImporterUtils.kt +++ b/src/main/kotlin/solve/utils/ImporterUtils.kt @@ -1,13 +1,17 @@ package solve.utils -import solve.importer.view.* +import solve.importer.view.AlertDialog +import solve.importer.view.DirectoryPathView import tornadofx.FX.Companion.find - fun createAlertForError(content: String) { val container = MaterialFXDialog.createGenericDialog(AlertDialog(content).root) - val dialog = MaterialFXDialog.createStageDialog(container, find().currentStage, find().root ).apply { + val dialog = MaterialFXDialog.createStageDialog( + container, + find().currentStage, + find().root + ).apply { isDraggable = false } From 879c88ab45aa69b486893d04af9568e88cc27490 Mon Sep 17 00:00:00 2001 From: Alexander-Ploskin Date: Tue, 9 May 2023 14:02:59 +0300 Subject: [PATCH 25/72] Tootips shortcuts --- src/main/kotlin/solve/importer/view/ProjectTreeView.kt | 5 +---- src/main/kotlin/solve/sidepanel/SidePanelTab.kt | 3 +-- src/main/kotlin/solve/styles/Style.kt | 1 - 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt index 30c673b2f..1ef698bf5 100644 --- a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt +++ b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt @@ -106,10 +106,7 @@ open class ProjectTreeView : View() { null } else item?.errors?.toStringWithoutBrackets() if (!empty && text.isNotEmpty()) { - tooltip(text).apply { - style = "-fx-font-family: ${Style.Font}; -fx-font-size: ${Style.TooltipFontSize}; " + - "-fx-background-color: #${Style.SurfaceColor}; -fx-text-fill: #707070;" - } + tooltip(text) } } } diff --git a/src/main/kotlin/solve/sidepanel/SidePanelTab.kt b/src/main/kotlin/solve/sidepanel/SidePanelTab.kt index e4e9e5d78..6c1e12349 100644 --- a/src/main/kotlin/solve/sidepanel/SidePanelTab.kt +++ b/src/main/kotlin/solve/sidepanel/SidePanelTab.kt @@ -2,5 +2,4 @@ package solve.sidepanel import javafx.scene.Node -data class SidePanelTab(val name: String, val contentNode: Node, val tooltip: String) - +data class SidePanelTab(val name: String, val contentNode: Node, val tooltip: String) \ No newline at end of file diff --git a/src/main/kotlin/solve/styles/Style.kt b/src/main/kotlin/solve/styles/Style.kt index 5df2f456c..7427338d4 100644 --- a/src/main/kotlin/solve/styles/Style.kt +++ b/src/main/kotlin/solve/styles/Style.kt @@ -6,7 +6,6 @@ import javafx.scene.control.ToggleButton import javafx.scene.shape.Circle import tornadofx.* - object Style { const val BackgroundColor = "EFF0F0" From 2437480d4d44837dafd14f8f6ed6c44698f49245 Mon Sep 17 00:00:00 2001 From: Stanislav Mishchenko Date: Thu, 4 May 2023 22:55:41 +0300 Subject: [PATCH 26/72] Fix an incorrect initializaion of dividers positions --- src/main/kotlin/solve/main/splitpane/FixedSplitPane.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/solve/main/splitpane/FixedSplitPane.kt b/src/main/kotlin/solve/main/splitpane/FixedSplitPane.kt index d8d4d8d3e..4b56f9f62 100644 --- a/src/main/kotlin/solve/main/splitpane/FixedSplitPane.kt +++ b/src/main/kotlin/solve/main/splitpane/FixedSplitPane.kt @@ -68,6 +68,7 @@ open class FixedSplitPane( } private fun initializeDividers() { + dividers.forEachIndexed { index, divider -> val initialPosition = dividersInitialPositions[index] dividersInstalledPositions[index] = initialPosition From 83661035572d8a8adad92566881e17278572c2ba Mon Sep 17 00:00:00 2001 From: Stanislav Mishchenko Date: Fri, 5 May 2023 22:24:53 +0300 Subject: [PATCH 27/72] Add a filters panel view --- src/main/kotlin/solve/SolveApp.kt | 1 - .../filters/view/FilterPanelFieldsView.kt | 2 +- .../solve/filters/view/FilterPanelView.kt | 2 +- .../solve/main/splitpane/FixedSplitPane.kt | 1 - .../view/VisualizationSettingsLayerCell.kt | 2 +- .../styles/FilterPanelListViewStylesheet.kt | 72 ++++++++++++++++++ src/main/kotlin/solve/utils/MFXUtils.kt | 76 +++++++++++++++++++ 7 files changed, 151 insertions(+), 5 deletions(-) create mode 100644 src/main/kotlin/solve/styles/FilterPanelListViewStylesheet.kt create mode 100644 src/main/kotlin/solve/utils/MFXUtils.kt diff --git a/src/main/kotlin/solve/SolveApp.kt b/src/main/kotlin/solve/SolveApp.kt index bf2de486f..3fcf02ad8 100644 --- a/src/main/kotlin/solve/SolveApp.kt +++ b/src/main/kotlin/solve/SolveApp.kt @@ -31,7 +31,6 @@ class SolveApp : App(MainView::class, ApplicationStylesheet::class) { private fun initializeDependencies() { SvgImageLoaderFactory.install(SVGImageLoaderDimensionProvider()) - initializeStyle() } diff --git a/src/main/kotlin/solve/filters/view/FilterPanelFieldsView.kt b/src/main/kotlin/solve/filters/view/FilterPanelFieldsView.kt index f0c58fc9e..8ddc24662 100644 --- a/src/main/kotlin/solve/filters/view/FilterPanelFieldsView.kt +++ b/src/main/kotlin/solve/filters/view/FilterPanelFieldsView.kt @@ -136,4 +136,4 @@ class FilterPanelFieldsView : View() { private const val FieldButtonPressRippleCircleRadius = 15.0 private const val DelayBetweenMFXListViewChangeOperationsMillis = 50L } -} +} \ No newline at end of file diff --git a/src/main/kotlin/solve/filters/view/FilterPanelView.kt b/src/main/kotlin/solve/filters/view/FilterPanelView.kt index c73afb90d..f76c74874 100644 --- a/src/main/kotlin/solve/filters/view/FilterPanelView.kt +++ b/src/main/kotlin/solve/filters/view/FilterPanelView.kt @@ -64,4 +64,4 @@ class FilterPanelView : View() { private const val FilterFieldButtonsSize = 24.0 private const val AddFilterButtonSize = 15.0 } -} +} \ No newline at end of file diff --git a/src/main/kotlin/solve/main/splitpane/FixedSplitPane.kt b/src/main/kotlin/solve/main/splitpane/FixedSplitPane.kt index 4b56f9f62..d8d4d8d3e 100644 --- a/src/main/kotlin/solve/main/splitpane/FixedSplitPane.kt +++ b/src/main/kotlin/solve/main/splitpane/FixedSplitPane.kt @@ -68,7 +68,6 @@ open class FixedSplitPane( } private fun initializeDividers() { - dividers.forEachIndexed { index, divider -> val initialPosition = dividersInitialPositions[index] dividersInstalledPositions[index] = initialPosition diff --git a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt index eae99d238..d7994f5fb 100644 --- a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt +++ b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt @@ -295,4 +295,4 @@ class VisualizationSettingsLayerCell( private val layerVisibleIconImage = loadResourcesImage(IconsSettingsVisualizationLayerVisiblePath) private val layerInvisibleIconImage = loadResourcesImage(IconsSettingsVisualizationLayerInvisiblePath) } -} +} \ No newline at end of file diff --git a/src/main/kotlin/solve/styles/FilterPanelListViewStylesheet.kt b/src/main/kotlin/solve/styles/FilterPanelListViewStylesheet.kt new file mode 100644 index 000000000..cbffa26d3 --- /dev/null +++ b/src/main/kotlin/solve/styles/FilterPanelListViewStylesheet.kt @@ -0,0 +1,72 @@ +package solve.styles + +import javafx.scene.paint.Color +import javafx.scene.paint.Paint +import solve.constants.IconsFiltersOrCheckBoxPath +import solve.utils.addBackgroundImage +import solve.utils.createCssBoxWithValue +import solve.utils.createLinearUnitsBoxWithLeft +import solve.utils.createPxBoxWithValue +import solve.utils.createPxValue +import tornadofx.* + +class FilterPanelListViewStylesheet : Stylesheet() { + init { + selected { + mfxCheckbox { + rippleContainer { + box { + borderColor += createCssBoxWithValue(Color.TRANSPARENT) + addBackgroundImage(IconsFiltersOrCheckBoxPath) + } + } + } + } + + mfxCheckbox { + rippleContainer { + box { + borderColor += createCssBoxWithValue(Paint.valueOf(Style.separatorLineColor)) + borderWidth += createPxBoxWithValue(CheckBoxBorderWidth) + + mark { + visibility = FXVisibility.HIDDEN + } + } + } + } + + mfxCheckListView { + maxHeight = createPxValue(ListMaxHeight) + backgroundColor += Color.TRANSPARENT + + virtualFlow { + backgroundColor += Color.TRANSPARENT + + mfxCheckListCell { + backgroundColor += Color.TRANSPARENT + borderColor += createCssBoxWithValue(Color.TRANSPARENT) + padding = createLinearUnitsBoxWithLeft(4.0, Dimension.LinearUnits.px) + + dataLabel { + fontSize = createPxValue(ListFieldFontSize) + fontFamily = Style.font + textFill = Paint.valueOf(Style.listFontColor) + } + } + } + } + } + + companion object { + private val mfxCheckListView by cssclass() + private val mfxCheckListCell by cssclass() + private val dataLabel by cssclass() + private val mfxCheckbox by cssclass() + private val rippleContainer by cssclass() + + private const val ListMaxHeight = 180.0 + private const val CheckBoxBorderWidth = 2.5 + private const val ListFieldFontSize = 14.0 + } +} diff --git a/src/main/kotlin/solve/utils/MFXUtils.kt b/src/main/kotlin/solve/utils/MFXUtils.kt new file mode 100644 index 000000000..6a4d3293d --- /dev/null +++ b/src/main/kotlin/solve/utils/MFXUtils.kt @@ -0,0 +1,76 @@ +package solve.utils + +import io.github.palexdev.materialfx.controls.MFXButton +import io.github.palexdev.materialfx.controls.MFXCheckListView +import io.github.palexdev.materialfx.controls.MFXContextMenu +import io.github.palexdev.materialfx.controls.MFXContextMenuItem +import io.github.palexdev.materialfx.controls.MFXTextField +import javafx.application.Platform +import javafx.collections.ObservableList +import javafx.event.EventTarget +import javafx.scene.Node +import javafx.scene.paint.Color +import javafx.scene.shape.Circle +import tornadofx.* +import java.util.function.Supplier + +fun EventTarget.mfxButton( + text: String = "", + graphic: Node? = null, + op: MFXButton.() -> Unit = {} +) = MFXButton(text).attachTo(this, op) { + if (graphic != null) it.graphic = graphic +} + +fun EventTarget.mfxTextField( + text: String = "", + op: MFXTextField.() -> Unit = {} +) = MFXTextField(text).attachTo(this, op) + +fun Node.mfxContextMenu(op: MFXContextMenu.() -> Unit = {}): MFXContextMenu { + val contextMenu = MFXContextMenu.Builder.build(this).installAndGet() + op(contextMenu) + return contextMenu +} + +fun MFXContextMenu.item( + name: String, + op: MFXContextMenuItem.() -> Unit = {} +) = MFXContextMenuItem(name).also { + op(it) + this.addItems(it) +} + +fun MFXContextMenu.lineSeparator() = this.addLineSeparator(MFXContextMenu.Builder.getLineSeparator()) + +fun MFXContextMenuItem.action(op: () -> Unit) = this.setOnAction { op() } + +fun EventTarget.mfxCircleButton( + graphic: Node? = null, + radius: Double = 20.0, + text: String = "", + op: MFXButton.() -> Unit = {} +) = mfxButton(text, graphic) { + this.graphic = graphic + Platform.runLater { + val rippleCenter = boundsInLocal + rippleGenerator.clipSupplier = Supplier { + return@Supplier Circle(rippleCenter.centerX, rippleCenter.centerY, radius) + } + } + style { + backgroundColor += Color.TRANSPARENT + minHeight = Dimension(radius, Dimension.LinearUnits.px) + } + op() +} + +fun EventTarget.mfxCheckListView( + items: ObservableList = observableListOf(), + op: MFXCheckListView.() -> Unit = {} +): MFXCheckListView { + val mfxCheckListView = MFXCheckListView(items) + mfxCheckListView.attachTo(this, op) + + return mfxCheckListView +} From 59ebb50466983f1ae90e906bb7320cb6baefaa16 Mon Sep 17 00:00:00 2001 From: Stanislav Mishchenko Date: Wed, 10 May 2023 12:57:54 +0300 Subject: [PATCH 28/72] Update filter settings dialog design and add a logic --- .../controller/FilterPanelController.kt | 2 +- src/main/kotlin/solve/filters/model/Filter.kt | 12 ++++++++++++ .../controller/FilterSettingsController.kt | 2 +- .../filters/settings/model/FilterSetting.kt | 7 +++++++ .../settings/model/IndicesStepFilterSetting.kt | 8 ++++++++ .../settings/model/TimePeriodFilterSetting.kt | 9 +++++++++ .../filters/settings/model/UIDFilterSetting.kt | 8 ++++++++ .../settings/view/FilterSettingsView.kt | 2 +- .../view/controls/FilterSettingControl.kt | 8 ++++++++ .../view/controls/IndicesStepSettingControl.kt | 18 ++++++++++++++++++ .../view/controls/TimePeriodSettingControl.kt | 18 ++++++++++++++++++ .../view/controls/UIDSettingControl.kt | 18 ++++++++++++++++++ .../solve/importer/view/LoadingScreen.kt | 2 +- src/main/kotlin/solve/main/MainView.kt | 2 -- src/main/kotlin/solve/styles/Style.kt | 2 +- .../utils/materialfx/MFXIntegerTextField.kt | 4 ++-- .../solve/utils/materialfx/MFXNodesUtils.kt | 2 +- 17 files changed, 114 insertions(+), 10 deletions(-) create mode 100644 src/main/kotlin/solve/filters/settings/view/controls/FilterSettingControl.kt create mode 100644 src/main/kotlin/solve/filters/settings/view/controls/IndicesStepSettingControl.kt create mode 100644 src/main/kotlin/solve/filters/settings/view/controls/TimePeriodSettingControl.kt create mode 100644 src/main/kotlin/solve/filters/settings/view/controls/UIDSettingControl.kt diff --git a/src/main/kotlin/solve/filters/controller/FilterPanelController.kt b/src/main/kotlin/solve/filters/controller/FilterPanelController.kt index cf83ba80c..35d5370e5 100644 --- a/src/main/kotlin/solve/filters/controller/FilterPanelController.kt +++ b/src/main/kotlin/solve/filters/controller/FilterPanelController.kt @@ -56,4 +56,4 @@ class FilterPanelController : Controller() { return notOrderedFilteredFrames.sortedBy { frame -> projectFrameToIndexMap[frame] } } -} +} \ No newline at end of file diff --git a/src/main/kotlin/solve/filters/model/Filter.kt b/src/main/kotlin/solve/filters/model/Filter.kt index 269baa666..31cd3dcc9 100644 --- a/src/main/kotlin/solve/filters/model/Filter.kt +++ b/src/main/kotlin/solve/filters/model/Filter.kt @@ -1,6 +1,7 @@ package solve.filters.model import solve.filters.settings.model.FilterSetting +<<<<<<< HEAD import solve.filters.settings.model.IndicesStepFilterSetting import solve.filters.settings.model.TimePeriodFilterSetting import solve.filters.settings.model.UIDFilterSetting @@ -45,4 +46,15 @@ class Filter(val settings: List>) { return "$prefix$indicesStepPart$timePeriodPart$uidPart" } +======= +import solve.project.model.ProjectFrame + +data class Filter(val settings: List>) { + fun apply(frames: List): List { + var suitableFrames = frames + settings.forEach { suitableFrames = it.apply(suitableFrames) } + + return suitableFrames + } +>>>>>>> f6786bc (Update filter settings dialog design and add a logic) } diff --git a/src/main/kotlin/solve/filters/settings/controller/FilterSettingsController.kt b/src/main/kotlin/solve/filters/settings/controller/FilterSettingsController.kt index cb665c01c..614ae88f5 100644 --- a/src/main/kotlin/solve/filters/settings/controller/FilterSettingsController.kt +++ b/src/main/kotlin/solve/filters/settings/controller/FilterSettingsController.kt @@ -19,4 +19,4 @@ class FilterSettingsController : Controller() { panelController.editFilter(editingFilter, newFilter) } -} +} \ No newline at end of file diff --git a/src/main/kotlin/solve/filters/settings/model/FilterSetting.kt b/src/main/kotlin/solve/filters/settings/model/FilterSetting.kt index 4fa232f4f..cdacde16e 100644 --- a/src/main/kotlin/solve/filters/settings/model/FilterSetting.kt +++ b/src/main/kotlin/solve/filters/settings/model/FilterSetting.kt @@ -2,6 +2,7 @@ package solve.filters.settings.model import solve.project.model.ProjectFrame +<<<<<<< HEAD abstract class FilterSetting(settingValue: T) { var settingValue: T = settingValue protected set @@ -9,4 +10,10 @@ abstract class FilterSetting(settingValue: T) { abstract fun apply(fields: List): List abstract fun edit(newValue: T) +======= +interface FilterSetting { + fun apply(fields: List): List + + fun edit(newValue: T) +>>>>>>> f6786bc (Update filter settings dialog design and add a logic) } diff --git a/src/main/kotlin/solve/filters/settings/model/IndicesStepFilterSetting.kt b/src/main/kotlin/solve/filters/settings/model/IndicesStepFilterSetting.kt index a2d24ae59..90c439a8d 100644 --- a/src/main/kotlin/solve/filters/settings/model/IndicesStepFilterSetting.kt +++ b/src/main/kotlin/solve/filters/settings/model/IndicesStepFilterSetting.kt @@ -2,6 +2,7 @@ package solve.filters.settings.model import solve.project.model.ProjectFrame +<<<<<<< HEAD class IndicesStepFilterSetting(step: Int) : FilterSetting(step) { override fun apply(fields: List) = fields.slice( (settingValue - 1)..fields.lastIndex step this.settingValue @@ -9,5 +10,12 @@ class IndicesStepFilterSetting(step: Int) : FilterSetting(step) { override fun edit(newValue: Int) { settingValue = newValue +======= +class IndicesStepFilterSetting(private var step: Int) : FilterSetting { + override fun apply(fields: List) = fields.slice(0..fields.lastIndex step this.step) + + override fun edit(newValue: Int) { + step = newValue +>>>>>>> f6786bc (Update filter settings dialog design and add a logic) } } diff --git a/src/main/kotlin/solve/filters/settings/model/TimePeriodFilterSetting.kt b/src/main/kotlin/solve/filters/settings/model/TimePeriodFilterSetting.kt index a28bb38c6..18dca486a 100644 --- a/src/main/kotlin/solve/filters/settings/model/TimePeriodFilterSetting.kt +++ b/src/main/kotlin/solve/filters/settings/model/TimePeriodFilterSetting.kt @@ -3,11 +3,20 @@ package solve.filters.settings.model import solve.project.model.ProjectFrame import solve.utils.structures.IntPoint +<<<<<<< HEAD class TimePeriodFilterSetting(timePeriod: IntPoint) : FilterSetting(timePeriod) { override fun apply(fields: List): List = fields.filter { it.timestamp in settingValue.x..settingValue.y } override fun edit(newValue: IntPoint) { settingValue = newValue +======= +class TimePeriodFilterSetting(private var timePeriod: IntPoint) : FilterSetting { + override fun apply(fields: List): List = + fields.filter { it.timestamp in timePeriod.x..timePeriod.y } + + override fun edit(newValue: IntPoint) { + timePeriod = newValue +>>>>>>> f6786bc (Update filter settings dialog design and add a logic) } } diff --git a/src/main/kotlin/solve/filters/settings/model/UIDFilterSetting.kt b/src/main/kotlin/solve/filters/settings/model/UIDFilterSetting.kt index a34a4b040..792f2b022 100644 --- a/src/main/kotlin/solve/filters/settings/model/UIDFilterSetting.kt +++ b/src/main/kotlin/solve/filters/settings/model/UIDFilterSetting.kt @@ -2,10 +2,18 @@ package solve.filters.settings.model import solve.project.model.ProjectFrame +<<<<<<< HEAD class UIDFilterSetting(uid: Long) : FilterSetting(uid) { override fun apply(fields: List) = fields.filter { it.uids.contains(settingValue) } override fun edit(newValue: Long) { settingValue = newValue +======= +class UIDFilterSetting(private var uid: Long) : FilterSetting { + override fun apply(fields: List) = fields.filter { it.uids.contains(uid) } + + override fun edit(newValue: Long) { + uid = newValue +>>>>>>> f6786bc (Update filter settings dialog design and add a logic) } } diff --git a/src/main/kotlin/solve/filters/settings/view/FilterSettingsView.kt b/src/main/kotlin/solve/filters/settings/view/FilterSettingsView.kt index 88f6933dc..32f288a23 100644 --- a/src/main/kotlin/solve/filters/settings/view/FilterSettingsView.kt +++ b/src/main/kotlin/solve/filters/settings/view/FilterSettingsView.kt @@ -410,4 +410,4 @@ class FilterSettingsView : View() { private enum class FilterSettingsDialogMode { CreationMode, EditingMode -} +} \ No newline at end of file diff --git a/src/main/kotlin/solve/filters/settings/view/controls/FilterSettingControl.kt b/src/main/kotlin/solve/filters/settings/view/controls/FilterSettingControl.kt new file mode 100644 index 000000000..6c350d43f --- /dev/null +++ b/src/main/kotlin/solve/filters/settings/view/controls/FilterSettingControl.kt @@ -0,0 +1,8 @@ +package solve.filters.settings.view.controls + +import javafx.scene.Node +import solve.filters.settings.model.FilterSetting + +abstract class FilterSettingControl >(protected val controlNode: T) { + abstract fun extrudeFilterSettings() : FilterSetting<*>? +} diff --git a/src/main/kotlin/solve/filters/settings/view/controls/IndicesStepSettingControl.kt b/src/main/kotlin/solve/filters/settings/view/controls/IndicesStepSettingControl.kt new file mode 100644 index 000000000..12a298a8d --- /dev/null +++ b/src/main/kotlin/solve/filters/settings/view/controls/IndicesStepSettingControl.kt @@ -0,0 +1,18 @@ +package solve.filters.settings.view.controls + +import solve.filters.settings.model.IndicesStepFilterSetting +import solve.utils.materialfx.MFXIntegerTextField + +class IndicesStepSettingControl( + controlNode: MFXIntegerTextField +) : FilterSettingControl(controlNode) { + override fun extrudeFilterSettings(): IndicesStepFilterSetting? { + if (!controlNode.isValid || controlNode.text.isEmpty()) { + return null + } + + val stepNumber = controlNode.text.toInt() + + return IndicesStepFilterSetting(stepNumber) + } +} diff --git a/src/main/kotlin/solve/filters/settings/view/controls/TimePeriodSettingControl.kt b/src/main/kotlin/solve/filters/settings/view/controls/TimePeriodSettingControl.kt new file mode 100644 index 000000000..508c5c037 --- /dev/null +++ b/src/main/kotlin/solve/filters/settings/view/controls/TimePeriodSettingControl.kt @@ -0,0 +1,18 @@ +package solve.filters.settings.view.controls + +import org.controlsfx.control.RangeSlider +import solve.filters.settings.model.TimePeriodFilterSetting +import solve.utils.ceilToInt +import solve.utils.floorToInt +import solve.utils.structures.IntPoint + +class TimePeriodSettingControl( + controlNode: RangeSlider +) : FilterSettingControl(controlNode) { + override fun extrudeFilterSettings(): TimePeriodFilterSetting { + val fromTimePeriod = controlNode.lowValue.floorToInt() + val toTimePeriod = controlNode.highValue.ceilToInt() + + return TimePeriodFilterSetting(IntPoint(fromTimePeriod, toTimePeriod)) + } +} diff --git a/src/main/kotlin/solve/filters/settings/view/controls/UIDSettingControl.kt b/src/main/kotlin/solve/filters/settings/view/controls/UIDSettingControl.kt new file mode 100644 index 000000000..a07b534ee --- /dev/null +++ b/src/main/kotlin/solve/filters/settings/view/controls/UIDSettingControl.kt @@ -0,0 +1,18 @@ +package solve.filters.settings.view.controls + +import solve.filters.settings.model.UIDFilterSetting +import solve.utils.materialfx.MFXIntegerTextField + +class UIDSettingControl( + controlNode: MFXIntegerTextField +) : FilterSettingControl(controlNode) { + override fun extrudeFilterSettings(): UIDFilterSetting? { + if (!controlNode.isValid || controlNode.text.isEmpty()) { + return null + } + + val uid = controlNode.text.toLong() + + return UIDFilterSetting(uid) + } +} diff --git a/src/main/kotlin/solve/importer/view/LoadingScreen.kt b/src/main/kotlin/solve/importer/view/LoadingScreen.kt index b230022f0..2b41c03e5 100644 --- a/src/main/kotlin/solve/importer/view/LoadingScreen.kt +++ b/src/main/kotlin/solve/importer/view/LoadingScreen.kt @@ -65,4 +65,4 @@ class LoadingScreen : View("Loading") { } } } -} +} \ No newline at end of file diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 6f3bc5816..94480b9d7 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -32,12 +32,10 @@ import solve.sidepanel.tabs.SidePanelTabsView import solve.styles.MFXButtonStyleSheet import solve.styles.Style import solve.styles.TooltipStyle -import solve.utils.MaterialFXDialog import solve.utils.createPxBox import solve.utils.loadResourcesImage import solve.utils.materialfx.MaterialFXDialog import solve.utils.materialfx.mfxButton -import solve.utils.mfxButton import tornadofx.* class MainView : View() { diff --git a/src/main/kotlin/solve/styles/Style.kt b/src/main/kotlin/solve/styles/Style.kt index 7427338d4..d375f882f 100644 --- a/src/main/kotlin/solve/styles/Style.kt +++ b/src/main/kotlin/solve/styles/Style.kt @@ -58,10 +58,10 @@ object Style { const val tabStyle = "-fx-font-family: $Font; -fx-font-weight:700; -fx-font-size: $ButtonFontSize; " + "-fx-text-fill: $PrimaryColorLight; -fx-background-radius: 36" + fun circleForRipple(button: MFXButton) = Circle(button.layoutX + 36.0, button.layoutY + 36.0,35.0) fun circleForRipple(button: ToggleButton) = Circle(button.layoutX + 36.0, button.layoutY + 36.0, 35.0) - const val HeaderFontSize = "20px" const val ControlButtonsSpacing = 10.0 diff --git a/src/main/kotlin/solve/utils/materialfx/MFXIntegerTextField.kt b/src/main/kotlin/solve/utils/materialfx/MFXIntegerTextField.kt index a67479c41..439916b29 100644 --- a/src/main/kotlin/solve/utils/materialfx/MFXIntegerTextField.kt +++ b/src/main/kotlin/solve/utils/materialfx/MFXIntegerTextField.kt @@ -29,7 +29,7 @@ class MFXIntegerTextField(private val invalidErrorMessage: String? = null) : MFX private fun enableBorderColorCssString(hexColor: String) = "${MFXValidationTextFieldStylesheet.mfxMain.name}: #$hexColor;\n" + - "-fx-border-color: #$hexColor;\n" + "-fx-border-color: #$hexColor;\n" private fun initializeIntegerTextField() { addStylesheet(MFXValidationTextFieldStylesheet::class) @@ -74,4 +74,4 @@ class MFXIntegerTextField(private val invalidErrorMessage: String? = null) : MFX return mfxIntegerTextField } } -} +} \ No newline at end of file diff --git a/src/main/kotlin/solve/utils/materialfx/MFXNodesUtils.kt b/src/main/kotlin/solve/utils/materialfx/MFXNodesUtils.kt index fdf4a0243..61940a721 100644 --- a/src/main/kotlin/solve/utils/materialfx/MFXNodesUtils.kt +++ b/src/main/kotlin/solve/utils/materialfx/MFXNodesUtils.kt @@ -125,4 +125,4 @@ val MFXTextField.validationMessage: String? } return constraints.first().message - } + } \ No newline at end of file From f844d418f9c718f83b904f612e2074e3d389fb9d Mon Sep 17 00:00:00 2001 From: Stanislav Mishchenko Date: Fri, 12 May 2023 00:24:10 +0300 Subject: [PATCH 29/72] Add a filter applying logic --- .../filters/controller/FilterPanelController.kt | 2 +- src/main/kotlin/solve/filters/model/Filter.kt | 12 ------------ src/main/kotlin/solve/main/MainController.kt | 1 + 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/solve/filters/controller/FilterPanelController.kt b/src/main/kotlin/solve/filters/controller/FilterPanelController.kt index 35d5370e5..cf83ba80c 100644 --- a/src/main/kotlin/solve/filters/controller/FilterPanelController.kt +++ b/src/main/kotlin/solve/filters/controller/FilterPanelController.kt @@ -56,4 +56,4 @@ class FilterPanelController : Controller() { return notOrderedFilteredFrames.sortedBy { frame -> projectFrameToIndexMap[frame] } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/filters/model/Filter.kt b/src/main/kotlin/solve/filters/model/Filter.kt index 31cd3dcc9..269baa666 100644 --- a/src/main/kotlin/solve/filters/model/Filter.kt +++ b/src/main/kotlin/solve/filters/model/Filter.kt @@ -1,7 +1,6 @@ package solve.filters.model import solve.filters.settings.model.FilterSetting -<<<<<<< HEAD import solve.filters.settings.model.IndicesStepFilterSetting import solve.filters.settings.model.TimePeriodFilterSetting import solve.filters.settings.model.UIDFilterSetting @@ -46,15 +45,4 @@ class Filter(val settings: List>) { return "$prefix$indicesStepPart$timePeriodPart$uidPart" } -======= -import solve.project.model.ProjectFrame - -data class Filter(val settings: List>) { - fun apply(frames: List): List { - var suitableFrames = frames - settings.forEach { suitableFrames = it.apply(suitableFrames) } - - return suitableFrames - } ->>>>>>> f6786bc (Update filter settings dialog design and add a logic) } diff --git a/src/main/kotlin/solve/main/MainController.kt b/src/main/kotlin/solve/main/MainController.kt index 321f1bdda..f5370030a 100644 --- a/src/main/kotlin/solve/main/MainController.kt +++ b/src/main/kotlin/solve/main/MainController.kt @@ -2,6 +2,7 @@ package solve.main import solve.catalogue.controller.CatalogueController import solve.main.splitpane.SidePanelLocation +import solve.project.controller.ProjectController import solve.project.model.ProjectFrame import solve.project.model.ProjectLayer import solve.scene.SceneFacade From 14501f33dd13f1be3289365e629689f48452c03a Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sat, 15 Apr 2023 14:18:44 +0300 Subject: [PATCH 30/72] added materialfx dialogs and fixed some bugs --- src/main/kotlin/solve/importer/view/DirectoryPathView.kt | 6 +++--- src/main/kotlin/solve/importer/view/ProjectTreeView.kt | 2 +- src/main/kotlin/solve/menubar/view/MenuBarView.kt | 1 + src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt | 3 ++- src/main/kotlin/solve/utils/ImporterUtils.kt | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/solve/importer/view/DirectoryPathView.kt b/src/main/kotlin/solve/importer/view/DirectoryPathView.kt index 5409458a1..3be3faf72 100644 --- a/src/main/kotlin/solve/importer/view/DirectoryPathView.kt +++ b/src/main/kotlin/solve/importer/view/DirectoryPathView.kt @@ -38,7 +38,7 @@ class DirectoryPathView : View() { BorderPane.setMargin(this, Insets(16.0, 0.0, 0.0, 0.0)) style = "-fx-border-color: #${Style.PrimaryColorLight}; -fx-font-size: ${Style.MainFontSize}; " + - "-fx-font-family: ${Style.FontCondensed}" + "-fx-font-family: ${Style.FontCondensed}" floatMode = FloatMode.BORDER floatingText = "Project directory" @@ -67,8 +67,8 @@ class DirectoryPathView : View() { private val selectButton = mfxButton("SELECT") { style = "-fx-border-color: #${Style.PrimaryColor}; -fx-font-size: ${Style.ButtonFontSize}; " + - "-fx-font-family: ${Style.FontCondensed}; -fx-font-weight:700; -fx-border-radius: 4px; " + - "-fx-text-fill: #${Style.PrimaryColor};" + "-fx-font-family: ${Style.FontCondensed}; -fx-font-weight:700; -fx-border-radius: 4px; " + + "-fx-text-fill: #${Style.PrimaryColor};" BorderPane.setAlignment(this, Pos.CENTER) BorderPane.setMargin(this, Insets(15.0, 0.0, 0.0, 0.0)) textFill = Color.valueOf(Style.PrimaryColor) diff --git a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt index 1ef698bf5..4cccd2395 100644 --- a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt +++ b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt @@ -41,7 +41,7 @@ open class ProjectTreeView : View() { treetableview(rootTree) { addStylesheet(TreeTableViewStylesheet::class) style = "-fx-font-family: ${Style.Font}; -fx-text-fill: #${Style.PrimaryColor}; " + - "-fx-font-size: ${Style.ButtonFontSize};" + "-fx-font-size: ${Style.ButtonFontSize};" BorderPane.setMargin(this, Insets(0.0, 0.0, 2.0, 15.0)) visibleWhen { controller.projectAfterPartialParsing.isNotNull } diff --git a/src/main/kotlin/solve/menubar/view/MenuBarView.kt b/src/main/kotlin/solve/menubar/view/MenuBarView.kt index 9193a6d92..90703c902 100644 --- a/src/main/kotlin/solve/menubar/view/MenuBarView.kt +++ b/src/main/kotlin/solve/menubar/view/MenuBarView.kt @@ -35,6 +35,7 @@ class MenuBarView : View() { button("Manage plugins") { } button("Settings") { + } button("Help") { } diff --git a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt index 4ed784c5a..0c42ca11a 100644 --- a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt @@ -71,5 +71,6 @@ class TreeTableViewStylesheet : Stylesheet() { minHeight = 0.px } } + } -} +} \ No newline at end of file diff --git a/src/main/kotlin/solve/utils/ImporterUtils.kt b/src/main/kotlin/solve/utils/ImporterUtils.kt index 8f030edf2..a1ddf8f87 100644 --- a/src/main/kotlin/solve/utils/ImporterUtils.kt +++ b/src/main/kotlin/solve/utils/ImporterUtils.kt @@ -20,4 +20,4 @@ fun createAlertForError(content: String) { fun List.toStringWithoutBrackets(): String { return this.toString().replace("[", "").replace("]", "") -} +} \ No newline at end of file From b97bc31ccb493ada86ecbfa314f787227e0bf94a Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sat, 15 Apr 2023 14:21:04 +0300 Subject: [PATCH 31/72] removed commented code --- src/main/kotlin/solve/menubar/view/MenuBarView.kt | 1 - src/main/kotlin/solve/utils/ImporterUtils.kt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/kotlin/solve/menubar/view/MenuBarView.kt b/src/main/kotlin/solve/menubar/view/MenuBarView.kt index 90703c902..9193a6d92 100644 --- a/src/main/kotlin/solve/menubar/view/MenuBarView.kt +++ b/src/main/kotlin/solve/menubar/view/MenuBarView.kt @@ -35,7 +35,6 @@ class MenuBarView : View() { button("Manage plugins") { } button("Settings") { - } button("Help") { } diff --git a/src/main/kotlin/solve/utils/ImporterUtils.kt b/src/main/kotlin/solve/utils/ImporterUtils.kt index a1ddf8f87..8f030edf2 100644 --- a/src/main/kotlin/solve/utils/ImporterUtils.kt +++ b/src/main/kotlin/solve/utils/ImporterUtils.kt @@ -20,4 +20,4 @@ fun createAlertForError(content: String) { fun List.toStringWithoutBrackets(): String { return this.toString().replace("[", "").replace("]", "") -} \ No newline at end of file +} From 15c5befd40a60f3f6e71b2e5bd8158cddd285358 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Fri, 21 Apr 2023 23:42:22 +0300 Subject: [PATCH 32/72] changed style of tabs --- src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt b/src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt index b5ed266f9..6f031732e 100644 --- a/src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt +++ b/src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt @@ -9,6 +9,7 @@ import solve.sidepanel.content.SidePanelContentController import solve.styles.SidePanelTabsStyle import solve.styles.Style import tornadofx.* +import java.net.URI open class SidePanelTabsView : View() { private val location: SidePanelLocation by param() From db26999e5d9bf2ff7298dafd3e7f141ab396ed2c Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Fri, 21 Apr 2023 23:55:50 +0300 Subject: [PATCH 33/72] added panels --- src/main/kotlin/solve/sidepanel/LeftPanelView.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/solve/sidepanel/LeftPanelView.kt b/src/main/kotlin/solve/sidepanel/LeftPanelView.kt index 99b480d0e..c4571d0c3 100644 --- a/src/main/kotlin/solve/sidepanel/LeftPanelView.kt +++ b/src/main/kotlin/solve/sidepanel/LeftPanelView.kt @@ -7,6 +7,7 @@ import solve.importer.controller.ImporterController import solve.importer.view.ImporterView import solve.main.MainView import solve.utils.* +import solve.utils.materialfx.MaterialFXDialog import tornadofx.* class LeftPanelView : View() { From 8b08dac91949f084b82aaa00c2a3cb8cc5b61a8a Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Wed, 26 Apr 2023 14:44:06 +0300 Subject: [PATCH 34/72] removed unused --- src/main/kotlin/solve/main/MainView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 94480b9d7..9b89af207 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -215,7 +215,7 @@ class MainView : View() { private data class SidePanelViews(val tabsView: SidePanelTabsView, val contentView: SidePanelContentView) - companion object { + companion object{ private const val LeftSidePanelAndSceneDividerPosition = 0.20 private const val RightSidePanelAndSceneDividerPosition = 0.82 From 826ab5fbc4b8e7e180adf30e8f9debc7d83093f1 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Wed, 26 Apr 2023 14:50:42 +0300 Subject: [PATCH 35/72] added correct icons --- src/main/kotlin/solve/constants/ResourcesPaths.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/solve/constants/ResourcesPaths.kt b/src/main/kotlin/solve/constants/ResourcesPaths.kt index fe0e2db8b..79cb312d1 100644 --- a/src/main/kotlin/solve/constants/ResourcesPaths.kt +++ b/src/main/kotlin/solve/constants/ResourcesPaths.kt @@ -33,3 +33,4 @@ const val IconsFiltersOrCheckBoxPath = "icons/filters/or_checkbox.svg" // Common icons. const val IconsEditPath = "icons/common/edit.svg" const val IconsDeletePath = "icons/common/delete.svg" + From a79b39716a4c06407b1a0c6810e1ee1d6983f27d Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Thu, 27 Apr 2023 12:47:05 +0300 Subject: [PATCH 36/72] added prefSize --- src/main/kotlin/solve/main/MainView.kt | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 9b89af207..d648ca010 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -85,19 +85,54 @@ class MainView : View() { clip = circle graphic = ImageView(importIcon) setPrefSize(56.0, 56.0) +<<<<<<< HEAD style = "-fx-background-color: #${Style.SecondaryColor}; -fx-background-radius: 28;" isFocusTraversable = false tooltip("Ctrl+I") +======= + style = "-fx-background-color: #${Style.secondaryColor}; -fx-background-radius: 28;" +>>>>>>> 1fa9d84 (added prefSize) action { importAction() } } +<<<<<<< HEAD private val pluginsButton = createTabButton("Plugins", pluginsIcon) private val settingsButton = createTabButton("Settings", settingsIcon) private val helpButton = createTabButton("Help", helpIcon) +======= + private val pluginsButton = mfxButton("Plugins") { + clip = Style.circleForRipple(this) + contentDisplay = ContentDisplay.TOP + setPrefSize(Style.navigationRailTabSize, Style.navigationRailTabSize) + styleClass.add("mfxButton") + paddingAll = 0.0 + graphic = ImageView(pluginsIcon) + style = Style.tabStyle + } + + private val settingsButton = mfxButton("Settings") { + styleClass.add("mfxButton") + setPrefSize(Style.navigationRailTabSize, Style.navigationRailTabSize) + clip = Style.circleForRipple(this) + paddingAll = 0.0 + contentDisplay = ContentDisplay.TOP + graphic = ImageView(settingsIcon) + style = Style.tabStyle + } + + private val helpButton = mfxButton("Help") { + styleClass.add("mfxButton") + setPrefSize(Style.navigationRailTabSize, Style.navigationRailTabSize) + paddingAll = 0.0 + contentDisplay = ContentDisplay.TOP + graphic = ImageView(helpIcon) + style = Style.tabStyle + } +>>>>>>> 1fa9d84 (added prefSize) private val nameApp = label("SOLVE") { style = "-fx-font-family: ${Style.Font}; -fx-font-weight:700; -fx-font-size: 18px" From ba917e00f799020c79482cb33f76964bd30e9de8 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Fri, 28 Apr 2023 23:13:20 +0300 Subject: [PATCH 37/72] design for mainView --- .../catalogue/view/CatalogueSettingsView.kt | 57 ++++++++++++------ src/main/kotlin/solve/main/MainView.kt | 35 ----------- .../settings/SettingsNodeFactoriesUtils.kt | 6 ++ .../settings/grid/view/GridSettingsView.kt | 12 +++- .../view/VisualizationSettingsLayerCell.kt | 8 +-- .../view/VisualizationSettingsLayersView.kt | 2 + .../solve/styles/CatalogueViewStylesheet.kt | 28 +++++++++ .../kotlin/solve/styles/ListViewStylesheet.kt | 28 +++++++++ .../solve/styles/RangeSliderStylesheet.kt | 33 ++++++++++ .../icons/settings/visualization/edit.png | Bin 1895 -> 341 bytes .../visualization/layer_invisible.png | Bin 5011 -> 639 bytes .../settings/visualization/layer_visible.png | Bin 5208 -> 579 bytes 12 files changed, 149 insertions(+), 60 deletions(-) create mode 100644 src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt create mode 100644 src/main/kotlin/solve/styles/ListViewStylesheet.kt create mode 100644 src/main/kotlin/solve/styles/RangeSliderStylesheet.kt diff --git a/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt b/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt index 303280983..ce1efddf6 100644 --- a/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt +++ b/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt @@ -1,14 +1,19 @@ package solve.catalogue.view import javafx.beans.property.SimpleObjectProperty +import javafx.geometry.Insets import javafx.geometry.Pos import javafx.scene.control.CheckBox -import javafx.scene.control.RadioButton +import javafx.scene.control.ToggleButton import javafx.scene.control.ToggleGroup import javafx.scene.layout.Priority +import org.controlsfx.control.SegmentedButton import solve.catalogue.addNameTooltip import solve.catalogue.controller.CatalogueController import solve.catalogue.model.ViewFormat +import solve.styles.CatalogueViewStylesheet +import solve.styles.Style +import solve.utils.mfxCheckbox import tornadofx.* import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty @@ -30,9 +35,12 @@ class CatalogueSettingsView : View() { private val catalogueView: CatalogueView by inject() - private val viewFormatToggleGroup = ToggleGroup() - private lateinit var fileNameViewRadioButton: RadioButton - private lateinit var imagePreviewRadioButton: RadioButton + private var segmentedButton = SegmentedButton() + + private var viewFormatToggleGroup = ToggleGroup() + private lateinit var fileNameViewRadioButton: ToggleButton + private lateinit var imagePreviewRadioButton: ToggleButton + private lateinit var selectionCheckBox: CheckBox private var checkBoxSelectionState: SelectionState by checkBoxSelectionStateDelegate() @@ -46,8 +54,11 @@ class CatalogueSettingsView : View() { private var isDisplayingInfoLabel = false override val root = vbox { - hbox(5) { - selectionCheckBox = checkbox("Select all", isSelectionCheckBoxCheckedProperty) { + addStylesheet(CatalogueViewStylesheet::class) + + hbox(300) { + padding = Insets(0.0,0.0,0.0,0.0) + selectionCheckBox = mfxCheckbox("", isSelectionCheckBoxCheckedProperty) { addNameTooltip() action { if (isSelected) { @@ -57,15 +68,22 @@ class CatalogueSettingsView : View() { } } } - pane().hgrow = Priority.ALWAYS - fileNameViewRadioButton = radiobutton("File view", viewFormatToggleGroup) { - addNameTooltip() + add(segmentedButton) +// pane().hgrow = Priority.ALWAYS + fileNameViewRadioButton = togglebutton("FILES"){ + style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-weight: ${Style.FontWeightBold};" } - imagePreviewRadioButton = radiobutton("Image preview", viewFormatToggleGroup) { - addNameTooltip() + + imagePreviewRadioButton = togglebutton("IMAGES"){ + style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-weight: ${Style.FontWeightBold};" } + + segmentedButton.buttons.addAll(fileNameViewRadioButton, imagePreviewRadioButton) paddingBottom = 4 + } + + add(infoNode) }.also { initialize() } @@ -108,11 +126,13 @@ class CatalogueSettingsView : View() { viewFormatToggleGroup.selectToggle(getViewFormatRadioButton(CatalogueController.initialViewFormat)) } - private fun getRadioButtonViewFormat(radioButton: RadioButton) = when (radioButton) { - fileNameViewRadioButton -> ViewFormat.FileName - imagePreviewRadioButton -> ViewFormat.ImagePreview - else -> throw IllegalArgumentException("Unexpected view format radio button!") - } + private fun getSegmentedButtonViewFormat(toggleButton: ToggleButton) = + when (toggleButton) { + fileNameViewRadioButton -> ViewFormat.FileName + imagePreviewRadioButton -> ViewFormat.ImagePreview + else -> throw IllegalArgumentException("Unexpected view format radio button!") + } + private fun getViewFormatRadioButton(viewFormat: ViewFormat) = when (viewFormat) { ViewFormat.FileName -> fileNameViewRadioButton @@ -120,9 +140,10 @@ class CatalogueSettingsView : View() { } private fun initializeViewFormatRadioButtons() { + viewFormatToggleGroup = segmentedButton.toggleGroup viewFormatToggleGroup.selectedToggleProperty().onChange { it ?: return@onChange - viewFormat = getRadioButtonViewFormat(it as RadioButton) + viewFormat = getSegmentedButtonViewFormat(it as ToggleButton) } } @@ -137,10 +158,12 @@ class CatalogueSettingsView : View() { selectionCheckBox.isIndeterminate = false isSelectionCheckBoxChecked = true } + SelectionState.None -> { selectionCheckBox.isIndeterminate = false isSelectionCheckBoxChecked = false } + SelectionState.Part -> { selectionCheckBox.isIndeterminate = true isSelectionCheckBoxChecked = false diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index d648ca010..9b89af207 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -85,54 +85,19 @@ class MainView : View() { clip = circle graphic = ImageView(importIcon) setPrefSize(56.0, 56.0) -<<<<<<< HEAD style = "-fx-background-color: #${Style.SecondaryColor}; -fx-background-radius: 28;" isFocusTraversable = false tooltip("Ctrl+I") -======= - style = "-fx-background-color: #${Style.secondaryColor}; -fx-background-radius: 28;" ->>>>>>> 1fa9d84 (added prefSize) action { importAction() } } -<<<<<<< HEAD private val pluginsButton = createTabButton("Plugins", pluginsIcon) private val settingsButton = createTabButton("Settings", settingsIcon) private val helpButton = createTabButton("Help", helpIcon) -======= - private val pluginsButton = mfxButton("Plugins") { - clip = Style.circleForRipple(this) - contentDisplay = ContentDisplay.TOP - setPrefSize(Style.navigationRailTabSize, Style.navigationRailTabSize) - styleClass.add("mfxButton") - paddingAll = 0.0 - graphic = ImageView(pluginsIcon) - style = Style.tabStyle - } - - private val settingsButton = mfxButton("Settings") { - styleClass.add("mfxButton") - setPrefSize(Style.navigationRailTabSize, Style.navigationRailTabSize) - clip = Style.circleForRipple(this) - paddingAll = 0.0 - contentDisplay = ContentDisplay.TOP - graphic = ImageView(settingsIcon) - style = Style.tabStyle - } - - private val helpButton = mfxButton("Help") { - styleClass.add("mfxButton") - setPrefSize(Style.navigationRailTabSize, Style.navigationRailTabSize) - paddingAll = 0.0 - contentDisplay = ContentDisplay.TOP - graphic = ImageView(helpIcon) - style = Style.tabStyle - } ->>>>>>> 1fa9d84 (added prefSize) private val nameApp = label("SOLVE") { style = "-fx-font-family: ${Style.Font}; -fx-font-weight:700; -fx-font-size: 18px" diff --git a/src/main/kotlin/solve/settings/SettingsNodeFactoriesUtils.kt b/src/main/kotlin/solve/settings/SettingsNodeFactoriesUtils.kt index 51c2920ca..3fb608a76 100644 --- a/src/main/kotlin/solve/settings/SettingsNodeFactoriesUtils.kt +++ b/src/main/kotlin/solve/settings/SettingsNodeFactoriesUtils.kt @@ -4,9 +4,11 @@ import javafx.geometry.Pos import javafx.scene.Node import javafx.scene.control.Label import javafx.scene.layout.HBox +import solve.styles.Style import solve.utils.createHGrowHBox import solve.utils.structures.Alignment import tornadofx.add +import tornadofx.label fun createSettingsField( fieldLabel: Label, @@ -19,6 +21,10 @@ fun createSettingsField( val fieldHBox = HBox() val settingsNodeHBox = HBox() + fieldLabel.apply { + style = "-fx-font-family: ${Style.fontCondensed}; -fx-font-size: ${Style.buttonFontSize}" + } + val labelHBox = HBox() labelHBox.add(fieldLabel) labelHBox.alignment = Pos.CENTER diff --git a/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt b/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt index 9a12c277f..14985c341 100644 --- a/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt +++ b/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt @@ -18,6 +18,8 @@ import solve.scene.SceneFacade import solve.scene.controller.SceneController import solve.settings.createSettingsField import solve.settings.grid.controller.GridSettingsController +import solve.styles.RangeSliderStylesheet +import solve.styles.Style import solve.utils.createInsetsWithValue import solve.utils.imageViewIcon import solve.utils.loadResourcesImage @@ -36,6 +38,10 @@ class GridSettingsView : View() { get() = sceneController.installedColumnsNumber override val root = vbox { + stylesheets.add("https://fonts.googleapis.com/css2?family=Roboto+Condensed") + stylesheets.add("https://fonts.googleapis.com/css2?family=Roboto+Condensed:wght@700") + stylesheets.add("https://fonts.googleapis.com/css2?family=Roboto") + addStylesheet(RangeSliderStylesheet::class) vbox { style { backgroundColor += Color.WHITE @@ -191,12 +197,12 @@ class GridSettingsView : View() { } companion object { - private const val GridSettingsViewMinWidth = 220.0 + private const val GridSettingsViewMinWidth = 300.0 - private const val GridSettingsLabelFontSize = 16.0 + private const val GridSettingsLabelFontSize = 14.0 private const val GridSettingsLabelWidth = 100.0 - private const val GridSettingsSettingWidth = 120.0 + private const val GridSettingsSettingWidth = 200.0 private const val GridSettingsColumnsNumberButtonsSize = 18.0 private const val GridSettingsColumnsNumberCounterFontSize = 18.0 diff --git a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt index d7994f5fb..f2587d741 100644 --- a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt +++ b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt @@ -25,6 +25,7 @@ import solve.scene.model.LandmarkType import solve.scene.model.LayerSettings import solve.settings.visualization.popover.LineLayerSettingsPopOverNode import solve.settings.visualization.popover.PointLayerSettingsPopOverNode +import solve.styles.Style import solve.utils.TransparentScalingButtonStyle import solve.utils.createHGrowHBox import solve.utils.createSnapshot @@ -59,10 +60,6 @@ class VisualizationSettingsLayerCell( prefHeight = LayerFieldHeight addStylesheet(TransparentScalingButtonStyle::class) - val layerIconNode = createLayerIconNode(layerType) - if (layerIconNode != null) { - add(layerIconNode) - } add(createLayerNameLabel()) add(createHGrowHBox()) if (layerType != LandmarkType.Plane) { @@ -118,8 +115,9 @@ class VisualizationSettingsLayerCell( } private fun createLayerNameLabel(): Label = label(item.layerName) { + style = "-fx-font-style: ${Style.FontCondensed}; -fx-font-size: ${Style.ButtonFontSize}" font = Font.font(LayerFieldNameFontSize) - maxWidth = LayerFieldNameMaxWidth +// maxWidth = LayerFieldNameMaxWidth } private fun createLayerEditButton(layerType: LandmarkType): Node = button { diff --git a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt index 4dab51700..5636590a7 100644 --- a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt +++ b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt @@ -5,6 +5,7 @@ import javafx.scene.layout.Priority import javafx.util.Callback import solve.scene.controller.SceneController import solve.settings.visualization.fields.controller.VisualizationSettingsLayersController +import solve.styles.ListViewStylesheet import solve.utils.nodes.listcell.dragdrop.isListViewCellSource import tornadofx.* @@ -15,6 +16,7 @@ class VisualizationSettingsLayersView : View() { private val fieldListViewCells = mutableListOf() private val fieldsListView = listview(controller.model.layers) { + addStylesheet(ListViewStylesheet::class) cellFactory = Callback { val layerCell = VisualizationSettingsLayerCell(sceneController) fieldListViewCells.add(layerCell) diff --git a/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt b/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt new file mode 100644 index 000000000..5e6779d61 --- /dev/null +++ b/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt @@ -0,0 +1,28 @@ +package solve.styles + +import javafx.scene.paint.Paint +import tornadofx.* + +class CatalogueViewStylesheet : Stylesheet() { + + val segmentedButton by cssclass() + + init { + + segmentedButton { + toggleButton { + backgroundColor += Paint.valueOf(Style.surfaceColor) + borderColor += box(Paint.valueOf(Style.primaryColor)) + borderRadius += box(4.px) + prefWidth = 80.px + prefHeight = 30.px + + and(selected) { + backgroundColor += Paint.valueOf(Style.primaryColor) + textFill = Paint.valueOf(Style.surfaceColor) + } + } + } + + } +} \ No newline at end of file diff --git a/src/main/kotlin/solve/styles/ListViewStylesheet.kt b/src/main/kotlin/solve/styles/ListViewStylesheet.kt new file mode 100644 index 000000000..90672cbd7 --- /dev/null +++ b/src/main/kotlin/solve/styles/ListViewStylesheet.kt @@ -0,0 +1,28 @@ +package solve.styles + +import javafx.scene.paint.Color +import javafx.scene.paint.Paint +import tornadofx.MultiValue +import tornadofx.Stylesheet +import tornadofx.cssproperty + +class ListViewStylesheet : Stylesheet() { + + companion object { + val fxTreeTableCellBorderColor by cssproperty>("-fx-table-cell-border-color") + + val backgroundColour: Color = Color.valueOf(Style.backgroundColour) + val surfaceColor: Color = Color.valueOf(Style.surfaceColor) + val primaryColor: Color = Color.valueOf(Style.primaryColor) + } + + init { + listView { + backgroundColor += surfaceColor + } + + listCell { + backgroundColor += surfaceColor + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/solve/styles/RangeSliderStylesheet.kt b/src/main/kotlin/solve/styles/RangeSliderStylesheet.kt new file mode 100644 index 000000000..7c30ddd7f --- /dev/null +++ b/src/main/kotlin/solve/styles/RangeSliderStylesheet.kt @@ -0,0 +1,33 @@ +package solve.styles + +import javafx.scene.paint.Paint +import solve.settings.visualization.popover.buildSizeSlider +import tornadofx.Stylesheet +import tornadofx.cssclass +import tornadofx.px + +class RangeSliderStylesheet : Stylesheet() { + + val rangeSlider by cssclass() + val lowThumb by cssclass() + val highThumb by cssclass() + val rangeBar by cssclass() + + + init { + rangeSlider { + textFill = Paint.valueOf(Style.surfaceColor) + track { + minWidth = 200.px + backgroundColor += Paint.valueOf(Style.sliderColor) + } + + s(lowThumb, highThumb, rangeBar) { + backgroundColor += Paint.valueOf(Style.primaryColor) + } + + } + + + } +} \ No newline at end of file diff --git a/src/main/resources/icons/settings/visualization/edit.png b/src/main/resources/icons/settings/visualization/edit.png index 220e60573f765f3bc5069fde235de910bf94307e..82e9e5ce6d0dbbe1cf3165f29486e28159fd0170 100644 GIT binary patch literal 341 zcmV-b0jmCqP)9QC&Ju_j_6Sgq9$U>$7p~{iMcygMSw!4OG?-mG*g3f{ znMlsc8oSKwrNBXEOh=QG1{vV-V(Q5qvqEMM5eAFt=rG%CT>?I?t;y{#W+SQ#jRm4!Z76;O;-1xcx@pcvDa nvQQk;_Cq!sMWMuGWg)3ID&H6`xfOE100000NkvXXu0mjfds={X literal 1895 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 ZeZMobSeM^CBJ2PF002ovPDHLkV1kjm42}Q* literal 5011 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 AhyVZp diff --git a/src/main/resources/icons/settings/visualization/layer_visible.png b/src/main/resources/icons/settings/visualization/layer_visible.png index e2bd7638f82035f2aa58fa074f246174d4abc744..d6b6bb8d3e8d2f8829a8c2638ce1bc2b7ecbf647 100644 GIT binary patch literal 579 zcmV-J0=)f+P)00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yPp|FIe$>w$C|w02kGFZdfB@zQFjWY{wO)?ygPWNPkLiPY^q5E3 z3jy&0{${U4%Vs)&N^WY=a}hB6A*7NSuc0P5XW&uGFQcqA>0>$LN(L5oiI^Q5tSjTY z?n{H6LtE|;Xc_D(b60hmC};3H#9Rhd zl=idOiQMnQ%2(W<6S-jL4mgY*3yx#Y<;z3u8VvVbk)1A2+XuHz9Koh8M=rk_W7Gon zI?@-(!YCtU95Ar=#^ifNx|H^_SdZ6CbZu0@jrTbH@g^M%Th*&(5+no8sO*`1f9lMj z6O`sZNUc;wyK+j@% z2^m4QfC!>%PgG!DDM3jxjk*5qUxDyTnbKFzxX2k55?U4l9uU3D;M4t%?F%PB_u=f> R1#|!a002ovPDHLkV1m?r_7DI7 literal 5208 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 From 4493e7fb1509e14a028357ccdc77321e9a47838b Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:04:16 +0300 Subject: [PATCH 38/72] svg instead of png --- src/main/resources/icons/catalogue/apply.png | Bin 3748 -> 0 bytes src/main/resources/icons/catalogue/image.png | Bin 2447 -> 0 bytes .../resources/icons/importer/alert_error.svg | 3 +++ .../resources/icons/importer/check_circle.png | Bin 569 -> 0 bytes .../resources/icons/importer/check_circle.svg | 3 +++ .../resources/icons/importer/description.png | Bin 270 -> 0 bytes .../resources/icons/importer/description.svg | 3 +++ .../resources/icons/importer/error_file.png | Bin 211 -> 0 bytes .../resources/icons/importer/error_file.svg | 3 +++ .../resources/icons/importer/error_folder.png | Bin 262 -> 0 bytes .../resources/icons/importer/error_folder.svg | 4 ++++ .../importer/{Shape.png => list_cell_arrow.png} | Bin src/main/resources/icons/importer/loading.gif | Bin 28904 -> 0 bytes src/main/resources/icons/importer/photo.png | Bin 331 -> 0 bytes src/main/resources/icons/importer/photo.svg | 3 +++ src/main/resources/icons/importer/warning.svg | 3 +++ src/main/resources/icons/logo.png | Bin 0 -> 7923 bytes .../placeholders/catalogue_placeholder.svg | 3 +++ .../resources/icons/settings/grid/decrement.png | Bin 7142 -> 0 bytes .../resources/icons/settings/grid/decrement.svg | 3 +++ src/main/resources/icons/settings/grid/grid.png | Bin 3249 -> 0 bytes .../resources/icons/settings/grid/increment.png | Bin 7325 -> 0 bytes .../resources/icons/settings/grid/increment.svg | 3 +++ .../icons/settings/visualization/edit.png | Bin 341 -> 0 bytes .../icons/settings/visualization/edit.svg | 3 +++ .../settings/visualization/layer_invisible.png | Bin 639 -> 0 bytes .../settings/visualization/layer_invisible.svg | 3 +++ .../settings/visualization/layer_visible.png | Bin 579 -> 0 bytes .../settings/visualization/layer_visible.svg | 3 +++ .../icons/settings/visualization/line_layer.png | Bin 7299 -> 0 bytes .../settings/visualization/plane_layer.png | Bin 7511 -> 0 bytes .../settings/visualization/point_layer.png | Bin 6950 -> 0 bytes src/main/resources/icons/sidepanel/Grid.png | Bin 408 -> 0 bytes .../resources/icons/sidepanel/GridSelected.png | Bin 386 -> 0 bytes src/main/resources/icons/sidepanel/Help.png | Bin 850 -> 0 bytes src/main/resources/icons/sidepanel/Import.png | Bin 336 -> 0 bytes src/main/resources/icons/sidepanel/Layers.png | Bin 726 -> 0 bytes .../resources/icons/sidepanel/LayersFilled.png | Bin 633 -> 0 bytes src/main/resources/icons/sidepanel/Plugins.png | Bin 636 -> 0 bytes src/main/resources/icons/sidepanel/Project.png | Bin 296 -> 0 bytes .../resources/icons/sidepanel/ProjectFilled.png | Bin 277 -> 0 bytes src/main/resources/icons/sidepanel/Settings.png | Bin 993 -> 0 bytes src/main/resources/icons/sidepanel/grid.svg | 3 +++ .../resources/icons/sidepanel/grid_selected.svg | 3 +++ src/main/resources/icons/sidepanel/help.svg | 3 +++ src/main/resources/icons/sidepanel/import.svg | 3 +++ src/main/resources/icons/sidepanel/layers.svg | 3 +++ .../icons/sidepanel/layers_selected.svg | 3 +++ src/main/resources/icons/sidepanel/plugins.svg | 3 +++ src/main/resources/icons/sidepanel/project.svg | 3 +++ .../icons/sidepanel/project_selected.svg | 3 +++ src/main/resources/icons/sidepanel/settings.svg | 3 +++ 52 files changed, 70 insertions(+) delete mode 100644 src/main/resources/icons/catalogue/apply.png delete mode 100644 src/main/resources/icons/catalogue/image.png create mode 100644 src/main/resources/icons/importer/alert_error.svg delete mode 100644 src/main/resources/icons/importer/check_circle.png create mode 100644 src/main/resources/icons/importer/check_circle.svg delete mode 100644 src/main/resources/icons/importer/description.png create mode 100644 src/main/resources/icons/importer/description.svg delete mode 100644 src/main/resources/icons/importer/error_file.png create mode 100644 src/main/resources/icons/importer/error_file.svg delete mode 100644 src/main/resources/icons/importer/error_folder.png create mode 100644 src/main/resources/icons/importer/error_folder.svg rename src/main/resources/icons/importer/{Shape.png => list_cell_arrow.png} (100%) delete mode 100644 src/main/resources/icons/importer/loading.gif create mode 100644 src/main/resources/icons/importer/photo.svg create mode 100644 src/main/resources/icons/importer/warning.svg create mode 100644 src/main/resources/icons/logo.png create mode 100644 src/main/resources/icons/placeholders/catalogue_placeholder.svg delete mode 100644 src/main/resources/icons/settings/grid/decrement.png create mode 100644 src/main/resources/icons/settings/grid/decrement.svg delete mode 100644 src/main/resources/icons/settings/grid/grid.png delete mode 100644 src/main/resources/icons/settings/grid/increment.png create mode 100644 src/main/resources/icons/settings/grid/increment.svg delete mode 100644 src/main/resources/icons/settings/visualization/edit.png create mode 100644 src/main/resources/icons/settings/visualization/edit.svg delete mode 100644 src/main/resources/icons/settings/visualization/layer_invisible.png create mode 100644 src/main/resources/icons/settings/visualization/layer_invisible.svg delete mode 100644 src/main/resources/icons/settings/visualization/layer_visible.png create mode 100644 src/main/resources/icons/settings/visualization/layer_visible.svg delete mode 100644 src/main/resources/icons/settings/visualization/line_layer.png delete mode 100644 src/main/resources/icons/settings/visualization/plane_layer.png delete mode 100644 src/main/resources/icons/settings/visualization/point_layer.png delete mode 100644 src/main/resources/icons/sidepanel/Grid.png delete mode 100644 src/main/resources/icons/sidepanel/GridSelected.png delete mode 100644 src/main/resources/icons/sidepanel/Help.png delete mode 100644 src/main/resources/icons/sidepanel/Import.png delete mode 100644 src/main/resources/icons/sidepanel/Layers.png delete mode 100644 src/main/resources/icons/sidepanel/LayersFilled.png delete mode 100644 src/main/resources/icons/sidepanel/Plugins.png delete mode 100644 src/main/resources/icons/sidepanel/Project.png delete mode 100644 src/main/resources/icons/sidepanel/ProjectFilled.png delete mode 100644 src/main/resources/icons/sidepanel/Settings.png create mode 100644 src/main/resources/icons/sidepanel/grid.svg create mode 100644 src/main/resources/icons/sidepanel/grid_selected.svg create mode 100644 src/main/resources/icons/sidepanel/help.svg create mode 100644 src/main/resources/icons/sidepanel/import.svg create mode 100644 src/main/resources/icons/sidepanel/layers.svg create mode 100644 src/main/resources/icons/sidepanel/layers_selected.svg create mode 100644 src/main/resources/icons/sidepanel/plugins.svg create mode 100644 src/main/resources/icons/sidepanel/project.svg create mode 100644 src/main/resources/icons/sidepanel/project_selected.svg create mode 100644 src/main/resources/icons/sidepanel/settings.svg diff --git a/src/main/resources/icons/catalogue/apply.png b/src/main/resources/icons/catalogue/apply.png deleted file mode 100644 index a8300218d357497c4a163dfc0e13796409624e07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3748 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 F{{jW$;1~b^ diff --git a/src/main/resources/icons/catalogue/image.png b/src/main/resources/icons/catalogue/image.png deleted file mode 100644 index c90235736a85104630a5b81e15dfa90346ceb63e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2447 zcmZWrc{tQ-8=e`An5@~?leIy%VVXgt>}4C2D2?ol-(PTdfxk4?)QDJ`?{V#-aHRCM=?<)Q4k0u=ImsL z;bYBTegMip6XedU@IfTb={z0;y8YoV2hSH*Yw(MT3HH7TUa_GGiGlGUpv1&P!-$wD zd{AIqh+%AeSmm0P691x#vz@JX5@mJTzu=;eYR@0v(5o+aj7QC+Y`>l-!`XzP+;`r_ zQ}s+6vk$OWt?EJsp$EA3BMPB-aMjYdp^K zoE&;!ub{q<4<6V!6Lx9*`?srU_dfqT!J)hzW9|Y}qo@WUjeppXzn?a4UIi zI1*Tiaql6UU+)x1A2miI5u7j0BzlFT)>nMD3$A1g5e!DwC-VR23 zM%Ny`>RGL2NxniauC@6>h@TYRRS@!GBc041rI7gj$R4mf~JnKq*yIgWUzn3SIjW zQn!0Syn^GW+hWedVBNEgtOaOobE+kw$>v1eh& z{FsH+AKJwl*cYVa0!m@V91`eeGvL@UT zcxW{A3YZ}CR=(2tWaRrG)Hwl(K&p=X6(OX0@LkgB;2B1;388I!Qo8k(3_x~O&^Dig zQ}zH@f{#H`qvXrVjfeYPV53=z<0dDE1F``xdIQ;I?@yy_#Og%{nLG4m@MN)c(gBVJ z8v$nhu!>8e^R#p&W>p|^!njxwZZB!o*{!K_0%EOle_A2h#i6P5737V}w{n7ZCNN7g zzRZ%h$N6J&RhbLNCtIo|Eh#4VQkQSP!8dg#4^1M#u5aRRZS$)=nk{=5-nD3F0kZ{Y z^er77ydeR#wHeMTIk^(ImOHYB;y}cJ zWd*crcr$FOCOsO=Dy3LmTNmVJkybBC&?Fm=_x7Gbfzv=Zu|eiVAUvs-ub3#3WYgHn zK<-^f`>Y`BlMubZWoprw=f@>Wx5B|mFkPU; zbeU9n1c@FuVP6Mcn7yt!?{$~s;+H>Ny6gVIx=`RJG^VS-EPm=@^;}Ir>F)2AHRPdu4aC~-?>S>|5ch9Bl979 zJ;_!J!r!M`{CyhTp?LMj%U@i9q~h-i2EC^|el0d7zXHU5!hxNWvoelOYx|OlY4{f3PaZ+F>f{#-!1v#&mSI z!=IeygUX4G>aeAHQwty2EUI-r6j94h)vyA(4Y`~Q#(9YlC}PQq?Fjfol=XnL!=g3m zK0=5HN!XGb`$Im<#dUV$sGV`?7|5n8^wcXe?3;^lN?Mk9=#V{7XUb|E4}IW)x|*-p zU)>Cd_OlvoXKdk={UnjlAwR4y?`%QcTE`hb(zAUlQKATn z`UNV>Ou8e}U!4VTX`a|aLTAIzqUOURjZ5W%)}I%a;OSI`Vt|n#B0_{0mL}-mMvSR2 zN>#%VwUOtB3~?R|*O655>W1R<-{QRV`e^42JJAw=sjE#PXnZc=;2iwOt%<&iDET0K zBy;56?~-h|y>mXz?^EA`9%YXnq-c?T&~k!DT&u?-f1zXoWjVbE>1hMNfjWK&Ofm z5+Y@f^Pe6)_h^=ujeF>E+57IpCmD*5^TgG)y4EU1}7s}O`a$H$q%Zi#%3qCur zZX}K=l=cN%lRuL17lBwV$F!%53tM`h)h^;|xTY5s!wsPiH1#@F&PCHT=?!H4Il`l3 z<-a0QWVxV^qMJla1rc+lJ6R(&NFf1ftuH?3|?!A zm77zJvis;C(QW!A&J}f=Xu2vO+N@C?6}W}|fg$peiAT9`v6~C-)C{=o63uf8gX%h( z<@NvY42k^e`>qPf^ToWYJQU3iUkS)f__bPW*PLKv_Zl?_RV$i?6&v0S7ij-)kT%Yk z`KXpReW(}?WdRlwsh79xv;u9oJxtea)@7buaQ-*&eATAr07(3|aiVtHJbjsTs!Ed+ z$gW7*liF#Ih2&uW{P3m*{9|xMReHb{D}+46t0t>El9vamgglPd8Noxirl-}qBm~*~ zaHyK$gFlf+Ajbboc1C zH9lgva^ diff --git a/src/main/resources/icons/importer/alert_error.svg b/src/main/resources/icons/importer/alert_error.svg new file mode 100644 index 000000000..123e4fa68 --- /dev/null +++ b/src/main/resources/icons/importer/alert_error.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/importer/check_circle.png b/src/main/resources/icons/importer/check_circle.png deleted file mode 100644 index 785a203ff474e6aa3096ba6493fce2adaf400863..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569 zcmV-90>=G`P)iGuFz5qbm5(uY2YJlD_@C?`-)Kskwcg4P3Q^dZlsZ~}V-+#=05NeUKd(QKMz zl0X0d%oJhAh}F9fu<+e#F$txdm7T-wi^>ylcte!ka@gAlzaWZXN1i-Xg2ZanLc-Wx zCcc1)*4dX3dq_H%m;!YiTT}<+5S3!P&`d3(_wgd_5x)RpGFb0=_AzxUN%-t zSc1=+1^@_!4CP4*JH`@-2nJ!h840_a)gnWa78L#ozzM_lS>)uxjq%VjNuI}_Mn?Cd zDR%)RYJAUrv12?%50l9<#CJIcq4*=?3i2 zJ!fNSGTi{M9u%-=yzeszt{0H51&nEc6az|xdcOi-HQ3niG@lw-5VlW;tg~k%BGo>s z0F0r|2AT?2Ft)I+@<0Iyy-EhU*0re-m3?B$Xuuy2^+A7m#sVQV$^dL#A)2#k=c4(z zD*NPV9J3c)E~1EgV*nMSP?)|=B2On+)R+eY*BhFj^0)L|W7e-&X5?g2&#*PI?Jmws z+O23-cs)P=n%?Radkf1c^M6EVE$-S5AX&57;3;TI${O + + diff --git a/src/main/resources/icons/importer/description.png b/src/main/resources/icons/importer/description.png deleted file mode 100644 index 2f83da2783f2d6f9f3d2bc6dca64371f63d186af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRn!3HE-lJ=GZDb50q$YKTtZeb8+WSBKa0w~B> z9OUlAuIj=i5%-cT<4v6J=2 z0UosjY;K8+cAcg<2bku>IVpwKd)fc0&Afcaw)WjEnQ5icg1wdu{~ofqOk|rkdFAt_ z46pT*B>N^$SG9h)D67MK;rmB{pQIKSD;*HH+PSeo>r->Pj?#IV9M?R{3#JvhZ?xIN zSjtp$?#Hx8_0_Vc+Xo%L&dkkMA@`+duZ#wJNs&_E8EJzywwbffYFB%|6%3wo73f?B MPgg&ebxsLQ0R4AeuK)l5 diff --git a/src/main/resources/icons/importer/description.svg b/src/main/resources/icons/importer/description.svg new file mode 100644 index 000000000..19765b309 --- /dev/null +++ b/src/main/resources/icons/importer/description.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/importer/error_file.png b/src/main/resources/icons/importer/error_file.png deleted file mode 100644 index 9f77108ab2a93d67987573ca2b2a681cbeadf1ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&C!3HFMz2Xf6Qk(@Ik;M!Q+`=Ht$S`Y;1W=H% zILO_JVcj{Imp~3nx}&cn1H;CC?mvmFKz@d&i(^Oyk-Ub5!mhU@0Efbp1z@ieu zL{KX` zFJ+}ogWk?>9~;ddew@lJdBUvTp;di@97}e{stP7sRk_tuR2nA%?PTzD^>bP0l+XkK Dg_}X1 diff --git a/src/main/resources/icons/importer/error_file.svg b/src/main/resources/icons/importer/error_file.svg new file mode 100644 index 000000000..2b7f8e786 --- /dev/null +++ b/src/main/resources/icons/importer/error_file.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/importer/error_folder.png b/src/main/resources/icons/importer/error_folder.png deleted file mode 100644 index 02d84e4d68212f44e1f781f2cb503b95da20c9bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{%lVd$B+ufy^}BUHYsR}{0Xmbx)78&qol`;+ E046b7CjbBd diff --git a/src/main/resources/icons/importer/error_folder.svg b/src/main/resources/icons/importer/error_folder.svg new file mode 100644 index 000000000..546c9ad07 --- /dev/null +++ b/src/main/resources/icons/importer/error_folder.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/main/resources/icons/importer/Shape.png b/src/main/resources/icons/importer/list_cell_arrow.png similarity index 100% rename from src/main/resources/icons/importer/Shape.png rename to src/main/resources/icons/importer/list_cell_arrow.png diff --git a/src/main/resources/icons/importer/loading.gif b/src/main/resources/icons/importer/loading.gif deleted file mode 100644 index 01510d6164da12ed9199d5998e49f1944481b52d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28904 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 vasMMyQ+Ch}Q^0{{O*^`dzZ!SVWc-`* zbrQu}_TRfQR)!yTIQF37*I9t`~^Ck2aRa7wA<*T^L>!MhNPa74qWkYgCLX#cRE_r=j_-hkseCQhFBK5a{M#9{<0M7075i|&i;vry@$7D&J^ubSTWvP){|&@ z+TC9)cn#!Yt&V9L+g{1x%j1)*qrFpRVN?8uVA8O&AtPqPr$;ByJf~tL6-bBja8H0# z%~Q8a7dp7e2xE~rY$))tIy|HZ;=KatsG5hOaW1?PUbivQ?=L8gy&+8SBT1uv5%v1z z&*!a8G*CuzN)@aIod8p)9VTQhcBtD@SIp)|5vaH`)drar1KFhVC%RZTA5n5jr|UNFx6B^x((1JCaBKch6G_&zpP68i z9YGxm4d;W4*tWW&yRQ2mD!zJItLnByRhb(0?#W>X;jDt$DnEQ1s=nv+6-rDy{j`~z z2JZzHOJ0lq^kWSDhC>698tePv3>5r+a1NyxOV8B$?5_tQZQqe+SDkR@ugk|0v85rllYEL7tGOoaR_FP46S z$tFbWX8=FIh+Inba)HwzmDDteewYpe%S;lHL9xjSwQ~1^K}~~xnXN?$i3p%E3Qs>9 z9lg|mP_?Tx>l*yNz{R2$FwwT3TIv}Gx0nPNRBl|Czhgdndzz&edtp$`BXnfgo+XlF z%3Fw?Z*PzO%eXI%H0Ga$GF1te>Ao+@byq1I&UB%Rvo(hG6;Fg_wj5^DQ#TEg&(4Iz Fe*l+y&xHU0 diff --git a/src/main/resources/icons/importer/photo.png b/src/main/resources/icons/importer/photo.png index df3ecbc559bb0b32fa855ce6358d853a8289685b..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{sT`J$B+ufx0CMkHW>&Ud!O~#SlOV7`G>tp@;m8Is2LwEFYQSM3p_a0(6g87uU_e=u%mBG{1&t;ucLK6Vp$Ad}$ diff --git a/src/main/resources/icons/importer/photo.svg b/src/main/resources/icons/importer/photo.svg new file mode 100644 index 000000000..b32af841d --- /dev/null +++ b/src/main/resources/icons/importer/photo.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/importer/warning.svg b/src/main/resources/icons/importer/warning.svg new file mode 100644 index 000000000..027e005ab --- /dev/null +++ b/src/main/resources/icons/importer/warning.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/logo.png b/src/main/resources/icons/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e6a21dfdb2e7c9511ab848321283cf2d279f6d3b GIT binary patch literal 7923 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

`~1djjuHveF~i>*@RikM-%qwYk)ukRM}O zzlB?e!4M1g{SMN@#!W1Fpmi|B+EWAT%iL`n4n|v)V1(|+v=GCtMkAIYq}4$c>Z+x7 zax{1;x-zV6MoW#x!@Bm3$Rgp=iY_X!*qc?sa=JW9+f#HsTFXQtY}h&S&Q&o_s$wIp z0bIOhCADooM3B0$uKJPP%Mv$O?2&=y!R3QPe~!}i?2VBKaruvLzr=iuA)$k^U#Y3x zUAa1^X4L_rGF6V+9@az-OOXMj}JZw^NQs&NhF3|`w?jrn~?QN>`edT zGKP|XAi`u;hc8av9w(I*JF6qYZ5qor)NW&8mTTBVP0r;EOi=L17ImizN|W>gYX0?v z78Qu{$MUTSA_9JRNou(42ZHZ^oT@rxITkGb@ayfxjRsMBTuPo;Sm5f5Tu$CoORx*? zSZo1ll3D=Z1;SHK20W^7+%hIb$C@O5*vQJ|4DEVS!Qh3MypC|0D`oh^pH+g&RDTgs z&%H4*NY^vw?iSS@5qqA?=^})v2vrAdG2OTO6|Xmbz@e!&!g=9$*EbNw*P|mlUsxiSlge|(A2d_L(w`Zi7T+aW4i{-269!%jqVjK70 zu>T9-wY9_Cc~UgeM!M{<*%pREr4A`R6gCk!^8d#LM_<@vlqBz3O_#8@?=+Cui@}py zlO-?Y4n;w~RI6I=>1DW|aIBLYK~Rm#jA#+Rm^FjC3n4*)lQaqZpw6)SRAmnb0WU#N z%{oat)jalUsqb^+wfdl9*VB{VM#lVNS@rehbDEh?$hJqp0A#N#*uJ2H4|6_5_ zU?YdQ%TIh5x86NuZUi{|bmX&AGP?X`o_Y8)%AvP|90I*{z1{D*9}Mg+#wv{B0|Tny za&cb_3o9D*QJmPnwtrS9?}*XRF)mSDC{CmrpmJP`c8mi;JZOirD}^D4y!PZkzh8UV zjWU`9cvse0M)ilB-Fbx6hFrcMvo28R_vnd+UFmZ}Nlpk6`+(3oMPEYLb5njcZ;w0Z zl;5>-ixaCL^F8Lr3_jvVDwSVCWWo8Bny;(_SSO?H;4Ch2)P)iuBf&V=#{xifWv+AD z0J-b)J$@pG;^-a3)6_o-bKSCLiU$C(bTvdKL=0qksffH^(GtB6eSDE8i;$*}$AO;jx&DfS@ z^H|z*QLT*2wqlJeDtZ3Nt`o(F>x=tT_Tl?tJ!;5u)Q!^L3x<&edFsi5o3VibvBBV8 zNMJS>z9|x7Ef)r`5GcBj&D?zaeKFea*bmFVnn_ZYdNO%Bz;EToX-c0tWpBJL-eYR%tTAii*U9!#(r7Wg%+HEpBJ{T>C89GGM{cM|+XDJ6U z2ksOLm6VKwl;58N!^89`_+uf^IRi{a=?=8k5g%$S6cW1))@(r9bI!dlokk>(pV8$0 ze+lcqbdXH^lh)IEgg~uFjsP6aEvfFDb&xtNflNbt8fDD9-o^Gk7+0rvL>`~5+pwT% z60F=;$Q3HEmar#`WU`8ZvgkNvR3fMY*Z1t-=S@4M?@X8T9S>mijuS#>s^s=7yS^Ls zx&%PbH)i=ie0k=UcQTYMPH_a{(`Uyon@Jc*oRp%Rm1RG)T5v%x0G+|wPh_259>8Bw zt%u-G6@(uyKlyI7oOo}3{RUdh;BFv%{b-aaz5t!|@B*U)Gn?pXv5}2yYaJ87qvV)& z#YIMY>(zmMuV>jFC?L>p(gFD2{)_ehEq{H9x99~;yWtnRHTy)DFI+P#HbKSy7XY8X A?f?J) literal 0 HcmV?d00001 diff --git a/src/main/resources/icons/placeholders/catalogue_placeholder.svg b/src/main/resources/icons/placeholders/catalogue_placeholder.svg new file mode 100644 index 000000000..80ccb6404 --- /dev/null +++ b/src/main/resources/icons/placeholders/catalogue_placeholder.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/settings/grid/decrement.png b/src/main/resources/icons/settings/grid/decrement.png deleted file mode 100644 index b5143acd02ef02415bdf8183d388cc49b3ef3a5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7142 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 diff --git a/src/main/resources/icons/settings/grid/decrement.svg b/src/main/resources/icons/settings/grid/decrement.svg new file mode 100644 index 000000000..8ce954529 --- /dev/null +++ b/src/main/resources/icons/settings/grid/decrement.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/settings/grid/grid.png b/src/main/resources/icons/settings/grid/grid.png deleted file mode 100644 index 1192825544ff01e22fa0c647e4332967fa684abf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3249 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 M?P&G*SiseP1N|2bG5`Po diff --git a/src/main/resources/icons/settings/grid/increment.png b/src/main/resources/icons/settings/grid/increment.png deleted file mode 100644 index 63a22c918ebb3355128b4ad5955e9fdc35fb4343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7325 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 + + diff --git a/src/main/resources/icons/settings/visualization/edit.png b/src/main/resources/icons/settings/visualization/edit.png deleted file mode 100644 index 82e9e5ce6d0dbbe1cf3165f29486e28159fd0170..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmV-b0jmCqP)9QC&Ju_j_6Sgq9$U>$7p~{iMcygMSw!4OG?-mG*g3f{ znMlsc8oSKwrNBXEOh=QG1{vV-V(Q5qvqEMM5eAFt=rG%CT>?I?t;y{#W+SQ#jRm4!Z76;O;-1xcx@pcvDa nvQQk;_Cq!sMWMuGWg)3ID&H6`xfOE100000NkvXXu0mjfds={X diff --git a/src/main/resources/icons/settings/visualization/edit.svg b/src/main/resources/icons/settings/visualization/edit.svg new file mode 100644 index 000000000..458ab8f8b --- /dev/null +++ b/src/main/resources/icons/settings/visualization/edit.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/settings/visualization/layer_invisible.png b/src/main/resources/icons/settings/visualization/layer_invisible.png deleted file mode 100644 index 49285cbe9dac64fc5a0eb10d29905a9dbc41cd6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 639 zcmV-_0)YLAP)jRKIe~Zr*a-t|OnzJV zlmgC}8Cv?2y#Mlk@)6iBoQF~dl{2Euk!zg{A+m<^yt4(<5&{(nupnz0g#$mJ-mO)8 zgEfZoXt|Fbzsmga`9qnCfH$3X84zE1Z6_^}0EX;)C7N8_TIc;#V9gADk3UK#c*|*b z2(c(@MD!hIV3D5%iJhaMeN#WZS^^epI`;*{+*hbrK;9;>Fl3!8k}ElR z4749x&O;SYJlo#s+H>&*vNvy;pLb02cp?5`+7RToDX9O@$=V+Knyzp-jn z4(u{`Jt>LKCA!mW5ib=A(@@iewlctnNpK|Srs*v`9%G^OEAQZ$QY@C(wuJ#~I8ajx zM5rn~L0n$Akn?oFLWwn-2=0>1lc16tRo%I+pLKOtj3C<(JwaL~75uEhvh1aHi_vcU z>+`i>Mb#~o@?uO>CpoU`x`pK`nljrL(G+zRql?Pdy?}>v| zmyo$}8aToRldj=5D)Lpi8zvA>81~1I{Y;bP&%o=<)SRVy=N>P|J_Y}D#n-A15 ZeZMobSeM^CBJ2PF002ovPDHLkV1kjm42}Q* diff --git a/src/main/resources/icons/settings/visualization/layer_invisible.svg b/src/main/resources/icons/settings/visualization/layer_invisible.svg new file mode 100644 index 000000000..75d628be6 --- /dev/null +++ b/src/main/resources/icons/settings/visualization/layer_invisible.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/settings/visualization/layer_visible.png b/src/main/resources/icons/settings/visualization/layer_visible.png deleted file mode 100644 index d6b6bb8d3e8d2f8829a8c2638ce1bc2b7ecbf647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 579 zcmV-J0=)f+P)00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yPp|FIe$>w$C|w02kGFZdfB@zQFjWY{wO)?ygPWNPkLiPY^q5E3 z3jy&0{${U4%Vs)&N^WY=a}hB6A*7NSuc0P5XW&uGFQcqA>0>$LN(L5oiI^Q5tSjTY z?n{H6LtE|;Xc_D(b60hmC};3H#9Rhd zl=idOiQMnQ%2(W<6S-jL4mgY*3yx#Y<;z3u8VvVbk)1A2+XuHz9Koh8M=rk_W7Gon zI?@-(!YCtU95Ar=#^ifNx|H^_SdZ6CbZu0@jrTbH@g^M%Th*&(5+no8sO*`1f9lMj z6O`sZNUc;wyK+j@% z2^m4QfC!>%PgG!DDM3jxjk*5qUxDyTnbKFzxX2k55?U4l9uU3D;M4t%?F%PB_u=f> R1#|!a002ovPDHLkV1m?r_7DI7 diff --git a/src/main/resources/icons/settings/visualization/layer_visible.svg b/src/main/resources/icons/settings/visualization/layer_visible.svg new file mode 100644 index 000000000..69a7e03c1 --- /dev/null +++ b/src/main/resources/icons/settings/visualization/layer_visible.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/settings/visualization/line_layer.png b/src/main/resources/icons/settings/visualization/line_layer.png deleted file mode 100644 index 6f3f6246d2c4deb8641a68c120273d1e5b4107ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7299 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 dBAVep0{|$Ofm@Fn`002ovPDHLkV1ipj%D(^r diff --git a/src/main/resources/icons/settings/visualization/plane_layer.png b/src/main/resources/icons/settings/visualization/plane_layer.png deleted file mode 100644 index 364ed894d1eaa9d03a10a91af84a040da56fef1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7511 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 diff --git a/src/main/resources/icons/settings/visualization/point_layer.png b/src/main/resources/icons/settings/visualization/point_layer.png deleted file mode 100644 index aeb0be0f7b695c2cbb868eebdd6570df785aff81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6950 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 diff --git a/src/main/resources/icons/sidepanel/Layers.png b/src/main/resources/icons/sidepanel/Layers.png deleted file mode 100644 index 1e4c303924cc8fd85c7c5ef19017d9ecce1486e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 726 zcmV;{0xA88P);=mek>BsqcQ6IeMxxPk30kWvZnNS$tZ zB#o?ZG7Fb$rlJ=Zi02MDi5kN}YSH+CH->T?hK1aWd3X@AOpExolOTsvH3 z)pb{O1rmq>e|kzAI=1^>*$<*4g^V+ScE$^I=zTx5Ghbi=<9qAC&-d?B?SH+6&c z$rnQ;bz7jOh+=Zx4{z_&^Y1?{Q0+{>r0hSRe>{2I&Q+m^DH(BcgA%$Y+&RpW%W}`& z%?OnvXL`%RUHn}~85XER;Z;x%vppghyQgn_Xj#*{gtwp{**xW%`Wl4N3o#HI~HDRb%WdsMV>m2sdd0r%3T9_mgQxx2puL$r)DjKo2 zg1_hR%*BuS9*~B{)+&K`t|BWjs zwq}c_OaRzWTB*amjFP6=wV|lTY%zhzMSjR!HEpxY7!`sv<{%tqdt#Jx=V+YAd|RYv zro&}+F(rOeXH^w-%$5RBzu8qku3Kgc!1HET%Liv^0mZ)QZlR2T2Bq1BFe5ndnr2t$ zH@Su~y{fK#QGv8b)!nRdR*6&ng1xA~rU<(|+4a*ahHJal6MjsMbALFFtpET307*qo IM6N<$g5t(NY5)KL diff --git a/src/main/resources/icons/sidepanel/LayersFilled.png b/src/main/resources/icons/sidepanel/LayersFilled.png deleted file mode 100644 index 195090693c6a4075d19726c488b94bb0a016fbaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 633 zcmV-<0*3vGP)+8x^(E#rsFY&z5TTP0M_{92tYxkS^QYx~qK z@>N9}F1!7@LiJ_@7po$cKQFouts?(S1R*8ffH&+yzCALUb{3k{1WnzmA>shyRp*)O zk-v9qp9~j&Bq$Qt9DI?IBCGNleWXz~N6^%F!mCtWgTL83Q)We!VHmtu1H@GQk5%pyWgX zDB3lJvMb+c3Ykx2oA565{Q;nAWuXZv0ZZC3S`+Q!7L^!*AR^CzBfJ}aF>Mjb0LwBX zTMO}H1C^>>j4Yt&T=#bsf;K8mXiKaRcD%BW8pgkvb_p`>NS&>tcv3t37RB`AwI%E=vbU#eWE-C&Wn%#p;kiw~466IpJ8d4;gyaG?F4 z-RN-FR7~w+zF#I(va;^z!aF&IvM6w3YFA1SCP_?p<_)$|0K~#7Fy;V_e z+CUJUSqQ57<=nvBfZwF8#M1V=_ykc;KsZ6+1my-zPq5~zCrv+l-Mt` z#&#fy!GR=CTJ3svJ+rejZ-!|DOc1mfjqkE-%Ltj(;EO)^Nfp5xl)H?*e{#%OmIK`P zJ|2#!ssT|X3f?#mcH?-!ijU-!kGbkoBknS@^(F#C6V;;CALfy#^@@zg!C4QWwYNc> zXz%lfsa^Y%GpswCJ>f9_R-$}B&j=tHnBd&azw0v6rva;`rw_tS3c8(lrEwGQ{>$Xj z&5bK_Xl06C7_Vs{cIX9A7+|n5r+>Qi%#bX?S6T$bWmPlg*Q`Z5f@|u>I5F6xxg~jiVt)TUrd5>GPB0pCI756FNGw|i`~P6!1!@_Qu6+i=0JZrS#ALj WyYA6QTZ=9L0000;zkZd#|SoA7kSrXPuTQ<%OU2i+FF`CnVE9UF;+eLxfY5$?T=- zD)%^L-mRE$C16ME?X9y-ot*fV8{ZBR;!wV~;D<`z=*kKmdN(6y@sugy*zI6Q{DzwCzc(~ZMzt} zr&sN0Kk&`8I`vq)+%*TuudGMK_qN*nTIs^Qsq0I+7{~AAz4^{73&ri1bbVr;R^Kcy zJ9AUz|CcUXF4nCuTfW+1;+*F5bq?na>R7V>-?*SzXkVnn#6a zNCFH>y{9LsyN2IYzp4>RBpD7DkSaF-xbSFeLU{K+YBnb?*()fOus+AR2(MLYCC2{| zU`Cm9qS=-_*`C(*GV?3|r=pe&PaAVo{Msa1{Tj<7-?D%ZEI-y3AL7gZhyDYpI^wLUCFnzx-+Qd&S@e5`03@f(6JzPx^=d_%AM0le1}nU zDdoS#WN_MLL?)lA5=bh>s2L4fB!odTS~0rp?2_xIuOtl+C@ChVsnTHGnhi{c(duVY z>2A>2G(Ux_gft5F_%<=#T9de6aR3F8GS`&pe~g&J-@{?bF4%4>x4TC@it* z;k_MS8>7pt5g$%lSTzheTA$goZI)&fN9)`y%x49!w>A7d&YNl0L9_*B>Ry8i4un;b z0R?Y1H2mpHFdlYHWjhHNKp*XeQoV6U9`i9$M%nV|lEGJOrlKT2E?TJcQ8t65PY@d5 z#}1#!u$*TKqr-i8ULFK`I)k2y?{dQ;Zi)jts0@q=r)`f%uylCp^rdi}+!!_s&QqRY zk*k&0Pd%9IKHyH>g6Xs-#VP=KpPZb + + diff --git a/src/main/resources/icons/sidepanel/grid_selected.svg b/src/main/resources/icons/sidepanel/grid_selected.svg new file mode 100644 index 000000000..5a5f24968 --- /dev/null +++ b/src/main/resources/icons/sidepanel/grid_selected.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/sidepanel/help.svg b/src/main/resources/icons/sidepanel/help.svg new file mode 100644 index 000000000..12f65a510 --- /dev/null +++ b/src/main/resources/icons/sidepanel/help.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/sidepanel/import.svg b/src/main/resources/icons/sidepanel/import.svg new file mode 100644 index 000000000..320361be9 --- /dev/null +++ b/src/main/resources/icons/sidepanel/import.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/sidepanel/layers.svg b/src/main/resources/icons/sidepanel/layers.svg new file mode 100644 index 000000000..a3f429f49 --- /dev/null +++ b/src/main/resources/icons/sidepanel/layers.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/sidepanel/layers_selected.svg b/src/main/resources/icons/sidepanel/layers_selected.svg new file mode 100644 index 000000000..61b4143fd --- /dev/null +++ b/src/main/resources/icons/sidepanel/layers_selected.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/sidepanel/plugins.svg b/src/main/resources/icons/sidepanel/plugins.svg new file mode 100644 index 000000000..23288ead0 --- /dev/null +++ b/src/main/resources/icons/sidepanel/plugins.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/sidepanel/project.svg b/src/main/resources/icons/sidepanel/project.svg new file mode 100644 index 000000000..f79f09240 --- /dev/null +++ b/src/main/resources/icons/sidepanel/project.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/sidepanel/project_selected.svg b/src/main/resources/icons/sidepanel/project_selected.svg new file mode 100644 index 000000000..389d94f1d --- /dev/null +++ b/src/main/resources/icons/sidepanel/project_selected.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/sidepanel/settings.svg b/src/main/resources/icons/sidepanel/settings.svg new file mode 100644 index 000000000..0599b9843 --- /dev/null +++ b/src/main/resources/icons/sidepanel/settings.svg @@ -0,0 +1,3 @@ + + + From e55b9ae2d624e73004daf0bfdbac5589fac0b153 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:11:43 +0300 Subject: [PATCH 39/72] added design for catalogue --- .../kotlin/solve/catalogue/CatalogueUtils.kt | 18 ++- .../controller/CatalogueController.kt | 4 +- .../catalogue/view/CatalogueSettingsView.kt | 90 +++++++-------- .../solve/catalogue/view/CatalogueView.kt | 109 +++++++++++------- .../view/fields/CatalogueFieldsView.kt | 93 +++++++-------- .../fields/CatalogueFileNamesFieldsView.kt | 38 ++---- .../CataloguePreviewImagesFieldsView.kt | 16 +-- .../solve/styles/CatalogueViewStylesheet.kt | 82 +++++++++++-- 8 files changed, 260 insertions(+), 190 deletions(-) diff --git a/src/main/kotlin/solve/catalogue/CatalogueUtils.kt b/src/main/kotlin/solve/catalogue/CatalogueUtils.kt index 1f382f706..0119fbf81 100644 --- a/src/main/kotlin/solve/catalogue/CatalogueUtils.kt +++ b/src/main/kotlin/solve/catalogue/CatalogueUtils.kt @@ -1,16 +1,28 @@ package solve.catalogue +import io.github.palexdev.materialfx.controls.MFXCheckListView +import io.github.palexdev.materialfx.selection.base.IMultipleSelectionModel +import javafx.beans.property.ObjectProperty +import javafx.beans.property.SimpleObjectProperty import javafx.scene.control.Labeled -import javafx.scene.control.ListView import solve.project.model.ProjectFrame import solve.project.model.ProjectLayer import tornadofx.tooltip + +fun MFXCheckListView.selectionModelProperty(): ObjectProperty> { + return SimpleObjectProperty(selectionModel) +} + +fun MFXCheckListView.setSelectionModel(value: IMultipleSelectionModel) { + selectionModelProperty().set(value) +} + val ProjectFrame.layers: List get() = landmarkFiles.map { it.projectLayer }.distinct() -fun synchronizeListViewsSelections(firstListView: ListView, secondListView: ListView) { - secondListView.selectionModel = firstListView.selectionModel +fun synchronizeListViewsSelections(firstListView: MFXCheckListView, secondListView: MFXCheckListView) { + secondListView.setSelectionModel(firstListView.selectionModel) } fun Labeled.addNameTooltip() { diff --git a/src/main/kotlin/solve/catalogue/controller/CatalogueController.kt b/src/main/kotlin/solve/catalogue/controller/CatalogueController.kt index e05b054fa..c65624c47 100644 --- a/src/main/kotlin/solve/catalogue/controller/CatalogueController.kt +++ b/src/main/kotlin/solve/catalogue/controller/CatalogueController.kt @@ -25,9 +25,9 @@ class CatalogueController : Controller() { SceneFacade.visualize(layers, frames, true) } - fun selectAllFields() = view.selectAllFields() + fun checkAllFields() = view.checkAllFields() - fun deselectAllFields() = view.deselectAllFields() + fun uncheckAllFields() = view.uncheckAllFields() fun changeViewFormat(format: ViewFormat) = view.changeViewFormat(format) diff --git a/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt b/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt index ce1efddf6..4c2d73558 100644 --- a/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt +++ b/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt @@ -6,11 +6,9 @@ import javafx.geometry.Pos import javafx.scene.control.CheckBox import javafx.scene.control.ToggleButton import javafx.scene.control.ToggleGroup -import javafx.scene.layout.Priority -import org.controlsfx.control.SegmentedButton -import solve.catalogue.addNameTooltip import solve.catalogue.controller.CatalogueController import solve.catalogue.model.ViewFormat +import org.controlsfx.control.SegmentedButton import solve.styles.CatalogueViewStylesheet import solve.styles.Style import solve.utils.mfxCheckbox @@ -35,13 +33,7 @@ class CatalogueSettingsView : View() { private val catalogueView: CatalogueView by inject() - private var segmentedButton = SegmentedButton() - - private var viewFormatToggleGroup = ToggleGroup() - private lateinit var fileNameViewRadioButton: ToggleButton - private lateinit var imagePreviewRadioButton: ToggleButton - - + private val viewFormatToggleGroup = ToggleGroup() private lateinit var selectionCheckBox: CheckBox private var checkBoxSelectionState: SelectionState by checkBoxSelectionStateDelegate() @@ -53,39 +45,38 @@ class CatalogueSettingsView : View() { } private var isDisplayingInfoLabel = false - override val root = vbox { - addStylesheet(CatalogueViewStylesheet::class) - - hbox(300) { - padding = Insets(0.0,0.0,0.0,0.0) - selectionCheckBox = mfxCheckbox("", isSelectionCheckBoxCheckedProperty) { - addNameTooltip() - action { - if (isSelected) { - controller.selectAllFields() - } else { - controller.deselectAllFields() + private var fileNameViewRadioButton = ToggleButton("FILES").apply { + style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-weight: ${Style.FontWeightBold};" + } + private var imagePreviewRadioButton = ToggleButton("IMAGES").apply { + style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-weight: ${Style.FontWeightBold};" + } + + var segmentedButton = SegmentedButton(fileNameViewRadioButton, imagePreviewRadioButton) + + override val root = + vbox { + hbox(130) { + addStylesheet(CatalogueViewStylesheet::class) + maxWidth = 500.0 + padding = Insets(0.0, 0.0, 0.0, 0.0) + selectionCheckBox = mfxCheckbox("", isSelectionCheckBoxCheckedProperty) { + paddingLeft = 7.0 +// addNameTooltip() + action { + if (isSelected) { + controller.checkAllFields() + } else { + controller.uncheckAllFields() + } } } - } - add(segmentedButton) -// pane().hgrow = Priority.ALWAYS - fileNameViewRadioButton = togglebutton("FILES"){ - style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-weight: ${Style.FontWeightBold};" - } + segmentedButton.toggleGroup = viewFormatToggleGroup - imagePreviewRadioButton = togglebutton("IMAGES"){ - style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-weight: ${Style.FontWeightBold};" + add(segmentedButton) + paddingBottom = 4 } - - segmentedButton.buttons.addAll(fileNameViewRadioButton, imagePreviewRadioButton) - paddingBottom = 4 - - } - - - add(infoNode) - }.also { initialize() } + }.also { initialize() } init { viewFormatProperty.onChange { newFormat -> @@ -96,7 +87,7 @@ class CatalogueSettingsView : View() { fun resetSettings() { checkBoxSelectionState = CatalogueController.initialSelectionState - viewFormatToggleGroup.selectToggle(getViewFormatRadioButton(CatalogueController.initialViewFormat)) + viewFormatToggleGroup.selectToggle(getViewFormatToggleButton(CatalogueController.initialViewFormat)) } fun displayInfoLabel(withText: String) { @@ -123,27 +114,24 @@ class CatalogueSettingsView : View() { private fun initialize() { initializeViewFormatRadioButtons() - viewFormatToggleGroup.selectToggle(getViewFormatRadioButton(CatalogueController.initialViewFormat)) + viewFormatToggleGroup.selectToggle(getViewFormatToggleButton(CatalogueController.initialViewFormat)) } - private fun getSegmentedButtonViewFormat(toggleButton: ToggleButton) = - when (toggleButton) { - fileNameViewRadioButton -> ViewFormat.FileName - imagePreviewRadioButton -> ViewFormat.ImagePreview - else -> throw IllegalArgumentException("Unexpected view format radio button!") - } - + private fun getRadioButtonViewFormat(toggleButton: ToggleButton) = when (toggleButton) { + fileNameViewRadioButton -> ViewFormat.FileName + imagePreviewRadioButton -> ViewFormat.ImagePreview + else -> throw IllegalArgumentException("Unexpected view format toggle button!") + } - private fun getViewFormatRadioButton(viewFormat: ViewFormat) = when (viewFormat) { + private fun getViewFormatToggleButton(viewFormat: ViewFormat) = when (viewFormat) { ViewFormat.FileName -> fileNameViewRadioButton ViewFormat.ImagePreview -> imagePreviewRadioButton } private fun initializeViewFormatRadioButtons() { - viewFormatToggleGroup = segmentedButton.toggleGroup viewFormatToggleGroup.selectedToggleProperty().onChange { it ?: return@onChange - viewFormat = getSegmentedButtonViewFormat(it as ToggleButton) + viewFormat = getRadioButtonViewFormat(it as ToggleButton) } } diff --git a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt index a9004c71c..59d7c55fb 100644 --- a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt +++ b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt @@ -3,15 +3,11 @@ package solve.catalogue.view import javafx.collections.FXCollections import javafx.geometry.Insets import javafx.geometry.Pos +import javafx.scene.control.ContentDisplay +import javafx.scene.image.ImageView import javafx.scene.input.KeyCode import javafx.scene.input.KeyCodeCombination -import javafx.scene.layout.Border -import javafx.scene.layout.BorderStroke -import javafx.scene.layout.BorderStrokeStyle -import javafx.scene.layout.BorderWidths -import javafx.scene.layout.CornerRadii -import javafx.scene.layout.Priority -import javafx.scene.layout.VBox +import javafx.scene.layout.* import javafx.scene.paint.Color import solve.catalogue.controller.CatalogueController import solve.catalogue.model.CatalogueField @@ -20,13 +16,15 @@ import solve.catalogue.synchronizeListViewsSelections import solve.catalogue.view.fields.CatalogueFieldsView import solve.catalogue.view.fields.CatalogueFileNamesFieldsView import solve.catalogue.view.fields.CataloguePreviewImagesFieldsView -import solve.constants.IconsCatalogueApplyPath +import solve.constants.IconsCataloguePlaceholder import solve.filters.view.FilterPanelView import solve.project.model.ProjectFrame import solve.utils.addSafely -import solve.utils.createInsetsWithValue import solve.utils.loadResourcesImage import solve.utils.removeSafely +import solve.styles.CatalogueViewStylesheet +import solve.styles.Style +import solve.utils.* import tornadofx.* class CatalogueView : View() { @@ -36,7 +34,7 @@ class CatalogueView : View() { node ?: return CatalogueController.initialSelectionState return when { - node.areSelectedAllItems -> CatalogueSettingsView.SelectionState.All + node.areCheckedAllItems -> CatalogueSettingsView.SelectionState.All node.isSelectionEmpty -> CatalogueSettingsView.SelectionState.None else -> CatalogueSettingsView.SelectionState.Part } @@ -52,7 +50,7 @@ class CatalogueView : View() { private var nonDisplayingFieldsView: CatalogueFieldsView? = null private val selectedFrames: List - get() = displayingFieldsView?.selectedFrames ?: emptyList() + get() = displayingFieldsView?.checkedFrames ?: emptyList() private val fieldsViewParams = Pair("fields", fields) private val fileNamesFieldsView = find(fieldsViewParams) @@ -60,47 +58,73 @@ class CatalogueView : View() { private lateinit var fieldsVBox: VBox + private val cataloguePlaceholder = loadResourcesImage(IconsCataloguePlaceholder) + private val catalogueNode = hbox { - vbox(5) { - add(settingsView.root) - hbox(5) { - fieldsVBox = vbox { - hgrow = Priority.ALWAYS - } - button { - setPrefSize(ApplyButtonSize, ApplyButtonSize) - val buttonImage = loadResourcesImage(IconsCatalogueApplyPath) - if (buttonImage != null) { - graphic = imageview(buttonImage) { - fitHeight = ApplyButtonSize - isPreserveRatio = true - } + addStylesheet(CatalogueViewStylesheet::class) + borderpane { + style = "-fx-background-color: #${Style.SurfaceColor}" + top { + add(settingsView.root) + } + center { + hbox(5) { + fieldsVBox = vbox { + hgrow = Priority.ALWAYS } + } + } + bottom { + mfxButton("ADD") { + BorderPane.setMargin(this, Insets(5.0, 0.0, 0.0, 0.0)) + BorderPane.setAlignment(this, Pos.CENTER) + setPrefSize(150.0, 31.0) + style = + "-fx-font-style: ${Style.FontCondensed}; -fx-font-weight: ${Style.FontWeightBold}; -fx-background-color: #${Style.PrimaryColor}; -fx-text-fill: #${Style.SurfaceColor};" + action { applySelection() } } - alignment = Pos.CENTER - vgrow = Priority.ALWAYS } + border = Border( BorderStroke(Color.LIGHTGRAY, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths.DEFAULT) ) padding = Insets(5.0, 5.0, 5.0, 10.0) hgrow = Priority.ALWAYS } - padding = createInsetsWithValue(5.0) - vgrow = Priority.ALWAYS } - override val root = vbox { - add(catalogueNode) - initializeNodes() - add(filterPanelView) - - vgrow = Priority.ALWAYS + private val placeholder = label("Project not imported") { + tooltip(text) + padding = Insets(400.0, 50.0, 350.0, 50.0) + graphic = ImageView(cataloguePlaceholder) + contentDisplay = ContentDisplay.TOP + style { + fontFamily = Style.FontCondensed + fontSize = 24.px + } } + override val root = + vbox { + style = "-fx-background-color: #${Style.SurfaceColor}" + add(placeholder) + fields.onChange { + this.clear() + if (fields.isEmpty()) { + this.add(placeholder) + } else { + this.add(catalogueNode) + initializeNodes() + this.add(filterPanelView) + } + } + + vgrow = Priority.ALWAYS + } + init { accelerators[KeyCodeCombination(KeyCode.ENTER)] = { applySelection() @@ -125,13 +149,14 @@ class CatalogueView : View() { fieldsVBox.addSafely(displayingFieldsView?.fieldsListView) } - fun selectAllFields() { - displayingFieldsView?.selectAllItems() - nonDisplayingFieldsView?.selectAllItems() + fun checkAllFields() { + displayingFieldsView?.checkAllItems() + nonDisplayingFieldsView?.checkAllItems() } - fun deselectAllFields() { - displayingFieldsView?.deselectAllItems() - nonDisplayingFieldsView?.deselectAllItems() + + fun uncheckAllFields() { + displayingFieldsView?.uncheckAllItems() + nonDisplayingFieldsView?.uncheckAllItems() } private fun applySelection() { @@ -166,7 +191,7 @@ class CatalogueView : View() { } private fun visualizeProjectImportSelection() { - displayingFieldsView?.selectAllItems() + displayingFieldsView?.checkAllItems() controller.visualizeFramesSelection(selectedFrames) } diff --git a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt index 81bb9a614..eca361774 100644 --- a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt +++ b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt @@ -1,10 +1,11 @@ package solve.catalogue.view.fields +import io.github.palexdev.materialfx.controls.cell.MFXCheckListCell +import io.github.palexdev.materialfx.effects.DepthLevel import javafx.collections.ObservableList +import javafx.geometry.Insets import javafx.scene.Node -import javafx.scene.control.Labeled -import javafx.scene.control.ListView -import javafx.scene.control.SelectionMode +import javafx.scene.control.Label import javafx.scene.image.Image import javafx.scene.image.WritableImage import javafx.scene.input.ClipboardContent @@ -16,23 +17,37 @@ import solve.catalogue.controller.CatalogueController import solve.catalogue.model.CatalogueField import solve.project.model.ProjectFrame import solve.scene.view.SceneView -import solve.utils.deselectAllItems import solve.utils.floorToInt -import solve.utils.onSelectionChanged -import solve.utils.selectAllItems -import solve.utils.selectedItems -import solve.utils.selectedItemsCount +import solve.styles.CatalogueViewStylesheet +import solve.utils.* import tornadofx.* import kotlin.math.min abstract class CatalogueFieldsView : View() { private val fields: ObservableList by param() - val fieldsListView: ListView = listview(fields) { - addStylesheet(CatalogueFieldsStyle::class) - selectionModel.selectionMode = SelectionMode.MULTIPLE - cellFormat { - setListViewCellFormat(this, it) + + val fieldsListView = mfxCheckListView(fields) { + padding = Insets(0.0, 0.0, 0.0, 0.0) + + addStylesheet(CatalogueViewStylesheet::class) + + depthLevel = DepthLevel.LEVEL0 + + setCellFactory { + val cell = + object : MFXCheckListCell(this, it) { + override fun updateItem(item: CatalogueField?) { + super.updateItem(item) + setListViewCellFormat(label, item) + } + } + + setCellHeight(cell) + return@setCellFactory cell } + prefHeight = 3000.0 + prefWidth = 500.0 + vgrow = Priority.ALWAYS hgrow = Priority.ALWAYS } @@ -43,23 +58,30 @@ abstract class CatalogueFieldsView : View() { private val controller: CatalogueController by inject() private val sceneView: SceneView by inject() - val areSelectedAllItems: Boolean - get() = fieldsListView.selectedItemsCount == controller.model.frames.count() + val areCheckedAllItems: Boolean + get() = fieldsListView.checkedItemsCount == controller.model.frames.count() val isSelectionEmpty: Boolean - get() = fieldsListView.selectedItems.isEmpty() + get() = fieldsListView.checkedItems.isEmpty() val selectedItems: List - get() = fieldsListView.selectedItems - val selectedFrames: List - get() = fieldsListView.selectedItems.map { it.frame } + get() = fieldsListView.checkedItems + val checkedFrames: List + get() = fieldsListView.checkedItems.map { it.frame } private var isDragging = false - fun selectAllItems() = fieldsListView.selectAllItems() + fun checkAllItems() = fieldsListView.checkAllItems() - fun deselectAllItems() = fieldsListView.deselectAllItems() + fun uncheckAllItems() = fieldsListView.uncheckAllItems() + + protected fun setCellHeight(cell: MFXCheckListCell) { + cell.prefHeight = listViewCellHeight + } - protected open fun setListViewCellFormat(labeled: Labeled, item: CatalogueField?) { - labeled.prefHeight = listViewCellHeight + protected open fun setListViewCellFormat( + label: Label, + item: CatalogueField? + ) { + label.textProperty().unbind() } protected abstract fun createFieldsSnapshotNode(fields: List): Node @@ -73,9 +95,6 @@ abstract class CatalogueFieldsView : View() { fieldsListView.setOnMouseClicked { controller.onFieldsSelectionChanged() } - fieldsListView.onSelectionChanged { - controller.onFieldsSelectionChanged() - } } private fun initializeDragEvents() { @@ -88,7 +107,7 @@ abstract class CatalogueFieldsView : View() { private fun onSceneDragDropped(@Suppress("UNUSED_PARAMETER") event: DragEvent) { if (isDragging) { - controller.visualizeFramesSelection(selectedFrames) + controller.visualizeFramesSelection(checkedFrames) } isDragging = false @@ -101,7 +120,7 @@ abstract class CatalogueFieldsView : View() { } private fun onCatalogueDragDetected() { - val selectedFields = fieldsListView.selectedItems + val selectedFields = fieldsListView.checkedItems if (selectedFields.isEmpty()) { return } @@ -109,7 +128,7 @@ abstract class CatalogueFieldsView : View() { val dragboard = root.startDragAndDrop(TransferMode.MOVE) val clipboardContent = ClipboardContent().apply { putString("") } dragboard.setContent(clipboardContent) - dragboard.dragView = createFileNameFieldsSnapshot(fieldsListView.selectedItems) + dragboard.dragView = createFileNameFieldsSnapshot(fieldsListView.checkedItems) isDragging = true } @@ -128,19 +147,3 @@ abstract class CatalogueFieldsView : View() { ) } } - -class CatalogueFieldsStyle : Stylesheet() { - init { - listView { - cell { - and(selected) { - backgroundColor += SelectedFieldColor - } - } - } - } - - companion object { - private val SelectedFieldColor = Color.valueOf("#0096c9") - } -} diff --git a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFileNamesFieldsView.kt b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFileNamesFieldsView.kt index 0b469f769..87658b442 100644 --- a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFileNamesFieldsView.kt +++ b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFileNamesFieldsView.kt @@ -7,55 +7,31 @@ import solve.catalogue.model.CatalogueField import solve.constants.IconsCatalogueImagePath import solve.styles.Style import solve.utils.loadResourcesImage +import javafx.scene.control.Label import tornadofx.* class CatalogueFileNamesFieldsView : CatalogueFieldsView() { - private val fileNamesFieldIconImage = loadResourcesImage(IconsCatalogueImagePath) - override val dragViewMaxFieldsNumber = 100 - override val listViewCellHeight = 25.0 + override val listViewCellHeight = 35.0 init { initialize() } - private fun createFieldIconImageView(): ImageView? { - if (fileNamesFieldIconImage != null) { - return imageview(fileNamesFieldIconImage) { - fitHeight = ListViewFieldIconSize - isPreserveRatio = true - } - } - - return null - } - - override fun setListViewCellFormat(labeled: Labeled, item: CatalogueField?) { - super.setListViewCellFormat(labeled, item) - val iconImageView = createFieldIconImageView() - if (iconImageView != null) { - labeled.graphic = iconImageView + override fun setListViewCellFormat(label: Label, item: CatalogueField?) { + super.setListViewCellFormat(label, item) + if (item != null) { + label.text = item.fileName } - labeled.text = item?.fileName } override fun createFieldsSnapshotNode(fields: List) = vbox { fields.map { hbox(4) { - val iconImageView = createFieldIconImageView() - if (iconImageView != null) { - add(iconImageView) - } - text(it.fileName) { - font = Font.font(Style.Font, 14.0) - } + label(it.fileName) } } } override val root = fieldsListView - - companion object { - private const val ListViewFieldIconSize = 20.0 - } } diff --git a/src/main/kotlin/solve/catalogue/view/fields/CataloguePreviewImagesFieldsView.kt b/src/main/kotlin/solve/catalogue/view/fields/CataloguePreviewImagesFieldsView.kt index 28d7afd22..831d76515 100644 --- a/src/main/kotlin/solve/catalogue/view/fields/CataloguePreviewImagesFieldsView.kt +++ b/src/main/kotlin/solve/catalogue/view/fields/CataloguePreviewImagesFieldsView.kt @@ -1,7 +1,8 @@ package solve.catalogue.view.fields import javafx.geometry.Pos -import javafx.scene.control.Labeled +import javafx.scene.control.ContentDisplay +import javafx.scene.control.Label import javafx.scene.image.ImageView import solve.catalogue.model.CatalogueField import tornadofx.* @@ -22,17 +23,16 @@ class CataloguePreviewImagesFieldsView : CatalogueFieldsView() { } } - override fun setListViewCellFormat(labeled: Labeled, item: CatalogueField?) { - super.setListViewCellFormat(labeled, item) + override fun setListViewCellFormat(label: Label, item: CatalogueField?) { + super.setListViewCellFormat(label, item) if (item == null) { return } - labeled.graphic = vbox { - alignment = Pos.CENTER - add(createPreviewImageView(item)) - text(item.fileName) - } + label.graphic = ImageView(item.loadPreviewImage(PreviewImageHeight)) + label.paddingLeft = 90.0 + label.contentDisplay = ContentDisplay.TOP + label.text = item.fileName } override fun createFieldsSnapshotNode(fields: List) = vbox { diff --git a/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt b/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt index 5e6779d61..09f10bfb6 100644 --- a/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt @@ -1,28 +1,94 @@ package solve.styles import javafx.scene.paint.Paint +import javafx.scene.paint.Color import tornadofx.* class CatalogueViewStylesheet : Stylesheet() { + companion object { + val mfxCheckListView by cssclass("mfx-check-list-view") + val mfxCheckListCell by cssclass("mfx-check-list-cell") + val mfxCheckBox by cssclass("mfx-checkbox") + val rippleContainer by cssclass("ripple-container") + val mfxRippleGenerator by cssclass("mfx-ripple-generator") + val mfxRippleColor by cssproperty>("-mfx-ripple-color") + + val backgroundColour: Color = Color.valueOf(Style.BackgroundColor) + val surfaceColor: Color = Color.valueOf(Style.SurfaceColor) + val primaryColor: Color = Color.valueOf(Style.PrimaryColor) + val secondaryColor: Color = Color.valueOf(Style.SecondaryColor) + } + val segmentedButton by cssclass() init { - segmentedButton { toggleButton { - backgroundColor += Paint.valueOf(Style.surfaceColor) - borderColor += box(Paint.valueOf(Style.primaryColor)) - borderRadius += box(4.px) + backgroundColor += surfaceColor + borderColor += box(primaryColor) + prefWidth = 80.px prefHeight = 30.px + and(selected, pressed) { + backgroundColor += primaryColor + textFill = surfaceColor + } + } + } - and(selected) { - backgroundColor += Paint.valueOf(Style.primaryColor) - textFill = Paint.valueOf(Style.surfaceColor) + mfxCheckListView { + virtualFlow { + scrollBar { + prefWidth = 10.0.px + track { + backgroundColor += Color.TRANSPARENT + } + thumb { + backgroundColor += primaryColor + } + } + } + + backgroundColor += surfaceColor + mfxCheckListCell { + borderColor += box(Color.TRANSPARENT) + + and(hover) { + backgroundColor += backgroundColour + } + and(selected, checked) { + and(hover) { + backgroundColor += backgroundColour + } + backgroundColor += surfaceColor } } } + mfxCheckBox { + rippleContainer { + mfxRippleGenerator { + mfxRippleColor.value += secondaryColor + } + } + and(selected) { + box { + backgroundColor += secondaryColor + borderColor += box(secondaryColor) + } + } + box { + borderColor += box(primaryColor) + } + } + + listView { + backgroundColor += surfaceColor + } + + listCell { + backgroundColor += surfaceColor + } } -} \ No newline at end of file +} From 927f65deb5b14dc30f25e7f377e15ab7cbfef246 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:13:41 +0300 Subject: [PATCH 40/72] removed unused --- src/main/kotlin/solve/catalogue/CatalogueUtils.kt | 6 +++--- src/main/kotlin/solve/catalogue/view/CatalogueView.kt | 4 ---- .../solve/catalogue/view/fields/CatalogueFieldsView.kt | 1 - 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/solve/catalogue/CatalogueUtils.kt b/src/main/kotlin/solve/catalogue/CatalogueUtils.kt index 0119fbf81..3d41d9790 100644 --- a/src/main/kotlin/solve/catalogue/CatalogueUtils.kt +++ b/src/main/kotlin/solve/catalogue/CatalogueUtils.kt @@ -25,6 +25,6 @@ fun synchronizeListViewsSelections(firstListView: MFXCheckListView, secon secondListView.setSelectionModel(firstListView.selectionModel) } -fun Labeled.addNameTooltip() { - tooltip(text) -} +//fun Labeled.addNameTooltip() { +// tooltip(text) +//} diff --git a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt index 59d7c55fb..20b57131d 100644 --- a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt +++ b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt @@ -198,8 +198,4 @@ class CatalogueView : View() { private fun resetNodes() { checkForEmptyFields() } - - companion object { - private const val ApplyButtonSize = 15.0 - } } diff --git a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt index eca361774..0dc821394 100644 --- a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt +++ b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt @@ -12,7 +12,6 @@ import javafx.scene.input.ClipboardContent import javafx.scene.input.DragEvent import javafx.scene.input.TransferMode import javafx.scene.layout.Priority -import javafx.scene.paint.Color import solve.catalogue.controller.CatalogueController import solve.catalogue.model.CatalogueField import solve.project.model.ProjectFrame From faeeb799524e5b412c3e70f62139ad54a8a92762 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:14:28 +0300 Subject: [PATCH 41/72] added controller for settings dialog --- .../visualization/popover/DialogClosingController.kt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/kotlin/solve/settings/visualization/popover/DialogClosingController.kt diff --git a/src/main/kotlin/solve/settings/visualization/popover/DialogClosingController.kt b/src/main/kotlin/solve/settings/visualization/popover/DialogClosingController.kt new file mode 100644 index 000000000..03804a92d --- /dev/null +++ b/src/main/kotlin/solve/settings/visualization/popover/DialogClosingController.kt @@ -0,0 +1,8 @@ +package solve.settings.visualization.popover + +import javafx.beans.property.SimpleBooleanProperty +import tornadofx.* + +class DialogClosingController : Controller() { + val isClosing = SimpleBooleanProperty(false) +} \ No newline at end of file From 3637374ed35881a44752fb6722555d75237f2eb3 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:16:05 +0300 Subject: [PATCH 42/72] added design for grid settings --- .../settings/grid/view/GridSettingsView.kt | 151 ++++++++++-------- 1 file changed, 85 insertions(+), 66 deletions(-) diff --git a/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt b/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt index 14985c341..7695aed2f 100644 --- a/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt +++ b/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt @@ -1,15 +1,13 @@ package solve.settings.grid.view import javafx.beans.property.SimpleObjectProperty +import javafx.event.EventTarget import javafx.geometry.Insets import javafx.scene.Node -import javafx.scene.layout.Border -import javafx.scene.layout.BorderStroke -import javafx.scene.layout.BorderStrokeStyle -import javafx.scene.layout.BorderWidths -import javafx.scene.layout.CornerRadii -import javafx.scene.layout.Priority +import javafx.scene.control.Label +import javafx.scene.layout.* import javafx.scene.paint.Color +import javafx.scene.paint.Paint import javafx.scene.text.Font import org.controlsfx.control.RangeSlider import solve.constants.IconsSettingsGridDecrementPath @@ -18,42 +16,34 @@ import solve.scene.SceneFacade import solve.scene.controller.SceneController import solve.settings.createSettingsField import solve.settings.grid.controller.GridSettingsController -import solve.styles.RangeSliderStylesheet import solve.styles.Style -import solve.utils.createInsetsWithValue -import solve.utils.imageViewIcon -import solve.utils.loadResourcesImage -import solve.utils.scale -import solve.utils.unscale -import solve.utils.valuesDifference +import solve.utils.* import tornadofx.* +import solve.utils.materialfx.mfxCircleButton +import solve.utils.materialfx.mfxRangeSlider +import kotlin.math.roundToLong class GridSettingsView : View() { private val controller: GridSettingsController by inject() private val sceneController: SceneController by inject() - private lateinit var scaleRangeSlider: RangeSlider + private var scaleRangeSlider = RangeSlider() private val columnsNumber: Int get() = sceneController.installedColumnsNumber override val root = vbox { - stylesheets.add("https://fonts.googleapis.com/css2?family=Roboto+Condensed") - stylesheets.add("https://fonts.googleapis.com/css2?family=Roboto+Condensed:wght@700") - stylesheets.add("https://fonts.googleapis.com/css2?family=Roboto") - addStylesheet(RangeSliderStylesheet::class) vbox { style { - backgroundColor += Color.WHITE + backgroundColor += Paint.valueOf(Style.SurfaceColor) } vbox { minWidth = GridSettingsViewMinWidth add(createGridSettingsField("Columns", buildColumnsNumberCounter())) - - scaleRangeSlider = buildScaleRangeSlider() - add(createGridSettingsField("Scale range", scaleRangeSlider)) + add(createGridSettingsField("Scale range", hbox())) + add(buildScaleRangeSlider()) } border = Border( BorderStroke(Color.LIGHTGRAY, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths.DEFAULT) @@ -79,7 +69,8 @@ class GridSettingsView : View() { createSettingLabel(name), GridSettingsLabelWidth, settingNode, - GridSettingsSettingWidth + GridSettingsSettingWidth, + isLabelOnLeft = true ) private fun createSettingLabel(name: String) = label(name) { @@ -87,14 +78,29 @@ class GridSettingsView : View() { prefWidth = GridSettingsLabelWidth } - private fun buildScaleRangeSlider(): RangeSlider { - val rangeSlider = RangeSlider( - SceneController.DefaultMinScale, - SceneController.DefaultMaxScale, - SceneController.DefaultMinScale, - SceneController.DefaultMaxScale - ) - rangeSlider.isShowTickLabels = true + + private fun EventTarget.settingFieldLabel( + text: String = "", + fontSize: Double = 14.0, + op: Label.() -> Unit = {} + ) = label(text) { + font = Font.font(Style.Font, fontSize) + + attachTo(this@settingFieldLabel, op) + } + + private fun createIntegerRangeSliderRangeInfoString(rangeSlider: RangeSlider): String { + val fromValue = rangeSlider.lowValue.roundToLong() + val toValue = rangeSlider.highValue.roundToLong() + + return "$fromValue - $toValue" + } + + private fun buildScaleRangeSlider(): Node { + val rangeSlider = + mfxRangeSlider(0.2, 20.0, 0.2, 20.0) { + } + rangeSlider.prefWidth = 130.0 fun isSmallerThanAllowedDifference() = rangeSlider.valuesDifference < GridSettingsScaleRangeMinDifference @@ -115,53 +121,67 @@ class GridSettingsView : View() { controller.setSceneMaxScale(newMaxScale) } - return rangeSlider + val scaleRangeSettingNode = stackpane { + hbox { + add(createHGrowHBox()) + settingFieldLabel() { + rangeSlider.lowValueProperty().onChange { + text = createIntegerRangeSliderRangeInfoString(rangeSlider) + } + rangeSlider.highValueProperty().onChange { + text = createIntegerRangeSliderRangeInfoString(rangeSlider) + } + } + add(createHGrowHBox()) + + paddingBottom = 30.0 + } + add(rangeSlider) + + paddingBottom = 8.0 + paddingLeft = 5.0 + } + + return scaleRangeSettingNode } private fun createColumnsNumberButton( iconPath: String, isActiveProperty: SimpleObjectProperty, action: () -> Unit - ) = button { - style { - backgroundColor += Color.TRANSPARENT - } + ): Node = + mfxCircleButton(radius = 12.0) { + style { + backgroundColor += Color.TRANSPARENT + } - val iconImage = loadResourcesImage(iconPath) + val iconImage = loadResourcesImage(iconPath) - action { - if (isActiveProperty.value) { - action() + action { + if (isActiveProperty.value) { + action() + } } - } - fun updateViewByActivity(isActive: Boolean) { - if (!isActive) { - unscale() - graphic.opacity = GridSettingsColumnsNumberButtonInactiveOpacity - } else { - graphic.opacity = 1.0 + fun updateViewByActivity(isActive: Boolean) { + if (!isActive) { + unscale() + graphic.opacity = GridSettingsColumnsNumberButtonInactiveOpacity + } else { + graphic.opacity = 1.0 + } } - } - iconImage ?: return@button - graphic = imageViewIcon(iconImage, GridSettingsColumnsNumberButtonsSize) - updateViewByActivity(isActiveProperty.value) + iconImage ?: return@mfxCircleButton + graphic = imageViewIcon(iconImage, GridSettingsColumnsNumberButtonsSize) + updateViewByActivity(isActiveProperty.value) - isActiveProperty.onChange { isActive -> - isActive ?: return@onChange + isActiveProperty.onChange { isActive -> + isActive ?: return@onChange - updateViewByActivity(isActive) - } - setOnMouseEntered { - if (isActiveProperty.value) { - scale(GridSettingsColumnsNumberButtonHoveredScale) + updateViewByActivity(isActive) } } - setOnMouseExited { - unscale() - } - } private fun buildColumnsNumberCounter() = hbox(5) { val isDecrementActive = SimpleObjectProperty(false) @@ -197,16 +217,15 @@ class GridSettingsView : View() { } companion object { - private const val GridSettingsViewMinWidth = 300.0 + private const val GridSettingsViewMinWidth = 220.0 - private const val GridSettingsLabelFontSize = 14.0 + private const val GridSettingsLabelFontSize = 16.0 private const val GridSettingsLabelWidth = 100.0 - private const val GridSettingsSettingWidth = 200.0 + private const val GridSettingsSettingWidth = 120.0 private const val GridSettingsColumnsNumberButtonsSize = 18.0 private const val GridSettingsColumnsNumberCounterFontSize = 18.0 - private const val GridSettingsColumnsNumberButtonHoveredScale = 1.25 private const val GridSettingsColumnsNumberButtonInactiveOpacity = 0.6 // Minimal allow difference between the min and max scale values. From 31ac8080c17d2a170a2eb8aebfaa7be175a492cc Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:20:51 +0300 Subject: [PATCH 43/72] added design for layers settings --- .../view/VisualizationSettingsLayerCell.kt | 90 +++++++------------ .../view/VisualizationSettingsLayersView.kt | 4 +- .../LayerSettingsNodeFactoriesUtils.kt | 22 +++-- .../popover/LayerSettingsPopOverNode.kt | 47 ++++++++-- .../popover/LineLayerSettingsPopOverNode.kt | 15 ++-- .../popover/PointLayerSettingsPopOverNode.kt | 15 ++-- 6 files changed, 107 insertions(+), 86 deletions(-) diff --git a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt index f2587d741..e7c937197 100644 --- a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt +++ b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt @@ -1,5 +1,6 @@ package solve.settings.visualization.fields.view +import io.github.palexdev.materialfx.dialogs.MFXStageDialog import javafx.application.Platform import javafx.geometry.Insets import javafx.geometry.Pos @@ -12,35 +13,37 @@ import javafx.scene.control.Label import javafx.scene.image.Image import javafx.scene.input.DragEvent import javafx.scene.text.Font -import javafx.util.Duration import org.controlsfx.control.PopOver import solve.constants.IconsSettingsVisualizationEditPath import solve.constants.IconsSettingsVisualizationLayerInvisiblePath import solve.constants.IconsSettingsVisualizationLayerVisiblePath -import solve.constants.IconsSettingsVisualizationLineLayerPath -import solve.constants.IconsSettingsVisualizationPlaneLayerPath -import solve.constants.IconsSettingsVisualizationPointLayerPath import solve.scene.controller.SceneController import solve.scene.model.LandmarkType import solve.scene.model.LayerSettings +import solve.settings.visualization.VisualizationSettingsView +import solve.settings.visualization.popover.DialogClosingController import solve.settings.visualization.popover.LineLayerSettingsPopOverNode import solve.settings.visualization.popover.PointLayerSettingsPopOverNode +import solve.settings.visualization.popover.SettingsDialogNode import solve.styles.Style -import solve.utils.TransparentScalingButtonStyle import solve.utils.createHGrowHBox import solve.utils.createSnapshot -import solve.utils.createVGrowBox import solve.utils.getScreenPosition import solve.utils.imageViewIcon import solve.utils.loadResourcesImage +import solve.utils.materialfx.MaterialFXDialog.createGenericDialog +import solve.utils.materialfx.MaterialFXDialog.createStageDialog +import solve.utils.materialfx.mfxCircleButton import solve.utils.nodes.listcell.dragdrop.DragAndDropCellItemInfo import solve.utils.nodes.listcell.dragdrop.DragAndDropListCell import solve.utils.structures.DoublePoint import tornadofx.* class VisualizationSettingsLayerCell( - private val sceneController: SceneController + private val sceneController: SceneController, + private val dialogClosingController: DialogClosingController ) : DragAndDropListCell(LayerSettings::class) { + private val settings = find() override fun setAfterDragDropped( event: DragEvent, thisItemInfo: DragAndDropCellItemInfo, @@ -58,14 +61,13 @@ class VisualizationSettingsLayerCell( val layerType = getLayerSettingsType(item) prefHeight = LayerFieldHeight - addStylesheet(TransparentScalingButtonStyle::class) + add(createLayerVisibilityButtonNode() ?: return@hbox) add(createLayerNameLabel()) add(createHGrowHBox()) if (layerType != LandmarkType.Plane) { add(createLayerEditButton(layerType)) } - add(createLayerVisibilityButtonNode() ?: return@hbox) alignment = Pos.CENTER_LEFT paddingRight = LayerFieldHBoxPaddingRight @@ -102,26 +104,14 @@ class VisualizationSettingsLayerCell( } } - private fun createLayerIconNode(layerType: LandmarkType): Node? { - val layerIcon = getLayerIcon(layerType) - layerIcon ?: return null - // Needed to set the padding and to center the imageview. - return vbox { - add(createVGrowBox()) - imageViewIcon(layerIcon, LayerIconWidth) - add(createVGrowBox()) - paddingRight = LayerTypeIconPaddingRight - } - } - private fun createLayerNameLabel(): Label = label(item.layerName) { - style = "-fx-font-style: ${Style.FontCondensed}; -fx-font-size: ${Style.ButtonFontSize}" + style = + "-fx-font-style: ${Style.FontCondensed}; -fx-font-size: ${Style.ButtonFontSize}; -fx-text-fill: #${Style.OnBackgroundColor}" font = Font.font(LayerFieldNameFontSize) -// maxWidth = LayerFieldNameMaxWidth } - private fun createLayerEditButton(layerType: LandmarkType): Node = button { - editIconImage ?: return@button + private fun createLayerEditButton(layerType: LandmarkType): Node = mfxCircleButton(radius = 15.0) { + editIconImage ?: return@mfxCircleButton graphic = imageViewIcon(editIconImage, LayerFieldEditIconSize) isPickOnBounds = false @@ -136,11 +126,10 @@ class VisualizationSettingsLayerCell( val layerInvisibleImageViewIcon = imageViewIcon(layerInvisibleIconImage, LayerVisibilityIconSize) val layerVisibilityButtonNode = hbox { - fun getCurrentVisibilityImageViewIcon() = - if (item.enabled) layerVisibleImageViewIcon else layerInvisibleImageViewIcon + fun getCurrentVisibilityImageViewIcon() = if (item.enabled) + layerVisibleImageViewIcon else layerInvisibleImageViewIcon - button { - graphic = getCurrentVisibilityImageViewIcon() + mfxCircleButton(getCurrentVisibilityImageViewIcon(), 15.0) { action { item.enabled = !item.enabled graphic = getCurrentVisibilityImageViewIcon() @@ -167,7 +156,8 @@ class VisualizationSettingsLayerCell( layerType: LandmarkType ) { val popOverTitle = "${item.layerName} (${layerType.name})" - val popOverNode = createLayerSettingsPopOverNode(item) + val popOverNode = createLayerSettingsPopOverNode(item, popOverTitle) + if (popOverNode != null) { val popOver = createLayerSettingsPopOver( popOverNode, @@ -188,8 +178,7 @@ class VisualizationSettingsLayerCell( } layerSettingsButton.action { if (!isPopOverShowing) { - val showPosition = calculatePopOverShowPosition(spawnNode, layerType) - showPopOver(popOver, spawnNode, showPosition) + popOver.show() } else { popOver.hide() } @@ -197,45 +186,38 @@ class VisualizationSettingsLayerCell( } } - private fun showPopOver(popOver: PopOver, spawnNode: Node, showPosition: DoublePoint) { - popOver.detach() - popOver.show(spawnNode, showPosition.x, showPosition.y) - } - - private fun createLayerSettingsPopOverNode(layerSettings: LayerSettings): Node? = + private fun createLayerSettingsPopOverNode(layerSettings: LayerSettings, title: String): SettingsDialogNode? = when (getLayerSettingsType(layerSettings)) { LandmarkType.Keypoint -> PointLayerSettingsPopOverNode( layerSettings as LayerSettings.PointLayerSettings, - sceneController + sceneController, title, dialogClosingController ).getPopOverNode() + LandmarkType.Line -> LineLayerSettingsPopOverNode( layerSettings as LayerSettings.LineLayerSettings, - sceneController + sceneController, title, dialogClosingController ).getPopOverNode() + LandmarkType.Plane -> null } - private fun createLayerSettingsPopOver(contentNode: Node, titleLabel: String): PopOver { + private fun createLayerSettingsPopOver(contentNode: Node, titleLabel: String): MFXStageDialog { + val content = createGenericDialog(contentNode) + val dialog = createStageDialog(content, settings.currentStage, settings.root) + val popOver = PopOver(contentNode) popOver.detach() popOver.title = titleLabel Platform.runLater { - // Needed for the safe window closing. - listView.scene?.window?.setOnCloseRequest { - popOver.hide(Duration.ZERO) + dialogClosingController.isClosing.onChange { + if (it) dialog.close() } } - return popOver - } - - private fun getLayerIcon(layerType: LandmarkType) = when (layerType) { - LandmarkType.Keypoint -> pointLayerIconImage - LandmarkType.Line -> lineLayerIconImage - LandmarkType.Plane -> planeLayerIconImage + return dialog } private fun getPopOverNodeSize(layerType: LandmarkType) = when (layerType) { @@ -274,21 +256,15 @@ class VisualizationSettingsLayerCell( companion object { private const val LayerFieldHeight = 30.0 - private const val LayerFieldNameMaxWidth = 80.0 private const val LayerFieldNameFontSize = 13.0 private const val LayerFieldEditIconSize = 18.0 private const val LayerVisibilityIconSize = 22.0 - private const val LayerIconWidth = 25.0 private const val LayerFieldHBoxPaddingRight = -2.5 - private const val LayerTypeIconPaddingRight = 5.0 private const val LayerVisibilityIconPaddingLeft = -5.0 private val LayerSettingsSpawnPositionOffset = DoublePoint(-135.0, 25.0) - private val pointLayerIconImage = loadResourcesImage(IconsSettingsVisualizationPointLayerPath) - private val lineLayerIconImage = loadResourcesImage(IconsSettingsVisualizationLineLayerPath) - private val planeLayerIconImage = loadResourcesImage(IconsSettingsVisualizationPlaneLayerPath) private val editIconImage = loadResourcesImage(IconsSettingsVisualizationEditPath) private val layerVisibleIconImage = loadResourcesImage(IconsSettingsVisualizationLayerVisiblePath) private val layerInvisibleIconImage = loadResourcesImage(IconsSettingsVisualizationLayerInvisiblePath) diff --git a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt index 5636590a7..85411f2ec 100644 --- a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt +++ b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt @@ -5,6 +5,7 @@ import javafx.scene.layout.Priority import javafx.util.Callback import solve.scene.controller.SceneController import solve.settings.visualization.fields.controller.VisualizationSettingsLayersController +import solve.settings.visualization.popover.DialogClosingController import solve.styles.ListViewStylesheet import solve.utils.nodes.listcell.dragdrop.isListViewCellSource import tornadofx.* @@ -12,13 +13,14 @@ import tornadofx.* class VisualizationSettingsLayersView : View() { private val sceneController: SceneController by inject() private val controller: VisualizationSettingsLayersController by inject() + private val dialogClosingController: DialogClosingController by inject() private val fieldListViewCells = mutableListOf() private val fieldsListView = listview(controller.model.layers) { addStylesheet(ListViewStylesheet::class) cellFactory = Callback { - val layerCell = VisualizationSettingsLayerCell(sceneController) + val layerCell = VisualizationSettingsLayerCell(sceneController, dialogClosingController) fieldListViewCells.add(layerCell) return@Callback layerCell diff --git a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt index 66e33fcc9..937dfbebe 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt @@ -1,14 +1,17 @@ package solve.settings.visualization.popover +import io.github.palexdev.materialfx.controls.MFXCheckbox +import io.github.palexdev.materialfx.controls.MFXSlider import javafx.beans.InvalidationListener import javafx.beans.WeakInvalidationListener import javafx.beans.value.ChangeListener -import javafx.scene.control.CheckBox import javafx.scene.control.ColorPicker -import javafx.scene.control.Slider import solve.scene.controller.SceneController import solve.scene.model.LayerSettings +import solve.styles.Style +import tornadofx.* +const val ElementWidth = 270.0 fun buildLandmarkColorPicker( layerSettings: LayerSettings, sceneController: SceneController @@ -16,6 +19,7 @@ fun buildLandmarkColorPicker( val colorPicker = ColorPicker() colorPicker.value = layerSettings.commonColor + colorPicker.prefWidth = ElementWidth colorPicker.setOnAction { layerSettings.commonColor = colorPicker.value } @@ -32,8 +36,12 @@ fun buildLandmarkColorPicker( fun buildLandmarkUseOneColorCheckBox( layerSettings: LayerSettings -): CheckBox { - val checkBox = CheckBox() +): MFXCheckbox { + val checkBox = MFXCheckbox() + checkBox.style { + fontFamily = Style.FontCondensed + fontSize = 20.0.px + } checkBox.isSelected = layerSettings.useCommonColor @@ -51,8 +59,8 @@ fun buildSizeSlider( minValue: Double, maxValue: Double, changeListener: ChangeListener -): Slider { - val slider = Slider() +): MFXSlider { + val slider = MFXSlider() if (initialSizeValue !in minValue..maxValue) { throw IllegalArgumentException("The initial selected size value is out of selection range!") @@ -60,7 +68,7 @@ fun buildSizeSlider( slider.min = minValue slider.max = maxValue slider.value = initialSizeValue - slider.isShowTickLabels = true + slider.prefWidth = ElementWidth slider.valueProperty().addListener(changeListener) diff --git a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt index b7225849c..4480c040d 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt @@ -1,23 +1,51 @@ package solve.settings.visualization.popover +import javafx.geometry.Insets import javafx.scene.Node import javafx.scene.control.Label -import javafx.scene.layout.VBox -import javafx.scene.text.Font +import javafx.scene.layout.BorderPane import solve.settings.createSettingsField +import solve.styles.SettingsDialogStylesheet +import solve.styles.Style +import solve.utils.materialfx.mfxButton import solve.utils.structures.Alignment import tornadofx.* abstract class LayerSettingsPopOverNode { - protected val popOver: VBox = VBox() + protected val popOver = SettingsDialogNode().apply { + addStylesheet(SettingsDialogStylesheet::class) + } + + protected fun addCancel(dialogClosingController: DialogClosingController) { + val borderpane = BorderPane().apply { + right = mfxButton("CANCEL") { + BorderPane.setMargin(this, Insets(0.0, 24.0, 24.0, 0.0)) + maxWidth = 75.0 + prefHeight = 23.0 + style = Style.ButtonStyle + action { + dialogClosingController.isClosing.value = true + dialogClosingController.isClosing.value = false + } + } + } + popOver.add(borderpane) + } + + + protected fun addTitle(title: String) { + popOver.title = title + popOver.addTitle() + + } protected fun addSettingField( name: String, settingNode: Node, - settingsNodeAlignment: Alignment = Alignment.Center + settingsNodeAlignment: Alignment = Alignment.Center, + isLabelOnLeft: Boolean, ) { val fieldLabel = Label(name) - fieldLabel.font = Font.font(LayerSettingLabelFontSize) fieldLabel.paddingLeft = LayerSettingsLabelPaddingLeft val settingsField = createSettingsField( @@ -25,17 +53,18 @@ abstract class LayerSettingsPopOverNode { LayerSettingsFieldLabelWidth, settingNode, LayerSettingsSettingNodeWidth, - settingsNodeAlignment + settingsNodeAlignment, + isLabelOnLeft ) popOver.add(settingsField) } - abstract fun getPopOverNode(): Node + abstract fun getPopOverNode(): SettingsDialogNode companion object { - private const val LayerSettingLabelFontSize = 16.0 + private const val LayerSettingLabelFontSize = 20.0 private const val LayerSettingsLabelPaddingLeft = 10.0 private const val LayerSettingsFieldLabelWidth = 100.0 - private const val LayerSettingsSettingNodeWidth = 160.0 + private const val LayerSettingsSettingNodeWidth = 300.0 } } diff --git a/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt index 5db72e3e9..2d510bcd0 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt @@ -1,7 +1,6 @@ package solve.settings.visualization.popover import javafx.beans.value.WeakChangeListener -import javafx.scene.Node import solve.scene.controller.SceneController import solve.scene.model.LayerSettings import solve.scene.model.LayerSettings.LineLayerSettings.Companion.MaxWidthValue @@ -11,7 +10,9 @@ import tornadofx.* class LineLayerSettingsPopOverNode( private val lineLayerSettings: LayerSettings.LineLayerSettings, - private val sceneController: SceneController + private val sceneController: SceneController, + private val title: String, + private val dialogClosingController: DialogClosingController ) : LayerSettingsPopOverNode() { companion object { const val LayerSettingsNodePrefWidth = 260.0 @@ -23,10 +24,11 @@ class LineLayerSettingsPopOverNode( } private val weakWidthSliderValueChangedEventHandler = WeakChangeListener(widthSliderValueChangedEventHandler) - override fun getPopOverNode(): Node { + override fun getPopOverNode(): SettingsDialogNode { popOver.setPrefSize(LayerSettingsNodePrefWidth, LayerSettingsNodePrefHeight) - addSettingField("Color", buildLandmarkColorPicker(lineLayerSettings, sceneController)) + addTitle(title) + addSettingField("Color", buildLandmarkColorPicker(lineLayerSettings, sceneController), isLabelOnLeft = true) addSettingField( "Width", buildSizeSlider( @@ -34,9 +36,10 @@ class LineLayerSettingsPopOverNode( MinWidthValue, MaxWidthValue, weakWidthSliderValueChangedEventHandler - ) + ), isLabelOnLeft = true ) - addSettingField("One color", buildLandmarkUseOneColorCheckBox(lineLayerSettings), Alignment.Left) + addSettingField("One color", buildLandmarkUseOneColorCheckBox(lineLayerSettings), Alignment.Left, isLabelOnLeft = false) + addCancel(dialogClosingController) return popOver } diff --git a/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt index f182ee8f0..2d50bb051 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt @@ -1,7 +1,6 @@ package solve.settings.visualization.popover import javafx.beans.value.WeakChangeListener -import javafx.scene.Node import solve.scene.controller.SceneController import solve.scene.model.LayerSettings import solve.scene.model.LayerSettings.PointLayerSettings.Companion.MaxSizeValue @@ -11,17 +10,20 @@ import tornadofx.* class PointLayerSettingsPopOverNode( private val pointLayerSettings: LayerSettings.PointLayerSettings, - private val sceneController: SceneController + private val sceneController: SceneController, + private val title: String, + private val dialogClosingController: DialogClosingController ) : LayerSettingsPopOverNode() { private val radiusSliderValueChangedEventHandler = ChangeListener { _, _, radiusValue -> pointLayerSettings.selectedRadius = radiusValue as Double } private val weakRadiusSliderValueChangedEventHandler = WeakChangeListener(radiusSliderValueChangedEventHandler) - override fun getPopOverNode(): Node { + override fun getPopOverNode(): SettingsDialogNode { popOver.setPrefSize(LayerSettingsNodePrefWidth, LayerSettingsNodePrefHeight) - addSettingField("Color", buildLandmarkColorPicker(pointLayerSettings, sceneController)) + addTitle(title) + addSettingField("Color", buildLandmarkColorPicker(pointLayerSettings, sceneController), isLabelOnLeft = true) addSettingField( "Size", buildSizeSlider( @@ -29,9 +31,10 @@ class PointLayerSettingsPopOverNode( MinSizeValue, MaxSizeValue, weakRadiusSliderValueChangedEventHandler - ) + ), isLabelOnLeft = true ) - addSettingField("One color", buildLandmarkUseOneColorCheckBox(pointLayerSettings), Alignment.Left) + addSettingField("One color", buildLandmarkUseOneColorCheckBox(pointLayerSettings), Alignment.Left, isLabelOnLeft = false) + addCancel(dialogClosingController) return popOver } From 0c04323d749b002b06975cd619ae786190bd3d5b Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:22:26 +0300 Subject: [PATCH 44/72] removed unused fun and val --- .../fields/view/VisualizationSettingsLayerCell.kt | 11 +---------- .../visualization/popover/LayerSettingsPopOverNode.kt | 1 - 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt index e7c937197..52d670dc9 100644 --- a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt +++ b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt @@ -115,7 +115,7 @@ class VisualizationSettingsLayerCell( graphic = imageViewIcon(editIconImage, LayerFieldEditIconSize) isPickOnBounds = false - initializeLayerSettingsPopOver(this, this, layerType) + initializeLayerSettingsPopOver(this, layerType) alignment = Pos.CENTER_RIGHT } @@ -142,17 +142,8 @@ class VisualizationSettingsLayerCell( return layerVisibilityButtonNode } - private fun calculatePopOverShowPosition(spawnNode: Node, layerType: LandmarkType): DoublePoint { - val labelPosition = spawnNode.getScreenPosition() - val popOverNodeSize = getPopOverNodeSize(layerType) - val popOverNodeSizeOffsetVector = DoublePoint(popOverNodeSize?.x ?: 0.0, 0.0) - - return labelPosition - popOverNodeSizeOffsetVector + LayerSettingsSpawnPositionOffset - } - private fun initializeLayerSettingsPopOver( layerSettingsButton: Button, - spawnNode: Node, layerType: LandmarkType ) { val popOverTitle = "${item.layerName} (${layerType.name})" diff --git a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt index 4480c040d..8ff89eab1 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt @@ -62,7 +62,6 @@ abstract class LayerSettingsPopOverNode { abstract fun getPopOverNode(): SettingsDialogNode companion object { - private const val LayerSettingLabelFontSize = 20.0 private const val LayerSettingsLabelPaddingLeft = 10.0 private const val LayerSettingsFieldLabelWidth = 100.0 private const val LayerSettingsSettingNodeWidth = 300.0 From bea89bb2f3cb37f6cbf93ad54d64ddfa3a80a6e5 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:23:17 +0300 Subject: [PATCH 45/72] removed stylesheet --- .../solve/styles/RangeSliderStylesheet.kt | 33 ------------------- 1 file changed, 33 deletions(-) delete mode 100644 src/main/kotlin/solve/styles/RangeSliderStylesheet.kt diff --git a/src/main/kotlin/solve/styles/RangeSliderStylesheet.kt b/src/main/kotlin/solve/styles/RangeSliderStylesheet.kt deleted file mode 100644 index 7c30ddd7f..000000000 --- a/src/main/kotlin/solve/styles/RangeSliderStylesheet.kt +++ /dev/null @@ -1,33 +0,0 @@ -package solve.styles - -import javafx.scene.paint.Paint -import solve.settings.visualization.popover.buildSizeSlider -import tornadofx.Stylesheet -import tornadofx.cssclass -import tornadofx.px - -class RangeSliderStylesheet : Stylesheet() { - - val rangeSlider by cssclass() - val lowThumb by cssclass() - val highThumb by cssclass() - val rangeBar by cssclass() - - - init { - rangeSlider { - textFill = Paint.valueOf(Style.surfaceColor) - track { - minWidth = 200.px - backgroundColor += Paint.valueOf(Style.sliderColor) - } - - s(lowThumb, highThumb, rangeBar) { - backgroundColor += Paint.valueOf(Style.primaryColor) - } - - } - - - } -} \ No newline at end of file From ce913511fcb1da20b876437ffbf799ec8367d2e0 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:23:54 +0300 Subject: [PATCH 46/72] added placeholder for scene --- src/main/kotlin/solve/scene/view/SceneView.kt | 64 ++++++------------- 1 file changed, 21 insertions(+), 43 deletions(-) diff --git a/src/main/kotlin/solve/scene/view/SceneView.kt b/src/main/kotlin/solve/scene/view/SceneView.kt index e896eb802..ac651f6d4 100644 --- a/src/main/kotlin/solve/scene/view/SceneView.kt +++ b/src/main/kotlin/solve/scene/view/SceneView.kt @@ -1,11 +1,15 @@ package solve.scene.view import javafx.application.Platform +import javafx.geometry.Insets +import javafx.scene.control.ContentDisplay +import javafx.scene.image.ImageView import javafx.scene.input.KeyCode import javafx.scene.input.KeyCodeCombination import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.cancel +import solve.constants.IconsScenePlaceholder import solve.scene.FrameViewSettings import solve.scene.controller.SceneController import solve.scene.model.Landmark @@ -13,14 +17,10 @@ import solve.scene.model.VisualizationFrame import solve.scene.view.association.AssociationsManager import solve.scene.view.association.OutOfFramesLayer import solve.scene.view.virtualizedfx.VirtualizedFXGridProvider -<<<<<<< HEAD +import solve.styles.Style import solve.utils.Cache -======= ->>>>>>> 13f8702 (Just an automaticly formatted codestyle) -import tornadofx.View -import tornadofx.label -import tornadofx.onChange -import tornadofx.vbox +import solve.utils.loadResourcesImage +import tornadofx.* import solve.utils.structures.DoublePoint as DoublePoint import solve.utils.structures.Size as DoubleSize @@ -32,6 +32,8 @@ class SceneView : View() { private val controller: SceneController by inject() private var frameDataLoadingScope = CoroutineScope(Dispatchers.Default) + private val scenePlaceholder = loadResourcesImage(IconsScenePlaceholder) + var currentGrid: Grid? = null private set var currentAssociationsManager: AssociationsManager? = null @@ -39,7 +41,16 @@ class SceneView : View() { private var frameViewCache: Cache? = null override val root = vbox { - label("Empty scene placeholder") + label("Project not imported") { + tooltip(text) + padding = Insets(350.0,500.0,350.0,600.0) + graphic = ImageView(scenePlaceholder) + contentDisplay = ContentDisplay.TOP + style { + fontFamily = Style.FontCondensed + fontSize = 24.px + } + } } init { @@ -71,54 +82,25 @@ class SceneView : View() { val columnsNumber = controller.columnsNumber val outOfFramesLayer = OutOfFramesLayer() -<<<<<<< HEAD val associationsManager = AssociationsManager( -======= - val associationsManager = AssociationsManager( ->>>>>>> 13f8702 (Just an automaticly formatted codestyle) frameSize, framesMargin, controller.scaleProperty, scene.frames, -<<<<<<< HEAD controller.installedColumnsNumberProperty, -======= - columnsNumber, ->>>>>>> 13f8702 (Just an automaticly formatted codestyle) outOfFramesLayer ) currentAssociationsManager = associationsManager val frameViewParameters = FrameViewParameters(frameDataLoadingScope, associationsManager, scene) -<<<<<<< HEAD // if frame size or canvas layers count is not equal frame drawer buffer can not be reused. val canReuseCache = frameViewCache?.parameters?.size == frameSize && - frameViewCache?.parameters?.canvasDepth == scene.canvasLayersCount + frameViewCache?.parameters?.canvasDepth == scene.canvasLayersCount val frameViewSettings = FrameViewSettings(frameSize, scene.canvasLayersCount) val validateFrameView: (FrameView) -> Boolean = { view -> view.size == frameViewSettings.size -======= - val canReuseCache = - frameViewCache?.size == frameSize && frameViewCache?.canvasBufferDepth == scene.canvasLayersCount - frameViewCache = if (canReuseCache) { - frameViewCache!! - } else { - FrameViewCache( - frameSize, - scene.canvasLayersCount - ) { frame, parameters -> - FrameView( - frameSize, - controller.scaleProperty, - frameViewCache!!, - scene.canvasLayersCount, - parameters, - frame - ) - } ->>>>>>> 13f8702 (Just an automaticly formatted codestyle) } // Frame view cache reduces memory allocations by reusing previously created frames with buffers. @@ -138,11 +120,7 @@ class SceneView : View() { } val grid = VirtualizedFXGridProvider.createGrid( -<<<<<<< HEAD scene.frames, -======= - frames, ->>>>>>> 13f8702 (Just an automaticly formatted codestyle) columnsNumber, gridCellSize, controller.scaleProperty, @@ -288,4 +266,4 @@ class SceneView : View() { const val framesMargin = 10.0 const val scrollSpeed = 20.0 } -} +} \ No newline at end of file From 6c5ab66da8a72908d13057728af72fdf6ded21fc Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:24:38 +0300 Subject: [PATCH 47/72] change type of container for dialog --- src/main/kotlin/solve/utils/materialfx/MaterialFXDialog.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/solve/utils/materialfx/MaterialFXDialog.kt b/src/main/kotlin/solve/utils/materialfx/MaterialFXDialog.kt index 4d9a534e9..b3af39c08 100644 --- a/src/main/kotlin/solve/utils/materialfx/MaterialFXDialog.kt +++ b/src/main/kotlin/solve/utils/materialfx/MaterialFXDialog.kt @@ -4,12 +4,13 @@ import io.github.palexdev.materialfx.dialogs.MFXGenericDialog import io.github.palexdev.materialfx.dialogs.MFXGenericDialogBuilder import io.github.palexdev.materialfx.dialogs.MFXStageDialog import io.github.palexdev.materialfx.enums.ScrimPriority +import javafx.scene.Node import javafx.scene.layout.Pane import javafx.stage.Modality import javafx.stage.Stage object MaterialFXDialog { - fun createGenericDialog(container: Pane): MFXGenericDialog { + fun createGenericDialog(container: Node): MFXGenericDialog { return MFXGenericDialogBuilder.build() .setContent(container) .setShowMinimize(false) From 17871089c49ee13aaf8ae22bfc66f1527725d9e4 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:25:27 +0300 Subject: [PATCH 48/72] added size for icon --- src/main/kotlin/solve/importer/view/ProjectTreeView.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt index 4cccd2395..9430792a9 100644 --- a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt +++ b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt @@ -75,7 +75,10 @@ open class ProjectTreeView : View() { if (item != null) { if (item.isLeaf) { if (item.errors.isEmpty()) { - ImageView(fileIcon) + ImageView(fileIcon).apply { + fitHeight = 20.0 + fitWidth = 16.0 + } } else { ImageView(errorFileIcon) } From 9a5a12e02983362f3463721c0588547807933b17 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:25:44 +0300 Subject: [PATCH 49/72] changes paths --- .../kotlin/solve/constants/ResourcesPaths.kt | 53 +++++++++---------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/src/main/kotlin/solve/constants/ResourcesPaths.kt b/src/main/kotlin/solve/constants/ResourcesPaths.kt index 79cb312d1..5590bfcff 100644 --- a/src/main/kotlin/solve/constants/ResourcesPaths.kt +++ b/src/main/kotlin/solve/constants/ResourcesPaths.kt @@ -1,36 +1,33 @@ package solve.constants -const val IconsCatalogueApplyPath = "icons/catalogue/apply.png" -const val IconsCatalogueImagePath = "icons/catalogue/image.png" -const val IconsImporterCheckCirclePath = "icons/importer/check_circle.png" -const val IconsImporterDescriptionPath = "icons/importer/description.png" -const val IconsImporterErrorFilePath = "icons/importer/error_file.png" -const val IconsImporterErrorFolderPath = "icons/importer/error_folder.png" -const val IconsImporterPhotoPath = "icons/importer/photo.png" -const val IconsImporterWarningPath = "icons/importer/warning.png" -const val IconsSettingsVisualizationEditPath = "icons/settings/visualization/edit.png" -const val IconsSettingsVisualizationLayerInvisiblePath = "icons/settings/visualization/layer_invisible.png" -const val IconsSettingsVisualizationLayerVisiblePath = "icons/settings/visualization/layer_visible.png" -const val IconsSettingsVisualizationLineLayerPath = "icons/settings/visualization/line_layer.png" -const val IconsSettingsVisualizationPlaneLayerPath = "icons/settings/visualization/plane_layer.png" -const val IconsSettingsVisualizationPointLayerPath = "icons/settings/visualization/point_layer.png" -const val IconsSettingsGridIncrementPath = "icons/settings/grid/increment.png" -const val IconsSettingsGridDecrementPath = "icons/settings/grid/decrement.png" -const val IconsAlertError = "icons/importer/Vector.png" -const val IconsImportFab = "icons/sidepanel/Import.png" -const val IconsPlugins = "icons/sidepanel/Plugins.png" -const val IconsProject = "/icons/sidepanel/Project.png" -const val IconsProjectFilled = "/icons/sidepanel/ProjectFilled.png" -const val IconsSettings = "icons/sidepanel/Settings.png" -const val IconsHelp = "icons/sidepanel/Help.png" -const val IconsLayers = "/icons/sidepanel/Layers.png" -const val IconsLayersFilled = "/icons/sidepanel/LayersFilled.png" -const val IconsGrid = "/icons/sidepanel/Grid.png" -const val IconsGridSelected = "/icons/sidepanel/GridSelected.png" +const val IconsImporterCheckCirclePath = "icons/importer/check_circle.svg" +const val IconsImporterDescriptionPath = "icons/importer/description.svg" +const val IconsImporterErrorFilePath = "icons/importer/error_file.svg" +const val IconsImporterErrorFolderPath = "icons/importer/error_folder.svg" +const val IconsImporterPhotoPath = "icons/importer/photo.svg" +const val IconsImporterWarningPath = "icons/importer/warning.svg" +const val IconsSettingsVisualizationEditPath = "icons/settings/visualization/edit.svg" +const val IconsSettingsVisualizationLayerInvisiblePath = "icons/settings/visualization/layer_invisible.svg" +const val IconsSettingsVisualizationLayerVisiblePath = "icons/settings/visualization/layer_visible.svg" +const val IconsSettingsGridIncrementPath = "icons/settings/grid/increment.svg" +const val IconsSettingsGridDecrementPath = "icons/settings/grid/decrement.svg" +const val IconsAlertError = "icons/importer/alert_error.svg" +const val IconsImportFab = "icons/sidepanel/import.svg" +const val IconsPlugins = "icons/sidepanel/plugins.svg" +const val IconsProject = "/icons/sidepanel/project.svg" +const val IconsProjectFilled = "/icons/sidepanel/project_selected.svg" +const val IconsSettings = "icons/sidepanel/settings.svg" +const val IconsHelp = "icons/sidepanel/help.svg" +const val IconsLayers = "/icons/sidepanel/layers.svg" +const val IconsLayersFilled = "/icons/sidepanel/layers_selected.svg" +const val IconsGrid = "/icons/sidepanel/grid.svg" +const val IconsGridSelected = "/icons/sidepanel/grid_selected.svg" const val IconsFiltersAddPath = "icons/filters/add.svg" const val IconsFiltersOrCheckBoxPath = "icons/filters/or_checkbox.svg" +const val IconsCataloguePlaceholder = "icons/placeholders/catalogue_placeholder.svg" +const val IconsScenePlaceholder = "icons/placeholders/scene_placeholder.svg" // Common icons. const val IconsEditPath = "icons/common/edit.svg" const val IconsDeletePath = "icons/common/delete.svg" - +const val IconsApp = "/icons/logo.png" From fc145c44a522b936bf3b31ce27bfcc7f32b624cb Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:26:05 +0300 Subject: [PATCH 50/72] changes paths --- src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt index 0c42ca11a..33861c9f6 100644 --- a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt @@ -26,7 +26,7 @@ class TreeTableViewStylesheet : Stylesheet() { treeTableRowCell { arrow { - backgroundImage += URI("/icons/importer/Shape.png") + backgroundImage += URI("/icons/importer/list_cell_arrow.png") prefHeight = 12.px prefWidth = 7.px From a3770eb83a08de78d2122a425be9132c091f31b2 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:30:08 +0300 Subject: [PATCH 51/72] changed and added utils --- .../kotlin/solve/catalogue/CatalogueUtils.kt | 3 --- .../settings/SettingsNodeFactoriesUtils.kt | 20 +++++++++++-------- .../solve/utils/MFXCheckListViewUtils.kt | 13 ++++++++++++ src/main/kotlin/solve/utils/MFXUtils.kt | 1 + .../solve/utils/materialfx/MFXNodesUtils.kt | 2 +- 5 files changed, 27 insertions(+), 12 deletions(-) create mode 100644 src/main/kotlin/solve/utils/MFXCheckListViewUtils.kt diff --git a/src/main/kotlin/solve/catalogue/CatalogueUtils.kt b/src/main/kotlin/solve/catalogue/CatalogueUtils.kt index 3d41d9790..50754d62d 100644 --- a/src/main/kotlin/solve/catalogue/CatalogueUtils.kt +++ b/src/main/kotlin/solve/catalogue/CatalogueUtils.kt @@ -4,11 +4,8 @@ import io.github.palexdev.materialfx.controls.MFXCheckListView import io.github.palexdev.materialfx.selection.base.IMultipleSelectionModel import javafx.beans.property.ObjectProperty import javafx.beans.property.SimpleObjectProperty -import javafx.scene.control.Labeled import solve.project.model.ProjectFrame import solve.project.model.ProjectLayer -import tornadofx.tooltip - fun MFXCheckListView.selectionModelProperty(): ObjectProperty> { return SimpleObjectProperty(selectionModel) diff --git a/src/main/kotlin/solve/settings/SettingsNodeFactoriesUtils.kt b/src/main/kotlin/solve/settings/SettingsNodeFactoriesUtils.kt index 3fb608a76..5453f3c52 100644 --- a/src/main/kotlin/solve/settings/SettingsNodeFactoriesUtils.kt +++ b/src/main/kotlin/solve/settings/SettingsNodeFactoriesUtils.kt @@ -5,10 +5,8 @@ import javafx.scene.Node import javafx.scene.control.Label import javafx.scene.layout.HBox import solve.styles.Style -import solve.utils.createHGrowHBox import solve.utils.structures.Alignment import tornadofx.add -import tornadofx.label fun createSettingsField( fieldLabel: Label, @@ -16,20 +14,19 @@ fun createSettingsField( settingNode: Node, settingNodeWidth: Double, settingsNodeAlignment: Alignment = Alignment.Center, + isLabelOnLeft: Boolean, fieldHeight: Double = 35.0 ): HBox { - val fieldHBox = HBox() + val fieldHBox = HBox(10.0) val settingsNodeHBox = HBox() fieldLabel.apply { - style = "-fx-font-family: ${Style.fontCondensed}; -fx-font-size: ${Style.buttonFontSize}" + style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: ${Style.HeaderFontSize}" } val labelHBox = HBox() labelHBox.add(fieldLabel) labelHBox.alignment = Pos.CENTER - fieldHBox.add(fieldLabel) - fieldLabel.prefWidth = fieldLabelWidth fieldHBox.prefHeight = fieldHeight @@ -42,8 +39,15 @@ fun createSettingsField( settingsNodeHBox.add(wrappedSettingNode) settingsNodeHBox.prefWidth = settingNodeWidth - fieldHBox.add(createHGrowHBox()) - fieldHBox.add(settingsNodeHBox) + if (isLabelOnLeft) { + fieldHBox.add(fieldLabel) + fieldHBox.add(settingsNodeHBox) + } else { + settingsNodeHBox.prefWidth = 5.0 + fieldHBox.add(settingsNodeHBox) + fieldHBox.add(fieldLabel) + fieldHBox.spacing = 0.0 + } return fieldHBox } diff --git a/src/main/kotlin/solve/utils/MFXCheckListViewUtils.kt b/src/main/kotlin/solve/utils/MFXCheckListViewUtils.kt new file mode 100644 index 000000000..481bca438 --- /dev/null +++ b/src/main/kotlin/solve/utils/MFXCheckListViewUtils.kt @@ -0,0 +1,13 @@ +package solve.utils + +import io.github.palexdev.materialfx.controls.MFXCheckListView + +fun MFXCheckListView.checkAllItems() = selectionModel.selectItems(items) + +fun MFXCheckListView.uncheckAllItems() = selectionModel.clearSelection() + +val MFXCheckListView.checkedItems: List + get() = selectionModel.selectedValues + +val MFXCheckListView.checkedItemsCount: Int + get() = selectionModel.selectedValues.count() diff --git a/src/main/kotlin/solve/utils/MFXUtils.kt b/src/main/kotlin/solve/utils/MFXUtils.kt index 6a4d3293d..82366eb69 100644 --- a/src/main/kotlin/solve/utils/MFXUtils.kt +++ b/src/main/kotlin/solve/utils/MFXUtils.kt @@ -74,3 +74,4 @@ fun EventTarget.mfxCheckListView( return mfxCheckListView } + diff --git a/src/main/kotlin/solve/utils/materialfx/MFXNodesUtils.kt b/src/main/kotlin/solve/utils/materialfx/MFXNodesUtils.kt index 61940a721..36dbd0ff9 100644 --- a/src/main/kotlin/solve/utils/materialfx/MFXNodesUtils.kt +++ b/src/main/kotlin/solve/utils/materialfx/MFXNodesUtils.kt @@ -51,7 +51,7 @@ fun MFXContextMenu.lineSeparator() = this.addLineSeparator(MFXContextMenu.Builde fun MFXContextMenuItem.action(op: () -> Unit) = this.setOnAction { op() } -fun Node.mfxCircleButton( +fun EventTarget.mfxCircleButton( graphic: Node? = null, radius: Double = 20.0, text: String = "", From afdb8a1d4d149b03e379181ec3237328e4b7a10b Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:31:11 +0300 Subject: [PATCH 52/72] added design for settings dialog --- .../popover/SettingsDialogNode.kt | 19 +++++ .../solve/styles/SettingsDialogStylesheet.kt | 82 +++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt create mode 100644 src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt diff --git a/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt b/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt new file mode 100644 index 000000000..35b58a76b --- /dev/null +++ b/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt @@ -0,0 +1,19 @@ +package solve.settings.visualization.popover + +import javafx.scene.layout.VBox +import solve.styles.Style +import tornadofx.* + +class SettingsDialogNode : VBox(10.0) { + + var title: String = "" + + fun addTitle() { + val titleLabel = label(title){ + paddingLeft = 10.0 + style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: 28px;" + } + + this.add(titleLabel) + } +} \ No newline at end of file diff --git a/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt b/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt new file mode 100644 index 000000000..8654dbe01 --- /dev/null +++ b/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt @@ -0,0 +1,82 @@ +package solve.styles + +import javafx.scene.paint.Color +import javafx.scene.paint.Paint +import tornadofx.* + +class SettingsDialogStylesheet : Stylesheet() { + + companion object { + private val mfxSlider by cssclass() + private val thumbContainer by cssclass("thumb-container") + + val mfxColor by cssproperty>("-mfx-color") + val mfxRippleGenerator by cssclass("mfx-ripple-generator") + val mfxRippleColor by cssproperty>("-mfx-ripple-color") + val mfxCheckBox by cssclass("mfx-checkbox") + val rippleContainer by cssclass("ripple-container") + + + val backgroundColour: Color = Color.valueOf(Style.BackgroundColor) + val primaryColor: Color = Color.valueOf(Style.PrimaryColor) + } + + init { + colorPicker { + backgroundColor += backgroundColour + borderColor += box(Color.TRANSPARENT) + arrowButton { + arrow { + backgroundColor += Color.valueOf(Style.PrimaryColor) + } + } + } + + mfxCheckBox { + rippleContainer { + mfxRippleGenerator { + mfxRippleColor.value += CatalogueViewStylesheet.secondaryColor + } + } + and(selected) { + box { + backgroundColor += CatalogueViewStylesheet.secondaryColor + borderColor += box(CatalogueViewStylesheet.secondaryColor) + } + } + box { + borderColor += box(CatalogueViewStylesheet.primaryColor) + } + } + + mfxSlider { + bar { + mfxRippleGenerator { + mfxColor.value += primaryColor + mfxRippleColor.value += primaryColor + } + fill = Color.valueOf(Style.PrimaryColor) + } + track { + + mfxColor.value = backgroundColor + fill = backgroundColour + + } + + + thumbContainer { + mfxRippleGenerator { + mfxRippleColor.value += primaryColor + } + + thumb { + mfxColor.value += primaryColor + mfxRippleGenerator { + mfxRippleColor.value += primaryColor + } + } + } + } + } +} From 266cc6592af8ff3f0a95ce319b779ce1e8ce07f7 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:31:34 +0300 Subject: [PATCH 53/72] added svg placeholder --- src/main/resources/icons/placeholders/scene_placeholder.svg | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/main/resources/icons/placeholders/scene_placeholder.svg diff --git a/src/main/resources/icons/placeholders/scene_placeholder.svg b/src/main/resources/icons/placeholders/scene_placeholder.svg new file mode 100644 index 000000000..7a5e3c21d --- /dev/null +++ b/src/main/resources/icons/placeholders/scene_placeholder.svg @@ -0,0 +1,3 @@ + + + From 22452629066854d3cc5b900ee2c19c2739ddc8bc Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:31:46 +0300 Subject: [PATCH 54/72] added icon --- src/main/kotlin/solve/SolveApp.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/kotlin/solve/SolveApp.kt b/src/main/kotlin/solve/SolveApp.kt index 3fcf02ad8..a87efdbc0 100644 --- a/src/main/kotlin/solve/SolveApp.kt +++ b/src/main/kotlin/solve/SolveApp.kt @@ -1,7 +1,9 @@ package solve import de.codecentric.centerdevice.javafxsvg.SvgImageLoaderFactory +import javafx.scene.image.Image import javafx.stage.Stage +import solve.constants.IconsApp import solve.main.MainView import solve.scene.view.landmarks.AnimationProvider import solve.scene.view.landmarks.JavaFXAnimationProvider @@ -18,10 +20,13 @@ class SolveApp : App(MainView::class, ApplicationStylesheet::class) { registerServices() with(stage) { + stage.icons.add(Image(IconsApp)); width = 1000.0 height = 600.0 + title = "SOLVE" isMaximized = true } + super.start(stage) } From 1aaddd3b53314ddb5d893b3e01d7f857b0dd9ee6 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:32:08 +0300 Subject: [PATCH 55/72] removed companion object --- .../kotlin/solve/styles/ListViewStylesheet.kt | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/solve/styles/ListViewStylesheet.kt b/src/main/kotlin/solve/styles/ListViewStylesheet.kt index 90672cbd7..6eed6bfbc 100644 --- a/src/main/kotlin/solve/styles/ListViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/ListViewStylesheet.kt @@ -1,28 +1,19 @@ package solve.styles import javafx.scene.paint.Color -import javafx.scene.paint.Paint -import tornadofx.MultiValue -import tornadofx.Stylesheet -import tornadofx.cssproperty +import tornadofx.* class ListViewStylesheet : Stylesheet() { - - companion object { - val fxTreeTableCellBorderColor by cssproperty>("-fx-table-cell-border-color") - - val backgroundColour: Color = Color.valueOf(Style.backgroundColour) - val surfaceColor: Color = Color.valueOf(Style.surfaceColor) - val primaryColor: Color = Color.valueOf(Style.primaryColor) - } - init { listView { - backgroundColor += surfaceColor + backgroundColor += Color.valueOf(Style.BackgroundColor) } - listCell { - backgroundColor += surfaceColor + backgroundColor += Color.valueOf(Style.SurfaceColor) + } + + cell { + textFill = Color.valueOf(Style.OnBackgroundColor) } } -} \ No newline at end of file +} From 6a7018b2f6ef401eb915add176f04fc4337699af Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 02:33:33 +0300 Subject: [PATCH 56/72] removed or commented unused --- .../view/VisualizationSettingsLayerCell.kt | 25 ++++++++----------- src/main/kotlin/solve/utils/MFXUtils.kt | 1 - 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt index 52d670dc9..59a85c773 100644 --- a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt +++ b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt @@ -28,7 +28,6 @@ import solve.settings.visualization.popover.SettingsDialogNode import solve.styles.Style import solve.utils.createHGrowHBox import solve.utils.createSnapshot -import solve.utils.getScreenPosition import solve.utils.imageViewIcon import solve.utils.loadResourcesImage import solve.utils.materialfx.MaterialFXDialog.createGenericDialog @@ -211,17 +210,17 @@ class VisualizationSettingsLayerCell( return dialog } - private fun getPopOverNodeSize(layerType: LandmarkType) = when (layerType) { - LandmarkType.Keypoint -> DoublePoint( - PointLayerSettingsPopOverNode.LayerSettingsNodePrefWidth, - PointLayerSettingsPopOverNode.LayerSettingsNodePrefHeight - ) - LandmarkType.Line -> DoublePoint( - LineLayerSettingsPopOverNode.LayerSettingsNodePrefWidth, - LineLayerSettingsPopOverNode.LayerSettingsNodePrefHeight - ) - LandmarkType.Plane -> null - } +// private fun getPopOverNodeSize(layerType: LandmarkType) = when (layerType) { +// LandmarkType.Keypoint -> DoublePoint( +// PointLayerSettingsPopOverNode.LayerSettingsNodePrefWidth, +// PointLayerSettingsPopOverNode.LayerSettingsNodePrefHeight +// ) +// LandmarkType.Line -> DoublePoint( +// LineLayerSettingsPopOverNode.LayerSettingsNodePrefWidth, +// LineLayerSettingsPopOverNode.LayerSettingsNodePrefHeight +// ) +// LandmarkType.Plane -> null +// } private fun getLayerSettingsType(layerSettings: LayerSettings) = when (layerSettings) { is LayerSettings.PointLayerSettings -> LandmarkType.Keypoint @@ -254,8 +253,6 @@ class VisualizationSettingsLayerCell( private const val LayerFieldHBoxPaddingRight = -2.5 private const val LayerVisibilityIconPaddingLeft = -5.0 - private val LayerSettingsSpawnPositionOffset = DoublePoint(-135.0, 25.0) - private val editIconImage = loadResourcesImage(IconsSettingsVisualizationEditPath) private val layerVisibleIconImage = loadResourcesImage(IconsSettingsVisualizationLayerVisiblePath) private val layerInvisibleIconImage = loadResourcesImage(IconsSettingsVisualizationLayerInvisiblePath) diff --git a/src/main/kotlin/solve/utils/MFXUtils.kt b/src/main/kotlin/solve/utils/MFXUtils.kt index 82366eb69..6a4d3293d 100644 --- a/src/main/kotlin/solve/utils/MFXUtils.kt +++ b/src/main/kotlin/solve/utils/MFXUtils.kt @@ -74,4 +74,3 @@ fun EventTarget.mfxCheckListView( return mfxCheckListView } - From 5fc31551f9ce96f7f7056455ed43134234e6c0c9 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 21 May 2023 03:10:08 +0300 Subject: [PATCH 57/72] rebase --- src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt | 4 ++-- src/main/kotlin/solve/styles/Style.kt | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt b/src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt index 6f031732e..b6d8f8223 100644 --- a/src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt +++ b/src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt @@ -8,6 +8,7 @@ import solve.sidepanel.SidePanelTab import solve.sidepanel.content.SidePanelContentController import solve.styles.SidePanelTabsStyle import solve.styles.Style +import solve.styles.Style.circleForRipple import tornadofx.* import java.net.URI @@ -45,13 +46,12 @@ open class SidePanelTabsView : View() { private fun addTab(tab: SidePanelTab) { val tabButton = togglebutton(tab.name, tabsToggleGroup) { setPrefSize(Style.NavigationRailTabSize, Style.NavigationRailTabSize) - clip = Style.circleForRipple(this) + clip = circleForRipple(this) styleClass.add(tab.name.lowercase()) contentDisplay = ContentDisplay.TOP style = "-fx-font-family: ${Style.Font}; -fx-font-weight:700;" + " -fx-font-size: ${Style.ButtonFontSize}; -fx-background-radius: 36" - isFocusTraversable = false tooltip(tab.tooltip) setPrefSize(72.0, 72.0) diff --git a/src/main/kotlin/solve/styles/Style.kt b/src/main/kotlin/solve/styles/Style.kt index d375f882f..46ad5e1bb 100644 --- a/src/main/kotlin/solve/styles/Style.kt +++ b/src/main/kotlin/solve/styles/Style.kt @@ -62,7 +62,9 @@ object Style { fun circleForRipple(button: MFXButton) = Circle(button.layoutX + 36.0, button.layoutY + 36.0,35.0) fun circleForRipple(button: ToggleButton) = Circle(button.layoutX + 36.0, button.layoutY + 36.0, 35.0) - const val HeaderFontSize = "20px" const val ControlButtonsSpacing = 10.0 + + const val HeaderFontSize = "20px" + } From 2c9513d0d5a38870786da66b0daac8027fb08e03 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Tue, 23 May 2023 14:23:01 +0300 Subject: [PATCH 58/72] codestyle --- src/main/kotlin/solve/SolveApp.kt | 2 +- .../kotlin/solve/catalogue/CatalogueUtils.kt | 4 +- .../catalogue/view/CatalogueSettingsView.kt | 6 +- .../solve/catalogue/view/CatalogueView.kt | 18 ++-- .../view/fields/CatalogueFieldsView.kt | 8 +- .../fields/CatalogueFileNamesFieldsView.kt | 8 +- .../controller/FilterSettingsController.kt | 2 +- .../filters/settings/model/FilterSetting.kt | 7 -- .../model/IndicesStepFilterSetting.kt | 8 -- .../settings/model/TimePeriodFilterSetting.kt | 9 -- .../settings/model/UIDFilterSetting.kt | 8 -- .../settings/view/FilterSettingsView.kt | 2 +- .../view/controls/FilterSettingControl.kt | 4 +- .../filters/view/FilterPanelFieldsView.kt | 2 +- .../solve/filters/view/FilterPanelView.kt | 2 +- .../kotlin/solve/importer/ProjectParser.kt | 1 - .../solve/importer/view/DirectoryPathView.kt | 6 +- .../solve/importer/view/LoadingScreen.kt | 2 +- .../solve/importer/view/ProjectTreeView.kt | 7 +- src/main/kotlin/solve/main/MainController.kt | 1 - src/main/kotlin/solve/main/MainView.kt | 6 +- src/main/kotlin/solve/scene/SceneFacade.kt | 1 - src/main/kotlin/solve/scene/view/FrameView.kt | 4 +- .../kotlin/solve/scene/view/FrameViewCache.kt | 15 ++-- src/main/kotlin/solve/scene/view/SceneView.kt | 6 +- .../scene/view/landmarks/KeypointView.kt | 5 -- .../solve/scene/view/landmarks/LineView.kt | 10 --- .../scene/view/virtualizedfx/VSPExtensions.kt | 6 -- .../settings/grid/view/GridSettingsView.kt | 17 +++- .../view/VisualizationSettingsLayerCell.kt | 21 +++-- .../popover/DialogClosingController.kt | 2 +- .../popover/LayerSettingsPopOverNode.kt | 4 +- .../popover/LineLayerSettingsPopOverNode.kt | 10 ++- .../popover/PointLayerSettingsPopOverNode.kt | 10 ++- .../popover/SettingsDialogNode.kt | 4 +- .../kotlin/solve/sidepanel/LeftPanelView.kt | 89 ------------------- .../kotlin/solve/sidepanel/SidePanelTab.kt | 2 +- .../solve/sidepanel/tabs/SidePanelTabsView.kt | 1 - .../solve/styles/CatalogueViewStylesheet.kt | 2 +- .../styles/FilterPanelListViewStylesheet.kt | 6 +- .../solve/styles/SettingsDialogStylesheet.kt | 3 - src/main/kotlin/solve/styles/Style.kt | 3 +- .../solve/styles/TreeTableViewStylesheet.kt | 3 +- src/main/kotlin/solve/utils/ImporterUtils.kt | 1 + .../utils/materialfx/MFXIntegerTextField.kt | 4 +- .../solve/utils/materialfx/MFXNodesUtils.kt | 2 +- 46 files changed, 116 insertions(+), 228 deletions(-) delete mode 100644 src/main/kotlin/solve/sidepanel/LeftPanelView.kt diff --git a/src/main/kotlin/solve/SolveApp.kt b/src/main/kotlin/solve/SolveApp.kt index a87efdbc0..af7806b4e 100644 --- a/src/main/kotlin/solve/SolveApp.kt +++ b/src/main/kotlin/solve/SolveApp.kt @@ -20,7 +20,7 @@ class SolveApp : App(MainView::class, ApplicationStylesheet::class) { registerServices() with(stage) { - stage.icons.add(Image(IconsApp)); + stage.icons.add(Image(IconsApp)) width = 1000.0 height = 600.0 title = "SOLVE" diff --git a/src/main/kotlin/solve/catalogue/CatalogueUtils.kt b/src/main/kotlin/solve/catalogue/CatalogueUtils.kt index 50754d62d..ba68877ea 100644 --- a/src/main/kotlin/solve/catalogue/CatalogueUtils.kt +++ b/src/main/kotlin/solve/catalogue/CatalogueUtils.kt @@ -22,6 +22,6 @@ fun synchronizeListViewsSelections(firstListView: MFXCheckListView, secon secondListView.setSelectionModel(firstListView.selectionModel) } -//fun Labeled.addNameTooltip() { +// fun Labeled.addNameTooltip() { // tooltip(text) -//} +// } diff --git a/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt b/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt index 4c2d73558..a0af13faf 100644 --- a/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt +++ b/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt @@ -6,12 +6,12 @@ import javafx.geometry.Pos import javafx.scene.control.CheckBox import javafx.scene.control.ToggleButton import javafx.scene.control.ToggleGroup +import org.controlsfx.control.SegmentedButton import solve.catalogue.controller.CatalogueController import solve.catalogue.model.ViewFormat -import org.controlsfx.control.SegmentedButton import solve.styles.CatalogueViewStylesheet import solve.styles.Style -import solve.utils.mfxCheckbox +import solve.utils.materialfx.mfxCheckbox import tornadofx.* import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty @@ -60,7 +60,7 @@ class CatalogueSettingsView : View() { addStylesheet(CatalogueViewStylesheet::class) maxWidth = 500.0 padding = Insets(0.0, 0.0, 0.0, 0.0) - selectionCheckBox = mfxCheckbox("", isSelectionCheckBoxCheckedProperty) { + selectionCheckBox = mfxCheckbox { paddingLeft = 7.0 // addNameTooltip() action { diff --git a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt index 20b57131d..7e5cd3e68 100644 --- a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt +++ b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt @@ -7,7 +7,14 @@ import javafx.scene.control.ContentDisplay import javafx.scene.image.ImageView import javafx.scene.input.KeyCode import javafx.scene.input.KeyCodeCombination -import javafx.scene.layout.* +import javafx.scene.layout.Border +import javafx.scene.layout.BorderPane +import javafx.scene.layout.BorderStroke +import javafx.scene.layout.BorderStrokeStyle +import javafx.scene.layout.BorderWidths +import javafx.scene.layout.CornerRadii +import javafx.scene.layout.Priority +import javafx.scene.layout.VBox import javafx.scene.paint.Color import solve.catalogue.controller.CatalogueController import solve.catalogue.model.CatalogueField @@ -19,12 +26,12 @@ import solve.catalogue.view.fields.CataloguePreviewImagesFieldsView import solve.constants.IconsCataloguePlaceholder import solve.filters.view.FilterPanelView import solve.project.model.ProjectFrame +import solve.styles.CatalogueViewStylesheet +import solve.styles.Style import solve.utils.addSafely import solve.utils.loadResourcesImage +import solve.utils.mfxButton import solve.utils.removeSafely -import solve.styles.CatalogueViewStylesheet -import solve.styles.Style -import solve.utils.* import tornadofx.* class CatalogueView : View() { @@ -80,7 +87,8 @@ class CatalogueView : View() { BorderPane.setAlignment(this, Pos.CENTER) setPrefSize(150.0, 31.0) style = - "-fx-font-style: ${Style.FontCondensed}; -fx-font-weight: ${Style.FontWeightBold}; -fx-background-color: #${Style.PrimaryColor}; -fx-text-fill: #${Style.SurfaceColor};" + "-fx-font-style: ${Style.FontCondensed}; -fx-font-weight: ${Style.FontWeightBold}; " + + "-fx-background-color: #${Style.PrimaryColor}; -fx-text-fill: #${Style.SurfaceColor};" action { applySelection() diff --git a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt index 0dc821394..bf279be8b 100644 --- a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt +++ b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt @@ -16,9 +16,13 @@ import solve.catalogue.controller.CatalogueController import solve.catalogue.model.CatalogueField import solve.project.model.ProjectFrame import solve.scene.view.SceneView -import solve.utils.floorToInt import solve.styles.CatalogueViewStylesheet -import solve.utils.* +import solve.utils.checkAllItems +import solve.utils.checkedItems +import solve.utils.checkedItemsCount +import solve.utils.floorToInt +import solve.utils.mfxCheckListView +import solve.utils.uncheckAllItems import tornadofx.* import kotlin.math.min diff --git a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFileNamesFieldsView.kt b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFileNamesFieldsView.kt index 87658b442..2088e3c7f 100644 --- a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFileNamesFieldsView.kt +++ b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFileNamesFieldsView.kt @@ -1,13 +1,7 @@ package solve.catalogue.view.fields -import javafx.scene.control.Labeled -import javafx.scene.image.ImageView -import javafx.scene.text.Font -import solve.catalogue.model.CatalogueField -import solve.constants.IconsCatalogueImagePath -import solve.styles.Style -import solve.utils.loadResourcesImage import javafx.scene.control.Label +import solve.catalogue.model.CatalogueField import tornadofx.* class CatalogueFileNamesFieldsView : CatalogueFieldsView() { diff --git a/src/main/kotlin/solve/filters/settings/controller/FilterSettingsController.kt b/src/main/kotlin/solve/filters/settings/controller/FilterSettingsController.kt index 614ae88f5..cb665c01c 100644 --- a/src/main/kotlin/solve/filters/settings/controller/FilterSettingsController.kt +++ b/src/main/kotlin/solve/filters/settings/controller/FilterSettingsController.kt @@ -19,4 +19,4 @@ class FilterSettingsController : Controller() { panelController.editFilter(editingFilter, newFilter) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/filters/settings/model/FilterSetting.kt b/src/main/kotlin/solve/filters/settings/model/FilterSetting.kt index cdacde16e..4fa232f4f 100644 --- a/src/main/kotlin/solve/filters/settings/model/FilterSetting.kt +++ b/src/main/kotlin/solve/filters/settings/model/FilterSetting.kt @@ -2,7 +2,6 @@ package solve.filters.settings.model import solve.project.model.ProjectFrame -<<<<<<< HEAD abstract class FilterSetting(settingValue: T) { var settingValue: T = settingValue protected set @@ -10,10 +9,4 @@ abstract class FilterSetting(settingValue: T) { abstract fun apply(fields: List): List abstract fun edit(newValue: T) -======= -interface FilterSetting { - fun apply(fields: List): List - - fun edit(newValue: T) ->>>>>>> f6786bc (Update filter settings dialog design and add a logic) } diff --git a/src/main/kotlin/solve/filters/settings/model/IndicesStepFilterSetting.kt b/src/main/kotlin/solve/filters/settings/model/IndicesStepFilterSetting.kt index 90c439a8d..a2d24ae59 100644 --- a/src/main/kotlin/solve/filters/settings/model/IndicesStepFilterSetting.kt +++ b/src/main/kotlin/solve/filters/settings/model/IndicesStepFilterSetting.kt @@ -2,7 +2,6 @@ package solve.filters.settings.model import solve.project.model.ProjectFrame -<<<<<<< HEAD class IndicesStepFilterSetting(step: Int) : FilterSetting(step) { override fun apply(fields: List) = fields.slice( (settingValue - 1)..fields.lastIndex step this.settingValue @@ -10,12 +9,5 @@ class IndicesStepFilterSetting(step: Int) : FilterSetting(step) { override fun edit(newValue: Int) { settingValue = newValue -======= -class IndicesStepFilterSetting(private var step: Int) : FilterSetting { - override fun apply(fields: List) = fields.slice(0..fields.lastIndex step this.step) - - override fun edit(newValue: Int) { - step = newValue ->>>>>>> f6786bc (Update filter settings dialog design and add a logic) } } diff --git a/src/main/kotlin/solve/filters/settings/model/TimePeriodFilterSetting.kt b/src/main/kotlin/solve/filters/settings/model/TimePeriodFilterSetting.kt index 18dca486a..a28bb38c6 100644 --- a/src/main/kotlin/solve/filters/settings/model/TimePeriodFilterSetting.kt +++ b/src/main/kotlin/solve/filters/settings/model/TimePeriodFilterSetting.kt @@ -3,20 +3,11 @@ package solve.filters.settings.model import solve.project.model.ProjectFrame import solve.utils.structures.IntPoint -<<<<<<< HEAD class TimePeriodFilterSetting(timePeriod: IntPoint) : FilterSetting(timePeriod) { override fun apply(fields: List): List = fields.filter { it.timestamp in settingValue.x..settingValue.y } override fun edit(newValue: IntPoint) { settingValue = newValue -======= -class TimePeriodFilterSetting(private var timePeriod: IntPoint) : FilterSetting { - override fun apply(fields: List): List = - fields.filter { it.timestamp in timePeriod.x..timePeriod.y } - - override fun edit(newValue: IntPoint) { - timePeriod = newValue ->>>>>>> f6786bc (Update filter settings dialog design and add a logic) } } diff --git a/src/main/kotlin/solve/filters/settings/model/UIDFilterSetting.kt b/src/main/kotlin/solve/filters/settings/model/UIDFilterSetting.kt index 792f2b022..a34a4b040 100644 --- a/src/main/kotlin/solve/filters/settings/model/UIDFilterSetting.kt +++ b/src/main/kotlin/solve/filters/settings/model/UIDFilterSetting.kt @@ -2,18 +2,10 @@ package solve.filters.settings.model import solve.project.model.ProjectFrame -<<<<<<< HEAD class UIDFilterSetting(uid: Long) : FilterSetting(uid) { override fun apply(fields: List) = fields.filter { it.uids.contains(settingValue) } override fun edit(newValue: Long) { settingValue = newValue -======= -class UIDFilterSetting(private var uid: Long) : FilterSetting { - override fun apply(fields: List) = fields.filter { it.uids.contains(uid) } - - override fun edit(newValue: Long) { - uid = newValue ->>>>>>> f6786bc (Update filter settings dialog design and add a logic) } } diff --git a/src/main/kotlin/solve/filters/settings/view/FilterSettingsView.kt b/src/main/kotlin/solve/filters/settings/view/FilterSettingsView.kt index 32f288a23..88f6933dc 100644 --- a/src/main/kotlin/solve/filters/settings/view/FilterSettingsView.kt +++ b/src/main/kotlin/solve/filters/settings/view/FilterSettingsView.kt @@ -410,4 +410,4 @@ class FilterSettingsView : View() { private enum class FilterSettingsDialogMode { CreationMode, EditingMode -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/filters/settings/view/controls/FilterSettingControl.kt b/src/main/kotlin/solve/filters/settings/view/controls/FilterSettingControl.kt index 6c350d43f..fe18cd5e9 100644 --- a/src/main/kotlin/solve/filters/settings/view/controls/FilterSettingControl.kt +++ b/src/main/kotlin/solve/filters/settings/view/controls/FilterSettingControl.kt @@ -3,6 +3,6 @@ package solve.filters.settings.view.controls import javafx.scene.Node import solve.filters.settings.model.FilterSetting -abstract class FilterSettingControl >(protected val controlNode: T) { - abstract fun extrudeFilterSettings() : FilterSetting<*>? +abstract class FilterSettingControl>(protected val controlNode: T) { + abstract fun extrudeFilterSettings(): FilterSetting<*>? } diff --git a/src/main/kotlin/solve/filters/view/FilterPanelFieldsView.kt b/src/main/kotlin/solve/filters/view/FilterPanelFieldsView.kt index 8ddc24662..f0c58fc9e 100644 --- a/src/main/kotlin/solve/filters/view/FilterPanelFieldsView.kt +++ b/src/main/kotlin/solve/filters/view/FilterPanelFieldsView.kt @@ -136,4 +136,4 @@ class FilterPanelFieldsView : View() { private const val FieldButtonPressRippleCircleRadius = 15.0 private const val DelayBetweenMFXListViewChangeOperationsMillis = 50L } -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/filters/view/FilterPanelView.kt b/src/main/kotlin/solve/filters/view/FilterPanelView.kt index f76c74874..c73afb90d 100644 --- a/src/main/kotlin/solve/filters/view/FilterPanelView.kt +++ b/src/main/kotlin/solve/filters/view/FilterPanelView.kt @@ -64,4 +64,4 @@ class FilterPanelView : View() { private const val FilterFieldButtonsSize = 24.0 private const val AddFilterButtonSize = 15.0 } -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/importer/ProjectParser.kt b/src/main/kotlin/solve/importer/ProjectParser.kt index 9e780c8ff..8cfa155ae 100644 --- a/src/main/kotlin/solve/importer/ProjectParser.kt +++ b/src/main/kotlin/solve/importer/ProjectParser.kt @@ -178,7 +178,6 @@ object ProjectParser { if (!isImagesExist) { createAlertForError("The images folder is missing in the directory") return null - } images.map { img -> diff --git a/src/main/kotlin/solve/importer/view/DirectoryPathView.kt b/src/main/kotlin/solve/importer/view/DirectoryPathView.kt index 3be3faf72..5409458a1 100644 --- a/src/main/kotlin/solve/importer/view/DirectoryPathView.kt +++ b/src/main/kotlin/solve/importer/view/DirectoryPathView.kt @@ -38,7 +38,7 @@ class DirectoryPathView : View() { BorderPane.setMargin(this, Insets(16.0, 0.0, 0.0, 0.0)) style = "-fx-border-color: #${Style.PrimaryColorLight}; -fx-font-size: ${Style.MainFontSize}; " + - "-fx-font-family: ${Style.FontCondensed}" + "-fx-font-family: ${Style.FontCondensed}" floatMode = FloatMode.BORDER floatingText = "Project directory" @@ -67,8 +67,8 @@ class DirectoryPathView : View() { private val selectButton = mfxButton("SELECT") { style = "-fx-border-color: #${Style.PrimaryColor}; -fx-font-size: ${Style.ButtonFontSize}; " + - "-fx-font-family: ${Style.FontCondensed}; -fx-font-weight:700; -fx-border-radius: 4px; " + - "-fx-text-fill: #${Style.PrimaryColor};" + "-fx-font-family: ${Style.FontCondensed}; -fx-font-weight:700; -fx-border-radius: 4px; " + + "-fx-text-fill: #${Style.PrimaryColor};" BorderPane.setAlignment(this, Pos.CENTER) BorderPane.setMargin(this, Insets(15.0, 0.0, 0.0, 0.0)) textFill = Color.valueOf(Style.PrimaryColor) diff --git a/src/main/kotlin/solve/importer/view/LoadingScreen.kt b/src/main/kotlin/solve/importer/view/LoadingScreen.kt index 2b41c03e5..b230022f0 100644 --- a/src/main/kotlin/solve/importer/view/LoadingScreen.kt +++ b/src/main/kotlin/solve/importer/view/LoadingScreen.kt @@ -65,4 +65,4 @@ class LoadingScreen : View("Loading") { } } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt index 9430792a9..a3ee22c95 100644 --- a/src/main/kotlin/solve/importer/view/ProjectTreeView.kt +++ b/src/main/kotlin/solve/importer/view/ProjectTreeView.kt @@ -41,7 +41,7 @@ open class ProjectTreeView : View() { treetableview(rootTree) { addStylesheet(TreeTableViewStylesheet::class) style = "-fx-font-family: ${Style.Font}; -fx-text-fill: #${Style.PrimaryColor}; " + - "-fx-font-size: ${Style.ButtonFontSize};" + "-fx-font-size: ${Style.ButtonFontSize};" BorderPane.setMargin(this, Insets(0.0, 0.0, 2.0, 15.0)) visibleWhen { controller.projectAfterPartialParsing.isNotNull } @@ -87,7 +87,6 @@ open class ProjectTreeView : View() { ImageView(imageIcon).apply { fitHeight = 16.0 fitWidth = 16.0 - } } else { ImageView(errorFolderIcon) @@ -107,7 +106,9 @@ open class ProjectTreeView : View() { super.updateItem(item, empty) text = if (empty) { null - } else item?.errors?.toStringWithoutBrackets() + } else { + item?.errors?.toStringWithoutBrackets() + } if (!empty && text.isNotEmpty()) { tooltip(text) } diff --git a/src/main/kotlin/solve/main/MainController.kt b/src/main/kotlin/solve/main/MainController.kt index f5370030a..321f1bdda 100644 --- a/src/main/kotlin/solve/main/MainController.kt +++ b/src/main/kotlin/solve/main/MainController.kt @@ -2,7 +2,6 @@ package solve.main import solve.catalogue.controller.CatalogueController import solve.main.splitpane.SidePanelLocation -import solve.project.controller.ProjectController import solve.project.model.ProjectFrame import solve.project.model.ProjectLayer import solve.scene.SceneFacade diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 9b89af207..54dec7568 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -15,7 +15,6 @@ import javafx.scene.input.KeyCombination import javafx.scene.layout.VBox import javafx.scene.shape.Circle import solve.catalogue.view.CatalogueView -import solve.settings.grid.view.GridSettingsView import solve.constants.IconsHelp import solve.constants.IconsImportFab import solve.constants.IconsPlugins @@ -25,6 +24,7 @@ import solve.importer.view.ImporterView import solve.main.splitpane.SidePanelLocation import solve.main.splitpane.SidePanelSplitPane import solve.scene.view.SceneView +import solve.settings.grid.view.GridSettingsView import solve.settings.visualization.VisualizationSettingsView import solve.sidepanel.SidePanelTab import solve.sidepanel.content.SidePanelContentView @@ -215,7 +215,7 @@ class MainView : View() { private data class SidePanelViews(val tabsView: SidePanelTabsView, val contentView: SidePanelContentView) - companion object{ + companion object { private const val LeftSidePanelAndSceneDividerPosition = 0.20 private const val RightSidePanelAndSceneDividerPosition = 0.82 @@ -242,4 +242,4 @@ class MainSplitPaneStyle : Stylesheet() { } } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/scene/SceneFacade.kt b/src/main/kotlin/solve/scene/SceneFacade.kt index ac667a3eb..ad2c0d697 100644 --- a/src/main/kotlin/solve/scene/SceneFacade.kt +++ b/src/main/kotlin/solve/scene/SceneFacade.kt @@ -20,7 +20,6 @@ import solve.scene.model.LayerState import solve.scene.model.Scene import solve.scene.model.VisualizationFrame import tornadofx.find -import java.io.FileInputStream /** * Interaction interface of the scene to another parts of the application. diff --git a/src/main/kotlin/solve/scene/view/FrameView.kt b/src/main/kotlin/solve/scene/view/FrameView.kt index 6fc36d451..fa26cb093 100644 --- a/src/main/kotlin/solve/scene/view/FrameView.kt +++ b/src/main/kotlin/solve/scene/view/FrameView.kt @@ -81,7 +81,7 @@ class FrameView( private val associationsUpdatedListener = MapChangeListener, - Map>> { + Map>> { hasAssociations.value = getAssociatedLayersNames(currentFrame ?: return@MapChangeListener).isNotEmpty() } @@ -369,4 +369,4 @@ class FrameView( private fun VisualizationFrame.hasPoints() = this.layers.filterIsInstance().any { it.settings.enabled } -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/scene/view/FrameViewCache.kt b/src/main/kotlin/solve/scene/view/FrameViewCache.kt index 757a8c782..93a8b7159 100644 --- a/src/main/kotlin/solve/scene/view/FrameViewCache.kt +++ b/src/main/kotlin/solve/scene/view/FrameViewCache.kt @@ -7,13 +7,18 @@ interface FrameViewStorage { fun store(frameView: FrameView) } -class FrameViewCache(val size: DoubleSize, val canvasBufferDepth: Int, private val factory: (VisualizationFrame?, FrameViewParameters) -> FrameView) : FrameViewStorage { +class FrameViewCache( + val size: DoubleSize, + val canvasBufferDepth: Int, + private val factory: (VisualizationFrame?, FrameViewParameters) -> FrameView +) : FrameViewStorage { private val storage = mutableSetOf() - fun get(frame: VisualizationFrame?, frameViewParameters: FrameViewParameters) = storage.firstOrNull()?.also { frameView -> - frameView.init(frame, frameViewParameters) - storage.remove(frameView) - } ?: factory(frame, frameViewParameters) + fun get(frame: VisualizationFrame?, frameViewParameters: FrameViewParameters) = + storage.firstOrNull()?.also { frameView -> + frameView.init(FrameViewData(frame, frameViewParameters)) + storage.remove(frameView) + } ?: factory(frame, frameViewParameters) override fun store(frameView: FrameView) { if (frameView.size != size) { diff --git a/src/main/kotlin/solve/scene/view/SceneView.kt b/src/main/kotlin/solve/scene/view/SceneView.kt index ac651f6d4..34aecebb9 100644 --- a/src/main/kotlin/solve/scene/view/SceneView.kt +++ b/src/main/kotlin/solve/scene/view/SceneView.kt @@ -43,7 +43,7 @@ class SceneView : View() { override val root = vbox { label("Project not imported") { tooltip(text) - padding = Insets(350.0,500.0,350.0,600.0) + padding = Insets(350.0, 500.0, 350.0, 600.0) graphic = ImageView(scenePlaceholder) contentDisplay = ContentDisplay.TOP style { @@ -96,7 +96,7 @@ class SceneView : View() { // if frame size or canvas layers count is not equal frame drawer buffer can not be reused. val canReuseCache = frameViewCache?.parameters?.size == frameSize && - frameViewCache?.parameters?.canvasDepth == scene.canvasLayersCount + frameViewCache?.parameters?.canvasDepth == scene.canvasLayersCount val frameViewSettings = FrameViewSettings(frameSize, scene.canvasLayersCount) val validateFrameView: (FrameView) -> Boolean = { view -> @@ -266,4 +266,4 @@ class SceneView : View() { const val framesMargin = 10.0 const val scrollSpeed = 20.0 } -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/scene/view/landmarks/KeypointView.kt b/src/main/kotlin/solve/scene/view/landmarks/KeypointView.kt index c777c0d12..875ff47ae 100644 --- a/src/main/kotlin/solve/scene/view/landmarks/KeypointView.kt +++ b/src/main/kotlin/solve/scene/view/landmarks/KeypointView.kt @@ -77,14 +77,9 @@ class KeypointView( * Plays highlighting animation. */ override fun highlightShape(duration: Duration) { -<<<<<<< HEAD val scaleTransition = animationProvider.createScaleTransition(node, HighlightingScaleFactor, HighlightingScaleFactor, duration) val fillTransition = animationProvider.createFillTransition( -======= - val scaleTransition = createScaleTransition(node, HighlightingScaleFactor, HighlightingScaleFactor, duration) - val fillTransition = createFillTransition( ->>>>>>> 13f8702 (Just an automaticly formatted codestyle) node, keypoint.layerSettings.getUniqueColor(keypoint), duration diff --git a/src/main/kotlin/solve/scene/view/landmarks/LineView.kt b/src/main/kotlin/solve/scene/view/landmarks/LineView.kt index 615163799..2007e9cef 100644 --- a/src/main/kotlin/solve/scene/view/landmarks/LineView.kt +++ b/src/main/kotlin/solve/scene/view/landmarks/LineView.kt @@ -82,13 +82,8 @@ class LineView( * Plays highlighting animation. */ override fun highlightShape(duration: Duration) { -<<<<<<< HEAD val scaleTransition = animationProvider.createWidthTransition(node, width, duration) val strokeTransition = animationProvider.createStrokeTransition( -======= - val scaleTransition = Timeline(KeyFrame(duration, KeyValue(node.strokeWidthProperty(), width))) - val strokeTransition = createStrokeTransition( ->>>>>>> 13f8702 (Just an automaticly formatted codestyle) node, line.layerSettings.getUniqueColor(line), duration @@ -105,13 +100,8 @@ class LineView( */ override fun unhighlightShape(duration: Duration) { val targetWidth = line.layerSettings.selectedWidth * (if (scale < 1) scale else 1.0) -<<<<<<< HEAD val scaleTransition = animationProvider.createWidthTransition(node, targetWidth, duration) val strokeTransition = animationProvider.createStrokeTransition( -======= - val scaleTransition = Timeline(KeyFrame(duration, KeyValue(node.strokeWidthProperty(), targetWidth))) - val strokeTransition = createStrokeTransition( ->>>>>>> 13f8702 (Just an automaticly formatted codestyle) node, line.layerSettings.getColor(line), duration diff --git a/src/main/kotlin/solve/scene/view/virtualizedfx/VSPExtensions.kt b/src/main/kotlin/solve/scene/view/virtualizedfx/VSPExtensions.kt index 7218cf135..f476b4d31 100644 --- a/src/main/kotlin/solve/scene/view/virtualizedfx/VSPExtensions.kt +++ b/src/main/kotlin/solve/scene/view/virtualizedfx/VSPExtensions.kt @@ -76,17 +76,11 @@ fun ?> wrapGridWithVsp( return vsp } -<<<<<<< HEAD /** * This inheritor is needed to put OutOfFramesLayer into visual tree nearby VirtualGrid. */ class VirtualScrollPaneWithOutOfFramesLayer?>( val virtualGrid: VirtualGrid, -======= -// This inheritor is needed to put OutOfFramesLayer into visual tree nearby VirtualGrid -private class VirtualScrollPaneWithOutOfFramesLayer?>( - private val virtualGrid: VirtualGrid, ->>>>>>> 13f8702 (Just an automaticly formatted codestyle) private val outOfFramesLayer: OutOfFramesLayer ) : VirtualScrollPane(virtualGrid) { override fun createDefaultSkin(): Skin<*> { diff --git a/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt b/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt index 7695aed2f..ca8cf732a 100644 --- a/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt +++ b/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt @@ -5,7 +5,12 @@ import javafx.event.EventTarget import javafx.geometry.Insets import javafx.scene.Node import javafx.scene.control.Label -import javafx.scene.layout.* +import javafx.scene.layout.Border +import javafx.scene.layout.BorderStroke +import javafx.scene.layout.BorderStrokeStyle +import javafx.scene.layout.BorderWidths +import javafx.scene.layout.CornerRadii +import javafx.scene.layout.Priority import javafx.scene.paint.Color import javafx.scene.paint.Paint import javafx.scene.text.Font @@ -17,10 +22,15 @@ import solve.scene.controller.SceneController import solve.settings.createSettingsField import solve.settings.grid.controller.GridSettingsController import solve.styles.Style -import solve.utils.* -import tornadofx.* +import solve.utils.createHGrowHBox +import solve.utils.createInsetsWithValue +import solve.utils.imageViewIcon +import solve.utils.loadResourcesImage import solve.utils.materialfx.mfxCircleButton import solve.utils.materialfx.mfxRangeSlider +import solve.utils.unscale +import solve.utils.valuesDifference +import tornadofx.* import kotlin.math.roundToLong class GridSettingsView : View() { @@ -78,7 +88,6 @@ class GridSettingsView : View() { prefWidth = GridSettingsLabelWidth } - private fun EventTarget.settingFieldLabel( text: String = "", fontSize: Double = 14.0, diff --git a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt index 59a85c773..76d04d949 100644 --- a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt +++ b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt @@ -35,7 +35,6 @@ import solve.utils.materialfx.MaterialFXDialog.createStageDialog import solve.utils.materialfx.mfxCircleButton import solve.utils.nodes.listcell.dragdrop.DragAndDropCellItemInfo import solve.utils.nodes.listcell.dragdrop.DragAndDropListCell -import solve.utils.structures.DoublePoint import tornadofx.* class VisualizationSettingsLayerCell( @@ -105,7 +104,8 @@ class VisualizationSettingsLayerCell( private fun createLayerNameLabel(): Label = label(item.layerName) { style = - "-fx-font-style: ${Style.FontCondensed}; -fx-font-size: ${Style.ButtonFontSize}; -fx-text-fill: #${Style.OnBackgroundColor}" + "-fx-font-style: ${Style.FontCondensed}; -fx-font-size: ${Style.ButtonFontSize}; " + + "-fx-text-fill: #${Style.OnBackgroundColor}" font = Font.font(LayerFieldNameFontSize) } @@ -125,8 +125,11 @@ class VisualizationSettingsLayerCell( val layerInvisibleImageViewIcon = imageViewIcon(layerInvisibleIconImage, LayerVisibilityIconSize) val layerVisibilityButtonNode = hbox { - fun getCurrentVisibilityImageViewIcon() = if (item.enabled) - layerVisibleImageViewIcon else layerInvisibleImageViewIcon + fun getCurrentVisibilityImageViewIcon() = if (item.enabled) { + layerVisibleImageViewIcon + } else { + layerInvisibleImageViewIcon + } mfxCircleButton(getCurrentVisibilityImageViewIcon(), 15.0) { action { @@ -181,13 +184,17 @@ class VisualizationSettingsLayerCell( LandmarkType.Keypoint -> PointLayerSettingsPopOverNode( layerSettings as LayerSettings.PointLayerSettings, - sceneController, title, dialogClosingController + sceneController, + title, + dialogClosingController ).getPopOverNode() LandmarkType.Line -> LineLayerSettingsPopOverNode( layerSettings as LayerSettings.LineLayerSettings, - sceneController, title, dialogClosingController + sceneController, + title, + dialogClosingController ).getPopOverNode() LandmarkType.Plane -> null @@ -257,4 +264,4 @@ class VisualizationSettingsLayerCell( private val layerVisibleIconImage = loadResourcesImage(IconsSettingsVisualizationLayerVisiblePath) private val layerInvisibleIconImage = loadResourcesImage(IconsSettingsVisualizationLayerInvisiblePath) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/settings/visualization/popover/DialogClosingController.kt b/src/main/kotlin/solve/settings/visualization/popover/DialogClosingController.kt index 03804a92d..8939acb52 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/DialogClosingController.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/DialogClosingController.kt @@ -5,4 +5,4 @@ import tornadofx.* class DialogClosingController : Controller() { val isClosing = SimpleBooleanProperty(false) -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt index 8ff89eab1..457d9b284 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt @@ -32,18 +32,16 @@ abstract class LayerSettingsPopOverNode { popOver.add(borderpane) } - protected fun addTitle(title: String) { popOver.title = title popOver.addTitle() - } protected fun addSettingField( name: String, settingNode: Node, settingsNodeAlignment: Alignment = Alignment.Center, - isLabelOnLeft: Boolean, + isLabelOnLeft: Boolean ) { val fieldLabel = Label(name) fieldLabel.paddingLeft = LayerSettingsLabelPaddingLeft diff --git a/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt index 2d510bcd0..7f0d2abf6 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt @@ -36,9 +36,15 @@ class LineLayerSettingsPopOverNode( MinWidthValue, MaxWidthValue, weakWidthSliderValueChangedEventHandler - ), isLabelOnLeft = true + ), + isLabelOnLeft = true + ) + addSettingField( + "One color", + buildLandmarkUseOneColorCheckBox(lineLayerSettings), + Alignment.Left, + isLabelOnLeft = false ) - addSettingField("One color", buildLandmarkUseOneColorCheckBox(lineLayerSettings), Alignment.Left, isLabelOnLeft = false) addCancel(dialogClosingController) return popOver diff --git a/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt index 2d50bb051..bb116d0ba 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt @@ -31,9 +31,15 @@ class PointLayerSettingsPopOverNode( MinSizeValue, MaxSizeValue, weakRadiusSliderValueChangedEventHandler - ), isLabelOnLeft = true + ), + isLabelOnLeft = true + ) + addSettingField( + "One color", + buildLandmarkUseOneColorCheckBox(pointLayerSettings), + Alignment.Left, + isLabelOnLeft = false ) - addSettingField("One color", buildLandmarkUseOneColorCheckBox(pointLayerSettings), Alignment.Left, isLabelOnLeft = false) addCancel(dialogClosingController) return popOver diff --git a/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt b/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt index 35b58a76b..ebcd16624 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt @@ -9,11 +9,11 @@ class SettingsDialogNode : VBox(10.0) { var title: String = "" fun addTitle() { - val titleLabel = label(title){ + val titleLabel = label(title) { paddingLeft = 10.0 style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: 28px;" } this.add(titleLabel) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/sidepanel/LeftPanelView.kt b/src/main/kotlin/solve/sidepanel/LeftPanelView.kt deleted file mode 100644 index c4571d0c3..000000000 --- a/src/main/kotlin/solve/sidepanel/LeftPanelView.kt +++ /dev/null @@ -1,89 +0,0 @@ -package solve.sidepanel - -import io.github.palexdev.materialfx.dialogs.MFXGenericDialog -import io.github.palexdev.materialfx.dialogs.MFXStageDialog -import javafx.geometry.Insets -import solve.importer.controller.ImporterController -import solve.importer.view.ImporterView -import solve.main.MainView -import solve.utils.* -import solve.utils.materialfx.MaterialFXDialog -import tornadofx.* - -class LeftPanelView : View() { - - val importer = find() - - var content = MFXGenericDialog() - var dialog = MFXStageDialog() - - val controller: ImporterController by inject() - -// private val importIcon = loadResourcesImage(IconsImportFAB) -// private val projectIcon = loadResourcesImage(IconsProject) -// private val pluginsIcon = loadResourcesImage(IconsPlugins) -// private val settingsIcon = loadResourcesImage(IconsSettings) -// private val helpIcon = loadResourcesImage(IconsHelp) - - - - override val root = vbox(7) { - -// addStylesheet(MFXButtonStyleSheet::class) -// -// prefWidth = navigationRailSize -// -// style = "-fx-background-color: ${Style.surfaceColor}" -// stylesheets.add("https://fonts.googleapis.com/css2?family=Roboto+Condensed") -// stylesheets.add("https://fonts.googleapis.com/css2?family=Roboto+Condensed:wght@700") -// stylesheets.add("https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700;900") -// -// -// -// -//// label("SOLVE"){ -//// style = "-fx-font-family: ${Style.font}; -fx-font-weight:700; -fx-font-size: 18px" -//// VBox.setMargin(this, Insets(12.0, 6.0,0.0,6.0)) -//// -//// -//// } -// add(importFAB) -//// add(leftSidePanelViews.tabsView.root) -// -// -//// add(projectButton) -//// add(pluginsButton) -//// add(settingsButton) -//// add(helpButton) -// -// -//// button("Import project") { -//// action { -//// controller.directoryPath.set(null) -//// controller.projectAfterPartialParsing.set(null) -//// content = MaterialFXDialog.createGenericDialog(ImporterView().root) -//// dialog = MaterialFXDialog.createStageDialog(content, find().currentStage, find().root) -//// dialog.show() -//// content.padding = Insets(0.0,0.0,10.0,0.0) -//// } -//// } -//// button("Manage plugins") { -//// } -//// button("Settings") { -//// } -//// button("Help") { -//// } - } - - - - fun importAction(){ - controller.directoryPath.set(null) - controller.projectAfterPartialParsing.set(null) - content = MaterialFXDialog.createGenericDialog(ImporterView().root) - dialog = MaterialFXDialog.createStageDialog(content, find().currentStage, find().root) - dialog.show() - content.padding = Insets(0.0,0.0,10.0,0.0) - } - -} diff --git a/src/main/kotlin/solve/sidepanel/SidePanelTab.kt b/src/main/kotlin/solve/sidepanel/SidePanelTab.kt index 6c1e12349..6e015b1e5 100644 --- a/src/main/kotlin/solve/sidepanel/SidePanelTab.kt +++ b/src/main/kotlin/solve/sidepanel/SidePanelTab.kt @@ -2,4 +2,4 @@ package solve.sidepanel import javafx.scene.Node -data class SidePanelTab(val name: String, val contentNode: Node, val tooltip: String) \ No newline at end of file +data class SidePanelTab(val name: String, val contentNode: Node, val tooltip: String) diff --git a/src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt b/src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt index b6d8f8223..58dd8c837 100644 --- a/src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt +++ b/src/main/kotlin/solve/sidepanel/tabs/SidePanelTabsView.kt @@ -10,7 +10,6 @@ import solve.styles.SidePanelTabsStyle import solve.styles.Style import solve.styles.Style.circleForRipple import tornadofx.* -import java.net.URI open class SidePanelTabsView : View() { private val location: SidePanelLocation by param() diff --git a/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt b/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt index 09f10bfb6..cac08d8bd 100644 --- a/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt @@ -1,7 +1,7 @@ package solve.styles -import javafx.scene.paint.Paint import javafx.scene.paint.Color +import javafx.scene.paint.Paint import tornadofx.* class CatalogueViewStylesheet : Stylesheet() { diff --git a/src/main/kotlin/solve/styles/FilterPanelListViewStylesheet.kt b/src/main/kotlin/solve/styles/FilterPanelListViewStylesheet.kt index cbffa26d3..a1d525709 100644 --- a/src/main/kotlin/solve/styles/FilterPanelListViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/FilterPanelListViewStylesheet.kt @@ -26,7 +26,7 @@ class FilterPanelListViewStylesheet : Stylesheet() { mfxCheckbox { rippleContainer { box { - borderColor += createCssBoxWithValue(Paint.valueOf(Style.separatorLineColor)) + borderColor += createCssBoxWithValue(Paint.valueOf(Style.SeparatorLineColor)) borderWidth += createPxBoxWithValue(CheckBoxBorderWidth) mark { @@ -50,8 +50,8 @@ class FilterPanelListViewStylesheet : Stylesheet() { dataLabel { fontSize = createPxValue(ListFieldFontSize) - fontFamily = Style.font - textFill = Paint.valueOf(Style.listFontColor) + fontFamily = Style.Font + textFill = Paint.valueOf(Style.ListFontColor) } } } diff --git a/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt b/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt index 8654dbe01..9d4782138 100644 --- a/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt +++ b/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt @@ -16,7 +16,6 @@ class SettingsDialogStylesheet : Stylesheet() { val mfxCheckBox by cssclass("mfx-checkbox") val rippleContainer by cssclass("ripple-container") - val backgroundColour: Color = Color.valueOf(Style.BackgroundColor) val primaryColor: Color = Color.valueOf(Style.PrimaryColor) } @@ -61,10 +60,8 @@ class SettingsDialogStylesheet : Stylesheet() { mfxColor.value = backgroundColor fill = backgroundColour - } - thumbContainer { mfxRippleGenerator { mfxRippleColor.value += primaryColor diff --git a/src/main/kotlin/solve/styles/Style.kt b/src/main/kotlin/solve/styles/Style.kt index 46ad5e1bb..87f0e0014 100644 --- a/src/main/kotlin/solve/styles/Style.kt +++ b/src/main/kotlin/solve/styles/Style.kt @@ -59,12 +59,11 @@ object Style { "-fx-font-family: $Font; -fx-font-weight:700; -fx-font-size: $ButtonFontSize; " + "-fx-text-fill: $PrimaryColorLight; -fx-background-radius: 36" - fun circleForRipple(button: MFXButton) = Circle(button.layoutX + 36.0, button.layoutY + 36.0,35.0) + fun circleForRipple(button: MFXButton) = Circle(button.layoutX + 36.0, button.layoutY + 36.0, 35.0) fun circleForRipple(button: ToggleButton) = Circle(button.layoutX + 36.0, button.layoutY + 36.0, 35.0) const val ControlButtonsSpacing = 10.0 const val HeaderFontSize = "20px" - } diff --git a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt index 33861c9f6..7aa7aff61 100644 --- a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt @@ -71,6 +71,5 @@ class TreeTableViewStylesheet : Stylesheet() { minHeight = 0.px } } - } -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/utils/ImporterUtils.kt b/src/main/kotlin/solve/utils/ImporterUtils.kt index 8f030edf2..29a3a4975 100644 --- a/src/main/kotlin/solve/utils/ImporterUtils.kt +++ b/src/main/kotlin/solve/utils/ImporterUtils.kt @@ -2,6 +2,7 @@ package solve.utils import solve.importer.view.AlertDialog import solve.importer.view.DirectoryPathView +import solve.utils.materialfx.MaterialFXDialog import tornadofx.FX.Companion.find fun createAlertForError(content: String) { diff --git a/src/main/kotlin/solve/utils/materialfx/MFXIntegerTextField.kt b/src/main/kotlin/solve/utils/materialfx/MFXIntegerTextField.kt index 439916b29..a67479c41 100644 --- a/src/main/kotlin/solve/utils/materialfx/MFXIntegerTextField.kt +++ b/src/main/kotlin/solve/utils/materialfx/MFXIntegerTextField.kt @@ -29,7 +29,7 @@ class MFXIntegerTextField(private val invalidErrorMessage: String? = null) : MFX private fun enableBorderColorCssString(hexColor: String) = "${MFXValidationTextFieldStylesheet.mfxMain.name}: #$hexColor;\n" + - "-fx-border-color: #$hexColor;\n" + "-fx-border-color: #$hexColor;\n" private fun initializeIntegerTextField() { addStylesheet(MFXValidationTextFieldStylesheet::class) @@ -74,4 +74,4 @@ class MFXIntegerTextField(private val invalidErrorMessage: String? = null) : MFX return mfxIntegerTextField } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/solve/utils/materialfx/MFXNodesUtils.kt b/src/main/kotlin/solve/utils/materialfx/MFXNodesUtils.kt index 36dbd0ff9..52b70bdc7 100644 --- a/src/main/kotlin/solve/utils/materialfx/MFXNodesUtils.kt +++ b/src/main/kotlin/solve/utils/materialfx/MFXNodesUtils.kt @@ -125,4 +125,4 @@ val MFXTextField.validationMessage: String? } return constraints.first().message - } \ No newline at end of file + } From eb93adfb4153d4a7847a73bbc432e156c84975c9 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Sun, 28 May 2023 14:59:06 +0300 Subject: [PATCH 59/72] codestyle --- .../kotlin/solve/catalogue/CatalogueUtils.kt | 4 -- .../catalogue/view/CatalogueSettingsView.kt | 1 - .../solve/importer/view/LoadingScreen.kt | 10 +-- .../solve/styles/CatalogueViewStylesheet.kt | 62 +++++++++---------- .../solve/styles/SettingsDialogStylesheet.kt | 51 ++++++++------- .../solve/styles/TreeTableViewStylesheet.kt | 27 ++++---- .../solve/unit/importer/ImporterTests.kt | 22 +++---- 7 files changed, 85 insertions(+), 92 deletions(-) diff --git a/src/main/kotlin/solve/catalogue/CatalogueUtils.kt b/src/main/kotlin/solve/catalogue/CatalogueUtils.kt index ba68877ea..ce4caf14f 100644 --- a/src/main/kotlin/solve/catalogue/CatalogueUtils.kt +++ b/src/main/kotlin/solve/catalogue/CatalogueUtils.kt @@ -21,7 +21,3 @@ val ProjectFrame.layers: List fun synchronizeListViewsSelections(firstListView: MFXCheckListView, secondListView: MFXCheckListView) { secondListView.setSelectionModel(firstListView.selectionModel) } - -// fun Labeled.addNameTooltip() { -// tooltip(text) -// } diff --git a/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt b/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt index a0af13faf..a89df4eb4 100644 --- a/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt +++ b/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt @@ -62,7 +62,6 @@ class CatalogueSettingsView : View() { padding = Insets(0.0, 0.0, 0.0, 0.0) selectionCheckBox = mfxCheckbox { paddingLeft = 7.0 -// addNameTooltip() action { if (isSelected) { controller.checkAllFields() diff --git a/src/main/kotlin/solve/importer/view/LoadingScreen.kt b/src/main/kotlin/solve/importer/view/LoadingScreen.kt index b230022f0..b9d6447e1 100644 --- a/src/main/kotlin/solve/importer/view/LoadingScreen.kt +++ b/src/main/kotlin/solve/importer/view/LoadingScreen.kt @@ -13,15 +13,15 @@ import solve.utils.materialfx.mfxButton import tornadofx.* class LoadingScreen : View("Loading") { - private val primaryColor: Color = Color.valueOf(Style.PrimaryColor) + private val PrimaryColor: Color = Color.valueOf(Style.PrimaryColor) private val controlPanel: ControlPanel by inject() private val progressSpinner = MFXProgressSpinner().apply { - color1 = primaryColor - color2 = primaryColor - color3 = primaryColor - color4 = primaryColor + color1 = PrimaryColor + color2 = PrimaryColor + color3 = PrimaryColor + color4 = PrimaryColor } override val root = diff --git a/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt b/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt index cac08d8bd..bd30a9c0b 100644 --- a/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt @@ -5,34 +5,17 @@ import javafx.scene.paint.Paint import tornadofx.* class CatalogueViewStylesheet : Stylesheet() { - - companion object { - val mfxCheckListView by cssclass("mfx-check-list-view") - val mfxCheckListCell by cssclass("mfx-check-list-cell") - val mfxCheckBox by cssclass("mfx-checkbox") - val rippleContainer by cssclass("ripple-container") - val mfxRippleGenerator by cssclass("mfx-ripple-generator") - val mfxRippleColor by cssproperty>("-mfx-ripple-color") - - val backgroundColour: Color = Color.valueOf(Style.BackgroundColor) - val surfaceColor: Color = Color.valueOf(Style.SurfaceColor) - val primaryColor: Color = Color.valueOf(Style.PrimaryColor) - val secondaryColor: Color = Color.valueOf(Style.SecondaryColor) - } - - val segmentedButton by cssclass() - init { segmentedButton { toggleButton { - backgroundColor += surfaceColor - borderColor += box(primaryColor) + backgroundColor += SurfaceColor + borderColor += box(PrimaryColor) prefWidth = 80.px prefHeight = 30.px and(selected, pressed) { - backgroundColor += primaryColor - textFill = surfaceColor + backgroundColor += PrimaryColor + textFill = SurfaceColor } } } @@ -45,23 +28,23 @@ class CatalogueViewStylesheet : Stylesheet() { backgroundColor += Color.TRANSPARENT } thumb { - backgroundColor += primaryColor + backgroundColor += PrimaryColor } } } - backgroundColor += surfaceColor + backgroundColor += SurfaceColor mfxCheckListCell { borderColor += box(Color.TRANSPARENT) and(hover) { - backgroundColor += backgroundColour + backgroundColor += BackgroundColor } and(selected, checked) { and(hover) { - backgroundColor += backgroundColour + backgroundColor += BackgroundColor } - backgroundColor += surfaceColor + backgroundColor += SurfaceColor } } } @@ -69,26 +52,41 @@ class CatalogueViewStylesheet : Stylesheet() { mfxCheckBox { rippleContainer { mfxRippleGenerator { - mfxRippleColor.value += secondaryColor + mfxRippleColor.value += SecondaryColor } } and(selected) { box { - backgroundColor += secondaryColor - borderColor += box(secondaryColor) + backgroundColor += SecondaryColor + borderColor += box(SecondaryColor) } } box { - borderColor += box(primaryColor) + borderColor += box(PrimaryColor) } } listView { - backgroundColor += surfaceColor + backgroundColor += SurfaceColor } listCell { - backgroundColor += surfaceColor + backgroundColor += SurfaceColor } } + + companion object { + val mfxCheckListView by cssclass("mfx-check-list-view") + val mfxCheckListCell by cssclass("mfx-check-list-cell") + val mfxCheckBox by cssclass("mfx-checkbox") + val rippleContainer by cssclass("ripple-container") + val mfxRippleGenerator by cssclass("mfx-ripple-generator") + val mfxRippleColor by cssproperty>("-mfx-ripple-color") + val segmentedButton by cssclass() + + val BackgroundColor: Color = Color.valueOf(Style.BackgroundColor) + val SurfaceColor: Color = Color.valueOf(Style.SurfaceColor) + val PrimaryColor: Color = Color.valueOf(Style.PrimaryColor) + val SecondaryColor: Color = Color.valueOf(Style.SecondaryColor) + } } diff --git a/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt b/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt index 9d4782138..928b67cf4 100644 --- a/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt +++ b/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt @@ -5,24 +5,9 @@ import javafx.scene.paint.Paint import tornadofx.* class SettingsDialogStylesheet : Stylesheet() { - - companion object { - private val mfxSlider by cssclass() - private val thumbContainer by cssclass("thumb-container") - - val mfxColor by cssproperty>("-mfx-color") - val mfxRippleGenerator by cssclass("mfx-ripple-generator") - val mfxRippleColor by cssproperty>("-mfx-ripple-color") - val mfxCheckBox by cssclass("mfx-checkbox") - val rippleContainer by cssclass("ripple-container") - - val backgroundColour: Color = Color.valueOf(Style.BackgroundColor) - val primaryColor: Color = Color.valueOf(Style.PrimaryColor) - } - init { colorPicker { - backgroundColor += backgroundColour + backgroundColor += BackgroundColor borderColor += box(Color.TRANSPARENT) arrowButton { arrow { @@ -34,46 +19,60 @@ class SettingsDialogStylesheet : Stylesheet() { mfxCheckBox { rippleContainer { mfxRippleGenerator { - mfxRippleColor.value += CatalogueViewStylesheet.secondaryColor + mfxRippleColor.value += CatalogueViewStylesheet.SecondaryColor } } and(selected) { box { - backgroundColor += CatalogueViewStylesheet.secondaryColor - borderColor += box(CatalogueViewStylesheet.secondaryColor) + backgroundColor += CatalogueViewStylesheet.SecondaryColor + borderColor += box(CatalogueViewStylesheet.SecondaryColor) } } box { - borderColor += box(CatalogueViewStylesheet.primaryColor) + borderColor += box(CatalogueViewStylesheet.PrimaryColor) } } mfxSlider { bar { mfxRippleGenerator { - mfxColor.value += primaryColor - mfxRippleColor.value += primaryColor + mfxColor.value += PrimaryColor + mfxRippleColor.value += PrimaryColor } fill = Color.valueOf(Style.PrimaryColor) } track { mfxColor.value = backgroundColor - fill = backgroundColour + fill = BackgroundColor } thumbContainer { mfxRippleGenerator { - mfxRippleColor.value += primaryColor + mfxRippleColor.value += PrimaryColor } thumb { - mfxColor.value += primaryColor + mfxColor.value += PrimaryColor mfxRippleGenerator { - mfxRippleColor.value += primaryColor + mfxRippleColor.value += PrimaryColor } } } } } + + companion object { + private val mfxSlider by cssclass() + private val thumbContainer by cssclass("thumb-container") + + val mfxColor by cssproperty>("-mfx-color") + val mfxRippleGenerator by cssclass("mfx-ripple-generator") + val mfxRippleColor by cssproperty>("-mfx-ripple-color") + val mfxCheckBox by cssclass("mfx-checkbox") + val rippleContainer by cssclass("ripple-container") + + val BackgroundColor: Color = Color.valueOf(Style.BackgroundColor) + val PrimaryColor: Color = Color.valueOf(Style.PrimaryColor) + } } diff --git a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt index 7aa7aff61..0c5793ef1 100644 --- a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt @@ -11,13 +11,6 @@ import tornadofx.* import java.net.URI class TreeTableViewStylesheet : Stylesheet() { - companion object { - val fxTreeTableCellBorderColor by cssproperty>("-fx-table-cell-border-color") - val backgroundColour: Color = valueOf(Style.BackgroundColor) - val surfaceColor: Color = valueOf(Style.SurfaceColor) - val primaryColor: Color = valueOf(Style.PrimaryColor) - } - init { treeTableCell { textFill = BLACK @@ -33,11 +26,11 @@ class TreeTableViewStylesheet : Stylesheet() { backgroundColor += TRANSPARENT } fxTreeTableCellBorderColor.value += TRANSPARENT - backgroundColor += surfaceColor + backgroundColor += SurfaceColor and(hover) { - backgroundColor += backgroundColour + backgroundColor += BackgroundColor and(empty) { - backgroundColor += surfaceColor + backgroundColor += SurfaceColor } } } @@ -54,16 +47,16 @@ class TreeTableViewStylesheet : Stylesheet() { } prefWidth = 10.0.px - backgroundColor += surfaceColor + backgroundColor += SurfaceColor thumb { - backgroundColor += primaryColor + backgroundColor += PrimaryColor } } and(focused) { borderWidth += box(0.px, 0.px, 0.px, 0.px) } - backgroundColor += surfaceColor + backgroundColor += SurfaceColor columnHeaderBackground { borderColor += box(WHITE) maxHeight = 0.px @@ -72,4 +65,12 @@ class TreeTableViewStylesheet : Stylesheet() { } } } + + companion object { + val fxTreeTableCellBorderColor by cssproperty>("-fx-table-cell-border-color") + + val BackgroundColor: Color = valueOf(Style.BackgroundColor) + val SurfaceColor: Color = valueOf(Style.SurfaceColor) + val PrimaryColor: Color = valueOf(Style.PrimaryColor) + } } diff --git a/src/test/kotlin/solve/unit/importer/ImporterTests.kt b/src/test/kotlin/solve/unit/importer/ImporterTests.kt index cf0599d59..8a12a4d4a 100644 --- a/src/test/kotlin/solve/unit/importer/ImporterTests.kt +++ b/src/test/kotlin/solve/unit/importer/ImporterTests.kt @@ -14,17 +14,6 @@ import solve.importer.model.ProjectAfterPartialParsing import solve.project.model.LayerKind class ImporterTests { - companion object { - const val pathTestProject = "testData/TestProject1" - const val image1 = "123456789" - const val image2 = "987654321" - const val layer = "alg1_keypoint" - const val pathImage1 = "testData/TestProject1/images/123456789.jpg" - const val pathImage2 = "testData/TestProject1/images/987654321.jpg" - const val pathOutput1 = "testData/TestProject1/alg1_keypoint/123456789.csv" - const val pathOutput2 = "testData/TestProject1/alg1_keypoint/987654321.csv" - } - @Test fun treeCreateTest() { val initTree = TreeItem(FileInTree(FileInfo())) @@ -85,4 +74,15 @@ class ImporterTests { Assertions.assertEquals(expected, result) } + + companion object { + const val pathTestProject = "testData/TestProject1" + const val image1 = "123456789" + const val image2 = "987654321" + const val layer = "alg1_keypoint" + const val pathImage1 = "testData/TestProject1/images/123456789.jpg" + const val pathImage2 = "testData/TestProject1/images/987654321.jpg" + const val pathOutput1 = "testData/TestProject1/alg1_keypoint/123456789.csv" + const val pathOutput2 = "testData/TestProject1/alg1_keypoint/987654321.csv" + } } From 230955145babee54f27e7868e06e3135114e0cc0 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Tue, 30 May 2023 14:04:13 +0300 Subject: [PATCH 60/72] removed png --- src/main/resources/icons/importer/Vector.png | Bin 431 -> 0 bytes src/main/resources/icons/importer/photo.png | 0 src/main/resources/icons/importer/warning.png | Bin 466 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/resources/icons/importer/Vector.png delete mode 100644 src/main/resources/icons/importer/photo.png delete mode 100644 src/main/resources/icons/importer/warning.png diff --git a/src/main/resources/icons/importer/Vector.png b/src/main/resources/icons/importer/Vector.png deleted file mode 100644 index 0fdacff4de5f089d7078b9091119b45150b7c1b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 431 zcmV;g0Z{&lP)wFKypaLu`I!6Vy_c2D%Yp`2U5~_GaVUJc?L! zfSATAfYruv7p)QM3nutD0%CqTeSf|G5lo$HkBF8S0He4t!?(B;%;xSV>cqETghBm| zJ2W%S)tS=Kb&2&rIwQ9g5oQ<*B3psU!bnJ7&ZS2&#duf>BSZTt+zYX$M96E5gc##X zG2>(3L*0jUFLp5jB86fS%R0kw5s1pb!T=<9o)#>ttUV~6dd87R?jGtf_9rjt zrRx)8(MwDMF~i`l-ZuwqHF>nC)h#8%0L88TyY0iBm8*os=h~XTZc22Um7O8QG~-pH ZnBNw6aX^4BpeO(U002ovPDHLkV1ls9sqO#( diff --git a/src/main/resources/icons/importer/photo.png b/src/main/resources/icons/importer/photo.png deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/icons/importer/warning.png b/src/main/resources/icons/importer/warning.png deleted file mode 100644 index bb0458aeb669ca1df8ab56bd96353c4f7b5e410f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmV;@0WJQCP)K~#7FrBlIG z!axxHGr9Yq1MI*Oumc2-h*$woK|%#$1w`Qp&vYQ2NC!dBWXG8$JPa=g!d!NDcK7d} zKYxKEkv6)u?^fp#Cj=io5v(Hz#0Gj1m;n&jv!Wmy;}S4p_r96QLRa8DHxItE0?JbOW->)!AeOa#0Qffg2bYa~9&HGSv$CMzp_Golg^Mh7k43n!$Ul zZp;cM`qljH6(ymi4{ao&@J}!;$6LWf$APHMrVD{JL#@(kH%h_06;x=|%Xe=_h5NbS zyIjT*%qrk#t)@}{^G?sLfHlVjDw_s;{=Q_L%*(BTUB3XvEIr#W(F+VV%to5;?pwik z+U!E;ZT~HKR{FAEKw|tO#QTrxI!h|^$sMVP@%A%c5<>3w2Ws$|52E5=%m4rY07*qo IM6N<$f+9}8)&Kwi From 56cf35233316b6482dfdbea49c778c02ac6dec0c Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Tue, 30 May 2023 14:04:35 +0300 Subject: [PATCH 61/72] fixed svg --- src/main/resources/icons/importer/check_circle.svg | 2 +- src/main/resources/icons/importer/error_folder.svg | 2 +- src/main/resources/icons/importer/warning.svg | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/icons/importer/check_circle.svg b/src/main/resources/icons/importer/check_circle.svg index 7847d8aa5..e669dd1c8 100644 --- a/src/main/resources/icons/importer/check_circle.svg +++ b/src/main/resources/icons/importer/check_circle.svg @@ -1,3 +1,3 @@ - + diff --git a/src/main/resources/icons/importer/error_folder.svg b/src/main/resources/icons/importer/error_folder.svg index 546c9ad07..64dd2ddf7 100644 --- a/src/main/resources/icons/importer/error_folder.svg +++ b/src/main/resources/icons/importer/error_folder.svg @@ -1,4 +1,4 @@ - + diff --git a/src/main/resources/icons/importer/warning.svg b/src/main/resources/icons/importer/warning.svg index 027e005ab..6e0b6acf8 100644 --- a/src/main/resources/icons/importer/warning.svg +++ b/src/main/resources/icons/importer/warning.svg @@ -1,3 +1,3 @@ - + From 5add38012f0dda76ff60920bc691ba9d95241226 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Tue, 30 May 2023 14:04:48 +0300 Subject: [PATCH 62/72] changed logo --- src/main/resources/icons/logo.png | Bin 7923 -> 24864 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/icons/logo.png b/src/main/resources/icons/logo.png index e6a21dfdb2e7c9511ab848321283cf2d279f6d3b..bc8f91b872f1f23747a208c2ed06dd901035be00 100644 GIT binary patch literal 24864 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 Uqmz?iNE-3lUs@`~m#l*S1FmVGQ2+n{ literal 7923 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

`~1djjuHveF~i>*@RikM-%qwYk)ukRM}O zzlB?e!4M1g{SMN@#!W1Fpmi|B+EWAT%iL`n4n|v)V1(|+v=GCtMkAIYq}4$c>Z+x7 zax{1;x-zV6MoW#x!@Bm3$Rgp=iY_X!*qc?sa=JW9+f#HsTFXQtY}h&S&Q&o_s$wIp z0bIOhCADooM3B0$uKJPP%Mv$O?2&=y!R3QPe~!}i?2VBKaruvLzr=iuA)$k^U#Y3x zUAa1^X4L_rGF6V+9@az-OOXMj}JZw^NQs&NhF3|`w?jrn~?QN>`edT zGKP|XAi`u;hc8av9w(I*JF6qYZ5qor)NW&8mTTBVP0r;EOi=L17ImizN|W>gYX0?v z78Qu{$MUTSA_9JRNou(42ZHZ^oT@rxITkGb@ayfxjRsMBTuPo;Sm5f5Tu$CoORx*? zSZo1ll3D=Z1;SHK20W^7+%hIb$C@O5*vQJ|4DEVS!Qh3MypC|0D`oh^pH+g&RDTgs z&%H4*NY^vw?iSS@5qqA?=^})v2vrAdG2OTO6|Xmbz@e!&!g=9$*EbNw*P|mlUsxiSlge|(A2d_L(w`Zi7T+aW4i{-269!%jqVjK70 zu>T9-wY9_Cc~UgeM!M{<*%pREr4A`R6gCk!^8d#LM_<@vlqBz3O_#8@?=+Cui@}py zlO-?Y4n;w~RI6I=>1DW|aIBLYK~Rm#jA#+Rm^FjC3n4*)lQaqZpw6)SRAmnb0WU#N z%{oat)jalUsqb^+wfdl9*VB{VM#lVNS@rehbDEh?$hJqp0A#N#*uJ2H4|6_5_ zU?YdQ%TIh5x86NuZUi{|bmX&AGP?X`o_Y8)%AvP|90I*{z1{D*9}Mg+#wv{B0|Tny za&cb_3o9D*QJmPnwtrS9?}*XRF)mSDC{CmrpmJP`c8mi;JZOirD}^D4y!PZkzh8UV zjWU`9cvse0M)ilB-Fbx6hFrcMvo28R_vnd+UFmZ}Nlpk6`+(3oMPEYLb5njcZ;w0Z zl;5>-ixaCL^F8Lr3_jvVDwSVCWWo8Bny;(_SSO?H;4Ch2)P)iuBf&V=#{xifWv+AD z0J-b)J$@pG;^-a3)6_o-bKSCLiU$C(bTvdKL=0qksffH^(GtB6eSDE8i;$*}$AO;jx&DfS@ z^H|z*QLT*2wqlJeDtZ3Nt`o(F>x=tT_Tl?tJ!;5u)Q!^L3x<&edFsi5o3VibvBBV8 zNMJS>z9|x7Ef)r`5GcBj&D?zaeKFea*bmFVnn_ZYdNO%Bz;EToX-c0tWpBJL-eYR%tTAii*U9!#(r7Wg%+HEpBJ{T>C89GGM{cM|+XDJ6U z2ksOLm6VKwl;58N!^89`_+uf^IRi{a=?=8k5g%$S6cW1))@(r9bI!dlokk>(pV8$0 ze+lcqbdXH^lh)IEgg~uFjsP6aEvfFDb&xtNflNbt8fDD9-o^Gk7+0rvL>`~5+pwT% z60F=;$Q3HEmar#`WU`8ZvgkNvR3fMY*Z1t-=S@4M?@X8T9S>mijuS#>s^s=7yS^Ls zx&%PbH)i=ie0k=UcQTYMPH_a{(`Uyon@Jc*oRp%Rm1RG)T5v%x0G+|wPh_259>8Bw zt%u-G6@(uyKlyI7oOo}3{RUdh;BFv%{b-aaz5t!|@B*U)Gn?pXv5}2yYaJ87qvV)& z#YIMY>(zmMuV>jFC?L>p(gFD2{)_ehEq{H9x99~;yWtnRHTy)DFI+P#HbKSy7XY8X A?f?J) From f00e48e681ef5e84b180e3d13bd1515358da9c3f Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Tue, 30 May 2023 14:06:26 +0300 Subject: [PATCH 63/72] fixed disabling button --- src/main/kotlin/solve/importer/ProjectParser.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/kotlin/solve/importer/ProjectParser.kt b/src/main/kotlin/solve/importer/ProjectParser.kt index 8cfa155ae..c22d8c529 100644 --- a/src/main/kotlin/solve/importer/ProjectParser.kt +++ b/src/main/kotlin/solve/importer/ProjectParser.kt @@ -41,7 +41,6 @@ object ProjectParser { "There ${if (diff.count() == 1) "is" else "are"} no $missingAlgorithms for " + "image ${frame.image.name}" ) - hasAnyErrors = true } } return hasAnyErrors From 9d07887fb014b4b1ec5b85e79f21f8b0be75e1e6 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Tue, 30 May 2023 14:08:38 +0300 Subject: [PATCH 64/72] fixed some bugs --- .../kotlin/solve/catalogue/view/CatalogueView.kt | 9 +++------ .../fields/CataloguePreviewImagesFieldsView.kt | 2 +- .../filters/settings/view/FilterSettingsView.kt | 2 ++ src/main/kotlin/solve/scene/view/SceneView.kt | 13 ++++++++----- .../solve/settings/SettingsNodeFactoriesUtils.kt | 8 ++------ .../solve/settings/grid/view/GridSettingsView.kt | 11 +++++------ .../visualization/VisualizationSettingsView.kt | 13 ++++++++++++- .../fields/view/VisualizationSettingsLayerCell.kt | 8 ++++---- .../popover/LayerSettingsNodeFactoriesUtils.kt | 7 +++---- .../popover/LayerSettingsPopOverNode.kt | 6 +++++- .../popover/LineLayerSettingsPopOverNode.kt | 2 +- .../popover/PointLayerSettingsPopOverNode.kt | 2 +- .../visualization/popover/SettingsDialogNode.kt | 2 +- src/main/kotlin/solve/styles/ListViewStylesheet.kt | 2 +- .../solve/styles/SettingsDialogStylesheet.kt | 14 ++++++++++++++ src/main/kotlin/solve/styles/Style.kt | 2 ++ 16 files changed, 65 insertions(+), 38 deletions(-) diff --git a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt index 7e5cd3e68..9907acd20 100644 --- a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt +++ b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt @@ -87,7 +87,7 @@ class CatalogueView : View() { BorderPane.setAlignment(this, Pos.CENTER) setPrefSize(150.0, 31.0) style = - "-fx-font-style: ${Style.FontCondensed}; -fx-font-weight: ${Style.FontWeightBold}; " + + "-fx-font-family: ${Style.FontCondensed}; -fx-font-weight: ${Style.FontWeightBold}; " + "-fx-background-color: #${Style.PrimaryColor}; -fx-text-fill: #${Style.SurfaceColor};" action { @@ -106,13 +106,10 @@ class CatalogueView : View() { private val placeholder = label("Project not imported") { tooltip(text) - padding = Insets(400.0, 50.0, 350.0, 50.0) + padding = Insets(400.0, 0.0, 350.0, 80.0) graphic = ImageView(cataloguePlaceholder) contentDisplay = ContentDisplay.TOP - style { - fontFamily = Style.FontCondensed - fontSize = 24.px - } + style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" } override val root = diff --git a/src/main/kotlin/solve/catalogue/view/fields/CataloguePreviewImagesFieldsView.kt b/src/main/kotlin/solve/catalogue/view/fields/CataloguePreviewImagesFieldsView.kt index 831d76515..d70b23db3 100644 --- a/src/main/kotlin/solve/catalogue/view/fields/CataloguePreviewImagesFieldsView.kt +++ b/src/main/kotlin/solve/catalogue/view/fields/CataloguePreviewImagesFieldsView.kt @@ -30,7 +30,7 @@ class CataloguePreviewImagesFieldsView : CatalogueFieldsView() { } label.graphic = ImageView(item.loadPreviewImage(PreviewImageHeight)) - label.paddingLeft = 90.0 + label.paddingLeft = 60.0 label.contentDisplay = ContentDisplay.TOP label.text = item.fileName } diff --git a/src/main/kotlin/solve/filters/settings/view/FilterSettingsView.kt b/src/main/kotlin/solve/filters/settings/view/FilterSettingsView.kt index 88f6933dc..10a186996 100644 --- a/src/main/kotlin/solve/filters/settings/view/FilterSettingsView.kt +++ b/src/main/kotlin/solve/filters/settings/view/FilterSettingsView.kt @@ -22,6 +22,7 @@ import solve.filters.settings.view.connectors.FilterSettingNodeConnector import solve.filters.settings.view.connectors.IndicesStepSettingNodeConnector import solve.filters.settings.view.connectors.TimePeriodSettingNodeConnector import solve.filters.settings.view.connectors.UIDSettingNodeConnector +import solve.styles.CatalogueViewStylesheet import solve.styles.Style import solve.styles.Style.headerPadding import solve.utils.createHGrowHBox @@ -288,6 +289,7 @@ class FilterSettingsView : View() { private fun createSettingFieldCheckbox(): CheckBox { val checkbox = mfxCheckbox { + addStylesheet(CatalogueViewStylesheet::class) paddingTop = -7.0 selectedProperty().onChange { selected -> diff --git a/src/main/kotlin/solve/scene/view/SceneView.kt b/src/main/kotlin/solve/scene/view/SceneView.kt index 34aecebb9..12f096542 100644 --- a/src/main/kotlin/solve/scene/view/SceneView.kt +++ b/src/main/kotlin/solve/scene/view/SceneView.kt @@ -46,10 +46,7 @@ class SceneView : View() { padding = Insets(350.0, 500.0, 350.0, 600.0) graphic = ImageView(scenePlaceholder) contentDisplay = ContentDisplay.TOP - style { - fontFamily = Style.FontCondensed - fontSize = 24.px - } + style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" } } @@ -72,7 +69,13 @@ class SceneView : View() { val scene = controller.sceneProperty.value if (scene.frames.isEmpty()) { - label("No frames was provided") + label("No frames was provided") { + tooltip(text) + padding = Insets(350.0, 500.0, 350.0, 600.0) + graphic = ImageView(scenePlaceholder) + contentDisplay = ContentDisplay.TOP + style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" + } return } diff --git a/src/main/kotlin/solve/settings/SettingsNodeFactoriesUtils.kt b/src/main/kotlin/solve/settings/SettingsNodeFactoriesUtils.kt index 5453f3c52..f88cf05fc 100644 --- a/src/main/kotlin/solve/settings/SettingsNodeFactoriesUtils.kt +++ b/src/main/kotlin/solve/settings/SettingsNodeFactoriesUtils.kt @@ -4,9 +4,8 @@ import javafx.geometry.Pos import javafx.scene.Node import javafx.scene.control.Label import javafx.scene.layout.HBox -import solve.styles.Style import solve.utils.structures.Alignment -import tornadofx.add +import tornadofx.* fun createSettingsField( fieldLabel: Label, @@ -20,10 +19,6 @@ fun createSettingsField( val fieldHBox = HBox(10.0) val settingsNodeHBox = HBox() - fieldLabel.apply { - style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: ${Style.HeaderFontSize}" - } - val labelHBox = HBox() labelHBox.add(fieldLabel) labelHBox.alignment = Pos.CENTER @@ -43,6 +38,7 @@ fun createSettingsField( fieldHBox.add(fieldLabel) fieldHBox.add(settingsNodeHBox) } else { + wrappedSettingNode.paddingLeft = 10.0 settingsNodeHBox.prefWidth = 5.0 fieldHBox.add(settingsNodeHBox) fieldHBox.add(fieldLabel) diff --git a/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt b/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt index ca8cf732a..2ce4ab2d9 100644 --- a/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt +++ b/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt @@ -43,11 +43,10 @@ class GridSettingsView : View() { get() = sceneController.installedColumnsNumber override val root = vbox { + style { + backgroundColor += Paint.valueOf(Style.SurfaceColor) + } vbox { - style { - backgroundColor += Paint.valueOf(Style.SurfaceColor) - } - vbox { minWidth = GridSettingsViewMinWidth @@ -56,7 +55,7 @@ class GridSettingsView : View() { add(buildScaleRangeSlider()) } border = Border( - BorderStroke(Color.LIGHTGRAY, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths.DEFAULT) + BorderStroke(Color.TRANSPARENT, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths.DEFAULT) ) padding = Insets(8.0, 10.0, 8.0, 10.0) vgrow = Priority.ALWAYS @@ -228,7 +227,7 @@ class GridSettingsView : View() { companion object { private const val GridSettingsViewMinWidth = 220.0 - private const val GridSettingsLabelFontSize = 16.0 + private const val GridSettingsLabelFontSize = 14.0 private const val GridSettingsLabelWidth = 100.0 private const val GridSettingsSettingWidth = 120.0 diff --git a/src/main/kotlin/solve/settings/visualization/VisualizationSettingsView.kt b/src/main/kotlin/solve/settings/visualization/VisualizationSettingsView.kt index 900f82825..08ec0730f 100644 --- a/src/main/kotlin/solve/settings/visualization/VisualizationSettingsView.kt +++ b/src/main/kotlin/solve/settings/visualization/VisualizationSettingsView.kt @@ -1,10 +1,13 @@ package solve.settings.visualization -import javafx.scene.layout.Priority +import javafx.scene.layout.* +import javafx.scene.paint.Color +import javafx.scene.paint.Paint import solve.scene.controller.SceneController import solve.scene.model.LayerSettings import solve.settings.visualization.fields.controller.VisualizationSettingsLayersController import solve.settings.visualization.fields.view.VisualizationSettingsLayersView +import solve.styles.Style import solve.utils.createInsetsWithValue import tornadofx.* @@ -32,6 +35,14 @@ class VisualizationSettingsView : View() { } override val root = vbox { + style { + backgroundColor += Paint.valueOf(Style.SurfaceColor) + } + + border = Border( + BorderStroke(Color.TRANSPARENT, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths.DEFAULT) + ) + minWidth = VisualizationSettingsViewMinWidth add(visualizationSettingsLayersView) diff --git a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt index 76d04d949..b96b00793 100644 --- a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt +++ b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt @@ -20,7 +20,7 @@ import solve.constants.IconsSettingsVisualizationLayerVisiblePath import solve.scene.controller.SceneController import solve.scene.model.LandmarkType import solve.scene.model.LayerSettings -import solve.settings.visualization.VisualizationSettingsView +import solve.scene.view.SceneView import solve.settings.visualization.popover.DialogClosingController import solve.settings.visualization.popover.LineLayerSettingsPopOverNode import solve.settings.visualization.popover.PointLayerSettingsPopOverNode @@ -41,7 +41,7 @@ class VisualizationSettingsLayerCell( private val sceneController: SceneController, private val dialogClosingController: DialogClosingController ) : DragAndDropListCell(LayerSettings::class) { - private val settings = find() + private val sceneView = find() override fun setAfterDragDropped( event: DragEvent, thisItemInfo: DragAndDropCellItemInfo, @@ -104,7 +104,7 @@ class VisualizationSettingsLayerCell( private fun createLayerNameLabel(): Label = label(item.layerName) { style = - "-fx-font-style: ${Style.FontCondensed}; -fx-font-size: ${Style.ButtonFontSize}; " + + "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: ${Style.ButtonFontSize}; " + "-fx-text-fill: #${Style.OnBackgroundColor}" font = Font.font(LayerFieldNameFontSize) } @@ -202,7 +202,7 @@ class VisualizationSettingsLayerCell( private fun createLayerSettingsPopOver(contentNode: Node, titleLabel: String): MFXStageDialog { val content = createGenericDialog(contentNode) - val dialog = createStageDialog(content, settings.currentStage, settings.root) + val dialog = createStageDialog(content, sceneView.currentStage, sceneView.root) val popOver = PopOver(contentNode) popOver.detach() diff --git a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt index 937dfbebe..981c8e7c2 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt @@ -37,10 +37,9 @@ fun buildLandmarkColorPicker( fun buildLandmarkUseOneColorCheckBox( layerSettings: LayerSettings ): MFXCheckbox { - val checkBox = MFXCheckbox() - checkBox.style { - fontFamily = Style.FontCondensed - fontSize = 20.0.px + val checkBox = MFXCheckbox("One color") + checkBox.apply { + style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: ${Style.HeaderFontSize}" } checkBox.isSelected = layerSettings.useCommonColor diff --git a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt index 457d9b284..fc4a9e83a 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt @@ -18,7 +18,7 @@ abstract class LayerSettingsPopOverNode { protected fun addCancel(dialogClosingController: DialogClosingController) { val borderpane = BorderPane().apply { - right = mfxButton("CANCEL") { + right = mfxButton("OK") { BorderPane.setMargin(this, Insets(0.0, 24.0, 24.0, 0.0)) maxWidth = 75.0 prefHeight = 23.0 @@ -37,6 +37,7 @@ abstract class LayerSettingsPopOverNode { popOver.addTitle() } + protected fun addSettingField( name: String, settingNode: Node, @@ -54,6 +55,9 @@ abstract class LayerSettingsPopOverNode { settingsNodeAlignment, isLabelOnLeft ) + fieldLabel.apply { + style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: ${Style.HeaderFontSize}" + } popOver.add(settingsField) } diff --git a/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt index 7f0d2abf6..9d0b70a3a 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt @@ -40,7 +40,7 @@ class LineLayerSettingsPopOverNode( isLabelOnLeft = true ) addSettingField( - "One color", + "", buildLandmarkUseOneColorCheckBox(lineLayerSettings), Alignment.Left, isLabelOnLeft = false diff --git a/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt index bb116d0ba..b40c503bb 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt @@ -35,7 +35,7 @@ class PointLayerSettingsPopOverNode( isLabelOnLeft = true ) addSettingField( - "One color", + "", buildLandmarkUseOneColorCheckBox(pointLayerSettings), Alignment.Left, isLabelOnLeft = false diff --git a/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt b/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt index ebcd16624..a7db6724e 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt @@ -11,7 +11,7 @@ class SettingsDialogNode : VBox(10.0) { fun addTitle() { val titleLabel = label(title) { paddingLeft = 10.0 - style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: 28px;" + style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: ${Style.SettingsDialogFontSize};" } this.add(titleLabel) diff --git a/src/main/kotlin/solve/styles/ListViewStylesheet.kt b/src/main/kotlin/solve/styles/ListViewStylesheet.kt index 6eed6bfbc..43ea2a1a2 100644 --- a/src/main/kotlin/solve/styles/ListViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/ListViewStylesheet.kt @@ -6,7 +6,7 @@ import tornadofx.* class ListViewStylesheet : Stylesheet() { init { listView { - backgroundColor += Color.valueOf(Style.BackgroundColor) + backgroundColor += Color.valueOf(Style.SurfaceColor) } listCell { backgroundColor += Color.valueOf(Style.SurfaceColor) diff --git a/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt b/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt index 928b67cf4..c62d1e976 100644 --- a/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt +++ b/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt @@ -48,6 +48,18 @@ class SettingsDialogStylesheet : Stylesheet() { } thumbContainer { + and(hover) { + thumbRadius { + mfxColor.value += PrimaryColor + } + } + + and(pressed) { + thumbRadius { + mfxColor.value += PrimaryColor + } + } + mfxRippleGenerator { mfxRippleColor.value += PrimaryColor } @@ -65,6 +77,7 @@ class SettingsDialogStylesheet : Stylesheet() { companion object { private val mfxSlider by cssclass() private val thumbContainer by cssclass("thumb-container") + private val thumbRadius by cssclass("thumb-radius") val mfxColor by cssproperty>("-mfx-color") val mfxRippleGenerator by cssclass("mfx-ripple-generator") @@ -74,5 +87,6 @@ class SettingsDialogStylesheet : Stylesheet() { val BackgroundColor: Color = Color.valueOf(Style.BackgroundColor) val PrimaryColor: Color = Color.valueOf(Style.PrimaryColor) + val PrimaryColorLight: Color = Color.valueOf(Style.PrimaryColorLight) } } diff --git a/src/main/kotlin/solve/styles/Style.kt b/src/main/kotlin/solve/styles/Style.kt index 87f0e0014..a91e37e2d 100644 --- a/src/main/kotlin/solve/styles/Style.kt +++ b/src/main/kotlin/solve/styles/Style.kt @@ -45,6 +45,8 @@ object Style { const val MainFontSize = "15px" + const val SettingsDialogFontSize = "22px" + val TooltipFontSize = Dimension(12.0, Dimension.LinearUnits.px) const val ButtonStyle = From bf88422dafa13475ada0f597b60f8d5a8e422ef2 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Tue, 30 May 2023 14:09:33 +0300 Subject: [PATCH 65/72] added val instead of var --- src/main/kotlin/solve/importer/ProjectParser.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/solve/importer/ProjectParser.kt b/src/main/kotlin/solve/importer/ProjectParser.kt index c22d8c529..e48d3044d 100644 --- a/src/main/kotlin/solve/importer/ProjectParser.kt +++ b/src/main/kotlin/solve/importer/ProjectParser.kt @@ -32,7 +32,7 @@ object ProjectParser { frames: ArrayList, layers: MutableList ): Boolean { - var hasAnyErrors = false + val hasAnyErrors = false frames.forEach { frame -> val diff = layers.minus(frame.outputs.map { output -> output.algorithmName }.toSet()) if (diff.isNotEmpty()) { From d5139856fed29a6011df8c81f43336c0dba7a9d7 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Tue, 30 May 2023 14:10:24 +0300 Subject: [PATCH 66/72] removed unused --- .../visualization/popover/LayerSettingsNodeFactoriesUtils.kt | 1 - src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt | 1 - src/main/kotlin/solve/styles/Style.kt | 2 -- 3 files changed, 4 deletions(-) diff --git a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt index 981c8e7c2..5381c6080 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt @@ -9,7 +9,6 @@ import javafx.scene.control.ColorPicker import solve.scene.controller.SceneController import solve.scene.model.LayerSettings import solve.styles.Style -import tornadofx.* const val ElementWidth = 270.0 fun buildLandmarkColorPicker( diff --git a/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt b/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt index c62d1e976..cddd31dcf 100644 --- a/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt +++ b/src/main/kotlin/solve/styles/SettingsDialogStylesheet.kt @@ -87,6 +87,5 @@ class SettingsDialogStylesheet : Stylesheet() { val BackgroundColor: Color = Color.valueOf(Style.BackgroundColor) val PrimaryColor: Color = Color.valueOf(Style.PrimaryColor) - val PrimaryColorLight: Color = Color.valueOf(Style.PrimaryColorLight) } } diff --git a/src/main/kotlin/solve/styles/Style.kt b/src/main/kotlin/solve/styles/Style.kt index a91e37e2d..728f51c9f 100644 --- a/src/main/kotlin/solve/styles/Style.kt +++ b/src/main/kotlin/solve/styles/Style.kt @@ -27,8 +27,6 @@ object Style { const val ErrorColor = "EF6E6B" - const val ActiveColor = "41497F" - const val FontCondensed = "'Roboto Condensed'" const val Font = "Roboto" From 00638114b1d182652cfb83701c0773e328bcec52 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Tue, 30 May 2023 14:19:46 +0300 Subject: [PATCH 67/72] fixed tabs and spaces --- src/main/kotlin/solve/catalogue/view/CatalogueView.kt | 3 ++- src/main/kotlin/solve/scene/view/SceneView.kt | 6 ++++-- .../settings/visualization/VisualizationSettingsView.kt | 7 ++++++- .../visualization/popover/LayerSettingsPopOverNode.kt | 1 - 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt index 9907acd20..df3ff5ec7 100644 --- a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt +++ b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt @@ -109,7 +109,8 @@ class CatalogueView : View() { padding = Insets(400.0, 0.0, 350.0, 80.0) graphic = ImageView(cataloguePlaceholder) contentDisplay = ContentDisplay.TOP - style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" + style = "-fx-font-family: ${Style.FontCondensed}; " + + "-fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" } override val root = diff --git a/src/main/kotlin/solve/scene/view/SceneView.kt b/src/main/kotlin/solve/scene/view/SceneView.kt index 12f096542..6f34326d4 100644 --- a/src/main/kotlin/solve/scene/view/SceneView.kt +++ b/src/main/kotlin/solve/scene/view/SceneView.kt @@ -46,7 +46,8 @@ class SceneView : View() { padding = Insets(350.0, 500.0, 350.0, 600.0) graphic = ImageView(scenePlaceholder) contentDisplay = ContentDisplay.TOP - style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" + style = "-fx-font-family: ${Style.FontCondensed}; " + + "-fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" } } @@ -74,7 +75,8 @@ class SceneView : View() { padding = Insets(350.0, 500.0, 350.0, 600.0) graphic = ImageView(scenePlaceholder) contentDisplay = ContentDisplay.TOP - style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" + style = "-fx-font-family: ${Style.FontCondensed}; " + + "-fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" } return } diff --git a/src/main/kotlin/solve/settings/visualization/VisualizationSettingsView.kt b/src/main/kotlin/solve/settings/visualization/VisualizationSettingsView.kt index 08ec0730f..c55308b65 100644 --- a/src/main/kotlin/solve/settings/visualization/VisualizationSettingsView.kt +++ b/src/main/kotlin/solve/settings/visualization/VisualizationSettingsView.kt @@ -1,6 +1,11 @@ package solve.settings.visualization -import javafx.scene.layout.* +import javafx.scene.layout.Border +import javafx.scene.layout.BorderStroke +import javafx.scene.layout.BorderStrokeStyle +import javafx.scene.layout.BorderWidths +import javafx.scene.layout.CornerRadii +import javafx.scene.layout.Priority import javafx.scene.paint.Color import javafx.scene.paint.Paint import solve.scene.controller.SceneController diff --git a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt index fc4a9e83a..e79683caf 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt @@ -37,7 +37,6 @@ abstract class LayerSettingsPopOverNode { popOver.addTitle() } - protected fun addSettingField( name: String, settingNode: Node, From 24c1013229ba1436031bfcce4dcfcba1e8cb63e6 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Mon, 12 Jun 2023 17:00:28 +0300 Subject: [PATCH 68/72] removed unused --- .../controls/IndicesStepSettingControl.kt | 18 ------------------ .../view/controls/TimePeriodSettingControl.kt | 18 ------------------ .../view/controls/UIDSettingControl.kt | 18 ------------------ .../icons/importer/list_cell_arrow.png | Bin 234 -> 0 bytes 4 files changed, 54 deletions(-) delete mode 100644 src/main/kotlin/solve/filters/settings/view/controls/IndicesStepSettingControl.kt delete mode 100644 src/main/kotlin/solve/filters/settings/view/controls/TimePeriodSettingControl.kt delete mode 100644 src/main/kotlin/solve/filters/settings/view/controls/UIDSettingControl.kt delete mode 100644 src/main/resources/icons/importer/list_cell_arrow.png diff --git a/src/main/kotlin/solve/filters/settings/view/controls/IndicesStepSettingControl.kt b/src/main/kotlin/solve/filters/settings/view/controls/IndicesStepSettingControl.kt deleted file mode 100644 index 12a298a8d..000000000 --- a/src/main/kotlin/solve/filters/settings/view/controls/IndicesStepSettingControl.kt +++ /dev/null @@ -1,18 +0,0 @@ -package solve.filters.settings.view.controls - -import solve.filters.settings.model.IndicesStepFilterSetting -import solve.utils.materialfx.MFXIntegerTextField - -class IndicesStepSettingControl( - controlNode: MFXIntegerTextField -) : FilterSettingControl(controlNode) { - override fun extrudeFilterSettings(): IndicesStepFilterSetting? { - if (!controlNode.isValid || controlNode.text.isEmpty()) { - return null - } - - val stepNumber = controlNode.text.toInt() - - return IndicesStepFilterSetting(stepNumber) - } -} diff --git a/src/main/kotlin/solve/filters/settings/view/controls/TimePeriodSettingControl.kt b/src/main/kotlin/solve/filters/settings/view/controls/TimePeriodSettingControl.kt deleted file mode 100644 index 508c5c037..000000000 --- a/src/main/kotlin/solve/filters/settings/view/controls/TimePeriodSettingControl.kt +++ /dev/null @@ -1,18 +0,0 @@ -package solve.filters.settings.view.controls - -import org.controlsfx.control.RangeSlider -import solve.filters.settings.model.TimePeriodFilterSetting -import solve.utils.ceilToInt -import solve.utils.floorToInt -import solve.utils.structures.IntPoint - -class TimePeriodSettingControl( - controlNode: RangeSlider -) : FilterSettingControl(controlNode) { - override fun extrudeFilterSettings(): TimePeriodFilterSetting { - val fromTimePeriod = controlNode.lowValue.floorToInt() - val toTimePeriod = controlNode.highValue.ceilToInt() - - return TimePeriodFilterSetting(IntPoint(fromTimePeriod, toTimePeriod)) - } -} diff --git a/src/main/kotlin/solve/filters/settings/view/controls/UIDSettingControl.kt b/src/main/kotlin/solve/filters/settings/view/controls/UIDSettingControl.kt deleted file mode 100644 index a07b534ee..000000000 --- a/src/main/kotlin/solve/filters/settings/view/controls/UIDSettingControl.kt +++ /dev/null @@ -1,18 +0,0 @@ -package solve.filters.settings.view.controls - -import solve.filters.settings.model.UIDFilterSetting -import solve.utils.materialfx.MFXIntegerTextField - -class UIDSettingControl( - controlNode: MFXIntegerTextField -) : FilterSettingControl(controlNode) { - override fun extrudeFilterSettings(): UIDFilterSetting? { - if (!controlNode.isValid || controlNode.text.isEmpty()) { - return null - } - - val uid = controlNode.text.toLong() - - return UIDFilterSetting(uid) - } -} diff --git a/src/main/resources/icons/importer/list_cell_arrow.png b/src/main/resources/icons/importer/list_cell_arrow.png deleted file mode 100644 index 4c69db8555d9f17100576dd091a31c112c07136e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^96-#&!3HGb=lz)rq&N#aB8wRqxP?KOkzv*x37{Zj zage(c!@6@aFM%AEbVpxD28NCO+0ai4LY@_pTJDj_w^livQ)Vak1SID{ukYmrkDM6+L%=hTXZ_V1w>wy>DoSL b#a9M-yU;wRf;ON_7#KWV{an^LB{Ts5sBukM From 039bb554bf8f455f7c2606aeb88fd1850335f884 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Mon, 12 Jun 2023 17:11:31 +0300 Subject: [PATCH 69/72] fixes --- .../catalogue/view/CatalogueSettingsView.kt | 4 +- .../view/fields/CatalogueFieldsView.kt | 4 +- src/main/kotlin/solve/scene/view/SceneView.kt | 27 ++++------ .../view/VisualizationSettingsLayerCell.kt | 21 ++------ .../view/VisualizationSettingsLayersView.kt | 5 +- .../LayerSettingsNodeFactoriesUtils.kt | 6 +-- .../popover/LayerSettingsPopOverNode.kt | 11 ++-- .../popover/LineLayerSettingsPopOverNode.kt | 5 +- .../popover/PointLayerSettingsPopOverNode.kt | 5 +- .../popover/SettingsDialogNode.kt | 4 +- .../solve/styles/TreeTableViewStylesheet.kt | 2 +- .../icons/importer/list_cell_arrow.svg | 3 ++ src/main/resources/icons/logo.png | Bin 24864 -> 18744 bytes .../solve/unit/importer/ImporterTests.kt | 50 +++++++++--------- 14 files changed, 71 insertions(+), 76 deletions(-) create mode 100644 src/main/resources/icons/importer/list_cell_arrow.svg diff --git a/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt b/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt index a89df4eb4..ebaeb4573 100644 --- a/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt +++ b/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt @@ -52,14 +52,14 @@ class CatalogueSettingsView : View() { style = "-fx-font-family: ${Style.FontCondensed}; -fx-font-weight: ${Style.FontWeightBold};" } - var segmentedButton = SegmentedButton(fileNameViewRadioButton, imagePreviewRadioButton) + private var segmentedButton = SegmentedButton(fileNameViewRadioButton, imagePreviewRadioButton) override val root = vbox { hbox(130) { addStylesheet(CatalogueViewStylesheet::class) maxWidth = 500.0 - padding = Insets(0.0, 0.0, 0.0, 0.0) + paddingAll = 0.0 selectionCheckBox = mfxCheckbox { paddingLeft = 7.0 action { diff --git a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt index bf279be8b..36cf38561 100644 --- a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt +++ b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt @@ -30,7 +30,7 @@ abstract class CatalogueFieldsView : View() { private val fields: ObservableList by param() val fieldsListView = mfxCheckListView(fields) { - padding = Insets(0.0, 0.0, 0.0, 0.0) + paddingAll = 0.0 addStylesheet(CatalogueViewStylesheet::class) @@ -76,7 +76,7 @@ abstract class CatalogueFieldsView : View() { fun uncheckAllItems() = fieldsListView.uncheckAllItems() - protected fun setCellHeight(cell: MFXCheckListCell) { + private fun setCellHeight(cell: MFXCheckListCell) { cell.prefHeight = listViewCellHeight } diff --git a/src/main/kotlin/solve/scene/view/SceneView.kt b/src/main/kotlin/solve/scene/view/SceneView.kt index 6f34326d4..18bf2ddff 100644 --- a/src/main/kotlin/solve/scene/view/SceneView.kt +++ b/src/main/kotlin/solve/scene/view/SceneView.kt @@ -34,6 +34,15 @@ class SceneView : View() { private val scenePlaceholder = loadResourcesImage(IconsScenePlaceholder) + private fun placeholderLabel(text: String) = label(text) { + tooltip(getText()) + padding = Insets(350.0, 500.0, 350.0, 600.0) + graphic = ImageView(scenePlaceholder) + contentDisplay = ContentDisplay.TOP + style = "-fx-font-family: ${Style.FontCondensed}; " + + "-fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" + } + var currentGrid: Grid? = null private set var currentAssociationsManager: AssociationsManager? = null @@ -41,14 +50,7 @@ class SceneView : View() { private var frameViewCache: Cache? = null override val root = vbox { - label("Project not imported") { - tooltip(text) - padding = Insets(350.0, 500.0, 350.0, 600.0) - graphic = ImageView(scenePlaceholder) - contentDisplay = ContentDisplay.TOP - style = "-fx-font-family: ${Style.FontCondensed}; " + - "-fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" - } + placeholderLabel("Project not imported") } init { @@ -70,14 +72,7 @@ class SceneView : View() { val scene = controller.sceneProperty.value if (scene.frames.isEmpty()) { - label("No frames was provided") { - tooltip(text) - padding = Insets(350.0, 500.0, 350.0, 600.0) - graphic = ImageView(scenePlaceholder) - contentDisplay = ContentDisplay.TOP - style = "-fx-font-family: ${Style.FontCondensed}; " + - "-fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" - } + placeholderLabel("No frames was provided") return } diff --git a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt index b96b00793..e902a2c5d 100644 --- a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt +++ b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt @@ -2,6 +2,7 @@ package solve.settings.visualization.fields.view import io.github.palexdev.materialfx.dialogs.MFXStageDialog import javafx.application.Platform +import javafx.beans.property.SimpleBooleanProperty import javafx.geometry.Insets import javafx.geometry.Pos import javafx.scene.Node @@ -39,7 +40,7 @@ import tornadofx.* class VisualizationSettingsLayerCell( private val sceneController: SceneController, - private val dialogClosingController: DialogClosingController + private val dialogIsClosing: SimpleBooleanProperty ) : DragAndDropListCell(LayerSettings::class) { private val sceneView = find() override fun setAfterDragDropped( @@ -186,7 +187,7 @@ class VisualizationSettingsLayerCell( layerSettings as LayerSettings.PointLayerSettings, sceneController, title, - dialogClosingController + dialogIsClosing ).getPopOverNode() LandmarkType.Line -> @@ -194,7 +195,7 @@ class VisualizationSettingsLayerCell( layerSettings as LayerSettings.LineLayerSettings, sceneController, title, - dialogClosingController + dialogIsClosing ).getPopOverNode() LandmarkType.Plane -> null @@ -209,7 +210,7 @@ class VisualizationSettingsLayerCell( popOver.title = titleLabel Platform.runLater { - dialogClosingController.isClosing.onChange { + dialogIsClosing.onChange { if (it) dialog.close() } } @@ -217,18 +218,6 @@ class VisualizationSettingsLayerCell( return dialog } -// private fun getPopOverNodeSize(layerType: LandmarkType) = when (layerType) { -// LandmarkType.Keypoint -> DoublePoint( -// PointLayerSettingsPopOverNode.LayerSettingsNodePrefWidth, -// PointLayerSettingsPopOverNode.LayerSettingsNodePrefHeight -// ) -// LandmarkType.Line -> DoublePoint( -// LineLayerSettingsPopOverNode.LayerSettingsNodePrefWidth, -// LineLayerSettingsPopOverNode.LayerSettingsNodePrefHeight -// ) -// LandmarkType.Plane -> null -// } - private fun getLayerSettingsType(layerSettings: LayerSettings) = when (layerSettings) { is LayerSettings.PointLayerSettings -> LandmarkType.Keypoint is LayerSettings.LineLayerSettings -> LandmarkType.Line diff --git a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt index 85411f2ec..e06223b13 100644 --- a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt +++ b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt @@ -1,5 +1,6 @@ package solve.settings.visualization.fields.view +import javafx.beans.property.SimpleBooleanProperty import javafx.scene.input.TransferMode import javafx.scene.layout.Priority import javafx.util.Callback @@ -13,14 +14,14 @@ import tornadofx.* class VisualizationSettingsLayersView : View() { private val sceneController: SceneController by inject() private val controller: VisualizationSettingsLayersController by inject() - private val dialogClosingController: DialogClosingController by inject() + private val dialogIsClosing = SimpleBooleanProperty(false) private val fieldListViewCells = mutableListOf() private val fieldsListView = listview(controller.model.layers) { addStylesheet(ListViewStylesheet::class) cellFactory = Callback { - val layerCell = VisualizationSettingsLayerCell(sceneController, dialogClosingController) + val layerCell = VisualizationSettingsLayerCell(sceneController, dialogIsClosing) fieldListViewCells.add(layerCell) return@Callback layerCell diff --git a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt index 5381c6080..0296092cb 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsNodeFactoriesUtils.kt @@ -10,7 +10,7 @@ import solve.scene.controller.SceneController import solve.scene.model.LayerSettings import solve.styles.Style -const val ElementWidth = 270.0 +const val InteractiveElementWidth = 270.0 fun buildLandmarkColorPicker( layerSettings: LayerSettings, sceneController: SceneController @@ -18,7 +18,7 @@ fun buildLandmarkColorPicker( val colorPicker = ColorPicker() colorPicker.value = layerSettings.commonColor - colorPicker.prefWidth = ElementWidth + colorPicker.prefWidth = InteractiveElementWidth colorPicker.setOnAction { layerSettings.commonColor = colorPicker.value } @@ -66,7 +66,7 @@ fun buildSizeSlider( slider.min = minValue slider.max = maxValue slider.value = initialSizeValue - slider.prefWidth = ElementWidth + slider.prefWidth = InteractiveElementWidth slider.valueProperty().addListener(changeListener) diff --git a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt index e79683caf..0bf613418 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LayerSettingsPopOverNode.kt @@ -1,5 +1,6 @@ package solve.settings.visualization.popover +import javafx.beans.property.SimpleBooleanProperty import javafx.geometry.Insets import javafx.scene.Node import javafx.scene.control.Label @@ -16,7 +17,12 @@ abstract class LayerSettingsPopOverNode { addStylesheet(SettingsDialogStylesheet::class) } - protected fun addCancel(dialogClosingController: DialogClosingController) { + private fun changeIsClosing(dialogIsClosing: SimpleBooleanProperty) { + dialogIsClosing.value = true + dialogIsClosing.value = false + } + + protected fun addCancel(dialogIsClosing: SimpleBooleanProperty) { val borderpane = BorderPane().apply { right = mfxButton("OK") { BorderPane.setMargin(this, Insets(0.0, 24.0, 24.0, 0.0)) @@ -24,8 +30,7 @@ abstract class LayerSettingsPopOverNode { prefHeight = 23.0 style = Style.ButtonStyle action { - dialogClosingController.isClosing.value = true - dialogClosingController.isClosing.value = false + changeIsClosing(dialogIsClosing) } } } diff --git a/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt index 9d0b70a3a..7fb9d2662 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/LineLayerSettingsPopOverNode.kt @@ -1,5 +1,6 @@ package solve.settings.visualization.popover +import javafx.beans.property.SimpleBooleanProperty import javafx.beans.value.WeakChangeListener import solve.scene.controller.SceneController import solve.scene.model.LayerSettings @@ -12,7 +13,7 @@ class LineLayerSettingsPopOverNode( private val lineLayerSettings: LayerSettings.LineLayerSettings, private val sceneController: SceneController, private val title: String, - private val dialogClosingController: DialogClosingController + private val dialogIsClosing: SimpleBooleanProperty ) : LayerSettingsPopOverNode() { companion object { const val LayerSettingsNodePrefWidth = 260.0 @@ -45,7 +46,7 @@ class LineLayerSettingsPopOverNode( Alignment.Left, isLabelOnLeft = false ) - addCancel(dialogClosingController) + addCancel(dialogIsClosing) return popOver } diff --git a/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt b/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt index b40c503bb..1795825be 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/PointLayerSettingsPopOverNode.kt @@ -1,5 +1,6 @@ package solve.settings.visualization.popover +import javafx.beans.property.SimpleBooleanProperty import javafx.beans.value.WeakChangeListener import solve.scene.controller.SceneController import solve.scene.model.LayerSettings @@ -12,7 +13,7 @@ class PointLayerSettingsPopOverNode( private val pointLayerSettings: LayerSettings.PointLayerSettings, private val sceneController: SceneController, private val title: String, - private val dialogClosingController: DialogClosingController + private val dialogIsClosing: SimpleBooleanProperty ) : LayerSettingsPopOverNode() { private val radiusSliderValueChangedEventHandler = ChangeListener { _, _, radiusValue -> pointLayerSettings.selectedRadius = radiusValue as Double @@ -40,7 +41,7 @@ class PointLayerSettingsPopOverNode( Alignment.Left, isLabelOnLeft = false ) - addCancel(dialogClosingController) + addCancel(dialogIsClosing) return popOver } diff --git a/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt b/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt index a7db6724e..b5c153eba 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt @@ -1,12 +1,12 @@ package solve.settings.visualization.popover +import javafx.scene.control.Label import javafx.scene.layout.VBox import solve.styles.Style import tornadofx.* class SettingsDialogNode : VBox(10.0) { - - var title: String = "" + lateinit var title: String fun addTitle() { val titleLabel = label(title) { diff --git a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt index 0c5793ef1..53cbc93ae 100644 --- a/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/TreeTableViewStylesheet.kt @@ -19,7 +19,7 @@ class TreeTableViewStylesheet : Stylesheet() { treeTableRowCell { arrow { - backgroundImage += URI("/icons/importer/list_cell_arrow.png") + backgroundImage += URI("/icons/importer/list_cell_arrow.svg") prefHeight = 12.px prefWidth = 7.px diff --git a/src/main/resources/icons/importer/list_cell_arrow.svg b/src/main/resources/icons/importer/list_cell_arrow.svg new file mode 100644 index 000000000..2161867f3 --- /dev/null +++ b/src/main/resources/icons/importer/list_cell_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/icons/logo.png b/src/main/resources/icons/logo.png index bc8f91b872f1f23747a208c2ed06dd901035be00..abb71ca692ef54bd7730bc39f9562c1b44c6307a 100644 GIT binary patch literal 18744 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 literal 24864 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 Uqmz?iNE-3lUs@`~m#l*S1FmVGQ2+n{ diff --git a/src/test/kotlin/solve/unit/importer/ImporterTests.kt b/src/test/kotlin/solve/unit/importer/ImporterTests.kt index 8a12a4d4a..83d92c390 100644 --- a/src/test/kotlin/solve/unit/importer/ImporterTests.kt +++ b/src/test/kotlin/solve/unit/importer/ImporterTests.kt @@ -18,14 +18,14 @@ class ImporterTests { fun treeCreateTest() { val initTree = TreeItem(FileInTree(FileInfo())) - val project = partialParseDirectory(pathTestProject) + val project = partialParseDirectory(PathTestProject) val result = project?.let { createTreeWithFiles(it, initTree) } - val image1 = TreeItem(FileInTree(FileInfo(image1))) - val image2 = TreeItem(FileInTree(FileInfo(image2))) + val image1 = TreeItem(FileInTree(FileInfo(Image1))) + val image2 = TreeItem(FileInTree(FileInfo(Image2))) - image1.children.add(TreeItem(FileInTree(FileInfo(layer)))) - image2.children.add(TreeItem(FileInTree(FileInfo(layer)))) + image1.children.add(TreeItem(FileInTree(FileInfo(Layer)))) + image2.children.add(TreeItem(FileInTree(FileInfo(Layer)))) initTree.children.addAll(image1, image2) @@ -34,19 +34,19 @@ class ImporterTests { @Test fun partialParseDirectoryTest() { - val result = partialParseDirectory(pathTestProject) + val result = partialParseDirectory(PathTestProject) val frame1 = FrameAfterPartialParsing( ImageAfterPartialParsing( - image1, - pathImage1, + Image1, + PathImage1, mutableListOf() ), listOf( OutputAfterPartialParsing( - image1, - pathOutput1, - layer, + Image1, + PathOutput1, + Layer, LayerKind.Keypoint, mutableListOf() ) @@ -55,34 +55,34 @@ class ImporterTests { val frame2 = FrameAfterPartialParsing( ImageAfterPartialParsing( - image2, - pathImage2, + Image2, + PathImage2, mutableListOf() ), listOf( OutputAfterPartialParsing( - image2, - pathOutput2, - layer, + Image2, + PathOutput2, + Layer, LayerKind.Keypoint, mutableListOf() ) ) ) - val expected = ProjectAfterPartialParsing(pathTestProject, listOf(frame1, frame2)) + val expected = ProjectAfterPartialParsing(PathTestProject, listOf(frame1, frame2)) Assertions.assertEquals(expected, result) } companion object { - const val pathTestProject = "testData/TestProject1" - const val image1 = "123456789" - const val image2 = "987654321" - const val layer = "alg1_keypoint" - const val pathImage1 = "testData/TestProject1/images/123456789.jpg" - const val pathImage2 = "testData/TestProject1/images/987654321.jpg" - const val pathOutput1 = "testData/TestProject1/alg1_keypoint/123456789.csv" - const val pathOutput2 = "testData/TestProject1/alg1_keypoint/987654321.csv" + const val PathTestProject = "testData/TestProject1" + const val Image1 = "123456789" + const val Image2 = "987654321" + const val Layer = "alg1_keypoint" + const val PathImage1 = "testData/TestProject1/images/123456789.jpg" + const val PathImage2 = "testData/TestProject1/images/987654321.jpg" + const val PathOutput1 = "testData/TestProject1/alg1_keypoint/123456789.csv" + const val PathOutput2 = "testData/TestProject1/alg1_keypoint/987654321.csv" } } From 0f138b913012336374e14fd06157294fcb199a91 Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Mon, 12 Jun 2023 19:16:52 +0300 Subject: [PATCH 70/72] fixed linter warning --- src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt | 1 - .../kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt | 1 - src/main/kotlin/solve/scene/view/SceneView.kt | 2 +- .../visualization/fields/view/VisualizationSettingsLayerCell.kt | 1 - .../fields/view/VisualizationSettingsLayersView.kt | 1 - .../solve/settings/visualization/popover/SettingsDialogNode.kt | 1 - 6 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt b/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt index ebaeb4573..417c16dd5 100644 --- a/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt +++ b/src/main/kotlin/solve/catalogue/view/CatalogueSettingsView.kt @@ -1,7 +1,6 @@ package solve.catalogue.view import javafx.beans.property.SimpleObjectProperty -import javafx.geometry.Insets import javafx.geometry.Pos import javafx.scene.control.CheckBox import javafx.scene.control.ToggleButton diff --git a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt index 36cf38561..9f7804c00 100644 --- a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt +++ b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt @@ -3,7 +3,6 @@ package solve.catalogue.view.fields import io.github.palexdev.materialfx.controls.cell.MFXCheckListCell import io.github.palexdev.materialfx.effects.DepthLevel import javafx.collections.ObservableList -import javafx.geometry.Insets import javafx.scene.Node import javafx.scene.control.Label import javafx.scene.image.Image diff --git a/src/main/kotlin/solve/scene/view/SceneView.kt b/src/main/kotlin/solve/scene/view/SceneView.kt index 18bf2ddff..ac520d549 100644 --- a/src/main/kotlin/solve/scene/view/SceneView.kt +++ b/src/main/kotlin/solve/scene/view/SceneView.kt @@ -40,7 +40,7 @@ class SceneView : View() { graphic = ImageView(scenePlaceholder) contentDisplay = ContentDisplay.TOP style = "-fx-font-family: ${Style.FontCondensed}; " + - "-fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" + "-fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" } var currentGrid: Grid? = null diff --git a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt index e902a2c5d..8dd28ea09 100644 --- a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt +++ b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayerCell.kt @@ -22,7 +22,6 @@ import solve.scene.controller.SceneController import solve.scene.model.LandmarkType import solve.scene.model.LayerSettings import solve.scene.view.SceneView -import solve.settings.visualization.popover.DialogClosingController import solve.settings.visualization.popover.LineLayerSettingsPopOverNode import solve.settings.visualization.popover.PointLayerSettingsPopOverNode import solve.settings.visualization.popover.SettingsDialogNode diff --git a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt index e06223b13..bc62dec91 100644 --- a/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt +++ b/src/main/kotlin/solve/settings/visualization/fields/view/VisualizationSettingsLayersView.kt @@ -6,7 +6,6 @@ import javafx.scene.layout.Priority import javafx.util.Callback import solve.scene.controller.SceneController import solve.settings.visualization.fields.controller.VisualizationSettingsLayersController -import solve.settings.visualization.popover.DialogClosingController import solve.styles.ListViewStylesheet import solve.utils.nodes.listcell.dragdrop.isListViewCellSource import tornadofx.* diff --git a/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt b/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt index b5c153eba..36661af88 100644 --- a/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt +++ b/src/main/kotlin/solve/settings/visualization/popover/SettingsDialogNode.kt @@ -1,6 +1,5 @@ package solve.settings.visualization.popover -import javafx.scene.control.Label import javafx.scene.layout.VBox import solve.styles.Style import tornadofx.* From 689ee227dc11ecdd648c39ccd4b61dc41382a73a Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Mon, 19 Jun 2023 19:43:12 +0300 Subject: [PATCH 71/72] fixed problems --- .../solve/catalogue/view/CatalogueView.kt | 47 ++++++++++++------- .../view/fields/CatalogueFieldsView.kt | 2 +- src/main/kotlin/solve/main/MainView.kt | 4 +- .../settings/grid/view/GridSettingsView.kt | 3 +- .../solve/styles/CatalogueViewStylesheet.kt | 2 +- .../solve/utils/MFXCheckListViewUtils.kt | 6 +++ 6 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt index df3ff5ec7..d92fff716 100644 --- a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt +++ b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt @@ -16,6 +16,7 @@ import javafx.scene.layout.CornerRadii import javafx.scene.layout.Priority import javafx.scene.layout.VBox import javafx.scene.paint.Color +import javafx.scene.paint.Paint import solve.catalogue.controller.CatalogueController import solve.catalogue.model.CatalogueField import solve.catalogue.model.ViewFormat @@ -23,7 +24,7 @@ import solve.catalogue.synchronizeListViewsSelections import solve.catalogue.view.fields.CatalogueFieldsView import solve.catalogue.view.fields.CatalogueFileNamesFieldsView import solve.catalogue.view.fields.CataloguePreviewImagesFieldsView -import solve.constants.IconsCataloguePlaceholder +import solve.constants.* import solve.filters.view.FilterPanelView import solve.project.model.ProjectFrame import solve.styles.CatalogueViewStylesheet @@ -105,31 +106,41 @@ class CatalogueView : View() { } private val placeholder = label("Project not imported") { + isWrapText = true tooltip(text) padding = Insets(400.0, 0.0, 350.0, 80.0) graphic = ImageView(cataloguePlaceholder) contentDisplay = ContentDisplay.TOP style = "-fx-font-family: ${Style.FontCondensed}; " + - "-fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" + "-fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" } - override val root = + override val root = vbox { + style { + backgroundColor += Paint.valueOf(Style.SurfaceColor) + } vbox { - style = "-fx-background-color: #${Style.SurfaceColor}" - add(placeholder) - fields.onChange { - this.clear() - if (fields.isEmpty()) { - this.add(placeholder) - } else { - this.add(catalogueNode) - initializeNodes() - this.add(filterPanelView) + vbox { + minWidth = CatalogueWidth + maxWidth = CatalogueWidth + add(placeholder) + fields.onChange { + this.clear() + if (fields.isEmpty()) { + this.add(placeholder) + } else { + this.add(catalogueNode) + initializeNodes() + this.add(filterPanelView) + } } } - - vgrow = Priority.ALWAYS + border = Border( + BorderStroke(Color.TRANSPARENT, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths.DEFAULT) + ) } + vgrow = Priority.ALWAYS + } init { accelerators[KeyCodeCombination(KeyCode.ENTER)] = { @@ -167,7 +178,7 @@ class CatalogueView : View() { private fun applySelection() { controller.visualizeFramesSelection( - displayingFieldsView?.selectedItems?.map { it.frame } ?: emptyList() + displayingFieldsView?.checkedItems?.map { it.frame } ?: emptyList() ) } @@ -204,4 +215,8 @@ class CatalogueView : View() { private fun resetNodes() { checkForEmptyFields() } + + companion object { + private const val CatalogueWidth = 350.0 + } } diff --git a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt index 9f7804c00..c766c5e1b 100644 --- a/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt +++ b/src/main/kotlin/solve/catalogue/view/fields/CatalogueFieldsView.kt @@ -64,7 +64,7 @@ abstract class CatalogueFieldsView : View() { get() = fieldsListView.checkedItemsCount == controller.model.frames.count() val isSelectionEmpty: Boolean get() = fieldsListView.checkedItems.isEmpty() - val selectedItems: List + val checkedItems: List get() = fieldsListView.checkedItems val checkedFrames: List get() = fieldsListView.checkedItems.map { it.frame } diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index 54dec7568..fe0d33362 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -84,8 +84,8 @@ class MainView : View() { val circle = Circle(this.layoutX + Style.FabRadius, this.layoutY + Style.FabRadius, Style.FabRadius) clip = circle graphic = ImageView(importIcon) - setPrefSize(56.0, 56.0) - style = "-fx-background-color: #${Style.SecondaryColor}; -fx-background-radius: 28;" + setPrefSize(54.0, 54.0) + style = "-fx-background-color: #${Style.SecondaryColor}; -fx-background-radius: 28; -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.2), 10, 0.5, 0.0, 10.0)" isFocusTraversable = false tooltip("Ctrl+I") action { diff --git a/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt b/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt index 2ce4ab2d9..c591f24cd 100644 --- a/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt +++ b/src/main/kotlin/solve/settings/grid/view/GridSettingsView.kt @@ -132,7 +132,8 @@ class GridSettingsView : View() { val scaleRangeSettingNode = stackpane { hbox { add(createHGrowHBox()) - settingFieldLabel() { + settingFieldLabel { + text = createIntegerRangeSliderRangeInfoString(rangeSlider) rangeSlider.lowValueProperty().onChange { text = createIntegerRangeSliderRangeInfoString(rangeSlider) } diff --git a/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt b/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt index bd30a9c0b..c94eb74b0 100644 --- a/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt +++ b/src/main/kotlin/solve/styles/CatalogueViewStylesheet.kt @@ -55,7 +55,7 @@ class CatalogueViewStylesheet : Stylesheet() { mfxRippleColor.value += SecondaryColor } } - and(selected) { + and(selected, indeterminate) { box { backgroundColor += SecondaryColor borderColor += box(SecondaryColor) diff --git a/src/main/kotlin/solve/utils/MFXCheckListViewUtils.kt b/src/main/kotlin/solve/utils/MFXCheckListViewUtils.kt index 481bca438..fab9a1981 100644 --- a/src/main/kotlin/solve/utils/MFXCheckListViewUtils.kt +++ b/src/main/kotlin/solve/utils/MFXCheckListViewUtils.kt @@ -1,6 +1,8 @@ package solve.utils import io.github.palexdev.materialfx.controls.MFXCheckListView +import javafx.beans.property.IntegerProperty +import javafx.beans.property.SimpleIntegerProperty fun MFXCheckListView.checkAllItems() = selectionModel.selectItems(items) @@ -11,3 +13,7 @@ val MFXCheckListView.checkedItems: List val MFXCheckListView.checkedItemsCount: Int get() = selectionModel.selectedValues.count() + +fun MFXCheckListView.itemsCountProperty(): IntegerProperty { + return SimpleIntegerProperty(checkedItemsCount) +} \ No newline at end of file From e45f8c21ac518c36ac01b7f65be9bb159774754f Mon Sep 17 00:00:00 2001 From: Anastasia-Nikitina Date: Mon, 19 Jun 2023 20:11:24 +0300 Subject: [PATCH 72/72] fixed linter warning --- src/main/kotlin/solve/catalogue/view/CatalogueView.kt | 4 ++-- src/main/kotlin/solve/main/MainView.kt | 3 ++- src/main/kotlin/solve/utils/MFXCheckListViewUtils.kt | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt index d92fff716..5cd926878 100644 --- a/src/main/kotlin/solve/catalogue/view/CatalogueView.kt +++ b/src/main/kotlin/solve/catalogue/view/CatalogueView.kt @@ -24,7 +24,7 @@ import solve.catalogue.synchronizeListViewsSelections import solve.catalogue.view.fields.CatalogueFieldsView import solve.catalogue.view.fields.CatalogueFileNamesFieldsView import solve.catalogue.view.fields.CataloguePreviewImagesFieldsView -import solve.constants.* +import solve.constants.IconsCataloguePlaceholder import solve.filters.view.FilterPanelView import solve.project.model.ProjectFrame import solve.styles.CatalogueViewStylesheet @@ -112,7 +112,7 @@ class CatalogueView : View() { graphic = ImageView(cataloguePlaceholder) contentDisplay = ContentDisplay.TOP style = "-fx-font-family: ${Style.FontCondensed}; " + - "-fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" + "-fx-font-size: 24px; -fx-text-fill: ${Style.PrimaryColorLight}" } override val root = vbox { diff --git a/src/main/kotlin/solve/main/MainView.kt b/src/main/kotlin/solve/main/MainView.kt index fe0d33362..63c86ea3a 100644 --- a/src/main/kotlin/solve/main/MainView.kt +++ b/src/main/kotlin/solve/main/MainView.kt @@ -85,7 +85,8 @@ class MainView : View() { clip = circle graphic = ImageView(importIcon) setPrefSize(54.0, 54.0) - style = "-fx-background-color: #${Style.SecondaryColor}; -fx-background-radius: 28; -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.2), 10, 0.5, 0.0, 10.0)" + style = "-fx-background-color: #${Style.SecondaryColor}; -fx-background-radius: 28; " + + "-fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.2), 10, 0.5, 0.0, 10.0)" isFocusTraversable = false tooltip("Ctrl+I") action { diff --git a/src/main/kotlin/solve/utils/MFXCheckListViewUtils.kt b/src/main/kotlin/solve/utils/MFXCheckListViewUtils.kt index fab9a1981..7999677a0 100644 --- a/src/main/kotlin/solve/utils/MFXCheckListViewUtils.kt +++ b/src/main/kotlin/solve/utils/MFXCheckListViewUtils.kt @@ -16,4 +16,4 @@ val MFXCheckListView.checkedItemsCount: Int fun MFXCheckListView.itemsCountProperty(): IntegerProperty { return SimpleIntegerProperty(checkedItemsCount) -} \ No newline at end of file +}