mlx3ds/source/utilsconsole.cpp
Zy 13b93106ee part: implement some functions (windows & display)
part:
- remove mlx3ds_3dskey.h, instead use hid.h
- add definitions of:
  - mlx_init()
  - mlx_new_window()
  - mlx_clear_window()
  - mlx_destroy_window()
  - mlx_pixel_put()
  - mlx_new_image()
  - mlx_get_data_addr()
  - mlx_put_image_to_window()
  - mlx_destroy_image()

dev:
- Makefile: add rule check_headers
- Makefile: add variable FLAGS
    (call 'make rule FLAGS=flags'
	to add flags to compilation)
- add /dev/norm.sh: nicer norminette
- add tester in main(), and related utilsconsole.*

docs:
- make clear mlx_get_data_addr() docs
2024-10-06 16:53:59 +02:00

93 lines
No EOL
2.6 KiB
C++

/**
* utilsconsole.cpp
* by Zy
*/
#include "utilsconsole.hpp"
#include <3ds.h>
#include <iostream>
#include <stdarg.h>
int uc_menu(vector<s_uc_menu_element> &elements) {
static void *lastElements = NULL;
static size_t selected = 0;
bool confirmed = false;
if (&elements != lastElements) {
// init if new menu
consoleClear();
lastElements = &elements;
selected = 0;
}
else {
// read inputs
hidScanInput();
if (hidKeysDown() & KEY_UP) {
if (selected-- == 0)
selected += elements.size();
}
else if (hidKeysDown() & KEY_DOWN) {
if (++selected >= elements.size())
selected -= elements.size();
}
else if (!elements[selected].is_number_prompt) {
if (hidKeysDown() & KEY_A) {
confirmed = true;
lastElements = NULL;
}
}
else {
if (hidKeysDown() & KEY_LEFT)
if (*elements[selected].value > elements[selected].min)
(*elements[selected].value)--;
if (hidKeysDown() & KEY_RIGHT)
if (*elements[selected].value < elements[selected].max)
(*elements[selected].value)++;
}
}
// display
cout << "\e[H\e[0m";
for (size_t i = 0; i < elements.size(); i++) {
cout << (i == selected && !confirmed ? "\e[7m" : "")
<< elements[i].name << "\e[0m";
if (elements[i].is_number_prompt)
cout
<< ((*(elements[i].value) == elements[i].min) ? " " : " <")
<< *(elements[i].value)
<< ((*(elements[i].value) == elements[i].max) ? " " : ">");
cout << "\e[0K" << endl;
}
if (!confirmed)
cout << "\e[2m" << "[Up/Down] Move / "
<< (elements[selected].is_number_prompt ?
"[Left/Right] Modify" : "(A) Confirm") << "\e[0K" << endl;
else
cout << "\e[2mOK.\e[0K\e[0m" << endl;
return confirmed ? selected : -1;
}
int uc_menu_quick(const char *str, ...) {
va_list arguments;
auto elements = vector<s_uc_menu_element>();
for (va_start(arguments, str); str; str = va_arg(arguments, const char *))
elements.push_back({str, false, NULL, 0, 0});
int r = -1;
while (r < 0 && aptMainLoop())
r = uc_menu(elements);
return r;
}
void uc_pause(void) {
cout << "\e[0;2mPress (A) to continue...\e[0m" << endl;
while (aptMainLoop()) {
hidScanInput();
if (hidKeysDown() & KEY_A)
break;
gfxFlushBuffers();
}
}