class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.picture_label = None
        self.next_button = None
        self.picture_pixmap = None

        self.init_main_window()

    # init the main window of FamilyFrame and set layout
    def init_main_window(self):

        vLayout = QVBoxLayout()

        self.picture_label = QLabel()
        self.picture_label.setAlignment(QtCore.Qt.AlignCenter)
        vLayout.addWidget(self.picture_label, QtCore.Qt.AlignCenter)

        self.next_button = QPushButton('Next ->')
        vLayout.addWidget(self.next_button, QtCore.Qt.AlignCenter)

        self.picture_pixmap = QPixmap()

        self.setLayout(vLayout)
        self.setGeometry(0, 0, settings.WIDTH, settings.HEIGHT)
        self.setWindowTitle('Family Frame')
        self.center()
        self.setStyleSheet('background-color: black;')
        self.show()

    # center window to center of screen
    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    # update the picture_label's pixmap to the new picture
    def update_picture(self, picture):
        self.fade_out_label()
        self.swap_picture_pixmap(picture)
        self.picture_label.setPixmap(self.picture_pixmap)
        self.fade_in_label()

    def swap_picture_pixmap(self, picture):
        pixmap = QPixmap(picture.path_to_file)
        fixed_pixmap = pixmap.scaled(settings.WIDTH, settings.HEIGHT,
                                     QtCore.Qt.KeepAspectRatio,
                                     QtCore.Qt.FastTransformation)
        self.picture_pixmap.swap(fixed_pixmap)

    def fade_out_label(self):
        self.picture_label.effect = QGraphicsOpacityEffect()
        self.picture_label.setGraphicsEffect(self.picture_label.effect)

        self.picture_label.animation = QtCore.QPropertyAnimation(
            self.picture_label.effect, b"opacity")
        self.picture_label.animation.setDuration(500)
        self.picture_label.animation.setStartValue(1)
        self.picture_label.animation.setEndValue(0)
        self.picture_label.animation.start()

    def fade_in_label(self):
        self.picture_label.effect = QGraphicsOpacityEffect()
        self.picture_label.setGraphicsEffect(self.picture_label.effect)

        self.picture_label.animation = QtCore.QPropertyAnimation(
            self.picture_label.effect, b"opacity")
        self.picture_label.animation.setDuration(500)
        self.picture_label.animation.setStartValue(0)
        self.picture_label.animation.setEndValue(1)
        self.picture_label.animation.start()

    def set_picture(self, picture):
        self.swap_picture_pixmap(picture)
        self.picture_label.setPixmap(self.picture_pixmap)
        self.fade_in_label()