185 lines
6.9 KiB
C
185 lines
6.9 KiB
C
#define SCENE_ICON ICON_MDI_FILE_TREE
|
|
#define SCENE_TITLE "Scene " SCENE_ICON
|
|
|
|
EDITOR_BIND(scene, "held(CTRL)&down(1)", { ui_show(SCENE_TITLE, ui_visible(SCENE_TITLE) ^ true); });
|
|
|
|
EDITOR_PROPERTY(bookmarked, int, 0);
|
|
|
|
EDITOR_BIND(node_new, "down(INS)", { editor_spawn1(); } );
|
|
EDITOR_BIND(node_del, "down(DEL)", { editor_destroy_selected(); } );
|
|
EDITOR_BIND(node_save, "held(CTRL)&down(S)", { puts("@todo"); } );
|
|
EDITOR_BIND(scene_save, "held(CTRL)&down(S)&held(SHIFT)",{ puts("@todo"); } );
|
|
EDITOR_BIND(select_all, "held(CTRL) & down(A)", { editor_select("**"); } );
|
|
EDITOR_BIND(select_none, "held(CTRL) & down(D)", { editor_select("!**"); } );
|
|
EDITOR_BIND(select_invert, "held(CTRL) & down(I)", { editor_select("~**"); } );
|
|
EDITOR_BIND(bookmark, "held(CTRL) & down(B)", { editor_selected_map_t *map = editor_selected_map(); \
|
|
int on = 0; \
|
|
for each_map_ptr(*map,void*,o,int,selected) if(*selected) on |= !editor_bookmarked(*o); \
|
|
for each_map_ptr(*map,void*,o,int,selected) if(*selected) editor_setbookmarked(*o, on); \
|
|
} );
|
|
|
|
enum {
|
|
SCENE_RECURSE = 1,
|
|
SCENE_SELECTION = 2,
|
|
SCENE_CHECKBOX = 4,
|
|
SCENE_INDENT = 8,
|
|
SCENE_ALL = ~0u
|
|
};
|
|
|
|
static
|
|
void editor_scene_(obj *o, unsigned flags) {
|
|
static unsigned tabs = ~0u;
|
|
++tabs;
|
|
|
|
if( o ) {
|
|
unsigned do_tags = 1;
|
|
unsigned do_indent = !!(flags & SCENE_INDENT);
|
|
unsigned do_checkbox = !!(flags & SCENE_CHECKBOX);
|
|
unsigned do_recurse = !!(flags & SCENE_RECURSE);
|
|
unsigned do_selection = !!(flags & SCENE_SELECTION);
|
|
|
|
nk_layout_row_dynamic(ui_ctx, 25, 1);
|
|
|
|
const char *objicon = editor_iconinstance(o);
|
|
if(!objicon) objicon = editor_iconclass(obj_type(o));
|
|
if(!objicon) objicon = ICON_MDI_CUBE_OUTLINE;
|
|
|
|
const char *objname = va("%s (%s)", obj_type(o), obj_name(o));
|
|
|
|
const char *objchevron =
|
|
!do_recurse || array_count(*obj_children(o)) <= 1 ? ICON_MDI_CIRCLE_SMALL :
|
|
editor_open(o) ? ICON_MDI_CHEVRON_DOWN : ICON_MDI_CHEVRON_RIGHT;
|
|
|
|
char *label = va("%*s%s%s %s", do_indent*(4+2*tabs), "", objchevron, objicon, objname);
|
|
|
|
const char *iconsL =
|
|
//editor_selected(o) ? ICON_MD_CHECK_BOX : ICON_MD_CHECK_BOX_OUTLINE_BLANK;
|
|
editor_selected(o) ? ICON_MDI_CHECKBOX_MARKED : ICON_MDI_CHECKBOX_BLANK_OUTLINE;
|
|
|
|
const char *iconsR = va("%s%s%s",
|
|
editor_script(o) ? ICON_MDI_SCRIPT : ICON_MDI_CIRCLE_SMALL,
|
|
editor_event(o) ? ICON_MDI_CALENDAR : ICON_MDI_CIRCLE_SMALL,
|
|
editor_visible(o) ? ICON_MDI_EYE_OUTLINE : ICON_MDI_EYE_CLOSED );
|
|
|
|
UI_TOOLBAR_OVERLAY_DECLARE(int choiceL, choiceR);
|
|
|
|
struct nk_command_buffer *canvas = nk_window_get_canvas(ui_ctx);
|
|
struct nk_rect bounds; nk_layout_peek(&bounds, ui_ctx);
|
|
|
|
int clicked = nk_hovered_text(ui_ctx, label, strlen(label), NK_TEXT_LEFT, editor_selected(o));
|
|
if( clicked && nk_input_is_mouse_hovering_rect(&ui_ctx->input, ((struct nk_rect) { bounds.x,bounds.y,bounds.w*0.66,bounds.h })) )
|
|
editor_altselected( o );
|
|
|
|
vec2i offset_in_tree = {0};
|
|
|
|
if( do_indent ) {
|
|
float thickness = 2.f;
|
|
struct nk_color color = {255,255,255,64};
|
|
|
|
int offsx = 30;
|
|
int spacx = 10;
|
|
int lenx = (tabs+1)*spacx;
|
|
int halfy = bounds.h / 2;
|
|
int offsy = halfy + 2;
|
|
|
|
offset_in_tree = vec2i(bounds.x+offsx+lenx-spacx,bounds.y+offsy);
|
|
|
|
editor_settreeoffsety(o, offset_in_tree.y);
|
|
|
|
for( obj *p = obj_parent(o); p ; p = 0 )
|
|
nk_stroke_line(canvas, offset_in_tree.x-6,offset_in_tree.y, offset_in_tree.x-spacx,offset_in_tree.y, thickness, color),
|
|
nk_stroke_line(canvas, offset_in_tree.x-spacx,offset_in_tree.y,offset_in_tree.x-spacx,editor_treeoffsety(p)+4, thickness, color);
|
|
}
|
|
|
|
if( ui_contextual() ) {
|
|
API int editor_send(const char *);
|
|
|
|
int choice = ui_label(ICON_MD_BOOKMARK_ADDED "Toggle bookmarks (CTRL+B)");
|
|
if( choice & 1 ) editor_send("bookmark");
|
|
|
|
ui_contextual_end(!!choice);
|
|
}
|
|
|
|
UI_TOOLBAR_OVERLAY(choiceL,iconsL,nk_rgba_f(1,1,1,do_checkbox*ui_alpha*0.65),NK_TEXT_LEFT);
|
|
|
|
if( do_tags )
|
|
UI_TOOLBAR_OVERLAY(choiceR,iconsR,nk_rgba_f(1,1,1,ui_alpha*0.65),NK_TEXT_RIGHT);
|
|
|
|
if( choiceR == 3 ) editor_altscript( o );
|
|
if( choiceR == 2 ) editor_altevent( o);
|
|
if( choiceR == 1 ) editor_altvisible( o );
|
|
|
|
if( do_recurse && editor_open(o) ) {
|
|
for each_objchild(o,obj*,oo) {
|
|
editor_scene_(oo,flags);
|
|
}
|
|
}
|
|
|
|
if( clicked && !choiceL && !choiceR ) {
|
|
int is_picking = input(KEY_CTRL);
|
|
if( !is_picking ) {
|
|
if( input(KEY_SHIFT) ) {
|
|
editor_selectgroup( editor_first_selected(), editor_last_selected() );
|
|
} else {
|
|
editor_unselect();
|
|
editor_setselected(o, 1);
|
|
}
|
|
}
|
|
for( obj *p = obj_parent(o); p; p = obj_parent(p) ) {
|
|
editor_setopen(p, 1);
|
|
}
|
|
if( nk_input_is_mouse_hovering_rect(&ui_ctx->input, ((struct nk_rect) { bounds.x,bounds.y,offset_in_tree.x-bounds.x+UI_ICON_FONTSIZE/2,bounds.h })) ) {
|
|
editor_altopen( o );
|
|
}
|
|
}
|
|
}
|
|
|
|
--tabs;
|
|
}
|
|
|
|
int editor_scene(int window_mode) {
|
|
window_mode = EDITOR_WINDOW; // force window
|
|
|
|
if( editor_begin(SCENE_TITLE, window_mode)) {
|
|
// #define HELP ICON_MDI_INFORMATION_OUTLINE "@-A\n-B\n-C\n" ";"
|
|
int choice = ui_toolbar(ICON_MDI_PLUS "@New node (CTRL+N);" ICON_MDI_DOWNLOAD "@Save node (CTRL+S);" ICON_MDI_DOWNLOAD "@Save scene (SHIFT+CTRL+S);" ICON_MD_BOOKMARK_ADDED "@Toggle Bookmark (CTRL+B);");
|
|
if( choice == 1 ) editor_send("node_new");
|
|
if( choice == 2 ) editor_send("node_save");
|
|
if( choice == 3 ) editor_send("scene_save");
|
|
if( choice == 4 ) editor_send("bookmark");
|
|
|
|
array(obj*) bookmarks = 0;
|
|
for each_map_ptr(*editor_bookmarked_map(), void*,o,int,bookmarked) {
|
|
if( *bookmarked ) {
|
|
array_push(bookmarks, *o);
|
|
}
|
|
}
|
|
if( ui_collapse("!" ICON_MD_BOOKMARK "Bookmarks", "DEBUG:BOOKMARK")) {
|
|
for each_array( bookmarks, obj*, o )
|
|
editor_scene_( o, SCENE_ALL & ~(SCENE_RECURSE|SCENE_INDENT|SCENE_CHECKBOX) );
|
|
ui_collapse_end();
|
|
}
|
|
array_free(bookmarks);
|
|
|
|
editor_scene_( editor.root, SCENE_ALL );
|
|
|
|
for each_array( editor.objs, obj*, o )
|
|
editor_scene_( o, SCENE_ALL );
|
|
|
|
ui_separator();
|
|
|
|
// edit selection
|
|
for each_map(*editor_selected_map(), void*,o, int, k) {
|
|
if( k ) editor_inspect(o);
|
|
}
|
|
|
|
editor_end(window_mode);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
AUTORUN {
|
|
array_push(editor.subeditors, editor_scene);
|
|
}
|