aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2025-02-28 14:01:48 -0500
committerSam Anthony <sam@samanthony.xyz>2025-02-28 14:01:48 -0500
commite0b42abda8d5d4e6e350ccd15618f7a2f1b14f6c (patch)
tree205e959d255101dae3f29218e32089b07a9fed89
parenta5e695b40492346c73b5fa88e2adcd414eb8a54c (diff)
downloadvolute-e0b42abda8d5d4e6e350ccd15618f7a2f1b14f6c.zip
dup/del buttons
-rw-r--r--main.c32
-rw-r--r--ui.c40
-rw-r--r--ui.h6
3 files changed, 73 insertions, 5 deletions
diff --git a/main.c b/main.c
index 7bf62c4..62ef596 100644
--- a/main.c
+++ b/main.c
@@ -6,6 +6,8 @@
#include "microui.h"
#include "renderer.h"
#include "widget.h"
+#include "unit.h"
+#include "engine.h"
#include "ui.h"
@@ -22,9 +24,9 @@ enum window {
};
enum layout {
- LABEL_WIDTH = 50,
- UNIT_WIDTH = 45,
- FIELD_WIDTH = 65,
+ LABEL_WIDTH = 48,
+ UNIT_WIDTH = 48,
+ FIELD_WIDTH = 64,
};
static const mu_Color BLACK = {0, 0, 0, 255};
@@ -58,6 +60,7 @@ static void displacement_row(mu_Context *ctx, UI *ui);
static void rpm_row(mu_Context *ctx, UI *ui);
static void map_row(mu_Context *ctx, UI *ui);
static void ve_row(mu_Context *ctx, UI *ui);
+static void dup_del_row(mu_Context *ctx, UI *ui);
/* Function Definitions. */
@@ -130,6 +133,7 @@ main_window(mu_Context *ctx, UI *ui) {
rpm_row(ctx, ui);
map_row(ctx, ui);
ve_row(ctx, ui);
+ dup_del_row(ctx, ui);
mu_end_window(ctx);
}
@@ -199,3 +203,25 @@ ve_row(mu_Context *ctx, UI *ui) {
}
}
}
+
+static void
+dup_del_row(mu_Context *ctx, UI *ui) {
+ int i;
+
+ mu_layout_row(ctx, 0, NULL, 0);
+ mu_layout_width(ctx, LABEL_WIDTH);
+ mu_label(ctx, "");
+ mu_layout_width(ctx, UNIT_WIDTH);
+ mu_label(ctx, "");
+ mu_layout_width(ctx, (FIELD_WIDTH - ctx->style->spacing)/2);
+ for (i = 0; i < ui->npoints; i++) {
+ mu_push_id(ctx, &i, sizeof(i));
+ if (mu_button(ctx, "Dup")) {
+ insert_point(ui, i);
+ }
+ if (mu_button(ctx, "Del")) {
+ remove_point(ui, i);
+ }
+ mu_pop_id(ctx);
+ }
+}
diff --git a/ui.c b/ui.c
index 3585230..52cca4c 100644
--- a/ui.c
+++ b/ui.c
@@ -1,5 +1,9 @@
+#include <string.h>
+
#include "microui.h"
#include "widget.h"
+#include "unit.h"
+#include "engine.h"
#include "ui.h"
@@ -14,6 +18,8 @@ void
init_ui(UI *ui) {
w_init_field(&ui->displacement);
w_init_select(&ui->displacement_unit, nelem(displacement_units), displacement_units);
+
+ui->npoints = 1;
w_init_field(&ui->rpm[0]);
@@ -22,5 +28,37 @@ init_ui(UI *ui) {
w_init_field(&ui->ve[0]);
- ui->npoints = 1;
+ init_engine(&ui->points[0]);
+}
+
+void
+insert_point(UI *ui, int idx) {
+ int i;
+
+ if (idx < 0 || idx >= ui->npoints || ui->npoints >= MAX_POINTS) {
+ return;
+ }
+
+ for (i = ui->npoints; i > idx; i--) {
+ memmove(&ui->rpm[i], &ui->rpm[i-1], sizeof(ui->rpm[i-1]));
+ memmove(&ui->map[i], &ui->map[i-1], sizeof(ui->map[i-1]));
+ memmove(&ui->ve[i], &ui->ve[i-1], sizeof(ui->ve[i-1]));
+ memmove(&ui->points[i], &ui->points[i-1], sizeof(ui->points[i-1]));
+ }
+ ui->npoints++;
+}
+
+void
+remove_point(UI *ui, int idx) {
+ if (idx < 0 || idx >= ui->npoints || ui->npoints <= 1) {
+ return;
+ }
+
+ for (; idx < ui->npoints-1; idx++) {
+ memmove(&ui->rpm[idx], &ui->rpm[idx+1], sizeof(ui->rpm[idx]));
+ memmove(&ui->map[idx], &ui->map[idx+1], sizeof(ui->map[idx]));
+ memmove(&ui->ve[idx], &ui->ve[idx+1], sizeof(ui->ve[idx]));
+ memmove(&ui->points[idx], &ui->points[idx+1], sizeof(ui->points[idx]));
+ }
+ ui->npoints--;
}
diff --git a/ui.h b/ui.h
index 232ef54..ac8b047 100644
--- a/ui.h
+++ b/ui.h
@@ -4,6 +4,8 @@ typedef struct {
w_Field displacement;
w_Select displacement_unit;
+ int npoints;
+
w_Field rpm[MAX_POINTS];
w_Field map[MAX_POINTS];
@@ -11,7 +13,9 @@ typedef struct {
w_Field ve[MAX_POINTS];
- int npoints;
+ Engine points[MAX_POINTS];
} UI;
void init_ui(UI *ui);
+void insert_point(UI *ui, int idx);
+void remove_point(UI *ui, int idx);