ui/common/context.c

changeset 1200
abb4d3851061
parent 1198
5bb4366b0c32
--- a/ui/common/context.c	Sun Jun 14 11:17:45 2026 +0200
+++ b/ui/common/context.c	Sun Jun 14 12:10:34 2026 +0200
@@ -196,6 +196,7 @@
         event.document = document;
         doc_ctx->onattach(&event, doc_ctx->onattachdata);
     }
+    uic_send_status_change(doc_ctx);
 }
 
 static void uic_context_unbind_vars(UiContext *ctx) {
@@ -242,7 +243,6 @@
     UiContext *doc_ctx = ui_document_context(document);
     uic_context_unbind_vars(doc_ctx); // unbind all doc/subdoc vars from the parent
     doc_ctx->parent = NULL;
-    ui_document_unref(document);
     
     ui_update_action_bindings(ctx);
     if(doc_ctx->ondetach) {
@@ -251,6 +251,9 @@
         event.document = document;
         doc_ctx->ondetach(&event, doc_ctx->ondetachdata);
     }
+    
+    uic_send_status_change(doc_ctx);
+    ui_document_unref(document);
 }
 
 void uic_context_detach_all(UiContext *ctx) {
@@ -265,12 +268,40 @@
     i = cxListIterator(ls);
     cx_foreach(void *, doc, i) {
         uic_context_detach_document(ctx, doc);
+        uic_send_status_change(ui_document_context(doc));
     }
     
     cxListFree(ls);
     ui_update_action_bindings(ctx);
 }
 
+static void send_status_change(UiContext *ctx, UiEvent *event) {
+    CxIterator i = cxListIterator(ctx->documents);
+    cx_foreach(void *, doc, i) {
+        UiContext *doc_ctx = ui_document_context(doc);
+        if(doc_ctx->onattachmentstatuschange) {
+            event->obj = doc_ctx->obj;
+            event->window = event->obj ? event->obj->window : NULL;
+            event->document = doc_ctx->self_doc ? doc_ctx->self_doc : doc_ctx->document;
+            doc_ctx->onattachmentstatuschange(event, doc_ctx->onattachmentstatuschangedata);
+        }
+    }
+    
+    if(ctx->onattachmentstatuschange) {
+        event->obj = ctx->obj;
+        event->window = event->obj ? event->obj->window : NULL;
+        event->document = ctx->self_doc ? ctx->self_doc : ctx->document;
+        ctx->onattachmentstatuschange(event, ctx->onattachmentstatuschangedata);
+    }
+}
+
+void uic_send_status_change(UiContext *ctx) {
+    UiEvent event;
+    memset(&event, 0, sizeof(UiEvent));
+    send_status_change(ctx, &event);
+}
+
+
 static UiVar* ctx_getvar(UiContext *ctx, CxHashKey key) {
     UiVar *var = cxMapGet(ctx->vars, key);
     if(!var && ctx->documents) {
@@ -956,6 +987,11 @@
     ctx->ondetachdata = data;
 }
 
+void ui_context_onattachmentstatuschange(UiContext *ctx, ui_callback cb, void *data) {
+    ctx->onattachmentstatuschange = cb;
+    ctx->onattachmentstatuschangedata = data;
+}
+
 static void attachment_action_callback(UiEvent *event, void *action) {
     if(event->document) {
         UiContext *ctx = ui_document_context(event->document);
@@ -972,3 +1008,23 @@
     ctx->ondetach = attachment_action_callback;
     ctx->ondetachdata = ui_strdup(ctx, action);
 }
+
+void ui_context_onattachmentstatuschange_action(UiContext *ctx, const char *action) {
+    ctx->onattachmentstatuschange = attachment_action_callback;
+    ctx->onattachmentstatuschangedata = ui_strdup(ctx, action);
+}
+
+
+int ui_context_is_attached(UiContext *ctx) {
+    return ctx->parent != NULL;
+}
+
+int ui_context_is_attached_to_obj(UiContext *ctx) {
+    if(ctx->obj) {
+        return TRUE;
+    }
+    if(ctx->parent == NULL) {
+        return FALSE;
+    }
+    return ui_context_is_attached_to_obj(ctx->parent);
+}

mercurial