from abc import abstractmethod, ABC, ABCMeta
from typing import TypeVar, Generic, Iterator
from PySide6.QtCore import ClassInfo, Property, QObject, Signal, Slot

QObjectType = type(QObject)
T = TypeVar('T')

class QABCMeta(QObjectType, ABCMeta):
    pass

@ClassInfo(QCLASSINFO_REMOTEOBJECT_TYPE='Simple', QCLASSINFO_REMOTEOBJECT_SIGNATURE='c6f33edb0554ba4241aad1286a47c8189d65c845')
class SimpleSource(QObject, Generic[T], metaclass=QABCMeta):
    iChanged = Signal(int)
    fChanged = Signal(float)
    random = Signal(int)

    def __init__(self, parent=None):
        super().__init__(parent)


    @abstractmethod
    def i(self):
        pass

    @abstractmethod
    def setI(self, i):
        pass

    @abstractmethod
    def pushI(self, i):
        pass

    i = Property(int, i, setI, notify = iChanged)

    @abstractmethod
    def f(self):
        pass

    @abstractmethod
    def setF(self, f):
        pass

    f = Property(float, f, setF, notify = fChanged)

    @abstractmethod
    @Slot()
    def reset(self):
        pass

class SimpleSimpleSource(SimpleSource):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.i = int(2)
        self.f = float(-1.)


    def i(self):
        return self.i

    def pushI(self, i):
        self.setI(self, i)

    def setI(self, i):
        if i != self.i:
            self.i = i
            self.iChanged.emit(i)


    def f(self):
        return self.f

    def setF(self, f):
        if f != self.f:
            self.f = f
            self.fChanged.emit(f)

