# Created By: Virgil Dupras
# Created On: 2010-02-05
# Copyright 2015 Hardcoded Software (http://www.hardcoded.net)
#
# This software is licensed under the "GPLv3" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
# http://www.gnu.org/licenses/gpl-3.0.html

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QDockWidget, QWidget

from qt.util import move_to_screen_center
from qt.details_table import DetailsModel
from hscommon.plat import ISLINUX


class DetailsDialog(QDockWidget):
    def __init__(self, parent, app, **kwargs):
        super().__init__(parent, Qt.Tool, **kwargs)
        self.parent = parent
        self.app = app
        self.model = app.model.details_panel
        self.setAllowedAreas(Qt.AllDockWidgetAreas)
        self._setupUi()
        # To avoid saving uninitialized geometry on appWillSavePrefs, we track whether our dialog
        # has been shown. If it has, we know that our geometry should be saved.
        self._shown_once = False
        self._wasDocked, area = self.app.prefs.restoreGeometry("DetailsWindowRect", self)
        self.tableModel = DetailsModel(self.model, app)
        # tableView is defined in subclasses
        self.tableView.setModel(self.tableModel)
        self.model.view = self
        self.app.willSavePrefs.connect(self.appWillSavePrefs)
        # self.setAttribute(Qt.WA_DeleteOnClose)
        parent.addDockWidget(area if self._wasDocked else Qt.BottomDockWidgetArea, self)

    def _setupUi(self):  # Virtual
        pass

    def show(self):
        if not self._shown_once and self._wasDocked:
            self.setFloating(False)
        self._shown_once = True
        super().show()
        self.update_options()

    def update_options(self):
        # This disables the title bar (if we had not set one before already)
        # essentially making it a simple floating window, not dockable anymore
        if not self.app.prefs.details_dialog_titlebar_enabled:
            if not self.titleBarWidget():  # default title bar
                self.setTitleBarWidget(QWidget())  # disables title bar
                # Windows (and MacOS?) users cannot move a floating window which
                # has no native decoration so we force it to dock for now
                if not ISLINUX:
                    self.setFloating(False)
        elif self.titleBarWidget() is not None:  # title bar is disabled
            self.setTitleBarWidget(None)  # resets to the default title bar
        elif not self.titleBarWidget() and not self.app.prefs.details_dialog_titlebar_enabled:
            self.setTitleBarWidget(QWidget())

        features = self.features()
        if self.app.prefs.details_dialog_vertical_titlebar:
            self.setFeatures(features | QDockWidget.DockWidgetVerticalTitleBar)
        elif features & QDockWidget.DockWidgetVerticalTitleBar:
            self.setFeatures(features ^ QDockWidget.DockWidgetVerticalTitleBar)

    # --- Events
    def appWillSavePrefs(self):
        if self._shown_once:
            self.app.prefs.saveGeometry("DetailsWindowRect", self)

    # --- model --> view
    def refresh(self):
        self.tableModel.beginResetModel()
        self.tableModel.endResetModel()

    def showEvent(self, event):
        if self._wasDocked is False:
            # have to do this here as the frameGeometry is not correct until shown
            move_to_screen_center(self)
        super().showEvent(event)
