- [Image Array Editor] Improve UI, add file drop support.

This commit is contained in:
Tanasart 2024-08-12 09:28:38 +07:00
parent 4cc55b3dc3
commit ad1cdce126
12 changed files with 255 additions and 32 deletions

View file

@ -1259,6 +1259,7 @@
{"name":"panel_graph_grid_settings","order":7,"path":"scripts/panel_graph_grid_settings/panel_graph_grid_settings.yy",}, {"name":"panel_graph_grid_settings","order":7,"path":"scripts/panel_graph_grid_settings/panel_graph_grid_settings.yy",},
{"name":"panel_graph_view_settings","order":8,"path":"scripts/panel_graph_view_settings/panel_graph_view_settings.yy",}, {"name":"panel_graph_view_settings","order":8,"path":"scripts/panel_graph_view_settings/panel_graph_view_settings.yy",},
{"name":"panel_history","order":5,"path":"scripts/panel_history/panel_history.yy",}, {"name":"panel_history","order":5,"path":"scripts/panel_history/panel_history.yy",},
{"name":"panel_image_array_editor","order":1,"path":"scripts/panel_image_array_editor/panel_image_array_editor.yy",},
{"name":"panel_keyframe_driver","order":2,"path":"scripts/panel_keyframe_driver/panel_keyframe_driver.yy",}, {"name":"panel_keyframe_driver","order":2,"path":"scripts/panel_keyframe_driver/panel_keyframe_driver.yy",},
{"name":"panel_menu","order":6,"path":"scripts/panel_menu/panel_menu.yy",}, {"name":"panel_menu","order":6,"path":"scripts/panel_menu/panel_menu.yy",},
{"name":"panel_node_align","order":3,"path":"scripts/panel_node_align/panel_node_align.yy",}, {"name":"panel_node_align","order":3,"path":"scripts/panel_node_align/panel_node_align.yy",},

View file

@ -1875,6 +1875,7 @@
{"id":{"name":"panel_graph_view_settings","path":"scripts/panel_graph_view_settings/panel_graph_view_settings.yy",},}, {"id":{"name":"panel_graph_view_settings","path":"scripts/panel_graph_view_settings/panel_graph_view_settings.yy",},},
{"id":{"name":"panel_graph","path":"scripts/panel_graph/panel_graph.yy",},}, {"id":{"name":"panel_graph","path":"scripts/panel_graph/panel_graph.yy",},},
{"id":{"name":"panel_history","path":"scripts/panel_history/panel_history.yy",},}, {"id":{"name":"panel_history","path":"scripts/panel_history/panel_history.yy",},},
{"id":{"name":"panel_image_array_editor","path":"scripts/panel_image_array_editor/panel_image_array_editor.yy",},},
{"id":{"name":"panel_inspector","path":"scripts/panel_inspector/panel_inspector.yy",},}, {"id":{"name":"panel_inspector","path":"scripts/panel_inspector/panel_inspector.yy",},},
{"id":{"name":"panel_keyframe_driver","path":"scripts/panel_keyframe_driver/panel_keyframe_driver.yy",},}, {"id":{"name":"panel_keyframe_driver","path":"scripts/panel_keyframe_driver/panel_keyframe_driver.yy",},},
{"id":{"name":"panel_menu","path":"scripts/panel_menu/panel_menu.yy",},}, {"id":{"name":"panel_menu","path":"scripts/panel_menu/panel_menu.yy",},},

View file

@ -17,7 +17,7 @@ event_inherited();
function onResize() { function onResize() {
sp_content.resize(dialog_w - ui(padding + padding), dialog_h - ui(title_height + padding)); sp_content.resize(dialog_w - ui(padding + padding), dialog_h - ui(title_height + padding));
} }
#endregion #endregion
#region content #region content

View file

@ -59,24 +59,20 @@ event_inherited();
} }
draw_set_font(font); draw_set_font(font);
var ww = string_width(_menuItem.name) + ui(64); var ww = string_width(_menuItem.name) + ui(64);
var _key = _menuItem.hotkey != noone? find_hotkey(_menuItem.hotkey[0], _menuItem.hotkey[1]) : noone;
draw_set_font(font);
var _kw = _key? string_width(key_get_name(_key.key, _key.modi)) + ui(16) : 0;
if(instanceof(_menuItem) == "MenuItemGroup") { if(instanceof(_menuItem) == "MenuItemGroup") {
var amo = array_length(_menuItem.group); var amo = array_length(_menuItem.group);
ww = max(ww, ui(16) + amo * (_menuItem.spacing + ui(4))); ww = max(ww + _kw * 2, ui(16) + amo * (_menuItem.spacing + ui(4)));
dialog_h += hght; dialog_h += hght;
} }
if(instanceof(_menuItem) == "MenuItem") { if(instanceof(_menuItem) == "MenuItem") {
if(_menuItem.hotkey != noone) { ww += _kw;
var _key = find_hotkey(_menuItem.hotkey[0], _menuItem.hotkey[1]);
if(_key) {
draw_set_font(font);
var ss = key_get_name(_key.key, _key.modi);
ww += string_width(ss) + ui(16);
}
}
if(_menuItem.spr != noone || _menuItem.toggle != noone) show_icon = true; if(_menuItem.spr != noone || _menuItem.toggle != noone) show_icon = true;
} }

