diff --git a/base/sources/iron_ui_nodes.c b/base/sources/iron_ui_nodes.c index 6c79301b..97d6ff92 100644 --- a/base/sources/iron_ui_nodes.c +++ b/base/sources/iron_ui_nodes.c @@ -27,6 +27,7 @@ char *ui_clipboard = ""; char_ptr_array_t *ui_nodes_exclude_remove = NULL; // No removal for listed node types bool ui_nodes_socket_released = false; char_ptr_array_t *(*ui_nodes_enum_texts)(char *) = NULL; // Retrieve combo items for buttons of type ENUM +gpu_texture_t *(*ui_nodes_preview_image)(ui_node_t *) = NULL; // Retrieve preview image void (*ui_nodes_on_custom_button)(int, char *) = NULL; // Call external function ui_canvas_control_t *(*ui_nodes_on_canvas_control)(void) = NULL; void (*ui_nodes_on_canvas_released)(void) = NULL; @@ -735,6 +736,16 @@ void ui_node_draw(ui_node_t *node, ui_node_canvas_t *canvas) { // ny = ui_nodes_snap(node->y) + UI_NODES_PAN_Y(); } + // Node preview + if ((node->flags & NODE_FLAG_PREVIEW) && ui_nodes_preview_image != NULL) { + // ui_draw_shadow(nx, ny - w, w * 0.98, w * 0.98); + gpu_texture_t *image = ui_nodes_preview_image(node); + if (image != NULL) { + draw_set_color(0xffffffff); + draw_scaled_image(image, nx, ny - w, w, w); + } + } + // Shadow ui_draw_shadow(nx, ny, w, h); @@ -764,6 +775,9 @@ void ui_node_draw(ui_node_t *node, ui_node_canvas_t *canvas) { // Eye button hover = current->input_x > wx + nx + w - ui_p(20) && current->input_x < wx + nx + w && current->input_y > wy + ny && current->input_y < wy + ny + ui_p(20); + if (hover && current->input_started) { + node->flags ^= NODE_FLAG_PREVIEW; + } draw_set_color(hover ? current->ops->theme->LABEL_COL : current->ops->theme->HOVER_COL); float ex = nx + w - ui_p(10); float ey = ny + ui_p(10); @@ -1324,7 +1338,7 @@ void ui_node_canvas_encode(ui_node_canvas_t *canvas) { armpack_encode_string("nodes"); armpack_encode_array(canvas->nodes->length); for (int i = 0; i < canvas->nodes->length; ++i) { - armpack_encode_map(10); + armpack_encode_map(11); armpack_encode_string("id"); armpack_encode_i32(canvas->nodes->buffer[i]->id); armpack_encode_string("name"); diff --git a/base/sources/iron_ui_nodes.h b/base/sources/iron_ui_nodes.h index 1504b862..3520e31e 100644 --- a/base/sources/iron_ui_nodes.h +++ b/base/sources/iron_ui_nodes.h @@ -131,6 +131,7 @@ extern char *ui_clipboard; extern char_ptr_array_t *ui_nodes_exclude_remove; extern bool ui_nodes_socket_released; extern char_ptr_array_t *(*ui_nodes_enum_texts)(char *); +extern gpu_texture_t *(*ui_nodes_preview_image)(ui_node_t *); extern void (*ui_nodes_on_custom_button)(int, char *); extern ui_canvas_control_t *(*ui_nodes_on_canvas_control)(void); extern void (*ui_nodes_on_canvas_released)(void); diff --git a/base/sources/ts/iron.ts b/base/sources/ts/iron.ts index 5a96b460..642edc0e 100644 --- a/base/sources/ts/iron.ts +++ b/base/sources/ts/iron.ts @@ -680,6 +680,7 @@ enum cursor_t { } declare let ui_nodes_enum_texts: (s: string)=>string[]; +declare let ui_nodes_preview_image: (n: ui_node_t)=>gpu_texture_t; declare let ui_touch_scroll: bool; declare let ui_touch_hold : bool; declare let ui_touch_tooltip: bool; @@ -942,6 +943,12 @@ enum ui_state_t { HOVERED, } +enum _ui_node_flag_t { + NONE = 0, + COLLAPSED = 1, + PREVIEW = 2, +} + declare function ui_tooltip_image(image: gpu_texture_t, max_width: i32 = 0): void; declare function ui_image(image: gpu_texture_t, tint: i32 = 0xffffffff, h: f32 = -1.0): ui_state_t; declare function ui_sub_image(image: gpu_texture_t, tint: i32 = 0xffffffff, h: f32 = -1.0, sx: i32 = 0, sy: i32 = 0, sw: i32 = 0, sh: i32 = 0): ui_state_t; diff --git a/paint/sources/ui_nodes.ts b/paint/sources/ui_nodes.ts index d4a20f7f..b5e55850 100644 --- a/paint/sources/ui_nodes.ts +++ b/paint/sources/ui_nodes.ts @@ -53,6 +53,7 @@ let _ui_nodes_node_search_first: bool; let _ui_nodes_node_search_done: ()=>void; function ui_viewnodes_init() { + ui_nodes_preview_image = uiviewnodes_preview_image; ui_nodes_on_link_drag = ui_viewnodes_on_link_drag; ui_nodes_on_socket_released = ui_viewnodes_on_socket_released; ui_nodes_on_canvas_released = ui_viewnodes_on_canvas_released; @@ -61,6 +62,10 @@ function ui_viewnodes_init() { nodes_material_init(); } +function uiviewnodes_preview_image(n: ui_node_t): gpu_texture_t { + return ui_nodes_get_node_preview_image(n); +} + function ui_viewnodes_on_link_drag(link_drag_id: i32, is_new_link: bool) { if (!is_new_link) { return; @@ -983,19 +988,24 @@ function ui_nodes_render() { let tw: f32 = 128 * UI_SCALE(); let tx: f32 = ui_nodes_ww - tw - 8 * UI_SCALE(); let ty: f32 = ui_nodes_wh - tw - 8 * UI_SCALE(); - ui_nodes_draw_node_preview(sel, tx, ty, tw); + let img: gpu_texture_t = ui_nodes_get_node_preview_image(sel); + if (img != null && !(sel.flags & _ui_node_flag_t.PREVIEW)) { + if (img == context_raw.node_preview) { + ui_draw_shadow(tx, ty, tw, tw); + } + let single_channel: bool = sel.type == "LAYER_MASK"; + if (single_channel) { + draw_set_pipeline(ui_view2d_pipe); + gpu_set_int(ui_view2d_channel_loc, 1); + } + draw_set_color(0xffffffff); + draw_scaled_image(img, tx, ty, tw, tw); + if (single_channel) { + draw_set_pipeline(null); + } + } } - // if (context_raw.selected_node_preview) { - // for (let i: i32 = 0; i < c.nodes.length; ++i) { - // let n: ui_node_t = c.nodes[i]; - // let tw: f32 = 128 * UI_SCALE() * UI_NODES_SCALE(); - // let tx: f32 = UI_NODE_X(n) + UI_NODE_W(n) / 2 - tw / 2; - // let ty: f32 = UI_NODE_Y(n) - tw - 6; - // ui_nodes_draw_node_preview(n, tx, ty, tw); - // } - // } - ui_nodes_draw_menubar(); ui.window_border_right = 0; @@ -1121,27 +1131,6 @@ function ui_nodes_get_node_preview_image(n: ui_node_t): gpu_texture_t { return img; } -function ui_nodes_draw_node_preview(n: ui_node_t, tx: i32, ty: i32, tw: i32) { - let img: gpu_texture_t = ui_nodes_get_node_preview_image(n); - if (img != null) { - - if (img == context_raw.node_preview) { - ui_draw_shadow(tx, ty, tw, tw); - } - - let single_channel: bool = n.type == "LAYER_MASK"; - if (single_channel) { - draw_set_pipeline(ui_view2d_pipe); - gpu_set_int(ui_view2d_channel_loc, 1); - } - draw_set_color(0xffffffff); - draw_scaled_image(img, tx, ty, tw, tw); - if (single_channel) { - draw_set_pipeline(null); - } - } -} - function ui_nodes_draw_menubar() { let c: ui_node_canvas_t = ui_nodes_get_canvas(true); let ew: i32 = math_floor(UI_ELEMENT_W() * 0.7); @@ -1365,6 +1354,7 @@ function ui_nodes_make_node(n: ui_node_t, nodes: ui_nodes_t, canvas: ui_node_can node.outputs = []; node.buttons = []; node.width = 0; + node.flags = config_raw.node_previews ? _ui_node_flag_t.PREVIEW : _ui_node_flag_t.NONE; let count: i32 = 0; for (let i: i32 = 0; i < n.inputs.length; ++i) {