src/gui/widgets/qpushbutton.cpp
changeset 33 3e2da88830cd
parent 18 2f34d5167611
child 37 758a864f9613
--- a/src/gui/widgets/qpushbutton.cpp	Tue Jul 06 15:10:48 2010 +0300
+++ b/src/gui/widgets/qpushbutton.cpp	Wed Aug 18 10:37:55 2010 +0300
@@ -58,6 +58,10 @@
 #include "qdebug.h"
 #include "qlayoutitem.h"
 #include "qdialogbuttonbox.h"
+#ifdef Q_WS_MAC
+#include "qmacstyle_mac.h"
+#include "private/qmacstyle_mac_p.h"
+#endif // Q_WS_MAC
 
 #ifndef QT_NO_ACCESSIBILITY
 #include "qaccessible.h"
@@ -679,6 +683,37 @@
     return QAbstractButton::event(e);
 }
 
+#ifdef Q_WS_MAC
+/*! \reimp */
+bool QPushButton::hitButton(const QPoint &pos) const
+{
+    // This is only required if we are using the native style, so check that first.
+        QMacStyle *macStyle = qobject_cast<QMacStyle *>(style());
+    // If this is a flat button we just bail out.
+    if(isFlat() || (0 == macStyle))
+        return QAbstractButton::hitButton(pos);
+    // Now that we know we are using the native style, let's proceed.
+    Q_D(const QPushButton);
+    QPushButtonPrivate *nonConst = const_cast<QPushButtonPrivate *>(d);
+    // In OSX buttons are round, which causes the hit method to be special.
+    // We cannot simply relay on detecting if something is inside the rect or not,
+    // we need to check if it is inside the "rounded area" or not. A point might
+    // be inside the rect but not inside the rounded area.
+    // Notice this method is only reimplemented for OSX.
+    return nonConst->hitButton(pos);
+}
+
+bool QPushButtonPrivate::hitButton(const QPoint &pos)
+{
+    Q_Q(QPushButton);
+    QRect roundedRect(q->rect().left() + QMacStylePrivate::PushButtonLeftOffset,
+                      q->rect().top() + QMacStylePrivate::PushButtonContentPadding,
+                      q->rect().width() - QMacStylePrivate::PushButtonRightOffset,
+                      q->rect().height() - QMacStylePrivate::PushButtonBottomOffset);
+    return roundedRect.contains(pos);
+}
+#endif // Q_WS_MAC
+
 #ifdef QT3_SUPPORT
 /*!
     Use one of the constructors that doesn't take the \a name