mirror of
https://github.com/ocornut/imgui.git
synced 2024-12-12 20:19:02 +08:00
Links and thanks. Comments on using BeginCombo/EndCombo + moved the Combo() implementations closer to each others to maximize user seeing how it is implemented from any of the secondary function body.
This commit is contained in:
parent
a765c83bad
commit
665bd1e140
@ -108,7 +108,7 @@ Integrating Dear ImGui within your custom engine is a matter of 1) wiring mouse/
|
|||||||
_NB: those third-party bindings may be more or less maintained, more or less close to the original API (as people who create language bindings sometimes haven't used the C++ API themselves.. for the good reason that they aren't C++ users). Dear ImGui was designed with C++ in mind and some of the subtleties may be lost in translation with other languages. If your language supports it, I would suggest replicating the function overloading and default parameters used in the original, else the API may be harder to use. In doubt, please check the original C++ version first!_
|
_NB: those third-party bindings may be more or less maintained, more or less close to the original API (as people who create language bindings sometimes haven't used the C++ API themselves.. for the good reason that they aren't C++ users). Dear ImGui was designed with C++ in mind and some of the subtleties may be lost in translation with other languages. If your language supports it, I would suggest replicating the function overloading and default parameters used in the original, else the API may be harder to use. In doubt, please check the original C++ version first!_
|
||||||
|
|
||||||
Languages: (third-party bindings)
|
Languages: (third-party bindings)
|
||||||
- C: [cimgui](https://github.com/Extrawurst/cimgui) and [#1879](https://github.com/ocornut/imgui/issues/1879)
|
- C: [cimgui](https://github.com/Extrawurst/cimgui) or [sonoro1234's cimgui](https://github.com/sonoro1234/cimgui) (more recent update), also see [#1879](https://github.com/ocornut/imgui/issues/1879)
|
||||||
- C#/.Net: [ImGui.NET](https://github.com/mellinoe/ImGui.NET)
|
- C#/.Net: [ImGui.NET](https://github.com/mellinoe/ImGui.NET)
|
||||||
- ChaiScript: [imgui-chaiscript](https://github.com/JuJuBoSc/imgui-chaiscript)
|
- ChaiScript: [imgui-chaiscript](https://github.com/JuJuBoSc/imgui-chaiscript)
|
||||||
- D: [DerelictImgui](https://github.com/Extrawurst/DerelictImgui)
|
- D: [DerelictImgui](https://github.com/Extrawurst/DerelictImgui)
|
||||||
@ -316,10 +316,10 @@ Double-chocolate sponsors:
|
|||||||
- DotEmu
|
- DotEmu
|
||||||
|
|
||||||
Salty caramel supporters:
|
Salty caramel supporters:
|
||||||
- Jetha Chan, Wild Sheep Studio, Pastagames, Mārtiņš Možeiko, Daniel Collin, Recognition Robotics, Chris Genova, ikrima, Glenn Fiedler, Geoffrey Evans, Dakko Dakko, Mercury Labs, Singularity Demo Group, Mischa Alff, Sebastien Ronsse, Lionel Landwerlin, Nikolay Ivanov, Ron Gilbert, Brandon Townsend, Nikhil Deshpande, Cort Stratton, drudru.
|
- Jetha Chan, Wild Sheep Studio, Pastagames, Mārtiņš Možeiko, Daniel Collin, Recognition Robotics, Chris Genova, ikrima, Glenn Fiedler, Geoffrey Evans, Dakko Dakko, Mercury Labs, Singularity Demo Group, Mischa Alff, Sebastien Ronsse, Lionel Landwerlin, Nikolay Ivanov, Ron Gilbert, Brandon Townsend, Nikhil Deshpande, Cort Stratton, drudru, Harfang 3D, Supercell.
|
||||||
|
|
||||||
Caramel supporters:
|
Caramel supporters:
|
||||||
- Michel Courtine, César Leblic, Dale Kim, Alex Evans, Rui Figueira, Paul Patrashcu, Jerome Lanquetot, Ctrl Alt Ninja, Paul Fleming, Neil Henning, Stephan Dilly, Neil Blakey-Milner, Aleksei, NeiloGD, Justin Paver, FiniteSol, Vincent Pancaldi, James Billot, Robin Hübner, furrtek, Eric, Simon Barratt, Game Atelier, Julian Bosch, Simon Lundmark, Vincent Hamm, Farhan Wali, Jeff Roberts, Matt Reyer, Colin Riley, Victor Martins, Josh Simmons, Garrett Hoofman, Sergio Gonzales, Andrew Berridge, Roy Eltham, Game Preservation Society, Kit framework, Josh Faust, Martin Donlon, Quinton, Felix, Andrew Belt, Codecat, Cort Stratton, Claudio Canepa, Doug McNabb, Emmanuel Julien, Guillaume Chereau, Jeffrey Slutter, Jeremiah Deckard, r-lyeh, Roger Clark, Nekith, Joshua Fisher, Malte Hoffmann, Mustafa Karaalioglu, Merlyn Morgan-Graham, Per Vognsen, Fabian Giesen, Jan Staubach, Matt Hargett, John Shearer, Jesse Chounard, kingcoopa, Miloš Tošić, Jonas Bernemann, Johan Andersson, Nathan Hartman, Michael Labbe, Tomasz Golebiowski, Louis Schnellbach, Felipe Alfonso, Jimmy Andrews, Bojan Endrovski, Robin Berg Pettersen, Rachel Crawford, Edsel Malasig, Andrew Johnson, Sean Hunter, Jordan Mellow, Nefarius Software Solutions, Laura Wieme, Robert Nix, Mick Honey.
|
- Michel Courtine, César Leblic, Dale Kim, Alex Evans, Rui Figueira, Paul Patrashcu, Jerome Lanquetot, Ctrl Alt Ninja, Paul Fleming, Neil Henning, Stephan Dilly, Neil Blakey-Milner, Aleksei, NeiloGD, Justin Paver, FiniteSol, Vincent Pancaldi, James Billot, Robin Hübner, furrtek, Eric, Simon Barratt, Game Atelier, Julian Bosch, Simon Lundmark, Vincent Hamm, Farhan Wali, Jeff Roberts, Matt Reyer, Colin Riley, Victor Martins, Josh Simmons, Garrett Hoofman, Sergio Gonzales, Andrew Berridge, Roy Eltham, Game Preservation Society, Kit framework, Josh Faust, Martin Donlon, Quinton, Felix, Andrew Belt, Codecat, Cort Stratton, Claudio Canepa, Doug McNabb, Emmanuel Julien, Guillaume Chereau, Jeffrey Slutter, Jeremiah Deckard, r-lyeh, Roger Clark, Nekith, Joshua Fisher, Malte Hoffmann, Mustafa Karaalioglu, Merlyn Morgan-Graham, Per Vognsen, Fabian Giesen, Jan Staubach, Matt Hargett, John Shearer, Jesse Chounard, kingcoopa, Miloš Tošić, Jonas Bernemann, Johan Andersson, Nathan Hartman, Michael Labbe, Tomasz Golebiowski, Louis Schnellbach, Felipe Alfonso, Jimmy Andrews, Bojan Endrovski, Robin Berg Pettersen, Rachel Crawford, Edsel Malasig, Andrew Johnson, Sean Hunter, Jordan Mellow, Nefarius Software Solutions, Laura Wieme, Robert Nix, Mick Honey, Astrofra, Jonas Lehmann, Steven Kah Hien Wong, Bartosz Bielecki.
|
||||||
|
|
||||||
And other supporters; thanks!
|
And other supporters; thanks!
|
||||||
(Please contact me or PR if you would like to be added or removed from this list)
|
(Please contact me or PR if you would like to be added or removed from this list)
|
||||||
|
76
imgui.cpp
76
imgui.cpp
@ -11331,23 +11331,51 @@ void ImGui::EndCombo()
|
|||||||
EndPopup();
|
EndPopup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Getter for the old Combo() API: const char*[]
|
||||||
|
static bool Items_ArrayGetter(void* data, int idx, const char** out_text)
|
||||||
|
{
|
||||||
|
const char* const* items = (const char* const*)data;
|
||||||
|
if (out_text)
|
||||||
|
*out_text = items[idx];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getter for the old Combo() API: "item1\0item2\0item3\0"
|
||||||
|
static bool Items_SingleStringGetter(void* data, int idx, const char** out_text)
|
||||||
|
{
|
||||||
|
// FIXME-OPT: we could pre-compute the indices to fasten this. But only 1 active combo means the waste is limited.
|
||||||
|
const char* items_separated_by_zeros = (const char*)data;
|
||||||
|
int items_count = 0;
|
||||||
|
const char* p = items_separated_by_zeros;
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
if (idx == items_count)
|
||||||
|
break;
|
||||||
|
p += strlen(p) + 1;
|
||||||
|
items_count++;
|
||||||
|
}
|
||||||
|
if (!*p)
|
||||||
|
return false;
|
||||||
|
if (out_text)
|
||||||
|
*out_text = p;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Old API, prefer using BeginCombo() nowadays if you can.
|
// Old API, prefer using BeginCombo() nowadays if you can.
|
||||||
bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int popup_max_height_in_items)
|
bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int popup_max_height_in_items)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
|
|
||||||
const char* preview_text = NULL;
|
// Call the getter to obtain the preview string which is a parameter to BeginCombo()
|
||||||
|
const char* preview_value = NULL;
|
||||||
if (*current_item >= 0 && *current_item < items_count)
|
if (*current_item >= 0 && *current_item < items_count)
|
||||||
items_getter(data, *current_item, &preview_text);
|
items_getter(data, *current_item, &preview_value);
|
||||||
|
|
||||||
// The old Combo() API exposed "popup_max_height_in_items". The new more general BeginCombo() API doesn't, so we emulate it here.
|
// The old Combo() API exposed "popup_max_height_in_items". The new more general BeginCombo() API doesn't have/need it, but we emulate it here.
|
||||||
if (popup_max_height_in_items != -1 && !g.NextWindowData.SizeConstraintCond)
|
if (popup_max_height_in_items != -1 && !g.NextWindowData.SizeConstraintCond)
|
||||||
{
|
SetNextWindowSizeConstraints(ImVec2(0,0), ImVec2(FLT_MAX, CalcMaxPopupHeightFromItemCount(popup_max_height_in_items)));
|
||||||
float popup_max_height = CalcMaxPopupHeightFromItemCount(popup_max_height_in_items);
|
|
||||||
SetNextWindowSizeConstraints(ImVec2(0,0), ImVec2(FLT_MAX, popup_max_height));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!BeginCombo(label, preview_text, 0))
|
if (!BeginCombo(label, preview_value, ImGuiComboFlags_None))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Display items
|
// Display items
|
||||||
@ -11374,34 +11402,6 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi
|
|||||||
return value_changed;
|
return value_changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool Items_ArrayGetter(void* data, int idx, const char** out_text)
|
|
||||||
{
|
|
||||||
const char* const* items = (const char* const*)data;
|
|
||||||
if (out_text)
|
|
||||||
*out_text = items[idx];
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool Items_SingleStringGetter(void* data, int idx, const char** out_text)
|
|
||||||
{
|
|
||||||
// FIXME-OPT: we could pre-compute the indices to fasten this. But only 1 active combo means the waste is limited.
|
|
||||||
const char* items_separated_by_zeros = (const char*)data;
|
|
||||||
int items_count = 0;
|
|
||||||
const char* p = items_separated_by_zeros;
|
|
||||||
while (*p)
|
|
||||||
{
|
|
||||||
if (idx == items_count)
|
|
||||||
break;
|
|
||||||
p += strlen(p) + 1;
|
|
||||||
items_count++;
|
|
||||||
}
|
|
||||||
if (!*p)
|
|
||||||
return false;
|
|
||||||
if (out_text)
|
|
||||||
*out_text = p;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Combo box helper allowing to pass an array of strings.
|
// Combo box helper allowing to pass an array of strings.
|
||||||
bool ImGui::Combo(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items)
|
bool ImGui::Combo(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items)
|
||||||
{
|
{
|
||||||
@ -11409,7 +11409,7 @@ bool ImGui::Combo(const char* label, int* current_item, const char* const items[
|
|||||||
return value_changed;
|
return value_changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Combo box helper allowing to pass all items in a single string.
|
// Combo box helper allowing to pass all items in a single string literal holding multiple zero-terminated items "item1\0item2\0"
|
||||||
bool ImGui::Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int height_in_items)
|
bool ImGui::Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int height_in_items)
|
||||||
{
|
{
|
||||||
int items_count = 0;
|
int items_count = 0;
|
||||||
@ -11424,7 +11424,7 @@ bool ImGui::Combo(const char* label, int* current_item, const char* items_separa
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Tip: pass an empty label (e.g. "##dummy") then you can use the space to draw other text or image.
|
// Tip: pass an empty label (e.g. "##dummy") then you can use the space to draw other text or image.
|
||||||
// But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID.
|
// But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID or use ##unique_id.
|
||||||
bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg)
|
bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg)
|
||||||
{
|
{
|
||||||
ImGuiWindow* window = GetCurrentWindow();
|
ImGuiWindow* window = GetCurrentWindow();
|
||||||
|
2
imgui.h
2
imgui.h
@ -338,7 +338,7 @@ namespace ImGui
|
|||||||
IMGUI_API void Bullet(); // draw a small circle and keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses
|
IMGUI_API void Bullet(); // draw a small circle and keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses
|
||||||
|
|
||||||
// Widgets: Combo Box
|
// Widgets: Combo Box
|
||||||
// The new BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it.
|
// The new BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() items.
|
||||||
// The old Combo() api are helpers over BeginCombo()/EndCombo() which are kept available for convenience purpose.
|
// The old Combo() api are helpers over BeginCombo()/EndCombo() which are kept available for convenience purpose.
|
||||||
IMGUI_API bool BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags = 0);
|
IMGUI_API bool BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags = 0);
|
||||||
IMGUI_API void EndCombo(); // only call EndCombo() if BeginCombo() returns true!
|
IMGUI_API void EndCombo(); // only call EndCombo() if BeginCombo() returns true!
|
||||||
|
Loading…
Reference in New Issue
Block a user