# -*- coding: utf-8 -*-
#
# Copyright © 2014-2015 Colin Duquesnoy
# Copyright © 2009- The Spyder Development Team
#
# Licensed under the terms of the MIT License
# (see LICENSE.txt for details)

"""
Provides QtGui classes and functions.
.. warning:: Only PyQt4/PySide QtGui classes compatible with PyQt5.QtGui are
    exposed here. Therefore, you need to treat/use this package as if it were
    the ``PyQt5.QtGui`` module.
"""
import warnings

from . import PYQT5, PYQT4, PYSIDE, PYSIDE2, PythonQtError


if PYQT5:
    from PyQt5.QtGui import *
elif PYSIDE2:
    from PySide2.QtGui import *
elif PYQT4:
    try:
        # Older versions of PyQt4 do not provide these
        from PyQt4.QtGui import (
            QGlyphRun,
            QMatrix2x2,
            QMatrix2x3,
            QMatrix2x4,
            QMatrix3x2,
            QMatrix3x3,
            QMatrix3x4,
            QMatrix4x2,
            QMatrix4x3,
            QMatrix4x4,
            QTouchEvent,
            QQuaternion,
            QRadialGradient,
            QRawFont,
            QStaticText,
            QVector2D,
            QVector3D,
            QVector4D,
            qFuzzyCompare,
        )
    except ImportError:
        pass
    from PyQt4.Qt import QKeySequence, QTextCursor
    from PyQt4.QtGui import (
        QAbstractTextDocumentLayout,
        QActionEvent,
        QBitmap,
        QBrush,
        QClipboard,
        QCloseEvent,
        QColor,
        QConicalGradient,
        QContextMenuEvent,
        QCursor,
        QDoubleValidator,
        QDrag,
        QDragEnterEvent,
        QDragLeaveEvent,
        QDragMoveEvent,
        QDropEvent,
        QFileOpenEvent,
        QFocusEvent,
        QFont,
        QFontDatabase,
        QFontInfo,
        QFontMetrics,
        QFontMetricsF,
        QGradient,
        QHelpEvent,
        QHideEvent,
        QHoverEvent,
        QIcon,
        QIconDragEvent,
        QIconEngine,
        QImage,
        QImageIOHandler,
        QImageReader,
        QImageWriter,
        QInputEvent,
        QInputMethodEvent,
        QKeyEvent,
        QLinearGradient,
        QMouseEvent,
        QMoveEvent,
        QMovie,
        QPaintDevice,
        QPaintEngine,
        QPaintEngineState,
        QPaintEvent,
        QPainter,
        QPainterPath,
        QPainterPathStroker,
        QPalette,
        QPen,
        QPicture,
        QPictureIO,
        QPixmap,
        QPixmapCache,
        QPolygon,
        QPolygonF,
        QRegExpValidator,
        QRegion,
        QResizeEvent,
        QSessionManager,
        QShortcutEvent,
        QShowEvent,
        QStandardItem,
        QStandardItemModel,
        QStatusTipEvent,
        QSyntaxHighlighter,
        QTabletEvent,
        QTextBlock,
        QTextBlockFormat,
        QTextBlockGroup,
        QTextBlockUserData,
        QTextCharFormat,
        QTextDocument,
        QTextDocumentFragment,
        QTextDocumentWriter,
        QTextFormat,
        QTextFragment,
        QTextFrame,
        QTextFrameFormat,
        QTextImageFormat,
        QTextInlineObject,
        QTextItem,
        QTextLayout,
        QTextLength,
        QTextLine,
        QTextList,
        QTextListFormat,
        QTextObject,
        QTextObjectInterface,
        QTextOption,
        QTextTable,
        QTextTableCell,
        QTextTableCellFormat,
        QTextTableFormat,
        QTransform,
        QValidator,
        QWhatsThisClickedEvent,
        QWheelEvent,
        QWindowStateChangeEvent,
        qAlpha,
        qBlue,
        qGray,
        qGreen,
        qIsGray,
        qRed,
        qRgb,
        qRgba,
        QIntValidator,
    )

    # QDesktopServices has has been split into (QDesktopServices and
    # QStandardPaths) in Qt5
    # It only exposes QDesktopServices that are still in pyqt5
    from PyQt4.QtGui import QDesktopServices as _QDesktopServices

    class QDesktopServices:
        openUrl = _QDesktopServices.openUrl
        setUrlHandler = _QDesktopServices.setUrlHandler
        unsetUrlHandler = _QDesktopServices.unsetUrlHandler

        def __getattr__(self, name):
            attr = getattr(_QDesktopServices, name)

            new_name = name
            if name == "storageLocation":
                new_name = "writableLocation"
            warnings.warn(
                (
                    "Warning QDesktopServices.{} is deprecated in Qt5"
                    "we recommend you use QDesktopServices.{} instead"
                ).format(name, new_name),
                DeprecationWarning,
            )
            return attr

    QDesktopServices = QDesktopServices()

