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)

Reply via email to