aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main.c2
-rw-r--r--ui.c21
-rw-r--r--ui.h1
3 files changed, 23 insertions, 1 deletions
diff --git a/main.c b/main.c
index 7d593f1..fd31910 100644
--- a/main.c
+++ b/main.c
@@ -149,7 +149,7 @@ displacement_row(mu_Context *ctx, UI *ui) {
mu_layout_row(ctx, nelem(widths), widths, 0);
mu_label(ctx, "Displacement:");
if (w_field(ctx, &ui->displacement) & MU_RES_CHANGE) {
- /* TODO */
+ set_displacement(ui);
}
w_select(ctx, &ui->displacement_unit);
}
diff --git a/ui.c b/ui.c
index 5dc9021..f3e5c4a 100644
--- a/ui.c
+++ b/ui.c
@@ -1,3 +1,4 @@
+#include <assert.h>
#include <string.h>
#include "microui.h"
@@ -11,6 +12,10 @@
static const char *const displacement_units[] = {"cc", "l", "ci"};
+static Volume (*displacement_converters[nelem(displacement_units)])(double) = {
+ cubic_centimetre, litre, cubic_inch,
+};
+
static const char *const map_units[] = {"mbar", "kPa", "bar", "psi"};
@@ -32,6 +37,22 @@ init_ui(UI *ui) {
}
void
+set_displacement(UI *ui) {
+ int idx, i;
+ Volume (*convert)(double), disp;
+
+ idx = ui->displacement_unit.idx;
+ assert(idx >= 0 && (long unsigned int) idx < nelem(displacement_units));
+
+ convert = displacement_converters[idx];
+ disp = convert(ui->displacement.value);
+
+ for (i = 0; i < ui->npoints; i++) {
+ ui->points[i].displacement = disp;
+ }
+}
+
+void
insert_point(UI *ui, int idx) {
int i;
diff --git a/ui.h b/ui.h
index ac8b047..4d0a63a 100644
--- a/ui.h
+++ b/ui.h
@@ -17,5 +17,6 @@ typedef struct {
} UI;
void init_ui(UI *ui);
+void set_displacement(UI *ui);
void insert_point(UI *ui, int idx);
void remove_point(UI *ui, int idx);