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);
}