import os
import sys
from PySide6.QtWidgets import (QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout,
                               QLabel)
from PySide6.QtCore import QLibraryInfo, QOperatingSystemVersion, qVersion, Slot


n = 0


def title():
    result = ''
    app = QApplication.instance()
    ost = QOperatingSystemVersion.current()
    if ost.name():
        result += '"' + ost.name() + '" ' + ost.version().toString()
    else:
        result += sys.platform
    result += '/' + app.platformName() + ' ' + qVersion() + ' ' + app.style().objectName()
    return result


class Window(QWidget):

    def __init__(self):

        super().__init__()

        layout = QVBoxLayout()
        self.setLayout(layout)
        self.conn_count = 0

        h_layout1 = QHBoxLayout()

        self.button = QPushButton('Click me!')
        self.label = QLabel('Connections? 0')

        h_layout1.addWidget(self.button)
        h_layout1.addWidget(self.label)

        layout.addLayout(h_layout1)

        h_layout2 = QHBoxLayout()

        connect_button = QPushButton('Connect')
        connect_button.clicked.connect(self.on_connect_clicked)

        disconnect_button = QPushButton('Disconnect')
        disconnect_button.clicked.connect(self.on_disconnect_clicked)

        h_layout2.addWidget(connect_button)
        h_layout2.addWidget(disconnect_button)

        layout.addLayout(h_layout2)

    @Slot()
    def on_button_clicked(self):
        global n
        print(f'Button clicked {n}')
        n += 1

    @Slot()
    def on_connect_clicked(self):
        id = self.button.clicked.connect(self.on_button_clicked)
        self.conn_count += 1
        d = 'Connections: ' + str(self.conn_count)
        print('on_connect_clicked', d, id)
        self.label.setText(d)
        print(self.conn_count)

    @Slot()
    def on_disconnect_clicked(self):
        d = 'Failed to disconnect'
        ok = self.button.clicked.disconnect(self.on_button_clicked)
        if ok:
            self.conn_count -= 1
            d = 'Connections: ' + str(self.conn_count)
        self.label.setText(d)
        print('on_disconnect_clicked', d)


if __name__ == '__main__':
    os.environ['QT_LOGGING_RULES'] = 'qt.pyside.libpyside.warning=true'

    print('Python {}.{}.{}'.format(sys.version_info[0], sys.version_info[1],
                                   sys.version_info[2]))
    print(QLibraryInfo.build())
    app = QApplication(sys.argv)
    main_window = Window()
    t = title()
    print(t)
    main_window.setWindowTitle(t)
    main_window.show()

    sys.exit(app.exec())
