package cjqt.widgets

import cjqt.gui.*
import cjqt.core.*
import cjqt.tools.*

foreign func nativeStyledItemDelegateCreate(): Int64
foreign func nativeStyledItemDelegateDelete(ptr: Int64): Unit

foreign func nativeStyledItemDelegateSetPaintCallback(ptr: Int64, callback: CFunc<(Int64, CPointer<Unit>) -> Unit>): Unit
foreign func nativeStyledItemDelegateSetSizeHintCallback(ptr: Int64, callback: CFunc<(Int64, CPointer<Unit>) -> QSize>): Unit

@C
func styledItemDelegatePaintCallback(ptr: Int64, dataPtr: CPointer<Unit>): Unit {
    let data = QConversion.cPointerToCjDataLongLongLong(dataPtr)
    let painter = QPainter(ptr: data.p1)
    let index = QModelIndex(data.p3)
    try {
        QWidgetCallbackMap.paintCallback[ptr](painter, index)
    } catch (e: Exception) {
        println(e)
    }
}

@C
func styledItemDelegateSizeHintCallback(ptr: Int64, dataPtr: CPointer<Unit>): QSize {
    let data = QConversion.cPointerToCjDataLongLong(dataPtr)
    let index = QModelIndex(data.p2)
    try {
        return QWidgetCallbackMap.sizeHintCallback[ptr](index)
    } catch (e: Exception) {
        println(e)
    }
    return QSize(0,0)
}

public open class QStyledItemDelegate <: QAbstractItemDelegate {
    public init() {
        super(
            unsafe {
                nativeStyledItemDelegateCreate()
            }
        )
        //setPaint()
        //setSizeHint()
    }

    public init(ptr: Int64) {
        super(ptr)
        //setPaint()
        //setSizeHint()
    }

    public open func delete(): Unit {
        QWidgetCallbackMap.paintCallback.remove(ptr)
        QWidgetCallbackMap.sizeHintCallback.remove(ptr)
        return unsafe {
            nativeStyledItemDelegateDelete(this.ptr)
        }
    }

    protected func setPaint() {
        QWidgetCallbackMap.paintCallback.put(ptr, paint)
        unsafe {
            nativeStyledItemDelegateSetPaintCallback(ptr, styledItemDelegatePaintCallback)
        }
    }

    protected func setSizeHint() {
        QWidgetCallbackMap.sizeHintCallback.put(ptr, sizeHint)
        unsafe {
            nativeStyledItemDelegateSetSizeHintCallback(ptr, styledItemDelegateSizeHintCallback)
        }
    }

    public open func paint(painter: QPainter, index: QModelIndex): Unit {}

    public open func sizeHint(index: QModelIndex): QSize {
        return QSize(0,0)
    }
}