From 02b6a905174f9588524024327a688bf52fd948e5 Mon Sep 17 00:00:00 2001 From: Guillem <guillembartrina@gmail.com> Date: Wed, 26 Aug 2020 11:33:56 +0200 Subject: [PATCH] clean up code. clicking on the warning symbol now opens all the related dirty canvas --- pd/nw/pdgui.js | 2 ++ pd/src/g_canvas.c | 62 +++++++++++++++++++++++++++++------------------ 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js index 9706f2072..951cede88 100644 --- a/pd/nw/pdgui.js +++ b/pd/nw/pdgui.js @@ -2679,12 +2679,14 @@ function gui_canvas_warning(cid, warid) { break; case 1: warning.title = lang.get_local_string("canvas.warning.unsaved_tt"); + warning.onclick = function(){ pdsend(cid, "showdirty"); } warning.style.setProperty("color", "coral"); warning.style.setProperty("font-size", "x-large"); warning.style.setProperty("display", "inline"); break; case 2: warning.title = lang.get_local_string("canvas.warning.multipleunsaved_tt"); + warning.onclick = function(){ pdsend(cid, "showdirty"); } warning.style.setProperty("color", "red"); warning.style.setProperty("font-size", "xx-large"); warning.style.setProperty("display", "inline"); diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c index cded911e6..d4961a0a1 100644 --- a/pd/src/g_canvas.c +++ b/pd/src/g_canvas.c @@ -816,6 +816,26 @@ int clone_match(t_pd *z, t_symbol *name, t_symbol *dir); int clone_isab(t_pd *z); int clone_matchab(t_pd *z, t_ab_definition *source); +static void canvas_dirty_common(t_canvas *x, int mess) +{ + if(mess == 2) + { + if(x->gl_dirty) + { + if(!x->gl_havewindow) canvas_vis(x, 1); + gui_vmess("gui_canvas_emphasize", "x", x); + } + } + else + { + x->gl_dirties += mess; + if(x->gl_havewindow) + canvas_warning(x, (x->gl_dirties > 1 ? + (x->gl_dirty ? 2 : 1) + : (x->gl_dirties ? !x->gl_dirty : 0))); + } +} + /* packed data passing structure for canvas_dirty_broadcast */ typedef struct _dirty_broadcast_data { @@ -828,11 +848,7 @@ typedef struct _dirty_broadcast_data static void canvas_dirty_deliver_packed(t_canvas *x, t_dirty_broadcast_data *data) { *data->res += (x->gl_dirty > 0); - x->gl_dirties += data->mess; - if(x->gl_havewindow) - canvas_warning(x, (x->gl_dirties > 1 ? - (x->gl_dirty ? 2 : 1) - : (x->gl_dirties ? !x->gl_dirty : 0))); + canvas_dirty_common(x, data->mess); } static int canvas_dirty_broadcast_packed(t_canvas *x, t_dirty_broadcast_data *data); @@ -849,13 +865,8 @@ static int canvas_dirty_broadcast(t_canvas *x, t_symbol *name, t_symbol *dir, in && ((t_canvas *)g)->gl_name == name && canvas_getdir((t_canvas *)g) == dir) { - t_canvas *z = (t_canvas *)g; - res += (z->gl_dirty > 0); - z->gl_dirties += mess; - if(z->gl_havewindow) - canvas_warning(z, (z->gl_dirties > 1 ? - (z->gl_dirty ? 2 : 1) - : (z->gl_dirties ? !z->gl_dirty : 0))); + res += (((t_canvas *)g)->gl_dirty > 0); + canvas_dirty_common((t_canvas *)g, mess); } else res += canvas_dirty_broadcast((t_canvas *)g, name, dir, mess); @@ -905,11 +916,7 @@ typedef struct _dirty_broadcast_ab_data static void canvas_dirty_deliver_ab_packed(t_canvas *x, t_dirty_broadcast_ab_data *data) { *data->res += (x->gl_dirty > 0); - x->gl_dirties += data->mess; - if(x->gl_havewindow) - canvas_warning(x, (x->gl_dirties > 1 ? - (x->gl_dirty ? 2 : 1) - : (x->gl_dirties ? !x->gl_dirty : 0))); + canvas_dirty_common(x, data->mess); } static int canvas_dirty_broadcast_ab_packed(t_canvas *x, t_dirty_broadcast_ab_data *data); @@ -925,13 +932,8 @@ static int canvas_dirty_broadcast_ab(t_canvas *x, t_ab_definition *abdef, int me if(canvas_isabstraction((t_canvas *)g) && ((t_canvas *)g)->gl_isab && ((t_canvas *)g)->gl_absource == abdef) { - t_canvas *z = (t_canvas *)g; - res += (z->gl_dirty > 0); - z->gl_dirties += mess; - if(z->gl_havewindow) - canvas_warning(z, (z->gl_dirties > 1 ? - (z->gl_dirty ? 2 : 1) - : (z->gl_dirties ? !z->gl_dirty : 0))); + res += (((t_canvas *)g)->gl_dirty > 0); + canvas_dirty_common((t_canvas *)g, mess); } else res += canvas_dirty_broadcast_ab((t_canvas *)g, abdef, mess); @@ -2712,6 +2714,16 @@ static void abdefs_dialog(t_abdefs *x, t_symbol *s, int argc, t_atom *argv) gfxstub_deleteforkey(x); } +/* --------- */ + +static void canvas_showdirty(t_canvas *x) +{ + if(!x->gl_isab) + canvas_dirty_broadcast_all(x->gl_name, canvas_getdir(x), 2); + else + canvas_dirty_broadcast_ab_all(x->gl_absource, 2); +} + /* ------------------------------- declare ------------------------ */ /* put "declare" objects in a patch to tell it about the environment in @@ -3570,6 +3582,8 @@ void g_canvas_setup(void) class_addmethod(abdefs_class, (t_method)abdefs_menuopen, gensym("menu-open"), 0); class_addmethod(abdefs_class, (t_method)abdefs_dialog, gensym("dialog"), A_GIMME, 0); + class_addmethod(canvas_class, (t_method)canvas_showdirty, + gensym("showdirty"), 0); /*---------------------------- declare ------------------- */ declare_class = class_new(gensym("declare"), (t_newmethod)declare_new, (t_method)declare_free, sizeof(t_declare), CLASS_NOINLET, A_GIMME, 0); -- GitLab