elif PYSIDE:
    from PySide.QtGui import (
        QAbstractTextDocumentLayout,
        QActionEvent,
        QBitmap,
        QBrush,
        QClipboard,
        QCloseEvent,
        QColor,
        QConicalGradient,
        QContextMenuEvent,
        QCursor,
        QDoubleValidator,
        QDrag,
        QDragEnterEvent,
        QDragLeaveEvent,
        QDragMoveEvent,
        QDropEvent,
        QFileOpenEvent,
        QFocusEvent,
        QFont,
        QFontDatabase,
        QFontInfo,
        QFontMetrics,
        QFontMetricsF,
        QGradient,
        QHelpEvent,
        QHideEvent,
        QHoverEvent,
        QIcon,
        QIconDragEvent,
        QIconEngine,
        QImage,
        QImageIOHandler,
        QImageReader,
        QImageWriter,
        QInputEvent,
        QInputMethodEvent,
        QKeyEvent,
        QKeySequence,
        QLinearGradient,
        QMatrix2x2,
        QMatrix2x3,
        QMatrix2x4,
        QMatrix3x2,
        QMatrix3x3,
        QMatrix3x4,
        QMatrix4x2,
        QMatrix4x3,
        QMatrix4x4,
        QMouseEvent,
        QMoveEvent,
        QMovie,
        QPaintDevice,
        QPaintEngine,
        QPaintEngineState,
        QPaintEvent,
        QPainter,
        QPainterPath,
        QPainterPathStroker,
        QPalette,
        QPen,
        QPicture,
        QPictureIO,
        QPixmap,
        QPixmapCache,
        QPolygon,
        QPolygonF,
        QQuaternion,
        QRadialGradient,
        QRegExpValidator,
        QRegion,
        QResizeEvent,
        QSessionManager,
        QShortcutEvent,
        QShowEvent,
        QStandardItem,
        QStandardItemModel,
        QStatusTipEvent,
        QSyntaxHighlighter,
        QTabletEvent,
        QTextBlock,
        QTextBlockFormat,
        QTextBlockGroup,
        QTextBlockUserData,
        QTextCharFormat,
        QTextCursor,
        QTextDocument,
        QTextDocumentFragment,
        QTextFormat,
        QTextFragment,
        QTextFrame,
        QTextFrameFormat,
        QTextImageFormat,
        QTextInlineObject,
        QTextItem,
        QTextLayout,
        QTextLength,
        QTextLine,
        QTextList,
        QTextListFormat,
        QTextObject,
        QTextObjectInterface,
        QTextOption,
        QTextTable,
        QTextTableCell,
        QTextTableCellFormat,
        QTextTableFormat,
        QTouchEvent,
        QTransform,
        QValidator,
        QVector2D,
        QVector3D,
        QVector4D,
        QWhatsThisClickedEvent,
        QWheelEvent,
        QWindowStateChangeEvent,
        qAlpha,
        qBlue,
        qGray,
        qGreen,
        qIsGray,
        qRed,
        qRgb,
        qRgba,
        QIntValidator,
    )

    # QDesktopServices has has been split into (QDesktopServices and
    # QStandardPaths) in Qt5
    # It only exposes QDesktopServices that are still in pyqt5
    from PySide.QtGui import QDesktopServices as _QDesktopServices

    class QDesktopServices:
        openUrl = _QDesktopServices.openUrl
        setUrlHandler = _QDesktopServices.setUrlHandler
        unsetUrlHandler = _QDesktopServices.unsetUrlHandler

        def __getattr__(self, name):
            attr = getattr(_QDesktopServices, name)

            new_name = name
            if name == "storageLocation":
                new_name = "writableLocation"
            warnings.warn(
                (
                    "Warning QDesktopServices.{} is deprecated in Qt5"
                    "we recommend you use QDesktopServices.{} instead"
                ).format(name, new_name),
                DeprecationWarning,
            )
            return attr

    QDesktopServices = QDesktopServices()
else:
    raise PythonQtError("No Qt bindings could be found")
