From d63e7d8ec0c9337999a3d90b594eb3e955145de9 Mon Sep 17 00:00:00 2001 From: Prasanth Ullattil Date: Thu, 24 Jun 2010 10:34:56 +0200 Subject: QKeyEvent::text() inconsistency between Linux and Mac For a key event triggered by the cursor keys, QKeyEvent::text() returns char with value 0x14 or similar. This patch (Cocoa only)will remove text from all key events for the unicode range 0xF700-0xF747. This is part of the corporate unicode range used by apple for keyboard function keys. [http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/CORPCHAR.TXT] Task-number: QTBUG-11225 Reviewed-by: Bradley T. Hughes --- src/gui/kernel/qkeymapper_mac.cpp | 15 ++++++++++++++- src/gui/kernel/qt_cocoa_helpers_mac.mm | 7 ++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/gui/kernel/qkeymapper_mac.cpp b/src/gui/kernel/qkeymapper_mac.cpp index 873b8f9..3dc6afc 100644 --- a/src/gui/kernel/qkeymapper_mac.cpp +++ b/src/gui/kernel/qkeymapper_mac.cpp @@ -866,14 +866,27 @@ bool QKeyMapperPrivate::translateKeyEvent(QWidget *widget, EventHandlerCallRef e UInt32 macModifiers = 0; GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, 0, sizeof(macModifiers), 0, &macModifiers); +#ifdef QT_MAC_USE_COCOA + // The unicode characters in the range 0xF700-0xF747 are reserved + // by Mac OS X for transient use as keyboard function keys. We + // wont send 'text' for such key events. This is done to match + // behavior on other platforms. + unsigned int *unicodeKey = (unsigned int*)info; + if (*unicodeKey >= 0xf700 && *unicodeKey <= 0xf747) + text = QString(); + bool isAccepted; +#endif handled_event = QKeyMapper::sendKeyEvent(widget, grab, (ekind == kEventRawKeyUp) ? QEvent::KeyRelease : QEvent::KeyPress, qtKey, modifiers, text, ekind == kEventRawKeyRepeat, 0, macScanCode, macVirtualKey, macModifiers #ifdef QT_MAC_USE_COCOA - ,static_cast(info) + ,&isAccepted #endif ); +#ifdef QT_MAC_USE_COCOA + *unicodeKey = (unsigned int)isAccepted; +#endif } return handled_event; } diff --git a/src/gui/kernel/qt_cocoa_helpers_mac.mm b/src/gui/kernel/qt_cocoa_helpers_mac.mm index 8cef03c..3fc27f4 100644 --- a/src/gui/kernel/qt_cocoa_helpers_mac.mm +++ b/src/gui/kernel/qt_cocoa_helpers_mac.mm @@ -682,10 +682,12 @@ bool qt_dispatchKeyEvent(void * /*NSEvent * */ keyEvent, QWidget *widgetToGetEve NSEvent *event = static_cast(keyEvent); EventRef key_event = static_cast(const_cast([event eventRef])); Q_ASSERT(key_event); + unsigned int info = 0; if ([event type] == NSKeyDown) { NSString *characters = [event characters]; unichar value = [characters characterAtIndex:0]; qt_keymapper_private()->updateKeyMap(0, key_event, (void *)&value); + info = value; } // Redirect keys to alien widgets. @@ -701,9 +703,8 @@ bool qt_dispatchKeyEvent(void * /*NSEvent * */ keyEvent, QWidget *widgetToGetEve if (mustUseCocoaKeyEvent()) return qt_dispatchKeyEventWithCocoa(keyEvent, widgetToGetEvent); - bool isAccepted; - bool consumed = qt_keymapper_private()->translateKeyEvent(widgetToGetEvent, 0, key_event, &isAccepted, true); - return consumed && isAccepted; + bool consumed = qt_keymapper_private()->translateKeyEvent(widgetToGetEvent, 0, key_event, &info, true); + return consumed && (info != 0); #endif } -- cgit v0.12 From 598ba59b9d2e4b28469088d4ef12407b0c27514a Mon Sep 17 00:00:00 2001 From: Prasanth Ullattil Date: Thu, 24 Jun 2010 12:32:42 +0200 Subject: Child windows shown automatically when their parent is shown(Cocoa). While setting up the stacking order for child windows, their hidden state was never taken into consideration. Task-number: QTBUG-11239 Reviewed-by: Richard Moe Gustavsen --- src/gui/kernel/qwidget_mac.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 280712a..a9bb691 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -2804,7 +2804,7 @@ void QWidgetPrivate::setSubWindowStacking(bool set) QList widgets = q->findChildren(); for (int i=0; iisWindow() && child->testAttribute(Qt::WA_WState_Created)) { + if (child->isWindow() && child->testAttribute(Qt::WA_WState_Created) && child->isVisibleTo(q)) { if (set) [qt_mac_window_for(q) addChildWindow:qt_mac_window_for(child) ordered:NSWindowAbove]; else -- cgit v0.12 From 3119f5e2d675ba5d39e94cdae26db9eb8f373eab Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Thu, 24 Jun 2010 13:55:31 +0200 Subject: Moved the QML WebKit integration into QtWebKit.sis Reviewed-by: Alessandro Portale Reviewed-by: Janne Koskinen --- src/3rdparty/webkit/WebCore/WebCore.pro | 7 +++++++ src/3rdparty/webkit/WebKit/qt/declarative/declarative.pro | 7 ------- src/s60installs/s60installs.pro | 7 ------- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/3rdparty/webkit/WebCore/WebCore.pro b/src/3rdparty/webkit/WebCore/WebCore.pro index f0e41bc..e208b5f 100644 --- a/src/3rdparty/webkit/WebCore/WebCore.pro +++ b/src/3rdparty/webkit/WebCore/WebCore.pro @@ -25,6 +25,13 @@ symbian: { webkitbackup.sources = ../WebKit/qt/symbian/backup_registration.xml webkitbackup.path = /private/10202D56/import/packages/$$replace(TARGET.UID3, 0x,) + contains(QT_CONFIG, declarative): { + declarativeImport.sources = qmlwebkitplugin$${QT_LIBINFIX}.dll + declarativeImport.sources += ../WebKit/qt/declarative/qmldir + declarativeImport.path = c:$$QT_IMPORTS_BASE_DIR/QtWebKit + DEPLOYMENT += declarativeImport + } + DEPLOYMENT += webkitlibs webkitbackup # Need to guarantee that these come before system includes of /epoc32/include diff --git a/src/3rdparty/webkit/WebKit/qt/declarative/declarative.pro b/src/3rdparty/webkit/WebKit/qt/declarative/declarative.pro index c75bbce..75268f3 100644 --- a/src/3rdparty/webkit/WebKit/qt/declarative/declarative.pro +++ b/src/3rdparty/webkit/WebKit/qt/declarative/declarative.pro @@ -67,13 +67,6 @@ qmldir.path += $$[QT_INSTALL_IMPORTS]/$$TARGETPATH symbian:{ TARGET.UID3 = 0x20021321 - load(data_caging_paths) - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) - - importFiles.sources = qmlwebkitplugin.dll qmldir - importFiles.path = $$QT_IMPORTS_BASE_DIR/$$TARGETPATH - - DEPLOYMENT = importFiles } INSTALLS += target qmldir diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro index a093e4c..4addb84 100644 --- a/src/s60installs/s60installs.pro +++ b/src/s60installs/s60installs.pro @@ -175,13 +175,6 @@ symbian: { particlesImport.path = c:$$QT_IMPORTS_BASE_DIR/Qt/labs/particles DEPLOYMENT += folderlistmodelImport gesturesImport particlesImport - - contains(QT_CONFIG, webkit): { - webkitImport.sources = $$QT_BUILD_TREE/imports/QtWebKit/qmlwebkitplugin$${QT_LIBINFIX}.dll - webkitImport.sources += $$QT_SOURCE_TREE/src/3rdparty/webkit/WebKit/qt/declarative/qmldir - webkitImport.path = c:$$QT_IMPORTS_BASE_DIR/QtWebKit - DEPLOYMENT += webkitImport - } } graphicssystems_plugins.path = c:$$QT_PLUGINS_BASE_DIR/graphicssystems -- cgit v0.12 From 9dc6dc38bf9035ec6460fa20159c33d5ad7084ca Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Thu, 24 Jun 2010 14:05:08 +0200 Subject: Updated WebKit to 2f598e9b7b376d851fe089bc1dc729bcf0393a06 * Fixed QML packaging || || Add an inlineCapacity template parameter to ListHashSet and use it to shrink the positioned object list hash set. || || || Allocate the m_preloads list hash set dynamically and free it when done. || || || Do not render the full frame when there is some elements with fixed positioning || --- src/3rdparty/webkit/.tag | 2 +- src/3rdparty/webkit/JavaScriptCore/ChangeLog | 34 ++++ .../webkit/JavaScriptCore/wtf/ListHashSet.h | 206 ++++++++++----------- src/3rdparty/webkit/VERSION | 2 +- src/3rdparty/webkit/WebCore/ChangeLog | 78 ++++++++ src/3rdparty/webkit/WebCore/WebCore.pro | 2 +- src/3rdparty/webkit/WebCore/loader/DocLoader.cpp | 15 +- src/3rdparty/webkit/WebCore/loader/DocLoader.h | 5 +- src/3rdparty/webkit/WebCore/page/FrameView.cpp | 12 +- .../webkit/WebCore/rendering/RenderBlock.cpp | 8 +- .../webkit/WebCore/rendering/RenderBlock.h | 9 +- .../webkit/WebCore/rendering/RenderLayer.cpp | 8 + .../webkit/WebCore/rendering/RenderLayer.h | 1 + src/3rdparty/webkit/WebKit/qt/ChangeLog | 16 ++ .../webkit/WebKit/qt/docs/qtwebkit-bridge.qdoc | 4 +- 15 files changed, 274 insertions(+), 128 deletions(-) diff --git a/src/3rdparty/webkit/.tag b/src/3rdparty/webkit/.tag index 21b75f0..24cf142 100644 --- a/src/3rdparty/webkit/.tag +++ b/src/3rdparty/webkit/.tag @@ -1 +1 @@ -b3589e88fb8d581fb523578763831109f914dc2e +2f598e9b7b376d851fe089bc1dc729bcf0393a06 diff --git a/src/3rdparty/webkit/JavaScriptCore/ChangeLog b/src/3rdparty/webkit/JavaScriptCore/ChangeLog index 676ed23..8fa3a72 100644 --- a/src/3rdparty/webkit/JavaScriptCore/ChangeLog +++ b/src/3rdparty/webkit/JavaScriptCore/ChangeLog @@ -1,3 +1,37 @@ +2010-05-18 Anders Carlsson + + Reviewed by Sam Weinig. + + Add an inlineCapacity template parameter to ListHashSet and use it to shrink the positioned object list hash set. + https://bugs.webkit.org/show_bug.cgi?id=39304 + + + Add an inlineCapacity template parameter to ListHashSet. + + * wtf/ListHashSet.h: + (WTF::::ListHashSet): + (WTF::::operator): + (WTF::::swap): + (WTF::::~ListHashSet): + (WTF::::size): + (WTF::::capacity): + (WTF::::isEmpty): + (WTF::::begin): + (WTF::::end): + (WTF::::find): + (WTF::::contains): + (WTF::::add): + (WTF::::insertBefore): + (WTF::::remove): + (WTF::::clear): + (WTF::::unlinkAndDelete): + (WTF::::appendNode): + (WTF::::insertNodeBefore): + (WTF::::deleteAllNodes): + (WTF::::makeIterator): + (WTF::::makeConstIterator): + (WTF::deleteAllValues): + 2010-06-18 Jocelyn Turcotte Reviewed by Simon Hausmann. diff --git a/src/3rdparty/webkit/JavaScriptCore/wtf/ListHashSet.h b/src/3rdparty/webkit/JavaScriptCore/wtf/ListHashSet.h index 54ed36b..09355ad 100644 --- a/src/3rdparty/webkit/JavaScriptCore/wtf/ListHashSet.h +++ b/src/3rdparty/webkit/JavaScriptCore/wtf/ListHashSet.h @@ -37,27 +37,27 @@ namespace WTF { // and an append that moves the element to the end even if already present, // but unclear yet if these are needed. - template class ListHashSet; + template class ListHashSet; template struct IdentityExtractor; - template - void deleteAllValues(const ListHashSet&); + template + void deleteAllValues(const ListHashSet&); - template class ListHashSetIterator; - template class ListHashSetConstIterator; + template class ListHashSetIterator; + template class ListHashSetConstIterator; - template struct ListHashSetNode; - template struct ListHashSetNodeAllocator; - template struct ListHashSetNodeHashFunctions; + template struct ListHashSetNode; + template struct ListHashSetNodeAllocator; + template struct ListHashSetNodeHashFunctions; - template::Hash> class ListHashSet : public FastAllocBase { + template::Hash> class ListHashSet : public FastAllocBase { private: - typedef ListHashSetNode Node; - typedef ListHashSetNodeAllocator NodeAllocator; + typedef ListHashSetNode Node; + typedef ListHashSetNodeAllocator NodeAllocator; typedef HashTraits NodeTraits; - typedef ListHashSetNodeHashFunctions NodeHash; + typedef ListHashSetNodeHashFunctions NodeHash; typedef HashTable, NodeHash, NodeTraits, NodeTraits> ImplType; typedef HashTableIterator, NodeHash, NodeTraits, NodeTraits> ImplTypeIterator; @@ -67,10 +67,10 @@ namespace WTF { public: typedef ValueArg ValueType; - typedef ListHashSetIterator iterator; - typedef ListHashSetConstIterator const_iterator; + typedef ListHashSetIterator iterator; + typedef ListHashSetConstIterator const_iterator; - friend class ListHashSetConstIterator; + friend class ListHashSetConstIterator; ListHashSet(); ListHashSet(const ListHashSet&); @@ -119,9 +119,9 @@ namespace WTF { OwnPtr m_allocator; }; - template struct ListHashSetNodeAllocator { - typedef ListHashSetNode Node; - typedef ListHashSetNodeAllocator NodeAllocator; + template struct ListHashSetNodeAllocator { + typedef ListHashSetNode Node; + typedef ListHashSetNodeAllocator NodeAllocator; ListHashSetNodeAllocator() : m_freeList(pool()) @@ -181,15 +181,15 @@ namespace WTF { Node* m_freeList; bool m_isDoneWithInitialFreeList; - static const size_t m_poolSize = 256; + static const size_t m_poolSize = inlineCapacity; union { char pool[sizeof(Node) * m_poolSize]; double forAlignment; } m_pool; }; - template struct ListHashSetNode { - typedef ListHashSetNodeAllocator NodeAllocator; + template struct ListHashSetNode { + typedef ListHashSetNodeAllocator NodeAllocator; ListHashSetNode(ValueArg value) : m_value(value) @@ -220,25 +220,25 @@ namespace WTF { #endif }; - template struct ListHashSetNodeHashFunctions { - typedef ListHashSetNode Node; + template struct ListHashSetNodeHashFunctions { + typedef ListHashSetNode Node; static unsigned hash(Node* const& key) { return HashArg::hash(key->m_value); } static bool equal(Node* const& a, Node* const& b) { return HashArg::equal(a->m_value, b->m_value); } static const bool safeToCompareToEmptyOrDeleted = false; }; - template class ListHashSetIterator { + template class ListHashSetIterator { private: - typedef ListHashSet ListHashSetType; - typedef ListHashSetIterator iterator; - typedef ListHashSetConstIterator const_iterator; - typedef ListHashSetNode Node; + typedef ListHashSet ListHashSetType; + typedef ListHashSetIterator iterator; + typedef ListHashSetConstIterator const_iterator; + typedef ListHashSetNode Node; typedef ValueArg ValueType; typedef ValueType& ReferenceType; typedef ValueType* PointerType; - friend class ListHashSet; + friend class ListHashSet; ListHashSetIterator(const ListHashSetType* set, Node* position) : m_iterator(set, position) { } @@ -271,18 +271,18 @@ namespace WTF { const_iterator m_iterator; }; - template class ListHashSetConstIterator { + template class ListHashSetConstIterator { private: - typedef ListHashSet ListHashSetType; - typedef ListHashSetIterator iterator; - typedef ListHashSetConstIterator const_iterator; - typedef ListHashSetNode Node; + typedef ListHashSet ListHashSetType; + typedef ListHashSetIterator iterator; + typedef ListHashSetConstIterator const_iterator; + typedef ListHashSetNode Node; typedef ValueArg ValueType; typedef const ValueType& ReferenceType; typedef const ValueType* PointerType; - friend class ListHashSet; - friend class ListHashSetIterator; + friend class ListHashSet; + friend class ListHashSetIterator; ListHashSetConstIterator(const ListHashSetType* set, Node* position) : m_set(set) @@ -341,11 +341,11 @@ namespace WTF { }; - template + template struct ListHashSetTranslator { private: - typedef ListHashSetNode Node; - typedef ListHashSetNodeAllocator NodeAllocator; + typedef ListHashSetNode Node; + typedef ListHashSetNodeAllocator NodeAllocator; public: static unsigned hash(const ValueType& key) { return HashFunctions::hash(key); } static bool equal(Node* const& a, const ValueType& b) { return HashFunctions::equal(a->m_value, b); } @@ -355,16 +355,16 @@ namespace WTF { } }; - template - inline ListHashSet::ListHashSet() + template + inline ListHashSet::ListHashSet() : m_head(0) , m_tail(0) , m_allocator(new NodeAllocator) { } - template - inline ListHashSet::ListHashSet(const ListHashSet& other) + template + inline ListHashSet::ListHashSet(const ListHashSet& other) : m_head(0) , m_tail(0) , m_allocator(new NodeAllocator) @@ -374,16 +374,16 @@ namespace WTF { add(*it); } - template - inline ListHashSet& ListHashSet::operator=(const ListHashSet& other) + template + inline ListHashSet& ListHashSet::operator=(const ListHashSet& other) { ListHashSet tmp(other); swap(tmp); return *this; } - template - inline void ListHashSet::swap(ListHashSet& other) + template + inline void ListHashSet::swap(ListHashSet& other) { m_impl.swap(other.m_impl); std::swap(m_head, other.m_head); @@ -391,95 +391,95 @@ namespace WTF { m_allocator.swap(other.m_allocator); } - template - inline ListHashSet::~ListHashSet() + template + inline ListHashSet::~ListHashSet() { deleteAllNodes(); } - template - inline int ListHashSet::size() const + template + inline int ListHashSet::size() const { return m_impl.size(); } - template - inline int ListHashSet::capacity() const + template + inline int ListHashSet::capacity() const { return m_impl.capacity(); } - template - inline bool ListHashSet::isEmpty() const + template + inline bool ListHashSet::isEmpty() const { return m_impl.isEmpty(); } - template - inline typename ListHashSet::iterator ListHashSet::begin() + template + inline typename ListHashSet::iterator ListHashSet::begin() { return makeIterator(m_head); } - template - inline typename ListHashSet::iterator ListHashSet::end() + template + inline typename ListHashSet::iterator ListHashSet::end() { return makeIterator(0); } - template - inline typename ListHashSet::const_iterator ListHashSet::begin() const + template + inline typename ListHashSet::const_iterator ListHashSet::begin() const { return makeConstIterator(m_head); } - template - inline typename ListHashSet::const_iterator ListHashSet::end() const + template + inline typename ListHashSet::const_iterator ListHashSet::end() const { return makeConstIterator(0); } - template - inline typename ListHashSet::iterator ListHashSet::find(const ValueType& value) + template + inline typename ListHashSet::iterator ListHashSet::find(const ValueType& value) { - typedef ListHashSetTranslator Translator; + typedef ListHashSetTranslator Translator; ImplTypeIterator it = m_impl.template find(value); if (it == m_impl.end()) return end(); return makeIterator(*it); } - template - inline typename ListHashSet::const_iterator ListHashSet::find(const ValueType& value) const + template + inline typename ListHashSet::const_iterator ListHashSet::find(const ValueType& value) const { - typedef ListHashSetTranslator Translator; + typedef ListHashSetTranslator Translator; ImplTypeConstIterator it = m_impl.template find(value); if (it == m_impl.end()) return end(); return makeConstIterator(*it); } - template - inline bool ListHashSet::contains(const ValueType& value) const + template + inline bool ListHashSet::contains(const ValueType& value) const { - typedef ListHashSetTranslator Translator; + typedef ListHashSetTranslator Translator; return m_impl.template contains(value); } - template - pair::iterator, bool> ListHashSet::add(const ValueType &value) + template + pair::iterator, bool> ListHashSet::add(const ValueType &value) { - typedef ListHashSetTranslator Translator; + typedef ListHashSetTranslator Translator; pair result = m_impl.template add(value, m_allocator.get()); if (result.second) appendNode(*result.first); return std::make_pair(makeIterator(*result.first), result.second); } - template - pair::iterator, bool> ListHashSet::insertBefore(iterator it, const ValueType& newValue) + template + pair::iterator, bool> ListHashSet::insertBefore(iterator it, const ValueType& newValue) { - typedef ListHashSetTranslator Translator; + typedef ListHashSetTranslator Translator; pair result = m_impl.template add(newValue, m_allocator.get()); if (result.second) insertNodeBefore(it.node(), *result.first); @@ -487,14 +487,14 @@ namespace WTF { } - template - pair::iterator, bool> ListHashSet::insertBefore(const ValueType& beforeValue, const ValueType& newValue) + template + pair::iterator, bool> ListHashSet::insertBefore(const ValueType& beforeValue, const ValueType& newValue) { return insertBefore(find(beforeValue), newValue); } - template - inline void ListHashSet::remove(iterator it) + template + inline void ListHashSet::remove(iterator it) { if (it == end()) return; @@ -502,14 +502,14 @@ namespace WTF { unlinkAndDelete(it.node()); } - template - inline void ListHashSet::remove(const ValueType& value) + template + inline void ListHashSet::remove(const ValueType& value) { remove(find(value)); } - template - inline void ListHashSet::clear() + template + inline void ListHashSet::clear() { deleteAllNodes(); m_impl.clear(); @@ -517,8 +517,8 @@ namespace WTF { m_tail = 0; } - template - void ListHashSet::unlinkAndDelete(Node* node) + template + void ListHashSet::unlinkAndDelete(Node* node) { if (!node->m_prev) { ASSERT(node == m_head); @@ -539,8 +539,8 @@ namespace WTF { node->destroy(m_allocator.get()); } - template - void ListHashSet::appendNode(Node* node) + template + void ListHashSet::appendNode(Node* node) { node->m_prev = m_tail; node->m_next = 0; @@ -556,8 +556,8 @@ namespace WTF { m_tail = node; } - template - void ListHashSet::insertNodeBefore(Node* beforeNode, Node* newNode) + template + void ListHashSet::insertNodeBefore(Node* beforeNode, Node* newNode) { if (!beforeNode) return appendNode(newNode); @@ -572,8 +572,8 @@ namespace WTF { m_head = newNode; } - template - void ListHashSet::deleteAllNodes() + template + void ListHashSet::deleteAllNodes() { if (!m_head) return; @@ -582,16 +582,16 @@ namespace WTF { node->destroy(m_allocator.get()); } - template - inline ListHashSetIterator ListHashSet::makeIterator(Node* position) + template + inline ListHashSetIterator ListHashSet::makeIterator(Node* position) { - return ListHashSetIterator(this, position); + return ListHashSetIterator(this, position); } - template - inline ListHashSetConstIterator ListHashSet::makeConstIterator(Node* position) const + template + inline ListHashSetConstIterator ListHashSet::makeConstIterator(Node* position) const { - return ListHashSetConstIterator(this, position); + return ListHashSetConstIterator(this, position); } template @@ -603,10 +603,10 @@ namespace WTF { delete (*it)->m_value; } - template - inline void deleteAllValues(const ListHashSet& collection) + template + inline void deleteAllValues(const ListHashSet& collection) { - deleteAllValues::ValueType>(collection.m_impl); + deleteAllValues::ValueType>(collection.m_impl); } } // namespace WTF diff --git a/src/3rdparty/webkit/VERSION b/src/3rdparty/webkit/VERSION index 57c1cf6..924b120 100644 --- a/src/3rdparty/webkit/VERSION +++ b/src/3rdparty/webkit/VERSION @@ -4,4 +4,4 @@ This is a snapshot of the Qt port of WebKit from and has the sha1 checksum - b3589e88fb8d581fb523578763831109f914dc2e + 2f598e9b7b376d851fe089bc1dc729bcf0393a06 diff --git a/src/3rdparty/webkit/WebCore/ChangeLog b/src/3rdparty/webkit/WebCore/ChangeLog index 687b76b..a84f177 100644 --- a/src/3rdparty/webkit/WebCore/ChangeLog +++ b/src/3rdparty/webkit/WebCore/ChangeLog @@ -1,3 +1,81 @@ +2010-06-24 Simon Hausmann + + Unreviewed Symbian build fix. + + The QML WebKit integration needs to be part of QtWebKit.sis + + * WebCore.pro: Deploy qmlwebkitplugin.dll. + +2010-06-23 Benjamin Poulain + + Reviewed by Kenneth Rohde Christiansen. + + Do not render the full frame when there is some elements with fixed positioning + https://bugs.webkit.org/show_bug.cgi?id=33150 + + Do not render the full frame when there is some elements with fixed positioning + https://bugs.webkit.org/show_bug.cgi?id=33150 + + The frame view take into acount the list of fixed object when scrolling + the view. If the number of object is lower than a certain threshold, the pixel + are blitted, and the invalidated area updated. + + * page/FrameView.cpp: + (WebCore::FrameView::addFixedObject): + (WebCore::FrameView::removeFixedObject): + (WebCore::FrameView::scrollContentsFastPath): + * page/FrameView.h: + * platform/ScrollView.cpp: + (WebCore::ScrollView::scrollContents): + (WebCore::ScrollView::scrollContentsFastPath): + * platform/ScrollView.h: + * rendering/RenderLayer.cpp: + (WebCore::RenderLayer::repaintRectIncludingDescendants): + * rendering/RenderLayer.h: + * rendering/RenderObject.cpp: + (WebCore::RenderObject::styleWillChange): + +2010-05-18 Anders Carlsson + + Reviewed by Sam Weinig. + + Allocate the m_preloads list hash set dynamically and free it when done. + https://bugs.webkit.org/show_bug.cgi?id=39309 + + + This saves about 6000 bytes on a fully loaded document. + + * loader/DocLoader.cpp: + (WebCore::DocLoader::requestPreload): + (WebCore::DocLoader::clearPreloads): + * loader/DocLoader.h: + +2010-05-18 Anders Carlsson + + Revert unintended indentation and unnecessary nested name specifier. + + * rendering/RenderBlock.cpp: + (WebCore::clipOutPositionedObjects): + (WebCore::RenderBlock::insertPositionedObject): + +2010-05-18 Anders Carlsson + + Reviewed by Sam Weinig. + + Add an inlineCapacity template parameter to ListHashSet and use it to shrink the positioned object list hash set. + https://bugs.webkit.org/show_bug.cgi?id=39304 + + + Set the inlineCapacity for the positionedObjects ListHashSet to 4 instead of 256. Since a RenderBlock usually has + few positioned objects, this saves memory. + + * WebCore.base.exp: + * rendering/RenderBlock.cpp: + (WebCore::clipOutPositionedObjects): + (WebCore::RenderBlock::insertPositionedObject): + * rendering/RenderBlock.h: + (WebCore::RenderBlock::positionedObjects): + 2010-06-22 Simon Hausmann Unreviewed Qt/Symbian build fix. diff --git a/src/3rdparty/webkit/WebCore/WebCore.pro b/src/3rdparty/webkit/WebCore/WebCore.pro index e208b5f..1162a52 100644 --- a/src/3rdparty/webkit/WebCore/WebCore.pro +++ b/src/3rdparty/webkit/WebCore/WebCore.pro @@ -25,7 +25,7 @@ symbian: { webkitbackup.sources = ../WebKit/qt/symbian/backup_registration.xml webkitbackup.path = /private/10202D56/import/packages/$$replace(TARGET.UID3, 0x,) - contains(QT_CONFIG, declarative): { + contains(QT_CONFIG, declarative) { declarativeImport.sources = qmlwebkitplugin$${QT_LIBINFIX}.dll declarativeImport.sources += ../WebKit/qt/declarative/qmldir declarativeImport.path = c:$$QT_IMPORTS_BASE_DIR/QtWebKit diff --git a/src/3rdparty/webkit/WebCore/loader/DocLoader.cpp b/src/3rdparty/webkit/WebCore/loader/DocLoader.cpp index 0053e7b..4597704 100644 --- a/src/3rdparty/webkit/WebCore/loader/DocLoader.cpp +++ b/src/3rdparty/webkit/WebCore/loader/DocLoader.cpp @@ -407,10 +407,14 @@ void DocLoader::requestPreload(CachedResource::Type type, const String& url, con encoding = charset.isEmpty() ? m_doc->frame()->loader()->encoding() : charset; CachedResource* resource = requestResource(type, url, encoding, true); - if (!resource || m_preloads.contains(resource)) + if (!resource || (m_preloads && m_preloads->contains(resource))) return; resource->increasePreloadCount(); - m_preloads.add(resource); + + if (!m_preloads) + m_preloads.set(new ListHashSet); + m_preloads->add(resource); + #if PRELOAD_DEBUG printf("PRELOADING %s\n", resource->url().latin1().data()); #endif @@ -421,8 +425,11 @@ void DocLoader::clearPreloads() #if PRELOAD_DEBUG printPreloadStats(); #endif - ListHashSet::iterator end = m_preloads.end(); - for (ListHashSet::iterator it = m_preloads.begin(); it != end; ++it) { + if (!m_preloads) + return; + + ListHashSet::iterator end = m_preloads->end(); + for (ListHashSet::iterator it = m_preloads->begin(); it != end; ++it) { CachedResource* res = *it; res->decreasePreloadCount(); if (res->canDelete() && !res->inCache()) diff --git a/src/3rdparty/webkit/WebCore/loader/DocLoader.h b/src/3rdparty/webkit/WebCore/loader/DocLoader.h index 8ec73e1..66e4164 100644 --- a/src/3rdparty/webkit/WebCore/loader/DocLoader.h +++ b/src/3rdparty/webkit/WebCore/loader/DocLoader.h @@ -47,8 +47,7 @@ class ImageLoader; class KURL; // The DocLoader manages the loading of scripts/images/stylesheets for a single document. -class DocLoader : public Noncopyable -{ +class DocLoader : public Noncopyable { friend class Cache; friend class ImageLoader; @@ -117,7 +116,7 @@ private: int m_requestCount; - ListHashSet m_preloads; + OwnPtr > m_preloads; struct PendingPreload { CachedResource::Type m_type; String m_url; diff --git a/src/3rdparty/webkit/WebCore/page/FrameView.cpp b/src/3rdparty/webkit/WebCore/page/FrameView.cpp index a53db36..639414b 100644 --- a/src/3rdparty/webkit/WebCore/page/FrameView.cpp +++ b/src/3rdparty/webkit/WebCore/page/FrameView.cpp @@ -884,7 +884,7 @@ bool FrameView::scrollContentsFastPath(const IntSize& scrollDelta, const IntRect { const size_t fixedObjectThreshold = 5; - ListHashSet* positionedObjects = 0; + RenderBlock::PositionedObjectsListHashSet* positionedObjects = 0; if (RenderView* root = m_frame->contentRenderer()) positionedObjects = root->positionedObjects(); @@ -896,14 +896,14 @@ bool FrameView::scrollContentsFastPath(const IntSize& scrollDelta, const IntRect // Get the rects of the fixed objects visible in the rectToScroll Vector subRectToUpdate; bool updateInvalidatedSubRect = true; - ListHashSet::const_iterator end = positionedObjects->end(); - for (ListHashSet::const_iterator it = positionedObjects->begin(); it != end; ++it) { + RenderBlock::PositionedObjectsListHashSet::const_iterator end = positionedObjects->end(); + for (RenderBlock::PositionedObjectsListHashSet::const_iterator it = positionedObjects->begin(); it != end; ++it) { RenderBox* renderBox = *it; if (renderBox->style()->position() != FixedPosition) continue; - IntRect topLevelRect; - IntRect updateRect = renderBox->paintingRootRect(topLevelRect); - updateRect.move(-scrollX(), -scrollY()); + IntRect updateRect = renderBox->layer()->repaintRectIncludingDescendants(); + updateRect = contentsToWindow(updateRect); + updateRect.intersect(rectToScroll); if (!updateRect.isEmpty()) { if (subRectToUpdate.size() >= fixedObjectThreshold) { diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderBlock.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderBlock.cpp index a7b8a02..798663e 100644 --- a/src/3rdparty/webkit/WebCore/rendering/RenderBlock.cpp +++ b/src/3rdparty/webkit/WebCore/rendering/RenderBlock.cpp @@ -1982,13 +1982,13 @@ void RenderBlock::paintSelection(PaintInfo& paintInfo, int tx, int ty) } #ifndef BUILDING_ON_TIGER -static void clipOutPositionedObjects(const RenderObject::PaintInfo* paintInfo, int tx, int ty, ListHashSet* positionedObjects) +static void clipOutPositionedObjects(const RenderObject::PaintInfo* paintInfo, int tx, int ty, RenderBlock::PositionedObjectsListHashSet* positionedObjects) { if (!positionedObjects) return; - ListHashSet::const_iterator end = positionedObjects->end(); - for (ListHashSet::const_iterator it = positionedObjects->begin(); it != end; ++it) { + RenderBlock::PositionedObjectsListHashSet::const_iterator end = positionedObjects->end(); + for (RenderBlock::PositionedObjectsListHashSet::const_iterator it = positionedObjects->begin(); it != end; ++it) { RenderBox* r = *it; paintInfo->context->clipOut(IntRect(tx + r->x(), ty + r->y(), r->width(), r->height())); } @@ -2274,7 +2274,7 @@ void RenderBlock::insertPositionedObject(RenderBox* o) { // Create the list of special objects if we don't aleady have one if (!m_positionedObjects) - m_positionedObjects = new ListHashSet; + m_positionedObjects = new PositionedObjectsListHashSet; m_positionedObjects->add(o); } diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderBlock.h b/src/3rdparty/webkit/WebCore/rendering/RenderBlock.h index 184f983..d555d31 100644 --- a/src/3rdparty/webkit/WebCore/rendering/RenderBlock.h +++ b/src/3rdparty/webkit/WebCore/rendering/RenderBlock.h @@ -74,7 +74,9 @@ public: void insertPositionedObject(RenderBox*); void removePositionedObject(RenderBox*); void removePositionedObjects(RenderBlock*); - ListHashSet* positionedObjects() const { return m_positionedObjects; } + + typedef ListHashSet PositionedObjectsListHashSet; + PositionedObjectsListHashSet* positionedObjects() const { return m_positionedObjects; } void addPercentHeightDescendant(RenderBox*); static void removePercentHeightDescendant(RenderBox*); @@ -483,9 +485,10 @@ private: void setCollapsedBottomMargin(const MarginInfo&); // End helper functions and structs used by layoutBlockChildren. - typedef ListHashSet::const_iterator Iterator; + typedef PositionedObjectsListHashSet::const_iterator Iterator; DeprecatedPtrList* m_floatingObjects; - ListHashSet* m_positionedObjects; + + PositionedObjectsListHashSet* m_positionedObjects; // An inline can be split with blocks occurring in between the inline content. // When this occurs we need a pointer to our next object. We can basically be diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp index 3314772..a012868 100644 --- a/src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp +++ b/src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp @@ -325,6 +325,14 @@ void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags) m_marquee->updateMarqueePosition(); } +IntRect RenderLayer::repaintRectIncludingDescendants() const +{ + IntRect repaintRect = m_repaintRect; + for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) + repaintRect.unite(child->repaintRectIncludingDescendants()); + return repaintRect; +} + void RenderLayer::computeRepaintRects() { RenderBoxModelObject* repaintContainer = renderer()->containerForRepaint(); diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderLayer.h b/src/3rdparty/webkit/WebCore/rendering/RenderLayer.h index 81a66e1..e221f28 100644 --- a/src/3rdparty/webkit/WebCore/rendering/RenderLayer.h +++ b/src/3rdparty/webkit/WebCore/rendering/RenderLayer.h @@ -394,6 +394,7 @@ public: // Return a cached repaint rect, computed relative to the layer renderer's containerForRepaint. IntRect repaintRect() const { return m_repaintRect; } + IntRect repaintRectIncludingDescendants() const; void computeRepaintRects(); void updateRepaintRectsAfterScroll(bool fixed = false); void setNeedsFullRepaint(bool f = true) { m_needsFullRepaint = f; } diff --git a/src/3rdparty/webkit/WebKit/qt/ChangeLog b/src/3rdparty/webkit/WebKit/qt/ChangeLog index 050b1c1..69a431f 100644 --- a/src/3rdparty/webkit/WebKit/qt/ChangeLog +++ b/src/3rdparty/webkit/WebKit/qt/ChangeLog @@ -1,3 +1,19 @@ +2010-06-24 Simon Hausmann + + Unreviewed Symbian build fix. + + The QML WebKit integration needs to be part of QtWebKit.sis + + * declarative/declarative.pro: Removed non-working deployment. + +2010-06-23 David Boddie + + Reviewed by Simon Hausmann. + + [Qt] Doc: Fixed documentation errors. + + * docs/qtwebkit-bridge.qdoc: + 2010-06-23 Alessandro Portale Reviewed by Simon Hausmann. diff --git a/src/3rdparty/webkit/WebKit/qt/docs/qtwebkit-bridge.qdoc b/src/3rdparty/webkit/WebKit/qt/docs/qtwebkit-bridge.qdoc index fa93293..c2a38fd 100644 --- a/src/3rdparty/webkit/WebKit/qt/docs/qtwebkit-bridge.qdoc +++ b/src/3rdparty/webkit/WebKit/qt/docs/qtwebkit-bridge.qdoc @@ -8,7 +8,7 @@ The QtWebKit bridge is a mechanism that extends WebKit's JavaScript environment to access native objects that are represented as \l{QObject}s. It takes advantage of the \l{QObject} introspection, - a part of the \l{Qt Object Model}, which makes it easy to integrate with the dynamic JavaScript environment, + a part of the \l{Object Model}, which makes it easy to integrate with the dynamic JavaScript environment, for example \l{QObject} properties map directly to JavaScript properties. For example, both JavaScript and QObjects have properties: a construct that represent a getter/setter @@ -24,7 +24,7 @@ applications. For example, an application that contains a media-player, playlist manager, and music store. The playlist manager is usually best authored as a classic desktop application, with the native-looking robust \l{QWidget}s helping with producing that application. - The media-player control, which usually looks custom, can be written using \l{The Graphics View framework} + The media-player control, which usually looks custom, can be written using the \l{Graphics View framework} or with in a declarative way with \l{QtDeclarative}. The music store, which shows dynamic content from the internet and gets modified rapidly, is best authored in HTML and maintained on the server. -- cgit v0.12 From d806b996beab76cbc43ffa11bc38721fa19c9c81 Mon Sep 17 00:00:00 2001 From: Prasanth Ullattil Date: Thu, 24 Jun 2010 15:02:02 +0200 Subject: No more enter & leave events after a popup menu is closed on Windows We use the TrackMouseEvent() to keep track of enter and leave messages. Upon receiving a WM_MOUSELEAVE, the effect of that function call is over, we need to call it again if we need more messages. This was not done when we close a popup because of mouse click outside. Task-number: QTBUG-11582 Reviewed-by: Bradley T. Hughes --- src/gui/kernel/qapplication_win.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/gui/kernel/qapplication_win.cpp b/src/gui/kernel/qapplication_win.cpp index 2a85fdc..ef719ca 100644 --- a/src/gui/kernel/qapplication_win.cpp +++ b/src/gui/kernel/qapplication_win.cpp @@ -3065,6 +3065,11 @@ bool QETWidget::translateMouseEvent(const MSG &msg) break; } } +#ifndef Q_OS_WINCE + static bool trackMouseEventLookup = false; + typedef BOOL (WINAPI *PtrTrackMouseEvent)(LPTRACKMOUSEEVENT); + static PtrTrackMouseEvent ptrTrackMouseEvent = 0; +#endif state = translateButtonState(msg.wParam, type, button); // button state const QPoint widgetPos = mapFromGlobal(QPoint(msg.pt.x, msg.pt.y)); QWidget *alienWidget = !internalWinId() ? this : childAt(widgetPos); @@ -3129,9 +3134,6 @@ bool QETWidget::translateMouseEvent(const MSG &msg) #ifndef Q_OS_WINCE if (curWin != 0) { - static bool trackMouseEventLookup = false; - typedef BOOL (WINAPI *PtrTrackMouseEvent)(LPTRACKMOUSEEVENT); - static PtrTrackMouseEvent ptrTrackMouseEvent = 0; if (!trackMouseEventLookup) { trackMouseEventLookup = true; ptrTrackMouseEvent = (PtrTrackMouseEvent)QLibrary::resolve(QLatin1String("comctl32"), "_TrackMouseEvent"); @@ -3245,6 +3247,21 @@ bool QETWidget::translateMouseEvent(const MSG &msg) qt_button_down = 0; } +#ifndef Q_OS_WINCE + if (type == QEvent::MouseButtonPress + && QApplication::activePopupWidget() != activePopupWidget + && ptrTrackMouseEvent + && curWin) { + // Since curWin is already the window we clicked on, + // we have to setup the mouse tracking here. + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(TRACKMOUSEEVENT); + tme.dwFlags = 0x00000002; // TME_LEAVE + tme.hwndTrack = curWin; // Track on window receiving msgs + tme.dwHoverTime = (DWORD)-1; // HOVER_DEFAULT + ptrTrackMouseEvent(&tme); + } +#endif if (type == QEvent::MouseButtonPress && QApplication::activePopupWidget() != activePopupWidget && replayPopupMouseEvent) { -- cgit v0.12 From 0531b97863f93c5a141bd9ef0b58bcf6282024e7 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 24 Jun 2010 15:27:13 +0200 Subject: Manipulate buffer position via 'pPos' in peek() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: João Abecasis --- src/corelib/io/qiodevice.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp index ea60792..26e587d 100644 --- a/src/corelib/io/qiodevice.cpp +++ b/src/corelib/io/qiodevice.cpp @@ -1452,7 +1452,7 @@ qint64 QIODevicePrivate::peek(char *data, qint64 maxSize) return readBytes; buffer.ungetBlock(data, readBytes); - pos -= readBytes; + *pPos -= readBytes; return readBytes; } @@ -1467,7 +1467,7 @@ QByteArray QIODevicePrivate::peek(qint64 maxSize) return result; buffer.ungetBlock(result.constData(), result.size()); - pos -= result.size(); + *pPos -= result.size(); return result; } -- cgit v0.12 From a0d4f94c0eb3f724df979d9d22c4c944f34d547a Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Fri, 25 Jun 2010 10:51:56 +1000 Subject: Force font selection (and so ensure visual test passes). --- .../declarative/qdeclarativetext/data/alignments.qml | 2 -- .../declarative/qdeclarativetext/data/alignments_cb.png | Bin 528 -> 496 bytes .../declarative/qdeclarativetext/data/alignments_cc.png | Bin 549 -> 556 bytes .../declarative/qdeclarativetext/data/alignments_ct.png | Bin 564 -> 533 bytes .../declarative/qdeclarativetext/data/alignments_lb.png | Bin 522 -> 496 bytes .../declarative/qdeclarativetext/data/alignments_lc.png | Bin 541 -> 535 bytes .../declarative/qdeclarativetext/data/alignments_lt.png | Bin 558 -> 514 bytes .../declarative/qdeclarativetext/data/alignments_rb.png | Bin 530 -> 505 bytes .../declarative/qdeclarativetext/data/alignments_rc.png | Bin 550 -> 559 bytes .../declarative/qdeclarativetext/data/alignments_rt.png | Bin 564 -> 539 bytes .../qdeclarativetext/tst_qdeclarativetext.cpp | 7 +++++++ .../qdeclarativetextedit/data/alignments.qml | 2 -- .../qdeclarativetextedit/data/alignments_cb.png | Bin 528 -> 496 bytes .../qdeclarativetextedit/data/alignments_cc.png | Bin 549 -> 556 bytes .../qdeclarativetextedit/data/alignments_ct.png | Bin 564 -> 533 bytes .../qdeclarativetextedit/data/alignments_lb.png | Bin 522 -> 496 bytes .../qdeclarativetextedit/data/alignments_lc.png | Bin 541 -> 535 bytes .../qdeclarativetextedit/data/alignments_lt.png | Bin 558 -> 514 bytes .../qdeclarativetextedit/data/alignments_rb.png | Bin 530 -> 505 bytes .../qdeclarativetextedit/data/alignments_rc.png | Bin 550 -> 559 bytes .../qdeclarativetextedit/data/alignments_rt.png | Bin 564 -> 539 bytes .../qdeclarativetextedit/tst_qdeclarativetextedit.cpp | 7 +++++++ 22 files changed, 14 insertions(+), 4 deletions(-) diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments.qml b/tests/auto/declarative/qdeclarativetext/data/alignments.qml index b10c335..b1f701b 100644 --- a/tests/auto/declarative/qdeclarativetext/data/alignments.qml +++ b/tests/auto/declarative/qdeclarativetext/data/alignments.qml @@ -20,8 +20,6 @@ Rectangle { id: t anchors.fill: parent - font.family: "Misc Fixed" - font.pixelSize: 8 horizontalAlignment: TextEdit.AlignRight verticalAlignment: TextEdit.AlignBottom wrapMode: TextEdit.WordWrap diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_cb.png b/tests/auto/declarative/qdeclarativetext/data/alignments_cb.png index b0ad381..99de219 100644 Binary files a/tests/auto/declarative/qdeclarativetext/data/alignments_cb.png and b/tests/auto/declarative/qdeclarativetext/data/alignments_cb.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_cc.png b/tests/auto/declarative/qdeclarativetext/data/alignments_cc.png index 98232ce..cb85251 100644 Binary files a/tests/auto/declarative/qdeclarativetext/data/alignments_cc.png and b/tests/auto/declarative/qdeclarativetext/data/alignments_cc.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_ct.png b/tests/auto/declarative/qdeclarativetext/data/alignments_ct.png index b606ba5..ddca549 100644 Binary files a/tests/auto/declarative/qdeclarativetext/data/alignments_ct.png and b/tests/auto/declarative/qdeclarativetext/data/alignments_ct.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_lb.png b/tests/auto/declarative/qdeclarativetext/data/alignments_lb.png index a8f095d..1b50a81 100644 Binary files a/tests/auto/declarative/qdeclarativetext/data/alignments_lb.png and b/tests/auto/declarative/qdeclarativetext/data/alignments_lb.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_lc.png b/tests/auto/declarative/qdeclarativetext/data/alignments_lc.png index c2a0679..f041b86 100644 Binary files a/tests/auto/declarative/qdeclarativetext/data/alignments_lc.png and b/tests/auto/declarative/qdeclarativetext/data/alignments_lc.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_lt.png b/tests/auto/declarative/qdeclarativetext/data/alignments_lt.png index c019551..c75e0d1 100644 Binary files a/tests/auto/declarative/qdeclarativetext/data/alignments_lt.png and b/tests/auto/declarative/qdeclarativetext/data/alignments_lt.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_rb.png b/tests/auto/declarative/qdeclarativetext/data/alignments_rb.png index 08d581a..b06a5da 100644 Binary files a/tests/auto/declarative/qdeclarativetext/data/alignments_rb.png and b/tests/auto/declarative/qdeclarativetext/data/alignments_rb.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_rc.png b/tests/auto/declarative/qdeclarativetext/data/alignments_rc.png index d607955..e468857 100644 Binary files a/tests/auto/declarative/qdeclarativetext/data/alignments_rc.png and b/tests/auto/declarative/qdeclarativetext/data/alignments_rc.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_rt.png b/tests/auto/declarative/qdeclarativetext/data/alignments_rt.png index 2acfb9e..576715f 100644 Binary files a/tests/auto/declarative/qdeclarativetext/data/alignments_rt.png and b/tests/auto/declarative/qdeclarativetext/data/alignments_rt.png differ diff --git a/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp index 91b3ca0..dc92f07 100644 --- a/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp +++ b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp @@ -424,6 +424,13 @@ void tst_qdeclarativetext::alignments() QFETCH(int, vAlign); QFETCH(QString, expectfile); +#ifdef Q_OS_LINUX + // Font-specific, but not likely platform-specific, so only test on one platform + QFont fn; + fn.setRawName("-misc-fixed-medium-r-*-*-8-*-*-*-*-*-*-*"); + QApplication::setFont(fn); +#endif + QDeclarativeView *canvas = createView(SRCDIR "/data/alignments.qml"); canvas->show(); diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments.qml b/tests/auto/declarative/qdeclarativetextedit/data/alignments.qml index b10c335..b1f701b 100644 --- a/tests/auto/declarative/qdeclarativetextedit/data/alignments.qml +++ b/tests/auto/declarative/qdeclarativetextedit/data/alignments.qml @@ -20,8 +20,6 @@ Rectangle { id: t anchors.fill: parent - font.family: "Misc Fixed" - font.pixelSize: 8 horizontalAlignment: TextEdit.AlignRight verticalAlignment: TextEdit.AlignBottom wrapMode: TextEdit.WordWrap diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_cb.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_cb.png index b0ad381..99de219 100644 Binary files a/tests/auto/declarative/qdeclarativetextedit/data/alignments_cb.png and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_cb.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_cc.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_cc.png index 98232ce..cb85251 100644 Binary files a/tests/auto/declarative/qdeclarativetextedit/data/alignments_cc.png and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_cc.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_ct.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_ct.png index b606ba5..ddca549 100644 Binary files a/tests/auto/declarative/qdeclarativetextedit/data/alignments_ct.png and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_ct.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_lb.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_lb.png index a8f095d..1b50a81 100644 Binary files a/tests/auto/declarative/qdeclarativetextedit/data/alignments_lb.png and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_lb.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_lc.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_lc.png index c2a0679..f041b86 100644 Binary files a/tests/auto/declarative/qdeclarativetextedit/data/alignments_lc.png and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_lc.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_lt.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_lt.png index c019551..c75e0d1 100644 Binary files a/tests/auto/declarative/qdeclarativetextedit/data/alignments_lt.png and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_lt.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_rb.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_rb.png index 08d581a..b06a5da 100644 Binary files a/tests/auto/declarative/qdeclarativetextedit/data/alignments_rb.png and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_rb.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_rc.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_rc.png index d607955..e468857 100644 Binary files a/tests/auto/declarative/qdeclarativetextedit/data/alignments_rc.png and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_rc.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_rt.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_rt.png index 2acfb9e..576715f 100644 Binary files a/tests/auto/declarative/qdeclarativetextedit/data/alignments_rt.png and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_rt.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp index 009d354..adf8348 100644 --- a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp +++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp @@ -325,6 +325,13 @@ void tst_qdeclarativetextedit::alignments() QFETCH(int, vAlign); QFETCH(QString, expectfile); +#ifdef Q_OS_LINUX + // Font-specific, but not likely platform-specific, so only test on one platform + QFont fn; + fn.setRawName("-misc-fixed-medium-r-*-*-8-*-*-*-*-*-*-*"); + QApplication::setFont(fn); +#endif + QDeclarativeView *canvas = createView(SRCDIR "/data/alignments.qml"); canvas->show(); -- cgit v0.12 From cfa9eee32081dc49ab0697b1f483db01c8aee7cd Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Fri, 25 Jun 2010 12:44:12 +1000 Subject: Reading a property that doesn't exist throws a ReferenceError test QTBUG-11606 --- .../declarative/qdeclarativeecmascript/data/qtbug_11606.qml | 12 ++++++++++++ .../qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp | 10 ++++++++++ 2 files changed, 22 insertions(+) create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11606.qml diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11606.qml b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11606.qml new file mode 100644 index 0000000..6efb9c1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11606.qml @@ -0,0 +1,12 @@ +import Qt 4.7 + +QtObject { + property bool test: false + Component.onCompleted: { + try { + console.log(sorryNoSuchProperty); + } catch (e) { + test = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp index 50da55d..7e8a272 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp +++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp @@ -155,6 +155,7 @@ private slots: void eval(); void function(); void qtbug_10696(); + void qtbug_11606(); void include(); @@ -2503,6 +2504,15 @@ void tst_qdeclarativeecmascript::qtbug_10696() delete o; } +void tst_qdeclarativeecmascript::qtbug_11606() +{ + QDeclarativeComponent component(&engine, TEST_FILE("qtbug_11606.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test").toBool(), true); + delete o; +} + QTEST_MAIN(tst_qdeclarativeecmascript) #include "tst_qdeclarativeecmascript.moc" -- cgit v0.12 From 2426502f372f1c1a33ccaba3549dc0eda2a754de Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Fri, 25 Jun 2010 13:11:09 +1000 Subject: Disallow global object properties as property names QTBUG-11605 --- src/declarative/qml/qdeclarativecompiler.cpp | 8 ++++++++ src/declarative/qml/qdeclarativeglobalscriptclass.cpp | 4 ++++ tests/auto/declarative/qdeclarativeecmascript/data/scope.3.qml | 4 ++-- tests/auto/declarative/qdeclarativeecmascript/testtypes.h | 2 ++ .../qdeclarativelanguage/data/invalidProperty.errors.txt | 1 + .../declarative/qdeclarativelanguage/data/invalidProperty.qml | 5 +++++ .../declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp | 1 + 7 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.qml diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp index 80a1093..60128b7 100644 --- a/src/declarative/qml/qdeclarativecompiler.cpp +++ b/src/declarative/qml/qdeclarativecompiler.cpp @@ -2199,6 +2199,10 @@ bool QDeclarativeCompiler::checkDynamicMeta(QDeclarativeParser::Object *obj) if (QString::fromUtf8(prop.name).at(0).isUpper()) COMPILE_EXCEPTION(&prop, tr("Property names cannot begin with an upper case letter")); + + if (QDeclarativeEnginePrivate::get(engine)->globalClass->illegalNames().contains(prop.name)) + COMPILE_EXCEPTION(&prop, tr("Illegal property name")); + propNames.insert(prop.name); } @@ -2208,6 +2212,8 @@ bool QDeclarativeCompiler::checkDynamicMeta(QDeclarativeParser::Object *obj) COMPILE_EXCEPTION(obj, tr("Duplicate signal name")); if (QString::fromUtf8(name).at(0).isUpper()) COMPILE_EXCEPTION(obj, tr("Signal names cannot begin with an upper case letter")); + if (QDeclarativeEnginePrivate::get(engine)->globalClass->illegalNames().contains(name)) + COMPILE_EXCEPTION(obj, tr("Illegal signal name")); methodNames.insert(name); } for (int ii = 0; ii < obj->dynamicSlots.count(); ++ii) { @@ -2216,6 +2222,8 @@ bool QDeclarativeCompiler::checkDynamicMeta(QDeclarativeParser::Object *obj) COMPILE_EXCEPTION(obj, tr("Duplicate method name")); if (QString::fromUtf8(name).at(0).isUpper()) COMPILE_EXCEPTION(obj, tr("Method names cannot begin with an upper case letter")); + if (QDeclarativeEnginePrivate::get(engine)->globalClass->illegalNames().contains(name)) + COMPILE_EXCEPTION(obj, tr("Illegal method name")); methodNames.insert(name); } diff --git a/src/declarative/qml/qdeclarativeglobalscriptclass.cpp b/src/declarative/qml/qdeclarativeglobalscriptclass.cpp index f29b3f4..3e22c82 100644 --- a/src/declarative/qml/qdeclarativeglobalscriptclass.cpp +++ b/src/declarative/qml/qdeclarativeglobalscriptclass.cpp @@ -55,6 +55,7 @@ QDeclarativeGlobalScriptClass::QDeclarativeGlobalScriptClass(QScriptEngine *engi : QScriptClass(engine) { QString eval = QLatin1String("eval"); + QString version = QLatin1String("version"); QScriptValue globalObject = engine->globalObject(); @@ -68,6 +69,9 @@ QDeclarativeGlobalScriptClass::QDeclarativeGlobalScriptClass(QScriptEngine *engi QString name = iter.name(); + if (name == version) + continue; + if (name != eval) m_globalObject.setProperty(iter.scriptName(), iter.value()); newGlobalObject.setProperty(iter.scriptName(), iter.value()); diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scope.3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scope.3.qml index 4395ba3..2548005 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/data/scope.3.qml +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scope.3.qml @@ -1,10 +1,10 @@ import Qt 4.7 +import Qt.test 1.0 -Item { +MyQmlObject { id: root property int foo: 12 - property int console: 11 property bool test1: foo == 12 property bool test2: console != 11 diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h index 7bb8a8e..fef76ef 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h +++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h @@ -86,6 +86,7 @@ class MyQmlObject : public QObject Q_PROPERTY(bool trueProperty READ trueProperty CONSTANT) Q_PROPERTY(bool falseProperty READ falseProperty CONSTANT) Q_PROPERTY(int value READ value WRITE setValue) + Q_PROPERTY(int console READ console CONSTANT) Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty NOTIFY stringChanged) Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty NOTIFY objectChanged) Q_PROPERTY(QDeclarativeListProperty objectListProperty READ objectListProperty CONSTANT) @@ -142,6 +143,7 @@ public: QRegExp regExp() { return m_regExp; } void setRegExp(const QRegExp ®Exp) { m_regExp = regExp; } + int console() const { return 11; } signals: void basicSignal(); void argumentSignal(int a, QString b, qreal c); diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.errors.txt new file mode 100644 index 0000000..c83e5ae --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.errors.txt @@ -0,0 +1 @@ +4:5:Illegal property name diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.qml new file mode 100644 index 0000000..6077de4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.qml @@ -0,0 +1,5 @@ +import Qt 4.7 + +QtObject { + property int parseInt +} diff --git a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp index 413843a..3ce356e 100644 --- a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp +++ b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp @@ -370,6 +370,7 @@ void tst_qdeclarativelanguage::errors_data() QTest::newRow("destroyedSignal") << "destroyedSignal.qml" << "destroyedSignal.errors.txt" << false; QTest::newRow("assignToNamespace") << "assignToNamespace.qml" << "assignToNamespace.errors.txt" << false; QTest::newRow("invalidOn") << "invalidOn.qml" << "invalidOn.errors.txt" << false; + QTest::newRow("invalidProperty") << "invalidProperty.qml" << "invalidProperty.errors.txt" << false; } -- cgit v0.12 From 5272bfe03522e671e832a8cbd9e5b2d4d71a18f2 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Fri, 25 Jun 2010 13:22:08 +1000 Subject: Fix assert QTBUG-11600 --- src/declarative/qml/qdeclarativetypenamescriptclass.cpp | 4 ++-- .../declarative/qdeclarativeecmascript/data/qtbug_11600.js | 1 + .../declarative/qdeclarativeecmascript/data/qtbug_11600.qml | 8 ++++++++ .../qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp | 11 +++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.qml diff --git a/src/declarative/qml/qdeclarativetypenamescriptclass.cpp b/src/declarative/qml/qdeclarativetypenamescriptclass.cpp index 2a3417a..764a8db 100644 --- a/src/declarative/qml/qdeclarativetypenamescriptclass.cpp +++ b/src/declarative/qml/qdeclarativetypenamescriptclass.cpp @@ -107,8 +107,7 @@ QDeclarativeTypeNameScriptClass::queryProperty(Object *obj, const Identifier &na return 0; } - } else { - Q_ASSERT(data->type); + } else if (data->type) { QString strName = toString(name); @@ -134,6 +133,7 @@ QDeclarativeTypeNameScriptClass::queryProperty(Object *obj, const Identifier &na if (!object) return 0; return ep->objectClass->queryProperty(object, name, flags, 0); } + } return 0; diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.js b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.js new file mode 100644 index 0000000..092bc2b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.js @@ -0,0 +1 @@ +; diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.qml b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.qml new file mode 100644 index 0000000..56e7885 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.qml @@ -0,0 +1,8 @@ +import Qt 4.7 +import "qtbug_11600.js" as Test + +QtObject { + id: goo + + property bool test: undefined == goo.Test.foo +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp index 7e8a272..5619f22 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp +++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp @@ -156,6 +156,7 @@ private slots: void function(); void qtbug_10696(); void qtbug_11606(); + void qtbug_11600(); void include(); @@ -2513,6 +2514,16 @@ void tst_qdeclarativeecmascript::qtbug_11606() delete o; } +void tst_qdeclarativeecmascript::qtbug_11600() +{ + QDeclarativeComponent component(&engine, TEST_FILE("qtbug_11600.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test").toBool(), true); + delete o; +} + + QTEST_MAIN(tst_qdeclarativeecmascript) #include "tst_qdeclarativeecmascript.moc" -- cgit v0.12 From e0913d038b3df628bc180d397681b9e6ec53a75c Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Fri, 25 Jun 2010 13:42:06 +1000 Subject: Allow components to be created from .pragma library JS files QTBUG-11507 --- src/declarative/qml/qdeclarativecomponent.cpp | 4 +++- src/declarative/qml/qdeclarativeengine.cpp | 24 +++++++++++++++++----- src/declarative/qml/qdeclarativeengine_p.h | 1 + .../qdeclarativeqt/data/createComponent_lib.js | 4 ++++ .../qdeclarativeqt/data/createComponent_lib.qml | 2 ++ .../qdeclarativeqt/tst_qdeclarativeqt.cpp | 6 ++---- 6 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/declarative/qml/qdeclarativecomponent.cpp b/src/declarative/qml/qdeclarativecomponent.cpp index b4919ff..9d3032c 100644 --- a/src/declarative/qml/qdeclarativecomponent.cpp +++ b/src/declarative/qml/qdeclarativecomponent.cpp @@ -572,7 +572,9 @@ QScriptValue QDeclarativeComponent::createObject(QObject* parent) { Q_D(QDeclarativeComponent); QDeclarativeContext* ctxt = creationContext(); - if(!ctxt) + if(!ctxt && d->engine) + ctxt = d->engine->rootContext(); + if (!ctxt) return QScriptValue(QScriptValue::NullValue); QObject* ret = create(ctxt); if (!ret) diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp index 5c4d229..98b4bbf 100644 --- a/src/declarative/qml/qdeclarativeengine.cpp +++ b/src/declarative/qml/qdeclarativeengine.cpp @@ -1033,6 +1033,17 @@ QDeclarativeContextData *QDeclarativeEnginePrivate::getContext(QScriptContext *c return contextClass->contextFromValue(scopeNode); } +/*! + Returns the QUrl associated with the script \a ctxt for the case that there is + no QDeclarativeContext. +*/ +QUrl QDeclarativeEnginePrivate::getUrl(QScriptContext *ctxt) +{ + QScriptValue scopeNode = QScriptDeclarativeClass::scopeChainValue(ctxt, -3); + Q_ASSERT(scopeNode.isValid()); + Q_ASSERT(QScriptDeclarativeClass::scriptClass(scopeNode) == contextClass); + return contextClass->urlFromValue(scopeNode); +} QString QDeclarativeEnginePrivate::urlToLocalFileOrQrc(const QUrl& url) { @@ -1075,16 +1086,19 @@ QScriptValue QDeclarativeEnginePrivate::createComponent(QScriptContext *ctxt, QS static_cast(engine)->p; QDeclarativeEngine* activeEngine = activeEnginePriv->q_func(); - QDeclarativeContextData* context = activeEnginePriv->getContext(ctxt); - Q_ASSERT(context); - if(ctxt->argumentCount() != 1) { return ctxt->throwError(QLatin1String("Qt.createComponent(): Invalid arguments")); - }else{ + } else { + QString arg = ctxt->argument(0).toString(); if (arg.isEmpty()) return engine->nullValue(); - QUrl url = QUrl(context->resolvedUrl(QUrl(arg))); + QUrl url; + QDeclarativeContextData* context = activeEnginePriv->getContext(ctxt); + if (context) + url = QUrl(context->resolvedUrl(QUrl(arg))); + else + url = activeEnginePriv->getUrl(ctxt).resolved(QUrl(arg)); QDeclarativeComponent *c = new QDeclarativeComponent(activeEngine, url, activeEngine); QDeclarativeComponentPrivate::get(c)->creationContext = context; QDeclarativeData::get(c, true)->setImplicitDestructible(); diff --git a/src/declarative/qml/qdeclarativeengine_p.h b/src/declarative/qml/qdeclarativeengine_p.h index 3269e98..cfa9d73 100644 --- a/src/declarative/qml/qdeclarativeengine_p.h +++ b/src/declarative/qml/qdeclarativeengine_p.h @@ -315,6 +315,7 @@ public: static QDeclarativeEnginePrivate *get(QScriptEngine *e) { return static_cast(e)->p; } static QDeclarativeEngine *get(QDeclarativeEnginePrivate *p) { return p->q_func(); } QDeclarativeContextData *getContext(QScriptContext *); + QUrl getUrl(QScriptContext *); static QString urlToLocalFileOrQrc(const QUrl& url); diff --git a/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.js b/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.js index c165e29..30499e9 100644 --- a/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.js +++ b/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.js @@ -5,3 +5,7 @@ function loadComponent() { return component.status; } +function createComponent() { + var component = Qt.createComponent("createComponentData.qml"); + return component.createObject(null); +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.qml b/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.qml index aae7a91..33203c7 100644 --- a/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.qml +++ b/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.qml @@ -3,8 +3,10 @@ import "createComponent_lib.js" as Test Item { property int status: Component.Null + property int readValue: 0 Component.onCompleted: { status = Test.loadComponent() + readValue = Test.createComponent().test; } } diff --git a/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp b/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp index fb100a5..895ee6c 100644 --- a/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp +++ b/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp @@ -365,14 +365,12 @@ void tst_qdeclarativeqt::createComponent() void tst_qdeclarativeqt::createComponent_pragmaLibrary() { // Currently, just loading createComponent_lib.qml causes crash on some platforms - /* QDeclarativeComponent component(&engine, TEST_FILE("createComponent_lib.qml")); QObject *object = component.create(); QVERIFY(object != 0); - - QEXPECT_FAIL("", "QTBUG-11507", Continue); QCOMPARE(object->property("status").toInt(), int(QDeclarativeComponent::Ready)); - */ + QCOMPARE(object->property("readValue").toInt(), int(1913)); + delete object; } void tst_qdeclarativeqt::createQmlObject() -- cgit v0.12 From 2d7e341646e302506531cb0bf87b8da5d088c319 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Fri, 25 Jun 2010 14:26:23 +1000 Subject: Allow custom parsers to handle attached properties QTBUG-11283 --- src/declarative/qml/qdeclarativecompiler.cpp | 13 +++++++++---- src/declarative/qml/qdeclarativecustomparser_p.h | 12 +++++++++++- src/declarative/util/qdeclarativepropertychanges_p.h | 3 +++ .../qdeclarativestates/tst_qdeclarativestates.cpp | 1 - 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp index 60128b7..6917a5b 100644 --- a/src/declarative/qml/qdeclarativecompiler.cpp +++ b/src/declarative/qml/qdeclarativecompiler.cpp @@ -815,6 +815,10 @@ bool QDeclarativeCompiler::buildObject(Object *obj, const BindingContext &ctxt) } } + QDeclarativeCustomParser *cp = 0; + if (isCustomParser) + cp = output->types.at(obj->type).type->customParser(); + // Build all explicit properties specified foreach(Property *prop, obj->properties) { @@ -825,7 +829,9 @@ bool QDeclarativeCompiler::buildObject(Object *obj, const BindingContext &ctxt) bool canDefer = false; if (isCustomParser) { - if (doesPropertyExist(prop, obj)) { + if (doesPropertyExist(prop, obj) && + (!(cp->flags() & QDeclarativeCustomParser::AcceptsAttachedProperties) || + !isAttachedPropertyName(prop->name))) { int ids = compileState.ids.count(); COMPILE_CHECK(buildProperty(prop, obj, objCtxt)); canDefer = ids == compileState.ids.count(); @@ -876,8 +882,7 @@ bool QDeclarativeCompiler::buildObject(Object *obj, const BindingContext &ctxt) defaultProperty->release(); // Compile custom parser parts - if (isCustomParser/* && !customProps.isEmpty()*/) { - QDeclarativeCustomParser *cp = output->types.at(obj->type).type->customParser(); + if (isCustomParser && !customProps.isEmpty()) { cp->clearErrors(); cp->compiler = this; cp->object = obj; @@ -1356,7 +1361,7 @@ bool QDeclarativeCompiler::buildSignal(QDeclarativeParser::Property *prop, QDecl Returns true if (value) property \a prop exists on obj, false otherwise. */ bool QDeclarativeCompiler::doesPropertyExist(QDeclarativeParser::Property *prop, - QDeclarativeParser::Object *obj) + QDeclarativeParser::Object *obj) { if(isAttachedPropertyName(prop->name) || prop->name == "id") return true; diff --git a/src/declarative/qml/qdeclarativecustomparser_p.h b/src/declarative/qml/qdeclarativecustomparser_p.h index 0e397c5..1a746b4 100644 --- a/src/declarative/qml/qdeclarativecustomparser_p.h +++ b/src/declarative/qml/qdeclarativecustomparser_p.h @@ -113,10 +113,18 @@ private: class Q_DECLARATIVE_EXPORT QDeclarativeCustomParser { public: - QDeclarativeCustomParser() : compiler(0), object(0) {} + enum Flag { + NoFlag = 0x00000000, + AcceptsAttachedProperties = 0x00000001 + }; + Q_DECLARE_FLAGS(Flags, Flag); + + QDeclarativeCustomParser() : compiler(0), object(0), m_flags(NoFlag) {} + QDeclarativeCustomParser(Flags f) : compiler(0), object(0), m_flags(f) {} virtual ~QDeclarativeCustomParser() {} void clearErrors(); + Flags flags() const { return m_flags; } virtual QByteArray compile(const QList &)=0; virtual void setCustomData(QObject *, const QByteArray &)=0; @@ -134,8 +142,10 @@ private: QList exceptions; QDeclarativeCompiler *compiler; QDeclarativeParser::Object *object; + Flags m_flags; friend class QDeclarativeCompiler; }; +Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativeCustomParser::Flags); #if 0 #define QML_REGISTER_CUSTOM_TYPE(URI, VERSION_MAJ, VERSION_MIN, NAME, TYPE, CUSTOMTYPE) \ diff --git a/src/declarative/util/qdeclarativepropertychanges_p.h b/src/declarative/util/qdeclarativepropertychanges_p.h index c2ed466..bb0f944 100644 --- a/src/declarative/util/qdeclarativepropertychanges_p.h +++ b/src/declarative/util/qdeclarativepropertychanges_p.h @@ -79,6 +79,9 @@ public: class QDeclarativePropertyChangesParser : public QDeclarativeCustomParser { public: + QDeclarativePropertyChangesParser() + : QDeclarativeCustomParser(AcceptsAttachedProperties) {} + void compileList(QList > &list, const QByteArray &pre, const QDeclarativeCustomParserProperty &prop); virtual QByteArray compile(const QList &); diff --git a/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp b/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp index 2913ddd..639b2f3 100644 --- a/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp +++ b/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp @@ -263,7 +263,6 @@ void tst_qdeclarativestates::attachedPropertyChanges() MyAttached *att = qobject_cast(attObj); QVERIFY(att); - QEXPECT_FAIL("", "QTBUG-11283", Abort); QCOMPARE(att->foo(), 1); } -- cgit v0.12 From 46233eaa956e57a4c948cec759a3be606a8bdcb8 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Fri, 25 Jun 2010 15:13:20 +1000 Subject: Handle enums in method arguments in the same way as QtScript QML will now invoke methods with enums as arguments, in the same fashion as QtScript. QTBUG-11313 --- .../qml/qdeclarativeobjectscriptclass.cpp | 24 +++++++++++++++++++++- .../qml/qdeclarativeobjectscriptclass_p.h | 2 ++ .../declarative/qdeclarativeecmascript/testtypes.h | 4 ++++ .../tst_qdeclarativeecmascript.cpp | 7 +++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp index aca01b2..3af892d 100644 --- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp +++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp @@ -797,6 +797,26 @@ QScriptDeclarativeClass::Value MetaCallArgument::toValue(QDeclarativeEngine *e) } } +int QDeclarativeObjectMethodScriptClass::enumType(const QMetaObject *meta, const QString &strname) +{ + QByteArray str = strname.toUtf8(); + QByteArray scope; + QByteArray name; + int scopeIdx = str.lastIndexOf("::"); + if (scopeIdx != -1) { + scope = str.left(scopeIdx); + name = str.mid(scopeIdx + 2); + } else { + name = str; + } + for (int i = meta->enumeratorCount() - 1; i >= 0; --i) { + QMetaEnum m = meta->enumerator(i); + if ((m.name() == name) && (scope.isEmpty() || (m.scope() == scope))) + return QVariant::Int; + } + return QVariant::Invalid; +} + QDeclarativeObjectMethodScriptClass::Value QDeclarativeObjectMethodScriptClass::call(Object *o, QScriptContext *ctxt) { MethodData *method = static_cast(o); @@ -810,7 +830,9 @@ QDeclarativeObjectMethodScriptClass::Value QDeclarativeObjectMethodScriptClass:: // ### Cache for (int ii = 0; ii < argTypeNames.count(); ++ii) { argTypes[ii] = QMetaType::type(argTypeNames.at(ii)); - if (argTypes[ii] == QVariant::Invalid) + if (argTypes[ii] == QVariant::Invalid) + argTypes[ii] = enumType(method->object->metaObject(), argTypeNames.at(ii)); + if (argTypes[ii] == QVariant::Invalid) return Value(ctxt, ctxt->throwError(QString::fromLatin1("Unknown method parameter type: %1").arg(QLatin1String(argTypeNames.at(ii))))); } diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass_p.h b/src/declarative/qml/qdeclarativeobjectscriptclass_p.h index 4b27e53..75e384c 100644 --- a/src/declarative/qml/qdeclarativeobjectscriptclass_p.h +++ b/src/declarative/qml/qdeclarativeobjectscriptclass_p.h @@ -80,6 +80,8 @@ protected: virtual Value property(Object *, const Identifier &); private: + int enumType(const QMetaObject *, const QString &); + PersistentIdentifier m_connectId; PersistentIdentifier m_disconnectId; QScriptValue m_connect; diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h index fef76ef..849879e 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h +++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h @@ -557,7 +557,9 @@ Q_DECLARE_METATYPE(QScriptValue); class MyInvokableObject : public QObject { Q_OBJECT + Q_ENUMS(TestEnum) public: + enum TestEnum { EnumValue1, EnumValue2 }; MyInvokableObject() { reset(); } int invoked() const { return m_invoked; } @@ -589,6 +591,8 @@ public: Q_INVOKABLE void method_overload(int a) { invoke(16); m_actuals << a; } Q_INVOKABLE void method_overload(int a, int b) { invoke(17); m_actuals << a << b; } + Q_INVOKABLE void method_with_enum(TestEnum e) { invoke(18); m_actuals << (int)e; } + private: void invoke(int idx) { if (m_invoked != -1) m_invokedError = true; m_invoked = idx;} int m_invoked; diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp index 5619f22..43900ae 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp +++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp @@ -1721,6 +1721,13 @@ void tst_qdeclarativeecmascript::callQtInvokables() QCOMPARE(o.actuals().count(), 2); QCOMPARE(o.actuals().at(0), QVariant(10)); QCOMPARE(o.actuals().at(1), QVariant(11)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_with_enum(9)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 18); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(9)); } // QTBUG-5675 -- cgit v0.12 From c91030e308f8cd9ad66e7de127a1f9dbbedd11d3 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Fri, 25 Jun 2010 16:30:59 +1000 Subject: Test only on X11, not only on Linux (which includes embedded). --- tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp | 4 ++-- .../declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp index dc92f07..8a4f152 100644 --- a/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp +++ b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp @@ -424,7 +424,7 @@ void tst_qdeclarativetext::alignments() QFETCH(int, vAlign); QFETCH(QString, expectfile); -#ifdef Q_OS_LINUX +#ifdef Q_WS_X11 // Font-specific, but not likely platform-specific, so only test on one platform QFont fn; fn.setRawName("-misc-fixed-medium-r-*-*-8-*-*-*-*-*-*-*"); @@ -450,7 +450,7 @@ void tst_qdeclarativetext::alignments() QImage expect(expectfile); -#ifdef Q_OS_LINUX +#ifdef Q_WS_X11 // Font-specific, but not likely platform-specific, so only test on one platform QCOMPARE(actual,expect); #endif diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp index adf8348..f1a367f 100644 --- a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp +++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp @@ -325,7 +325,7 @@ void tst_qdeclarativetextedit::alignments() QFETCH(int, vAlign); QFETCH(QString, expectfile); -#ifdef Q_OS_LINUX +#ifdef Q_WS_X11 // Font-specific, but not likely platform-specific, so only test on one platform QFont fn; fn.setRawName("-misc-fixed-medium-r-*-*-8-*-*-*-*-*-*-*"); @@ -351,7 +351,7 @@ void tst_qdeclarativetextedit::alignments() QImage expect(expectfile); -#ifdef Q_OS_LINUX +#ifdef Q_WS_X11 // Font-specific, but not likely platform-specific, so only test on one platform QCOMPARE(actual,expect); #endif -- cgit v0.12 From 03df7f73de6a1fd482876caaf377a61593df8a38 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Fri, 25 Jun 2010 16:37:28 +1000 Subject: Test ListElement type via type system, not string comparison. Task-number: QTBUG-11222 Reviewed-by: Aaron Kennedy --- src/declarative/qml/qdeclarativecompiler.cpp | 12 ++++++++++++ src/declarative/qml/qdeclarativecompiler_p.h | 1 + src/declarative/qml/qdeclarativecustomparser.cpp | 10 ++++++++++ src/declarative/qml/qdeclarativecustomparser_p.h | 2 ++ src/declarative/util/qdeclarativelistmodel.cpp | 11 ++++++++--- src/declarative/util/qdeclarativelistmodel_p.h | 2 ++ 6 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp index 80a1093..a7cfa62 100644 --- a/src/declarative/qml/qdeclarativecompiler.cpp +++ b/src/declarative/qml/qdeclarativecompiler.cpp @@ -2176,6 +2176,18 @@ int QDeclarativeCompiler::evaluateEnum(const QByteArray& script) const return -1; } +const QMetaObject *QDeclarativeCompiler::resolveType(const QByteArray& name) const +{ + QDeclarativeType *qmltype = 0; + if (!enginePrivate->importDatabase.resolveType(unit->imports, name, &qmltype, + 0, 0, 0, 0)) + return 0; + if (!qmltype) + return 0; + return qmltype->metaObject(); +} + + // Ensures that the dynamic meta specification on obj is valid bool QDeclarativeCompiler::checkDynamicMeta(QDeclarativeParser::Object *obj) { diff --git a/src/declarative/qml/qdeclarativecompiler_p.h b/src/declarative/qml/qdeclarativecompiler_p.h index 908c703..caad376 100644 --- a/src/declarative/qml/qdeclarativecompiler_p.h +++ b/src/declarative/qml/qdeclarativecompiler_p.h @@ -161,6 +161,7 @@ public: static bool isSignalPropertyName(const QByteArray &); int evaluateEnum(const QByteArray& script) const; // for QDeclarativeCustomParser::evaluateEnum + const QMetaObject *resolveType(const QByteArray& name) const; // for QDeclarativeCustomParser::resolveType private: static void reset(QDeclarativeCompiledData *); diff --git a/src/declarative/qml/qdeclarativecustomparser.cpp b/src/declarative/qml/qdeclarativecustomparser.cpp index 472a883..97a6a00 100644 --- a/src/declarative/qml/qdeclarativecustomparser.cpp +++ b/src/declarative/qml/qdeclarativecustomparser.cpp @@ -295,4 +295,14 @@ int QDeclarativeCustomParser::evaluateEnum(const QByteArray& script) const return compiler->evaluateEnum(script); } +/*! + Resolves \a name to a type, or 0 if it is not a type. This can be used + to type-check object nodes. +*/ +const QMetaObject *QDeclarativeCustomParser::resolveType(const QByteArray& name) const +{ + return compiler->resolveType(name); +} + + QT_END_NAMESPACE diff --git a/src/declarative/qml/qdeclarativecustomparser_p.h b/src/declarative/qml/qdeclarativecustomparser_p.h index 0e397c5..8eb86e8 100644 --- a/src/declarative/qml/qdeclarativecustomparser_p.h +++ b/src/declarative/qml/qdeclarativecustomparser_p.h @@ -130,6 +130,8 @@ protected: int evaluateEnum(const QByteArray&) const; + const QMetaObject *resolveType(const QByteArray&) const; + private: QList exceptions; QDeclarativeCompiler *compiler; diff --git a/src/declarative/util/qdeclarativelistmodel.cpp b/src/declarative/util/qdeclarativelistmodel.cpp index 9ed21a6..deb835d 100644 --- a/src/declarative/util/qdeclarativelistmodel.cpp +++ b/src/declarative/util/qdeclarativelistmodel.cpp @@ -551,9 +551,13 @@ bool QDeclarativeListModelParser::compileProperty(const QDeclarativeCustomParser QDeclarativeCustomParserNode node = qvariant_cast(value); - if (node.name() != "ListElement") { - error(node, QDeclarativeListModel::tr("ListElement: cannot contain nested elements")); - return false; + if (node.name() != listElementTypeName) { + const QMetaObject *mo = resolveType(node.name()); + if (mo != &QDeclarativeListElement::staticMetaObject) { + error(node, QDeclarativeListModel::tr("ListElement: cannot contain nested elements")); + return false; + } + listElementTypeName = node.name(); // cache right name for next time } { @@ -650,6 +654,7 @@ QByteArray QDeclarativeListModelParser::compile(const QList instr; QByteArray data; + listElementTypeName = QByteArray(); // unknown for(int ii = 0; ii < customProps.count(); ++ii) { const QDeclarativeCustomParserProperty &prop = customProps.at(ii); diff --git a/src/declarative/util/qdeclarativelistmodel_p.h b/src/declarative/util/qdeclarativelistmodel_p.h index d09062e..6aff9c6 100644 --- a/src/declarative/util/qdeclarativelistmodel_p.h +++ b/src/declarative/util/qdeclarativelistmodel_p.h @@ -135,6 +135,8 @@ private: bool compileProperty(const QDeclarativeCustomParserProperty &prop, QList &instr, QByteArray &data); bool definesEmptyList(const QString &); + + QByteArray listElementTypeName; }; -- cgit v0.12 From 543bbe2e122d1d3394ec589c32f9640d1fd88f3b Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Fri, 25 Jun 2010 16:39:28 +1000 Subject: Test QTBUG-11222 Task-number: QTBUG-11222 --- .../qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp index 3d66733..f15ac8f 100644 --- a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp +++ b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp @@ -559,6 +559,18 @@ void tst_qdeclarativelistmodel::error_data() QTest::newRow("QML elements not allowed in ListElement") << "import Qt 4.7\nListModel { ListElement { a: Item { } } }" << "ListElement: cannot contain nested elements"; + + QTest::newRow("qualified ListElement supported") + << "import Qt 4.7 as Foo\nFoo.ListModel { Foo.ListElement { a: 123 } }" + << ""; + + QTest::newRow("qualified ListElement required") + << "import Qt 4.7 as Foo\nFoo.ListModel { ListElement { a: 123 } }" + << "ListElement is not a type"; + + QTest::newRow("unknown qualified ListElement not allowed") + << "import Qt 4.7\nListModel { Foo.ListElement { a: 123 } }" + << "Foo.ListElement - Foo is not a namespace"; } void tst_qdeclarativelistmodel::error() -- cgit v0.12 From 156cabe79a64ffca8d6e1a2df99f35b413a48a39 Mon Sep 17 00:00:00 2001 From: Robert Griebl Date: Mon, 21 Jun 2010 17:59:23 +0200 Subject: Make the QML viewer usable on the N900 --- tools/qml/deviceorientation_maemo.cpp | 127 --------- tools/qml/deviceorientation_maemo5.cpp | 127 +++++++++ tools/qml/loggerwidget.cpp | 25 +- tools/qml/loggerwidget.h | 16 +- tools/qml/main.cpp | 2 +- tools/qml/proxysettings.cpp | 5 +- tools/qml/proxysettings.h | 4 + tools/qml/proxysettings_maemo5.ui | 177 +++++++++++++ tools/qml/qml.pri | 10 +- tools/qml/qml.pro | 3 + tools/qml/qmlruntime.cpp | 471 +++++++++++++++++++++------------ tools/qml/qmlruntime.h | 19 +- tools/qml/recopts_maemo5.ui | 254 ++++++++++++++++++ tools/qml/texteditautoresizer_maemo5.h | 122 +++++++++ 14 files changed, 1036 insertions(+), 326 deletions(-) delete mode 100644 tools/qml/deviceorientation_maemo.cpp create mode 100644 tools/qml/deviceorientation_maemo5.cpp create mode 100644 tools/qml/proxysettings_maemo5.ui create mode 100644 tools/qml/recopts_maemo5.ui create mode 100644 tools/qml/texteditautoresizer_maemo5.h diff --git a/tools/qml/deviceorientation_maemo.cpp b/tools/qml/deviceorientation_maemo.cpp deleted file mode 100644 index 443edc8..0000000 --- a/tools/qml/deviceorientation_maemo.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the tools applications of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "deviceorientation.h" -#include - -#include -#include - -class MaemoOrientation : public DeviceOrientation -{ - Q_OBJECT -public: - MaemoOrientation() - : o(UnknownOrientation) - { - // enable the orientation sensor - QDBusConnection::systemBus().call( - QDBusMessage::createMethodCall(MCE_SERVICE, MCE_REQUEST_PATH, - MCE_REQUEST_IF, MCE_ACCELEROMETER_ENABLE_REQ)); - - // query the initial orientation - QDBusMessage reply = QDBusConnection::systemBus().call( - QDBusMessage::createMethodCall(MCE_SERVICE, MCE_REQUEST_PATH, - MCE_REQUEST_IF, MCE_DEVICE_ORIENTATION_GET)); - if (reply.type() == QDBusMessage::ErrorMessage) { - qWarning("Unable to retrieve device orientation: %s", qPrintable(reply.errorMessage())); - } else { - o = toOrientation(reply.arguments().value(0).toString()); - } - - // connect to the orientation change signal - QDBusConnection::systemBus().connect(QString(), MCE_SIGNAL_PATH, MCE_SIGNAL_IF, - MCE_DEVICE_ORIENTATION_SIG, - this, - SLOT(deviceOrientationChanged(QString))); - } - - ~MaemoOrientation() - { - // disable the orientation sensor - QDBusConnection::systemBus().call( - QDBusMessage::createMethodCall(MCE_SERVICE, MCE_REQUEST_PATH, - MCE_REQUEST_IF, MCE_ACCELEROMETER_DISABLE_REQ)); - } - - inline Orientation orientation() const - { - return o; - } - - void setOrientation(Orientation o) - { - } - -private Q_SLOTS: - void deviceOrientationChanged(const QString &newOrientation) - { - o = toOrientation(newOrientation); - - emit orientationChanged(); -// printf("%d\n", o); - } - -private: - static Orientation toOrientation(const QString &nativeOrientation) - { - if (nativeOrientation == MCE_ORIENTATION_LANDSCAPE) - return Landscape; - else if (nativeOrientation == MCE_ORIENTATION_LANDSCAPE_INVERTED) - return LandscapeInverted; - else if (nativeOrientation == MCE_ORIENTATION_PORTRAIT) - return Portrait; - else if (nativeOrientation == MCE_ORIENTATION_PORTRAIT_INVERTED) - return PortraitInverted; - return UnknownOrientation; - } - -private: - Orientation o; -}; - -DeviceOrientation* DeviceOrientation::instance() -{ - static MaemoOrientation *o = new MaemoOrientation; - return o; -} - -#include "deviceorientation_maemo.moc" diff --git a/tools/qml/deviceorientation_maemo5.cpp b/tools/qml/deviceorientation_maemo5.cpp new file mode 100644 index 0000000..443edc8 --- /dev/null +++ b/tools/qml/deviceorientation_maemo5.cpp @@ -0,0 +1,127 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "deviceorientation.h" +#include + +#include +#include + +class MaemoOrientation : public DeviceOrientation +{ + Q_OBJECT +public: + MaemoOrientation() + : o(UnknownOrientation) + { + // enable the orientation sensor + QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(MCE_SERVICE, MCE_REQUEST_PATH, + MCE_REQUEST_IF, MCE_ACCELEROMETER_ENABLE_REQ)); + + // query the initial orientation + QDBusMessage reply = QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(MCE_SERVICE, MCE_REQUEST_PATH, + MCE_REQUEST_IF, MCE_DEVICE_ORIENTATION_GET)); + if (reply.type() == QDBusMessage::ErrorMessage) { + qWarning("Unable to retrieve device orientation: %s", qPrintable(reply.errorMessage())); + } else { + o = toOrientation(reply.arguments().value(0).toString()); + } + + // connect to the orientation change signal + QDBusConnection::systemBus().connect(QString(), MCE_SIGNAL_PATH, MCE_SIGNAL_IF, + MCE_DEVICE_ORIENTATION_SIG, + this, + SLOT(deviceOrientationChanged(QString))); + } + + ~MaemoOrientation() + { + // disable the orientation sensor + QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(MCE_SERVICE, MCE_REQUEST_PATH, + MCE_REQUEST_IF, MCE_ACCELEROMETER_DISABLE_REQ)); + } + + inline Orientation orientation() const + { + return o; + } + + void setOrientation(Orientation o) + { + } + +private Q_SLOTS: + void deviceOrientationChanged(const QString &newOrientation) + { + o = toOrientation(newOrientation); + + emit orientationChanged(); +// printf("%d\n", o); + } + +private: + static Orientation toOrientation(const QString &nativeOrientation) + { + if (nativeOrientation == MCE_ORIENTATION_LANDSCAPE) + return Landscape; + else if (nativeOrientation == MCE_ORIENTATION_LANDSCAPE_INVERTED) + return LandscapeInverted; + else if (nativeOrientation == MCE_ORIENTATION_PORTRAIT) + return Portrait; + else if (nativeOrientation == MCE_ORIENTATION_PORTRAIT_INVERTED) + return PortraitInverted; + return UnknownOrientation; + } + +private: + Orientation o; +}; + +DeviceOrientation* DeviceOrientation::instance() +{ + static MaemoOrientation *o = new MaemoOrientation; + return o; +} + +#include "deviceorientation_maemo.moc" diff --git a/tools/qml/loggerwidget.cpp b/tools/qml/loggerwidget.cpp index 3ae2b5e..71d20e8 100644 --- a/tools/qml/loggerwidget.cpp +++ b/tools/qml/loggerwidget.cpp @@ -39,29 +39,48 @@ ** ****************************************************************************/ -#include "loggerwidget.h" #include #include #include #include #include +#include +#ifdef Q_WS_MAEMO_5 +# include +# include +# include "texteditautoresizer_maemo5.h" +#endif + +#include "loggerwidget.h" QT_BEGIN_NAMESPACE LoggerWidget::LoggerWidget(QWidget *parent) : - QPlainTextEdit(parent), + QMainWindow(parent), m_visibilityOrigin(SettingsOrigin) { setAttribute(Qt::WA_QuitOnClose, false); setWindowTitle(tr("Warnings")); + m_plainTextEdit = new QPlainTextEdit(); + +#ifdef Q_WS_MAEMO_5 + new TextEditAutoResizer(m_plainTextEdit); + setAttribute(Qt::WA_Maemo5StackedWindow); + QScrollArea *area = new QScrollArea(); + area->setWidget(m_plainTextEdit); + area->setWidgetResizable(true); + setCentralWidget(area); +#else + setCentralWidget(m_plainTextEdit); +#endif readSettings(); setupPreferencesMenu(); } void LoggerWidget::append(const QString &msg) { - appendPlainText(msg); + m_plainTextEdit->appendPlainText(msg); if (!isVisible() && (defaultVisibility() == AutoShowWarnings)) setVisible(true); diff --git a/tools/qml/loggerwidget.h b/tools/qml/loggerwidget.h index fd20c41..0623432 100644 --- a/tools/qml/loggerwidget.h +++ b/tools/qml/loggerwidget.h @@ -42,12 +42,17 @@ #ifndef LOGGERWIDGET_H #define LOGGERWIDGET_H -#include +#include +#include -QT_BEGIN_NAMESPACE +QT_USE_NAMESPACE -class LoggerWidget : public QPlainTextEdit { -Q_OBJECT +class QPlainTextEdit; +class QMenu; +class QAction; + +class LoggerWidget : public QMainWindow { + Q_OBJECT public: LoggerWidget(QWidget *parent=0); @@ -80,14 +85,13 @@ private: QMenu *m_preferencesMenu; QAction *m_showWidgetAction; + QPlainTextEdit *m_plainTextEdit; enum ConfigOrigin { CommandLineOrigin, SettingsOrigin }; ConfigOrigin m_visibilityOrigin; Visibility m_visibility; }; -QT_END_NAMESPACE - Q_DECLARE_METATYPE(LoggerWidget::Visibility) #endif // LOGGERWIDGET_H diff --git a/tools/qml/main.cpp b/tools/qml/main.cpp index a75023b..de5bca2 100644 --- a/tools/qml/main.cpp +++ b/tools/qml/main.cpp @@ -346,7 +346,7 @@ int main(int argc, char ** argv) if (stayOnTop) wflags |= Qt::WindowStaysOnTopHint; - QDeclarativeViewer *viewer = new QDeclarativeViewer(0, wflags); + QDeclarativeViewer *viewer = QDeclarativeViewer::instance(0, wflags); viewer->setAttribute(Qt::WA_DeleteOnClose, true); if (!scriptopts.isEmpty()) { QStringList options = diff --git a/tools/qml/proxysettings.cpp b/tools/qml/proxysettings.cpp index 3255e42..ffaa4c0 100644 --- a/tools/qml/proxysettings.cpp +++ b/tools/qml/proxysettings.cpp @@ -48,11 +48,14 @@ QT_BEGIN_NAMESPACE ProxySettings::ProxySettings (QWidget * parent) - : QDialog (parent), Ui::ProxySettings() + : QDialog (parent), Ui::ProxySettings() { setupUi (this); +#if !defined Q_WS_MAEMO_5 + // the onscreen keyboard can't cope with masks proxyServerEdit->setInputMask ("000.000.000.000;_"); +#endif QIntValidator *validator = new QIntValidator (0, 9999, this); proxyPortEdit->setValidator (validator); diff --git a/tools/qml/proxysettings.h b/tools/qml/proxysettings.h index 325929a..5d4d137 100644 --- a/tools/qml/proxysettings.h +++ b/tools/qml/proxysettings.h @@ -44,7 +44,11 @@ #include #include +#ifdef Q_WS_MAEMO_5 +#include "ui_proxysettings_maemo5.h" +#else #include "ui_proxysettings.h" +#endif QT_BEGIN_NAMESPACE /** diff --git a/tools/qml/proxysettings_maemo5.ui b/tools/qml/proxysettings_maemo5.ui new file mode 100644 index 0000000..83f0c2a --- /dev/null +++ b/tools/qml/proxysettings_maemo5.ui @@ -0,0 +1,177 @@ + + + ProxySettings + + + + 0 + 0 + 449 + 164 + + + + HTTP Proxy + + + + 16 + + + 0 + + + 16 + + + 8 + + + 16 + + + 0 + + + + + Use HTTP Proxy + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 16 + + + 0 + + + 0 + + + + + Server + + + + + + + Name or IP + + + + + + + Port + + + + + + + 8080 + + + + + + + Username + + + + + + + + + + Password + + + + + + + QLineEdit::Password + + + + + + + + + + Qt::Vertical + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + proxyCheckBox + proxyServerEdit + proxyPortEdit + usernameEdit + passwordEdit + buttonBox + + + + + buttonBox + accepted() + ProxySettings + accept() + + + 318 + 100 + + + 157 + 116 + + + + + buttonBox + rejected() + ProxySettings + reject() + + + 318 + 100 + + + 286 + 116 + + + + + diff --git a/tools/qml/qml.pri b/tools/qml/qml.pri index 58d8cc1..3e5a88b 100644 --- a/tools/qml/qml.pri +++ b/tools/qml/qml.pri @@ -19,10 +19,12 @@ SOURCES += $$PWD/qmlruntime.cpp \ RESOURCES = $$PWD/qmlruntime.qrc maemo5 { QT += dbus - SOURCES += $$PWD/deviceorientation_maemo.cpp + HEADERS += $$PWD/texteditautoresizer_maemo5.h + SOURCES += $$PWD/deviceorientation_maemo5.cpp + FORMS = $$PWD/recopts_maemo5.ui \ + $$PWD/proxysettings_maemo5.ui } else { SOURCES += $$PWD/deviceorientation.cpp + FORMS = $$PWD/recopts.ui \ + $$PWD/proxysettings.ui } - -FORMS = $$PWD/recopts.ui \ - $$PWD/proxysettings.ui diff --git a/tools/qml/qml.pro b/tools/qml/qml.pro index 9cdec77..63efff1 100644 --- a/tools/qml/qml.pro +++ b/tools/qml/qml.pro @@ -29,6 +29,9 @@ wince* { QT += webkit } } +maemo5 { + QT += maemo5 +} symbian { TARGET.UID3 = 0x20021317 include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) diff --git a/tools/qml/qmlruntime.cpp b/tools/qml/qmlruntime.cpp index 676881d..090ca2a 100644 --- a/tools/qml/qmlruntime.cpp +++ b/tools/qml/qmlruntime.cpp @@ -44,7 +44,15 @@ #ifdef hz #undef hz #endif -#include "ui_recopts.h" +#ifdef Q_WS_MAEMO_5 +# include +# include +# include +# include +# include "ui_recopts_maemo5.h" +#else +# include "ui_recopts.h" +#endif #include "qmlruntime.h" #include @@ -136,24 +144,59 @@ private: }; -class SizedMenuBar : public QMenuBar -{ + +#if defined(Q_WS_MAEMO_5) + +class Maemo5PickerAction : public QWidgetAction { Q_OBJECT public: - SizedMenuBar(QWidget *parent, QWidget *referenceWidget) - : QMenuBar(parent), refWidget(referenceWidget) + Maemo5PickerAction(const QString &text, QActionGroup *actions, QObject *parent) + : QWidgetAction(parent), m_text(text), m_actions(actions) + { } + + QWidget *createWidget(QWidget *parent) { + QMaemo5ValueButton *button = new QMaemo5ValueButton(m_text, parent); + button->setValueLayout(QMaemo5ValueButton::ValueUnderTextCentered); + QMaemo5ListPickSelector *pick = new QMaemo5ListPickSelector(button); + button->setPickSelector(pick); + if (m_actions) { + QStringList sl; + int curIdx = -1, idx = 0; + foreach (QAction *a, m_actions->actions()) { + sl << a->text(); + if (a->isChecked()) + curIdx = idx; + idx++; + } + pick->setModel(new QStringListModel(sl)); + pick->setCurrentIndex(curIdx); + } else { + button->setEnabled(false); + } + connect(pick, SIGNAL(selected(QString)), this, SLOT(emitTriggered())); + return button; } - virtual QSize sizeHint() const +private slots: + void emitTriggered() { - return QSize(refWidget->sizeHint().width(), QMenuBar::sizeHint().height()); + QMaemo5ListPickSelector *pick = qobject_cast(sender()); + if (!pick) + return; + int idx = pick->currentIndex(); + + if (m_actions && idx >= 0 && idx < m_actions->actions().count()) + m_actions->actions().at(idx)->trigger(); } private: - QWidget *refWidget; + QString m_text; + QPointer m_actions; }; +#endif // Q_WS_MAEMO_5 + static struct { const char *name, *args; } ffmpegprofiles[] = { {"Maximum Quality", "-sameq"}, {"High Quality", "-qmax 2"}, @@ -170,7 +213,9 @@ public: RecordingDialog(QWidget *parent) : QDialog(parent) { setupUi(this); +#ifndef Q_WS_MAEMO_5 hz->setValidator(new QDoubleValidator(hz)); +#endif for (int i=0; ffmpegprofiles[i].name; ++i) { profile->addItem(ffmpegprofiles[i].name); } @@ -197,6 +242,132 @@ public: return ffmpegprofiles[i].args[0] ? QLatin1String(ffmpegprofiles[i].args) : customargs; } + void setOriginalSize(const QSize &s) + { + QString str = tr("Original (%1x%2)").arg(s.width()).arg(s.height()); + +#ifdef Q_WS_MAEMO_5 + sizeCombo->setItemText(0, str); +#else + sizeOriginal->setText(str); + if (sizeWidth->value()<=1) { + sizeWidth->setValue(s.width()); + sizeHeight->setValue(s.height()); + } +#endif + } + + void showffmpegOptions(bool b) + { +#ifdef Q_WS_MAEMO_5 + profileLabel->setVisible(b); + profile->setVisible(b); + ffmpegHelp->setVisible(b); + args->setVisible(b); +#else + ffmpegOptions->setVisible(b); +#endif + } + + void showRateOptions(bool b) + { +#ifdef Q_WS_MAEMO_5 + rateLabel->setVisible(b); + rateCombo->setVisible(b); +#else + rateOptions->setVisible(b); +#endif + } + + void setVideoRate(int rate) + { +#ifdef Q_WS_MAEMO_5 + int idx; + if (rate >= 60) + idx = 0; + else if (rate >= 50) + idx = 2; + else if (rate >= 25) + idx = 3; + else if (rate >= 24) + idx = 4; + else if (rate >= 20) + idx = 5; + else if (rate >= 15) + idx = 6; + else + idx = 7; + rateCombo->setCurrentIndex(idx); +#else + if (rate == 24) + hz24->setChecked(true); + else if (rate == 25) + hz25->setChecked(true); + else if (rate == 50) + hz50->setChecked(true); + else if (rate == 60) + hz60->setChecked(true); + else { + hzCustom->setChecked(true); + hz->setText(QString::number(rate)); + } +#endif + } + + int videoRate() const + { +#ifdef Q_WS_MAEMO_5 + switch (rateCombo->currentIndex()) { + case 0: return 60; + case 1: return 50; + case 2: return 25; + case 3: return 24; + case 4: return 20; + case 5: return 15; + case 7: return 10; + default: return 60; + } +#else + if (hz24->isChecked()) + return 24; + else if (hz25->isChecked()) + return 25; + else if (hz50->isChecked()) + return 50; + else if (hz60->isChecked()) + return 60; + else { + return hz->text().toInt(); + } +#endif + } + + QSize videoSize() const + { +#ifdef Q_WS_MAEMO_5 + switch (sizeCombo->currentIndex()) { + case 0: return QSize(); + case 1: return QSize(640,480); + case 2: return QSize(320,240); + case 3: return QSize(1280,720); + default: return QSize(); + } +#else + if (sizeOriginal->isChecked()) + return QSize(); + else if (size720p->isChecked()) + return QSize(1280,720); + else if (sizeVGA->isChecked()) + return QSize(640,480); + else if (sizeQVGA->isChecked()) + return QSize(320,240); + else + return QSize(sizeWidth->value(), sizeHeight->value()); +#endif + } + + + private slots: void pickProfile(int i) { @@ -363,15 +534,21 @@ QString QDeclarativeViewer::getVideoFileName() return QFileDialog::getSaveFileName(this, title, "", types.join(";; ")); } +QDeclarativeViewer *QDeclarativeViewer::inst = 0; + +QDeclarativeViewer *QDeclarativeViewer::instance(QWidget *parent, Qt::WindowFlags flags) +{ + if (!inst) { + inst = new QDeclarativeViewer(parent, flags); + inst->setAttribute(Qt::WA_DeleteOnClose); + } + return inst; +} QDeclarativeViewer::QDeclarativeViewer(QWidget *parent, Qt::WindowFlags flags) -#if defined(Q_OS_SYMBIAN) : QMainWindow(parent, flags) -#else - : QWidget(parent, flags) -#endif - , loggerWindow(new LoggerWidget()) - , frame_stream(0), mb(0) + , loggerWindow(new LoggerWidget(this)) + , frame_stream(0) , orientation(0) , showWarningsWindow(0) , m_scriptOptions(0) @@ -381,6 +558,10 @@ QDeclarativeViewer::QDeclarativeViewer(QWidget *parent, Qt::WindowFlags flags) { QDeclarativeViewer::registerTypes(); setWindowTitle(tr("Qt QML Viewer")); +#ifdef Q_WS_MAEMO_5 + setAttribute(Qt::WA_Maemo5StackedWindow); +// setPalette(QApplication::palette("QLabel")); +#endif devicemode = false; canvas = 0; @@ -393,9 +574,9 @@ QDeclarativeViewer::QDeclarativeViewer(QWidget *parent, Qt::WindowFlags flags) senseFfmpeg(); senseImageMagick(); if (!ffmpegAvailable) - recdlg->ffmpegOptions->hide(); + recdlg->showffmpegOptions(false); if (!ffmpegAvailable && !convertAvailable) - recdlg->rateOptions->hide(); + recdlg->showRateOptions(false); QString warn; if (!ffmpegAvailable) { if (!convertAvailable) @@ -422,21 +603,14 @@ QDeclarativeViewer::QDeclarativeViewer(QWidget *parent, Qt::WindowFlags flags) QObject::connect(warningsWidget(), SIGNAL(closed()), this, SLOT(warningsWidgetClosed())); if (!(flags & Qt::FramelessWindowHint)) { - createMenu(menuBar(),0); + createMenu(); changeOrientation(orientation->actions().value(0)); + } else { + setMenuBar(0); } -#if !defined(Q_OS_SYMBIAN) - QVBoxLayout *layout = new QVBoxLayout; - layout->setMargin(0); - layout->setSpacing(0); - setLayout(layout); - if (mb) - layout->addWidget(mb); - layout->addWidget(canvas); -#else setCentralWidget(canvas); -#endif + namFactory = new NetworkAccessManagerFactory; canvas->engine()->setNetworkAccessManagerFactory(namFactory); @@ -468,26 +642,6 @@ void QDeclarativeViewer::enableExperimentalGestures() canvas->viewport()->setAttribute(Qt::WA_AcceptTouchEvents); } -int QDeclarativeViewer::menuBarHeight() const -{ - if (!(windowFlags() & Qt::FramelessWindowHint)) - return menuBar()->height(); - else - return 0; // don't create menu -} - -QMenuBar *QDeclarativeViewer::menuBar() const -{ -#if !defined(Q_OS_SYMBIAN) - if (!mb) - mb = new SizedMenuBar((QWidget*)this, canvas); -#else - mb = QMainWindow::menuBar(); -#endif - - return mb; -} - QDeclarativeView *QDeclarativeViewer::view() const { return canvas; @@ -498,120 +652,128 @@ LoggerWidget *QDeclarativeViewer::warningsWidget() const return loggerWindow; } -void QDeclarativeViewer::createMenu(QMenuBar *menu, QMenu *flatmenu) +void QDeclarativeViewer::createMenu() { - QObject *parent = flatmenu ? (QObject*)flatmenu : (QObject*)menu; - - QMenu *fileMenu = flatmenu ? flatmenu : menu->addMenu(tr("&File")); - - QAction *openAction = new QAction(tr("&Open..."), parent); + QAction *openAction = new QAction(tr("&Open..."), this); openAction->setShortcut(QKeySequence("Ctrl+O")); connect(openAction, SIGNAL(triggered()), this, SLOT(openFile())); - fileMenu->addAction(openAction); - QAction *reloadAction = new QAction(tr("&Reload"), parent); + QAction *reloadAction = new QAction(tr("&Reload"), this); reloadAction->setShortcut(QKeySequence("Ctrl+R")); connect(reloadAction, SIGNAL(triggered()), this, SLOT(reload())); - fileMenu->addAction(reloadAction); -#if !defined(Q_OS_SYMBIAN) - if (flatmenu) flatmenu->addSeparator(); - - QMenu *recordMenu = flatmenu ? flatmenu : menu->addMenu(tr("&Recording")); - - QAction *snapshotAction = new QAction(tr("&Take Snapshot\tF3"), parent); + QAction *snapshotAction = new QAction(tr("&Take Snapshot"), this); + snapshotAction->setShortcut(QKeySequence("F3")); connect(snapshotAction, SIGNAL(triggered()), this, SLOT(takeSnapShot())); - recordMenu->addAction(snapshotAction); - recordAction = new QAction(tr("Start Recording &Video\tF9"), parent); + recordAction = new QAction(tr("Start Recording &Video"), this); + recordAction->setShortcut(QKeySequence("F9")); connect(recordAction, SIGNAL(triggered()), this, SLOT(toggleRecordingWithSelection())); - recordMenu->addAction(recordAction); - QAction *recordOptions = new QAction(tr("Video &Options..."), parent); + QAction *recordOptions = new QAction(tr("Video &Options..."), this); connect(recordOptions, SIGNAL(triggered()), this, SLOT(chooseRecordingOptions())); - if (flatmenu) - flatmenu->addAction(recordOptions); - - if (flatmenu) flatmenu->addSeparator(); - - QMenu *debugMenu = flatmenu ? flatmenu->addMenu(tr("&Debugging")) : menu->addMenu(tr("&Debugging")); - - QAction *slowAction = new QAction(tr("&Slow Down Animations"), parent); + QAction *slowAction = new QAction(tr("&Slow Down Animations"), this); slowAction->setShortcut(QKeySequence("Ctrl+.")); slowAction->setCheckable(true); connect(slowAction, SIGNAL(triggered(bool)), this, SLOT(setSlowMode(bool))); - debugMenu->addAction(slowAction); - showWarningsWindow = new QAction(tr("Show Warnings"), parent); + showWarningsWindow = new QAction(tr("Show Warnings"), this); showWarningsWindow->setCheckable((true)); showWarningsWindow->setChecked(loggerWindow->isVisible()); connect(showWarningsWindow, SIGNAL(triggered(bool)), this, SLOT(showWarnings(bool))); -#if !defined(Q_OS_SYMBIAN) - debugMenu->addAction(showWarningsWindow); -#endif - - if (flatmenu) flatmenu->addSeparator(); - -#endif // Q_OS_SYMBIAN - - QMenu *settingsMenu = flatmenu ? flatmenu : menu->addMenu(tr("S&ettings")); - QAction *proxyAction = new QAction(tr("Http &proxy..."), parent); + QAction *proxyAction = new QAction(tr("HTTP &Proxy..."), this); connect(proxyAction, SIGNAL(triggered()), this, SLOT(showProxySettings())); - settingsMenu->addAction(proxyAction); -#if !defined(Q_OS_SYMBIAN) - if (!flatmenu) - settingsMenu->addAction(recordOptions); - settingsMenu->addMenu(loggerWindow->preferencesMenu()); -#else - QAction *fullscreenAction = new QAction(tr("Full Screen"), parent); + QAction *fullscreenAction = new QAction(tr("Full Screen"), this); fullscreenAction->setCheckable(true); connect(fullscreenAction, SIGNAL(triggered()), this, SLOT(toggleFullScreen())); - settingsMenu->addAction(fullscreenAction); -#endif - if (flatmenu) flatmenu->addSeparator(); - - QMenu *propertiesMenu = settingsMenu->addMenu(tr("Properties")); - - orientation = new QActionGroup(parent); - - QAction *rotateOrientation = new QAction(tr("Rotate orientation"), parent); + QAction *rotateOrientation = new QAction(tr("Rotate orientation"), this); rotateOrientation->setShortcut(QKeySequence("Ctrl+T")); - settingsMenu->addAction(rotateOrientation); connect(rotateOrientation, SIGNAL(triggered()), this, SLOT(rotateOrientation())); + orientation = new QActionGroup(this); orientation->setExclusive(true); connect(orientation, SIGNAL(triggered(QAction*)), this, SLOT(changeOrientation(QAction*))); - orientation->addAction(tr("orientation: Portrait")); - orientation->addAction(tr("orientation: Landscape")); - orientation->addAction(tr("orientation: Portrait (Inverted)")); - orientation->addAction(tr("orientation: Landscape (Inverted)")); - QList actions = orientation->actions(); - for (int i=0; iaddAction(actions[i]); - actions[i]->setCheckable(true); - } + QAction *portraitAction = new QAction(tr("Portrait"), this); + portraitAction->setCheckable(true); + QAction *landscapeAction = new QAction(tr("Landscape"), this); + landscapeAction->setCheckable(true); + QAction *portraitInvAction = new QAction(tr("Portrait (inverted)"), this); + portraitInvAction->setCheckable(true); + QAction *landscapeInvAction = new QAction(tr("Landscape (inverted)"), this); + landscapeInvAction->setCheckable(true); - if (flatmenu) flatmenu->addSeparator(); - - QMenu *helpMenu = flatmenu ? flatmenu : menu->addMenu(tr("&Help")); - QAction *aboutAction = new QAction(tr("&About Qt..."), parent); + QAction *aboutAction = new QAction(tr("&About Qt..."), this); connect(aboutAction, SIGNAL(triggered()), qApp, SLOT(aboutQt())); - helpMenu->addAction(aboutAction); - QAction *quitAction = new QAction(tr("&Quit"), parent); + QAction *quitAction = new QAction(tr("&Quit"), this); quitAction->setShortcut(QKeySequence("Ctrl+Q")); connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); + + QMenuBar *menu = menuBar(); + if (!menu) + return; + +#if defined(Q_WS_MAEMO_5) + menu->addAction(openAction); + menu->addAction(reloadAction); + + menu->addAction(snapshotAction); + menu->addAction(recordAction); + + menu->addAction(recordOptions); + menu->addAction(proxyAction); + + menu->addAction(slowAction); + menu->addAction(showWarningsWindow); + + orientation->addAction(landscapeAction); + orientation->addAction(portraitAction); + menu->addAction(new Maemo5PickerAction(tr("Set orientation"), orientation, this)); + menu->addAction(fullscreenAction); + return; +#endif // Q_WS_MAEMO_5 + + QMenu *fileMenu = menu->addMenu(tr("&File")); + fileMenu->addAction(openAction); + fileMenu->addAction(reloadAction); fileMenu->addSeparator(); fileMenu->addAction(quitAction); - if (menu) { - menu->setFixedHeight(menu->sizeHint().height()); - menu->setMinimumWidth(10); - } + +#if !defined(Q_OS_SYMBIAN) + QMenu *recordMenu = menu->addMenu(tr("&Recording")); + recordMenu->addAction(snapshotAction); + recordMenu->addAction(recordAction); + + QMenu *debugMenu = menu->addMenu(tr("&Debugging")); + debugMenu->addAction(slowAction); + debugMenu->addAction(showWarningsWindow); +#endif // ! Q_OS_SYMBIAN + + QMenu *settingsMenu = menu->addMenu(tr("S&ettings")); + settingsMenu->addAction(proxyAction); +#if !defined(Q_OS_SYMBIAN) + settingsMenu->addAction(recordOptions); + settingsMenu->addMenu(loggerWindow->preferencesMenu()); +#else // ! Q_OS_SYMBIAN + settingsMenu->addAction(fullscreenAction); +#endif // Q_OS_SYMBIAN + settingsMenu->addAction(rotateOrientation); + + QMenu *propertiesMenu = settingsMenu->addMenu(tr("Properties")); + + orientation->addAction(portraitAction); + orientation->addAction(landscapeAction); + orientation->addAction(portraitInvAction); + orientation->addAction(landscapeInvAction); + propertiesMenu->addActions(orientation->actions()); + + QMenu *helpMenu = menu->addMenu(tr("&Help")); + helpMenu->addAction(aboutAction); } void QDeclarativeViewer::showProxySettings() @@ -685,25 +847,11 @@ void QDeclarativeViewer::chooseRecordingOptions() recdlg->file->setText(record_file); // Size - recdlg->sizeOriginal->setText(tr("Original (%1x%2)").arg(canvas->width()).arg(canvas->height())); - if (recdlg->sizeWidth->value()<=1) { - recdlg->sizeWidth->setValue(canvas->width()); - recdlg->sizeHeight->setValue(canvas->height()); - } + recdlg->setOriginalSize(canvas->size()); // Rate - if (record_rate == 24) - recdlg->hz24->setChecked(true); - else if (record_rate == 25) - recdlg->hz25->setChecked(true); - else if (record_rate == 50) - recdlg->hz50->setChecked(true); - else if (record_rate == 60) - recdlg->hz60->setChecked(true); - else { - recdlg->hzCustom->setChecked(true); - recdlg->hz->setText(QString::number(record_rate)); - } + recdlg->setVideoRate(record_rate); + // Profile recdlg->setArguments(record_args.join(" ")); @@ -711,28 +859,9 @@ void QDeclarativeViewer::chooseRecordingOptions() // File record_file = recdlg->file->text(); // Size - if (recdlg->sizeOriginal->isChecked()) - record_outsize = QSize(); - else if (recdlg->size720p->isChecked()) - record_outsize = QSize(1280,720); - else if (recdlg->sizeVGA->isChecked()) - record_outsize = QSize(640,480); - else if (recdlg->sizeQVGA->isChecked()) - record_outsize = QSize(320,240); - else - record_outsize = QSize(recdlg->sizeWidth->value(),recdlg->sizeHeight->value()); + record_outsize = recdlg->videoSize(); // Rate - if (recdlg->hz24->isChecked()) - record_rate = 24; - else if (recdlg->hz25->isChecked()) - record_rate = 25; - else if (recdlg->hz50->isChecked()) - record_rate = 50; - else if (recdlg->hz60->isChecked()) - record_rate = 60; - else { - record_rate = recdlg->hz->text().toDouble(); - } + record_rate = recdlg->videoRate(); // Profile record_args = recdlg->arguments().split(" ",QString::SkipEmptyParts); } @@ -807,7 +936,8 @@ void QDeclarativeViewer::statusChanged() initialSize = canvas->initialSize(); if (canvas->resizeMode() == QDeclarativeView::SizeRootObjectToView) { if (!isFullScreen() && !isMaximized()) { - resize(QSize(initialSize.width(), initialSize.height()+menuBarHeight())); + canvas->setFixedSize(initialSize); + resize(1, 1); // workaround for QMainWindowLayout NOT shrinking the window if the centralWidget() shrinks updateSizeHints(); } } @@ -1181,14 +1311,14 @@ void QDeclarativeViewer::changeOrientation(QAction *action) return; action->setChecked(true); - QString o = action->text().split(QLatin1Char(':')).value(1).trimmed(); + QString o = action->text(); if (o == QLatin1String("Portrait")) DeviceOrientation::instance()->setOrientation(DeviceOrientation::Portrait); else if (o == QLatin1String("Landscape")) DeviceOrientation::instance()->setOrientation(DeviceOrientation::Landscape); - else if (o == QLatin1String("Portrait (Inverted)")) + else if (o == QLatin1String("Portrait (inverted)")) DeviceOrientation::instance()->setOrientation(DeviceOrientation::PortraitInverted); - else if (o == QLatin1String("Landscape (Inverted)")) + else if (o == QLatin1String("Landscape (inverted)")) DeviceOrientation::instance()->setOrientation(DeviceOrientation::LandscapeInverted); } @@ -1197,9 +1327,9 @@ void QDeclarativeViewer::orientationChanged() if (canvas->resizeMode() == QDeclarativeView::SizeRootObjectToView) { if (canvas->rootObject()) { QSizeF rootObjectSize = canvas->rootObject()->boundingRect().size(); - QSize newSize(rootObjectSize.width(), rootObjectSize.height()+menuBarHeight()); - if (size() != newSize) { - resize(newSize); + if (size() != rootObjectSize.toSize()) { + canvas->setFixedSize(rootObjectSize.toSize()); + resize(1, 1); // workaround for QMainWindowLayout NOT shrinking the window if the centralWidget() shrinks } } } @@ -1253,16 +1383,13 @@ void QDeclarativeViewer::updateSizeHints() { if (canvas->resizeMode() == QDeclarativeView::SizeViewToRootObject) { QSize newWindowSize = canvas->sizeHint(); - newWindowSize.setHeight(newWindowSize.height()+menuBarHeight()); if (!isFullScreen() && !isMaximized()) { - resize(newWindowSize); - setFixedSize(newWindowSize); + canvas->setFixedSize(newWindowSize); + resize(1, 1); // workaround for QMainWindowLayout NOT shrinking the window if the centralWidget() shrinks } } else { // QDeclarativeView::SizeRootObjectToView canvas->setMinimumSize(QSize(0,0)); canvas->setMaximumSize(QSize(16777215,16777215)); - setMinimumSize(QSize(0,0)); - setMaximumSize(QSize(16777215,16777215)); } } diff --git a/tools/qml/qmlruntime.h b/tools/qml/qmlruntime.h index 27bd217..cb1b438 100644 --- a/tools/qml/qmlruntime.h +++ b/tools/qml/qmlruntime.h @@ -43,7 +43,6 @@ #define QDECLARATIVEVIEWER_H #include -#include #include #include #include @@ -62,17 +61,17 @@ class QNetworkReply; class QNetworkCookieJar; class NetworkAccessManagerFactory; class QTranslator; +class QActionGroup; class QDeclarativeViewer -#if defined(Q_OS_SYMBIAN) : public QMainWindow -#else - : public QWidget -#endif { -Q_OBJECT + Q_OBJECT + QDeclarativeViewer(QWidget *parent = 0, Qt::WindowFlags flags = 0); + static QDeclarativeViewer *inst; + public: - QDeclarativeViewer(QWidget *parent=0, Qt::WindowFlags flags=0); + static QDeclarativeViewer *instance(QWidget *parent = 0, Qt::WindowFlags flags = 0); ~QDeclarativeViewer(); static void registerTypes(); @@ -106,8 +105,6 @@ public: void updateSizeHints(); void setSizeToView(bool sizeToView); - QMenuBar *menuBar() const; - QDeclarativeView *view() const; LoggerWidget *warningsWidget() const; @@ -132,7 +129,7 @@ public slots: protected: virtual void keyPressEvent(QKeyEvent *); virtual bool event(QEvent *); - void createMenu(QMenuBar *menu, QMenu *flatmenu); + void createMenu(); private slots: void autoStartRecording(); @@ -150,7 +147,6 @@ private slots: private: QString getVideoFileName(); - int menuBarHeight() const; LoggerWidget *loggerWindow; QDeclarativeView *canvas; @@ -173,7 +169,6 @@ private: QAction *recordAction; QString currentSkin; bool scaleSkin; - mutable QMenuBar *mb; RecordingDialog *recdlg; void senseImageMagick(); diff --git a/tools/qml/recopts_maemo5.ui b/tools/qml/recopts_maemo5.ui new file mode 100644 index 0000000..3bb5eca --- /dev/null +++ b/tools/qml/recopts_maemo5.ui @@ -0,0 +1,254 @@ + + + RecordingOptions + + + + 0 + 0 + 469 + 142 + + + + Video options + + + + QLayout::SetMinAndMaxSize + + + 16 + + + 0 + + + 16 + + + 8 + + + 16 + + + 0 + + + + + + + + Qt::Vertical + + + + 72 + 56 + + + + + + + + Size + + + + + + + + + + + + + VGA + + + + + QVGA + + + + + 720p + + + + + + + + Rate + + + + + + + + 60 Hz + + + + + 50 Hz + + + + + 25 Hz + + + + + 24 Hz + + + + + 20 Hz + + + + + 15 Hz + + + + + 10 Hz + + + + + + + + + + + + + + Profile + + + + + + + warning + + + true + + + + + + + Qt::Vertical + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + File + + + + + + + Options + + + + + + + + + buttonBox + accepted() + RecordingOptions + accept() + + + 258 + 424 + + + 60 + 219 + + + + + buttonBox + rejected() + RecordingOptions + reject() + + + 258 + 424 + + + 92 + 219 + + + + + profile + activated(int) + RecordingOptions + pickProfile(int) + + + 92 + 329 + + + 48 + 194 + + + + + args + textEdited(QString) + RecordingOptions + storeCustomArgs(QString) + + + 128 + 357 + + + 102 + 189 + + + + + + filePicked(QString) + argumentsPicked(QString) + pickFile() + pickProfile(int) + storeCustomArgs(QString) + + diff --git a/tools/qml/texteditautoresizer_maemo5.h b/tools/qml/texteditautoresizer_maemo5.h new file mode 100644 index 0000000..2b9a5f9 --- /dev/null +++ b/tools/qml/texteditautoresizer_maemo5.h @@ -0,0 +1,122 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include + +#ifndef TEXTEDITAUTORESIZER_H +#define TEXTEDITAUTORESIZER_H + +class TextEditAutoResizer : public QObject +{ + Q_OBJECT +public: + TextEditAutoResizer(QWidget *parent) + : QObject(parent), plainTextEdit(qobject_cast(parent)), + textEdit(qobject_cast(parent)), edit(qobject_cast(parent)) + { + // parent must either inherit QPlainTextEdit or QTextEdit! + Q_ASSERT(plainTextEdit || textEdit); + + connect(parent, SIGNAL(textChanged()), this, SLOT(textEditChanged())); + connect(parent, SIGNAL(cursorPositionChanged()), this, SLOT(textEditChanged())); + + textEditChanged(); + } + +private Q_SLOTS: + inline void textEditChanged(); + +private: + QPlainTextEdit *plainTextEdit; + QTextEdit *textEdit; + QFrame *edit; +}; + +void TextEditAutoResizer::textEditChanged() +{ + QTextDocument *doc = textEdit ? textEdit->document() : plainTextEdit->document(); + QRect cursor = textEdit ? textEdit->cursorRect() : plainTextEdit->cursorRect(); + + QSize s = doc->size().toSize(); + if (plainTextEdit) + s.setHeight((s.height() + 2) * edit->fontMetrics().lineSpacing()); + + const QRect fr = edit->frameRect(); + const QRect cr = edit->contentsRect(); + + edit->setMinimumHeight(qMax(70, s.height() + (fr.height() - cr.height() - 1))); + +// QString s1; +// QDebug ts(&s1); +// ts << "DOC: " << s << " CURSOR: " << cursor << " MINH: " << edit->minimumHeight(); +// fprintf(stderr, "%s\n", qPrintable(s1)); + + // make sure the cursor is visible in case we have a QAbstractScrollArea parent + QPoint pos = edit->pos(); + QWidget *pw = edit->parentWidget(); + while (pw) { + if (qobject_cast(pw)) + break; + pw = pw->parentWidget(); + } + + if (pw) { + QScrollArea *area = static_cast(pw); + QPoint scrollto = area->widget()->mapFrom(edit, cursor.center()); + QPoint margin(10 + cursor.width(), 2 * cursor.height()); + + if (QAbstractKineticScroller *scroller = area->property("kineticScroller").value()) { + scroller->ensureVisible(scrollto, margin.x(), margin.y()); + } else { + area->ensureVisible(scrollto.x(), scrollto.y(), margin.x(), margin.y()); + } + } +// QDebug ts(&s2); +// ts << "ENSURE VIS: " << pos << " + " << cursor.center() << "(pos + cursor.center())" << scroller->isEnabled() << area; +// ts << "PW: " << pw << " PPW: " << (pw ? pw->parentWidget() : 0); //ENSURE VIS: " << pos << " + " << cursor.center() << "(pos + cursor.center())" << scroller->isEnabled() << area; +// fprintf(stderr, "%s\n", qPrintable(s2)); +} + +#endif -- cgit v0.12 From 7294f46ec0c5ea07e438c45a069a618ceb6e17a9 Mon Sep 17 00:00:00 2001 From: Robert Griebl Date: Wed, 23 Jun 2010 12:15:36 +0200 Subject: forgot to cleanup the code a bit after adding Maemo5 support --- tools/qml/loggerwidget.cpp | 4 ++-- tools/qml/qmlruntime.cpp | 8 ++++---- tools/qml/texteditautoresizer_maemo5.h | 17 ++++------------- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/tools/qml/loggerwidget.cpp b/tools/qml/loggerwidget.cpp index 71d20e8..8aa029f 100644 --- a/tools/qml/loggerwidget.cpp +++ b/tools/qml/loggerwidget.cpp @@ -63,7 +63,7 @@ LoggerWidget::LoggerWidget(QWidget *parent) : setWindowTitle(tr("Warnings")); m_plainTextEdit = new QPlainTextEdit(); - + #ifdef Q_WS_MAEMO_5 new TextEditAutoResizer(m_plainTextEdit); setAttribute(Qt::WA_Maemo5StackedWindow); @@ -71,7 +71,7 @@ LoggerWidget::LoggerWidget(QWidget *parent) : area->setWidget(m_plainTextEdit); area->setWidgetResizable(true); setCentralWidget(area); -#else +#else setCentralWidget(m_plainTextEdit); #endif readSettings(); diff --git a/tools/qml/qmlruntime.cpp b/tools/qml/qmlruntime.cpp index 090ca2a..3a8af60 100644 --- a/tools/qml/qmlruntime.cpp +++ b/tools/qml/qmlruntime.cpp @@ -254,9 +254,9 @@ public: sizeWidth->setValue(s.width()); sizeHeight->setValue(s.height()); } -#endif +#endif } - + void showffmpegOptions(bool b) { #ifdef Q_WS_MAEMO_5 @@ -268,7 +268,7 @@ public: ffmpegOptions->setVisible(b); #endif } - + void showRateOptions(bool b) { #ifdef Q_WS_MAEMO_5 @@ -297,7 +297,7 @@ public: idx = 6; else idx = 7; - rateCombo->setCurrentIndex(idx); + rateCombo->setCurrentIndex(idx); #else if (rate == 24) hz24->setChecked(true); diff --git a/tools/qml/texteditautoresizer_maemo5.h b/tools/qml/texteditautoresizer_maemo5.h index 2b9a5f9..bb5567a 100644 --- a/tools/qml/texteditautoresizer_maemo5.h +++ b/tools/qml/texteditautoresizer_maemo5.h @@ -61,7 +61,7 @@ public: connect(parent, SIGNAL(textChanged()), this, SLOT(textEditChanged())); connect(parent, SIGNAL(cursorPositionChanged()), this, SLOT(textEditChanged())); - + textEditChanged(); } @@ -87,36 +87,27 @@ void TextEditAutoResizer::textEditChanged() const QRect cr = edit->contentsRect(); edit->setMinimumHeight(qMax(70, s.height() + (fr.height() - cr.height() - 1))); - -// QString s1; -// QDebug ts(&s1); -// ts << "DOC: " << s << " CURSOR: " << cursor << " MINH: " << edit->minimumHeight(); -// fprintf(stderr, "%s\n", qPrintable(s1)); // make sure the cursor is visible in case we have a QAbstractScrollArea parent QPoint pos = edit->pos(); QWidget *pw = edit->parentWidget(); - while (pw) { + while (pw) { if (qobject_cast(pw)) break; pw = pw->parentWidget(); } - + if (pw) { QScrollArea *area = static_cast(pw); QPoint scrollto = area->widget()->mapFrom(edit, cursor.center()); QPoint margin(10 + cursor.width(), 2 * cursor.height()); - + if (QAbstractKineticScroller *scroller = area->property("kineticScroller").value()) { scroller->ensureVisible(scrollto, margin.x(), margin.y()); } else { area->ensureVisible(scrollto.x(), scrollto.y(), margin.x(), margin.y()); } } -// QDebug ts(&s2); -// ts << "ENSURE VIS: " << pos << " + " << cursor.center() << "(pos + cursor.center())" << scroller->isEnabled() << area; -// ts << "PW: " << pw << " PPW: " << (pw ? pw->parentWidget() : 0); //ENSURE VIS: " << pos << " + " << cursor.center() << "(pos + cursor.center())" << scroller->isEnabled() << area; -// fprintf(stderr, "%s\n", qPrintable(s2)); } #endif -- cgit v0.12 From 9768a42358d1908701347d52887a964574b1b9b4 Mon Sep 17 00:00:00 2001 From: Robert Griebl Date: Thu, 24 Jun 2010 18:37:32 +0200 Subject: fix QML Viewer resize modes --- tools/qml/qmlruntime.cpp | 10 ++++++---- tools/qml/qmlruntime.h | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tools/qml/qmlruntime.cpp b/tools/qml/qmlruntime.cpp index 3a8af60..109de7d 100644 --- a/tools/qml/qmlruntime.cpp +++ b/tools/qml/qmlruntime.cpp @@ -937,8 +937,8 @@ void QDeclarativeViewer::statusChanged() if (canvas->resizeMode() == QDeclarativeView::SizeRootObjectToView) { if (!isFullScreen() && !isMaximized()) { canvas->setFixedSize(initialSize); - resize(1, 1); // workaround for QMainWindowLayout NOT shrinking the window if the centralWidget() shrinks - updateSizeHints(); + resize(1, 1); // workaround for QMainWindowLayout NOT shrinking the window if the centralWidget() shrink + QTimer::singleShot(0, this, SLOT(updateSizeHints())); } } } @@ -1328,7 +1328,8 @@ void QDeclarativeViewer::orientationChanged() if (canvas->rootObject()) { QSizeF rootObjectSize = canvas->rootObject()->boundingRect().size(); if (size() != rootObjectSize.toSize()) { - canvas->setFixedSize(rootObjectSize.toSize()); + canvas->setMinimumSize(rootObjectSize.toSize()); + canvas->resize(rootObjectSize.toSize()); resize(1, 1); // workaround for QMainWindowLayout NOT shrinking the window if the centralWidget() shrinks } } @@ -1384,7 +1385,8 @@ void QDeclarativeViewer::updateSizeHints() if (canvas->resizeMode() == QDeclarativeView::SizeViewToRootObject) { QSize newWindowSize = canvas->sizeHint(); if (!isFullScreen() && !isMaximized()) { - canvas->setFixedSize(newWindowSize); + canvas->setMinimumSize(newWindowSize); + canvas->resize(newWindowSize); resize(1, 1); // workaround for QMainWindowLayout NOT shrinking the window if the centralWidget() shrinks } } else { // QDeclarativeView::SizeRootObjectToView diff --git a/tools/qml/qmlruntime.h b/tools/qml/qmlruntime.h index cb1b438..cec3204 100644 --- a/tools/qml/qmlruntime.h +++ b/tools/qml/qmlruntime.h @@ -102,7 +102,6 @@ public: void addPluginPath(const QString& plugin); void setUseGL(bool use); void setUseNativeFileBrowser(bool); - void updateSizeHints(); void setSizeToView(bool sizeToView); QDeclarativeView *view() const; @@ -145,6 +144,8 @@ private slots: void warningsWidgetOpened(); void warningsWidgetClosed(); + void updateSizeHints(); + private: QString getVideoFileName(); -- cgit v0.12 From 82e914952ad82063b31d11916e883e018111fe28 Mon Sep 17 00:00:00 2001 From: Robert Griebl Date: Thu, 24 Jun 2010 18:53:30 +0200 Subject: fix namespace macros --- tools/qml/loggerwidget.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/qml/loggerwidget.h b/tools/qml/loggerwidget.h index 0623432..13c319f 100644 --- a/tools/qml/loggerwidget.h +++ b/tools/qml/loggerwidget.h @@ -45,7 +45,7 @@ #include #include -QT_USE_NAMESPACE +QT_BEGIN_NAMESPACE class QPlainTextEdit; class QMenu; @@ -92,6 +92,8 @@ private: Visibility m_visibility; }; +QT_END_NAMESPACE + Q_DECLARE_METATYPE(LoggerWidget::Visibility) #endif // LOGGERWIDGET_H -- cgit v0.12 From 842ccf428d4cbed3c4ce1e0c894fbebcfd59ce0e Mon Sep 17 00:00:00 2001 From: Robert Griebl Date: Thu, 24 Jun 2010 17:26:45 +0200 Subject: forget to rename the moc include when renaming deviceorientation_maemo.cpp --- tools/qml/deviceorientation_maemo5.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/qml/deviceorientation_maemo5.cpp b/tools/qml/deviceorientation_maemo5.cpp index 443edc8..e942579 100644 --- a/tools/qml/deviceorientation_maemo5.cpp +++ b/tools/qml/deviceorientation_maemo5.cpp @@ -124,4 +124,4 @@ DeviceOrientation* DeviceOrientation::instance() return o; } -#include "deviceorientation_maemo.moc" +#include "deviceorientation_maemo5.moc" -- cgit v0.12