static int node_editor(struct nk_context *ctx) { int n = 0; struct nk_rect total_space; const struct nk_input *in = &ctx->input; struct nk_command_buffer *canvas; struct node *updated = 0; struct node_editor *nodedit = &nodeEditor; if (!nodeEditor.initialized) { node_editor_init(&nodeEditor); nodeEditor.initialized = 1; } if (nk_begin(ctx, "NodeEdit", nk_rect(0, 0, 800, 600), NK_WINDOW_BORDER|NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_MOVABLE|NK_WINDOW_CLOSABLE)) { /* allocate complete window space */ canvas = nk_window_get_canvas(ctx); total_space = nk_window_get_content_region(ctx); nk_layout_space_begin(ctx, NK_STATIC, total_space.h, nodedit->node_count); { struct node *it = nodedit->begin; struct nk_rect size = nk_layout_space_bounds(ctx); struct nk_panel *node = 0; if (nodedit->show_grid) { /* display grid */ float x, y; const float grid_size = 32.0f; const struct nk_color grid_color = nk_rgb(50, 50, 50); for (x = (float)fmod(size.x - nodedit->scrolling.x, grid_size); x < size.w; x += grid_size) nk_stroke_line(canvas, x+size.x, size.y, x+size.x, size.y+size.h, 1.0f, grid_color); for (y = (float)fmod(size.y - nodedit->scrolling.y, grid_size); y < size.h; y += grid_size) nk_stroke_line(canvas, size.x, y+size.y, size.x+size.w, y+size.y, 1.0f, grid_color); } /* execute each node as a movable group */ while (it) { /* calculate scrolled node window position and size */ nk_layout_space_push(ctx, nk_rect(it->bounds.x - nodedit->scrolling.x, it->bounds.y - nodedit->scrolling.y, it->bounds.w, it->bounds.h)); /* execute node window */ if (nk_group_begin(ctx, it->name, NK_WINDOW_MOVABLE|NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_BORDER|NK_WINDOW_TITLE)) { /* always have last selected node on top */ node = nk_window_get_panel(ctx); if (nk_input_mouse_clicked(in, NK_BUTTON_LEFT, node->bounds) && (!(it->prev && nk_input_mouse_clicked(in, NK_BUTTON_LEFT, nk_layout_space_rect_to_screen(ctx, node->bounds)))) && nodedit->end != it) { updated = it; } /* ================= NODE CONTENT =====================*/ nk_layout_row_dynamic(ctx, 25, 1); nk_button_color(ctx, it->color); it->color.r = (nk_byte)nk_propertyi(ctx, "#R:", 0, it->color.r, 255, 1,1); it->color.g = (nk_byte)nk_propertyi(ctx, "#G:", 0, it->color.g, 255, 1,1); it->color.b = (nk_byte)nk_propertyi(ctx, "#B:", 0, it->color.b, 255, 1,1); it->color.a = (nk_byte)nk_propertyi(ctx, "#A:", 0, it->color.a, 255, 1,1); /* ====================================================*/ nk_group_end(ctx); } { /* node connector and linking */ float space; struct nk_rect bounds; bounds = nk_layout_space_rect_to_local(ctx, node->bounds); bounds.x += nodedit->scrolling.x; bounds.y += nodedit->scrolling.y; it->bounds = bounds; /* output connector */ space = node->bounds.h / (float)((it->output_count) + 1); for (n = 0; n < it->output_count; ++n) { struct nk_rect circle; circle.x = node->bounds.x + node->bounds.w-4; circle.y = node->bounds.y + space * (float)(n+1); circle.w = 8; circle.h = 8; nk_fill_circle(canvas, circle, nk_rgb(100, 100, 100)); /* start linking process */ if (nk_input_has_mouse_click_down_in_rect(in, NK_BUTTON_LEFT, circle, nk_true)) { nodedit->linking.active = nk_true; nodedit->linking.node = it; nodedit->linking.input_id = it->ID; nodedit->linking.input_slot = n; } /* draw curve from linked node slot to mouse position */ if (nodedit->linking.active && nodedit->linking.node == it && nodedit->linking.input_slot == n) { struct nk_vec2 l0 = nk_vec2(circle.x + 3, circle.y + 3); struct nk_vec2 l1 = in->mouse.pos; nk_stroke_curve(canvas, l0.x, l0.y, l0.x + 50.0f, l0.y, l1.x - 50.0f, l1.y, l1.x, l1.y, 1.0f, nk_rgb(100, 100, 100)); } } /* input connector */ space = node->bounds.h / (float)((it->input_count) + 1); for (n = 0; n < it->input_count; ++n) { struct nk_rect circle; circle.x = node->bounds.x-4; circle.y = node->bounds.y + space * (float)(n+1); circle.w = 8; circle.h = 8; nk_fill_circle(canvas, circle, nk_rgb(100, 100, 100)); if (nk_input_is_mouse_released(in, NK_BUTTON_LEFT) && nk_input_is_mouse_hovering_rect(in, circle) && nodedit->linking.active && nodedit->linking.node != it) { nodedit->linking.active = nk_false; node_editor_link(nodedit, nodedit->linking.input_id, nodedit->linking.input_slot, it->ID, n); } } } it = it->next; } /* reset linking connection */ if (nodedit->linking.active && nk_input_is_mouse_released(in, NK_BUTTON_LEFT)) { nodedit->linking.active = nk_false; nodedit->linking.node = NULL; fprintf(stdout, "linking failed\n"); } /* draw each link */ for (n = 0; n < nodedit->link_count; ++n) { struct node_link *link = &nodedit->links[n]; struct node *ni = node_editor_find(nodedit, link->input_id); struct node *no = node_editor_find(nodedit, link->output_id); float spacei = node->bounds.h / (float)((ni->output_count) + 1); float spaceo = node->bounds.h / (float)((no->input_count) + 1); struct nk_vec2 l0 = nk_layout_space_to_screen(ctx, nk_vec2(ni->bounds.x + ni->bounds.w, 3.0f + ni->bounds.y + spacei * (float)(link->input_slot+1))); struct nk_vec2 l1 = nk_layout_space_to_screen(ctx, nk_vec2(no->bounds.x, 3.0f + no->bounds.y + spaceo * (float)(link->output_slot+1))); l0.x -= nodedit->scrolling.x; l0.y -= nodedit->scrolling.y; l1.x -= nodedit->scrolling.x; l1.y -= nodedit->scrolling.y; nk_stroke_curve(canvas, l0.x, l0.y, l0.x + 50.0f, l0.y, l1.x - 50.0f, l1.y, l1.x, l1.y, 1.0f, nk_rgb(100, 100, 100)); } if (updated) { /* reshuffle nodes to have least recently selected node on top */ node_editor_pop(nodedit, updated); node_editor_push(nodedit, updated); } /* node selection */ if (nk_input_mouse_clicked(in, NK_BUTTON_LEFT, nk_layout_space_bounds(ctx))) { it = nodedit->begin; nodedit->selected = NULL; nodedit->bounds = nk_rect(in->mouse.pos.x, in->mouse.pos.y, 100, 200); while (it) { struct nk_rect b = nk_layout_space_rect_to_screen(ctx, it->bounds); b.x -= nodedit->scrolling.x; b.y -= nodedit->scrolling.y; if (nk_input_is_mouse_hovering_rect(in, b)) nodedit->selected = it; it = it->next; } } /* contextual menu */ if (nk_contextual_begin(ctx, 0, nk_vec2(100, 220), nk_window_get_bounds(ctx))) { const char *grid_option[] = {"Show Grid", "Hide Grid"}; nk_layout_row_dynamic(ctx, 25, 1); if (nk_contextual_item_label(ctx, "New", NK_TEXT_CENTERED)) node_editor_add(nodedit, "New", nk_rect(400, 260, 180, 220), nk_rgb(255, 255, 255), 1, 2); if (nk_contextual_item_label(ctx, grid_option[nodedit->show_grid],NK_TEXT_CENTERED)) nodedit->show_grid = !nodedit->show_grid; nk_contextual_end(ctx); } } nk_layout_space_end(ctx); /* window content scrolling */ if (nk_input_is_mouse_hovering_rect(in, nk_window_get_bounds(ctx)) && nk_input_is_mouse_down(in, NK_BUTTON_MIDDLE)) { nodedit->scrolling.x += in->mouse.delta.x; nodedit->scrolling.y += in->mouse.delta.y; } } nk_end(ctx); return !nk_window_is_closed(ctx, "NodeEdit"); }
void draw_output_tab(struct nk_context *ctx, int *tab_screen_height, struct output_tab *output, struct main_tab *main_settings) { const float roll_limit_ratio[] = { 0.55f, 0.45f }; nk_flags active; static int len; static int cap_len; static int color_len = 6; const float gen_enc_ratio[] = { 0.701f, 0.302f }; const float type_ratio[] = { 0.3f,0.7f }; const float out_file_ratio[] = { 0.3f,0.53f,0.17f }; const float cap_file_ratio[] = { 0.2f,0.63f,0.17f }; const float delay_ratio[] = { 0.5f, 0.2f, 0.3f }; const float color_roll_ratio[] = { 0.6f,0.401f }; const float color_check_ratio[] = { 0.6f,0.23f,0.07f,0.1f }; *tab_screen_height = 472; nk_layout_row(ctx, NK_DYNAMIC, 160, 2, gen_enc_ratio); //General Group if (nk_group_begin(ctx, "General", NK_WINDOW_TITLE |NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER)) { int delay_secs = atoi(output->delay_sec_buffer); //Output Type nk_layout_row(ctx, NK_DYNAMIC, 20, 2, type_ratio); nk_label(ctx, "Output Type:", NK_TEXT_LEFT); output->type_select = nk_combo(ctx, output->type, 13, output->type_select, 25, nk_vec2(225, 200)); //Output File nk_layout_row(ctx, NK_DYNAMIC, 25, 3, out_file_ratio); nk_checkbox_label(ctx, "Output File:", &output->is_filename); nk_edit_string(ctx, NK_EDIT_SIMPLE, output->filename, &output->filename_len, 255, nk_filter_ascii); if (nk_button_label(ctx, "Browse")) { main_settings->scaleWindowForFileBrowser = nk_true; output->is_output_browser_active = nk_true; } //Subtitle Delay nk_layout_row(ctx, NK_DYNAMIC, 25, 3, delay_ratio); nk_checkbox_label(ctx, "Add delay in subtitles for", &output->is_delay); delay_secs = nk_propertyi(ctx, "", 0, delay_secs, 1000, 1, 1); sprintf(output->delay_sec_buffer, "%d", delay_secs); nk_label(ctx, "seconds", NK_TEXT_LEFT); //Export XDS info nk_layout_row_dynamic(ctx, 25, 1); nk_checkbox_label(ctx, "Export XDS information (transcripts)", &output->is_export_xds); nk_group_end(ctx); } //Encoding Group if (nk_group_begin(ctx, "Encoding", NK_WINDOW_TITLE |NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER)) { static int option = UTF; nk_layout_row_dynamic(ctx, 20, 1); if (nk_option_label(ctx, "Latin", output->encoding == LATIN)) { output->encoding = LATIN; } nk_layout_row_dynamic(ctx, 20, 1); if (nk_option_label(ctx, "Unicode", output->encoding == UNIC)) { output->encoding = UNIC; } nk_layout_row_dynamic(ctx, 20, 1); if (nk_option_label(ctx, "UTF-8", output->encoding == UTF)) { output->encoding = UTF; } nk_layout_row_dynamic(ctx, 20, 1); nk_checkbox_label(ctx, "Byte Order Mark*", &output->is_bom); nk_layout_row_dynamic(ctx, 20, 1); nk_label(ctx, "*( For UNIX programs )", NK_TEXT_LEFT); nk_group_end(ctx); } nk_layout_row(ctx, NK_DYNAMIC, 100, 2, gen_enc_ratio); //Capitalization Group if(nk_group_begin(ctx, "Capitalization", NK_WINDOW_TITLE|NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER)) { nk_layout_row_dynamic(ctx, 20, 1); nk_checkbox_label(ctx, "Standard capitalization rules.", &output->is_cap_standard); nk_layout_row(ctx, NK_DYNAMIC, 25, 3, cap_file_ratio); nk_checkbox_label(ctx, "Cap file:", &output->is_cap_file); nk_edit_string(ctx, NK_EDIT_SIMPLE, output->cap_dictionary, &output->cap_dictionary_len, 255, nk_filter_ascii); if (nk_button_label(ctx, "Browse")) { main_settings->scaleWindowForFileBrowser = nk_true; output->is_cap_browser_active = nk_true; } nk_group_end(ctx); } //Line Endings if (nk_group_begin(ctx, "Line Endings:", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR |NK_WINDOW_BORDER)) { nk_layout_row_dynamic(ctx, 20, 1); if (nk_option_label(ctx, "CRLF (Windows)", output->line_ending == CRLF)) { output->line_ending = CRLF; } nk_layout_row_dynamic(ctx, 25, 1); if (nk_option_label(ctx, "LF (UNIX-like)", output->line_ending == LF)) { output->line_ending = LF; } nk_group_end(ctx); } nk_layout_row(ctx, NK_DYNAMIC, 170, 2, color_roll_ratio); //Colors and Styles Group if (nk_group_begin(ctx, "Colors and Styles", NK_WINDOW_TITLE | NK_WINDOW_BORDER)) { nk_layout_row_dynamic(ctx, 20, 1); nk_checkbox_label(ctx, "Center Text (remove left and right spaces)", &output->is_center); nk_layout_row_dynamic(ctx, 20, 1); nk_checkbox_label(ctx, "Add dash (-) when speaker changes (for .srt)", &output->is_dash); nk_layout_row_dynamic(ctx, 20, 1); nk_checkbox_label(ctx, "Don't add typesetting tags(bold, italic, etc.)", &output->no_typesetting); nk_layout_row_dynamic(ctx, 20, 1); if(nk_option_label(ctx, "Don't add color information", output->font_color == NO_COLOR)) { output->font_color = NO_COLOR; } nk_layout_row(ctx, NK_DYNAMIC, 20, 4, color_check_ratio); if (nk_option_label(ctx, "Default color (RRGGBB)#", output->font_color == DEFAULT_COLOR)) { output->font_color = DEFAULT_COLOR; } active = nk_edit_string(ctx, NK_EDIT_FIELD|NK_EDIT_SIG_ENTER, output->color_hex, &color_len, 7, nk_filter_hex); nk_label(ctx, "or", NK_TEXT_CENTERED); if (nk_button_color(ctx, output->color_rgb)) output->color_popup = nk_true; if (show_color_from_picker) { sprintf(output->color_hex, "%02X%02X%02X", output->color_rgb.r, output->color_rgb.g, output->color_rgb.b); show_color_from_picker = nk_false; } /*if (active & NK_EDIT_COMMITED) { output->color_rgb.r = (int)strtol(strncat(output->color_hex[0], output->color_hex[1], 2), NULL, 16); output->color_rgb.g = (int)strtol(strncat(output->color_hex[2], output->color_hex[3], 2), NULL, 16); output->color_rgb.b = (int)strtol(strncat(output->color_hex[4], output->color_hex[5], 2), NULL, 16); printf("%d%d%d", output->color_rgb.r, output->color_rgb.g, output->color_rgb.b); }*/ nk_group_end(ctx); } //Roll-up Captions Group if (nk_group_begin(ctx, "Roll-up Captions", NK_WINDOW_TITLE | NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER)) { nk_layout_row_dynamic(ctx, 25, 1); if (nk_option_label(ctx, "Letters appear in realtime", output->onetime_or_realtime == REALTIME)) { output->onetime_or_realtime = REALTIME; } nk_layout_row_dynamic(ctx, 25, 1); nk_label(ctx, "(Allows duplication of content)", NK_TEXT_LEFT); nk_layout_row(ctx, NK_DYNAMIC, 20, 2, roll_limit_ratio); nk_label(ctx, "Limit visible lines", NK_TEXT_LEFT); output->roll_limit_select = nk_combo(ctx, output->roll_limit, 4, output->roll_limit_select, 25, nk_vec2(80, 80)); nk_layout_row_dynamic(ctx, 20, 1); if (nk_option_label(ctx, "Letters appear line by line", output->onetime_or_realtime == ONETIME)) { output->onetime_or_realtime = ONETIME; } nk_layout_row_dynamic(ctx, 25, 1); nk_label(ctx, "(No duplication of content)", NK_TEXT_LEFT); nk_group_end(ctx); } }