diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQt.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQt.cpp | 227 |
1 files changed, 1 insertions, 226 deletions
diff --git a/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQt.cpp b/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQt.cpp index 249de62ec..066e273a9 100644 --- a/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQt.cpp +++ b/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQt.cpp @@ -27,6 +27,7 @@ #include "config.h" #include "WebPopupMenuProxyQt.h" +#include "ItemSelectorContextObject.h" #include "PlatformPopupMenuData.h" #include "WebPopupItem.h" #include "qquickwebview_p.h" @@ -39,229 +40,6 @@ using namespace WebCore; namespace WebKit { -static QHash<int, QByteArray> createRoleNamesHash(); - -class PopupMenuItemModel final : public QAbstractListModel { - Q_OBJECT - -public: - enum Roles { - GroupRole = Qt::UserRole, - EnabledRole = Qt::UserRole + 1, - SelectedRole = Qt::UserRole + 2, - IsSeparatorRole = Qt::UserRole + 3 - }; - - PopupMenuItemModel(const Vector<WebPopupItem>&, bool multiple); - int rowCount(const QModelIndex& parent = QModelIndex()) const final { return m_items.size(); } - QVariant data(const QModelIndex&, int role = Qt::DisplayRole) const final; - QHash<int, QByteArray> roleNames() const final; - - Q_INVOKABLE void select(int); - - int selectedOriginalIndex() const; - bool multiple() const { return m_allowMultiples; } - void toggleItem(int); - -Q_SIGNALS: - void indexUpdated(); - -private: - struct Item { - Item(const WebPopupItem& webPopupItem, const QString& group, int originalIndex) - : text(webPopupItem.m_text) - , toolTip(webPopupItem.m_toolTip) - , group(group) - , originalIndex(originalIndex) - , enabled(webPopupItem.m_isEnabled) - , selected(webPopupItem.m_isSelected) - , isSeparator(webPopupItem.m_type == WebPopupItem::Separator) - { } - - QString text; - QString toolTip; - QString group; - // Keep track of originalIndex because we don't add the label (group) items to our vector. - int originalIndex; - bool enabled; - bool selected; - bool isSeparator; - }; - - void buildItems(const Vector<WebPopupItem>& webPopupItems); - - Vector<Item> m_items; - int m_selectedModelIndex; - bool m_allowMultiples; -}; - -class ItemSelectorContextObject : public QObject { - Q_OBJECT - Q_PROPERTY(QRectF elementRect READ elementRect CONSTANT FINAL) - Q_PROPERTY(QObject* items READ items CONSTANT FINAL) - Q_PROPERTY(bool allowMultiSelect READ allowMultiSelect CONSTANT FINAL) - -public: - ItemSelectorContextObject(const QRectF& elementRect, const Vector<WebPopupItem>&, bool multiple); - - QRectF elementRect() const { return m_elementRect; } - PopupMenuItemModel* items() { return &m_items; } - bool allowMultiSelect() { return m_items.multiple(); } - - Q_INVOKABLE void accept(int index = -1); - Q_INVOKABLE void reject() { emit done(); } - Q_INVOKABLE void dismiss() { emit done(); } - -Q_SIGNALS: - void acceptedWithOriginalIndex(int); - void done(); - -private Q_SLOTS: - void onIndexUpdate(); - -private: - QRectF m_elementRect; - PopupMenuItemModel m_items; -}; - -ItemSelectorContextObject::ItemSelectorContextObject(const QRectF& elementRect, const Vector<WebPopupItem>& webPopupItems, bool multiple) - : m_elementRect(elementRect) - , m_items(webPopupItems, multiple) -{ - connect(&m_items, SIGNAL(indexUpdated()), SLOT(onIndexUpdate())); -} - -void ItemSelectorContextObject::onIndexUpdate() -{ - // Send the update for multi-select list. - if (m_items.multiple()) - emit acceptedWithOriginalIndex(m_items.selectedOriginalIndex()); -} - - -void ItemSelectorContextObject::accept(int index) -{ - // If the index is not valid for multi-select lists, just hide the pop up as the selected indices have - // already been sent. - if ((index == -1) && m_items.multiple()) - emit done(); - else { - if (index != -1) - m_items.toggleItem(index); - emit acceptedWithOriginalIndex(m_items.selectedOriginalIndex()); - } -} - -static QHash<int, QByteArray> createRoleNamesHash() -{ - QHash<int, QByteArray> roles; - roles[Qt::DisplayRole] = "text"; - roles[Qt::ToolTipRole] = "tooltip"; - roles[PopupMenuItemModel::GroupRole] = "group"; - roles[PopupMenuItemModel::EnabledRole] = "enabled"; - roles[PopupMenuItemModel::SelectedRole] = "selected"; - roles[PopupMenuItemModel::IsSeparatorRole] = "isSeparator"; - return roles; -} - -PopupMenuItemModel::PopupMenuItemModel(const Vector<WebPopupItem>& webPopupItems, bool multiple) - : m_selectedModelIndex(-1) - , m_allowMultiples(multiple) -{ - buildItems(webPopupItems); -} - -QHash<int, QByteArray> PopupMenuItemModel::roleNames() const -{ - static QHash<int, QByteArray> roles = createRoleNamesHash(); - return roles; -} - -QVariant PopupMenuItemModel::data(const QModelIndex& index, int role) const -{ - if (!index.isValid() || index.row() < 0 || index.row() >= m_items.size()) - return QVariant(); - - const Item& item = m_items[index.row()]; - if (item.isSeparator) { - if (role == IsSeparatorRole) - return true; - return QVariant(); - } - - switch (role) { - case Qt::DisplayRole: - return item.text; - case Qt::ToolTipRole: - return item.toolTip; - case GroupRole: - return item.group; - case EnabledRole: - return item.enabled; - case SelectedRole: - return item.selected; - case IsSeparatorRole: - return false; - } - - return QVariant(); -} - -void PopupMenuItemModel::select(int index) -{ - toggleItem(index); - emit indexUpdated(); -} - -void PopupMenuItemModel::toggleItem(int index) -{ - int oldIndex = m_selectedModelIndex; - if (index < 0 || index >= m_items.size()) - return; - Item& item = m_items[index]; - if (!item.enabled) - return; - - m_selectedModelIndex = index; - if (m_allowMultiples) - item.selected = !item.selected; - else { - if (index == oldIndex) - return; - item.selected = true; - if (oldIndex != -1) { - Item& oldItem = m_items[oldIndex]; - oldItem.selected = false; - emit dataChanged(this->index(oldIndex), this->index(oldIndex)); - } - } - - emit dataChanged(this->index(index), this->index(index)); -} - -int PopupMenuItemModel::selectedOriginalIndex() const -{ - if (m_selectedModelIndex == -1) - return -1; - return m_items[m_selectedModelIndex].originalIndex; -} - -void PopupMenuItemModel::buildItems(const Vector<WebPopupItem>& webPopupItems) -{ - QString currentGroup; - m_items.reserveInitialCapacity(webPopupItems.size()); - for (int i = 0; i < webPopupItems.size(); i++) { - const WebPopupItem& webPopupItem = webPopupItems[i]; - if (webPopupItem.m_isLabel) { - currentGroup = webPopupItem.m_text; - continue; - } - if (webPopupItem.m_isSelected && !m_allowMultiples) - m_selectedModelIndex = m_items.size(); - m_items.append(Item(webPopupItem, currentGroup, i)); - } -} - WebPopupMenuProxyQt::WebPopupMenuProxyQt(WebPopupMenuProxy::Client& client, QQuickWebView* webView) : WebPopupMenuProxy(client) , m_webView(webView) @@ -348,8 +126,5 @@ void WebPopupMenuProxyQt::createContext(QQmlComponent* component, QObject* conte } // namespace WebKit -// Since we define QObjects in WebPopupMenuProxyQt.cpp, this will trigger moc to run on .cpp. -#include "WebPopupMenuProxyQt.moc" - // And we can't compile the moc for WebPopupMenuProxyQt.h by itself, since it doesn't include "config.h" #include "moc_WebPopupMenuProxyQt.cpp" |