DVUI

deinit

This deinit function returns an error because of the additional texture handling it requires.

Parameters

#
self:*CacheWidget
*CacheWidget

Source

Implementation

#
pub fn deinit(self: *CacheWidget) void {
    defer if (dvui.widgetIsAllocated(self)) dvui.widgetFree(self);
    defer self.* = undefined;
    const cw = dvui.currentWindow();
    if (self.state == .ok and self.uncached()) {
        if (dvui.currentWindow().extra_frames_needed == 0) {
            dvui.dataSet(null, self.data().id, "_cache_now", true);
            dvui.refresh(null, @src(), self.data().id);
        }
    }
    cw.extra_frames_needed = @max(cw.extra_frames_needed, self.refresh_prev_value);

    if (self.old_clip) |clip| {
        dvui.clipSet(clip);
    }
    if (self.caching_tex) |tex| blk: {
        _ = dvui.renderTarget(self.old_target);

        // convert texture target to normal texture, destroys self.caching_tex
        const texture = dvui.textureFromTarget(tex) catch |err| {
            dvui.logError(@src(), err, "Could not get texture from caching target", .{});
            break :blk;
        };
        dvui.textureAddToCache(self.hash, texture);
        dvui.textureRetainToken(self.hash, self.init_opts.retain);
        // draw texture so we see it this frame
        self.drawCachedTexture(texture);

        dvui.dataSet(null, self.data().id, "_tex_uv", self.tex_uv);
        dvui.data.retainToken(null, .widget(self.data().id, "_tex_uv"), self.init_opts.retain);
        dvui.dataRemove(null, self.data().id, "_cache_now");
    }
    self.data().minSizeSetAndRefresh();
    self.data().minSizeReportToParent();
    dvui.parentReset(self.data().id, self.data().parent);
}