#include "IconPalette.h"
#include "qt_helpers.h"
-#include "controllers/ControlMath.h" // for find_xpm
#include <QPixmap>
#include <QGridLayout>
#include <QPainter>
#include <QStyle>
#include <QStyleOptionFrame>
+#include <QMouseEvent>
+#include <QVBoxLayout>
namespace lyx {
namespace frontend {
+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);
+}
+
+
IconPalette::IconPalette(QWidget * parent)
- : QWidget(parent, Qt::Popup)
+ : QWidget(parent, Qt::Popup), tornoff_(false)
{
- layout_ = new QGridLayout(this);
+ QVBoxLayout * v = new QVBoxLayout(this);
+ v->setMargin(0);
+ v->setSpacing(0);
+ layout_ = new QGridLayout;
layout_->setSpacing(0);
- layout_->setMargin(3);
- setLayout(layout_);
+ const int fw = style()->pixelMetric(QStyle::PM_MenuPanelWidth, 0, this);
+ layout_->setMargin(fw);
+ tearoffwidget_ = new TearOff(this);
+ connect(tearoffwidget_, SIGNAL(tearOff()), this, SLOT(tearOff()));
+ v->addWidget(tearoffwidget_);
+ v->addLayout(layout_);
}
QToolButton * tb = new QToolButton;
tb->setAutoRaise(true);
tb->setDefaultAction(action);
+ // trigger tooltip (children of popups do not receive mousemove events)
+ tb->setMouseTracking(true);
+
connect(tb, SIGNAL(triggered(QAction *)),
this, SLOT(clicked(QAction *)));
QToolBar * toolbar = qobject_cast<QToolBar *>(parentWidget()->parentWidget());
connect(toolbar, SIGNAL(iconSizeChanged(const QSize &)),
tb, SLOT(setIconSize(const QSize &)));
+ tb->setIconSize(toolbar->iconSize());
int const i = actions_.size();
int const ncols = qMin(6, i);
}
+void IconPalette::tearOff()
+{
+ blockSignals(true);
+ hide();
+ setWindowFlags(Qt::Tool);
+ tornoff_ = true;
+ tearoffwidget_->setVisible(!tornoff_);
+ show();
+ blockSignals(false);
+}
+
+
void IconPalette::clicked(QAction * action)
{
triggered(action);
- setVisible(false);
+ if (!tornoff_)
+ setVisible(false);
}
-void IconPalette::showEvent(QShowEvent * event)
+void IconPalette::showEvent(QShowEvent * /*event*/)
{
+ resize(sizeHint());
+ setMaximumSize(sizeHint());
+
int hoffset = - parentWidget()->pos().x();
int voffset = - parentWidget()->pos().y();
int const parwidth = parentWidget()->geometry().width();
voffset += parheight;
}
- move(gpos.x() + hoffset, gpos.y() + voffset);
- QWidget::showEvent(event);
+ QRect r = rect();
+ r.moveTo(gpos.x() + hoffset, gpos.y() + voffset);
+ setGeometry(r);
}
void IconPalette::hideEvent(QHideEvent * event )
{
- visible(false);
QWidget::hideEvent(event);
+ visible(false);
+ if (tornoff_) {
+ setWindowFlags(Qt::Popup);
+ tornoff_ = false;
+ tearoffwidget_->setVisible(!tornoff_);
+ }
}
-void IconPalette::updateParent()
-{
- bool enable = false;
- for (int i = 0; i < actions_.size(); ++i)
- if (actions_.at(i)->isEnabled()) {
- enable = true;
- break;
- }
-
- parentWidget()->setEnabled(enable);
-}
-
-
-void IconPalette::paintEvent(QPaintEvent * event)
+void IconPalette::paintEvent(QPaintEvent * /*event*/)
{
// draw border
- QPainter p(this);
- QRegion emptyArea = QRegion(rect());
const int fw = style()->pixelMetric(QStyle::PM_MenuPanelWidth, 0, this);
- if (fw) {
+ if (fw && !tornoff_) {
+ QPainter p(this);
QRegion borderReg;
- borderReg += QRect(0, 0, fw, height()); //left
- borderReg += QRect(width()-fw, 0, fw, height()); //right
- borderReg += QRect(0, 0, width(), fw); //top
- borderReg += QRect(0, height()-fw, width(), fw); //bottom
+ borderReg += QRegion(QRect(0, 0, fw, height())); //left
+ borderReg += QRegion(QRect(width() - fw, 0, fw, height())); //right
+ borderReg += QRegion(QRect(0, 0, width(), fw)); //top
+ borderReg += QRegion(QRect(0, height() - fw, width(), fw)); //bottom
p.setClipRegion(borderReg);
- emptyArea -= borderReg;
QStyleOptionFrame frame;
frame.rect = rect();
frame.palette = palette();
frame.midLineWidth = 0;
style()->drawPrimitive(QStyle::PE_FrameMenu, &frame, &p, this);
}
- p.end();
- // draw the rest (buttons)
- QWidget::paintEvent(event);
}
void ButtonMenu::updateParent()
{
bool enable = false;
- for (int i = 0; i < actions_.size(); ++i)
+ // FIXME: so this is commented out for speed considerations
+ // true fix is to repair the updating mechanism of the toolbar
+#if 0
+ for (int i = 0; i < actions_.size(); ++i)
if (actions_.at(i)->isEnabled()) {
enable = true;
break;
}
+#else
+ // we check only the first action to enable/disable the menu
+ if (!actions_.isEmpty())
+ enable = actions_.at(0)->isEnabled();
+#endif
parentWidget()->setEnabled(enable);
}
} // namespace frontend
} // namespace lyx
-#include "IconPalette_moc.cpp"
+#include "moc_IconPalette.cpp"