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 conf;
import vm;
import ugui;
import ugui::sdl::ren;
@ -21,13 +22,6 @@ const bool VSYNC = true;
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 ---------------------------------------------- //
ArenaAllocator arena;
char[] arena_mem = mem::new_array(char, 1024*1024);
@ -61,73 +55,54 @@ fn int main(String[] args)
ren::pre(ren.win);
// -------------------------------------------- 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)!!;
VMList vm_list;
vm_list.init(tmem);
io::printn("Configurations found:");
foreach (cf : conf_list) {
io::printn(cf);
vm_list.push(vm::new_from_path(tmem, cf.path))!!;
}
bool quit;
Clock sleep_clock;
while (!quit) {
while (!quit) @pool() {
sleep_clock.mark();
quit = ui.handle_events()!!;
vm_on = vm_proc.is_running()!!;
/* Start UI Handling */
ui.frame_begin()!!;
if (ui.check_key_combo(ugui::KMOD_CTRL, "q")) quit = true;
ui.@div(ugui::@grow(), ugui::@grow(), COLUMN) {
ui.@div(ugui::@grow(), ugui::@fit(20), ROW, LEFT) {
ui.text("Machine:")!!;
ui.separator(ugui::@grow(), ugui::@grow())!!;
ui.text(vm_name)!!;
static bool popup;
static Point popup_pos;
if (ui.button("v")!!.mouse_release) {
popup = true;
popup_pos = ui.input.mouse.pos;
}
ui.@popup(&popup, popup_pos, ugui::@fit(), ugui::@fit(), COLUMN) {
foreach (idx, c : conf_list) {
ui.text(c.name, idx)!!;
}
}!!;
}!!;
ui.hor_line()!!;
ui.@div(ugui::@grow(), ugui::@grow(), COLUMN, scroll_y: true) {
ui.text(string::tformat("disk: %s (%s)", vm_disk, vm_disk_size))!!;
ui.text(string::tformat("runner: %s", conf.get_string("qemu")))!!;
ui.text(string::tformat("memory: %s", conf.get_string("memory")))!!;
ui.text(string::tformat("processors: %s", conf.get_string("processors")))!!;
}!!;
ui.hor_line()!!;
ui.@div(ugui::@grow(), ugui::@fit(), ROW) {
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;
}
static usz which_vm = 0;
ui.@div(ugui::@grow(), ugui::@grow()) {
ui.@div(ugui::@fit((short)(ui.width*0.3)), ugui::@grow(), COLUMN, scroll_x: true, scroll_y: true) {
foreach_r (idx, &vm : vm_list) {
Id id = ui.@div(ugui::@grow(), ugui::@fit(50), ROW, LEFT, false,{},false,false, idx) {
ui.text(vm.name, idx)!!;
ui.separator(ugui::@grow(), ugui::@exact(1), idx)!!;
if (vm.is_running()) {
if (ui.button("stop", "", idx)!!.mouse_release) vm.stop()!!;
} else {
if (ui.button("STOP")!!.mouse_release) {
vm_proc.terminate()!!;
vm_on = false;
if (ui.button("start", "", idx)!!.mouse_release) vm.start()!!;
}
}!!;
ui.hor_line(idx)!!;
if (ui.focus_id == id) which_vm = idx;
}
}!!;
ui.ver_line()!!;
ui.@div(ugui::@grow(), ugui::@grow(), COLUMN, scroll_x: true, scroll_y: true) {
// TODO: implement a "selectable div" to display the information of the right vm
VirtualMachineDesc* vm = &vm_list[which_vm];
ui.text(string::tformat("Name: %s", vm.name))!!;
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.text(string::tformat("Memory: %s", vm.config.get_string("memory")))!!;
ui.text(string::tformat("Processors: %s", vm.config.get_string("processors")))!!;
}!!;
}!!;
ui.frame_end()!!;
@ -143,7 +118,7 @@ fn int main(String[] args)
int timeout = LIMIT_FPS ? (int)(100.0-sleep_clock.mark().to_ms()-0.5) : 0;
if (ui.skip_frame) timeout = 0;
ren::wait_events(timeout);
}
};
return 0;
}

View File

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