---
name: panel_menu
kind: component
lang: cpp
domain: core
version: "1.1.0"
purity: pure
signature: "bool fn_ui::panel_menu(const char* menu_label, const fn_ui::PanelToggle* items, size_t count); bool fn_ui::panel_menu_items(const char* menu_label, const fn_ui::PanelToggle* items, size_t count)"
description: "MainMenuBar ImGui con un menu checkable para abrir/cerrar paneles. panel_menu abre y cierra la MainMenuBar internamente. panel_menu_items dibuja solo el BeginMenu..EndMenu para componer con otras entradas dentro de una MainMenuBar propia."
tags: [imgui, ui, menu, panels, layout, dockspace]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: [imgui]
tested: false
tests: []
test_file_path: ""
file_path: "cpp/functions/core/panel_menu.cpp"
framework: imgui
params:
  - name: menu_label
    desc: "Texto del menu desplegable, p.ej. 'View'."
  - name: items
    desc: "Puntero a array de PanelToggle. Cada toggle expone un bool* que controla la visibilidad del panel correspondiente."
  - name: count
    desc: "Numero de elementos en items."
output: "true si el usuario togglo algun panel este frame; false si no hubo cambios o si la MainMenuBar no se abrio (solo para panel_menu)."
notes: "consumido por cpp/apps/shaders_lab/main.cpp"
---

# panel_menu

Renderiza una `ImGui::BeginMainMenuBar` completa con un unico menu desplegable (`menu_label`) que lista cada panel registrado como `ImGui::MenuItem` checkable. El `bool*` de cada `PanelToggle` es el mismo puntero que el caller pasa a `ImGui::Begin("Nombre", &show_panel)`, de modo que la X de la ventana y el item del menu se mantienen sincronizados automaticamente — ambos escriben en el mismo bool.

## Dos variantes (v1.1.0)

- **`panel_menu`**: abre y cierra la `MainMenuBar` internamente. Conveniente para apps con un solo menu.
- **`panel_menu_items`**: dibuja solo `BeginMenu` ... `EndMenu` sin tocar la `MainMenuBar`. Llamar dentro de un `BeginMainMenuBar()` exitoso para componer con otros menus (ej. con `layouts_menu_items` via `app_menubar`).

## Ejemplo de uso — panel_menu (standalone)

```cpp
#include "core/panel_menu.h"
#include <imgui.h>

// En la clase/estado de la app:
static bool show_code    = true;
static bool show_preview = true;
static bool show_dag     = true;

// Dentro del loop de render:
fn_ui::PanelToggle toggles[] = {
    { "Code Editor", "Ctrl+1", &show_code    },
    { "Preview",     "Ctrl+2", &show_preview },
    { "DAG",         "Ctrl+3", &show_dag     },
};
fn_ui::panel_menu("View", toggles, std::size(toggles));
```

## Ejemplo de uso — panel_menu_items (compuesto)

```cpp
if (ImGui::BeginMainMenuBar()) {
    fn_ui::panel_menu_items("View", toggles, std::size(toggles));
    // aqui van otros menus...
    ImGui::EndMainMenuBar();
}
```

## Notas

- Si `items == nullptr` y `count > 0`, se trata como `count = 0` (no crashea).
- Si `item.open == nullptr` para algun item, ese item se salta silenciosamente.
- `shortcut` es puramente cosmetico — ImGui lo dibuja alineado a la derecha pero no registra ningun hotkey real.
- Compatible con dockspace: llamar antes del `DockSpaceOverViewport`.
