+TearOff::TearOff(QWidget * parent)
+ : QWidget(parent)
+{
+ highlighted_ = false;
+ // + 2 because the default is a bit tight, see also:
+ // http://trolltech.com/developer/task-tracker/index_html?id=167954&method=entry
+ setMinimumHeight(style()->pixelMetric(QStyle::PM_MenuTearoffHeight) + 2);
+ setToolTip(qt_("Click to detach"));
+ // trigger tooltip (children of popups do not receive mousemove events)
+ setMouseTracking(true);
+}
+
+
+void TearOff::mouseReleaseEvent(QMouseEvent * /*event*/)
+{
+ // signal
+ tearOff();
+}
+
+
+void TearOff::enterEvent(QEvent * event)
+{
+ highlighted_ = true;
+ update();
+ event->ignore();
+}
+
+
+void TearOff::leaveEvent(QEvent * event)
+{
+ highlighted_ = false;
+ update();
+ event->ignore();
+}
+
+
+void TearOff::paintEvent(QPaintEvent * /*event*/)
+{
+ QPainter p(this);
+ const int fw = style()->pixelMetric(QStyle::PM_MenuPanelWidth, 0, this);
+ QStyleOptionMenuItem menuOpt;
+ menuOpt.initFrom(this);
+ menuOpt.palette = palette();
+ menuOpt.state = QStyle::State_None;
+ menuOpt.checkType = QStyleOptionMenuItem::NotCheckable;
+ menuOpt.menuRect = rect();
+ menuOpt.maxIconWidth = 0;
+ menuOpt.tabWidth = 0;
+ menuOpt.menuItemType = QStyleOptionMenuItem::TearOff;
+ menuOpt.rect.setRect(fw, fw, width() - (fw * 2),
+ style()->pixelMetric(QStyle::PM_MenuTearoffHeight, 0, this));
+ p.setClipRect(menuOpt.rect);
+ menuOpt.state = QStyle::State_None;
+ if (highlighted_)
+ menuOpt.state |= QStyle::State_Selected;
+ style()->drawControl(QStyle::CE_MenuTearoff, &menuOpt, &p, this);
+}
+
+