Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Intermediate Checkboxes #2644

Closed
Folling opened this issue Jun 29, 2019 · 3 comments
Closed

Intermediate Checkboxes #2644

Folling opened this issue Jun 29, 2019 · 3 comments

Comments

@Folling
Copy link

Folling commented Jun 29, 2019

Version: ImGui.NET 1.70
Branch: master

Operating System: Arch Linux

I was looking into adding Checkboxes that support an intermediate mode, but didn't find them. It's a feature that would be handy to have.
An intermediate Checkbox allows for a third state, which could generally be seen as a "i'm not sure", instead of a yes or no. Most GUI libraries support them, and they've plenty applications, especially for input forms. Occasionally they're also used to delineate when something is neither true or false. E.g. "Selected all" in a list, but only some items are selected:

image

https://docs.oracle.com/javafx/2/ui_controls/checkbox.htm
This document for JavaFX demonstrates the intermediate model fairly well.

Any chance this could be implemented in Dear ImGui?

@ocornut
Copy link
Owner

ocornut commented Jun 30, 2019

I would like to design this as a more general feature (e.g. any widgets representing a "mixed" selection, or potentially even one single component of a multi-component widget), so the problem is that I'd be hesitant to design something too specific to Checkbox.

I don't mind adding something in imgui_internal.h to support it for Checkbox at a first step, with the understanding that the API might break if we change how it works later on?

ocornut added a commit that referenced this issue Jun 30, 2019
@ocornut
Copy link
Owner

ocornut commented Jun 30, 2019

Pushed something to imgui_internal.h
My draft to support the general feature involved a ImGuiItemFlags_MixedValue flag so I went this way for the checkbox.

You'll need to add your own wrapper function (in any of your own .cpp file), e.g.

namespace ImGui
{
    bool CheckBoxTristate(const char* label, int* v_tristate)
    {
        bool ret;
        if (*v_tristate == -1)
        {
            ImGui::PushItemFlag(ImGuiItemFlags_MixedValue, true);
            bool b = false;
            ret = ImGui::Checkbox(label, &b);
            if (ret)
                *v_tristate = 1;
            ImGui::PopItemFlag();
        }
        else
        {
            bool b = (*v_tristate != 0);
            ret = ImGui::Checkbox(label, &b);
            if (ret)
                *v_tristate = (int)b;
        }
        return ret;
    }
};

Usage

        static int tristate = -1;
        ImGui::CheckBoxTristate("Tristate", &tristate);
        if (ImGui::SmallButton("reset to -1"))
            tristate = -1;

tristate_checkbox

@Folling
Copy link
Author

Folling commented Jun 30, 2019

Well, that was fast! I like the generalisation of that concept, and for now this workaround is more than enough, thanks for the quick reply!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants