new layout
This commit is contained in:
parent
60e77cd611
commit
7e2bfdbc8d
87
src/main.c3
87
src/main.c3
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user