import addon from "../utils/addon"; import { QWidget, QWidgetSignals } from "./QWidget"; import { NativeElement } from "../core/Component"; import { SizeAdjustPolicy } from "../QtEnums"; import { QIcon } from "../QtGui/QIcon"; import { QVariant } from "../QtCore/QVariant"; import { QStandardItemModel } from "./QStandardItemModel"; import { QSize } from "../QtCore/QSize"; import { QModelIndex } from "../QtCore/QModelIndex"; import { checkIfNativeElement } from "../utils/helpers"; import { wrapperCache } from "../core/WrapperCache"; /** > Create and control a selectable drop down menu. * **This class is a JS wrapper around Qt's [QComboBox class](https://doc.qt.io/qt-5/qcombobox.html)** A `QComboBox` provides a means of presenting a list of options to the user. ### Example ```javascript import { QComboBox } from "@vixen-js/core"; const comboBox = new QComboBox(); comboBox.addItem(undefined, 'comboBox item 0'); comboBox.addItem(undefined, 'comboBox item 1'); comboBox.addItem(undefined, 'comboBox item 2'); comboBox.addItem(undefined, 'comboBox item 3'); comboBox.addEventListener('onCurrentTextChange', (text) => { console.log('currentTextChanged: ' + text); }); comboBox.addEventListener('onCurrentIndexChange', (index) => { console.log('currentIndexChanged: ' + index); }); ``` */ export class QComboBox extends QWidget { constructor(arg?: QWidget | NativeElement) { let native: NativeElement; if (checkIfNativeElement(arg)) { native = arg as NativeElement; } else if (arg != null) { const parent = arg as QWidget; native = new addon.QComboBox(parent.native); } else { native = new addon.QComboBox(); } super(native); } // *** Public Functions *** addItem( icon: QIcon | undefined, text: string, userData: QVariant = new QVariant() ): void { if (icon) { this.native?.addItem(icon.native, text, userData.native); } else { this.native?.addItem(text, userData.native); } } addItems(texts: string[]): void { this.native?.addItems(texts); } // TODO: QCompleter * completer() const count(): number { return this.native?.count(); } // TODO: QVariant currentData(int role = Qt::UserRole) const currentIndex(): number { return this.native?.currentIndex(); } currentText(): string { return this.native?.currentText(); } duplicatesEnabled(): boolean { return this.native?.duplicatesEnabled(); } // TODO: int findData(const QVariant &data, int role = Qt::UserRole, Qt::MatchFlags flags = static_cast(Qt::MatchExactly|Qt::MatchCaseSensitive)) const // TODO: int findText(const QString &text, Qt::MatchFlags flags = Qt::MatchExactly|Qt::MatchCaseSensitive) const hasFrame(): boolean { return this.native?.hasFrame(); } hidePopup(): void { this.native?.hidePopup(); } iconSize(): QSize { return new QSize(this.native?.iconSize()); } insertItem( index: number, icon: QIcon | undefined, text: string, userData: QVariant = new QVariant() ): void { if (icon) { this.native?.insertItem(index, icon.native, text, userData.native); } else { this.native?.insertItem(index, text, userData.native); } } insertItems(index: number, texts: string[]): void { this.native?.insertItems(index, texts); } insertPolicy(): InsertPolicy { return this.native?.insertPolicy(); } insertSeparator(index: number): void { this.native?.insertSeparator(index); } isEditable(): boolean { return this.native?.isEditable(); } itemData(index: number): QVariant { return new QVariant(this.native?.itemData(index)); } // TODO: QAbstractItemDelegate * itemDelegate() const // TODO: QIcon itemIcon(int index) const itemText(index: number): string { return this.native?.itemText(index); } // TODO: QLineEdit * lineEdit() const maxCount(): number { return this.native?.maxCount(); } maxVisibleItems(): number { return this.native?.maxVisibleItems(); } minimumContentsLength(): number { return this.native?.minimumContentsLength(); } // TODO: QAbstractItemModel * model() const modelColumn(): number { return this.native?.modelColumn(); } removeItem(index: number): void { this.native?.removeItem(index); } rootModelIndex(): QModelIndex { return new QModelIndex(this.native?.rootModelIndex()); } // TODO: void setCompleter(QCompleter *completer) setDuplicatesEnabled(enable: boolean): void { this.native?.setDuplicatesEnabled(enable); } setEditable(editable: boolean): void { this.native?.setEditable(editable); } setFrame(showFrame: boolean): void { this.native?.setFrame(showFrame); } setIconSize(size: QSize): void { this.native?.setIconSize(size); } setInsertPolicy(policy: InsertPolicy): void { this.native?.setInsertPolicy(policy); } // TODO: void setItemData(int index, const QVariant &value, int role = Qt::UserRole) // TODO: void setItemDelegate(QAbstractItemDelegate *delegate) // TODO: void setItemIcon(int index, const QIcon &icon) setItemText(index: number, text: string): void { this.native?.setItemText(index, text); } // TODO: void setLineEdit(QLineEdit *edit) setMaxCount(max: number): void { this.native?.setMaxCount(max); } setMaxVisibleItems(index: number): void { this.native?.setMaxVisibleItems(index); } setMinimumContentsLength(characters: number): void { this.native?.setMinimumContentsLength(characters); } setModel(model: QStandardItemModel): void { this.native?.setModel(model.native); } setModelColumn(visibleColumn: number): void { this.native?.setModelColumn(visibleColumn); } setRootModelIndex(index: QModelIndex): void { this.native?.setRootModelIndex(index.native); } setSizeAdjustPolicy(policy: SizeAdjustPolicy): void { this.native?.setSizeAdjustPolicy(policy); } sizeAdjustPolicy(): number { return this.native?.sizeAdjustPolicy(); } // TODO: void setValidator(const QValidator *validator) // TODO: void setView(QAbstractItemView *itemView) showPopup(): void { this.native?.showPopup(); } // TODO: const QValidator * validator() const // TODO: QAbstractItemView * view() const // *** Public Slots *** clear(): void { this.native?.clear(); } clearEditText(): void { this.native?.clearEditText(); } setCurrentIndex(index: number): void { this.setProperty("currentIndex", index); } setCurrentText(text: string): void { this.setProperty("currentText", text); } setEditText(text: string): void { this.native?.setEditText(text); } } export enum InsertPolicy { NoInsert = 0, InsertAtTop = 1, InsertAtCurrent = 2, InsertAtBottom = 3, InsertAfterCurrent = 4, InsertBeforeCurrent = 5, InsertAlphabetically = 6, } export interface QComboBoxSignals extends QWidgetSignals { onActivate: (index: number) => void; onCurrentIndexChange: (index: number) => void; onCurrentTextChange: (text: string) => void; onEditTextChange: (text: string) => void; onHighlight: (index: number) => void; onTextActivate: (text: string) => void; onTextHighlight: (text: string) => void; } wrapperCache.registerWrapper("QComboBoxWrap", QComboBox);