View file

@ -3,8 +3,8 @@ if !ready exit;
#region base UI #region base UI
var p = ui(8); var p = ui(8);
var m_in = point_in_rectangle(mouse_mx, mouse_my, dialog_x + p, dialog_y + p, dialog_x + dialog_w - p, dialog_y + dialog_h - p); var m_in = point_in_rectangle(mouse_mxs, mouse_mys, dialog_x + p, dialog_y + p, dialog_x + dialog_w - p, dialog_y + dialog_h - p);
var m_ot = point_in_rectangle(mouse_mx, mouse_my, dialog_x, dialog_y, dialog_x + dialog_w, dialog_y + dialog_h); var m_ot = point_in_rectangle(mouse_mxs, mouse_mys, dialog_x, dialog_y, dialog_x + dialog_w, dialog_y + dialog_h);
DIALOG_DRAW_BG DIALOG_DRAW_BG
#endregion #endregion

View file

@ -1,11 +1,11 @@
function file_exists_empty(path) { INLINE return path != "" && file_exists(path); } function file_exists_empty(path) { INLINE return path != "" && file_exists(path); }
function file_copy_override(src, dest) { #region function file_copy_override(src, dest) {
if(file_exists_empty(dest)) file_delete(dest); if(file_exists_empty(dest)) file_delete(dest);
file_copy(src, dest); file_copy(src, dest);
} #endregion }
function filepath_resolve(path) { #region function filepath_resolve(path) {
INLINE INLINE
var _path = path; var _path = path;
@ -13,16 +13,18 @@ function filepath_resolve(path) { #region
_path = string_replace_all(_path, "%APP%/", APP_LOCATION); _path = string_replace_all(_path, "%APP%/", APP_LOCATION);
return _path; return _path;
} #endregion }
function get_open_filenames_compat(ext, sel, caption = "Open") { #region function get_open_filenames_compat(ext, sel, caption = "Open") {
INLINE INLINE
if(OS == os_windows) return get_open_filenames_ext(ext, sel, PREFERENCES.dialog_path, caption); var pat = OS == os_windows? get_open_filenames_ext(ext, sel, PREFERENCES.dialog_path, caption) : get_open_filename_pxc(ext, sel, caption);
return get_open_filename_pxc(ext, sel, caption); key_release();
} #endregion
function file_get_modify_s(path) { #region return pat;
}
function file_get_modify_s(path) {
INLINE INLINE
if(!file_exists_empty(path)) return 0; if(!file_exists_empty(path)) return 0;
@ -35,7 +37,7 @@ function file_get_modify_s(path) { #region
var _s = file_datetime_modified_second(path); var _s = file_datetime_modified_second(path);
return ((((_y * 12 + _m) * 31 + _d) * 24 + _h) * 60 + _n) * 60 + _s; return ((((_y * 12 + _m) * 31 + _d) * 24 + _h) * 60 + _n) * 60 + _s;
} #endregion }
function get_save_filename_pxc(filter, name, caption = "Save as") { function get_save_filename_pxc(filter, name, caption = "Save as") {
INLINE INLINE

View file

@ -92,6 +92,10 @@
#macro mouse_mx (PEN_USE? PEN_X : device_mouse_x_to_gui(0)) #macro mouse_mx (PEN_USE? PEN_X : device_mouse_x_to_gui(0))
#macro mouse_my (PEN_USE? PEN_Y : device_mouse_y_to_gui(0)) #macro mouse_my (PEN_USE? PEN_Y : device_mouse_y_to_gui(0))
#macro mouse_mxs (FILE_IS_DROPPING? FILE_DROPPING_X : mouse_mx)
#macro mouse_mys (FILE_IS_DROPPING? FILE_DROPPING_Y : mouse_my)
#macro mouse_raw_x (device_mouse_raw_x(0) + window_get_x()) #macro mouse_raw_x (device_mouse_raw_x(0) + window_get_x())
#macro mouse_raw_y (device_mouse_raw_y(0) + window_get_y()) #macro mouse_raw_y (device_mouse_raw_y(0) + window_get_y())
#macro mouse_ui [device_mouse_x_to_gui(0), device_mouse_y_to_gui(0)] #macro mouse_ui [device_mouse_x_to_gui(0), device_mouse_y_to_gui(0)]

View file

@ -396,8 +396,8 @@ function Panel(_parent, _x, _y, _w, _h) constructor {
dragging = -1; dragging = -1;
} }
} else { } else {
var _mx = FILE_IS_DROPPING? FILE_DROPPING_X : mouse_mx; var _mx = mouse_mxs;
var _my = FILE_IS_DROPPING? FILE_DROPPING_Y : mouse_my; var _my = mouse_mys;
if(con && point_in_rectangle(_mx, _my, x + ui(2), y + ui(2), x + w - ui(4), y + h - ui(4))) { if(con && point_in_rectangle(_mx, _my, x + ui(2), y + ui(2), x + w - ui(4), y + h - ui(4))) {
HOVER = self; HOVER = self;
@ -663,8 +663,8 @@ function Panel(_parent, _x, _y, _w, _h) constructor {
if(tab) drawTab(); if(tab) drawTab();
var _mx = FILE_IS_DROPPING? FILE_DROPPING_X : mouse_mx; var _mx = mouse_mxs;
var _my = FILE_IS_DROPPING? FILE_DROPPING_Y : mouse_my; var _my = mouse_mys;
var p = ui(6); var p = ui(6);
var m_in = point_in_rectangle(_mx, _my, tx + p, ty + p, tx + tw - p, ty + th - p); var m_in = point_in_rectangle(_mx, _my, tx + p, ty + p, tx + tw - p, ty + th - p);

View file

@ -2463,8 +2463,8 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
var _gy = my / graph_s - graph_y; var _gy = my / graph_s - graph_y;
var _node_hover = noone; var _node_hover = noone;
var _mx = (FILE_IS_DROPPING? FILE_DROPPING_X : mouse_mx) - x; var _mx = mouse_mxs - x;
var _my = (FILE_IS_DROPPING? FILE_DROPPING_Y : mouse_my) - y; var _my = mouse_mys - y;
for(var i = 0; i < array_length(nodes_list); i++) { for(var i = 0; i < array_length(nodes_list); i++) {
var _n = nodes_list[i]; var _n = nodes_list[i];

View file

@ -0,0 +1,207 @@
function Panel_Image_Array_Editor(_junction) : PanelContent() constructor {
title = __txt("Array Editor");
padding = 8;
target = _junction;
data = target.getValue();
w = ui(400);
h = ui(640);
menuOn = -1;
dragging = -1;
drag_spr = -1;
sortAsc = true;
tb_editing = -1;
tb_edit = new textBox(TEXTBOX_INPUT.text, function(str) /*=>*/ {
if(tb_editing == -1) return;
if(!target) return;
data[@ tb_editing] = str;
target.node.triggerRender();
});
tb_edit.font = f_p3;
tb_edit.onDeactivate = function() { tb_editing = -1; }
function apply() { target.setValue(data); target.node.triggerRender(); }
function rearrange(oldindex, newindex) {
if(oldindex == newindex) return;
var val = data[oldindex];
array_delete(data, oldindex, 1);
array_insert(data, newindex, val);
apply();
}
function sortByName() {
if(!target) return 0;
array_sort(data, bool(sortAsc));
sortAsc = !sortAsc;
apply();
}
function onResize() { sp_content.resize(w - ui(padding + padding), h - ui(padding + padding)); }
sp_content = new scrollPane(w - ui(padding + padding), h - ui(padding + padding), function(_y, _m) {
if(!target) return 0;
draw_clear_alpha(CDEF.main_mdblack, 1);
var _h = ui(8);
var itw = ui(320);
var ith = ui(64);
var its = ui(64);
var pad = ui(16);
var len = array_length(data);
var col = max(1, floor((sp_content.surface_w - pad) / (itw + pad)));
var row = ceil(len / col);
itw = (sp_content.surface_w - pad) / col - pad;
var yy = _y;
var drag = -1;
var inb_hover = -1;
for( var i = 0; i < row; i++ ) {
var ch = ith;
for( var j = 0; j < col; j++ ) {
var index = i * col + j;
if(index >= len) break;
var path = data[index];
var xx = (itw + pad) * j;
draw_sprite_stretched(THEME.ui_panel_bg, 0, xx, yy, its, its);
draw_sprite_stretched_add(THEME.ui_panel, 1, xx, yy, its, its, c_white, 0.2);
if(sp_content.hover && point_in_rectangle(_m[0], _m[1], xx, yy, xx + its, yy + its)) {
sp_content.hover_content = true;
inb_hover = index;
if(dragging == -1 || dragging == index)
draw_sprite_stretched_ext(THEME.ui_panel, 1, xx, yy, its, its, COLORS._main_accent, 1);
if(mouse_press(mb_left, sp_content.active))
dragging = index;
}
var spr = struct_try_get(SPRITE_PATH_MAP, path, noone);
if(spr == noone || !sprite_exists(spr))
spr = s_texture_default;
var spr_w = sprite_get_width(spr);
var spr_h = sprite_get_height(spr);
var spr_s = min((its - ui(16)) / spr_w, (its - ui(16)) / spr_h);
var spr_x = xx + its / 2 - spr_w * spr_s / 2;
var spr_y = yy + its / 2 - spr_h * spr_s / 2;
var aa = dragging == -1? 1 : (dragging == index? 1 : 0.5);
draw_sprite_ext(spr, 0, spr_x, spr_y, spr_s, spr_s, 0, c_white, aa);
draw_set_text(f_p1, fa_left, fa_top, COLORS._main_text);
var name = filename_name_only(path);
var txt_h = string_height_ext(name, -1, itw);
var _txtx = xx + its + ui(16);
var _txty = yy + ui(4);
draw_text_ext_add(_txtx, _txty, name, -1, itw);
var _txth = line_get_height(f_p3, 4);
var _txty = yy + its - _txth;
draw_set_text(f_p3, fa_left, fa_top, COLORS._main_text_sub);
draw_text_add(_txtx, _txty, path);
var _pthx = _txtx - ui(8);
var _pthy = _txty - ui(2);
var _pthw = itw - its - ui(16) + ui(8);
var _pthh = _txth;
if(tb_editing == i) {
tb_edit.setFocusHover(sp_content.active, sp_content.hover);
tb_edit.draw(_pthx, _pthy, _pthw, _pthh, path, _m);
}
if(sp_content.hover && point_in_rectangle(_m[0], _m[1], _pthx, _pthy, _pthx + _pthw, _pthy + _pthh)) {
draw_sprite_stretched_add(THEME.ui_panel, 1, _pthx, _pthy, _pthw, _pthh, COLORS._main_icon, 0.2);
if(mouse_press(mb_left, sp_content.active)) {
tb_editing = i;
tb_edit.activate(path);
}
}
ch = max(ch, ith + ui(8));
}
yy += ch;
_h += ch;
}
if(dragging != -1) {
if(inb_hover != -1) {
rearrange(dragging, inb_hover);
dragging = inb_hover;
}
if(mouse_release(mb_left))
dragging = -1;
}
if(mouse_press(mb_right, sp_content.active)) {
menuOn = inb_hover;
if(inb_hover == -1) {
menuCall("image_array_edit_menu_empty", [
menuItem(__txt("Add") + "...", function() /*=>*/ {
var path = get_open_filenames_compat("image|*.png;*.jpg", "");
if(path == "") return;
var paths = string_splice(path, "\n");
array_append(data, paths);
apply();
}, THEME.add),
menuItem(__txt("Sort"), function() /*=>*/ { sortByName(); }, THEME.text)
]);
} else {
menuCall("image_array_edit_menu", [
menuItem(__txt("Remove"), function() /*=>*/ { array_delete(data, menuOn, 1); apply(); }, THEME.cross)
]);
}
}
return _h;
});
function drawContent(panel) {
draw_clear_alpha(COLORS.panel_bg_clear, 0);
var px = ui(padding);
var py = ui(padding);
var pw = w - ui(padding + padding);
var ph = h - ui(padding + padding);
var msx = mx - px;
var msy = my - py;
draw_sprite_stretched(THEME.ui_panel_bg, 1, px - ui(8), py - ui(8), pw + ui(16), ph + ui(16));
sp_content.setFocusHover(pFOCUS, pHOVER);
sp_content.draw(px, py, msx, msy);
if(pHOVER) {
if(FILE_IS_DROPPING) draw_sprite_stretched_ext(THEME.ui_panel_selection, 0, 8, 8, w - 16, h - 16, COLORS._main_value_positive, 1);
if(FILE_DROPPED && !array_empty(FILE_DROPPING)) {
array_append(data, FILE_DROPPING);
apply();
}
}
}
}

View file

@ -0,0 +1,13 @@
{
"$GMScript":"",
"%Name":"panel_image_array_editor",
"isCompatibility":false,
"isDnD":false,
"name":"panel_image_array_editor",
"parent":{
"name":"nodes",
"path":"folders/panels/nodes.yy",
},
"resourceType":"GMScript",
"resourceVersion":"2.0",
}

View file

@ -13,8 +13,7 @@ function pathArrayBox(_target, _data, _onClick) : widget() constructor {
}, THEME.button_path_icon); }, THEME.button_path_icon);
static trigger = function() { static trigger = function() {
with(dialogCall(o_dialog_image_array_edit, WIN_W / 2, WIN_H / 2)) dialogPanelCall(new Panel_Image_Array_Editor(target));
target = other.target;
} }
static drawParam = function(params) { static drawParam = function(params) {