#I'm too dumb for this.

25 messages · Page 1 of 1 (latest)

deep pond
#

I'm trying to make a ImGui menu. the problem is that ImGui doesnt have a multi selection combo box, so i wanted to create my own. The problem is how do i reference it.

If I do this it doesn't work.

How I do it:

        std::vector<std::string> selectedItems = { "Option 1" };
        const char* items[] = { "Option 1", "Option 2", "Option23321as", "asdasdas"};

        MultiComboBox("MyCombo", &selectedItems, IM_ARRAYSIZE(items), items));
#
        bool MultiComboBox(const char* label, std::vector<std::string>* selectedItems, int num_items, const char* const items[]) {
            bool value_changed = false;
            ImGui::PushID(label);
        
            // Concatenate selected items into a string for display
            std::string selected_label;
            bool first_selected = true;
            for (int i = 0; i < num_items; ++i) {
                if (std::find(selectedItems->begin(), selectedItems->end(), items[i]) != selectedItems->end()) {
                    if (!first_selected)
                        selected_label += ", ";
                    selected_label += items[i];
                    first_selected = false;
                }
            }
        
            if (selected_label.empty())
                selected_label = "None";
            else if (selected_label.size() > 30) // Trim long string
                selected_label = selected_label.substr(0, 27) + "...";
        
            if (ImGui::BeginCombo(label, selected_label.c_str(), ImGuiComboFlags_HeightLarge)) {
                for (int i = 0; i < num_items; ++i) {
                    ImGui::PushID(items[i]);
                    bool is_selected = std::find(selectedItems->begin(), selectedItems->end(), items[i]) != selectedItems->end();
                    if (ImGui::Selectable(items[i], is_selected)) {
                        if (is_selected) {
                            selectedItems->erase(std::remove(selectedItems->begin(), selectedItems->end(), items[i]), selectedItems->end());
                        }
                        else {
                            selectedItems->push_back(items[i]);
                        }
                        value_changed = true;
                    }
                    ImGui::PopID();
                }
                ImGui::EndCombo();
            }
        
            ImGui::PopID();
            return value_changed;
        }
#

this way it runs and everything, but when i try to select stuff nothing changes

rocky prairie
deep pond
#

what do you mean? i did that, no?

rocky prairie
#

you made it a bit more complicated ig

#

and i add them to a vector who are selected

#

and like return the vector

deep pond
#

I'm not sure what you mean by this, you meant for me tho remove the selected_label thingy?

royal stoneBOT
#

@deep pond has reached level 1. GG!

rocky prairie
#

simple c++

begin combo
sselectablevector
for slectables.size
selectables
if selectable
sselectablevector.pushback(selectable)

return sselectablevector

#

or store it somewhere else

deep pond
#

hmm

#

i tried this

#
std::vector<std::string> MultiComboBox(const char* label, std::vector<std::string> selectedItems, int num_items, const char* const items[]) {
    ImGui::PushID(label);

    std::vector<std::string> newItems = selectedItems;

    // Concatenate selected items into a string for display
    std::string selected_label;
    bool first_selected = true;
    for (int i = 0; i < num_items; ++i) {
        if (std::find(newItems.begin(), newItems.end(), items[i]) != newItems.end()) {
            if (!first_selected)
                selected_label += ", ";
            selected_label += items[i];
            first_selected = false;
        }
    }

    if (selected_label.empty())
        selected_label = "None";
    else if (selected_label.size() > 30) // Trim long string
        selected_label = selected_label.substr(0, 27) + "...";

    if (ImGui::BeginCombo(label, selected_label.c_str())) {
        for (int i = 0; i < num_items; ++i) {
            ImGui::PushID(items[i]);
            bool is_selected = std::find(newItems.begin(), newItems.end(), items[i]) != newItems.end();
            if (ImGui::Selectable(items[i], is_selected)) {
                if (std::find(newItems.begin(), newItems.end(), items[i]) != newItems.end()) {
                    newItems.erase(std::remove(newItems.begin(), newItems.end(), items[i]), newItems.end());
                }
                else {
                    newItems.push_back(items[i]);
                }
            }
            ImGui::PopID();
        }
        ImGui::EndCombo();
    }

    ImGui::PopID();
    return newItems;
}
#
        std::vector<std::string> selectedItems = { "Option 1" };
        const char* items[] = { "Option 1", "Option 2", "Option23321as", "asdasdas"};
                        selectedItems = MultiComboBox("MyCombo", selectedItems, IM_ARRAYSIZE(items), items);```
#

still doesnt work, maybe i got ur idea wrong

rocky prairie
#

let me guess chat gpt ?

deep pond
#

yes but

#

still

rocky prairie
#

oooof

deep pond
#

why is this so hard

rocky prairie
#

i told u how u can do it quite easy

deep pond
#

yes but u see i tried that method

deep pond
#

yo i think ima k m s