# ListViewWindow

> मोडल पॉपअप जो किसी ListView को एक Window में लपेटकर तैरती हुई विंडो में चयन प्रदान करता है।

Source: https://crossfly.dev/hi/docs/ui/widgets/listviewwindow — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# ListViewWindow

`ListViewWindow` एक [`ListView`](/docs/ui/widgets/listview) को एक `Window` के अंदर लपेटता है ताकि **मोडल पॉपअप** व्यवहार (केंद्रित तैरता हुआ सेलेक्टर) मिले। `SINGLE` मोड में, किसी आइटम को टच करना चयन करता है और विंडो को **बंद** कर देता है; `MULTIPLE` में, "पुष्टि करें" बटन बंद करता है।

अधिकांश मेथड केवल आंतरिक `ListView` को **डेलिगेट** करते हैं (कॉन्फ़िगरेशन और चयन पूछताछ)। यदि आप पॉपअप के बिना एम्बेडेड `ListView` चाहते हैं तो `getPanel()` का उपयोग करें।

> 🟡 · **पैकेज:** `dev.crossfly.ui` · **एक्सटेंड करता है:** `Window` · **स्टाइल:** `WindowStyle` (`selectionWindowStyle()` के माध्यम से)

## कब उपयोग करें
- मोडल चयन जो प्रवाह को बाधित करता है (क्रियाओं का मेनू, आइटम सेलेक्टर, विकल्पों की पुष्टि)।
- आप बिना `Window` को हाथ से बनाए स्वचालित केंद्रीकरण और स्क्रीन के सापेक्ष आकार चाहते हैं।

## कब उपयोग न करें
- किसी स्क्रीन में एम्बेडेड सूची (गैर-मोडल) → सीधे [`ListView`](/docs/ui/widgets/listview) का उपयोग करें (या `getPanel()`)।
- हज़ारों आइटम → अपनी खुद की `Window` के अंदर [`VirtualListView`](/docs/ui/widgets/virtuallistview) का उपयोग करें।

## दिखावट
स्क्रीन का एक अंश घेरती हुई केंद्रित विंडो (`widthRatio`/`heightRatio`, डिफ़ॉल्ट `0.5`/`0.5`), जिसमें `ListView` (हेडर + स्क्रॉल करने योग्य आइटम + `MULTIPLE` में बटन) होता है। बैकग्राउंड `WindowStyle`/`Skin` के अनुसार गहरा हो जाता है।

## पूरा उदाहरण (कॉपी करें, पेस्ट करें और चलाएं)
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      // ListViewWindow एक Window (popup) है: show() से खुलता है, layout में नहीं आता।
      Button abrir = new Button("Escolher vibração");
      abrir.onAction(e -> {
         ListViewWindow pm = new ListViewWindow("Vibrar",
            new String[]{"Curto", "Longo", "Padrão"}, ListViewWindow.ItemType.SINGLE);
         pm.onConfirm(c -> System.out.println("idx = " + pm.getSelectedIndex()));
         pm.show();
      });

      add(.9f, abrir);   // popup खोलने वाला बटन layout में आता है
   }
}
```

> नीचे दिए गए स्निपेट **केवल मुख्य भाग** दिखाते हैं (जो `onShow()` के अंदर जाता है)। चलाने के लिए, उन्हें ऊपर के `MainWindow` ढांचे में रखें।

## बुनियादी उपयोग
```java
// मेनू पॉपअप (SINGLE): छूने पर बंद होता है और इंडेक्स रिपोर्ट करता है
ListViewWindow pm = new ListViewWindow("Vibrar", new String[]{"Curto", "Longo", "Padrão"},
      ListViewWindow.ItemType.SINGLE);
