mirror of
https://github.com/ocornut/imgui.git
synced 2025-04-14 09:10:53 +00:00
Add some RAII wrappers for ImGui calls
This commit is contained in:
parent
fbfe193fcd
commit
56433308db
2 changed files with 180 additions and 0 deletions
106
extract_raii.rb
Normal file
106
extract_raii.rb
Normal file
|
@ -0,0 +1,106 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
$VERBOSE = 2
|
||||
|
||||
INDENT = ' ' * 4
|
||||
|
||||
puts <<EOT
|
||||
#include "imgui.h"
|
||||
|
||||
#pragma once
|
||||
|
||||
EOT
|
||||
|
||||
$current_match = nil
|
||||
$class_name = nil
|
||||
$pop_body = nil
|
||||
|
||||
def close_class
|
||||
pop_body = case $current_match[:name]
|
||||
when 'Begin' then 'if (IsOpen) ImGui::End();'
|
||||
when /^Tree/ then 'if (IsOpen) ImGui::TreePop();'
|
||||
when /^PushID$/ then 'ImGui::PopID();'
|
||||
else fail "Don't know what pop body to use"
|
||||
end
|
||||
|
||||
puts "#{INDENT}~#{$class_name}() { #{pop_body} }"
|
||||
|
||||
if $current_match[:type] == 'bool'
|
||||
puts
|
||||
puts "#{INDENT}operator bool() { return IsOpen; }"
|
||||
end
|
||||
|
||||
puts "};"
|
||||
end
|
||||
|
||||
header_file = File.open("imgui.h")
|
||||
header_file.each_line do |line|
|
||||
line.match(/^\s*IMGUI_API\s+(?<type>[\w\s]+\w)\s+(?<name>\w*)\((?<args>[^)]+)\)(?<attrs>[^;]*);(?<rest>.*)$/) do |m|
|
||||
next unless m[:name].match(/^(Begin|Push|Open|Tree|Column)/)
|
||||
next unless m[:name].match(/^TreeNode|PushID|Begin$/)
|
||||
|
||||
argnames = m[:args].split(/,\s*/).map do |arg|
|
||||
arg = arg.split(/\s*=\s*/, 2).first
|
||||
arg.split(/[ \*]/).last
|
||||
end
|
||||
|
||||
# Check for obsolete
|
||||
if m[:name] == 'Begin' &&
|
||||
(argnames == %w{name p_open size_on_first_use bg_alpha_override flags} ||
|
||||
argnames == %w{items_count items_height})
|
||||
next
|
||||
end
|
||||
|
||||
$stderr.puts m.inspect if $-d
|
||||
|
||||
fail "Return value #{m[:type]} is not bool or void" unless %w{bool void}.include?(m[:type])
|
||||
|
||||
if !$current_match || $current_match[:name] != m[:name]
|
||||
if $current_match
|
||||
close_class
|
||||
puts
|
||||
end
|
||||
|
||||
$current_match = m
|
||||
$class_name = case m[:name]
|
||||
when 'Begin' then 'ImWindow'
|
||||
else "Im#{m[:name]}"
|
||||
end
|
||||
|
||||
puts <<EOT
|
||||
class #{$class_name}
|
||||
{
|
||||
public:
|
||||
EOT
|
||||
if m[:type] == 'bool'
|
||||
puts "#{INDENT}#{m[:type]} IsOpen;"
|
||||
puts
|
||||
end
|
||||
end
|
||||
|
||||
attrs = m[:attrs].gsub(/IM_FMT(ARGS|LIST)\(\d+\)/) do |a|
|
||||
a.sub(/\d+/) { |index| (index.to_i + 1).to_s }
|
||||
end
|
||||
|
||||
print "#{INDENT}#{$class_name}(#{m[:args]})#{attrs} { "
|
||||
|
||||
use_varargs = false
|
||||
if argnames.last == '...'
|
||||
argnames[-1] = 'ap'
|
||||
use_varargs = true
|
||||
print "va_list ap; va_start(ap, fmt); "
|
||||
end
|
||||
|
||||
print "IsOpen = " if m[:type] == 'bool'
|
||||
|
||||
print "ImGui::#{m[:name]}"
|
||||
print 'V' if use_varargs
|
||||
print "(#{argnames.join(', ')}); "
|
||||
print 'va_end(ap); ' if use_varargs
|
||||
|
||||
puts '}'
|
||||
end
|
||||
end
|
||||
|
||||
close_class if $current_match
|
||||
|
74
imgui_raii.h
Normal file
74
imgui_raii.h
Normal file
|
@ -0,0 +1,74 @@
|
|||
#include "imgui.h"
|
||||
|
||||
#pragma once
|
||||
|
||||
class ImWindow
|
||||
{
|
||||
public:
|
||||
bool IsOpen;
|
||||
|
||||
ImWindow(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0) { IsOpen = ImGui::Begin(name, p_open, flags); }
|
||||
~ImWindow() { if (IsOpen) ImGui::End(); }
|
||||
|
||||
operator bool() { return IsOpen; }
|
||||
};
|
||||
|
||||
class ImPushID
|
||||
{
|
||||
public:
|
||||
ImPushID(const char* str_id) { ImGui::PushID(str_id); }
|
||||
ImPushID(const char* str_id_begin, const char* str_id_end) { ImGui::PushID(str_id_begin, str_id_end); }
|
||||
ImPushID(const void* ptr_id) { ImGui::PushID(ptr_id); }
|
||||
ImPushID(int int_id) { ImGui::PushID(int_id); }
|
||||
~ImPushID() { ImGui::PopID(); }
|
||||
};
|
||||
|
||||
class ImTreeNode
|
||||
{
|
||||
public:
|
||||
bool IsOpen;
|
||||
|
||||
ImTreeNode(const char* label) { IsOpen = ImGui::TreeNode(label); }
|
||||
ImTreeNode(const char* str_id, const char* fmt, ...) IM_FMTARGS(3) { va_list ap; va_start(ap, fmt); IsOpen = ImGui::TreeNodeV(str_id, fmt, ap); va_end(ap); }
|
||||
ImTreeNode(const void* ptr_id, const char* fmt, ...) IM_FMTARGS(3) { va_list ap; va_start(ap, fmt); IsOpen = ImGui::TreeNodeV(ptr_id, fmt, ap); va_end(ap); }
|
||||
~ImTreeNode() { if (IsOpen) ImGui::TreePop(); }
|
||||
|
||||
operator bool() { return IsOpen; }
|
||||
};
|
||||
|
||||
class ImTreeNodeV
|
||||
{
|
||||
public:
|
||||
bool IsOpen;
|
||||
|
||||
ImTreeNodeV(const char* str_id, const char* fmt, va_list args) IM_FMTLIST(3) { IsOpen = ImGui::TreeNodeV(str_id, fmt, args); }
|
||||
ImTreeNodeV(const void* ptr_id, const char* fmt, va_list args) IM_FMTLIST(3) { IsOpen = ImGui::TreeNodeV(ptr_id, fmt, args); }
|
||||
~ImTreeNodeV() { if (IsOpen) ImGui::TreePop(); }
|
||||
|
||||
operator bool() { return IsOpen; }
|
||||
};
|
||||
|
||||
class ImTreeNodeEx
|
||||
{
|
||||
public:
|
||||
bool IsOpen;
|
||||
|
||||
ImTreeNodeEx(const char* label, ImGuiTreeNodeFlags flags = 0) { IsOpen = ImGui::TreeNodeEx(label, flags); }
|
||||
ImTreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(4) { va_list ap; va_start(ap, fmt); IsOpen = ImGui::TreeNodeExV(str_id, flags, fmt, ap); va_end(ap); }
|
||||
ImTreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(4) { va_list ap; va_start(ap, fmt); IsOpen = ImGui::TreeNodeExV(ptr_id, flags, fmt, ap); va_end(ap); }
|
||||
~ImTreeNodeEx() { if (IsOpen) ImGui::TreePop(); }
|
||||
|
||||
operator bool() { return IsOpen; }
|
||||
};
|
||||
|
||||
class ImTreeNodeExV
|
||||
{
|
||||
public:
|
||||
bool IsOpen;
|
||||
|
||||
ImTreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(4) { IsOpen = ImGui::TreeNodeExV(str_id, flags, fmt, args); }
|
||||
ImTreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(4) { IsOpen = ImGui::TreeNodeExV(ptr_id, flags, fmt, args); }
|
||||
~ImTreeNodeExV() { if (IsOpen) ImGui::TreePop(); }
|
||||
|
||||
operator bool() { return IsOpen; }
|
||||
};
|
Loading…
Add table
Reference in a new issue