diff --git a/core/src/net/sf/openrocket/rocketcomponent/RailButton.java b/core/src/net/sf/openrocket/rocketcomponent/RailButton.java index a9cc2cc60..fec977815 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RailButton.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RailButton.java @@ -126,7 +126,7 @@ public class RailButton extends ExternalComponent implements AnglePositionable, } this.baseHeight_m = Math.max(newBaseHeight, 0); - this.baseHeight_m = Math.min(this.baseHeight_m, this.totalHeight_m - this.flangeHeight_m); + this.baseHeight_m = Math.min(this.baseHeight_m, getMaxBaseHeight()); clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @@ -139,11 +139,36 @@ public class RailButton extends ExternalComponent implements AnglePositionable, } this.flangeHeight_m = Math.max(newFlangeHeight, 0); - this.flangeHeight_m = Math.min(this.flangeHeight_m, this.totalHeight_m - this.baseHeight_m); + this.flangeHeight_m = Math.min(this.flangeHeight_m, getMaxFlangeHeight()); clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } + public void setTotalHeight(double newHeight ) { + for (RocketComponent listener : configListeners) { + if (listener instanceof RailButton) { + ((RailButton) listener).setTotalHeight(newHeight); + } + } + + this.totalHeight_m = Math.max(newHeight, getMinTotalHeight()); + + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + public double getMaxBaseHeight() { + return this.totalHeight_m - this.flangeHeight_m; + } + + public double getMaxFlangeHeight() { + return this.totalHeight_m - this.baseHeight_m; + } + + public double getMinTotalHeight() { + return this.baseHeight_m + this.flangeHeight_m; + } + public void setScrewHeight(double height) { for (RocketComponent listener : configListeners) { if (listener instanceof RailButton) { diff --git a/swing/src/net/sf/openrocket/gui/adaptors/DoubleModel.java b/swing/src/net/sf/openrocket/gui/adaptors/DoubleModel.java index fa73b044f..55317c3b1 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/DoubleModel.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/DoubleModel.java @@ -220,6 +220,19 @@ public class DoubleModel implements StateChangeListener, ChangeSource, Invalidat quad2 = quad1 = quad0 = 0; // Not used } + + public ValueSliderModel(DoubleModel min, double max) { + this.islinear = true; + linearPosition = 1.0; + + this.min = min; + this.mid = new DoubleModel(max); // Never use exponential scale + this.max = new DoubleModel(max); + + min.addChangeListener(this); + + quad2 = quad1 = quad0 = 0; // Not used + } @@ -443,6 +456,10 @@ public class DoubleModel implements StateChangeListener, ChangeSource, Invalidat public BoundedRangeModel getSliderModel(double min, DoubleModel max) { return new ValueSliderModel(min, max); } + + public BoundedRangeModel getSliderModel(DoubleModel min, double max) { + return new ValueSliderModel(min, max); + } public BoundedRangeModel getSliderModel(double min, double mid, double max) { return new ValueSliderModel(min, mid, max); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java index 900b09496..7e3d317d0 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java @@ -55,7 +55,7 @@ public class RailButtonConfig extends RocketComponentConfig { panel.add(ODSpinner, "growx"); order.add(((SpinnerEditor) ODSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(ODModel), "growx"); - panel.add(new BasicSlider(ODModel.getSliderModel(0, 0.001, 0.02)), "w 100lp, wrap"); + panel.add(new BasicSlider(ODModel.getSliderModel(0, 0.02)), "w 100lp, wrap"); } { //// Inner Diameter panel.add(new JLabel(trans.get("RailBtnCfg.lbl.InnerDiam"))); @@ -65,7 +65,7 @@ public class RailButtonConfig extends RocketComponentConfig { panel.add(IDSpinner, "growx"); order.add(((SpinnerEditor) IDSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(IDModel), "growx"); - panel.add(new BasicSlider(IDModel.getSliderModel(0, 0.001, 0.02)), "w 100lp, wrap para"); + panel.add(new BasicSlider(IDModel.getSliderModel(0, 0.02)), "w 100lp, wrap para"); } { //// Base Height panel.add(new JLabel(trans.get("RailBtnCfg.lbl.BaseHeight"))); @@ -75,7 +75,8 @@ public class RailButtonConfig extends RocketComponentConfig { panel.add(heightSpinner, "growx"); order.add(((SpinnerEditor) heightSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(heightModel), "growx"); - panel.add(new BasicSlider(heightModel.getSliderModel(0, 0.001, 0.02)), "w 100lp, wrap"); + panel.add(new BasicSlider(heightModel.getSliderModel(0, new DoubleModel(component, "MaxBaseHeight", UnitGroup.UNITS_LENGTH))), + "w 100lp, wrap"); } { //// Flange Height panel.add(new JLabel(trans.get("RailBtnCfg.lbl.FlangeHeight"))); @@ -85,9 +86,10 @@ public class RailButtonConfig extends RocketComponentConfig { panel.add(heightSpinner, "growx"); order.add(((SpinnerEditor) heightSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(heightModel), "growx"); - panel.add(new BasicSlider(heightModel.getSliderModel(0, 0.001, 0.02)), "w 100lp, wrap"); + panel.add(new BasicSlider(heightModel.getSliderModel(0, new DoubleModel(component, "MaxFlangeHeight", UnitGroup.UNITS_LENGTH))), + "w 100lp, wrap"); } - { //// Height + { //// Total Height panel.add(new JLabel(trans.get("RailBtnCfg.lbl.TotalHeight"))); DoubleModel heightModel = new DoubleModel(component, "TotalHeight", UnitGroup.UNITS_LENGTH, 0); JSpinner heightSpinner = new JSpinner(heightModel.getSpinnerModel()); @@ -95,7 +97,8 @@ public class RailButtonConfig extends RocketComponentConfig { panel.add(heightSpinner, "growx"); order.add(((SpinnerEditor) heightSpinner.getEditor()).getTextField()); panel.add(new UnitSelector(heightModel), "growx"); - panel.add(new BasicSlider(heightModel.getSliderModel(0, 0.001, 0.02)), "w 100lp, wrap para"); + panel.add(new BasicSlider(heightModel.getSliderModel(new DoubleModel(component, "MinTotalHeight", UnitGroup.UNITS_LENGTH), 0.02)), + "w 100lp, wrap para"); } { //// Angular Position: