diff options
| -rw-r--r-- | main.c | 32 | ||||
| -rw-r--r-- | ui.c | 40 | ||||
| -rw-r--r-- | ui.h | 6 |
3 files changed, 73 insertions, 5 deletions
@@ -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); + } +} @@ -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--; } @@ -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); |