pm.onConfirm(c -> System.out.println("idx = " + pm.getSelectedIndex()));
pm.show();
```

## कंस्ट्रक्टर
| कंस्ट्रक्टर | विवरण |
|---|---|
| `ListViewWindow(String[] items, ItemType itemType)` | बिना शीर्षक वाला पॉपअप |
| `ListViewWindow(String title, String[] items, ItemType itemType)` | हेडर में शीर्षक वाला पॉपअप |

`ListViewWindow.ItemType` एक **अपना** enum है (`SINGLE`, `MULTIPLE`) जो आंतरिक रूप से `ListView.ItemType` में परिवर्तित हो जाता है।

## प्रॉपर्टीज़ और अनुकूलन
| प्रॉपर्टी / मेथड | प्रकार | डिफ़ॉल्ट | क्या करता है |
|---|---|---|---|
| `size(float widthRatio, float heightRatio)` | `ListViewWindow` | `0.5, 0.5` | स्क्रीन के अंश के रूप में पॉपअप का आकार |
| `getPanel()` | `ListView` | — | आंतरिक `ListView` तक पहुंच |
| `ItemFactory(ItemFactory)` | `ListViewWindow` | `null` | कस्टम पंक्तियों की फ़ैक्ट्री (आरंभिक अक्षर **बड़ा** नोट करें) |
| `computeIdealHeight(int)` | `int` | — | `panel.computeIdealHeight` को डेलिगेट करता है |
| `title/confirmText/itemStyle/confirmButtonStyle/headerStyle` | `ListViewWindow` | थीम | `ListView` को धाराप्रवाह डेलिगेशन |

### चयन पूछताछ (डेलिगेटेड)
`getSelectedCount()`, `getSelectedIndex()`, `getSelectedText()`, `getSelectedIndices()`, `getSelectedTexts()`, `isSelected(int)`, `getSelectionState()`।

## कॉलबैक और इवेंट
| कॉलबैक | कब ट्रिगर होता है |
|---|---|
| `onConfirm(Component.Action)` | `SINGLE`: किसी आइटम को टच करने पर (और बंद हो जाता है)। `MULTIPLE`: "पुष्टि करें" को टच करने पर (और बंद हो जाता है) |

## स्थितियां
हर `Window` की तरह: प्रदर्शित करने के लिए `show()` और बंद करने के लिए `hide()` का उपयोग करें। आंतरिक `ListView` अपना `closeAction` पहले से ही `this::hide` की ओर इंगित करता है, इसलिए चयन स्वचालित रूप से पॉपअप को बंद कर देता है।

### पंक्ति फ़ैक्ट्री (छवि + लेबल) वाला पॉपअप
```java
Button abrir = new Button("Lista de imagens");
abrir.onAction(e -> {
   ListViewWindow w = new ListViewWindow("Imagens", labels, ListViewWindow.ItemType.SINGLE);
   w.ItemFactory((text, index) -> {
      Image img = new Image(paths[index]);
      ImageView iv = new ImageView(img, UIConstants.ImageSize.RATIO);
      Component row = new Component().style(Styles.component()
         .pressable().ingap(Gap.ofFont(.3f)).autoHeight(Relative.ofFont(3f)));
      row.setLayout(new GridLayout(Position.START, Position.CENTER));
      row.add(.22f, .78f, iv, new Label(text));
      return row;
   });
   w.show();
});
```

### कस्टम आकार वाला बहु-चयन
```java
ListViewWindow w = new ListViewWindow("Tópicos",
      new String[]{"Java", "Kotlin", "Dart"}, ListViewWindow.ItemType.MULTIPLE)
   .size(.7f, .6f)
   .confirmText("OK");
w.onConfirm(c -> System.out.println(w.getSelectedCount() + " marcados"));
w.show();
```

## सर्वोत्तम अभ्यास
- सामग्री के अनुसार `size(...)` समायोजित करें — कई आइटम बड़े `heightRatio` की मांग करते हैं; कम आइटम, छोटे।
- उसी सूची को पॉपअप के बिना एम्बेड करने के लिए, `getPanel()` कॉल करें और लौटाए गए `ListView` को अपने लेआउट में जोड़ें।

## सामान्य गलतियां
- **`ItemFactory(...)` (मेथड, बड़ा `I`) को `ListView` के `itemFactory(...)` के साथ भ्रमित करना** — यहां धाराप्रवाह मेथड क्लास की परिपाटी के अनुसार बड़े अक्षर से शुरू होता है।
- **गलत enum का उपयोग करना** — `ListViewWindow` में `ListViewWindow.ItemType` पास करें, `ListView.ItemType` नहीं।

## यह भी देखें
- क्षेत्र गाइड: [`ui/`](/docs/ui) · रेसिपी: [`cookbook/`](/docs/cookbook)
- संबंधित कंपोनेंट: [`ListView`](/docs/ui/widgets/listview) · [सूची आइटम](/docs/ui/widgets/list-items)
