summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdrien Hopkins <ahopk127@my.yorku.ca>2021-12-15 17:52:43 -0500
committerAdrien Hopkins <ahopk127@my.yorku.ca>2021-12-16 10:02:10 -0500
commit4f754b0bc136b972607aa1b39f2358bd98dc4e1c (patch)
treec5c81ef152c011fec2c2f1d6b3c916c5cc6ca93e /src
parent9c30c3ad4d4658964e2bb2bb5be6c2eebbfbe8af (diff)
Designed the API for a new GUI
Currently "supports" unit conversion, expression conversion and settings loading
Diffstat (limited to 'src')
-rw-r--r--src/main/java/sevenUnits/newGUI/ExpressionConversionView.java48
-rw-r--r--src/main/java/sevenUnits/newGUI/Presenter.java97
-rw-r--r--src/main/java/sevenUnits/newGUI/UnitConversionView.java97
-rw-r--r--src/main/java/sevenUnits/newGUI/UserSettings.java27
-rw-r--r--src/main/java/sevenUnits/newGUI/View.java51
-rw-r--r--src/main/java/sevenUnits/newGUI/package-info.java23
-rw-r--r--src/main/java/sevenUnits/utils/NamedObjectProduct.java46
-rw-r--r--src/main/java/sevenUnits/utils/ObjectProduct.java15
8 files changed, 402 insertions, 2 deletions
diff --git a/src/main/java/sevenUnits/newGUI/ExpressionConversionView.java b/src/main/java/sevenUnits/newGUI/ExpressionConversionView.java
new file mode 100644
index 0000000..0f00090
--- /dev/null
+++ b/src/main/java/sevenUnits/newGUI/ExpressionConversionView.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright (C) 2021 Adrien Hopkins
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package sevenUnits.newGUI;
+
+/**
+ * A View that can convert unit expressions
+ *
+ * @author Adrien Hopkins
+ * @since 2021-12-15
+ */
+public interface ExpressionConversionView extends View {
+ /**
+ * @return unit expression to convert <em>from</em>
+ * @since 2021-12-15
+ */
+ String getFromExpression();
+
+ /**
+ * @return unit expression to convert <em>to</em>
+ * @since 2021-12-15
+ */
+ String getToExpression();
+
+ /**
+ * Shows the output of an expression conversion to the user.
+ *
+ * @param fromExpression expression converted from
+ * @param toExpression expression converted to
+ * @param value conversion factor between two expressions
+ * @since 2021-12-15
+ */
+ void showExpressionConversionOutput(String fromExpression,
+ String toExpression, double value);
+}
diff --git a/src/main/java/sevenUnits/newGUI/Presenter.java b/src/main/java/sevenUnits/newGUI/Presenter.java
new file mode 100644
index 0000000..6f7d34a
--- /dev/null
+++ b/src/main/java/sevenUnits/newGUI/Presenter.java
@@ -0,0 +1,97 @@
+/**
+ * Copyright (C) 2021 Adrien Hopkins
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package sevenUnits.newGUI;
+
+/**
+ * An object that handles interactions between the view and the backend code
+ *
+ * @author Adrien Hopkins
+ * @since 2021-12-15
+ */
+public final class Presenter {
+ /**
+ * The view that this presenter communicates with
+ */
+ private final View view;
+
+ /**
+ * Creates a Presenter
+ *
+ * @param view the view that this presenter communicates with
+ * @since 2021-12-15
+ */
+ public Presenter(View view) {
+ this.view = view;
+ }
+
+ /**
+ * Sets the dimension of the view's From and To units.
+ *
+ * @throws UnsupportedOperationException if the view does not support
+ * unit-based conversion (does not
+ * implement
+ * {@link UnitConversionView})
+ * @since 2021-12-15
+ */
+ public void applyDimensionFilter() {}
+
+ /**
+ * Gets settings from the view and applies them to both view and presenter.
+ *
+ * @since 2021-12-15
+ */
+ public void applySettings() {}
+
+ /**
+ * Converts from the view's input expression to its output expression.
+ * Displays an error message if any of the required fields are invalid.
+ *
+ * @throws UnsupportedOperationException if the view does not support
+ * expression-based conversion (does
+ * not implement
+ * {@link ExpressionConversionView})
+ * @since 2021-12-15
+ */
+ public void convertExpressions() {}
+
+ /**
+ * Converts from the view's input unit to its output unit. Displays an error
+ * message if any of the required fields are invalid.
+ *
+ * @throws UnsupportedOperationException if the view does not support
+ * unit-based conversion (does not
+ * implement
+ * {@link UnitConversionView})
+ * @since 2021-12-15
+ */
+ public void convertUnits() {}
+
+ /**
+ * Loads settings from the user's settings file and applies them to the view.
+ *
+ * @since 2021-12-15
+ */
+ public void loadSettings() {}
+
+ /**
+ * Gets user settings from the view then saves them to the user's settings
+ * file.
+ *
+ * @since 2021-12-15
+ */
+ public void saveSettings() {}
+}
diff --git a/src/main/java/sevenUnits/newGUI/UnitConversionView.java b/src/main/java/sevenUnits/newGUI/UnitConversionView.java
new file mode 100644
index 0000000..dafd461
--- /dev/null
+++ b/src/main/java/sevenUnits/newGUI/UnitConversionView.java
@@ -0,0 +1,97 @@
+/**
+ * Copyright (C) 2021 Adrien Hopkins
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package sevenUnits.newGUI;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.OptionalDouble;
+
+import sevenUnits.unit.BaseDimension;
+import sevenUnits.unit.Unit;
+import sevenUnits.unit.UnitValue;
+import sevenUnits.utils.NamedObjectProduct;
+import sevenUnits.utils.ObjectProduct;
+
+/**
+ * A View that supports single unit-based conversion
+ *
+ * @author Adrien Hopkins
+ * @since 2021-12-15
+ */
+public interface UnitConversionView extends View {
+ /**
+ * @return unit to convert <em>from</em>
+ * @since 2021-12-15
+ */
+ Optional<Unit> getFromSelection();
+
+ /**
+ * @return value to convert between the units
+ * @since 2021-12-15
+ */
+ OptionalDouble getInputValue();
+
+ /**
+ * @return selected dimension
+ * @since 2021-12-15
+ */
+ Optional<ObjectProduct<BaseDimension>> getSelectedDimension();
+
+ /**
+ * @return unit to convert <em>to</em>
+ * @since 2021-12-15
+ */
+ Optional<Unit> getToSelection();
+
+ /**
+ * Sets the available dimensions for filtering.
+ *
+ * @param dimensions dimensions to use
+ * @since 2021-12-15
+ */
+ void setDimensions(List<NamedObjectProduct<BaseDimension>> dimensions);
+
+ /**
+ * Sets the available units to convert from. {@link #getFromSelection} is not
+ * required to use one of these units; this method is to be used for views
+ * that allow the user to select units from a list.
+ *
+ * @param units units to convert from
+ * @since 2021-12-15
+ */
+ void setFromUnits(List<? extends Unit> units);
+
+ /**
+ * Sets the available units to convert to. {@link #getToSelection} is not
+ * required to use one of these units; this method is to be used for views
+ * that allow the user to select units from a list.
+ *
+ * @param units units to convert to
+ * @since 2021-12-15
+ */
+ void setToUnits(List<? extends Unit> units);
+
+ /**
+ * Shows the output of a unit conversion.
+ *
+ * @param input unit value before conversion, as obtained from the view
+ * @param output unit value after conversion
+ * @throws NullPointerException if either argument is null
+ * @since 2021-12-15
+ */
+ void showUnitConversionOutput(UnitValue input, UnitValue output);
+}
diff --git a/src/main/java/sevenUnits/newGUI/UserSettings.java b/src/main/java/sevenUnits/newGUI/UserSettings.java
new file mode 100644
index 0000000..207ef11
--- /dev/null
+++ b/src/main/java/sevenUnits/newGUI/UserSettings.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (C) 2021 Adrien Hopkins
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package sevenUnits.newGUI;
+
+/**
+ * An object containing all of the user settings for a 7Units session.
+ *
+ * @author Adrien Hopkins
+ * @since 2021-12-15
+ */
+public final class UserSettings {
+
+}
diff --git a/src/main/java/sevenUnits/newGUI/View.java b/src/main/java/sevenUnits/newGUI/View.java
new file mode 100644
index 0000000..8758a41
--- /dev/null
+++ b/src/main/java/sevenUnits/newGUI/View.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (C) 2021 Adrien Hopkins
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package sevenUnits.newGUI;
+
+/**
+ * An object that controls user interaction with 7Units
+ *
+ * @author Adrien Hopkins
+ * @since 2021-12-15
+ */
+public interface View {
+ /**
+ * @return settings user has set in the view
+ * @since 2021-12-15
+ */
+ UserSettings getUserSettings();
+
+ /**
+ * Sets the user settings on the settings page, if this view has one. Does
+ * not update settings internally; this is intended for loading settings from
+ * a file.
+ *
+ * @param settings settings to set
+ * @since 2021-12-15
+ */
+ void setUserSettings(UserSettings settings);
+
+ /**
+ * Shows an error message.
+ *
+ * @param title title of error message; on any view that uses an error
+ * dialog, this should be the title of the error dialog.
+ * @param message error message
+ * @since 2021-12-15
+ */
+ void showErrorMessage(String title, String message);
+}
diff --git a/src/main/java/sevenUnits/newGUI/package-info.java b/src/main/java/sevenUnits/newGUI/package-info.java
new file mode 100644
index 0000000..b58dccc
--- /dev/null
+++ b/src/main/java/sevenUnits/newGUI/package-info.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (C) 2021 Adrien Hopkins
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+/**
+ * The MVP GUI of SevenUnits
+ *
+ * @author Adrien Hopkins
+ * @since 2021-12-15
+ */
+package sevenUnits.newGUI; \ No newline at end of file
diff --git a/src/main/java/sevenUnits/utils/NamedObjectProduct.java b/src/main/java/sevenUnits/utils/NamedObjectProduct.java
new file mode 100644
index 0000000..514f0b1
--- /dev/null
+++ b/src/main/java/sevenUnits/utils/NamedObjectProduct.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (C) 2021 Adrien Hopkins
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package sevenUnits.utils;
+
+import java.util.Map;
+
+import sevenUnits.unit.NameSymbol;
+import sevenUnits.unit.Nameable;
+
+/**
+ * An ObjectProduct with name(s) and/or a symbol. Can be created with the
+ * {@link ObjectProduct#withName} method.
+ *
+ * @author Adrien Hopkins
+ * @since 2021-12-15
+ */
+public class NamedObjectProduct<T> extends ObjectProduct<T>
+ implements Nameable {
+ private final NameSymbol nameSymbol;
+
+ NamedObjectProduct(final Map<T, Integer> exponents,
+ final NameSymbol nameSymbol) {
+ super(exponents);
+ this.nameSymbol = nameSymbol;
+ }
+
+ @Override
+ public NameSymbol getNameSymbol() {
+ return this.nameSymbol;
+ }
+
+}
diff --git a/src/main/java/sevenUnits/utils/ObjectProduct.java b/src/main/java/sevenUnits/utils/ObjectProduct.java
index 5b1b739..d4f88b9 100644
--- a/src/main/java/sevenUnits/utils/ObjectProduct.java
+++ b/src/main/java/sevenUnits/utils/ObjectProduct.java
@@ -26,6 +26,8 @@ import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
+import sevenUnits.unit.NameSymbol;
+
/**
* An immutable product of multiple objects of a type, such as base units. The
* objects can be multiplied and exponentiated.
@@ -33,7 +35,7 @@ import java.util.function.Function;
* @author Adrien Hopkins
* @since 2019-10-16
*/
-public final class ObjectProduct<T> {
+public class ObjectProduct<T> {
/**
* Returns an empty ObjectProduct of a certain type
*
@@ -88,7 +90,7 @@ public final class ObjectProduct<T> {
* @param exponents objects that make up this product
* @since 2019-10-16
*/
- private ObjectProduct(final Map<T, Integer> exponents) {
+ ObjectProduct(final Map<T, Integer> exponents) {
this.exponents = Collections.unmodifiableMap(
ConditionalExistenceCollections.conditionalExistenceMap(exponents,
e -> !Integer.valueOf(0).equals(e.getValue())));
@@ -280,4 +282,13 @@ public final class ObjectProduct<T> {
return positiveString + negativeString;
}
+
+ /**
+ * @return named version of this {@code ObjectProduct}, using data from
+ * {@code nameSymbol}
+ * @since 2021-12-15
+ */
+ public NamedObjectProduct<T> withName(NameSymbol nameSymbol) {
+ return new NamedObjectProduct<>(this.exponents, nameSymbol);
+ }
}