diff --git a/.gitignore b/.gitignore index 0159e18f4..81bf07aa9 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,6 @@ sprites/BBMOD* *.DS_Store fonts/_f_sdf/_f_sdf.yy -fonts/_f_sdf_medium/_f_sdf_medium.yy \ No newline at end of file +fonts/_f_sdf_medium/_f_sdf_medium.yy + +__KEYS_PRIVATE \ No newline at end of file diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index ae21547fe..6c89abaed 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -550,6 +550,7 @@ {"name":"luaHighlight","order":1,"path":"scripts/luaHighlight/luaHighlight.yy",}, {"name":"mac_window_step","order":1,"path":"scripts/mac_window_step/mac_window_step.yy",}, {"name":"mask_function","order":1,"path":"scripts/mask_function/mask_function.yy",}, + {"name":"materialBox","order":14,"path":"scripts/materialBox/materialBox.yy",}, {"name":"math_function","order":3,"path":"scripts/math_function/math_function.yy",}, {"name":"matrixGrid","order":6,"path":"scripts/matrixGrid/matrixGrid.yy",}, {"name":"meta_data","order":12,"path":"scripts/meta_data/meta_data.yy",}, @@ -1102,6 +1103,7 @@ {"name":"safe_operation","order":6,"path":"scripts/safe_operation/safe_operation.yy",}, {"name":"sample_projects","order":6,"path":"scripts/sample_projects/sample_projects.yy",}, {"name":"save_function","order":1,"path":"scripts/save_function/save_function.yy",}, + {"name":"__KEYS_PRIVATE","order":21,"path":"scripts/__KEYS_PRIVATE/__KEYS_PRIVATE.yy",}, {"name":"scrollBox","order":2,"path":"scripts/scrollBox/scrollBox.yy",}, {"name":"scrollPane","order":3,"path":"scripts/scrollPane/scrollPane.yy",}, {"name":"shell_functions","order":20,"path":"scripts/shell_functions/shell_functions.yy",}, @@ -1121,7 +1123,6 @@ {"name":"surface_get_palette","order":2,"path":"scripts/surface_get_palette/surface_get_palette.yy",}, {"name":"surface_valid","order":5,"path":"scripts/surface_valid/surface_valid.yy",}, {"name":"surfaceBox","order":4,"path":"scripts/surfaceBox/surfaceBox.yy",}, - {"name":"materialBox","order":14,"path":"scripts/materialBox/materialBox.yy",}, {"name":"text_file","order":5,"path":"scripts/text_file/text_file.yy",}, {"name":"textArrayBox","order":1,"path":"scripts/textArrayBox/textArrayBox.yy",}, {"name":"textBox","order":2,"path":"scripts/textBox/textBox.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index 834e07c25..45504cb26 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -943,6 +943,7 @@ {"id":{"name":"mac_window_init","path":"scripts/mac_window_init/mac_window_init.yy",},}, {"id":{"name":"mac_window_step","path":"scripts/mac_window_step/mac_window_step.yy",},}, {"id":{"name":"mask_function","path":"scripts/mask_function/mask_function.yy",},}, + {"id":{"name":"materialBox","path":"scripts/materialBox/materialBox.yy",},}, {"id":{"name":"math_function","path":"scripts/math_function/math_function.yy",},}, {"id":{"name":"matrixGrid","path":"scripts/matrixGrid/matrixGrid.yy",},}, {"id":{"name":"meta_data","path":"scripts/meta_data/meta_data.yy",},}, @@ -1579,6 +1580,7 @@ {"id":{"name":"safe_operation","path":"scripts/safe_operation/safe_operation.yy",},}, {"id":{"name":"sample_projects","path":"scripts/sample_projects/sample_projects.yy",},}, {"id":{"name":"save_function","path":"scripts/save_function/save_function.yy",},}, + {"id":{"name":"__KEYS_PRIVATE","path":"scripts/__KEYS_PRIVATE/__KEYS_PRIVATE.yy",},}, {"id":{"name":"scrollBox","path":"scripts/scrollBox/scrollBox.yy",},}, {"id":{"name":"scrollPane","path":"scripts/scrollPane/scrollPane.yy",},}, {"id":{"name":"shader_functions","path":"scripts/shader_functions/shader_functions.yy",},}, @@ -1604,7 +1606,6 @@ {"id":{"name":"surface_get_palette","path":"scripts/surface_get_palette/surface_get_palette.yy",},}, {"id":{"name":"surface_valid","path":"scripts/surface_valid/surface_valid.yy",},}, {"id":{"name":"surfaceBox","path":"scripts/surfaceBox/surfaceBox.yy",},}, - {"id":{"name":"materialBox","path":"scripts/materialBox/materialBox.yy",},}, {"id":{"name":"testing_script","path":"scripts/testing_script/testing_script.yy",},}, {"id":{"name":"text_file","path":"scripts/text_file/text_file.yy",},}, {"id":{"name":"textArea","path":"scripts/textArea/textArea.yy",},}, diff --git a/objects/o_dialog_release_note/Alarm_0.gml b/objects/o_dialog_release_note/Alarm_0.gml deleted file mode 100644 index 8e3f83eed..000000000 --- a/objects/o_dialog_release_note/Alarm_0.gml +++ /dev/null @@ -1,7 +0,0 @@ -/// @description init -#region size - draw_set_font(f_p0); -#endregion - -event_inherited(); - diff --git a/objects/o_dialog_release_note/Create_0.gml b/objects/o_dialog_release_note/Create_0.gml index 27ef4b0da..da6d82e89 100644 --- a/objects/o_dialog_release_note/Create_0.gml +++ b/objects/o_dialog_release_note/Create_0.gml @@ -6,14 +6,18 @@ event_inherited(); dialog_h = ui(480); destroy_on_click_out = true; - note = ""; + pages = [ "Release note", "Downloads" ]; + page = 0; - var _link = $"https://gist.githubusercontent.com/Ttanasart-pt/f21a140906a60c6e12c99ebfecec1645/raw/{VERSION_STRING}"; - note_get = http_get(_link); +#endregion + +#region note + note_get = http_get($"https://gist.githubusercontent.com/Ttanasart-pt/f21a140906a60c6e12c99ebfecec1645/raw/{VERSION_STRING}"); + note = ""; sp_note = new scrollPane(dialog_w - ui(80), dialog_h - ui(88), function(_y, _m) { - draw_clear_alpha(COLORS.panel_bg_clear, 0); - BLEND_ALPHA_MULP + draw_clear_alpha(COLORS.dialog_splash_badge, 1); + var xx = ui(8); var yy = ui(8); var ww = sp_note.surface_w - ui(16); @@ -103,7 +107,81 @@ event_inherited(); } } - BLEND_NORMAL return yy + ui(64); }) +#endregion + +#region downloads + dl_get = http_get(global.KEYS.download_links); + dls = []; + downloading = {}; + + sp_dl = new scrollPane(dialog_w - ui(80), dialog_h - ui(88), function(_y, _m) { + draw_clear_alpha(COLORS.dialog_splash_badge, 1); + + var xx = ui(8); + var yy = _y + ui(8); + + var ww = sp_dl.surface_w - ui(16); + var hh = ui(56); + + for( var i = 0, n = array_length(dls); i < n; i++ ) { + var dl = dls[i]; + var vr = dl.version; + hh = dl.status? ui(56) : ui(36); + + var hov = sHOVER && point_in_rectangle(_m[0], _m[1], xx, yy, xx + ww, yy + hh); + + draw_sprite_stretched(THEME.ui_panel_bg, 0, xx, yy, ww, hh); + + if(dl.status == 0 && hov) { + draw_sprite_stretched_ext(THEME.ui_panel_fg, 1, xx, yy, ww, hh, COLORS._main_accent, 1); + if(mouse_press(mb_left, sFOCUS)) { + var path = get_save_filename("Compressed zip (.zip)| *.zip", $"PixelComposer {vr}.zip"); + if(path != "") { + dl.status = 1; + dl.download_path = path; + + var _get = http_get_file(dl.link, path); + downloading[$ _get] = dl; + } + } + + } else if(dl.status == 2 && hov) { + draw_sprite_stretched_ext(THEME.ui_panel_fg, 1, xx, yy, ww, hh, COLORS._main_accent, 1); + if(mouse_press(mb_left, sFOCUS)) + shellOpenExplorer(filename_dir(dl.download_path)); + + } else + draw_sprite_stretched_ext(THEME.ui_panel_fg, 1, xx, yy, ww, hh, COLORS.node_display_text_frame_outline, 1); + + draw_set_text(f_p0b, fa_left, fa_top, dl.status == 2? COLORS._main_text : COLORS._main_text_sub); + draw_text(xx + ui(8), yy + ui(8), vr); + + if(dl.status == 1) { + var _bw = ww - ui(16); + var _bh = ui(12); + var _bx = xx + ui(8); + var _by = yy + hh - _bh - ui(8); + var _prg = dl.size_total == 0? 0 : dl.size_downloaded / dl.size_total; + + draw_sprite_stretched(THEME.progress_bar, 0, _bx, _by, _bw, _bh); + draw_sprite_stretched(THEME.progress_bar, 1, _bx, _by, _bw * _prg, _bh); + + } else if(dl.status == 2) { + draw_set_text(f_p1, fa_left, fa_top, COLORS._main_text_sub); + draw_text_cut(xx + ui(8), yy + ui(32), dl.download_path, ww - ui(16)); + } + + if(dl.status) { + draw_set_text(f_p1, fa_right, fa_top, COLORS._main_text_sub); + draw_text(xx + ww - ui(8), yy + ui(10), string_byte_format(dl.size_total)); + + } + + yy += hh + ui(4); + } + + return yy + ui(64) - _y; + }) #endregion \ No newline at end of file diff --git a/objects/o_dialog_release_note/Draw_64.gml b/objects/o_dialog_release_note/Draw_64.gml index 02c8aaf8a..e0ff9f7b2 100644 --- a/objects/o_dialog_release_note/Draw_64.gml +++ b/objects/o_dialog_release_note/Draw_64.gml @@ -8,11 +8,33 @@ if !ready exit; #endregion #region text - draw_set_text(f_p0, fa_left, fa_top, COLORS._main_text); - draw_text(dialog_x + ui(24), dialog_y + ui(16), string(VERSION_STRING) + " Release note"); + var bh = line_get_height(f_p0) + ui(8); + var _x = dialog_x + ui(24); + var _y = dialog_y + ui(16); + + for( var i = 0, n = array_length(pages); i < n; i++ ) { + var r = __txt(pages[i]); + var rw = string_width(r); + + if(buttonInstant(THEME.button_hide_fill, _x - ui(8), _y - ui(4), rw + ui(20), bh, [ mouse_mx, mouse_my ], sFOCUS, sHOVER) == 2) + page = i; + + draw_set_text(f_p0b, fa_left, fa_top, i == page? COLORS._main_text : COLORS._main_text_sub); + draw_text(_x, _y, r); + + _x += string_width(r) + ui(24); + } + draw_sprite_stretched(THEME.ui_panel_bg, 1, dialog_x + ui(24), dialog_y + ui(48), dialog_w - ui(48), dialog_h - ui(72)); - sp_note.setFocusHover(sFOCUS, sHOVER); - sp_note.draw(dialog_x + ui(40), dialog_y + ui(56)); + if(page == 0) { + sp_note.setFocusHover(sFOCUS, sHOVER); + sp_note.draw(dialog_x + ui(40), dialog_y + ui(56)); + + } else if(page == 1) { + sp_dl.setFocusHover(sFOCUS, sHOVER); + sp_dl.draw(dialog_x + ui(40), dialog_y + ui(56)); + + } #endregion \ No newline at end of file diff --git a/objects/o_dialog_release_note/Other_62.gml b/objects/o_dialog_release_note/Other_62.gml index 102974497..9ccdcb7fa 100644 --- a/objects/o_dialog_release_note/Other_62.gml +++ b/objects/o_dialog_release_note/Other_62.gml @@ -1,7 +1,36 @@ /// @description init -if (ds_map_find_value(async_load, "id") == note_get) { - if (ds_map_find_value(async_load, "status") == 0) { +var _id = ds_map_find_value(async_load, "id"); +var _status = ds_map_find_value(async_load, "status"); + +if (_id == note_get) { + if (_status == 0) { note = ds_map_find_value(async_load, "result"); alarm[0] = 1; } + +} else if (_id == dl_get) { + if (_status == 0) { + var res = ds_map_find_value(async_load, "result"); + dls = json_try_parse(res, []); + + for( var i = 0, n = array_length(dls); i < n; i++ ) { + dls[i].status = 0; + dls[i].download_path = ""; + + dls[i].size_total = 0; + dls[i].size_downloaded = 0; + } + } + +} else if ( struct_has(downloading, _id)) { + var dl = downloading[$ _id]; + + if(_status == 0) { + dl.status = 2; + + } else if(_status == 1) { + dl.size_total = ds_map_find_value(async_load, "contentLength"); + dl.size_downloaded = ds_map_find_value(async_load, "sizeDownloaded"); + + } } \ No newline at end of file diff --git a/objects/o_dialog_release_note/o_dialog_release_note.yy b/objects/o_dialog_release_note/o_dialog_release_note.yy index d259803c4..f9681a440 100644 --- a/objects/o_dialog_release_note/o_dialog_release_note.yy +++ b/objects/o_dialog_release_note/o_dialog_release_note.yy @@ -4,7 +4,6 @@ "eventList":[ {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":64,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",}, {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",}, - {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":2,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",}, {"$GMEvent":"","%Name":"","collisionObjectId":null,"eventNum":62,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",}, ], "managed":true, diff --git a/objects/o_main/Other_2.gml b/objects/o_main/Other_2.gml index 4e92191bc..59ec6b540 100644 --- a/objects/o_main/Other_2.gml +++ b/objects/o_main/Other_2.gml @@ -69,6 +69,7 @@ var t = get_timer(); var _lua = PROGRAM_ARGUMENTS._lua; + __initKeys() __initPatreon(); log_message("SESSION", $"> init Patreon | complete in {get_timer() - t}"); t = get_timer(); if(!IS_CMD) { __initTheme(); log_message("SESSION", $"> init Theme | complete in {get_timer() - t}"); t = get_timer(); } if(!IS_CMD) { __initLocale(); log_message("SESSION", $"> init Locale | complete in {get_timer() - t}"); t = get_timer(); } diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index 000f90c6c..52d61f53c 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -45,6 +45,9 @@ HOTKEY_CONTEXT[| 0] = ""; globalvar TOOLTIP, DRAGGING, DIALOG_DEPTH_HOVER; + global.KEYS = { + download_links: "" + }; #endregion #region inputs diff --git a/scripts/node_crop/node_crop.gml b/scripts/node_crop/node_crop.gml index 641ee353c..bbcbe435d 100644 --- a/scripts/node_crop/node_crop.gml +++ b/scripts/node_crop/node_crop.gml @@ -212,9 +212,10 @@ function Node_Crop(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons } #endregion static processData = function(_outSurf, _data, _output_index, _array_index) { #region - var _inSurf = _data[0]; - var _crop = _data[1]; - var _dim = [ surface_get_width_safe(_inSurf) - _crop[0] - _crop[2], surface_get_height_safe(_inSurf) - _crop[1] - _crop[3] ]; + var _inSurf = _data[0]; + var _crop = _data[1]; + var _sdim = surface_get_dimension(_inSurf); + var _dim = [ _sdim[0] - _crop[0] - _crop[2], _sdim[1] - _crop[1] - _crop[3] ]; _outSurf = surface_verify(_outSurf, _dim[0], _dim[1]); diff --git a/scripts/string_formatting/string_formatting.gml b/scripts/string_formatting/string_formatting.gml index 61a683d44..9fb584d79 100644 --- a/scripts/string_formatting/string_formatting.gml +++ b/scripts/string_formatting/string_formatting.gml @@ -7,4 +7,13 @@ function string_lead_zero(val, digit) { ss += string(val); return ss; +} + +function string_byte_format(bytes) { + static suffix = [ "B", "KB", "MB", "GB", "TB" ]; + + var lv = clamp(floor(log2(bytes) / 10), 0, array_length(suffix) - 1); + var amo = bytes / power(2, lv * 10); + + return $"{amo} {suffix[lv]}" } \ No newline at end of file diff --git a/scripts/struct_functions/struct_functions.gml b/scripts/struct_functions/struct_functions.gml index 0049f3d15..4ed9cf5e0 100644 --- a/scripts/struct_functions/struct_functions.gml +++ b/scripts/struct_functions/struct_functions.gml @@ -2,6 +2,8 @@ #macro struct_key variable_struct_get_names function struct_override(original, override) { #region + INLINE + var args = variable_struct_get_names(override); for( var i = 0, n = array_length(args); i < n; i++ ) { @@ -15,11 +17,12 @@ function struct_override(original, override) { #region } #endregion function struct_append(original, append) { #region + INLINE + var args = variable_struct_get_names(append); - for( var i = 0, n = array_length(args); i < n; i++ ) { + for( var i = 0, n = array_length(args); i < n; i++ ) original[$ args[i]] = append[$ args[i]]; - } return original; } #endregion