Changeset 53610 in webkit
- Timestamp:
- Jan 21, 2010 12:10:46 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r53607 r53610 1 2010-01-21 Luiz Agostini <luiz.agostini@openbossa.org> 2 3 Reviewed by Kenneth Rohde Christiansen. 4 5 [Qt] Custom select popups. 6 https://bugs.webkit.org/show_bug.cgi?id=33418 7 8 Optimization of the WebCore support to combobox popup delegate. 9 10 * platform/qt/PopupMenuQt.cpp: 11 (WebCore::PopupMenu::show): 12 * platform/qt/QtAbstractWebPopup.cpp: 13 (WebCore::QtAbstractWebPopup::QtAbstractWebPopup): 14 (WebCore::QtAbstractWebPopup::itemType): 15 * platform/qt/QtAbstractWebPopup.h: 16 (WebCore::QtAbstractWebPopup::): 17 (WebCore::QtAbstractWebPopup::itemText): 18 (WebCore::QtAbstractWebPopup::itemToolTip): 19 (WebCore::QtAbstractWebPopup::itemIsEnabled): 20 (WebCore::QtAbstractWebPopup::itemCount): 21 (WebCore::QtAbstractWebPopup::view): 22 (WebCore::QtAbstractWebPopup::geometry): 23 (WebCore::QtAbstractWebPopup::currentIndex): 24 (WebCore::QtAbstractWebPopup::font): 25 1 26 2010-01-20 Adam Barth <abarth@webkit.org> 2 27 -
trunk/WebCore/platform/qt/PopupMenuQt.cpp
r53005 r53610 47 47 } 48 48 49 static QList<QtAbstractWebPopup::Item> getItems(PopupMenuClient* client)50 {51 QList<QtAbstractWebPopup::Item> result;52 53 int size = client->listSize();54 for (int i = 0; i < size; ++i) {55 QtAbstractWebPopup::Item item;56 57 if (client->itemIsSeparator(i))58 item.type = QtAbstractWebPopup::Item::Separator;59 else if (client->itemIsLabel(i))60 item.type = QtAbstractWebPopup::Item::Group;61 else62 item.type = QtAbstractWebPopup::Item::Option;63 64 item.text = client->itemText(i);65 item.toolTip = client->itemToolTip(i);66 item.enabled = client->itemIsEnabled(i);67 result.append(item);68 }69 return result;70 }71 72 49 void PopupMenu::show(const IntRect& rect, FrameView* view, int index) 73 50 { … … 76 53 ASSERT(chromeClient); 77 54 78 if (!m_popup) { 79 m_popup = chromeClient->createPopup(); 80 m_popup->m_client = m_popupClient; 81 } 55 if (!m_popup) 56 m_popup = chromeClient->createSelectPopup(); 82 57 83 m_popup-> setParent(chromeClient->platformPageClient()->ownerWidget());84 m_popup-> populate(m_popupClient->menuStyle().font().font(),85 getItems(m_popupClient));58 m_popup->m_client = m_popupClient; 59 m_popup->m_currentIndex = index; 60 m_popup->m_view = chromeClient->platformPageClient()->ownerWidget(); 86 61 87 QRect bounds = rect; 88 bounds.moveTopLeft(view->contentsToWindow(rect.topLeft())); 89 m_popup->show(bounds, index); 62 QRect geometry(rect); 63 geometry.moveTopLeft(view->contentsToWindow(rect.topLeft())); 64 m_popup->m_geometry = geometry; 65 66 m_popup->show(); 67 90 68 } 91 69 -
trunk/WebCore/platform/qt/QtAbstractWebPopup.cpp
r53005 r53610 28 28 QtAbstractWebPopup::QtAbstractWebPopup() 29 29 : m_client(0) 30 , m_view(0) 31 , m_currentIndex(-1) 30 32 { 31 33 } … … 47 49 } 48 50 51 QtAbstractWebPopup::ItemType QtAbstractWebPopup::itemType(int idx) const 52 { 53 if (m_client->itemIsSeparator(idx)) 54 return Separator; 55 if (m_client->itemIsLabel(idx)) 56 return Group; 57 return Option; 58 } 59 49 60 } // namespace WebCore -
trunk/WebCore/platform/qt/QtAbstractWebPopup.h
r53005 r53610 21 21 #define QtAbstractWebPopup_h 22 22 23 #include "PopupMenuClient.h" 24 23 25 #include <QFont> 24 26 #include <QList> 25 27 #include <QRect> 28 #include <QWidget> 26 29 27 30 namespace WebCore { 28 31 29 class PopupMenuClient;30 32 31 33 class QtAbstractWebPopup { 32 34 public: 33 struct Item { 34 enum { Option, Group, Separator } type; 35 QString text; 36 QString toolTip; 37 bool enabled; 38 }; 35 enum ItemType { Option, Group, Separator }; 36 37 ItemType itemType(int) const; 38 QString itemText(int idx) const { return m_client->itemText(idx); } 39 QString itemToolTip(int idx) const { return m_client->itemToolTip(idx); } 40 bool itemIsEnabled(int idx) const { return m_client->itemIsEnabled(idx); } 41 int itemCount() const { return m_client->listSize(); } 42 43 QWidget* view() { return m_view; } 44 QRect geometry() const { return m_geometry; } 45 int currentIndex() const { return m_currentIndex; } 39 46 40 47 QtAbstractWebPopup(); 41 48 virtual ~QtAbstractWebPopup(); 42 49 43 virtual void show( const QRect& geometry, int selectedIndex) = 0;50 virtual void show() = 0; 44 51 virtual void hide() = 0; 45 virtual void populate(const QFont& font, const QList<Item>& items) = 0;46 virtual void setParent(QWidget* parent) = 0;47 52 48 protected:49 53 void popupDidHide(bool acceptSuggestions); 50 54 void valueChanged(int index); 55 56 QFont font() { return m_client->menuStyle().font().font(); } 51 57 52 58 private: 53 59 friend class PopupMenu; 54 60 PopupMenuClient* m_client; 61 QWidget* m_view; 62 int m_currentIndex; 63 QRect m_geometry; 55 64 }; 56 65 -
trunk/WebKit/qt/ChangeLog
r53464 r53610 1 2010-01-21 Luiz Agostini <luiz.agostini@openbossa.org> 2 3 Reviewed by Kenneth Rohde Christiansen. 4 5 [Qt] Custom select popups. 6 https://bugs.webkit.org/show_bug.cgi?id=33418 7 8 Adjusting QtFallbackWebPopupCombo to the changes in WebCore layer. 9 10 * WebCoreSupport/ChromeClientQt.cpp: 11 (WebCore::ChromeClientQt::createSelectPopup): 12 * WebCoreSupport/ChromeClientQt.h: 13 * WebCoreSupport/QtFallbackWebPopup.cpp: 14 (WebCore::QtFallbackWebPopupCombo::QtFallbackWebPopupCombo): 15 (WebCore::QtFallbackWebPopupCombo::showPopup): 16 (WebCore::QtFallbackWebPopupCombo::hidePopup): 17 (WebCore::QtFallbackWebPopup::QtFallbackWebPopup): 18 (WebCore::QtFallbackWebPopup::~QtFallbackWebPopup): 19 (WebCore::QtFallbackWebPopup::show): 20 (WebCore::QtFallbackWebPopup::hide): 21 (WebCore::QtFallbackWebPopup::populate): 22 * WebCoreSupport/QtFallbackWebPopup.h: 23 1 24 2010-01-19 Steve Block <steveblock@google.com> 2 25 -
trunk/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
r53005 r53610 467 467 } 468 468 469 QtAbstractWebPopup* ChromeClientQt::create Popup()469 QtAbstractWebPopup* ChromeClientQt::createSelectPopup() 470 470 { 471 471 return new QtFallbackWebPopup; -
trunk/WebKit/qt/WebCoreSupport/ChromeClientQt.h
r53005 r53610 136 136 virtual void requestGeolocationPermissionForFrame(Frame*, Geolocation*); 137 137 138 QtAbstractWebPopup* create Popup();138 QtAbstractWebPopup* createSelectPopup(); 139 139 140 140 QWebPage* m_webPage; -
trunk/WebKit/qt/WebCoreSupport/QtFallbackWebPopup.cpp
r53005 r53610 32 32 namespace WebCore { 33 33 34 // QtFallbackWebPopup 35 36 QtFallbackWebPopup::QtFallbackWebPopup() 37 : QtAbstractWebPopup() 38 , m_popupVisible(false) 34 QtFallbackWebPopupCombo::QtFallbackWebPopupCombo(QtFallbackWebPopup& ownerPopup) 35 : m_ownerPopup(ownerPopup) 39 36 { 40 connect(this, SIGNAL(activated(int)),41 SLOT(activeChanged(int)), Qt::QueuedConnection);42 37 } 43 38 44 45 void QtFallbackWebPopup::show(const QRect& geometry, int selectedIndex) 39 void QtFallbackWebPopupCombo::showPopup() 46 40 { 47 setCurrentIndex(selectedIndex); 48 49 /* 50 QWidget* parent = 0; 51 if (client()->hostWindow() && client()->hostWindow()->platformPageClient()) 52 parent = client()->hostWindow()->platformPageClient()->ownerWidget(); 53 54 setParent(parent); 55 */ 56 57 setGeometry(QRect(geometry.left(), geometry.top(), geometry.width(), sizeHint().height())); 58 59 QMouseEvent event(QEvent::MouseButtonPress, QCursor::pos(), Qt::LeftButton, 60 Qt::LeftButton, Qt::NoModifier); 61 QCoreApplication::sendEvent(this, &event); 41 QComboBox::showPopup(); 42 m_ownerPopup.m_popupVisible = true; 62 43 } 63 44 64 void QtFallbackWebPopup::populate(const QFont& font, const QList<Item>& items) 65 { 66 clear(); 67 68 QStandardItemModel* model = qobject_cast<QStandardItemModel*>(QComboBox::model()); 69 Q_ASSERT(model); 70 71 setFont(font); 72 for (int i = 0; i < items.size(); ++i) { 73 switch (items[i].type) { 74 case QtAbstractWebPopup::Item::Separator: 75 insertSeparator(i); 76 break; 77 case QtAbstractWebPopup::Item::Group: 78 insertItem(i, items[i].text); 79 model->item(i)->setEnabled(false); 80 break; 81 case QtAbstractWebPopup::Item::Option: 82 insertItem(i, items[i].text); 83 model->item(i)->setEnabled(items[i].enabled); 84 break; 85 } 86 } 87 } 88 89 void QtFallbackWebPopup::showPopup() 90 { 91 QComboBox::showPopup(); 92 m_popupVisible = true; 93 } 94 95 void QtFallbackWebPopup::hidePopup() 45 void QtFallbackWebPopupCombo::hidePopup() 96 46 { 97 47 QWidget* activeFocus = QApplication::focusWidget(); 98 if (activeFocus && activeFocus == view()48 if (activeFocus && activeFocus == QComboBox::view() 99 49 && activeFocus->testAttribute(Qt::WA_InputMethodEnabled)) { 100 50 QInputContext* qic = activeFocus->inputContext(); … … 106 56 107 57 QComboBox::hidePopup(); 108 if (!m_ popupVisible)58 if (!m_ownerPopup.m_popupVisible) 109 59 return; 110 60 111 m_popupVisible = false; 112 popupDidHide(true); 61 m_ownerPopup.m_popupVisible = false; 62 m_ownerPopup.popupDidHide(true); 63 } 64 65 // QtFallbackWebPopup 66 67 QtFallbackWebPopup::QtFallbackWebPopup() 68 : QtAbstractWebPopup() 69 , m_popupVisible(false) 70 , m_combo(new QtFallbackWebPopupCombo(*this)) 71 { 72 connect(m_combo, SIGNAL(activated(int)), 73 SLOT(activeChanged(int)), Qt::QueuedConnection); 74 } 75 76 QtFallbackWebPopup::~QtFallbackWebPopup() 77 { 78 delete m_combo; 79 } 80 81 void QtFallbackWebPopup::show() 82 { 83 populate(); 84 m_combo->setParent(view()); 85 m_combo->setCurrentIndex(currentIndex()); 86 87 QRect rect = geometry(); 88 m_combo->setGeometry(QRect(rect.left(), rect.top(), 89 rect.width(), m_combo->sizeHint().height())); 90 91 QMouseEvent event(QEvent::MouseButtonPress, QCursor::pos(), Qt::LeftButton, 92 Qt::LeftButton, Qt::NoModifier); 93 QCoreApplication::sendEvent(m_combo, &event); 94 } 95 96 void QtFallbackWebPopup::hide() 97 { 98 m_combo->hidePopup(); 99 } 100 101 void QtFallbackWebPopup::populate() 102 { 103 m_combo->clear(); 104 105 QStandardItemModel* model = qobject_cast<QStandardItemModel*>(m_combo->model()); 106 Q_ASSERT(model); 107 108 m_combo->setFont(font()); 109 for (int i = 0; i < itemCount(); ++i) { 110 switch (itemType(i)) { 111 case Separator: 112 m_combo->insertSeparator(i); 113 break; 114 case Group: 115 m_combo->insertItem(i, itemText(i)); 116 model->item(i)->setEnabled(false); 117 break; 118 case Option: 119 m_combo->insertItem(i, itemText(i)); 120 model->item(i)->setEnabled(itemIsEnabled(i)); 121 break; 122 } 123 } 113 124 } 114 125 … … 121 132 } 122 133 123 void QtFallbackWebPopup::setParent(QWidget* parent)124 {125 QComboBox::setParent(parent);126 134 } 127 128 } -
trunk/WebKit/qt/WebCoreSupport/QtFallbackWebPopup.h
r53005 r53610 26 26 namespace WebCore { 27 27 28 class QtFallbackWebPopup : private QComboBox, public QtAbstractWebPopup { 28 class QtFallbackWebPopupCombo; 29 30 class QtFallbackWebPopup : public QObject, public QtAbstractWebPopup { 29 31 Q_OBJECT 30 32 public: 31 33 QtFallbackWebPopup(); 34 ~QtFallbackWebPopup(); 32 35 33 virtual void show(const QRect& geometry, int selectedIndex); 34 virtual void hide() { hidePopup(); } 35 virtual void populate(const QFont& font, const QList<Item>& items); 36 virtual void setParent(QWidget* parent); 36 virtual void show(); 37 virtual void hide(); 37 38 38 39 private slots: … … 40 41 41 42 private: 43 friend class QtFallbackWebPopupCombo; 42 44 bool m_popupVisible; 45 QtFallbackWebPopupCombo* m_combo; 43 46 47 void populate(); 48 }; 44 49 50 class QtFallbackWebPopupCombo : public QComboBox { 51 public: 52 QtFallbackWebPopupCombo(QtFallbackWebPopup& ownerPopup); 45 53 virtual void showPopup(); 46 54 virtual void hidePopup(); 55 56 private: 57 QtFallbackWebPopup& m_ownerPopup; 47 58 }; 48 59
Note: See TracChangeset
for help on using the changeset viewer.