From 0bdc4110ac010685ee3e81552041bc553d848294 Mon Sep 17 00:00:00 2001 From: Samuel Fadel Date: Mon, 4 Apr 2016 17:16:08 -0300 Subject: LinePlot: working properly (and updates settings). Added the several options to the bundling (from CUBu) as properties of the LinePlot component, which are set from the options UI. In addition, many changes to the UI regarding those options. Added a new shortcut to hide options (for cleaner demos). --- main_view.qml | 627 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 420 insertions(+), 207 deletions(-) (limited to 'main_view.qml') diff --git a/main_view.qml b/main_view.qml index bce7005..60a85aa 100644 --- a/main_view.qml +++ b/main_view.qml @@ -14,9 +14,6 @@ ApplicationWindow { Component.onCompleted: { setX(Screen.width / 2 - width / 2); setY(Screen.height / 2 - height / 2); - - this.minimumWidth = width; - this.minimumHeight = height; } menuBar: MenuBar { @@ -38,6 +35,11 @@ ApplicationWindow { MenuItem { action: selectRPsAction } MenuItem { action: selectCPsAction } } + + Menu { + title: "View" + MenuItem { action: toggleOptionsAction } + } } statusBar: StatusBar { @@ -78,28 +80,28 @@ ApplicationWindow { anchors.fill: parent } - Scatterplot { - id: rpPlot - objectName: "rpPlot" + LinePlot { + id: bundlePlot + objectName: "bundlePlot" x: parent.x y: parent.y z: 1 anchors.fill: parent - glyphSize: 3.0 } Scatterplot { - id: cpPlot - objectName: "cpPlot" + id: rpPlot + objectName: "rpPlot" x: parent.x y: parent.y z: 2 anchors.fill: parent + glyphSize: 3.0 } - LinePlot { - id: linePlot - objectName: "linePlot" + Scatterplot { + id: cpPlot + objectName: "cpPlot" x: parent.x y: parent.y z: 3 @@ -237,234 +239,434 @@ ApplicationWindow { } // Options panel - ColumnLayout { - Layout.alignment: Qt.AlignTop | Qt.AlignLeft - - GroupBox { - Layout.fillWidth: true - title: "Control points" - checkable: true - __checkbox.onClicked: { - cpPlot.visible = this.checked; - - if (this.checked) { - cpPlot.z = 0; - rpPlot.z = 0; - } else { - cpPlot.z = 0; - rpPlot.z = 1; - } - } - - ColumnLayout { - GroupBox { - flat: true - title: "Colors" - - GridLayout { - columns: 2 + RowLayout { + id: optionsPanel - Label { text: "Map to:" } - ComboBox { - id: cpPlotMetricComboBox - model: metricsModel - } + ColumnLayout { + Layout.alignment: Qt.AlignTop | Qt.AlignLeft - Label { text: "Color map:" } - ComboBox { - id: cpPlotColormapCombo - model: colormapModel - onActivated: - Main.setCPColorScale(model.get(index).value); - } + GroupBox { + Layout.fillWidth: true + title: "Control points" + checkable: true + __checkbox.onClicked: { + cpPlot.visible = this.checked; + + if (this.checked) { + cpPlot.z = 0; + rpPlot.z = 0; + } else { + cpPlot.z = 0; + rpPlot.z = 1; } } - GroupBox { - flat: true - title: "Glyphs" - - GridLayout { - columns: 2 - - Label { text: "Size:" } - SpinBox { - id: cpGlyphSizeSpinBox - maximumValue: 100 - minimumValue: 6 - decimals: 1 - stepSize: 1 - value: cpPlot.glyphSize - onValueChanged: cpPlot.glyphSize = this.value + ColumnLayout { + GroupBox { + flat: true + title: "Colors" + + GridLayout { + columns: 2 + + Label { text: "Map to:" } + ComboBox { + id: cpPlotMetricComboBox + model: metricsModel + } + + Label { text: "Color map:" } + ComboBox { + id: cpPlotColormapCombo + model: colormapModel + onActivated: + Main.setCPColorScale(model.get(index).value); + } } + } - Label { text: "Opacity:" } - Slider { - id: cpPlotOpacitySlider - tickmarksEnabled: true - stepSize: 0.1 - maximumValue: 1 - minimumValue: 0 - value: cpPlot.opacity - onValueChanged: cpPlot.opacity = this.value + GroupBox { + flat: true + title: "Glyphs" + + GridLayout { + columns: 2 + + Label { text: "Size:" } + SpinBox { + id: cpGlyphSizeSpinBox + maximumValue: 100 + minimumValue: 6 + decimals: 1 + stepSize: 1 + value: cpPlot.glyphSize + onValueChanged: cpPlot.glyphSize = this.value + } + + Label { text: "Opacity:" } + Slider { + id: cpPlotOpacitySlider + tickmarksEnabled: true + stepSize: 0.1 + maximumValue: 1 + minimumValue: 0 + value: cpPlot.opacity + onValueChanged: cpPlot.opacity = this.value + } } } } } - } - - GroupBox { - Layout.fillWidth: true - title: "Regular points" - checked: true - checkable: true - __checkbox.onClicked: { - rpPlot.visible = this.checked; - splat.visible = this.checked; - } - - ColumnLayout { - GroupBox { - flat: true - title: "Colors" - - GridLayout { - columns: 2 - Label { text: "Map to:" } - ComboBox { - id: rpPlotMetricComboBox - model: metricsModel - } - - Label { text: "Color map:" } - ComboBox { - id: rpPlotColormapCombo - model: colormapModel - onActivated: - Main.setRPColorScale(model.get(index).value); - } - } + GroupBox { + Layout.fillWidth: true + title: "Regular points" + checked: true + checkable: true + __checkbox.onClicked: { + rpPlot.visible = this.checked; + splat.visible = this.checked; } - GroupBox { - flat: true - title: "Splat" - - GridLayout { - columns: 2 - - Label { text: "Blur (α):" } - SpinBox { - id: alphaSpinBox - maximumValue: 100 - minimumValue: 1 - value: splat.alpha - decimals: 2 - stepSize: 1 - onValueChanged: splat.alpha = this.value + ColumnLayout { + GroupBox { + flat: true + title: "Colors" + + GridLayout { + columns: 2 + + Label { text: "Map to:" } + ComboBox { + id: rpPlotMetricComboBox + model: metricsModel + } + + Label { text: "Color map:" } + ComboBox { + id: rpPlotColormapCombo + model: colormapModel + onActivated: + Main.setRPColorScale(model.get(index).value); + } } + } - Label { text: "Radius (β):" } - SpinBox { - id: betaSpinBox - maximumValue: 100 - minimumValue: 1 - value: splat.beta - decimals: 2 - stepSize: 1 - onValueChanged: splat.beta = this.value + GroupBox { + flat: true + title: "Splat" + + GridLayout { + columns: 2 + + Label { text: "Blur (α):" } + SpinBox { + id: alphaSpinBox + maximumValue: 100 + minimumValue: 1 + value: splat.alpha + decimals: 2 + stepSize: 1 + onValueChanged: splat.alpha = this.value + } + + Label { text: "Radius (β):" } + SpinBox { + id: betaSpinBox + maximumValue: 100 + minimumValue: 1 + value: splat.beta + decimals: 2 + stepSize: 1 + onValueChanged: splat.beta = this.value + } + + Label { text: "Opacity:" } + Slider { + id: splatOpacitySlider + tickmarksEnabled: true + stepSize: 0.1 + maximumValue: 1 + minimumValue: 0 + value: splat.opacity + onValueChanged: splat.opacity = this.value + } } + } - Label { text: "Opacity:" } - Slider { - id: splatOpacitySlider - tickmarksEnabled: true - stepSize: 0.1 - maximumValue: 1 - minimumValue: 0 - value: splat.opacity - onValueChanged: splat.opacity = this.value + GroupBox { + flat: true + title: "Glyphs" + + GridLayout { + columns: 2 + + Label { text: "Size:" } + SpinBox { + id: rpGlyphSizeSpinBox + maximumValue: 100 + minimumValue: 2 + decimals: 1 + stepSize: 1 + value: rpPlot.glyphSize + onValueChanged: rpPlot.glyphSize = this.value + } + + Label { text: "Opacity:" } + Slider { + id: rpPlotOpacitySlider + tickmarksEnabled: true + stepSize: 0.1 + maximumValue: 1 + minimumValue: 0 + value: rpPlot.opacity + onValueChanged: rpPlot.opacity = this.value + } } } } + } - GroupBox { - flat: true - title: "Glyphs" - - GridLayout { - columns: 2 - - Label { text: "Size:" } - SpinBox { - id: rpGlyphSizeSpinBox - maximumValue: 100 - minimumValue: 2 - decimals: 1 - stepSize: 1 - value: rpPlot.glyphSize - onValueChanged: rpPlot.glyphSize = this.value + GroupBox { + Layout.fillWidth: true + id: metricsGroupBox + title: "Projection metrics" + property RadioButton current: currentMetricRadioButton + + Column { + ExclusiveGroup { id: wrtMetricsGroup } + + RadioButton { + id: currentMetricRadioButton + text: "Current" + exclusiveGroup: wrtMetricsGroup + checked: true + onClicked: { + if (!Main.setObserverType(Main.ObserverCurrent)) { + metricsGroupBox.current.checked = true; + } else { + metricsGroupBox.current = this; + } } - - Label { text: "Opacity:" } - Slider { - id: rpPlotOpacitySlider - tickmarksEnabled: true - stepSize: 0.1 - maximumValue: 1 - minimumValue: 0 - value: rpPlot.opacity - onValueChanged: rpPlot.opacity = this.value + } + RadioButton { + id: diffPreviousMetricRadioButton + text: "Diff. to previous" + exclusiveGroup: wrtMetricsGroup + onClicked: { + if (!Main.setObserverType(Main.ObserverDiffPrevious)) { + metricsGroupBox.current.checked = true; + } else { + metricsGroupBox.current = this; + } + } + } + RadioButton { + id: diffFirstMetricRadioButton + text: "Diff. to first" + exclusiveGroup: wrtMetricsGroup + onClicked: { + if (!Main.setObserverType(Main.ObserverDiffFirst)) { + metricsGroupBox.current.checked = true; + } else { + metricsGroupBox.current = this; + } } } } } } - GroupBox { - Layout.fillWidth: true - id: metricsGroupBox - title: "Projection metrics" - property RadioButton current: currentMetricRadioButton - - Column { - ExclusiveGroup { id: wrtMetricsGroup } - - RadioButton { - id: currentMetricRadioButton - text: "Current" - exclusiveGroup: wrtMetricsGroup - checked: true - onClicked: { - if (!Main.setObserverType(Main.ObserverCurrent)) { - metricsGroupBox.current.checked = true; - } else { - metricsGroupBox.current = this; + ColumnLayout { + Layout.alignment: Qt.AlignTop | Qt.AlignLeft + + GroupBox { + Layout.fillWidth: true + id: bundlingGroupBox + title: "Bundling" + checked: true + checkable: true + __checkbox.onClicked: { + bundlePlot.visible = this.checked; + } + + ColumnLayout { + GroupBox { + flat: true + title: "Main bundling" + + GridLayout { + columns: 2 + + Label { text: "Iterations:" } + SpinBox { + maximumValue: 100 + minimumValue: 0 + decimals: 0 + stepSize: 1 + value: bundlePlot.iterations + onValueChanged: bundlePlot.iterations = this.value + } + + Label { text: "Kernel size:" } + SpinBox { + maximumValue: 100 + minimumValue: 3 + decimals: 1 + stepSize: 1 + value: bundlePlot.kernelSize + onValueChanged: bundlePlot.kernelSize = this.value + } + + Label { text: "Smoothing factor:" } + Slider { + tickmarksEnabled: true + stepSize: 0.1 + maximumValue: 1 + minimumValue: 0 + value: bundlePlot.smoothingFactor + onValueChanged: bundlePlot.smoothingFactor = this.value + } + + Label { text: "Smoothing iterations:" } + SpinBox { + maximumValue: 100 + minimumValue: 0 + decimals: 0 + stepSize: 1 + value: bundlePlot.smoothingIterations + onValueChanged: bundlePlot.smoothingIterations = this.value + } } } - } - RadioButton { - id: diffPreviousMetricRadioButton - text: "Diff. to previous" - exclusiveGroup: wrtMetricsGroup - onClicked: { - if (!Main.setObserverType(Main.ObserverDiffPrevious)) { - metricsGroupBox.current.checked = true; - } else { - metricsGroupBox.current = this; + + GroupBox { + flat: true + title: "Ends bundling" + + GridLayout { + columns: 2 + + CheckBox { + Layout.columnSpan: 2 + text: "Block endpoints" + checked: bundlePlot.blockEndpoints + onClicked: bundlePlot.blockEndpoints = this.checked + } + + Label { text: "Iterations:" } + SpinBox { + maximumValue: 100 + minimumValue: 0 + decimals: 0 + stepSize: 1 + value: bundlePlot.endsIterations + onValueChanged: bundlePlot.endsIterations = this.value + } + + Label { text: "Kernel size:" } + SpinBox { + maximumValue: 100 + minimumValue: 3 + decimals: 1 + stepSize: 1 + value: bundlePlot.endsKernelSize + onValueChanged: bundlePlot.endsKernelSize = this.value + } + + Label { text: "Smoothing factor:" } + Slider { + tickmarksEnabled: true + stepSize: 0.1 + maximumValue: 1 + minimumValue: 0 + value: bundlePlot.endsSmoothingFactor + onValueChanged: bundlePlot.endsSmoothingFactor = this.value + } } } - } - RadioButton { - id: diffFirstMetricRadioButton - text: "Diff. to first" - exclusiveGroup: wrtMetricsGroup - onClicked: { - if (!Main.setObserverType(Main.ObserverDiffFirst)) { - metricsGroupBox.current.checked = true; - } else { - metricsGroupBox.current = this; + + GroupBox { + flat: true + title: "General" + + GridLayout { + columns: 2 + + Label { text: "Opacity:" } + Slider { + tickmarksEnabled: true + stepSize: 0.1 + maximumValue: 1 + minimumValue: 0 + value: bundlePlot.opacity + onValueChanged: bundlePlot.opacity = this.value + } + + Label { text: "Edge sampling:" } + SpinBox { + maximumValue: 100 + minimumValue: 3 + decimals: 1 + stepSize: 1 + value: bundlePlot.edgeSampling + onValueChanged: bundlePlot.edgeSampling = this.value + } + + Label { text: "Advection speed:" } + Slider { + tickmarksEnabled: true + stepSize: 0.1 + maximumValue: 1 + minimumValue: 0 + value: bundlePlot.advectionSpeed + onValueChanged: bundlePlot.advectionSpeed = this.value + } + + Label { text: "Density estimation:" } + RowLayout { + ExclusiveGroup { id: densityEstimationGroup } + RadioButton { + text: "Exact" + exclusiveGroup: densityEstimationGroup + } + RadioButton { + text: "Fast" + exclusiveGroup: densityEstimationGroup + checked: true + } + } + + Label { text: "Bundle shape:" } + RowLayout { + ExclusiveGroup { id: bundleShapeGroup } + RadioButton { + text: "FDEB" + exclusiveGroup: bundleShapeGroup + checked: true + } + RadioButton { + text: "HEB" + exclusiveGroup: bundleShapeGroup + } + } + + Label { text: "Relaxation:" } + Slider { + tickmarksEnabled: true + stepSize: 0.1 + maximumValue: 1 + minimumValue: 0 + value: bundlePlot.relaxation + onValueChanged: bundlePlot.relaxation = this.value + } + + CheckBox { + Layout.columnSpan: 2 + text: "Use GPU" + checked: bundlePlot.bundleGPU + onClicked: bundlePlot.bundleGPU = this.checked + } } } } @@ -561,6 +763,17 @@ ApplicationWindow { } } + Action { + id: toggleOptionsAction + text: "&Options" + shortcut: "Ctrl+O" + checkable: true + checked: true + onToggled: { + optionsPanel.visible = this.checked; + } + } + Action { id: selectCPsAction text: "&Control points" -- cgit v1.2.3