Mercurial > projects > qtd
diff demos/browser/modelmenu.d @ 73:7bfd46c330dc
more porting
author | mandel |
---|---|
date | Fri, 22 May 2009 10:59:00 +0000 |
parents | 71b382c10ef6 |
children | 37caa90ce503 |
line wrap: on
line diff
--- a/demos/browser/modelmenu.d Wed May 20 22:44:31 2009 +0000 +++ b/demos/browser/modelmenu.d Fri May 22 10:59:00 2009 +0000 @@ -38,217 +38,218 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ +module modelmenu; -import QtGui.QMenu -import QtCore.QAbstractItemModel; -import modelmenu; +import qt.gui.QMenu +import qt.core.QAbstractItemModel; -import QtCore.QAbstractItemModel; +import qt.core.QAbstractItemModel; import qdebug; - // A QMenu that is dynamically populated from a QAbstractItemModel class ModelMenu : public QMenu { - Q_OBJECT - -signals: - void activated(const QModelIndex &index); - void hovered(const QString &text); + +mixin Signal!("activated", QModelIndex index); +mixin Signal!("hovered", QString text); public: - ModelMenu(QWidget *parent = null) -{ - super(parent); - m_maxRows = 7; - m_firstSeparator = -1; - m_maxWidth = -1; - m_hoverRole = 0; - m_separatorRole = 0; - m_model = 0; - connect(this, SIGNAL(aboutToShow()), this, SLOT(aboutToShow())); -} - void setModel(QAbstractItemModel *model) -{ - m_model = model; -} + this(QWidget parent = null) + { + super(parent); + m_maxRows = 7; + m_firstSeparator = -1; + m_maxWidth = -1; + m_hoverRole = 0; + m_separatorRole = 0; + m_model = 0; + this.aboutToShow.connect(&this.aboutToShow); + } + + void setModel(QAbstractItemModel model) + { + m_model = model; + } - QAbstractItemModel *model() const -{ - return m_model; -} + QAbstractItemModel model() + { + return m_model; + } - void setMaxRows(int max) -{ - m_maxRows = max; -} + void setMaxRows(int max) + { + m_maxRows = max; + } - int maxRows() const -{ - return m_maxRows; -} + int maxRows() + { + return m_maxRows; + } - void setFirstSeparator(int offset) -{ - m_firstSeparator = offset; -} + void setFirstSeparator(int offset) + { + m_firstSeparator = offset; + } - int firstSeparator() const -{ - return m_firstSeparator; -} + int firstSeparator() + { + return m_firstSeparator; + } - void setRootIndex(const QModelIndex &index) -{ - m_root = index; -} - QModelIndex rootIndex() const -{ - return m_root; -} + void setRootIndex(QModelIndex index) + { + m_root = index; + } + + QModelIndex rootIndex() + { + return m_root; + } - void setHoverRole(int role) -{ - m_hoverRole = role; -} - int hoverRole() const -{ - return m_hoverRole; -} - - void setSeparatorRole(int role) -{ - m_separatorRole = role; -} + void setHoverRole(int role) + { + m_hoverRole = role; + } + + int hoverRole() + { + return m_hoverRole; + } - int separatorRole() const -{ - return m_separatorRole; -} + void setSeparatorRole(int role) + { + m_separatorRole = role; + } - QAction *makeAction(const QIcon &icon, const QString &text, QObject *parent); -{ - QFontMetrics fm(font()); - if (-1 == m_maxWidth) - m_maxWidth = fm.width(QLatin1Char('m')) * 30; - QString smallText = fm.elidedText(text, Qt.ElideMiddle, m_maxWidth); - return new QAction(icon, smallText, parent); -} + int separatorRole() + { + return m_separatorRole; + } + + QAction makeAction(QIcon icon, QString text, QObject parent); + { + QFontMetrics fm(font()); + if (-1 == m_maxWidth) + m_maxWidth = fm.width(QLatin1Char('m')) * 30; + QString smallText = fm.elidedText(text, Qt.ElideMiddle, m_maxWidth); + return new QAction(icon, smallText, parent); + } protected: - // add any actions before the tree, return true if any actions are added. - virtual bool prePopulated() -{ - return false; -} - // add any actions after the tree - virtual void postPopulated() -{ -} - // put all of the children of parent into menu up to max - void createMenu(const QModelIndex &parent, int max, QMenu *parentMenu = null, QMenu *menu = null) -{ - if (!menu) { - QString title = parent.data().toString(); - menu = new QMenu(title, this); - QIcon icon = qvariant_cast<QIcon>(parent.data(Qt.DecorationRole)); - menu.setIcon(icon); - parentMenu.addMenu(menu); - QVariant v; - v.setValue(parent); - menu.menuAction().setData(v); - connect(menu, SIGNAL(aboutToShow()), this, SLOT(aboutToShow())); - return; - } - - int end = m_model.rowCount(parent); - if (max != -1) - end = qMin(max, end); - - connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(triggered(QAction*))); - connect(menu, SIGNAL(hovered(QAction*)), this, SLOT(hovered(QAction*))); + // add any actions before the tree, return true if any actions are added. + bool prePopulated() + { + return false; + } + + // add any actions after the tree + void postPopulated() + { + } - for (int i = 0; i < end; ++i) { - QModelIndex idx = m_model.index(i, 0, parent); - if (m_model.hasChildren(idx)) { - createMenu(idx, -1, menu); - } else { - if (m_separatorRole != 0 - && idx.data(m_separatorRole).toBool()) - addSeparator(); - else - menu.addAction(makeAction(idx)); - } - if (menu == this && i == m_firstSeparator - 1) - addSeparator(); - } -} - -private slots: -Q_DECLARE_METATYPE(QModelIndex) -void aboutToShow() -{ - if (QMenu *menu = qobject_cast<QMenu*>(sender())) { - QVariant v = menu.menuAction().data(); - if (v.canConvert<QModelIndex>()) { - QModelIndex idx = qvariant_cast<QModelIndex>(v); - createMenu(idx, -1, menu, menu); - disconnect(menu, SIGNAL(aboutToShow()), this, SLOT(aboutToShow())); - return; - } - } + // put all of the children of parent into menu up to max + void createMenu(QModelIndex parent, int max, QMenu parentMenu = null, QMenu menu = null) + { + if (!menu) { + QString title = parent.data().toString(); + menu = new QMenu(title, this); + QIcon icon = qvariant_cast<QIcon>(parent.data(Qt.DecorationRole)); + menu.setIcon(icon); + parentMenu.addMenu(menu); + QVariant v; + v.setValue(parent); + menu.menuAction().setData(v); + connect(menu, SIGNAL(aboutToShow()), this, SLOT(aboutToShow())); + return; + } - clear(); - if (prePopulated()) - addSeparator(); - int max = m_maxRows; - if (max != -1) - max += m_firstSeparator; - createMenu(m_root, max, this, this); - postPopulated(); -} + int end = m_model.rowCount(parent); + if (max != -1) + end = qMin(max, end); + menu.triggered.connect(&this.triggered); + menu.hovered.connect(&this.hovered); - void triggered(QAction *action) -{ - QVariant v = action.data(); - if (v.canConvert<QModelIndex>()) { - QModelIndex idx = qvariant_cast<QModelIndex>(v); - emit activated(idx); - } -} - - void hovered(QAction *action) -{ - QVariant v = action.data(); - if (v.canConvert<QModelIndex>()) { - QModelIndex idx = qvariant_cast<QModelIndex>(v); - QString hoveredString = idx.data(m_hoverRole).toString(); - if (!hoveredString.isEmpty()) - emit hovered(hoveredString); - } -} + for (int i = 0; i < end; ++i) { + QModelIndex idx = m_model.index(i, 0, parent); + if (m_model.hasChildren(idx)) { + createMenu(idx, -1, menu); + } else { + if (m_separatorRole != 0 && idx.data(m_separatorRole).toBool()) + addSeparator(); + else + menu.addAction(makeAction(idx)); + } + if (menu == this && i == m_firstSeparator - 1) + addSeparator(); + } + } private: - QAction *makeAction(const QModelIndex &index); -{ - QIcon icon = qvariant_cast<QIcon>(index.data(Qt.DecorationRole)); - QAction *action = makeAction(icon, index.data().toString(), this); - QVariant v; - v.setValue(index); - action.setData(v); - return action; + + void aboutToShow() + { + if (QMenu menu = qobject_cast<QMenu>(sender())) { + QVariant v = menu.menuAction().data(); + if (v.canConvert<QModelIndex>()) { + QModelIndex idx = qvariant_cast<QModelIndex>(v); + createMenu(idx, -1, menu, menu); + menu.aboutToShow.disconnect(&this.aboutToShow); + return; + } + } + + clear(); + if (prePopulated()) + addSeparator(); + int max = m_maxRows; + if (max != -1) + max += m_firstSeparator; + createMenu(m_root, max, this, this); + postPopulated(); + } + + void triggered(QAction action) + { + QVariant v = action.data(); + if (v.canConvert<QModelIndex>()) { + QModelIndex idx = qvariant_cast<QModelIndex>(v); + emit activated(idx); + } + } + + void hovered(QAction action) + { + QVariant v = action.data(); + if (v.canConvert<QModelIndex>()) { + QModelIndex idx = qvariant_cast<QModelIndex>(v); + QString hoveredString = idx.data(m_hoverRole).toString(); + if (!hoveredString.isEmpty()) + emit hovered(hoveredString); + } + } + +private: + + QAction makeAction(QModelIndex index); + { + QIcon icon = qvariant_cast<QIcon>(index.data(Qt.DecorationRole)); + QAction action = makeAction(icon, index.data().toString(), this); + QVariant v; + v.setValue(index); + action.setData(v); + return action; + } + + int m_maxRows; + int m_firstSeparator; + int m_maxWidth; + int m_hoverRole; + int m_separatorRole; + QAbstractItemModel m_model; + QPersistentModelIndex m_root; } - - int m_maxRows; - int m_firstSeparator; - int m_maxWidth; - int m_hoverRole; - int m_separatorRole; - QAbstractItemModel *m_model; - QPersistentModelIndex m_root; -}