new layout

This commit is contained in:
Alessandro Mauri 2025-10-27 12:53:29 +01:00
parent 60e77cd611
commit 7e2bfdbc8d
2 changed files with 35 additions and 56 deletions

View File

@ -6,6 +6,7 @@ import std::encoding::json;
import std::time; import std::time;
import conf; import conf;
import vm;
import ugui; import ugui;
import ugui::sdl::ren; import ugui::sdl::ren;
@ -21,13 +22,6 @@ const bool VSYNC = true;
fn int main(String[] args) fn int main(String[] args)
{ {
String path = args[1];
File file = file::open(path, "r")!!;
// load configuration in memory as an object
Object* conf = json::parse(mem, &file)!!;
defer conf.free();
// ---------------------------------------------- UI initialization ---------------------------------------------- // // ---------------------------------------------- UI initialization ---------------------------------------------- //
ArenaAllocator arena; ArenaAllocator arena;
char[] arena_mem = mem::new_array(char, 1024*1024); char[] arena_mem = mem::new_array(char, 1024*1024);
@ -61,72 +55,53 @@ fn int main(String[] args)
ren::pre(ren.win); ren::pre(ren.win);
// -------------------------------------------- End UI initialization -------------------------------------------- // // -------------------------------------------- End UI initialization -------------------------------------------- //
StrList cmd = conf::get_qemu_cmdline(mem, conf)!!;
defer cmd.free();
String vm_name = conf.get_string("name")!!;
String vm_disk = conf.get_string("disk").to_expanded_path(tmem).str_view()!!;
String vm_disk_size = bytes_to_human_readable(tmem, file::get_size(vm_disk))!!;
bool vm_on = false;
SubProcess vm_proc;
defer (void)vm_proc.join();
ConfFList conf_list = conf::get_config_list(tmem)!!; ConfFList conf_list = conf::get_config_list(tmem)!!;
VMList vm_list;
vm_list.init(tmem);
io::printn("Configurations found:");
foreach (cf : conf_list) { foreach (cf : conf_list) {
io::printn(cf); io::printn(cf);
vm_list.push(vm::new_from_path(tmem, cf.path))!!;
} }
bool quit; bool quit;
Clock sleep_clock; Clock sleep_clock;
while (!quit) { while (!quit) @pool() {
sleep_clock.mark(); sleep_clock.mark();
quit = ui.handle_events()!!; quit = ui.handle_events()!!;
vm_on = vm_proc.is_running()!!;
/* Start UI Handling */ /* Start UI Handling */
ui.frame_begin()!!; ui.frame_begin()!!;
if (ui.check_key_combo(ugui::KMOD_CTRL, "q")) quit = true; if (ui.check_key_combo(ugui::KMOD_CTRL, "q")) quit = true;
ui.@div(ugui::@grow(), ugui::@grow(), COLUMN) { static usz which_vm = 0;
ui.@div(ugui::@grow(), ugui::@fit(20), ROW, LEFT) { ui.@div(ugui::@grow(), ugui::@grow()) {
ui.text("Machine:")!!; ui.@div(ugui::@fit((short)(ui.width*0.3)), ugui::@grow(), COLUMN, scroll_x: true, scroll_y: true) {
ui.separator(ugui::@grow(), ugui::@grow())!!; foreach_r (idx, &vm : vm_list) {
ui.text(vm_name)!!; Id id = ui.@div(ugui::@grow(), ugui::@fit(50), ROW, LEFT, false,{},false,false, idx) {
ui.text(vm.name, idx)!!;
static bool popup; ui.separator(ugui::@grow(), ugui::@exact(1), idx)!!;
static Point popup_pos; if (vm.is_running()) {
if (ui.button("v")!!.mouse_release) { if (ui.button("stop", "", idx)!!.mouse_release) vm.stop()!!;
popup = true; } else {
popup_pos = ui.input.mouse.pos; if (ui.button("start", "", idx)!!.mouse_release) vm.start()!!;
}
}!!;
ui.hor_line(idx)!!;
if (ui.focus_id == id) which_vm = idx;
} }
ui.@popup(&popup, popup_pos, ugui::@fit(), ugui::@fit(), COLUMN) {
foreach (idx, c : conf_list) {
ui.text(c.name, idx)!!;
}
}!!;
}!!; }!!;
ui.hor_line()!!; ui.ver_line()!!;
ui.@div(ugui::@grow(), ugui::@grow(), COLUMN, scroll_y: true) { ui.@div(ugui::@grow(), ugui::@grow(), COLUMN, scroll_x: true, scroll_y: true) {
ui.text(string::tformat("disk: %s (%s)", vm_disk, vm_disk_size))!!; // TODO: implement a "selectable div" to display the information of the right vm
ui.text(string::tformat("runner: %s", conf.get_string("qemu")))!!; VirtualMachineDesc* vm = &vm_list[which_vm];
ui.text(string::tformat("memory: %s", conf.get_string("memory")))!!; ui.text(string::tformat("Name: %s", vm.name))!!;
ui.text(string::tformat("processors: %s", conf.get_string("processors")))!!; ui.text(string::tformat("Disk: %s (%s)", vm.disk_path.str_view(), bytes_to_human_readable(tmem, file::get_size(vm.disk_path.str_view()))))!!;
}!!; ui.text(string::tformat("Runner: %s", vm.config.get_string("qemu")))!!;
ui.hor_line()!!; ui.text(string::tformat("Memory: %s", vm.config.get_string("memory")))!!;
ui.@div(ugui::@grow(), ugui::@fit(), ROW) { ui.text(string::tformat("Processors: %s", vm.config.get_string("processors")))!!;
if (!vm_on) {
if (ui.button("START")!!.mouse_release) {
vm_proc = process::create(cmd.array_view(), {.inherit_stdio=true, .inherit_environment=true})!!;
vm_on = true;
}
} else {
if (ui.button("STOP")!!.mouse_release) {
vm_proc.terminate()!!;
vm_on = false;
}
}
}!!; }!!;
}!!; }!!;
@ -143,7 +118,7 @@ fn int main(String[] args)
int timeout = LIMIT_FPS ? (int)(100.0-sleep_clock.mark().to_ms()-0.5) : 0; int timeout = LIMIT_FPS ? (int)(100.0-sleep_clock.mark().to_ms()-0.5) : 0;
if (ui.skip_frame) timeout = 0; if (ui.skip_frame) timeout = 0;
ren::wait_events(timeout); ren::wait_events(timeout);
} };
return 0; return 0;
} }

View File

@ -4,6 +4,7 @@ import std::io::file;
import std::os::process; import std::os::process;
import std::collections::object; import std::collections::object;
import std::encoding::json; import std::encoding::json;
import std::collections::list;
import conf; import conf;
@ -17,6 +18,9 @@ struct VirtualMachineDesc {
} }
alias VMList = list::List{VirtualMachineDesc};
fn VirtualMachineDesc? new_from_path(Allocator allocator, Path path) fn VirtualMachineDesc? new_from_path(Allocator allocator, Path path)
{ {
VirtualMachineDesc desc; VirtualMachineDesc desc;