#include "../muscles.h" #include "../ui.h" #include "dialog.h" void Main_Menu::update_ui(Camera& view) { if (sources_view.sel_row >= 0) { button.set_active(true); auto str = (std::string*)sources_view.data->columns[2][sources_view.sel_row]; view_dd.content[0] = (char*)str->c_str(); } else { button.set_active(false); view_dd.content[0] = (char*)""; } float x = border; float y = border; float dd_x = x; sources_dd.pos = { dd_x, y, 80, 25 }; dd_x += sources_dd.pos.w; edit_dd.pos = { dd_x, y, 56, 25 }; dd_x += edit_dd.pos.w; view_dd.pos = { dd_x, y, 56, 25 }; dd_x += view_dd.pos.w; search_dd.pos = { dd_x, y, 72, 25 }; y += sources_dd.pos.h + border; float view_w = button.width; float view_h = button.height; button.pos = { box.w - border - view_w, box.h - border - view_h, view_w, view_h }; y += 10; sources_view.pos = { x, y, box.w - 2*x, box.h - y - 2*border - view_h }; } void Main_Menu::refresh(Point *cursor) { auto& sources = (std::vector&)parent->sources; int n_sources = sources.size(); sources_view.data->resize(n_sources); if (!n_sources) return; auto& icons = sources_view.data->columns[0]; auto& pids = (std::vector&)sources_view.data->columns[1]; auto& names = (std::vector&)sources_view.data->columns[2]; for (int i = 0; i < n_sources; i++) { if (sources[i]->type == SourceProcess) { icons[i] = process_icon; write_dec(pids[i], sources[i]->pid); } else if (sources[i]->type == SourceFile) { icons[i] = file_icon; strcpy(pids[i], "---"); } else { icons[i] = nullptr; pids[i][0] = 0; } names[i] = &sources[i]->name; } } static void open_process_handler(Box *box, int pid, std::string& name) { auto ui = dynamic_cast(box); auto ws = box->parent; for (auto& s : ws->sources) { if (s->type == SourceProcess && s->pid == pid) return; } Source *s = new Source(); s->type = SourceProcess; s->pid = pid; s->name = name; s->refresh_span_rate = 1; ws->sources.push_back(s); ui->sources_view.sel_row = ws->sources.size() - 1; ui->require_redraw(); } static void open_file_handler(Box *box, std::string& path, File_Entry *file) { auto ui = dynamic_cast(box); auto ws = box->parent; const char *path_str = path.c_str(); for (auto& s : ws->sources) { if (s->type == SourceFile && !strcmp(path_str, (const char*)s->identifier)) return; } Source *s = new Source(); s->type = SourceFile; s->identifier = (void*)get_default_arena().alloc_string((char*)path_str); s->name = file->name; s->refresh_span_rate = 1; ws->sources.push_back(s); ui->sources_view.sel_row = ws->sources.size() - 1; ui->require_redraw(); } void sources_main_menu_handler(UI_Element *elem, Camera& view, bool dbl_click) { auto dd = dynamic_cast(elem); if (dd->hl < 0) return; if (dd->hl == 0 || dd->hl == 1) { Workspace *ws = dd->parent->parent; MenuType type = dd->hl == 0 ? MenuFile : MenuProcess; auto sm = ws->make_box(type); sm->caller = dd->parent; sm->open_file_handler = open_file_handler; sm->open_process_handler = open_process_handler; } } void search_main_menu_handler(UI_Element *elem, Camera& view, bool dbl_click) { auto dd = dynamic_cast(elem); if (dd->hl < 0 || dd->hl > 1) return; Workspace *ws = dd->parent->parent; ws->make_box(dd->hl == 0 ? MenuValue : MenuObject); } void edit_main_menu_handler(UI_Element *elem, Camera& view, bool dbl_click) { auto dd = dynamic_cast(elem); if (dd->hl < 0 || dd->hl > 2) return; auto ui = (Main_Menu*)dd->parent; Workspace *ws = dd->parent->parent; if (dd->hl == 0) ws->make_box(); else if (dd->hl == 1) ws->make_box(); else if (dd->hl == 2) ws->make_box(); } void view_main_menu_handler(UI_Element *elem, Camera& view, bool dbl_click) { auto dd = dynamic_cast(elem); if (dd->hl < 0) return; auto ui = (Main_Menu*)dd->parent; Workspace *ws = dd->parent->parent; if (dd->hl == 0) { int idx = ui->sources_view.sel_row; if (idx >= 0) ws->view_source_at(ws->sources[idx]); } } void table_main_menu_handler(UI_Element *elem, Camera& view, bool dbl_click) { auto table = dynamic_cast(elem); if (dbl_click) { if (table->sel_row >= 0) { Workspace *ws = elem->parent->parent; ws->view_source_at(ws->sources[table->sel_row]); } } else table->sel_row = table->hl_row; } void Main_Menu::handle_zoom(Workspace& ws, float new_scale) { sdl_destroy_texture(&file_icon); sdl_destroy_texture(&process_icon); float h = sources_view.font->render.text_height(); file_icon = make_file_icon(file_back, file_fold, file_line, h, h); process_icon = make_process_icon(process_back, process_outline, h); int n_rows = sources_view.data->row_count(); auto& icons = (std::vector&)sources_view.data->columns[0]; for (int i = 0; i < n_rows; i++) { SourceType type = ((Source*)ws.sources[i])->type; if (type == SourceFile) icons[i] = file_icon; else if (type == SourceProcess) icons[i] = process_icon; } } Main_Menu::Main_Menu(Workspace& ws, MenuType mtype) { process_back = ws.colors.process_back; process_outline = ws.colors.process_outline; file_back = ws.colors.file_back; file_fold = ws.colors.file_fold; file_line = ws.colors.file_line; float scale = get_default_camera().scale; sources_dd.title = "Sources"; sources_dd.font = ws.make_font(11, ws.colors.text, scale); sources_dd.action = sources_main_menu_handler; sources_dd.default_color = ws.colors.back; sources_dd.hl_color = ws.colors.hl; sources_dd.sel_color = ws.colors.active; sources_dd.width = 150; sources_dd.content = { (char*)"Add File", (char*)"Add Process" }; edit_dd.title = "Edit"; edit_dd.font = sources_dd.font; edit_dd.action = edit_main_menu_handler; edit_dd.default_color = ws.colors.back; edit_dd.hl_color = ws.colors.hl; edit_dd.sel_color = ws.colors.active; edit_dd.width = 150; edit_dd.content = { (char*)"New Object", (char*)"Structs", (char*)"Definitions", (char*)"Mappings" }; view_dd.title = "View"; view_dd.font = sources_dd.font; view_dd.action = view_main_menu_handler; view_dd.default_color = ws.colors.back; view_dd.hl_color = ws.colors.hl; view_dd.sel_color = ws.colors.active; view_dd.width = 140; view_dd.content = { (char*)"" }; search_dd.title = "Search"; search_dd.font = sources_dd.font; search_dd.action = search_main_menu_handler; search_dd.default_color = ws.colors.back; search_dd.hl_color = ws.colors.hl; search_dd.sel_color = ws.colors.active; search_dd.width = 150; search_dd.content = { (char*)"Single Value", (char*)"Object" }; sources_view.show_column_names = true; sources_view.action = table_main_menu_handler; sources_view.font = ws.default_font; sources_view.default_color = ws.colors.dark; sources_view.hl_color = ws.colors.hl; sources_view.sel_color = ws.colors.light; sources_view.back_color = ws.colors.back; Column sources_cols[] = { {ColumnImage, 0, 0.1, 0, 1.2, ""}, {ColumnString, 16, 0.2, 0, 3, "PID"}, {ColumnStdString, 0, 0.7, 0, 0, "Name"}, }; table.init(sources_cols, nullptr, nullptr, nullptr, 3, 0); sources_view.data = &table; button.action = [](UI_Element* elem, Camera&, bool dbl_click) { Data_View *view = &dynamic_cast(elem->parent)->sources_view; if (view->sel_row >= 0) { Workspace *ws = elem->parent->parent; ws->view_source_at(ws->sources[view->sel_row]); } }; button.active_theme = { ws.colors.light, ws.colors.light, ws.colors.hl, ws.make_font(11, ws.colors.text, scale) }; button.inactive_theme = { ws.colors.inactive, ws.colors.inactive, ws.colors.inactive, ws.make_font(11, ws.colors.inactive_text, scale) }; button.text = "View"; button.active = false; button.update_size(scale); ui.push_back(&sources_dd); ui.push_back(&edit_dd); ui.push_back(&view_dd); ui.push_back(&search_dd); ui.push_back(&sources_view); ui.push_back(&button); refresh_every = 1; initial_width = 400; initial_height = 200; } void opening_menu_handler(UI_Element *elem, Camera& view, bool dbl_click) { auto table = dynamic_cast(elem); switch (table->hl_row) { case 0: // New workspace { Workspace *ws = table->parent->parent; ws->make_box(); break; } } if (table->hl_row == 0) table->parent->visible = false; } void Opening_Menu::update_ui(Camera& view) { float font_h = title.font->render.text_height() / view.scale; title.outer_box = { border, 0, box.w - 2*border, font_h + 3*border }; menu.pos = title.outer_box; menu.pos.y += title.outer_box.h; menu.pos.h = box.h - menu.pos.y - border; } Opening_Menu::Opening_Menu(Workspace& ws, MenuType mtype) { title.font = ws.default_font; title.text = "Muscles"; menu.font = ws.default_font; menu.hl_color = ws.colors.hl; menu.sel_color = ws.colors.hl; menu.default_color = ws.colors.back; Column menu_column = { ColumnString, 0, 1, 0, 0, "" }; table.init(&menu_column, nullptr, nullptr, nullptr, 1, 2); table.columns[0][0] = (void*)"New"; table.columns[0][1] = (void*)"Open Workspace"; menu.data = &table; menu.action = opening_menu_handler; ui.push_back(&title); ui.push_back(&menu); initial_width = 160; initial_height = 100; visible = true; }