Edwin Leuven wrote:
some people have complained the math panels cannot be torn-off (bugs
3839 and 3840)
the attached makes this work for QT_VERSION >= QT_VERSION_CHECK(4, 2, 0)
perhaps people can give it a try?
the updated attached patch works for me on windows (qt 4.2.2) and linux
(debian unstable, qt 4.2.3)
Index: src/frontends/qt4/QLToolbar.cpp
===================================================================
--- src/frontends/qt4/QLToolbar.cpp (revision 18767)
+++ src/frontends/qt4/QLToolbar.cpp (working copy)
@@ -207,14 +207,21 @@
}
case ToolbarItem::ICONPALETTE: {
QToolButton * tb = new QToolButton(this);
- tb->setCheckable(true);
tb->setToolTip(qt_(to_ascii(item.label_)));
tb->setStatusTip(qt_(to_ascii(item.label_)));
tb->setText(qt_(to_ascii(item.label_)));
connect(this, SIGNAL(iconSizeChanged(const QSize &)),
tb, SLOT(setIconSize(const QSize &)));
+#if QT_VERSION >= 0x040200
+ IconPalette * panel = new IconPalette(&owner_);
+ connect(panel, SIGNAL(enabled(bool)),
+ tb, SLOT(setEnabled(bool)));
+ connect(this, SIGNAL(iconSizeChanged(const QSize &)),
+ panel, SLOT(setIconSize(const QSize &)));
+#else
IconPalette * panel = new IconPalette(tb);
+#endif
connect(this, SIGNAL(updated()), panel, SLOT(updateParent()));
ToolbarInfo const & tbinfo =
toolbarbackend.getToolbar(item.name_);
ToolbarInfo::item_iterator it = tbinfo.items.begin();
@@ -232,8 +239,20 @@
if (it == tbinfo.items.begin())
tb->setIcon(QPixmap(getIcon(it->func_).c_str()));
}
+
+#if QT_VERSION >= 0x040200
+ QMenu * m = new QMenu(tb);
+ m->addAction(panel);
+ m->setTearOffEnabled(true);
+ m->setWindowTitle(qt_(to_ascii(item.label_)));
+ tb->setPopupMode(QToolButton::InstantPopup);
+ tb->setMenu(m);
+#else
+ tb->setCheckable(true);
connect(tb, SIGNAL(clicked(bool)), panel,
SLOT(setVisible(bool)));
connect(panel, SIGNAL(visible(bool)), tb,
SLOT(setChecked(bool)));
+#endif // QT_VERSION >= 0x040200
+
addWidget(tb);
break;
}
@@ -249,6 +268,8 @@
tb, SLOT(setIconSize(const QSize &)));
ButtonMenu * m = new ButtonMenu(qt_(to_ascii(item.label_)), tb);
+ m->setWindowTitle(qt_(to_ascii(item.label_)));
+ m->setTearOffEnabled(true);
connect(this, SIGNAL(updated()), m, SLOT(updateParent()));
ToolbarInfo const & tbinfo =
toolbarbackend.getToolbar(item.name_);
ToolbarInfo::item_iterator it = tbinfo.items.begin();
Index: src/frontends/qt4/IconPalette.h
===================================================================
--- src/frontends/qt4/IconPalette.h (revision 18767)
+++ src/frontends/qt4/IconPalette.h (working copy)
@@ -17,12 +17,40 @@
#include <QLayout>
#include "Action.h"
+// FIXME: this can go when we move to Qt 4.3
+#define QT_VERSION_CHECK(major, minor, patch) ((major<<16)|(minor<<8)|(patch))
+
+#if QT_VERSION >= QT_VERSION_CHECK(4, 2, 0)
+#include <QWidgetAction>
+#endif
+
namespace lyx {
namespace frontend {
/**
* For holding an arbitrary set of icons.
*/
+#if QT_VERSION >= QT_VERSION_CHECK(4, 2, 0)
+
+class IconPalette : public QWidgetAction {
+ Q_OBJECT
+public:
+ IconPalette(QWidget * parent);
+ void addButton(QAction *);
+ QWidget * createWidget(QWidget * parent);
+public Q_SLOTS:
+ void updateParent();
+ void setIconSize(const QSize &);
+Q_SIGNALS:
+ void enabled(bool);
+ void iconSizeChanged(const QSize &);
+private:
+ QList<QAction *> actions_;
+ QSize size_;
+};
+
+#else
+
class IconPalette : public QWidget {
Q_OBJECT
public:
@@ -49,6 +77,8 @@
QList<QAction *> actions_;
};
+#endif // QT_VERSION >= QT_VERSION_CHECK(4, 2, 0)
+
/**
* Popup menu for a toolbutton.
* We need this to keep track whether
Index: src/frontends/qt4/IconPalette.cpp
===================================================================
--- src/frontends/qt4/IconPalette.cpp (revision 18767)
+++ src/frontends/qt4/IconPalette.cpp (working copy)
@@ -24,11 +24,104 @@
#include <QPainter>
#include <QStyle>
#include <QStyleOptionFrame>
+#include <QMouseEvent>
namespace lyx {
namespace frontend {
+#if QT_VERSION >= 0x040200
+
+
+class MathButton : public QToolButton
+{
+public:
+ MathButton(QWidget * parent = 0);
+ void mouseReleaseEvent(QMouseEvent *event);
+ void mousePressEvent(QMouseEvent *event);
+};
+
+
+MathButton::MathButton(QWidget * parent)
+ : QToolButton(parent)
+{
+}
+
+
+void MathButton::mouseReleaseEvent(QMouseEvent *event)
+{
+ QToolButton::mouseReleaseEvent(event);
+ event->ignore();
+}
+
+
+void MathButton::mousePressEvent(QMouseEvent *event)
+{
+ QToolButton::mousePressEvent(event);
+ event->ignore();
+}
+
+
IconPalette::IconPalette(QWidget * parent)
+ : QWidgetAction(parent), size_(QSize(22,22))
+{
+}
+
+
+void IconPalette::addButton(QAction * action)
+{
+ actions_.push_back(action);
+}
+
+
+QWidget * IconPalette::createWidget(QWidget * parent)
+{
+ QWidget * widget = new QWidget(parent);
+ QGridLayout * layout = new QGridLayout(widget);
+ layout->setSpacing(0);
+ layout->setMargin(3);
+ widget->setLayout(layout);
+
+ for (int i = 0; i < actions_.size(); ++i) {
+ MathButton * tb = new MathButton(widget);
+ tb->setAutoRaise(true);
+ tb->setDefaultAction(actions_.at(i));
+ tb->setIconSize(size_);
+ connect(this, SIGNAL(iconSizeChanged(const QSize &)),
+ tb, SLOT(setIconSize(const QSize &)));
+
+ int const ncols = qMin(6, i + 1);
+ int const row = i/ncols + 1;
+ int const col = qMax(1, i + 1 - (row - 1) * 6);
+ layout->addWidget(tb, row, col);
+ }
+
+ return widget;
+}
+
+
+void IconPalette::setIconSize(const QSize & size)
+{
+ size_ = size;
+ // signal
+ iconSizeChanged(size);
+}
+
+
+void IconPalette::updateParent()
+{
+ bool enable = false;
+ for (int i = 0; i < actions_.size(); ++i)
+ if (actions_.at(i)->isEnabled()) {
+ enable = true;
+ break;
+ }
+ // signal
+ enabled(enable);
+}
+
+#else // QT_VERSION >= 0x040200
+
+IconPalette::IconPalette(QWidget * parent)
: QWidget(parent, Qt::Popup)
{
layout_ = new QGridLayout(this);
@@ -151,6 +244,7 @@
// draw the rest (buttons)
QWidget::paintEvent(event);
}
+#endif // QT_VERSION >= 0x040200
ButtonMenu::ButtonMenu(const QString & title, QWidget * parent)