From 79864599ec3a1ce5a5ede84ea2d3d7ba437a3257 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 5 Nov 2009 22:39:24 +0100 Subject: don't construct a new message for look-up purposes only --- tools/linguist/lupdate/merge.cpp | 8 +++++--- tools/linguist/shared/translator.cpp | 8 -------- tools/linguist/shared/translator.h | 2 -- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/tools/linguist/lupdate/merge.cpp b/tools/linguist/lupdate/merge.cpp index b5f77cd..cffbfa3 100644 --- a/tools/linguist/lupdate/merge.cpp +++ b/tools/linguist/lupdate/merge.cpp @@ -351,8 +351,9 @@ Translator merge(const Translator &tor, const Translator &virginTor, if (!mv.isNull()) m.setComment(mv.comment()); } else { - TranslatorMessage mv = virginTor.find(m.context(), m.sourceText(), m.comment()); - if (mv.isNull()) { + TranslatorMessage mv; + int mvi = virginTor.messages().indexOf(m); + if (mvi < 0) { if (!(options & HeuristicSimilarText)) { newType = TranslatorMessage::Obsolete; if (m.type() != TranslatorMessage::Obsolete) @@ -402,6 +403,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, } } } else { + mv = virginTor.message(mvi); switch (m.type()) { case TranslatorMessage::Finished: default: @@ -446,7 +448,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, if (tor.contains(mv.context())) continue; } else { - if (tor.contains(mv.context(), mv.sourceText(), mv.comment())) + if (tor.messages().contains(mv)) continue; if (options & HeuristicSimilarText) { TranslatorMessage m = tor.find(mv.context(), mv.comment(), mv.allReferences()); diff --git a/tools/linguist/shared/translator.cpp b/tools/linguist/shared/translator.cpp index cd670cc..3b7ee9a 100644 --- a/tools/linguist/shared/translator.cpp +++ b/tools/linguist/shared/translator.cpp @@ -319,14 +319,6 @@ bool Translator::contains(const QString &context, } TranslatorMessage Translator::find(const QString &context, - const QString &sourceText, const QString &comment) const -{ - TranslatorMessage needle(context, sourceText, comment, QString(), QString(), 0); - int index = m_messages.indexOf(needle); - return index == -1 ? TranslatorMessage() : m_messages.at(index); -} - -TranslatorMessage Translator::find(const QString &context, const QString &comment, const TranslatorMessage::References &refs) const { if (!refs.isEmpty()) { diff --git a/tools/linguist/shared/translator.h b/tools/linguist/shared/translator.h index ef81d2a..6db6f3a 100644 --- a/tools/linguist/shared/translator.h +++ b/tools/linguist/shared/translator.h @@ -115,8 +115,6 @@ public: bool contains(const QString &context, const QString &sourceText, const QString &comment) const; - TranslatorMessage find(const QString &context, - const QString &sourceText, const QString &comment) const; TranslatorMessage find(const QString &context, const QString &comment, const TranslatorMessage::References &refs) const; -- cgit v0.12 From ffa332a3c8eef08695791b9fdccfd2677ec325fc Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 5 Nov 2009 20:01:22 +0100 Subject: cut code dupe ... ... with gotos :) --- tools/linguist/lupdate/merge.cpp | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/tools/linguist/lupdate/merge.cpp b/tools/linguist/lupdate/merge.cpp index cffbfa3..1ae4cfb 100644 --- a/tools/linguist/lupdate/merge.cpp +++ b/tools/linguist/lupdate/merge.cpp @@ -355,6 +355,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, int mvi = virginTor.messages().indexOf(m); if (mvi < 0) { if (!(options & HeuristicSimilarText)) { + makeObsolete: newType = TranslatorMessage::Obsolete; if (m.type() != TranslatorMessage::Obsolete) obsoleted++; @@ -363,10 +364,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, mv = virginTor.find(m.context(), m.comment(), m.allReferences()); if (mv.isNull()) { // did not find it in the virgin, mark it as obsolete - newType = TranslatorMessage::Obsolete; - if (m.type() != TranslatorMessage::Obsolete) - obsoleted++; - m.clearReferences(); + goto makeObsolete; } else { // Do not just accept it if its on the same line number, // but different source text. @@ -388,17 +386,11 @@ Translator merge(const Translator &tor, const Translator &virginTor, m.setExtra(QLatin1String("po-old_msgid_plural"), oldpluralsource); m.unsetExtra(QLatin1String("po-msgid_plural")); } - m.setReferences(mv.allReferences()); // Update secondary references - m.setPlural(mv.isPlural()); - m.setUtf8(mv.isUtf8()); - m.setExtraComment(mv.extraComment()); + goto copyAttribs; // Update secondary references } else { // The virgin and vernacular sourceTexts are so // different that we could not find it. - newType = TranslatorMessage::Obsolete; - if (m.type() != TranslatorMessage::Obsolete) - obsoleted++; - m.clearReferences(); + goto makeObsolete; } } } @@ -428,6 +420,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, // This should also enable us to read a file that does not // have the element. // why not use operator=()? Because it overwrites e.g. userData. + copyAttribs: m.setReferences(mv.allReferences()); m.setPlural(mv.isPlural()); m.setUtf8(mv.isUtf8()); -- cgit v0.12 From cfb02f6e1434b0d9ebf9d65cc5048036418bb64d Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 5 Nov 2009 22:47:54 +0100 Subject: remove unused TranslatorMessage::operator<() it was once needed for QMap, but we don't use that any more --- tools/linguist/shared/translatormessage.cpp | 11 ----------- tools/linguist/shared/translatormessage.h | 1 - 2 files changed, 12 deletions(-) diff --git a/tools/linguist/shared/translatormessage.cpp b/tools/linguist/shared/translatormessage.cpp index db6f333..0e7cb18 100644 --- a/tools/linguist/shared/translatormessage.cpp +++ b/tools/linguist/shared/translatormessage.cpp @@ -156,17 +156,6 @@ bool TranslatorMessage::operator==(const TranslatorMessage& m) const } -bool TranslatorMessage::operator<(const TranslatorMessage& m) const -{ - if (m_context != m.m_context) - return m_context < m.m_context; - if (m_sourcetext != m.m_sourcetext) - return m_sourcetext < m.m_sourcetext; - if (m_comment != m.m_comment) - return m_comment < m.m_comment; - return m_id < m.m_id; -} - int qHash(const TranslatorMessage &msg) { return diff --git a/tools/linguist/shared/translatormessage.h b/tools/linguist/shared/translatormessage.h index 675bba7..fb3cc4b 100644 --- a/tools/linguist/shared/translatormessage.h +++ b/tools/linguist/shared/translatormessage.h @@ -110,7 +110,6 @@ public: } bool operator==(const TranslatorMessage& m) const; - bool operator<(const TranslatorMessage& m) const; QString fileName() const { return m_fileName; } void setFileName(const QString &fileName) { m_fileName = fileName; } -- cgit v0.12 From 60b6fcdd18c4a21df086a0965bd2d536a39d2094 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 6 Nov 2009 16:37:33 +0100 Subject: do not consider plural source in comparisons two messages with identical singular but different plural sources simply make no sense. this should be quite a bit faster, as it saves lots of QHash lookups. --- tools/linguist/shared/translatormessage.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tools/linguist/shared/translatormessage.cpp b/tools/linguist/shared/translatormessage.cpp index 0e7cb18..876b129 100644 --- a/tools/linguist/shared/translatormessage.cpp +++ b/tools/linguist/shared/translatormessage.cpp @@ -145,12 +145,9 @@ bool TranslatorMessage::needs8Bit() const bool TranslatorMessage::operator==(const TranslatorMessage& m) const { - static QString msgIdPlural = QLatin1String("po-msgid_plural"); - // Special treatment for context comments (empty source). return (m_context == m.m_context) && m_sourcetext == m.m_sourcetext - && m_extra[msgIdPlural] == m.m_extra[msgIdPlural] && m_id == m.m_id && (m_sourcetext.isEmpty() || m_comment == m.m_comment); } @@ -161,7 +158,6 @@ int qHash(const TranslatorMessage &msg) return qHash(msg.context()) ^ qHash(msg.sourceText()) ^ - qHash(msg.extra(QLatin1String("po-msgid_plural"))) ^ qHash(msg.comment()) ^ qHash(msg.id()); } -- cgit v0.12 From 60acaf5ec7edcd1baf4dd8f80cf93b3e2cb520e4 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 6 Nov 2009 21:05:18 +0100 Subject: use right method to record new messages consistent with all other source parsers --- tools/linguist/lupdate/qscript.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/linguist/lupdate/qscript.cpp b/tools/linguist/lupdate/qscript.cpp index 4600656..6c94588 100644 --- a/tools/linguist/lupdate/qscript.cpp +++ b/tools/linguist/lupdate/qscript.cpp @@ -776,7 +776,7 @@ static void recordMessage( fileName, lineNo, QStringList(), TranslatorMessage::Unfinished, plural); msg.setExtraComment(extracomment.simplified()); - tor->replace(msg); + tor->extend(msg); } -- cgit v0.12 From 92e9a481518d1c13df32bc2f1a9c8a0ba0b8961a Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 6 Nov 2009 21:07:15 +0100 Subject: eliminate Translator::replace() --- tools/linguist/lupdate/merge.cpp | 10 +++------- tools/linguist/shared/translator.cpp | 9 --------- tools/linguist/shared/translator.h | 1 - 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/tools/linguist/lupdate/merge.cpp b/tools/linguist/lupdate/merge.cpp index 1ae4cfb..6b8d4bb 100644 --- a/tools/linguist/lupdate/merge.cpp +++ b/tools/linguist/lupdate/merge.cpp @@ -247,10 +247,8 @@ int applyNumberHeuristic(Translator &tor) t = translated.find(zeroKey((*u).sourceText())); if (t != translated.end() && !t.key().isEmpty() && t->sourceText() != u->sourceText()) { - TranslatorMessage m = *u; - m.setTranslation(translationAttempt(t->translation(), t->sourceText(), - u->sourceText())); - tor.replace(m); + u->setTranslation(translationAttempt(t->translation(), t->sourceText(), + u->sourceText())); inserted++; } } @@ -305,9 +303,7 @@ int applySameTextHeuristic(Translator &tor) QString key = u->sourceText(); t = translated.find(key); if (t != translated.end()) { - TranslatorMessage m = *u; - m.setTranslations(t->translations()); - tor.replace(m); + u->setTranslations(t->translations()); ++inserted; } } diff --git a/tools/linguist/shared/translator.cpp b/tools/linguist/shared/translator.cpp index 3b7ee9a..92ecf07 100644 --- a/tools/linguist/shared/translator.cpp +++ b/tools/linguist/shared/translator.cpp @@ -80,15 +80,6 @@ QList &Translator::registeredFileFormats() return theFormats; } -void Translator::replace(const TranslatorMessage &msg) -{ - int index = m_messages.indexOf(msg); - if (index == -1) - m_messages.append(msg); - else - m_messages[index] = msg; -} - void Translator::replaceSorted(const TranslatorMessage &msg) { int index = m_messages.indexOf(msg); diff --git a/tools/linguist/shared/translator.h b/tools/linguist/shared/translator.h index 6db6f3a..c51993d 100644 --- a/tools/linguist/shared/translator.h +++ b/tools/linguist/shared/translator.h @@ -122,7 +122,6 @@ public: bool contains(const QString &context) const; TranslatorMessage find(const QString &context) const; - void replace(const TranslatorMessage &msg); void replaceSorted(const TranslatorMessage &msg); void extend(const TranslatorMessage &msg); // Only for single-location messages void append(const TranslatorMessage &msg); -- cgit v0.12 From e9a0d840133f53e2a2fb138b9042000c883d0283 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 6 Nov 2009 21:14:15 +0100 Subject: eliminate Translator::contains() replace the one use case with something more efficient --- tools/linguist/shared/qm.cpp | 12 +++++++++++- tools/linguist/shared/translator.cpp | 7 ------- tools/linguist/shared/translator.h | 3 --- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tools/linguist/shared/qm.cpp b/tools/linguist/shared/qm.cpp index 5965aac..99aedef 100644 --- a/tools/linguist/shared/qm.cpp +++ b/tools/linguist/shared/qm.cpp @@ -685,6 +685,16 @@ bool loadQM(Translator &translator, QIODevice &dev, ConversionData &cd) +static bool containsStripped(const Translator &translator, const TranslatorMessage &msg) +{ + foreach (const TranslatorMessage &tmsg, translator.messages()) + if (tmsg.sourceText() == msg.sourceText() + && tmsg.context() == msg.context() + && tmsg.comment().isEmpty()) + return true; + return false; +} + static bool saveQM(const Translator &translator, QIODevice &dev, ConversionData &cd) { Releaser releaser; @@ -741,7 +751,7 @@ static bool saveQM(const Translator &translator, QIODevice &dev, ConversionData bool forceComment = msg.comment().isEmpty() || msg.context().isEmpty() - || translator.contains(msg.context(), msg.sourceText(), QString()); + || containsStripped(translator, msg); releaser.insert(msg, tlns, forceComment); } } diff --git a/tools/linguist/shared/translator.cpp b/tools/linguist/shared/translator.cpp index 92ecf07..a35666d 100644 --- a/tools/linguist/shared/translator.cpp +++ b/tools/linguist/shared/translator.cpp @@ -302,13 +302,6 @@ bool Translator::release(QFile *iod, ConversionData &cd) const return false; } -bool Translator::contains(const QString &context, - const QString &sourceText, const QString &comment) const -{ - return m_messages.contains(TranslatorMessage(context, sourceText, comment, - QString(), QString(), 0)); -} - TranslatorMessage Translator::find(const QString &context, const QString &comment, const TranslatorMessage::References &refs) const { diff --git a/tools/linguist/shared/translator.h b/tools/linguist/shared/translator.h index c51993d..a44d53c 100644 --- a/tools/linguist/shared/translator.h +++ b/tools/linguist/shared/translator.h @@ -113,9 +113,6 @@ public: bool save(const QString &filename, ConversionData &err, const QString &format /*= "auto"*/) const; bool release(QFile *iod, ConversionData &cd) const; - bool contains(const QString &context, const QString &sourceText, - const QString &comment) const; - TranslatorMessage find(const QString &context, const QString &comment, const TranslatorMessage::References &refs) const; -- cgit v0.12 From 1bf836526332626825c21e7e62305d2019c65701 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 6 Nov 2009 14:23:19 +0100 Subject: improve ordered message insertion in a ts file, the top level categorization are the contexts, so it makes no sense to make messages adjoint by file when the context is different. a more clever algorithm which tries to order the entire contexts is conceivable. that would be advantageous for files which use multiple contexts subsequentially if each context appears in only one file. --- tools/linguist/shared/translator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/linguist/shared/translator.cpp b/tools/linguist/shared/translator.cpp index a35666d..8ff6719 100644 --- a/tools/linguist/shared/translator.cpp +++ b/tools/linguist/shared/translator.cpp @@ -136,7 +136,7 @@ void Translator::appendSorted(const TranslatorMessage &msg) int prevLine = 0; int curIdx = 0; foreach (const TranslatorMessage &mit, m_messages) { - bool sameFile = mit.fileName() == msg.fileName(); + bool sameFile = mit.fileName() == msg.fileName() && mit.context() == msg.context(); int curLine; if (sameFile && (curLine = mit.lineNumber()) >= prevLine) { if (msgLine >= prevLine && msgLine < curLine) { -- cgit v0.12 From d4f08b8f15607ac2859c079e94bf8d02a9b8380c Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 6 Nov 2009 22:14:16 +0100 Subject: eliminate TranslatorMessagePtr from the Translator api --- tools/linguist/lconvert/main.cpp | 4 +-- tools/linguist/linguist/messagemodel.cpp | 13 +++++---- tools/linguist/lrelease/main.cpp | 2 +- tools/linguist/shared/translator.cpp | 47 ++++++++++++++++++++++++------- tools/linguist/shared/translator.h | 7 +++-- tools/linguist/shared/translatormessage.h | 26 ----------------- 6 files changed, 51 insertions(+), 48 deletions(-) diff --git a/tools/linguist/lconvert/main.cpp b/tools/linguist/lconvert/main.cpp index 6f5f86a..7807761 100644 --- a/tools/linguist/lconvert/main.cpp +++ b/tools/linguist/lconvert/main.cpp @@ -239,7 +239,7 @@ int main(int argc, char *argv[]) qWarning() << qPrintable(cd.error()); return 2; } - Translator::reportDuplicates(tr.resolveDuplicates(), inFiles[0].name, verbose); + tr.reportDuplicates(tr.resolveDuplicates(), inFiles[0].name, verbose); for (int i = 1; i < inFiles.size(); ++i) { Translator tr2; @@ -247,7 +247,7 @@ int main(int argc, char *argv[]) qWarning() << qPrintable(cd.error()); return 2; } - Translator::reportDuplicates(tr2.resolveDuplicates(), inFiles[i].name, verbose); + tr2.reportDuplicates(tr2.resolveDuplicates(), inFiles[i].name, verbose); for (int j = 0; j < tr2.messageCount(); ++j) tr.replaceSorted(tr2.message(j)); } diff --git a/tools/linguist/linguist/messagemodel.cpp b/tools/linguist/linguist/messagemodel.cpp index e6bb9af..8966624 100644 --- a/tools/linguist/linguist/messagemodel.cpp +++ b/tools/linguist/linguist/messagemodel.cpp @@ -209,19 +209,20 @@ bool DataModel::load(const QString &fileName, bool *langGuessed, QWidget *parent return false; } - QSet dupes = tor.resolveDuplicates(); - if (!dupes.isEmpty()) { + Translator::Duplicates dupes = tor.resolveDuplicates(); + if (!dupes.byContents.isEmpty()) { QString err = tr("Duplicate messages found in '%1':").arg(Qt::escape(fileName)); int numdups = 0; - foreach (const TranslatorMessagePtr &msg, dupes) { + foreach (int j, dupes.byContents) { + const TranslatorMessage &msg = tor.message(j); if (++numdups >= 5) { err += tr("

[more duplicates omitted]"); break; } err += tr("

* Context: %1
* Source: %2") - .arg(Qt::escape(msg->context()), Qt::escape(msg->sourceText())); - if (!msg->comment().isEmpty()) - err += tr("
* Comment: %3").arg(Qt::escape(msg->comment())); + .arg(Qt::escape(msg.context()), Qt::escape(msg.sourceText())); + if (!msg.comment().isEmpty()) + err += tr("
* Comment: %3").arg(Qt::escape(msg.comment())); } QMessageBox::warning(parent, QObject::tr("Qt Linguist"), err); } diff --git a/tools/linguist/lrelease/main.cpp b/tools/linguist/lrelease/main.cpp index ecaed27..742c2e6 100644 --- a/tools/linguist/lrelease/main.cpp +++ b/tools/linguist/lrelease/main.cpp @@ -105,7 +105,7 @@ static bool loadTsFile(Translator &tor, const QString &tsFileName, bool /* verbo static bool releaseTranslator(Translator &tor, const QString &qmFileName, ConversionData &cd, bool removeIdentical) { - Translator::reportDuplicates(tor.resolveDuplicates(), qmFileName, cd.isVerbose()); + tor.reportDuplicates(tor.resolveDuplicates(), qmFileName, cd.isVerbose()); if (cd.isVerbose()) printOut(QCoreApplication::tr( "Updating '%1'...\n").arg(qmFileName)); diff --git a/tools/linguist/shared/translator.cpp b/tools/linguist/shared/translator.cpp index 8ff6719..5bdd133 100644 --- a/tools/linguist/shared/translator.cpp +++ b/tools/linguist/shared/translator.cpp @@ -411,9 +411,35 @@ void Translator::dropUiLines() } } -QSet Translator::resolveDuplicates() +struct TranslatorMessagePtr { + TranslatorMessagePtr(const TranslatorMessage &tm) + { + ptr = &tm; + } + + inline const TranslatorMessage *operator->() const + { + return ptr; + } + + const TranslatorMessage *ptr; +}; + +Q_DECLARE_TYPEINFO(TranslatorMessagePtr, Q_MOVABLE_TYPE); + +inline int qHash(TranslatorMessagePtr tmp) +{ + return qHash(*tmp.ptr); +} + +inline bool operator==(TranslatorMessagePtr tmp1, TranslatorMessagePtr tmp2) +{ + return *tmp1.ptr == *tmp2.ptr; +} + +Translator::Duplicates Translator::resolveDuplicates() { - QSet dups; + Duplicates dups; QHash refs; for (int i = 0; i < m_messages.count();) { const TranslatorMessage &msg = m_messages.at(i); @@ -426,7 +452,7 @@ QSet Translator::resolveDuplicates() omsg.setNonUtf8(true); } else { // Duplicate - dups.insert(omsg); + dups.byContents.insert(*it); } if (!omsg.isTranslated() && msg.isTranslated()) omsg.setTranslations(msg.translations()); @@ -439,21 +465,22 @@ QSet Translator::resolveDuplicates() return dups; } -void Translator::reportDuplicates(const QSet &dupes, +void Translator::reportDuplicates(const Duplicates &dupes, const QString &fileName, bool verbose) { - if (!dupes.isEmpty()) { + if (!dupes.byContents.isEmpty()) { if (!verbose) { qWarning("Warning: dropping duplicate messages in '%s'\n(try -verbose for more info).", qPrintable(fileName)); } else { qWarning("Warning: dropping duplicate messages in '%s':", qPrintable(fileName)); - foreach (const TranslatorMessagePtr &msg, dupes) { + foreach (int j, dupes.byContents) { + const TranslatorMessage &msg = message(j); qWarning("\n* Context: %s\n* Source: %s", - qPrintable(msg->context()), - qPrintable(msg->sourceText())); - if (!msg->comment().isEmpty()) - qWarning("* Comment: %s", qPrintable(msg->comment())); + qPrintable(msg.context()), + qPrintable(msg.sourceText())); + if (!msg.comment().isEmpty()) + qWarning("* Comment: %s", qPrintable(msg.comment())); } qWarning(); } diff --git a/tools/linguist/shared/translator.h b/tools/linguist/shared/translator.h index a44d53c..654c6ab 100644 --- a/tools/linguist/shared/translator.h +++ b/tools/linguist/shared/translator.h @@ -132,9 +132,10 @@ public: void dropTranslations(); void dropUiLines(); void makeFileNamesAbsolute(const QDir &originalPath); - QSet resolveDuplicates(); - static void reportDuplicates(const QSet &dupes, - const QString &fileName, bool verbose); + + struct Duplicates { QSet byContents; }; + Duplicates resolveDuplicates(); + void reportDuplicates(const Duplicates &dupes, const QString &fileName, bool verbose); void setCodecName(const QByteArray &name); QByteArray codecName() const { return m_codecName; } diff --git a/tools/linguist/shared/translatormessage.h b/tools/linguist/shared/translatormessage.h index fb3cc4b..2eb6e5e 100644 --- a/tools/linguist/shared/translatormessage.h +++ b/tools/linguist/shared/translatormessage.h @@ -178,32 +178,6 @@ Q_DECLARE_TYPEINFO(TranslatorMessage, Q_MOVABLE_TYPE); int qHash(const TranslatorMessage &msg); -struct TranslatorMessagePtr { - TranslatorMessagePtr(const TranslatorMessage &tm) - { - ptr = &tm; - } - - inline const TranslatorMessage *operator->() const - { - return ptr; - } - - const TranslatorMessage *ptr; -}; - -Q_DECLARE_TYPEINFO(TranslatorMessagePtr, Q_MOVABLE_TYPE); - -inline int qHash(TranslatorMessagePtr tmp) -{ - return qHash(*tmp.ptr); -} - -inline bool operator==(TranslatorMessagePtr tmp1, TranslatorMessagePtr tmp2) -{ - return *tmp1.ptr == *tmp2.ptr; -} - QT_END_NAMESPACE #endif // QT_NO_TRANSLATION -- cgit v0.12 From 44cc160733a70f5dc613faed2051005de7e48f04 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 6 Nov 2009 22:04:57 +0100 Subject: kill TranslatorMessage::operator==() and qHash(TranslatorMessage) preparation work ... --- tools/linguist/lupdate/merge.cpp | 4 ++-- tools/linguist/shared/translator.cpp | 28 ++++++++++++++++++++++++---- tools/linguist/shared/translator.h | 1 + tools/linguist/shared/translatormessage.cpp | 19 ------------------- tools/linguist/shared/translatormessage.h | 4 ---- 5 files changed, 27 insertions(+), 29 deletions(-) diff --git a/tools/linguist/lupdate/merge.cpp b/tools/linguist/lupdate/merge.cpp index 6b8d4bb..13ba4ae 100644 --- a/tools/linguist/lupdate/merge.cpp +++ b/tools/linguist/lupdate/merge.cpp @@ -348,7 +348,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, m.setComment(mv.comment()); } else { TranslatorMessage mv; - int mvi = virginTor.messages().indexOf(m); + int mvi = virginTor.find(m); if (mvi < 0) { if (!(options & HeuristicSimilarText)) { makeObsolete: @@ -437,7 +437,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, if (tor.contains(mv.context())) continue; } else { - if (tor.messages().contains(mv)) + if (tor.find(mv) >= 0) continue; if (options & HeuristicSimilarText) { TranslatorMessage m = tor.find(mv.context(), mv.comment(), mv.allReferences()); diff --git a/tools/linguist/shared/translator.cpp b/tools/linguist/shared/translator.cpp index 5bdd133..0a59668 100644 --- a/tools/linguist/shared/translator.cpp +++ b/tools/linguist/shared/translator.cpp @@ -82,7 +82,7 @@ QList &Translator::registeredFileFormats() void Translator::replaceSorted(const TranslatorMessage &msg) { - int index = m_messages.indexOf(msg); + int index = find(msg); if (index == -1) appendSorted(msg); else @@ -91,7 +91,7 @@ void Translator::replaceSorted(const TranslatorMessage &msg) void Translator::extend(const TranslatorMessage &msg) { - int index = m_messages.indexOf(msg); + int index = find(msg); if (index == -1) { m_messages.append(msg); } else { @@ -302,6 +302,18 @@ bool Translator::release(QFile *iod, ConversionData &cd) const return false; } +int Translator::find(const TranslatorMessage &msg) const +{ + for (int i = 0; i < m_messages.count(); ++i) { + const TranslatorMessage &tmsg = m_messages.at(i); + if (msg.context() == tmsg.context() + && msg.sourceText() == tmsg.sourceText() + && msg.comment() == tmsg.comment()) + return i; + } + return -1; +} + TranslatorMessage Translator::find(const QString &context, const QString &comment, const TranslatorMessage::References &refs) const { @@ -429,12 +441,20 @@ Q_DECLARE_TYPEINFO(TranslatorMessagePtr, Q_MOVABLE_TYPE); inline int qHash(TranslatorMessagePtr tmp) { - return qHash(*tmp.ptr); + return + qHash(tmp->context()) ^ + qHash(tmp->sourceText()) ^ + qHash(tmp->comment()) ^ + qHash(tmp->id()); } inline bool operator==(TranslatorMessagePtr tmp1, TranslatorMessagePtr tmp2) { - return *tmp1.ptr == *tmp2.ptr; + // Special treatment for context comments (empty source). + return (tmp1->context() == tmp2->context()) + && tmp1->sourceText() == tmp2->sourceText() + && tmp1->id() == tmp2->id() + && (tmp1->sourceText().isEmpty() || tmp1->comment() == tmp2->comment()); } Translator::Duplicates Translator::resolveDuplicates() diff --git a/tools/linguist/shared/translator.h b/tools/linguist/shared/translator.h index 654c6ab..b957fa2 100644 --- a/tools/linguist/shared/translator.h +++ b/tools/linguist/shared/translator.h @@ -113,6 +113,7 @@ public: bool save(const QString &filename, ConversionData &err, const QString &format /*= "auto"*/) const; bool release(QFile *iod, ConversionData &cd) const; + int find(const TranslatorMessage &msg) const; TranslatorMessage find(const QString &context, const QString &comment, const TranslatorMessage::References &refs) const; diff --git a/tools/linguist/shared/translatormessage.cpp b/tools/linguist/shared/translatormessage.cpp index 876b129..5151ebd 100644 --- a/tools/linguist/shared/translatormessage.cpp +++ b/tools/linguist/shared/translatormessage.cpp @@ -143,25 +143,6 @@ bool TranslatorMessage::needs8Bit() const } -bool TranslatorMessage::operator==(const TranslatorMessage& m) const -{ - // Special treatment for context comments (empty source). - return (m_context == m.m_context) - && m_sourcetext == m.m_sourcetext - && m_id == m.m_id - && (m_sourcetext.isEmpty() || m_comment == m.m_comment); -} - - -int qHash(const TranslatorMessage &msg) -{ - return - qHash(msg.context()) ^ - qHash(msg.sourceText()) ^ - qHash(msg.comment()) ^ - qHash(msg.id()); -} - bool TranslatorMessage::hasExtra(const QString &key) const { return m_extra.contains(key); diff --git a/tools/linguist/shared/translatormessage.h b/tools/linguist/shared/translatormessage.h index 2eb6e5e..60b60c5 100644 --- a/tools/linguist/shared/translatormessage.h +++ b/tools/linguist/shared/translatormessage.h @@ -109,8 +109,6 @@ public: return false; } - bool operator==(const TranslatorMessage& m) const; - QString fileName() const { return m_fileName; } void setFileName(const QString &fileName) { m_fileName = fileName; } int lineNumber() const { return m_lineNumber; } @@ -176,8 +174,6 @@ private: Q_DECLARE_TYPEINFO(TranslatorMessage, Q_MOVABLE_TYPE); -int qHash(const TranslatorMessage &msg); - QT_END_NAMESPACE #endif // QT_NO_TRANSLATION -- cgit v0.12 From a66698f947e8ded2e020defa626b154aca1fde9f Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 6 Nov 2009 22:40:23 +0100 Subject: handle messages with ids (more) correctly when comparing two messages which both have ids, compare only the ids. this affects finding/reporting duplicates and merging. --- .../lupdate/testdata/good/mergecpp/finddialog.cpp | 13 +- .../testdata/good/mergecpp/project.ts.before | 18 +++ .../testdata/good/mergecpp/project.ts.result | 19 +++ .../good/mergecpp_noobsolete/finddialog.cpp | 3 + .../good/mergecpp_noobsolete/project.ts.before | 13 ++ .../good/mergecpp_noobsolete/project.ts.result | 8 ++ .../testdata/good/mergecpp_obsolete/finddialog.cpp | 3 + .../good/mergecpp_obsolete/project.ts.before | 13 ++ .../good/mergecpp_obsolete/project.ts.result | 12 ++ tools/linguist/linguist/messagemodel.cpp | 10 +- tools/linguist/lupdate/merge.cpp | 44 ++++--- tools/linguist/shared/translator.cpp | 134 +++++++++++++++------ tools/linguist/shared/translator.h | 2 +- 13 files changed, 239 insertions(+), 53 deletions(-) diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp/finddialog.cpp b/tests/auto/linguist/lupdate/testdata/good/mergecpp/finddialog.cpp index 53eba32..f27e1f0 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp/finddialog.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp/finddialog.cpp @@ -63,5 +63,16 @@ void FindDialog::reset() { tr("%n item(s)", "merge from singular to plural form", 4); tr("%n item(s)", "merge from a finished singular form to an unfinished plural form", 4); -} + + + //% "Hello" + qtTrId("xx_hello"); + + //% "New world" + qtTrId("xx_world"); + + + //= new_id + tr("this is just some text"); +} diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.before b/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.before index d06252c..ad2f65f 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.before +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.before @@ -1,6 +1,19 @@ + + + + Hello + Hallo + + + + World + Welt + + + FindDialog @@ -44,5 +57,10 @@ + + + this is just some text + Unfertige Uebersetzung + diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.result index be4e02e..e9abf89 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.result +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.result @@ -2,6 +2,20 @@ + + + + Hello + Hallo + + + + New world + World + Welt + + + FindDialog @@ -45,5 +59,10 @@ + + + this is just some text + Unfertige Uebersetzung + diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/finddialog.cpp b/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/finddialog.cpp index e1464a2..9abb367 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/finddialog.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/finddialog.cpp @@ -148,4 +148,7 @@ void FindDialog::doFind(bool forward) bool FindDialog::hasFindExpression() const { // statusMessage(tr( "Should be obsolete" )); + + //% "This is some random text" + qtTrId("keep_id") } diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/project.ts.before b/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/project.ts.before index 834f512..feab169 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/project.ts.before +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/project.ts.before @@ -1,6 +1,19 @@ + + + + This is some random text + + + + + Should be obsolete, too + SHOULD BE OBSOLETE AS WELL + + + FindDialog diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/project.ts.result index b328e90..ee3d0f6 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/project.ts.result +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp_noobsolete/project.ts.result @@ -2,6 +2,14 @@ + + + + This is some random text + + + + FindDialog diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/finddialog.cpp b/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/finddialog.cpp index 7b28c75..cc3af48 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/finddialog.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/finddialog.cpp @@ -150,6 +150,9 @@ void FindDialog::doFind(bool forward) bool FindDialog::hasFindExpression() const { + //% "This is some random text" + qtTrId("keep_id") + return !findExpr.isEmpty(); } diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/project.ts.before b/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/project.ts.before index 1fa0fd3..2bc6049 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/project.ts.before +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/project.ts.before @@ -1,6 +1,19 @@ + + + + This is some random text + + + + + Should be obsolete, too + SHOULD BE OBSOLETE AS WELL + + + FindDialog diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/project.ts.result index cfd11b1..f442cbc 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/project.ts.result +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp_obsolete/project.ts.result @@ -2,6 +2,18 @@ + + + + This is some random text + + + + Should be obsolete, too + SHOULD BE OBSOLETE AS WELL + + + FindDialog Enter the text you are looking for. diff --git a/tools/linguist/linguist/messagemodel.cpp b/tools/linguist/linguist/messagemodel.cpp index 8966624..024fd91 100644 --- a/tools/linguist/linguist/messagemodel.cpp +++ b/tools/linguist/linguist/messagemodel.cpp @@ -210,9 +210,16 @@ bool DataModel::load(const QString &fileName, bool *langGuessed, QWidget *parent } Translator::Duplicates dupes = tor.resolveDuplicates(); - if (!dupes.byContents.isEmpty()) { + if (!dupes.byId.isEmpty() || !dupes.byContents.isEmpty()) { QString err = tr("Duplicate messages found in '%1':").arg(Qt::escape(fileName)); int numdups = 0; + foreach (int i, dupes.byId) { + if (++numdups >= 5) { + err += tr("

[more duplicates omitted]"); + goto doWarn; + } + err += tr("

* ID: %1").arg(Qt::escape(tor.message(i).id())); + } foreach (int j, dupes.byContents) { const TranslatorMessage &msg = tor.message(j); if (++numdups >= 5) { @@ -224,6 +231,7 @@ bool DataModel::load(const QString &fileName, bool *langGuessed, QWidget *parent if (!msg.comment().isEmpty()) err += tr("
* Comment: %3").arg(Qt::escape(msg.comment())); } + doWarn: QMessageBox::warning(parent, QObject::tr("Qt Linguist"), err); } diff --git a/tools/linguist/lupdate/merge.cpp b/tools/linguist/lupdate/merge.cpp index 13ba4ae..a721439 100644 --- a/tools/linguist/lupdate/merge.cpp +++ b/tools/linguist/lupdate/merge.cpp @@ -375,6 +375,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, ++similarTextHeuristicCount; neww++; + outdateSource: m.setOldSourceText(m.sourceText()); m.setSourceText(mv.sourceText()); const QString &oldpluralsource = m.extra(QLatin1String("po-msgid_plural")); @@ -392,23 +393,35 @@ Translator merge(const Translator &tor, const Translator &virginTor, } } else { mv = virginTor.message(mvi); - switch (m.type()) { - case TranslatorMessage::Finished: - default: - if (m.isPlural() == mv.isPlural()) { - newType = TranslatorMessage::Finished; - } else { - newType = TranslatorMessage::Unfinished; - } + if (!mv.id().isEmpty() + && (mv.context() != m.context() + || mv.sourceText() != m.sourceText() + || mv.comment() != m.comment())) { known++; - break; - case TranslatorMessage::Unfinished: newType = TranslatorMessage::Unfinished; - known++; - break; - case TranslatorMessage::Obsolete: - newType = TranslatorMessage::Unfinished; - neww++; + m.setContext(mv.context()); + m.setComment(mv.comment()); + if (mv.sourceText() != m.sourceText()) + goto outdateSource; + } else { + switch (m.type()) { + case TranslatorMessage::Finished: + default: + if (m.isPlural() == mv.isPlural()) { + newType = TranslatorMessage::Finished; + } else { + newType = TranslatorMessage::Unfinished; + } + known++; + break; + case TranslatorMessage::Unfinished: + newType = TranslatorMessage::Unfinished; + known++; + break; + case TranslatorMessage::Obsolete: + newType = TranslatorMessage::Unfinished; + neww++; + } } // Always get the filename and linenumber info from the @@ -421,6 +434,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, m.setPlural(mv.isPlural()); m.setUtf8(mv.isUtf8()); m.setExtraComment(mv.extraComment()); + m.setId(mv.id()); } } diff --git a/tools/linguist/shared/translator.cpp b/tools/linguist/shared/translator.cpp index 0a59668..77faabd 100644 --- a/tools/linguist/shared/translator.cpp +++ b/tools/linguist/shared/translator.cpp @@ -306,10 +306,15 @@ int Translator::find(const TranslatorMessage &msg) const { for (int i = 0; i < m_messages.count(); ++i) { const TranslatorMessage &tmsg = m_messages.at(i); - if (msg.context() == tmsg.context() - && msg.sourceText() == tmsg.sourceText() - && msg.comment() == tmsg.comment()) - return i; + if (msg.id().isEmpty() || tmsg.id().isEmpty()) { + if (msg.context() == tmsg.context() + && msg.sourceText() == tmsg.sourceText() + && msg.comment() == tmsg.comment()) + return i; + } else { + if (msg.id() == tmsg.id()) + return i; + } } return -1; } @@ -423,8 +428,34 @@ void Translator::dropUiLines() } } -struct TranslatorMessagePtr { - TranslatorMessagePtr(const TranslatorMessage &tm) +struct TranslatorMessageIdPtr { + explicit TranslatorMessageIdPtr(const TranslatorMessage &tm) + { + ptr = &tm; + } + + inline const TranslatorMessage *operator->() const + { + return ptr; + } + + const TranslatorMessage *ptr; +}; + +Q_DECLARE_TYPEINFO(TranslatorMessageIdPtr, Q_MOVABLE_TYPE); + +inline int qHash(TranslatorMessageIdPtr tmp) +{ + return qHash(tmp->id()); +} + +inline bool operator==(TranslatorMessageIdPtr tmp1, TranslatorMessageIdPtr tmp2) +{ + return tmp1->id() == tmp2->id(); +} + +struct TranslatorMessageContentPtr { + explicit TranslatorMessageContentPtr(const TranslatorMessage &tm) { ptr = &tm; } @@ -437,50 +468,81 @@ struct TranslatorMessagePtr { const TranslatorMessage *ptr; }; -Q_DECLARE_TYPEINFO(TranslatorMessagePtr, Q_MOVABLE_TYPE); +Q_DECLARE_TYPEINFO(TranslatorMessageContentPtr, Q_MOVABLE_TYPE); -inline int qHash(TranslatorMessagePtr tmp) +inline int qHash(TranslatorMessageContentPtr tmp) { - return - qHash(tmp->context()) ^ - qHash(tmp->sourceText()) ^ - qHash(tmp->comment()) ^ - qHash(tmp->id()); + int hash = qHash(tmp->context()) ^ qHash(tmp->sourceText()); + if (!tmp->sourceText().isEmpty()) + // Special treatment for context comments (empty source). + hash ^= qHash(tmp->comment()); + return hash; } -inline bool operator==(TranslatorMessagePtr tmp1, TranslatorMessagePtr tmp2) +inline bool operator==(TranslatorMessageContentPtr tmp1, TranslatorMessageContentPtr tmp2) { + if (tmp1->context() != tmp2->context() || tmp1->sourceText() != tmp2->sourceText()) + return false; // Special treatment for context comments (empty source). - return (tmp1->context() == tmp2->context()) - && tmp1->sourceText() == tmp2->sourceText() - && tmp1->id() == tmp2->id() - && (tmp1->sourceText().isEmpty() || tmp1->comment() == tmp2->comment()); + if (tmp1->sourceText().isEmpty()) + return true; + return tmp1->comment() == tmp2->comment(); } Translator::Duplicates Translator::resolveDuplicates() { Duplicates dups; - QHash refs; + QHash idRefs; + QHash contentRefs; for (int i = 0; i < m_messages.count();) { const TranslatorMessage &msg = m_messages.at(i); - QHash::ConstIterator it = refs.constFind(msg); - if (it != refs.constEnd()) { - TranslatorMessage &omsg = m_messages[*it]; - if (omsg.isUtf8() != msg.isUtf8() && !omsg.isNonUtf8()) { - // Dual-encoded message - omsg.setUtf8(true); - omsg.setNonUtf8(true); - } else { - // Duplicate - dups.byContents.insert(*it); + TranslatorMessage *omsg; + int oi; + QSet *pDup; + if (!msg.id().isEmpty()) { + QHash::ConstIterator it = + idRefs.constFind(TranslatorMessageIdPtr(msg)); + if (it != idRefs.constEnd()) { + oi = *it; + omsg = &m_messages[oi]; + pDup = &dups.byId; + goto gotDupe; + } + } + { + QHash::ConstIterator it = + contentRefs.constFind(TranslatorMessageContentPtr(msg)); + if (it != contentRefs.constEnd()) { + oi = *it; + omsg = &m_messages[oi]; + if (msg.id().isEmpty() || omsg->id().isEmpty()) { + if (!msg.id().isEmpty() && omsg->id().isEmpty()) { + omsg->setId(msg.id()); + idRefs[TranslatorMessageIdPtr(*omsg)] = oi; + } + pDup = &dups.byContents; + goto gotDupe; + } + // This is really a content dupe, but with two distinct IDs. } - if (!omsg.isTranslated() && msg.isTranslated()) - omsg.setTranslations(msg.translations()); - m_messages.removeAt(i); + } + if (!msg.id().isEmpty()) + idRefs[TranslatorMessageIdPtr(msg)] = i; + contentRefs[TranslatorMessageContentPtr(msg)] = i; + ++i; + continue; + gotDupe: + if (omsg->isUtf8() != msg.isUtf8() && !omsg->isNonUtf8()) { + // Dual-encoded message + omsg->setUtf8(true); + omsg->setNonUtf8(true); } else { - refs[msg] = i; - ++i; + // Duplicate + pDup->insert(oi); } + if (!omsg->isTranslated() && msg.isTranslated()) + omsg->setTranslations(msg.translations()); + m_messages.removeAt(i); } return dups; } @@ -488,12 +550,14 @@ Translator::Duplicates Translator::resolveDuplicates() void Translator::reportDuplicates(const Duplicates &dupes, const QString &fileName, bool verbose) { - if (!dupes.byContents.isEmpty()) { + if (!dupes.byId.isEmpty() || !dupes.byContents.isEmpty()) { if (!verbose) { qWarning("Warning: dropping duplicate messages in '%s'\n(try -verbose for more info).", qPrintable(fileName)); } else { qWarning("Warning: dropping duplicate messages in '%s':", qPrintable(fileName)); + foreach (int i, dupes.byId) + qWarning("\n* ID: %s", qPrintable(message(i).id())); foreach (int j, dupes.byContents) { const TranslatorMessage &msg = message(j); qWarning("\n* Context: %s\n* Source: %s", diff --git a/tools/linguist/shared/translator.h b/tools/linguist/shared/translator.h index b957fa2..eec704a 100644 --- a/tools/linguist/shared/translator.h +++ b/tools/linguist/shared/translator.h @@ -134,7 +134,7 @@ public: void dropUiLines(); void makeFileNamesAbsolute(const QDir &originalPath); - struct Duplicates { QSet byContents; }; + struct Duplicates { QSet byId, byContents; }; Duplicates resolveDuplicates(); void reportDuplicates(const Duplicates &dupes, const QString &fileName, bool verbose); -- cgit v0.12 From 0a1db39ba70060f305e5694d1a12dd3c2e5bca4c Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 5 Nov 2009 15:19:02 +0100 Subject: record id-based messages even if they have an empty source this makes sense if one uses lupdate only for validation purposes, i.e. to find out if the code uses only ids which are defined in some external specification. --- .../lupdate/testdata/good/mergecpp/finddialog.cpp | 4 ++++ .../testdata/good/mergecpp/project.ts.before | 4 ++++ .../testdata/good/mergecpp/project.ts.result | 6 +++++ .../lupdate/testdata/good/parsecpp/main.cpp | 5 +++++ .../testdata/good/parsecpp/project.ts.result | 6 +++++ tools/linguist/lupdate/cpp.cpp | 26 +++++++++------------- tools/linguist/lupdate/merge.cpp | 6 ++--- tools/linguist/shared/translator.cpp | 4 ++-- 8 files changed, 41 insertions(+), 20 deletions(-) diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp/finddialog.cpp b/tests/auto/linguist/lupdate/testdata/good/mergecpp/finddialog.cpp index f27e1f0..5bd7a0a 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp/finddialog.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp/finddialog.cpp @@ -75,4 +75,8 @@ void FindDialog::reset() //= new_id tr("this is just some text"); + + + //: A message without source string + qtTrId("qtn_virtual"); } diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.before b/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.before index ad2f65f..379cce4 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.before +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.before @@ -12,6 +12,10 @@ World Welt + + + A message without source string + FindDialog diff --git a/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.result index e9abf89..de43266 100644 --- a/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.result +++ b/tests/auto/linguist/lupdate/testdata/good/mergecpp/project.ts.result @@ -14,6 +14,12 @@ World Welt + + + + A message without source string + + FindDialog diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp index e243e66..386d9b7 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp @@ -247,3 +247,8 @@ class YetAnotherTest : QObject { tr("nothing"); } }; + + + +//: This is a message without a source string +QString test = qtTrId("yet_another_id"); diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result index 26e5a65..6d50c21 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result +++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result @@ -18,6 +18,12 @@ backslashed \ stuff. thing + + + + This is a message without a source string + + Dialog2 diff --git a/tools/linguist/lupdate/cpp.cpp b/tools/linguist/lupdate/cpp.cpp index fb95a95..443abd0 100644 --- a/tools/linguist/lupdate/cpp.cpp +++ b/tools/linguist/lupdate/cpp.cpp @@ -1883,22 +1883,18 @@ void CppParser::parseInternal(ConversionData &cd, QSet &inclusions) case Tok_trid: if (!tor) goto case_default; - if (sourcetext.isEmpty()) { - yyTok = getToken(); - } else { - if (!msgid.isEmpty()) - qWarning("%s:%d: //= cannot be used with qtTrId() / QT_TRID_NOOP(). Ignoring\n", - qPrintable(yyFileName), yyLineNo); - //utf8 = false; // Maybe use //%% or something like that - line = yyLineNo; - yyTok = getToken(); - if (match(Tok_LeftParen) && matchString(&msgid) && !msgid.isEmpty()) { - bool plural = match(Tok_Comma); - recordMessage(line, QString(), sourcetext, QString(), extracomment, - msgid, extra, false, plural); - } - sourcetext.clear(); + if (!msgid.isEmpty()) + qWarning("%s:%d: //= cannot be used with qtTrId() / QT_TRID_NOOP(). Ignoring\n", + qPrintable(yyFileName), yyLineNo); + //utf8 = false; // Maybe use //%% or something like that + line = yyLineNo; + yyTok = getToken(); + if (match(Tok_LeftParen) && matchString(&msgid) && !msgid.isEmpty()) { + bool plural = match(Tok_Comma); + recordMessage(line, QString(), sourcetext, QString(), extracomment, + msgid, extra, false, plural); } + sourcetext.clear(); extracomment.clear(); msgid.clear(); extra.clear(); diff --git a/tools/linguist/lupdate/merge.cpp b/tools/linguist/lupdate/merge.cpp index a721439..fa0dd3d 100644 --- a/tools/linguist/lupdate/merge.cpp +++ b/tools/linguist/lupdate/merge.cpp @@ -341,7 +341,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, foreach (TranslatorMessage m, tor.messages()) { TranslatorMessage::Type newType = TranslatorMessage::Finished; - if (m.sourceText().isEmpty()) { + if (m.sourceText().isEmpty() && m.id().isEmpty()) { // context/file comment TranslatorMessage mv = virginTor.find(m.context()); if (!mv.isNull()) @@ -447,7 +447,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, vernacular translator. */ foreach (const TranslatorMessage &mv, virginTor.messages()) { - if (mv.sourceText().isEmpty()) { + if (mv.sourceText().isEmpty() && mv.id().isEmpty()) { if (tor.contains(mv.context())) continue; } else { @@ -465,7 +465,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, outTor.append(mv); else outTor.appendSorted(mv); - if (!mv.sourceText().isEmpty()) + if (!mv.sourceText().isEmpty() || !mv.id().isEmpty()) ++neww; } diff --git a/tools/linguist/shared/translator.cpp b/tools/linguist/shared/translator.cpp index 77faabd..bc27daf 100644 --- a/tools/linguist/shared/translator.cpp +++ b/tools/linguist/shared/translator.cpp @@ -337,7 +337,7 @@ TranslatorMessage Translator::find(const QString &context, bool Translator::contains(const QString &context) const { foreach (const TranslatorMessage &msg, m_messages) - if (msg.context() == context && msg.sourceText().isEmpty()) + if (msg.context() == context && msg.sourceText().isEmpty() && msg.id().isEmpty()) return true; return false; } @@ -345,7 +345,7 @@ bool Translator::contains(const QString &context) const TranslatorMessage Translator::find(const QString &context) const { foreach (const TranslatorMessage &msg, m_messages) - if (msg.context() == context && msg.sourceText().isEmpty()) + if (msg.context() == context && msg.sourceText().isEmpty() && msg.id().isEmpty()) return msg; return TranslatorMessage(); } -- cgit v0.12 From 0fa5e302d2a4b7b79342f58905812f8ef3bd54b1 Mon Sep 17 00:00:00 2001 From: ck Date: Mon, 9 Nov 2009 11:43:34 +0100 Subject: Assistant: Fix bugs related to setting the current filter remotely. 1. Filter combo box now gets updated on remote setCurrentFilter. 2. Argument to remote setCurrentFilter now gets checked. If there is no such filter, we reject it. --- tools/assistant/tools/assistant/mainwindow.cpp | 21 +++++++++++---------- tools/assistant/tools/assistant/mainwindow.h | 1 + tools/assistant/tools/assistant/remotecontrol.cpp | 2 ++ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/tools/assistant/tools/assistant/mainwindow.cpp b/tools/assistant/tools/assistant/mainwindow.cpp index de3f695..c56e7e4 100644 --- a/tools/assistant/tools/assistant/mainwindow.cpp +++ b/tools/assistant/tools/assistant/mainwindow.cpp @@ -227,16 +227,8 @@ MainWindow::MainWindow(CmdLineParser *cmdLine, QWidget *parent) if (!m_cmdLine->currentFilter().isEmpty()) { const QString &curFilter = m_cmdLine->currentFilter(); - m_helpEngine->setCurrentFilter(curFilter); - if (m_filterCombo) { - int idx = m_filterCombo->findText(curFilter); - if (idx >= 0) { - bool blocked = m_filterCombo->signalsBlocked(); - m_filterCombo->blockSignals(true); - m_filterCombo->setCurrentIndex(idx); - m_filterCombo->blockSignals(blocked); - } - } + if (m_helpEngine->customFilters().contains(curFilter)) + m_helpEngine->setCurrentFilter(curFilter); } if (usesDefaultCollection()) @@ -664,6 +656,8 @@ void MainWindow::setupFilterToolbar() SLOT(setupFilterCombo())); connect(m_filterCombo, SIGNAL(activated(QString)), this, SLOT(filterDocumentation(QString))); + connect(m_helpEngine, SIGNAL(currentFilterChanged(QString)), this, + SLOT(currentFilterChanged(QString))); setupFilterCombo(); } @@ -1041,4 +1035,11 @@ QString MainWindow::defaultHelpCollectionFileName() arg(QLatin1String(QT_VERSION_STR)); } +void MainWindow::currentFilterChanged(const QString &filter) +{ + const int index = m_filterCombo->findText(filter); + Q_ASSERT(index != -1); + m_filterCombo->setCurrentIndex(index); +} + QT_END_NAMESPACE diff --git a/tools/assistant/tools/assistant/mainwindow.h b/tools/assistant/tools/assistant/mainwindow.h index 6b858e9..7559fe4 100644 --- a/tools/assistant/tools/assistant/mainwindow.h +++ b/tools/assistant/tools/assistant/mainwindow.h @@ -95,6 +95,7 @@ public slots: void showSearchWidget(); void syncContents(); void activateCurrentCentralWidgetTab(); + void currentFilterChanged(const QString &filter); private slots: void insertLastPages(); diff --git a/tools/assistant/tools/assistant/remotecontrol.cpp b/tools/assistant/tools/assistant/remotecontrol.cpp index be1c197..474a681 100644 --- a/tools/assistant/tools/assistant/remotecontrol.cpp +++ b/tools/assistant/tools/assistant/remotecontrol.cpp @@ -237,6 +237,8 @@ void RemoteControl::handleCommandString(const QString &cmdString) else m_mainWindow->expandTOC(depth); } else if (cmd == QLatin1String("setcurrentfilter")) { + if (!m_helpEngine->customFilters().contains(arg)) + return; if (m_caching) { clearCache(); m_currentFilter = arg; -- cgit v0.12 From 46a9b3e8e627b63b6d2ffe89311c00b2a1a5434d Mon Sep 17 00:00:00 2001 From: kh1 Date: Fri, 6 Nov 2009 12:15:14 +0100 Subject: Fix some warnings. Reviewed-by: ck --- tools/assistant/tools/assistant/helpviewer.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/assistant/tools/assistant/helpviewer.cpp b/tools/assistant/tools/assistant/helpviewer.cpp index c888a5f..3547652 100644 --- a/tools/assistant/tools/assistant/helpviewer.cpp +++ b/tools/assistant/tools/assistant/helpviewer.cpp @@ -133,10 +133,9 @@ HelpNetworkAccessManager::HelpNetworkAccessManager(QHelpEngine *engine, { } -QNetworkReply *HelpNetworkAccessManager::createRequest(Operation op, - const QNetworkRequest &request, QIODevice *outgoingData) +QNetworkReply *HelpNetworkAccessManager::createRequest(Operation /*op*/, + const QNetworkRequest &request, QIODevice* /*outgoingData*/) { - const QString& scheme = request.url().scheme(); const QUrl& url = request.url(); QString mimeType = url.toString(); if (mimeType.endsWith(QLatin1String(".svg")) -- cgit v0.12 From b183a1d916b42e174da1d4ee71d387b6b8c48f72 Mon Sep 17 00:00:00 2001 From: kh1 Date: Mon, 9 Nov 2009 11:50:10 +0100 Subject: Fix Assistant losing font settings across invocations. Task-number: QTBUG-5333 Reviewed-by: ck --- tools/assistant/tools/assistant/centralwidget.cpp | 120 +++++++++++----------- tools/assistant/tools/assistant/centralwidget.h | 9 +- 2 files changed, 67 insertions(+), 62 deletions(-) diff --git a/tools/assistant/tools/assistant/centralwidget.cpp b/tools/assistant/tools/assistant/centralwidget.cpp index 62b4736..67d803d 100644 --- a/tools/assistant/tools/assistant/centralwidget.cpp +++ b/tools/assistant/tools/assistant/centralwidget.cpp @@ -666,34 +666,16 @@ void CentralWidget::setSourceInNewTab(const QUrl &url, qreal zoom) tabWidget->setCurrentIndex(tabWidget->addTab(viewer, quoteTabTitle(viewer->documentTitle()))); - QFont font = qApp->font(); - bool userFont = helpEngine->customValue(QLatin1String("useBrowserFont")).toBool(); - if (userFont) { - font = qVariantValue(helpEngine->customValue( - QLatin1String("browserFont"))); - } - -#if !defined(QT_NO_WEBKIT) - QWebSettings *settings = QWebSettings::globalSettings(); - if (!userFont) { - int fontSize = settings->fontSize(QWebSettings::DefaultFontSize); - QString fontFamily = settings->fontFamily(QWebSettings::StandardFont); - font = QFont(fontFamily, fontSize); - } + QFont font; + getBrowserFontFor(viewer, &font); - QWebView *view = qobject_cast (viewer); - if (view) { - settings = view->settings(); - settings->setFontFamily(QWebSettings::StandardFont, font.family()); - settings->setFontSize(QWebSettings::DefaultFontSize, font.pointSize()); - } else if (viewer) { - viewer->setFont(font); - } - viewer->setTextSizeMultiplier(zoom == 0.0 ? 1.0 : zoom); -#else +#if defined(QT_NO_WEBKIT) font.setPointSize((int)(font.pointSize() + zoom)); - viewer->setFont(font); + setBrowserFontFor(viewer, font); viewer->setZoom((int)zoom); +#else + setBrowserFontFor(viewer, font); + viewer->setTextSizeMultiplier(zoom == 0.0 ? 1.0 : zoom); #endif connectSignals(); @@ -1011,41 +993,17 @@ bool CentralWidget::findInTextBrowser(QTextBrowser* browser, const QString &ttf, void CentralWidget::updateBrowserFont() { - QFont font = qApp->font(); - bool userFont = helpEngine->customValue(QLatin1String("useBrowserFont")).toBool(); - if (userFont) { - font = qVariantValue(helpEngine->customValue( - QLatin1String("browserFont"))); - } - -#if !defined(QT_NO_WEBKIT) - QWebSettings *settings = QWebSettings::globalSettings(); - if (!userFont) { - int fontSize = settings->fontSize(QWebSettings::DefaultFontSize); - QString fontFamily = settings->fontFamily(QWebSettings::StandardFont); - font = QFont(fontFamily, fontSize); + QFont font; + bool searchAttached = searchWidgetAttached(); + if (searchAttached) { + getBrowserFontFor(m_searchWidget, &font); + setBrowserFontFor(m_searchWidget, font); } -#endif - QWidget *widget = 0; - for (int i = 0; i < tabWidget->count(); ++i) { - widget = tabWidget->widget(i); -#if !defined(QT_NO_WEBKIT) - QWebView *view = qobject_cast (widget); - if (view) { - settings = view->settings(); - settings->setFontFamily(QWebSettings::StandardFont, font.family()); - settings->setFontSize(QWebSettings::DefaultFontSize, font.pointSize()); - } else if (widget) { - if (!userFont) - font = qApp->font(); - widget->setFont(font); - } -#else - if (widget && widget->font() != font) - widget->setFont(font); -#endif - } + int i = searchAttached ? 1 : 0; + getBrowserFontFor(tabWidget->widget(i), &font); + for (i; i < tabWidget->count(); ++i) + setBrowserFontFor(tabWidget->widget(i), font); } void CentralWidget::createSearchWidget(QHelpSearchEngine *searchEngine) @@ -1058,6 +1016,10 @@ void CentralWidget::createSearchWidget(QHelpSearchEngine *searchEngine) SLOT(setSourceFromSearch(QUrl))); connect(m_searchWidget, SIGNAL(requestShowLinkInNewTab(QUrl)), this, SLOT(setSourceFromSearchInNewTab(QUrl))); + + QFont font; + getBrowserFontFor(m_searchWidget, &font); + setBrowserFontFor(m_searchWidget, font); } void CentralWidget::activateSearchWidget(bool updateLastTabPage) @@ -1079,7 +1041,7 @@ void CentralWidget::activateSearchWidget(bool updateLastTabPage) void CentralWidget::removeSearchWidget() { - if (m_searchWidget && m_searchWidget->isAttached()) { + if (searchWidgetAttached()) { tabWidget->removeTab(0); m_searchWidget->setAttached(false); } @@ -1088,7 +1050,7 @@ void CentralWidget::removeSearchWidget() int CentralWidget::availableHelpViewer() const { int count = tabWidget->count(); - if (m_searchWidget && m_searchWidget->isAttached()) + if (searchWidgetAttached()) count--; return count; } @@ -1096,7 +1058,7 @@ int CentralWidget::availableHelpViewer() const bool CentralWidget::enableTabCloseAction() const { int minTabCount = 1; - if (m_searchWidget && m_searchWidget->isAttached()) + if (searchWidgetAttached()) minTabCount = 2; return (tabWidget->count() > minTabCount); @@ -1199,4 +1161,40 @@ QMap CentralWidget::currentSourceFileList() const return sourceList; } +void CentralWidget::getBrowserFontFor(QWidget *viewer, QFont *font) +{ + const QLatin1String key("useBrowserFont"); + if (!helpEngine->customValue(key, false).toBool()) { + *font = qApp->font(); // case for QTextBrowser and SearchWidget +#if !defined(QT_NO_WEBKIT) + QWebView *view = qobject_cast (viewer); + if (view) { + QWebSettings *settings = QWebSettings::globalSettings(); + *font = QFont(settings->fontFamily(QWebSettings::StandardFont), + settings->fontSize(QWebSettings::DefaultFontSize)); + } +#endif + } else { + *font = qVariantValue(helpEngine->customValue( + QLatin1String("browserFont"))); + } +} + +void CentralWidget::setBrowserFontFor(QWidget *widget, const QFont &font) +{ +#if !defined(QT_NO_WEBKIT) + QWebView *view = qobject_cast (widget); + if (view) { + QWebSettings *settings = view->settings(); + settings->setFontFamily(QWebSettings::StandardFont, font.family()); + settings->setFontSize(QWebSettings::DefaultFontSize, font.pointSize()); + } else if (widget && widget->font() != font) { + widget->setFont(font); + } +#else + if (widget && widget->font() != font) + widget->setFont(font); +#endif +} + QT_END_NAMESPACE diff --git a/tools/assistant/tools/assistant/centralwidget.h b/tools/assistant/tools/assistant/centralwidget.h index 7ae8ee5..8c186f0 100644 --- a/tools/assistant/tools/assistant/centralwidget.h +++ b/tools/assistant/tools/assistant/centralwidget.h @@ -48,6 +48,8 @@ #include +#include "searchwidget.h" + QT_BEGIN_NAMESPACE class QEvent; @@ -65,7 +67,6 @@ class CentralWidget; class PrintHelper; class MainWindow; -class SearchWidget; class QHelpSearchEngine; class FindWidget : public QWidget @@ -123,6 +124,9 @@ public: HelpViewer *currentHelpViewer() const; void activateTab(bool onlyHelpViewer = false); + bool searchWidgetAttached() const { + return m_searchWidget && m_searchWidget->isAttached(); + } void createSearchWidget(QHelpSearchEngine *searchEngine); void activateSearchWidget(bool updateLastTabPage = false); void removeSearchWidget(); @@ -190,6 +194,9 @@ private: void highlightSearchTerms(); void setLastShownPages(); + void getBrowserFontFor(QWidget* viewer, QFont *font); + void setBrowserFontFor(QWidget *widget, const QFont &font); + private: int lastTabPage; QString collectionFile; -- cgit v0.12 From 10e3bb5c7b88c26cc96d08f887a4457643276d89 Mon Sep 17 00:00:00 2001 From: ck Date: Mon, 9 Nov 2009 16:21:40 +0100 Subject: Assistant: Add missing initialization of member variable. Reviewed-by: kh1 --- tools/assistant/tools/assistant/bookmarkmanager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/assistant/tools/assistant/bookmarkmanager.cpp b/tools/assistant/tools/assistant/bookmarkmanager.cpp index 9cccd82..511a56e 100644 --- a/tools/assistant/tools/assistant/bookmarkmanager.cpp +++ b/tools/assistant/tools/assistant/bookmarkmanager.cpp @@ -621,6 +621,7 @@ Qt::ItemFlags BookmarkModel::flags(const QModelIndex &index) const BookmarkManager::BookmarkManager(QHelpEngineCore *_helpEngine) : treeModel(new BookmarkModel(0, 1, this)) , listModel(new BookmarkModel(0, 1, this)) + , renameItem(0) , helpEngine(_helpEngine) { folderIcon = QApplication::style()->standardIcon(QStyle::SP_DirClosedIcon); -- cgit v0.12 From af0c43f19218996bab844da4dd6f298d405ebcee Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 9 Nov 2009 16:51:05 +0100 Subject: Code in gui/* should be completely namespaced And not rely on random QT_USE_NAMESPACE being pulled in from *.moc files. --- src/gui/kernel/qwidget.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index 271b939..2d2aa2e 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -11781,10 +11781,6 @@ void QWidget::ungrabGesture(Qt::GestureType gesture) } -QT_END_NAMESPACE - -#include "moc_qwidget.cpp" - /*! \typedef WId \relates QWidget @@ -12101,3 +12097,8 @@ void QWidgetPrivate::_q_delayedDestroy(WId winId) delete winId; } #endif + +QT_END_NAMESPACE + +#include "moc_qwidget.cpp" + -- cgit v0.12 From 19f8781c17019048693ec32833af49ce00be4c72 Mon Sep 17 00:00:00 2001 From: Harald Fernengel Date: Mon, 9 Nov 2009 17:52:57 +0100 Subject: Move QCustomScopedPointer to a private header MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The API is internal, so it should live in its private header. The class was introduced during the lifetime of 4.6 (not in 4.5), so the move is binary compatible. Task-number: QTBUG-5617 Reviewed-by: João Abecasis --- src/corelib/io/qsettings_p.h | 1 + src/corelib/tools/qscopedpointer.h | 84 ------------ src/corelib/tools/qscopedpointer_p.h | 151 +++++++++++++++++++++ src/corelib/tools/tools.pri | 3 +- .../qscriptdebuggerconsolecommandgroupdata_p.h | 2 +- src/scripttools/debugging/qscriptdebuggervalue_p.h | 2 +- .../debugging/qscriptdebuggervalueproperty_p.h | 2 +- src/scripttools/debugging/qscriptscriptdata_p.h | 2 +- src/scripttools/debugging/qscriptvalueproperty_p.h | 2 +- 9 files changed, 159 insertions(+), 90 deletions(-) create mode 100644 src/corelib/tools/qscopedpointer_p.h diff --git a/src/corelib/io/qsettings_p.h b/src/corelib/io/qsettings_p.h index bcd8744..5ad72e4 100644 --- a/src/corelib/io/qsettings_p.h +++ b/src/corelib/io/qsettings_p.h @@ -62,6 +62,7 @@ #ifndef QT_NO_QOBJECT #include "private/qobject_p.h" #endif +#include "private/qscopedpointer_p.h" #ifdef Q_OS_WIN #include "QtCore/qt_windows.h" diff --git a/src/corelib/tools/qscopedpointer.h b/src/corelib/tools/qscopedpointer.h index 7cbdb6c..2dedcc5 100644 --- a/src/corelib/tools/qscopedpointer.h +++ b/src/corelib/tools/qscopedpointer.h @@ -217,90 +217,6 @@ private: Q_DISABLE_COPY(QScopedArrayPointer) }; -/* Internal helper class - exposes the data through data_ptr (legacy from QShared). - Required for some internal Qt classes, do not use otherwise. */ -template > -class QCustomScopedPointer : public QScopedPointer -{ -public: - explicit inline QCustomScopedPointer(T *p = 0) - : QScopedPointer(p) - { - } - - inline T *&data_ptr() - { - return this->d; - } - - inline bool operator==(const QCustomScopedPointer &other) const - { - return this->d == other.d; - } - - inline bool operator!=(const QCustomScopedPointer &other) const - { - return this->d != other.d; - } - -private: - Q_DISABLE_COPY(QCustomScopedPointer) -}; - -/* Internal helper class - a handler for QShared* classes, to be used in QCustomScopedPointer */ -template -class QScopedPointerSharedDeleter -{ -public: - static inline void cleanup(T *d) - { - if (d && !d->ref.deref()) - delete d; - } -}; - -/* Internal. - This class is basically a scoped pointer pointing to a ref-counted object - */ -template -class QScopedSharedPointer : public QCustomScopedPointer > -{ -public: - explicit inline QScopedSharedPointer(T *p = 0) - : QCustomScopedPointer >(p) - { - } - - inline void detach() - { - qAtomicDetach(this->d); - } - - inline void assign(T *other) - { - if (this->d == other) - return; - if (other) - other->ref.ref(); - T *oldD = this->d; - this->d = other; - QScopedPointerSharedDeleter::cleanup(oldD); - } - - inline bool operator==(const QScopedSharedPointer &other) const - { - return this->d == other.d; - } - - inline bool operator!=(const QScopedSharedPointer &other) const - { - return this->d != other.d; - } - -private: - Q_DISABLE_COPY(QScopedSharedPointer) -}; - QT_END_NAMESPACE QT_END_HEADER diff --git a/src/corelib/tools/qscopedpointer_p.h b/src/corelib/tools/qscopedpointer_p.h new file mode 100644 index 0000000..fb627a4 --- /dev/null +++ b/src/corelib/tools/qscopedpointer_p.h @@ -0,0 +1,151 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module 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$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of internal files. This header file may change from version to version +// without notice, or even be removed. +// +// We mean it. +// + +#ifndef QSCOPEDPOINTER_P_H +#define QSCOPEDPOINTER_P_H + +#include "QtCore/qscopedpointer.h" + +QT_BEGIN_HEADER +QT_BEGIN_NAMESPACE +QT_MODULE(Core) + + +/* Internal helper class - exposes the data through data_ptr (legacy from QShared). + Required for some internal Qt classes, do not use otherwise. */ +template > +class QCustomScopedPointer : public QScopedPointer +{ +public: + explicit inline QCustomScopedPointer(T *p = 0) + : QScopedPointer(p) + { + } + + inline T *&data_ptr() + { + return this->d; + } + + inline bool operator==(const QCustomScopedPointer &other) const + { + return this->d == other.d; + } + + inline bool operator!=(const QCustomScopedPointer &other) const + { + return this->d != other.d; + } + +private: + Q_DISABLE_COPY(QCustomScopedPointer) +}; + +/* Internal helper class - a handler for QShared* classes, to be used in QCustomScopedPointer */ +template +class QScopedPointerSharedDeleter +{ +public: + static inline void cleanup(T *d) + { + if (d && !d->ref.deref()) + delete d; + } +}; + +/* Internal. + This class is basically a scoped pointer pointing to a ref-counted object + */ +template +class QScopedSharedPointer : public QCustomScopedPointer > +{ +public: + explicit inline QScopedSharedPointer(T *p = 0) + : QCustomScopedPointer >(p) + { + } + + inline void detach() + { + qAtomicDetach(this->d); + } + + inline void assign(T *other) + { + if (this->d == other) + return; + if (other) + other->ref.ref(); + T *oldD = this->d; + this->d = other; + QScopedPointerSharedDeleter::cleanup(oldD); + } + + inline bool operator==(const QScopedSharedPointer &other) const + { + return this->d == other.d; + } + + inline bool operator!=(const QScopedSharedPointer &other) const + { + return this->d != other.d; + } + +private: + Q_DISABLE_COPY(QScopedSharedPointer) +}; + + +QT_END_NAMESPACE +QT_END_HEADER + +#endif diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri index 007b763..3406e41 100644 --- a/src/corelib/tools/tools.pri +++ b/src/corelib/tools/tools.pri @@ -44,7 +44,8 @@ HEADERS += \ tools/qunicodetables_p.h \ tools/qvarlengtharray.h \ tools/qvector.h \ - tools/qscopedpointer.h + tools/qscopedpointer.h \ + tools/qscopedpointer_p.h SOURCES += \ diff --git a/src/scripttools/debugging/qscriptdebuggerconsolecommandgroupdata_p.h b/src/scripttools/debugging/qscriptdebuggerconsolecommandgroupdata_p.h index 4a9447a..2513a8c 100644 --- a/src/scripttools/debugging/qscriptdebuggerconsolecommandgroupdata_p.h +++ b/src/scripttools/debugging/qscriptdebuggerconsolecommandgroupdata_p.h @@ -54,7 +54,7 @@ // #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/scripttools/debugging/qscriptdebuggervalue_p.h b/src/scripttools/debugging/qscriptdebuggervalue_p.h index 2f1da1e..452f7ea 100644 --- a/src/scripttools/debugging/qscriptdebuggervalue_p.h +++ b/src/scripttools/debugging/qscriptdebuggervalue_p.h @@ -54,7 +54,7 @@ // #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/scripttools/debugging/qscriptdebuggervalueproperty_p.h b/src/scripttools/debugging/qscriptdebuggervalueproperty_p.h index 2ec6124..b130307 100644 --- a/src/scripttools/debugging/qscriptdebuggervalueproperty_p.h +++ b/src/scripttools/debugging/qscriptdebuggervalueproperty_p.h @@ -55,7 +55,7 @@ #include #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/scripttools/debugging/qscriptscriptdata_p.h b/src/scripttools/debugging/qscriptscriptdata_p.h index 5006c19..f42ffa5 100644 --- a/src/scripttools/debugging/qscriptscriptdata_p.h +++ b/src/scripttools/debugging/qscriptscriptdata_p.h @@ -54,7 +54,7 @@ // #include -#include +#include #include #include diff --git a/src/scripttools/debugging/qscriptvalueproperty_p.h b/src/scripttools/debugging/qscriptvalueproperty_p.h index 61b239d..ca290a1 100644 --- a/src/scripttools/debugging/qscriptvalueproperty_p.h +++ b/src/scripttools/debugging/qscriptvalueproperty_p.h @@ -55,7 +55,7 @@ #include #include -#include +#include #include QT_BEGIN_NAMESPACE -- cgit v0.12 From 86048e1a09fce11f557d0e8b117229a754ee9098 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 10 Nov 2009 13:00:22 +0100 Subject: Designer: Use toolbar in Signal/Slot editor as in the other tool windows. Reviewed-by: Jarek Kobus Task-number: QTCREATORBUG-239 --- .../signalsloteditor/signalsloteditorwindow.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp b/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp index 7ab7cb4..e36e828 100644 --- a/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp +++ b/tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp @@ -73,6 +73,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE @@ -724,20 +725,20 @@ SignalSlotEditorWindow::SignalSlotEditorWindow(QDesignerFormEditorInterface *cor QVBoxLayout *layout = new QVBoxLayout(this); layout->setMargin(0); - layout->addWidget(m_view); + layout->setSpacing(0); - QHBoxLayout *layout2 = new QHBoxLayout; - layout2->setMargin(3); - layout->addLayout(layout2); - layout2->addStretch(); + QToolBar *toolBar = new QToolBar; + toolBar->setIconSize(QSize(22, 22)); + m_add_button->setIcon(createIconSet(QLatin1String("plus.png"))); + connect(m_add_button, SIGNAL(clicked()), this, SLOT(addConnection())); + toolBar->addWidget(m_add_button); m_remove_button->setIcon(createIconSet(QLatin1String("minus.png"))); connect(m_remove_button, SIGNAL(clicked()), this, SLOT(removeConnection())); - layout2->addWidget(m_remove_button); + toolBar->addWidget(m_remove_button); - m_add_button->setIcon(createIconSet(QLatin1String("plus.png"))); - connect(m_add_button, SIGNAL(clicked()), this, SLOT(addConnection())); - layout2->addWidget(m_add_button); + layout->addWidget(toolBar); + layout->addWidget(m_view); connect(core->formWindowManager(), SIGNAL(activeFormWindowChanged(QDesignerFormWindowInterface*)), -- cgit v0.12 From 0e98dcbdd3b3324745aa84e073dcc3a269b3dde4 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Tue, 10 Nov 2009 13:22:45 +0100 Subject: Doc: fix typo in link --- doc/src/platforms/supported-platforms.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/platforms/supported-platforms.qdoc b/doc/src/platforms/supported-platforms.qdoc index 302ecb4..232eca6 100644 --- a/doc/src/platforms/supported-platforms.qdoc +++ b/doc/src/platforms/supported-platforms.qdoc @@ -86,7 +86,7 @@ \row \o Apple Mac OS X 10.5 "Leopard" x86_64 (Carbon, Cocoa 32 and 64bit) \o As provided by Apple \row \o Embedded Linux QWS (ARM) - \o gcc (\l{http:\\www.codesourcery.com}{Codesourcery version)} + \o gcc (\l{http://www.codesourcery.com}{Codesourcery version)} \row \o Windows CE 5.0 (ARMv4i, x86, MIPS) \o MSVC 2005 WinCE 5.0 Standard (x86, pocket, smart, mipsii) \row \o Symbian (S60 3.1, 3.2 and 5.0) -- cgit v0.12 From 945e079e60506e88435802d0a764c8b4121ad16f Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Tue, 10 Nov 2009 12:47:44 +0100 Subject: BT: JavaScriptCore makes applications crash on leopard JavaScriptCore checks the Mac OS version when building, and uses symbols only defined in i e.g.snow leopard when building on snow leopard. This means that if you build Qt on snow leopard and later move it to leopard, applications will crash looking for a missing symbol (pthread_setname_np in particular). In Qt, we garuantee that you can run your applications on 10.4 and up for Carbon, and 10.5 and up for Cocoa. So using compile time checks this way is not a proper soulution. Result: In Qt, never use symbols not defined on all supported OS versions, or at least implement run-time checks. Rev-By: Simon Hausmann Rev-By: Tor Arne Rev-By: MortenS --- src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h | 2 +- src/3rdparty/webkit/JavaScriptCore/wtf/Platform.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h index fa7a006..2a407d4 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h +++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/Platform.h @@ -565,7 +565,7 @@ #define HAVE_SYS_TIME_H 1 #define HAVE_SYS_TIMEB_H 1 -#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !PLATFORM(IPHONE) +#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !PLATFORM(IPHONE) && !PLATFORM(QT) #define HAVE_MADV_FREE_REUSE 1 #define HAVE_MADV_FREE 1 #define HAVE_PTHREAD_SETNAME_NP 1 diff --git a/src/3rdparty/webkit/JavaScriptCore/wtf/Platform.h b/src/3rdparty/webkit/JavaScriptCore/wtf/Platform.h index ddc287f..7bfde5b 100644 --- a/src/3rdparty/webkit/JavaScriptCore/wtf/Platform.h +++ b/src/3rdparty/webkit/JavaScriptCore/wtf/Platform.h @@ -560,7 +560,7 @@ #define HAVE_SYS_TIME_H 1 #define HAVE_SYS_TIMEB_H 1 -#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !PLATFORM(IPHONE) +#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !PLATFORM(IPHONE) && !PLATFORM(QT) #define HAVE_MADV_FREE_REUSE 1 #define HAVE_MADV_FREE 1 #define HAVE_PTHREAD_SETNAME_NP 1 -- cgit v0.12 From 578a65013ac3b4203f2fa2d0bb50dd9119f613de Mon Sep 17 00:00:00 2001 From: Leonardo Sobral Cunha Date: Tue, 10 Nov 2009 13:35:21 +0100 Subject: Add my changes to the 4.6.0 changelog --- dist/changes-4.6.0 | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/dist/changes-4.6.0 b/dist/changes-4.6.0 index e6f8f68..70dcdf3 100644 --- a/dist/changes-4.6.0 +++ b/dist/changes-4.6.0 @@ -230,6 +230,9 @@ QtGui * Interactive resizing of top level windows now respects height-for-width constraints. * Reduced memory footprint. + - QAbstractItemView + * [256502] Fixes selectionModel::hasSelection return value after model::reset + - QHeaderView * [208320] Make sure the sort indicator s taken into account for the size hint * [255574] Make sure the sizehint for the section depend on visible sections @@ -276,6 +279,9 @@ QtGui to be slightly clipped. * [241383] Added ability to style the close tab button with style sheet + - QImageReader + * [255627] Fix floating point exception in QImageReader::setScaledSize(QSize(0, 0)) + - QComboBox * [220195] Fixed keyboard search when current index is -1 @@ -928,10 +934,11 @@ Qt for Windows CE * currentLoopTime() returns the time inside the current loop * stateChanged signal sends the new state as first parameter and old state as the second - * QAnimationGroup::clearAnimations() has been renames to clear() - * QAnimationGroup::insertAnimationAt() has been renames to insertAnimation() - * QAnimationGroup::takeAnimationAt() has been renames to takeAnimation() - * QSequentialAnimationGroup::insertPauseAt() has been renames to insertPause() + * QAnimationGroup::clearAnimations() has been renamed to clear() + * QAnimationGroup::insertAnimationAt() has been renamed to insertAnimation() + * QAnimationGroup::takeAnimationAt() has been renamed to takeAnimation() + * QSequentialAnimationGroup::insertPauseAt() has been renamed to insertPause() + * [QT-941] Avoids timer ticks when there are only pause animations running - Refactoring in OpenGL examples to improve portability and utilize the Animation framework for animation. The hellogl and overpainting examples -- cgit v0.12 From dc551cdc3422631baab50860c1a46711e3079f18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= Date: Tue, 10 Nov 2009 13:04:54 +0100 Subject: Some 4.6.0 changes. --- dist/changes-4.6.0 | 58 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/dist/changes-4.6.0 b/dist/changes-4.6.0 index 70dcdf3..7666f69 100644 --- a/dist/changes-4.6.0 +++ b/dist/changes-4.6.0 @@ -350,23 +350,23 @@ QtGui * [QTBUG-739] Removed internal widgets from QApplication::topLevelWidgets(). - QPlainTextEdit - * Fixed crash when clicking on a text edit which was smaller than the + * Fixed crash when clicking on a text edit which was smaller than the height of the font used. - - - QPrinter - * [QTBUG-4497] Removed redundant SetPen command in the postscript code + + - QPrinter + * [QTBUG-4497] Removed redundant SetPen command in the postscript code when reusing a QPrinter object. - QTextLayout * [QTBUG-4468] Count tabs as multiple characters when applying a fixed column width. - * [176401] Take into account the negative right bearing of the last + * [176401] Take into account the negative right bearing of the last character in an item of text if the glyph extends beyond its ascent. - + - QTextDocument - * [207189] Support setting font size using short hand syntax in the + * [207189] Support setting font size using short hand syntax in the CSS "font" property. - * [201228] Remove implicit margin on bullet lists when exporting to + * [201228] Remove implicit margin on bullet lists when exporting to HTML. * [240086] Fixed bug which caused floating objects which span several pages to float into the second page of the document even when it's @@ -375,13 +375,13 @@ QtGui * [240325] Even when wrap mode is set to Qt::TextWordWrap, the layout would sometimes break outside word boundaries when floating objects affected the width available to the text. This has been fixed. - - - QFontEngine - * [QTBUG-2354] Support certain 'Microsoft' platform symbol fonts which + + - QFontEngine + * [QTBUG-2354] Support certain 'Microsoft' platform symbol fonts which also contain a regular unicode table for exactly the symbol range of code points. - - - QFontMetrics + + - QFontMetrics * [176401] Account for right bearing in bounding rect. - QPlastiqueStyle @@ -400,6 +400,9 @@ QtDBus * New class; supports efficiently watching for a service to be created, deleted or change owners + - QPrintPreviewDialog now uses a QMainWindow with a proper QToolBar, instead + of a plain layout. + QtNetwork - QAbstractSocket @@ -472,6 +475,9 @@ QtOpenGL instered into the fragment "pipeline". * Fixed conical gradients. + - Added a static function, QGL::setPreferredPaintEngine(), to allow users + to set the preferred GL paint engine. + - Cleaned up usage of OpenGL extensions. QtOpenGL now uses the OpenGL 2.0 names of methods rather than using the EXT postfix. However, when resolving extensions, QtOpenGL will also try postfixing EXT if the OpenGL 2.0 name is @@ -516,7 +522,7 @@ QtSvg * [202426] Made attribute inheritance work with 'use' tags. * [250618] Fixed gradient on strokes. * [254040] Added support for 'vector-effect'. - + - QSvgPaintEngine * [257052] Changed drawImage() to ignore aspect ratio. @@ -576,19 +582,19 @@ Qt for Linux/X11 when using Synergy. - [MR#797] Fixed a crash when using QX11EmbedContainer/Widget on x86_64. - [MR#1111] Emit workAreaResized when _NET_WORKAREA is changed on X11. - - - [QTBUG-3620] Fixed bug on X11 that caused bitmap fonts to become so small - it was unreadable when printed or presented in a print preview widget. + + - [QTBUG-3620] Fixed bug on X11 that caused bitmap fonts to become so small + it was unreadable when printed or presented in a print preview widget. - Improved EGL integration on X11 (including better visual selection). - - Support Qt::WA_TranslucentBackground on top-level QGLWidgets on X11, both + - Support Qt::WA_TranslucentBackground on top-level QGLWidgets on X11, both (EGL & glX). This allows OpenGL (& ES) rendering to semi-transparent widgets if a compositing window manager is running. - Support OpenGL texture_from_pixmap extension on X11 (EGL & glX) when calling QPainter::drawPixmap() with the OpenGL paint engine, or calling - QGLContext::bindTexture() on an X11 QPixmap. If the + QGLContext::bindTexture() on an X11 QPixmap. If the GLX_EXT_texture_from_pixmap or EGL_NOKIA_texture_from_pixmap extensions are present, Qt will attempt to use glXBindTexImageEXT or eglBindTexImage to bind the pixmap to a texture, rather than copying the pixel data. @@ -651,12 +657,15 @@ Qt for Windows rendering. * Fixed a flicker issue when switching source with a transition time of 0 - - [QTBUG-4445] Fixed bug on Windows that caused problems when printing - text where several characters were represented by a single glyph, e.g. + - [QTBUG-4445] Fixed bug on Windows that caused problems when printing + text where several characters were represented by a single glyph, e.g. a double 't' with the Calibri font. - + - Added QSysInfo::WV_WINDOWS7 and QSysInfo::WV_6_1 + - Changed QPrintDialog under Windows to use PrintDlgEx, instead of the old + deprecated PrintDlg call. + Qt for Mac OS X --------------- @@ -667,6 +676,8 @@ Qt for Mac OS X - [258438] Enabled Emacs style keyboard shortcuts. - [258173] Fixed an issue which caused "whatsthis" pointer to flicked on Cocoa. - [QTBUG-4418] Fixed maximizing and restoring a window on Mac. + - Fixed some warnings that might get printed when reparenting QGLWidget on Cocoa. + General changes on Mac OS X: - Mac OS X version support: Support for 10.3(Panther) has been dropped, support for @@ -753,7 +764,8 @@ Qt for Windows CE - [257352] When configuring Qt for Windows CE, configure points the user to setcepaths, when its done. - [259850] Added a makespec template for Windows CE 6. - + - Fixed the hardcoded GL library names for Windows CE. + **************************************************************************** * Tools * **************************************************************************** -- cgit v0.12 From 637d6b26d778189a767e28b80aa316cf327e67a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Tue, 10 Nov 2009 13:35:42 +0100 Subject: Improvements to graphics effects API after review round. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Get rid of QGraphicsEffectSource from the public API, instead add convenience functions in QGraphicsEffect. This way we commit to less API, and are free to introduce a customizable QGraphicsEffectSource in a future release. * Move PixmapPadMode into QGraphicsEffect and tweak the names of the enum values. * Make QGraphicsBlurEffect::BlurHint into a bit flag, for extensibility. Reviewed-by: Bjørn Erik Nilsen --- .../code/src_gui_effects_qgraphicseffect.cpp | 12 +- examples/effects/blurpicker/blureffect.cpp | 4 +- examples/effects/blurpicker/blureffect.h | 2 +- examples/effects/customshader/blureffect.cpp | 4 +- examples/effects/customshader/blureffect.h | 2 +- src/gui/effects/qgraphicseffect.cpp | 233 +++++++++++++-------- src/gui/effects/qgraphicseffect.h | 90 ++++---- src/gui/effects/qgraphicseffect_p.h | 41 +++- src/gui/graphicsview/qgraphicsitem.cpp | 6 +- src/gui/graphicsview/qgraphicsitem_p.h | 2 +- src/gui/graphicsview/qgraphicsscene.cpp | 2 +- src/gui/image/qpixmapfilter.cpp | 22 +- src/gui/image/qpixmapfilter_p.h | 4 +- src/gui/kernel/qwidget.cpp | 10 +- src/gui/kernel/qwidget_p.h | 2 +- src/opengl/qglpixmapfilter.cpp | 46 ++-- src/opengl/qgraphicsshadereffect.cpp | 10 +- src/opengl/qgraphicsshadereffect_p.h | 2 +- tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp | 9 +- 19 files changed, 286 insertions(+), 217 deletions(-) diff --git a/doc/src/snippets/code/src_gui_effects_qgraphicseffect.cpp b/doc/src/snippets/code/src_gui_effects_qgraphicseffect.cpp index 35689f4..5ef6609 100644 --- a/doc/src/snippets/code/src_gui_effects_qgraphicseffect.cpp +++ b/doc/src/snippets/code/src_gui_effects_qgraphicseffect.cpp @@ -40,11 +40,11 @@ ****************************************************************************/ //! [0] -MyGraphicsOpacityEffect::draw(QPainter *painter, QGraphicsEffectSource *source) +MyGraphicsOpacityEffect::draw(QPainter *painter) { // Fully opaque; draw directly without going through a pixmap. if (qFuzzyCompare(m_opacity, 1)) { - source->draw(painter); + drawSource(painter); return; } ... @@ -52,18 +52,18 @@ MyGraphicsOpacityEffect::draw(QPainter *painter, QGraphicsEffectSource *source) //! [0] //! [1] -MyGraphicsEffect::draw(QPainter *painter, QGraphicsEffectSource *source) +MyGraphicsEffect::draw(QPainter *painter) { ... QPoint offset; - if (source->isPixmap()) { + if (sourceIsPixmap()) { // No point in drawing in device coordinates (pixmap will be scaled anyways). - const QPixmap pixmap = source->pixmap(Qt::LogicalCoordinates, &offset); + const QPixmap pixmap = sourcePixmap(Qt::LogicalCoordinates, &offset); ... painter->drawPixmap(offset, pixmap); } else { // Draw pixmap in device coordinates to avoid pixmap scaling; - const QPixmap pixmap = source->pixmap(Qt::DeviceCoordinates, &offset); + const QPixmap pixmap = sourcePixmap(Qt::DeviceCoordinates, &offset); painter->setWorldTransform(QTransform()); ... painter->drawPixmap(offset, pixmap); diff --git a/examples/effects/blurpicker/blureffect.cpp b/examples/effects/blurpicker/blureffect.cpp index 9046cbd..956637d 100644 --- a/examples/effects/blurpicker/blureffect.cpp +++ b/examples/effects/blurpicker/blureffect.cpp @@ -62,8 +62,8 @@ QRectF BlurEffect::boundingRect() const return QGraphicsBlurEffect::boundingRect(); } -void BlurEffect::draw(QPainter *painter, QGraphicsEffectSource *source) +void BlurEffect::draw(QPainter *painter) { adjustForItem(); - QGraphicsBlurEffect::draw(painter, source); + QGraphicsBlurEffect::draw(painter); } diff --git a/examples/effects/blurpicker/blureffect.h b/examples/effects/blurpicker/blureffect.h index 6cfa55a..3d1d433 100644 --- a/examples/effects/blurpicker/blureffect.h +++ b/examples/effects/blurpicker/blureffect.h @@ -54,7 +54,7 @@ public: QRectF boundingRect() const; - void draw(QPainter *painter, QGraphicsEffectSource *source); + void draw(QPainter *painter); private: void adjustForItem(); diff --git a/examples/effects/customshader/blureffect.cpp b/examples/effects/customshader/blureffect.cpp index 9046cbd..956637d 100644 --- a/examples/effects/customshader/blureffect.cpp +++ b/examples/effects/customshader/blureffect.cpp @@ -62,8 +62,8 @@ QRectF BlurEffect::boundingRect() const return QGraphicsBlurEffect::boundingRect(); } -void BlurEffect::draw(QPainter *painter, QGraphicsEffectSource *source) +void BlurEffect::draw(QPainter *painter) { adjustForItem(); - QGraphicsBlurEffect::draw(painter, source); + QGraphicsBlurEffect::draw(painter); } diff --git a/examples/effects/customshader/blureffect.h b/examples/effects/customshader/blureffect.h index 6cfa55a..3d1d433 100644 --- a/examples/effects/customshader/blureffect.h +++ b/examples/effects/customshader/blureffect.h @@ -54,7 +54,7 @@ public: QRectF boundingRect() const; - void draw(QPainter *painter, QGraphicsEffectSource *source); + void draw(QPainter *painter); private: void adjustForItem(); diff --git a/src/gui/effects/qgraphicseffect.cpp b/src/gui/effects/qgraphicseffect.cpp index 568ff73..13f42c5 100644 --- a/src/gui/effects/qgraphicseffect.cpp +++ b/src/gui/effects/qgraphicseffect.cpp @@ -76,24 +76,21 @@ To create your own custom effect, create a subclass of QGraphicsEffect (or any other existing effects) and reimplement the virtual function draw(). This function is called whenever the effect needs to redraw. The draw() - function accepts two arguments: the painter and a pointer to the source - (QGraphicsEffectSource). The source provides extra context information, - such as a pointer to the item that is rendering the effect, any cached - pixmap data, or the device rectangle bounds. For more information, refer to - the documenation for draw(). To obtain a pointer to the current source, - simply call source(). + function takes the painter with which to draw as an argument. For more + information, refer to the documenation for draw(). In the draw() function + you can call sourcePixmap() to get a pixmap of the graphics effect source + which you can then process. If your effect changes, use update() to request for a redraw. If your custom effect changes the bounding rectangle of the source, e.g., a radial glow effect may need to apply an extra margin, you can reimplement the - virtual boundingRectFor() function, and call updateBoundingRect() to notify - the framework whenever this rectangle changes. The virtual - sourceBoundingRectChanged() function is called to notify the effects that - the source's bounding rectangle has changed - e.g., if the source is a + virtual boundingRectFor() function, and call updateBoundingRect() + to notify the framework whenever this rectangle changes. The virtual + sourceChanged() function is called to notify the effects that + the source has changed in some way - e.g., if the source is a QGraphicsRectItem and its rectangle parameters have changed. - \sa QGraphicsItem::setGraphicsEffect(), QWidget::setGraphicsEffect(), - QGraphicsEffectSource + \sa QGraphicsItem::setGraphicsEffect(), QWidget::setGraphicsEffect() */ #include "qgraphicseffect_p.h" @@ -112,10 +109,10 @@ QT_BEGIN_NAMESPACE /*! + \internal \class QGraphicsEffectSource \brief The QGraphicsEffectSource class represents the source on which a QGraphicsEffect is installed on. - \since 4.6 When a QGraphicsEffect is installed on a QGraphicsItem, for example, this class will act as a wrapper around QGraphicsItem. Then, calling update() is @@ -154,20 +151,13 @@ QGraphicsEffectSource::~QGraphicsEffectSource() {} /*! - Returns the bounds of the current painter's device. - - This function is useful when you want to draw something in device - coordinates and ensure the size of the pixmap is not bigger than the size - of the device. - - Calling QGraphicsEffectSource::pixmap(Qt::DeviceCoordinates) always returns - a pixmap which is bound to the device's size. + Returns the bounding rectangle of the source mapped to the given \a system. - \sa pixmap() + \sa draw() */ -QRect QGraphicsEffectSource::deviceRect() const +QRectF QGraphicsEffectSource::boundingRect(Qt::CoordinateSystem system) const { - return d_func()->deviceRect(); + return d_func()->boundingRect(system); } /*! @@ -175,9 +165,12 @@ QRect QGraphicsEffectSource::deviceRect() const \sa draw() */ -QRectF QGraphicsEffectSource::boundingRect(Qt::CoordinateSystem system) const +QRectF QGraphicsEffect::sourceBoundingRect(Qt::CoordinateSystem system) const { - return d_func()->boundingRect(system); + Q_D(const QGraphicsEffect); + if (d->source) + return d->source->boundingRect(system); + return QRectF(); } /*! @@ -218,10 +211,6 @@ const QStyleOption *QGraphicsEffectSource::styleOption() const This function should only be called from QGraphicsEffect::draw(). - For example: - - \snippet doc/src/snippets/code/src_gui_effects_qgraphicseffect.cpp 0 - \sa QGraphicsEffect::draw() */ void QGraphicsEffectSource::draw(QPainter *painter) @@ -246,6 +235,24 @@ void QGraphicsEffectSource::draw(QPainter *painter) } /*! + Draws the source directly using the given \a painter. + + This function should only be called from QGraphicsEffect::draw(). + + For example: + + \snippet doc/src/snippets/code/src_gui_effects_qgraphicseffect.cpp 0 + + \sa QGraphicsEffect::draw() +*/ +void QGraphicsEffect::drawSource(QPainter *painter) +{ + Q_D(const QGraphicsEffect); + if (d->source) + d->source->draw(painter); +} + +/*! Schedules a redraw of the source. Call this function whenever the source needs to be redrawn. @@ -271,6 +278,19 @@ bool QGraphicsEffectSource::isPixmap() const } /*! + Returns true if the source effectively is a pixmap, e.g., a + QGraphicsPixmapItem. + + This function is useful for optimization purposes. For instance, there's no + point in drawing the source in device coordinates to avoid pixmap scaling + if this function returns true - the source pixmap will be scaled anyways. +*/ +bool QGraphicsEffect::sourceIsPixmap() const +{ + return source() ? source()->isPixmap() : false; +} + +/*! Returns a pixmap with the source painted into it. The \a system specifies which coordinate system to be used for the source. @@ -283,15 +303,15 @@ bool QGraphicsEffectSource::isPixmap() const The returned pixmap is bound to the current painter's device rectangle when \a system is Qt::DeviceCoordinates. - \sa QGraphicsEffect::draw(), boundingRect(), deviceRect() + \sa QGraphicsEffect::draw(), boundingRect() */ -QPixmap QGraphicsEffectSource::pixmap(Qt::CoordinateSystem system, QPoint *offset, PixmapPadMode mode) const +QPixmap QGraphicsEffectSource::pixmap(Qt::CoordinateSystem system, QPoint *offset, QGraphicsEffect::PixmapPadMode mode) const { Q_D(const QGraphicsEffectSource); // Shortcut, no cache for childless pixmap items... const QGraphicsItem *item = graphicsItem(); - if (system == Qt::LogicalCoordinates && mode == NoExpandPadMode && item && isPixmap()) { + if (system == Qt::LogicalCoordinates && mode == QGraphicsEffect::NoPad && item && isPixmap()) { return ((QGraphicsPixmapItem *) item)->pixmap(); } @@ -320,6 +340,27 @@ QPixmap QGraphicsEffectSource::pixmap(Qt::CoordinateSystem system, QPoint *offse return pm; } +/*! + Returns a pixmap with the source painted into it. + + The \a system specifies which coordinate system to be used for the source. + The optional \a offset parameter returns the offset where the pixmap should + be painted at using the current painter. For control on how the pixmap is + padded use the \a mode parameter. + + The returned pixmap is clipped to the current painter's device rectangle when + \a system is Qt::DeviceCoordinates. + + \sa draw(), boundingRect() +*/ +QPixmap QGraphicsEffect::sourcePixmap(Qt::CoordinateSystem system, QPoint *offset, QGraphicsEffect::PixmapPadMode mode) const +{ + Q_D(const QGraphicsEffect); + if (d->source) + return d->source->pixmap(system, offset, mode); + return QPixmap(); +} + QGraphicsEffectSourcePrivate::~QGraphicsEffectSourcePrivate() { invalidateCache(); @@ -327,7 +368,7 @@ QGraphicsEffectSourcePrivate::~QGraphicsEffectSourcePrivate() void QGraphicsEffectSourcePrivate::invalidateCache(bool effectRectChanged) const { - if (effectRectChanged && m_cachedMode != QGraphicsEffectSource::ExpandToEffectRectPadMode) + if (effectRectChanged && m_cachedMode != QGraphicsEffect::PadToEffectiveBoundingRect) return; QPixmapCache::remove(m_cacheKey); } @@ -359,9 +400,9 @@ QGraphicsEffect::~QGraphicsEffect() } /*! - Returns the bounding rectangle for this effect, i.e., the bounding - rectangle of the source, adjusted by any margins applied by the effect - itself. + Returns the effective bounding rectangle for this effect, i.e., the + bounding rectangle of the source, adjusted by any margins applied by + the effect itself. \sa boundingRectFor(), updateBoundingRect() */ @@ -374,12 +415,13 @@ QRectF QGraphicsEffect::boundingRect() const } /*! - Returns the bounding rectangle for this effect, given the provided source - \a rect. When writing you own custom effect, you must call - updateBoundingRect() whenever any parameters are changed that may cause - this this function to return a different value. + Returns the effective bounding rectangle for this effect, given the + provided \a rect in the source's coordinate space. When writing + you own custom effect, you must call updateBoundingRect() whenever any + parameters are changed that may cause this this function to return a + different value. - \sa boundingRect() + \sa sourceBoundingRect() */ QRectF QGraphicsEffect::boundingRectFor(const QRectF &rect) const { @@ -445,6 +487,8 @@ void QGraphicsEffect::update() } /*! + \internal + Returns a pointer to the source, which provides extra context information that can be useful for the effect. @@ -464,7 +508,7 @@ QGraphicsEffectSource *QGraphicsEffect::source() const This function will call update() if this is necessary. - \sa boundingRectFor(), boundingRect() + \sa boundingRectFor(), boundingRect(), sourceBoundingRect() */ void QGraphicsEffect::updateBoundingRect() { @@ -476,15 +520,13 @@ void QGraphicsEffect::updateBoundingRect() } /*! - \fn virtual void QGraphicsEffect::draw(QPainter *painter, - QGraphicsEffectSource *source) = 0 + \fn virtual void QGraphicsEffect::draw(QPainter *painter) = 0 This pure virtual function draws the effect and is called whenever the - source() needs to be drawn. + source needs to be drawn. Reimplement this function in a QGraphicsEffect subclass to provide the - effect's drawing implementation, using \a painter. The \a source parameter - is provided for convenience; its value is the same as source(). + effect's drawing implementation, using \a painter. For example: @@ -492,8 +534,6 @@ void QGraphicsEffect::updateBoundingRect() This function should not be called explicitly by the user, since it is meant for reimplementation purposes only. - - \sa QGraphicsEffectSource */ /*! @@ -509,6 +549,20 @@ void QGraphicsEffect::updateBoundingRect() */ /*! + \enum QGraphicsEffect::PixmapPadMode + + This enum describes how the pixmap returned from sourcePixmap should be + padded. + + \value NoPad The pixmap should not receive any additional + padding. + \value PadToTransparentBorder The pixmap should be padded + to ensure it has a completely transparent border. + \value PadToEffectiveBoundingRect The pixmap should be padded to + match the effective bounding rectangle of the effect. +*/ + +/*! This virtual function is called by QGraphicsEffect to notify the effect that the source has changed. If the effect applies any cache, then this cache must be purged in order to reflect the new appearance of the source. @@ -615,26 +669,25 @@ void QGraphicsColorizeEffect::setStrength(qreal strength) /*! \reimp */ -void QGraphicsColorizeEffect::draw(QPainter *painter, QGraphicsEffectSource *source) +void QGraphicsColorizeEffect::draw(QPainter *painter) { Q_D(QGraphicsColorizeEffect); if (!d->opaque) { - source->draw(painter); + drawSource(painter); return; } QPoint offset; - if (source->isPixmap()) { + if (sourceIsPixmap()) { // No point in drawing in device coordinates (pixmap will be scaled anyways). - const QPixmap pixmap = source->pixmap(Qt::LogicalCoordinates, &offset, - QGraphicsEffectSource::NoExpandPadMode); + const QPixmap pixmap = sourcePixmap(Qt::LogicalCoordinates, &offset, NoPad); d->filter->draw(painter, offset, pixmap); return; } // Draw pixmap in deviceCoordinates to avoid pixmap scaling. - const QPixmap pixmap = source->pixmap(Qt::DeviceCoordinates, &offset); + const QPixmap pixmap = sourcePixmap(Qt::DeviceCoordinates, &offset); QTransform restoreTransform = painter->worldTransform(); painter->setWorldTransform(QTransform()); d->filter->draw(painter, offset, pixmap); @@ -649,7 +702,7 @@ void QGraphicsColorizeEffect::draw(QPainter *painter, QGraphicsEffectSource *sou A blur effect blurs the source. This effect is useful for reducing details, such as when the source loses focus and you want to draw attention to other elements. The level of detail can be modified using the setBlurRadius() - function. Use setBlurHint() to choose the quality or performance blur hints. + function. Use setBlurHints() to choose the blur hints. By default, the blur radius is 5 pixels. @@ -666,15 +719,17 @@ void QGraphicsColorizeEffect::draw(QPainter *painter, QGraphicsEffectSource *sou blur effects are applied. The hints might not have an effect in all the paint engines. - \value QualityHint Indicates that rendering quality is the most important factor, - at the potential cost of lower performance. - \value PerformanceHint Indicates that rendering performance is the most important factor, at the potential cost of lower quality. + \value QualityHint Indicates that rendering quality is the most important factor, + at the potential cost of lower performance. + \value AnimationHint Indicates that the blur radius is going to be animated, hinting - that the implementation can keep a cache of blurred verisons of the source pixmap. - Do not use this hint if the source item is going to be dynamically changing. + that the implementation can keep a cache of blurred verisons of the source. + Do not use this hint if the source is going to be dynamically changing. + + \sa blurHints(), setBlurHints() */ @@ -686,7 +741,7 @@ QGraphicsBlurEffect::QGraphicsBlurEffect(QObject *parent) : QGraphicsEffect(*new QGraphicsBlurEffectPrivate, parent) { Q_D(QGraphicsBlurEffect); - d->filter->setBlurHint(QGraphicsBlurEffect::PerformanceHint); + d->filter->setBlurHints(QGraphicsBlurEffect::PerformanceHint); } /*! @@ -730,7 +785,7 @@ void QGraphicsBlurEffect::setBlurRadius(qreal radius) */ /*! - \property QGraphicsBlurEffect::blurHint + \property QGraphicsBlurEffect::blurHints \brief the blur hint of the effect. Use the PerformanceHint hint to say that you want a faster blur, @@ -739,27 +794,27 @@ void QGraphicsBlurEffect::setBlurRadius(qreal radius) By default, the blur hint is PerformanceHint. */ -QGraphicsBlurEffect::BlurHint QGraphicsBlurEffect::blurHint() const +QGraphicsBlurEffect::BlurHints QGraphicsBlurEffect::blurHints() const { Q_D(const QGraphicsBlurEffect); - return d->filter->blurHint(); + return d->filter->blurHints(); } -void QGraphicsBlurEffect::setBlurHint(QGraphicsBlurEffect::BlurHint hint) +void QGraphicsBlurEffect::setBlurHints(QGraphicsBlurEffect::BlurHints hints) { Q_D(QGraphicsBlurEffect); - if (d->filter->blurHint() == hint) + if (d->filter->blurHints() == hints) return; - d->filter->setBlurHint(hint); - emit blurHintChanged(hint); + d->filter->setBlurHints(hints); + emit blurHintsChanged(hints); } /*! - \fn void QGraphicsBlurEffect::blurHintChanged(QGraphicsBlurEffect::BlurHint hint) + \fn void QGraphicsBlurEffect::blurHintsChanged(QGraphicsBlurEffect::BlurHints hints) - This signal is emitted whenever the effect's blur hint changes. - The \a hint parameter holds the effect's new blur hint. + This signal is emitted whenever the effect's blur hints changes. + The \a hints parameter holds the effect's new blur hints. */ /*! @@ -774,21 +829,21 @@ QRectF QGraphicsBlurEffect::boundingRectFor(const QRectF &rect) const /*! \reimp */ -void QGraphicsBlurEffect::draw(QPainter *painter, QGraphicsEffectSource *source) +void QGraphicsBlurEffect::draw(QPainter *painter) { Q_D(QGraphicsBlurEffect); if (d->filter->radius() <= 0) { - source->draw(painter); + drawSource(painter); return; } - QGraphicsEffectSource::PixmapPadMode mode = QGraphicsEffectSource::ExpandToEffectRectPadMode; + PixmapPadMode mode = PadToEffectiveBoundingRect; if (painter->paintEngine()->type() == QPaintEngine::OpenGL2) - mode = QGraphicsEffectSource::ExpandToTransparentBorderPadMode; + mode = PadToTransparentBorder; // Draw pixmap in device coordinates to avoid pixmap scaling. QPoint offset; - const QPixmap pixmap = source->pixmap(Qt::DeviceCoordinates, &offset, mode); + const QPixmap pixmap = sourcePixmap(Qt::DeviceCoordinates, &offset, mode); QTransform restoreTransform = painter->worldTransform(); painter->setWorldTransform(QTransform()); d->filter->draw(painter, offset, pixmap); @@ -963,21 +1018,21 @@ QRectF QGraphicsDropShadowEffect::boundingRectFor(const QRectF &rect) const /*! \reimp */ -void QGraphicsDropShadowEffect::draw(QPainter *painter, QGraphicsEffectSource *source) +void QGraphicsDropShadowEffect::draw(QPainter *painter) { Q_D(QGraphicsDropShadowEffect); if (d->filter->blurRadius() <= 0 && d->filter->offset().isNull()) { - source->draw(painter); + drawSource(painter); return; } - QGraphicsEffectSource::PixmapPadMode mode = QGraphicsEffectSource::ExpandToEffectRectPadMode; + PixmapPadMode mode = PadToEffectiveBoundingRect; if (painter->paintEngine()->type() == QPaintEngine::OpenGL2) - mode = QGraphicsEffectSource::ExpandToTransparentBorderPadMode; + mode = PadToTransparentBorder; // Draw pixmap in device coordinates to avoid pixmap scaling. QPoint offset; - const QPixmap pixmap = source->pixmap(Qt::DeviceCoordinates, &offset, mode); + const QPixmap pixmap = sourcePixmap(Qt::DeviceCoordinates, &offset, mode); QTransform restoreTransform = painter->worldTransform(); painter->setWorldTransform(QTransform()); d->filter->draw(painter, offset, pixmap); @@ -1100,7 +1155,7 @@ void QGraphicsOpacityEffect::setOpacityMask(const QBrush &mask) /*! \reimp */ -void QGraphicsOpacityEffect::draw(QPainter *painter, QGraphicsEffectSource *source) +void QGraphicsOpacityEffect::draw(QPainter *painter) { Q_D(QGraphicsOpacityEffect); @@ -1110,18 +1165,16 @@ void QGraphicsOpacityEffect::draw(QPainter *painter, QGraphicsEffectSource *sour // Opaque; draw directly without going through a pixmap. if (d->isFullyOpaque && !d->hasOpacityMask) { - source->draw(painter); + drawSource(painter); return; } - QPoint offset; - Qt::CoordinateSystem system = source->isPixmap() ? Qt::LogicalCoordinates : Qt::DeviceCoordinates; - QPixmap pixmap = source->pixmap(system, &offset, QGraphicsEffectSource::NoExpandPadMode); + Qt::CoordinateSystem system = sourceIsPixmap() ? Qt::LogicalCoordinates : Qt::DeviceCoordinates; + QPixmap pixmap = sourcePixmap(system, &offset, QGraphicsEffect::NoPad); if (pixmap.isNull()) return; - painter->save(); painter->setOpacity(d->opacity); @@ -1133,7 +1186,7 @@ void QGraphicsOpacityEffect::draw(QPainter *painter, QGraphicsEffectSource *sour QTransform worldTransform = painter->worldTransform(); worldTransform *= QTransform::fromTranslate(-offset.x(), -offset.y()); pixmapPainter.setWorldTransform(worldTransform); - pixmapPainter.fillRect(source->boundingRect(), d->opacityMask); + pixmapPainter.fillRect(sourceBoundingRect(), d->opacityMask); } else { pixmapPainter.translate(-offset); pixmapPainter.fillRect(pixmap.rect(), d->opacityMask); diff --git a/src/gui/effects/qgraphicseffect.h b/src/gui/effects/qgraphicseffect.h index 5c73f4b..2257f01 100644 --- a/src/gui/effects/qgraphicseffect.h +++ b/src/gui/effects/qgraphicseffect.h @@ -60,46 +60,7 @@ class QStyleOption; class QPainter; class QPixmap; -class QGraphicsEffectSourcePrivate; -class Q_GUI_EXPORT QGraphicsEffectSource : public QObject -{ - Q_OBJECT -public: - enum PixmapPadMode { - NoExpandPadMode, - ExpandToTransparentBorderPadMode, - ExpandToEffectRectPadMode - }; - - ~QGraphicsEffectSource(); - const QGraphicsItem *graphicsItem() const; - const QWidget *widget() const; - const QStyleOption *styleOption() const; - - bool isPixmap() const; - void draw(QPainter *painter); - void update(); - - QRectF boundingRect(Qt::CoordinateSystem coordinateSystem = Qt::LogicalCoordinates) const; - QRect deviceRect() const; - QPixmap pixmap(Qt::CoordinateSystem system = Qt::LogicalCoordinates, - QPoint *offset = 0, - PixmapPadMode mode = ExpandToEffectRectPadMode) const; - -protected: - QGraphicsEffectSource(QGraphicsEffectSourcePrivate &dd, QObject *parent = 0); - -private: - Q_DECLARE_PRIVATE(QGraphicsEffectSource) - Q_DISABLE_COPY(QGraphicsEffectSource) - friend class QGraphicsEffect; - friend class QGraphicsEffectPrivate; - friend class QGraphicsScenePrivate; - friend class QGraphicsItem; - friend class QGraphicsItemPrivate; - friend class QWidget; - friend class QWidgetPrivate; -}; +class QGraphicsEffectSource; class QGraphicsEffectPrivate; class Q_GUI_EXPORT QGraphicsEffect : public QObject @@ -116,14 +77,18 @@ public: }; Q_DECLARE_FLAGS(ChangeFlags, ChangeFlag) + enum PixmapPadMode { + NoPad, + PadToTransparentBorder, + PadToEffectiveBoundingRect + }; + QGraphicsEffect(QObject *parent = 0); virtual ~QGraphicsEffect(); - virtual QRectF boundingRectFor(const QRectF &rect) const; + virtual QRectF boundingRectFor(const QRectF &sourceRect) const; QRectF boundingRect() const; - QGraphicsEffectSource *source() const; - bool isEnabled() const; public Q_SLOTS: @@ -135,10 +100,17 @@ Q_SIGNALS: protected: QGraphicsEffect(QGraphicsEffectPrivate &d, QObject *parent = 0); - virtual void draw(QPainter *painter, QGraphicsEffectSource *source) = 0; + virtual void draw(QPainter *painter) = 0; virtual void sourceChanged(ChangeFlags flags); void updateBoundingRect(); + bool sourceIsPixmap() const; + QRectF sourceBoundingRect(Qt::CoordinateSystem system = Qt::LogicalCoordinates) const; + void drawSource(QPainter *painter); + QPixmap sourcePixmap(Qt::CoordinateSystem system = Qt::LogicalCoordinates, + QPoint *offset = 0, + PixmapPadMode mode = PadToEffectiveBoundingRect) const; + private: Q_DECLARE_PRIVATE(QGraphicsEffect) Q_DISABLE_COPY(QGraphicsEffect) @@ -147,6 +119,10 @@ private: friend class QGraphicsScenePrivate; friend class QWidget; friend class QWidgetPrivate; + +public: + QGraphicsEffectSource *source() const; // internal + }; Q_DECLARE_OPERATORS_FOR_FLAGS(QGraphicsEffect::ChangeFlags) @@ -172,7 +148,7 @@ Q_SIGNALS: void strengthChanged(qreal strength); protected: - void draw(QPainter *painter, QGraphicsEffectSource *source); + void draw(QPainter *painter); private: Q_DECLARE_PRIVATE(QGraphicsColorizeEffect) @@ -183,38 +159,42 @@ class QGraphicsBlurEffectPrivate; class Q_GUI_EXPORT QGraphicsBlurEffect: public QGraphicsEffect { Q_OBJECT + Q_FLAGS(BlurHint BlurHints) Q_PROPERTY(qreal blurRadius READ blurRadius WRITE setBlurRadius NOTIFY blurRadiusChanged) - Q_PROPERTY(BlurHint blurHint READ blurHint WRITE setBlurHint NOTIFY blurHintChanged) + Q_PROPERTY(BlurHints blurHints READ blurHints WRITE setBlurHints NOTIFY blurHintsChanged) public: enum BlurHint { - QualityHint, - PerformanceHint, - AnimationHint + PerformanceHint = 0x00, + QualityHint = 0x01, + AnimationHint = 0x02 }; + Q_DECLARE_FLAGS(BlurHints, BlurHint) QGraphicsBlurEffect(QObject *parent = 0); ~QGraphicsBlurEffect(); QRectF boundingRectFor(const QRectF &rect) const; qreal blurRadius() const; - BlurHint blurHint() const; + BlurHints blurHints() const; public Q_SLOTS: void setBlurRadius(qreal blurRadius); - void setBlurHint(BlurHint hint); + void setBlurHints(BlurHints hints); Q_SIGNALS: void blurRadiusChanged(qreal blurRadius); - void blurHintChanged(BlurHint hint); + void blurHintsChanged(BlurHints hints); protected: - void draw(QPainter *painter, QGraphicsEffectSource *source); + void draw(QPainter *painter); private: Q_DECLARE_PRIVATE(QGraphicsBlurEffect) Q_DISABLE_COPY(QGraphicsBlurEffect) }; +Q_DECLARE_OPERATORS_FOR_FLAGS(QGraphicsBlurEffect::BlurHints) + class QGraphicsDropShadowEffectPrivate; class Q_GUI_EXPORT QGraphicsDropShadowEffect: public QGraphicsEffect { @@ -264,7 +244,7 @@ Q_SIGNALS: void colorChanged(const QColor &color); protected: - void draw(QPainter *painter, QGraphicsEffectSource *source); + void draw(QPainter *painter); private: Q_DECLARE_PRIVATE(QGraphicsDropShadowEffect) @@ -293,7 +273,7 @@ Q_SIGNALS: void opacityMaskChanged(const QBrush &mask); protected: - void draw(QPainter *painter, QGraphicsEffectSource *source); + void draw(QPainter *painter); private: Q_DECLARE_PRIVATE(QGraphicsOpacityEffect) diff --git a/src/gui/effects/qgraphicseffect_p.h b/src/gui/effects/qgraphicseffect_p.h index d94d08d..c67052e 100644 --- a/src/gui/effects/qgraphicseffect_p.h +++ b/src/gui/effects/qgraphicseffect_p.h @@ -63,6 +63,41 @@ #ifndef QT_NO_GRAPHICSEFFECT QT_BEGIN_NAMESPACE +class QGraphicsEffectSourcePrivate; +class Q_AUTOTEST_EXPORT QGraphicsEffectSource : public QObject +{ + Q_OBJECT +public: + ~QGraphicsEffectSource(); + const QGraphicsItem *graphicsItem() const; + const QWidget *widget() const; + const QStyleOption *styleOption() const; + + bool isPixmap() const; + void draw(QPainter *painter); + void update(); + + QRectF boundingRect(Qt::CoordinateSystem coordinateSystem = Qt::LogicalCoordinates) const; + QRect deviceRect() const; + QPixmap pixmap(Qt::CoordinateSystem system = Qt::LogicalCoordinates, + QPoint *offset = 0, + QGraphicsEffect::PixmapPadMode mode = QGraphicsEffect::PadToEffectiveBoundingRect) const; + +protected: + QGraphicsEffectSource(QGraphicsEffectSourcePrivate &dd, QObject *parent = 0); + +private: + Q_DECLARE_PRIVATE(QGraphicsEffectSource) + Q_DISABLE_COPY(QGraphicsEffectSource) + friend class QGraphicsEffect; + friend class QGraphicsEffectPrivate; + friend class QGraphicsScenePrivate; + friend class QGraphicsItem; + friend class QGraphicsItemPrivate; + friend class QWidget; + friend class QWidgetPrivate; +}; + class QGraphicsEffectSourcePrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QGraphicsEffectSource) @@ -70,7 +105,7 @@ public: QGraphicsEffectSourcePrivate() : QObjectPrivate() , m_cachedSystem(Qt::DeviceCoordinates) - , m_cachedMode(QGraphicsEffectSource::ExpandToTransparentBorderPadMode) + , m_cachedMode(QGraphicsEffect::PadToTransparentBorder) {} virtual ~QGraphicsEffectSourcePrivate(); @@ -84,7 +119,7 @@ public: virtual void update() = 0; virtual bool isPixmap() const = 0; virtual QPixmap pixmap(Qt::CoordinateSystem system, QPoint *offset = 0, - QGraphicsEffectSource::PixmapPadMode mode = QGraphicsEffectSource::ExpandToTransparentBorderPadMode) const = 0; + QGraphicsEffect::PixmapPadMode mode = QGraphicsEffect::PadToTransparentBorder) const = 0; virtual void effectBoundingRectChanged() = 0; void invalidateCache(bool effectRectChanged = false) const; @@ -94,7 +129,7 @@ public: private: mutable Qt::CoordinateSystem m_cachedSystem; - mutable QGraphicsEffectSource::PixmapPadMode m_cachedMode; + mutable QGraphicsEffect::PixmapPadMode m_cachedMode; mutable QPoint m_cachedOffset; mutable QPixmapCache::Key m_cacheKey; }; diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp index 723e496..9d495e9 100644 --- a/src/gui/graphicsview/qgraphicsitem.cpp +++ b/src/gui/graphicsview/qgraphicsitem.cpp @@ -10812,7 +10812,7 @@ void QGraphicsItemEffectSourcePrivate::draw(QPainter *painter) } QPixmap QGraphicsItemEffectSourcePrivate::pixmap(Qt::CoordinateSystem system, QPoint *offset, - QGraphicsEffectSource::PixmapPadMode mode) const + QGraphicsEffect::PixmapPadMode mode) const { const bool deviceCoordinates = (system == Qt::DeviceCoordinates); if (!info && deviceCoordinates) { @@ -10828,9 +10828,9 @@ QPixmap QGraphicsItemEffectSourcePrivate::pixmap(Qt::CoordinateSystem system, QP const QRectF sourceRect = boundingRect(system); QRect effectRect; - if (mode == QGraphicsEffectSource::ExpandToEffectRectPadMode) { + if (mode == QGraphicsEffect::PadToEffectiveBoundingRect) { effectRect = item->graphicsEffect()->boundingRectFor(sourceRect).toAlignedRect(); - } else if (mode == QGraphicsEffectSource::ExpandToTransparentBorderPadMode) { + } else if (mode == QGraphicsEffect::PadToTransparentBorder) { // adjust by 1.5 to account for cosmetic pens effectRect = sourceRect.adjusted(-1.5, -1.5, 1.5, 1.5).toAlignedRect(); } else { diff --git a/src/gui/graphicsview/qgraphicsitem_p.h b/src/gui/graphicsview/qgraphicsitem_p.h index afc2198..75c8246 100644 --- a/src/gui/graphicsview/qgraphicsitem_p.h +++ b/src/gui/graphicsview/qgraphicsitem_p.h @@ -633,7 +633,7 @@ public: void draw(QPainter *); QPixmap pixmap(Qt::CoordinateSystem system, QPoint *offset, - QGraphicsEffectSource::PixmapPadMode mode) const; + QGraphicsEffect::PixmapPadMode mode) const; QGraphicsItem *item; QGraphicsItemPaintInfo *info; diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp index 2748ab6..13f31b8 100644 --- a/src/gui/graphicsview/qgraphicsscene.cpp +++ b/src/gui/graphicsview/qgraphicsscene.cpp @@ -4656,7 +4656,7 @@ void QGraphicsScenePrivate::drawSubtreeRecursive(QGraphicsItem *item, QPainter * sourced->lastEffectTransform = painter->worldTransform(); sourced->invalidateCache(); } - item->d_ptr->graphicsEffect->draw(painter, source); + item->d_ptr->graphicsEffect->draw(painter); painter->setWorldTransform(restoreTransform); sourced->info = 0; } else diff --git a/src/gui/image/qpixmapfilter.cpp b/src/gui/image/qpixmapfilter.cpp index d83ef2c..c0b840a 100644 --- a/src/gui/image/qpixmapfilter.cpp +++ b/src/gui/image/qpixmapfilter.cpp @@ -490,7 +490,7 @@ void QPixmapConvolutionFilter::draw(QPainter *painter, const QPointF &p, const Q which is applied when \l{QPixmapFilter::}{draw()} is called. The filter lets you specialize the radius of the blur as well - as hint as to whether to prefer performance or quality. + as hints as to whether to prefer performance or quality. By default, the blur effect is produced by applying an exponential filter generated from the specified blurRadius(). Paint engines @@ -505,10 +505,10 @@ void QPixmapConvolutionFilter::draw(QPainter *painter, const QPointF &p, const Q class QPixmapBlurFilterPrivate : public QPixmapFilterPrivate { public: - QPixmapBlurFilterPrivate() : radius(5), hint(QGraphicsBlurEffect::PerformanceHint) {} + QPixmapBlurFilterPrivate() : radius(5), hints(QGraphicsBlurEffect::PerformanceHint) {} qreal radius; - QGraphicsBlurEffect::BlurHint hint; + QGraphicsBlurEffect::BlurHints hints; }; @@ -554,9 +554,9 @@ qreal QPixmapBlurFilter::radius() const } /*! - Setting the blur hint to PerformanceHint causes the implementation + Setting the blur hints to PerformanceHint causes the implementation to trade off visual quality to blur the image faster. Setting the - blur hint to QualityHint causes the implementation to improve + blur hints to QualityHint causes the implementation to improve visual quality at the expense of speed. AnimationHint causes the implementation to optimize for animating @@ -568,21 +568,21 @@ qreal QPixmapBlurFilter::radius() const \internal */ -void QPixmapBlurFilter::setBlurHint(QGraphicsBlurEffect::BlurHint hint) +void QPixmapBlurFilter::setBlurHints(QGraphicsBlurEffect::BlurHints hints) { Q_D(QPixmapBlurFilter); - d->hint = hint; + d->hints = hints; } /*! - Gets the blur hint of the blur filter. + Gets the blur hints of the blur filter. \internal */ -QGraphicsBlurEffect::BlurHint QPixmapBlurFilter::blurHint() const +QGraphicsBlurEffect::BlurHints QPixmapBlurFilter::blurHints() const { Q_D(const QPixmapBlurFilter); - return d->hint; + return d->hints; } /*! @@ -685,7 +685,7 @@ void QPixmapBlurFilter::draw(QPainter *painter, const QPointF &p, const QPixmap QPixmapBlurFilter *blurFilter = static_cast(filter); if (blurFilter) { blurFilter->setRadius(d->radius); - blurFilter->setBlurHint(d->hint); + blurFilter->setBlurHints(d->hints); blurFilter->draw(painter, p, src, srcRect); return; } diff --git a/src/gui/image/qpixmapfilter_p.h b/src/gui/image/qpixmapfilter_p.h index 2573fc7..46e744e 100644 --- a/src/gui/image/qpixmapfilter_p.h +++ b/src/gui/image/qpixmapfilter_p.h @@ -132,10 +132,10 @@ public: ~QPixmapBlurFilter(); void setRadius(qreal radius); - void setBlurHint(QGraphicsBlurEffect::BlurHint hint); + void setBlurHints(QGraphicsBlurEffect::BlurHints hints); qreal radius() const; - QGraphicsBlurEffect::BlurHint blurHint() const; + QGraphicsBlurEffect::BlurHints blurHints() const; QRectF boundingRectFor(const QRectF &rect) const; void draw(QPainter *painter, const QPointF &dest, const QPixmap &src, const QRectF &srcRect = QRectF()) const; diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index f856b13..e764774 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -5238,7 +5238,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP QPainter p(pdev); p.translate(offset); context.painter = &p; - graphicsEffect->draw(&p, source); + graphicsEffect->draw(&p); paintEngine->d_func()->systemClip = QRegion(); } else { context.painter = sharedPainter; @@ -5248,7 +5248,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP } sharedPainter->save(); sharedPainter->translate(offset); - graphicsEffect->draw(sharedPainter, source); + graphicsEffect->draw(sharedPainter); sharedPainter->restore(); } sourced->context = 0; @@ -5470,7 +5470,7 @@ void QWidgetEffectSourcePrivate::draw(QPainter *painter) } QPixmap QWidgetEffectSourcePrivate::pixmap(Qt::CoordinateSystem system, QPoint *offset, - QGraphicsEffectSource::PixmapPadMode mode) const + QGraphicsEffect::PixmapPadMode mode) const { const bool deviceCoordinates = (system == Qt::DeviceCoordinates); if (!context && deviceCoordinates) { @@ -5491,10 +5491,10 @@ QPixmap QWidgetEffectSourcePrivate::pixmap(Qt::CoordinateSystem system, QPoint * QRect effectRect; - if (mode == QGraphicsEffectSource::ExpandToEffectRectPadMode) { + if (mode == QGraphicsEffect::PadToEffectiveBoundingRect) { effectRect = m_widget->graphicsEffect()->boundingRectFor(sourceRect).toAlignedRect(); - } else if (mode == QGraphicsEffectSource::ExpandToTransparentBorderPadMode) { + } else if (mode == QGraphicsEffect::PadToTransparentBorder) { effectRect = sourceRect.adjusted(-1, -1, 1, 1).toAlignedRect(); } else { diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h index 151b90a..df28bac 100644 --- a/src/gui/kernel/qwidget_p.h +++ b/src/gui/kernel/qwidget_p.h @@ -824,7 +824,7 @@ public: QRectF boundingRect(Qt::CoordinateSystem system) const; void draw(QPainter *p); QPixmap pixmap(Qt::CoordinateSystem system, QPoint *offset, - QGraphicsEffectSource::PixmapPadMode mode) const; + QGraphicsEffect::PixmapPadMode mode) const; QWidget *m_widget; QWidgetPaintContext *context; diff --git a/src/opengl/qglpixmapfilter.cpp b/src/opengl/qglpixmapfilter.cpp index 0eaab28..fcb0ea2 100644 --- a/src/opengl/qglpixmapfilter.cpp +++ b/src/opengl/qglpixmapfilter.cpp @@ -102,7 +102,7 @@ private: class QGLPixmapBlurFilter : public QGLCustomShaderStage, public QGLPixmapFilter { public: - QGLPixmapBlurFilter(QGraphicsBlurEffect::BlurHint hint); + QGLPixmapBlurFilter(QGraphicsBlurEffect::BlurHints hints); void setUniforms(QGLShaderProgram *program); @@ -123,13 +123,13 @@ private: mutable bool m_haveCached; mutable int m_cachedRadius; - mutable QGraphicsBlurEffect::BlurHint m_hint; + mutable QGraphicsBlurEffect::BlurHints m_hints; }; class QGLPixmapDropShadowFilter : public QGLCustomShaderStage, public QGLPixmapFilter { public: - QGLPixmapDropShadowFilter(QGraphicsBlurEffect::BlurHint hint); + QGLPixmapDropShadowFilter(QGraphicsBlurEffect::BlurHints hints); void setUniforms(QGLShaderProgram *program); @@ -143,7 +143,7 @@ private: mutable bool m_haveCached; mutable int m_cachedRadius; - mutable QGraphicsBlurEffect::BlurHint m_hint; + mutable QGraphicsBlurEffect::BlurHints m_hints; }; extern QGLWidget *qt_gl_share_widget(); @@ -159,19 +159,19 @@ QPixmapFilter *QGL2PaintEngineEx::pixmapFilter(int type, const QPixmapFilter *pr case QPixmapFilter::BlurFilter: { const QPixmapBlurFilter *proto = static_cast(prototype); - if (proto->blurHint() == QGraphicsBlurEffect::AnimationHint) { + if (proto->blurHints() & QGraphicsBlurEffect::AnimationHint) { if (!d->animationBlurFilter) - d->animationBlurFilter.reset(new QGLPixmapBlurFilter(proto->blurHint())); + d->animationBlurFilter.reset(new QGLPixmapBlurFilter(proto->blurHints())); return d->animationBlurFilter.data(); } - if (proto->blurHint() == QGraphicsBlurEffect::PerformanceHint || proto->radius() <= 5) { - if (!d->fastBlurFilter) - d->fastBlurFilter.reset(new QGLPixmapBlurFilter(QGraphicsBlurEffect::PerformanceHint)); - return d->fastBlurFilter.data(); + if ((proto->blurHints() & QGraphicsBlurEffect::QualityHint) && proto->radius() > 5) { + if (!d->blurFilter) + d->blurFilter.reset(new QGLPixmapBlurFilter(QGraphicsBlurEffect::QualityHint)); + return d->blurFilter.data(); } - if (!d->blurFilter) - d->blurFilter.reset(new QGLPixmapBlurFilter(QGraphicsBlurEffect::QualityHint)); - return d->blurFilter.data(); + if (!d->fastBlurFilter) + d->fastBlurFilter.reset(new QGLPixmapBlurFilter(QGraphicsBlurEffect::PerformanceHint)); + return d->fastBlurFilter.data(); } case QPixmapFilter::DropShadowFilter: { @@ -316,11 +316,11 @@ static const char *qt_gl_texture_sampling_helper = " return texture2D(src, srcCoords).a;\n" "}\n"; -QGLPixmapBlurFilter::QGLPixmapBlurFilter(QGraphicsBlurEffect::BlurHint hint) +QGLPixmapBlurFilter::QGLPixmapBlurFilter(QGraphicsBlurEffect::BlurHints hints) : m_animatedBlur(false) , m_haveCached(false) , m_cachedRadius(0) - , m_hint(hint) + , m_hints(hints) { } @@ -503,7 +503,7 @@ bool QGLPixmapBlurFilter::processGL(QPainter *painter, const QPointF &pos, const QGLContext *ctx = const_cast(QGLContext::currentContext()); QGLBlurTextureCache *blurTextureCache = QGLBlurTextureCache::cacheForContext(ctx); - if (m_hint == QGraphicsBlurEffect::AnimationHint && blurTextureCache->fitsInCache(src)) { + if ((m_hints & QGraphicsBlurEffect::AnimationHint) && blurTextureCache->fitsInCache(src)) { QRect targetRect = src.rect().adjusted(-qMaxCachedBlurLevel, -qMaxCachedBlurLevel, qMaxCachedBlurLevel, qMaxCachedBlurLevel); // ensure even dimensions (going to divide by two) targetRect.setWidth((targetRect.width() + 1) & ~1); @@ -514,7 +514,7 @@ bool QGLPixmapBlurFilter::processGL(QPainter *painter, const QPointF &pos, const info = blurTextureCache->takeBlurTextureInfo(src); } else { m_animatedBlur = false; - m_hint = QGraphicsBlurEffect::QualityHint; + m_hints = QGraphicsBlurEffect::QualityHint; m_singlePass = false; QGLFramebufferObjectFormat format; @@ -594,7 +594,7 @@ bool QGLPixmapBlurFilter::processGL(QPainter *painter, const QPointF &pos, const if (!m_haveCached || !m_animatedBlur) { m_haveCached = true; m_animatedBlur = true; - m_hint = QGraphicsBlurEffect::AnimationHint; + m_hints = QGraphicsBlurEffect::AnimationHint; filter->setSource(qt_gl_interpolate_filter); } @@ -653,7 +653,7 @@ bool QGLPixmapBlurFilter::processGL(QPainter *painter, const QPointF &pos, const int actualRadius = qRound(radius()); int filterRadius = actualRadius; int fastRadii[] = { 1, 2, 3, 5, 8, 15, 25 }; - if (m_hint != QGraphicsBlurEffect::QualityHint) { + if (!(m_hints & QGraphicsBlurEffect::QualityHint)) { uint i = 0; for (; i < (sizeof(fastRadii)/sizeof(*fastRadii))-1; ++i) { if (fastRadii[i+1] > filterRadius) @@ -762,7 +762,7 @@ void QGLPixmapBlurFilter::setUniforms(QGLShaderProgram *program) return; } - if (m_hint == QGraphicsBlurEffect::QualityHint) { + if (m_hints & QGraphicsBlurEffect::QualityHint) { if (m_singlePass) program->setUniformValue("delta", 1.0 / m_textureSize.width(), 1.0 / m_textureSize.height()); else if (m_horizontalBlur) @@ -912,10 +912,10 @@ QByteArray QGLPixmapBlurFilter::generateGaussianShader(int radius, bool singlePa return source; } -QGLPixmapDropShadowFilter::QGLPixmapDropShadowFilter(QGraphicsBlurEffect::BlurHint hint) +QGLPixmapDropShadowFilter::QGLPixmapDropShadowFilter(QGraphicsBlurEffect::BlurHints hints) : m_haveCached(false) , m_cachedRadius(0) - , m_hint(hint) + , m_hints(hints) { } @@ -1018,7 +1018,7 @@ void QGLPixmapDropShadowFilter::setUniforms(QGLShaderProgram *program) alpha); } - if (m_hint == QGraphicsBlurEffect::QualityHint) { + if (m_hints & QGraphicsBlurEffect::QualityHint) { if (m_singlePass) program->setUniformValue("delta", 1.0 / m_textureSize.width(), 1.0 / m_textureSize.height()); else if (m_horizontalBlur) diff --git a/src/opengl/qgraphicsshadereffect.cpp b/src/opengl/qgraphicsshadereffect.cpp index 1c02fd0..4d7a69c 100644 --- a/src/opengl/qgraphicsshadereffect.cpp +++ b/src/opengl/qgraphicsshadereffect.cpp @@ -241,7 +241,7 @@ void QGraphicsShaderEffect::setPixelShaderFragment(const QByteArray& code) /*# \reimp */ -void QGraphicsShaderEffect::draw(QPainter *painter, QGraphicsEffectSource *source) +void QGraphicsShaderEffect::draw(QPainter *painter) { Q_D(QGraphicsShaderEffect); @@ -256,13 +256,13 @@ void QGraphicsShaderEffect::draw(QPainter *painter, QGraphicsEffectSource *sourc bool usingShader = d->customShaderStage->setOnPainter(painter); QPoint offset; - if (source->isPixmap()) { + if (sourceIsPixmap()) { // No point in drawing in device coordinates (pixmap will be scaled anyways). - const QPixmap pixmap = source->pixmap(Qt::LogicalCoordinates, &offset); + const QPixmap pixmap = sourcePixmap(Qt::LogicalCoordinates, &offset); painter->drawPixmap(offset, pixmap); } else { // Draw pixmap in device coordinates to avoid pixmap scaling. - const QPixmap pixmap = source->pixmap(Qt::DeviceCoordinates, &offset); + const QPixmap pixmap = sourcePixmap(Qt::DeviceCoordinates, &offset); QTransform restoreTransform = painter->worldTransform(); painter->setWorldTransform(QTransform()); painter->drawPixmap(offset, pixmap); @@ -273,7 +273,7 @@ void QGraphicsShaderEffect::draw(QPainter *painter, QGraphicsEffectSource *sourc if (usingShader) d->customShaderStage->removeFromPainter(painter); #else - source->draw(painter); + drawSource(painter); #endif } diff --git a/src/opengl/qgraphicsshadereffect_p.h b/src/opengl/qgraphicsshadereffect_p.h index de7f00c..de65ebb 100644 --- a/src/opengl/qgraphicsshadereffect_p.h +++ b/src/opengl/qgraphicsshadereffect_p.h @@ -76,7 +76,7 @@ public: void setPixelShaderFragment(const QByteArray& code); protected: - void draw(QPainter *painter, QGraphicsEffectSource *source); + void draw(QPainter *painter); void setUniformsDirty(); virtual void setUniforms(QGLShaderProgram *program); diff --git a/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp b/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp index b40cf43..d216924 100644 --- a/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp +++ b/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp @@ -49,6 +49,7 @@ #include #include "../../shared/util.h" +#include //TESTED_CLASS= //TESTED_FILES= @@ -131,16 +132,16 @@ public: int margin() const { return m_margin; } - void draw(QPainter *painter, QGraphicsEffectSource *source) + void draw(QPainter *painter) { ++numRepaints; if (doNothingInDraw) return; - m_source = source; + m_source = source(); m_painter = painter; - m_styleOption = source->styleOption(); + m_styleOption = source()->styleOption(); m_opacity = painter->opacity(); - source->draw(painter); + drawSource(painter); } void sourceChanged(QGraphicsEffect::ChangeFlags flags) -- cgit v0.12 From 47bc34f413d9a0c6efac6ca3eead95eed7da2e40 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 10 Nov 2009 14:17:43 +0100 Subject: My change --- dist/changes-4.6.0 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dist/changes-4.6.0 b/dist/changes-4.6.0 index 7666f69..794e905 100644 --- a/dist/changes-4.6.0 +++ b/dist/changes-4.6.0 @@ -785,6 +785,10 @@ Qt for Windows CE - It is now possible to further specify the kind of custom widget string properties using XML tags. +-uic + + - [260784] Generated code for retranslateUi doesn't cause compiler warnings anymore + - uic3 - [128859] Fixed code generation of QLabel's wordWrap property. -- cgit v0.12 From 092359242623018f3314c76821973778f8eb6b7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Tue, 10 Nov 2009 15:59:31 +0100 Subject: Add my changes to the 4.6.0 changelog --- dist/changes-4.6.0 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dist/changes-4.6.0 b/dist/changes-4.6.0 index 794e905..5b63c16 100644 --- a/dist/changes-4.6.0 +++ b/dist/changes-4.6.0 @@ -751,6 +751,10 @@ Qt for Embedded Linux - [255495] Fix blend function crash on AVR32 +- Fix qconfig configurations + +- Add powerpc mkspec and remove "empty" ppc mkspec + Qt for Windows CE ----------------- - On Windows CE the link time code generation has been disabled by default to -- cgit v0.12 From 60377a2ccb25e8b9b51d1100e7ff1a0bb42b82c6 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Tue, 10 Nov 2009 16:13:48 +0100 Subject: Doc: remove graphics for effects that are no longer in scope. --- doc/src/images/graphicseffect-bloom.png | Bin 79982 -> 0 bytes doc/src/images/graphicseffect-effects.png | Bin 486123 -> 0 bytes doc/src/images/graphicseffect-grayscale.png | Bin 58121 -> 0 bytes doc/src/images/graphicseffect-pixelize.png | Bin 26390 -> 0 bytes doc/src/qt4-intro.qdoc | 8 ++++---- src/gui/effects/qgraphicseffect.cpp | 12 +++++++++++- 6 files changed, 15 insertions(+), 5 deletions(-) delete mode 100644 doc/src/images/graphicseffect-bloom.png delete mode 100644 doc/src/images/graphicseffect-effects.png delete mode 100644 doc/src/images/graphicseffect-grayscale.png delete mode 100644 doc/src/images/graphicseffect-pixelize.png diff --git a/doc/src/images/graphicseffect-bloom.png b/doc/src/images/graphicseffect-bloom.png deleted file mode 100644 index dace7eb..0000000 Binary files a/doc/src/images/graphicseffect-bloom.png and /dev/null differ diff --git a/doc/src/images/graphicseffect-effects.png b/doc/src/images/graphicseffect-effects.png deleted file mode 100644 index 609bef9..0000000 Binary files a/doc/src/images/graphicseffect-effects.png and /dev/null differ diff --git a/doc/src/images/graphicseffect-grayscale.png b/doc/src/images/graphicseffect-grayscale.png deleted file mode 100644 index 8b6e5c6..0000000 Binary files a/doc/src/images/graphicseffect-grayscale.png and /dev/null differ diff --git a/doc/src/images/graphicseffect-pixelize.png b/doc/src/images/graphicseffect-pixelize.png deleted file mode 100644 index 57a0057..0000000 Binary files a/doc/src/images/graphicseffect-pixelize.png and /dev/null differ diff --git a/doc/src/qt4-intro.qdoc b/doc/src/qt4-intro.qdoc index 4911426..8154921 100644 --- a/doc/src/qt4-intro.qdoc +++ b/doc/src/qt4-intro.qdoc @@ -614,13 +614,13 @@ \table \row - \o - \o \img graphicseffect-plain.png - \o + \o{2,1} \img graphicseffect-plain.png \row \o \img graphicseffect-blur.png \o \img graphicseffect-colorize.png - \o \img graphicseffect-bloom.png + \row + \o \img graphicseffect-opacity.png + \o \img graphicseffect-drop-shadow.png \endtable See the QGraphicsEffect class documentation for more information. diff --git a/src/gui/effects/qgraphicseffect.cpp b/src/gui/effects/qgraphicseffect.cpp index 13f42c5..3fca319 100644 --- a/src/gui/effects/qgraphicseffect.cpp +++ b/src/gui/effects/qgraphicseffect.cpp @@ -67,7 +67,17 @@ \o QGraphicsOpacityEffect - renders the item with an opacity \endlist - \img graphicseffect-effects.png + \table + \row + \o{2,1} \img graphicseffect-plain.png + \row + \o \img graphicseffect-blur.png + \o \img graphicseffect-colorize.png + \row + \o \img graphicseffect-opacity.png + \o \img graphicseffect-drop-shadow.png + \endtable + \img graphicseffect-widget.png For more information on how to use each effect, refer to the specific -- cgit v0.12 From ace072c2ae78c7d13ebf60f094319f2b9f5e51db Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Tue, 10 Nov 2009 16:57:47 +0100 Subject: Document change of qdoc3 binary location. Reviewed-by: TrustMe --- dist/changes-4.6.0 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dist/changes-4.6.0 b/dist/changes-4.6.0 index 5b63c16..f7c2b87 100644 --- a/dist/changes-4.6.0 +++ b/dist/changes-4.6.0 @@ -789,7 +789,7 @@ Qt for Windows CE - It is now possible to further specify the kind of custom widget string properties using XML tags. --uic +- uic - [260784] Generated code for retranslateUi doesn't cause compiler warnings anymore @@ -798,8 +798,13 @@ Qt for Windows CE - [128859] Fixed code generation of QLabel's wordWrap property. - lupdate + - Fixed a bug in the java source code parser. +- qdoc3 + + - Changed qdoc3 binary to be in bin/ instead of a platform specific location. + **************************************************************************** * DirectFB * **************************************************************************** -- cgit v0.12 From 2e44d75036c2439a51be45a9691b68199322e80e Mon Sep 17 00:00:00 2001 From: Pierre Rossi Date: Fri, 6 Nov 2009 16:58:15 +0100 Subject: french translation of qt_help --- tools/assistant/translations/qt_help.pro | 3 +- tools/linguist/phrasebooks/french.qph | 20 ++ translations/qt_help_fr.ts | 375 +++++++++++++++++++++++++++++++ 3 files changed, 397 insertions(+), 1 deletion(-) create mode 100644 translations/qt_help_fr.ts diff --git a/tools/assistant/translations/qt_help.pro b/tools/assistant/translations/qt_help.pro index 0133ea4..db54ae6 100644 --- a/tools/assistant/translations/qt_help.pro +++ b/tools/assistant/translations/qt_help.pro @@ -47,4 +47,5 @@ TRANSLATIONS = \ $$TR_DIR/qt_help_pl.ts \ $$TR_DIR/qt_help_ru.ts \ $$TR_DIR/qt_help_zh_CN.ts \ - $$TR_DIR/qt_help_zh_TW.ts + $$TR_DIR/qt_help_zh_TW.ts \ + $$TR_DIR/qt_help_fr.ts diff --git a/tools/linguist/phrasebooks/french.qph b/tools/linguist/phrasebooks/french.qph index 9440345..a34effe 100644 --- a/tools/linguist/phrasebooks/french.qph +++ b/tools/linguist/phrasebooks/french.qph @@ -1346,4 +1346,24 @@ Select All Sélectionner tout + + Cannot create directory: %1 + Impossible de créer le répertoire : %1 + + + &Case sensitive + &Sensible à la casse + + + Whole &words + M&ots complets + + + Title: + Titre : + + + Fonts + Polices + diff --git a/translations/qt_help_fr.ts b/translations/qt_help_fr.ts new file mode 100644 index 0000000..632561a --- /dev/null +++ b/translations/qt_help_fr.ts @@ -0,0 +1,375 @@ + + + + + QCLuceneResultWidget + + + Search Results + Résultats de la recherche + + + + Note: + Note : + + + + The search results may not be complete since the documentation is still being indexed! + Les résultats de la recherche risquent d'être incomplets car l'indexation de la documentation est en cours ! + + + + Your search did not match any documents. + Votre recherche ne correspond à aucun document. + + + + (The reason for this might be that the documentation is still being indexed.) + (Il est possible que cela soit dû au fait que la documentation est en cours d'indexation.) + + + + QHelpCollectionHandler + + + The collection file '%1' is not set up yet! + Le fichier de collection '%1' n'est pas encore paramétré ! + + + + Cannot load sqlite database driver! + driver ? + Chargement du pilote de base de donnée sqlite impossible ! + + + + + Cannot open collection file: %1 + collection ? + Impossible d'ouvrir le fichier collection : %1 + + + + Cannot create tables in file %1! + Impossible de créer les tables dans le fichier : %1! + + + + The collection file '%1' already exists! + Le fichier collection '%1' existe déjà ! + + + + Cannot create directory: %1 + Impossible de créer le répertoire : %1 + + + + Cannot copy collection file: %1 + Impossible de copier le fichier collection : %1 + + + + Unknown filter '%1'! + Filtre '%1' inconnu ! + + + + Cannot register filter %1! + Impossible d'enregistrer le filtre %1 ! + + + + Cannot open documentation file %1! + Impossible d'ouvrir le fichier de documentation %1 ! + + + + Invalid documentation file '%1'! + fichier de documentation invalide : '%1' ! + + + + The namespace %1 was not registered! + L'espace de noms '%1' n'est pas référencé ! + + + + Namespace %1 already exists! + L'espace de noms %1 existe déjà ! + + + + Cannot register namespace '%1'! + Impossible d'enregistrer l'espace de noms '%1' ! + + + + Cannot open database '%1' to optimize! + Impossible d'ouvrir la base de données à optimiser '%1' ! + + + + QHelpDBReader + + + Cannot open database '%1' '%2': %3 + The placeholders are: %1 - The name of the database which cannot be opened %2 - The unique id for the connection %3 - The actual error string + Impossible d'ouvrir la base de données '%1' '%2' : %3 + + + + QHelpEngineCore + + + The specified namespace does not exist! + L'espace de noms spécifié n'existe pas ! + + + + QHelpEngineCorePrivate + + + Cannot open documentation file %1: %2! + Impossible d'ouvrir le fichier de documentation %1 : %2 ! + + + + QHelpGenerator + + + Invalid help data! + Données d'aide invalides ! + + + + No output file name specified! + Aucun nom de fichier de sortie spécifié ! + + + + The file %1 cannot be overwritten! + Le fichier %1 ne peut être écrasé ! + + + + Building up file structure... + Construction de la structure de fichiers en cours… + + + + Cannot open data base file %1! + Impossible d'ouvrir le fichier de base de données %1 ! + + + + Cannot register namespace %1! + Impossible d'enregistrer l'espace de noms %1 ! + + + + Insert custom filters... + Insérer des filtres personnalisés… + + + + Insert help data for filter section (%1 of %2)... + ??? + Insertion des données d'aide pour la section filtre (%1 de %2)… + + + + Documentation successfully generated. + Documentation générée. + + + + Some tables already exist! + Certaines tables existent déjà ! + + + + Cannot create tables! + Impossible de créer les tables ! + + + + Cannot register virtual folder! + Impossible d'enregistrer le dossier virtuel ! + + + + Insert files... + Insertion des fichiers... + + + + The referenced file %1 must be inside or within a subdirectory of (%2). Skipping it. + Le fichier référencé %1 doit être dans le dossier (%2) ou un de ses sous-dossiers. Fichier non pris en compte. + + + + The file %1 does not exist! Skipping it. + Le fichier %1 n'existe pas ! Fichier non pris en compte. + + + + Cannot open file %1! Skipping it. + Impossible d'ouvrir le fichier %1 ! Fichier non pris en compte. + + + + The filter %1 is already registered! + Le filtre %1 est déjà enregistré ! + + + + Cannot register filter %1! + Impossible d'enregistrer le filtre %1 ! + + + + Insert indices... + Insertion des index… + + + + Insert contents... + insertion des contenus… + + + + Cannot insert contents! + Impossible d'insérer les contenus ! + + + + Cannot register contents! + Impossible de référencer les contenus ! + + + + QHelpSearchQueryWidget + + + Search for: + Rechercher : + + + + Previous search + Recherche précédente + + + + Next search + Recherche suivante + + + + Search + Recherche + + + + Advanced search + Recherche avancée + + + + words <B>similar</B> to: + mots <B>semblables</B> à : + + + + <B>without</B> the words: + <B>Sans</B> les mots : + + + + with <B>exact phrase</B>: + avec la <B>phrase exacte</B> : + + + + with <B>all</B> of the words: + Avec <B>tous</B> les mots : + + + + with <B>at least one</B> of the words: + avec <B>au moins un</B> des mots : + + + + QHelpSearchResultWidget + + + 0 - 0 of 0 Hits + 0 - 0 de 0 résultats + + + + QHelpSearchResultWidgetPrivate + + + %1 - %2 of %3 Hits + %1 - %2 de %3 résultats + + + + QObject + + + Untitled + Sans titre + + + + Unknown token. + contexte peu clair... + Identificateur inconnu. + + + + Unknown token. Expected "QtHelpProject"! + Identificateur inconnu. "QtHelpProject" attendu ! + + + + Error in line %1: %2 + Erreur à la ligne %1 : %2 + + + + A virtual folder must not contain a '/' character! + Un dossier virtuel ne doit pas contenir le caractère '/' ! + + + + A namespace must not contain a '/' character! + Un espace de noms ne doit pas contenir le caractère '/' ! + + + + Missing namespace in QtHelpProject. + Espace de noms manquant dans QtHelpProject. + + + + Missing virtual folder in QtHelpProject + Dossier virtuel manquant dans QtHelpProject + + + + Missing attribute in keyword at line %1. + Attribut manquant pour le mot clé à la ligne %1. + + + + The input file %1 could not be opened! + Le fichier source %1 n'a pas pu être ouvert ! + + + -- cgit v0.12 From cfbfbc4a36db8cca70ac00df06f3307cf456e512 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 10 Nov 2009 17:18:33 +0100 Subject: linguist changes --- dist/changes-4.6.0 | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/dist/changes-4.6.0 b/dist/changes-4.6.0 index f7c2b87..d008e88 100644 --- a/dist/changes-4.6.0 +++ b/dist/changes-4.6.0 @@ -797,14 +797,44 @@ Qt for Windows CE - [128859] Fixed code generation of QLabel's wordWrap property. - - lupdate - - - Fixed a bug in the java source code parser. - - qdoc3 - Changed qdoc3 binary to be in bin/ instead of a platform specific location. +- Linguist + + - Linguist GUI: Experimental support for editing multi-length strings + + - lupdate is now again the only tool which can parse program code + + - lupdate + + * Actually guess the target language from the file name + * Make -{source,target}-language actually override values from files + * C++ parser + - Properly support "using namespace", etc. + - Remove the obsolete TRANSLATOR hack relating to "using namespace" + - Support attaching meta data to translatable messages + - Actually use the argument of Q_DECLARE_TR_FUNCTIONS + - Optimizations + - Bug fixes and robustness improvements + + - lrelease + + * Add -markuntranslated option + + - both lupdate & lrelease + + * Accuracy improvements of the qmake .pro file parser + * Support for ID-based translations. Somewhat experimental. + + - lconvert + + * Add --sort-contexts option + * Add --locations option (complementing lupdate) + * Add --no-ui-lines option (complementing lupdate) + + **************************************************************************** * DirectFB * **************************************************************************** -- cgit v0.12 From 6370b79729fd24892e13393e0add2d1940ca0c07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Tue, 10 Nov 2009 15:54:52 +0100 Subject: Added some changes to changes-4.6.0. --- dist/changes-4.6.0 | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/dist/changes-4.6.0 b/dist/changes-4.6.0 index d008e88..54b48fa 100644 --- a/dist/changes-4.6.0 +++ b/dist/changes-4.6.0 @@ -34,6 +34,9 @@ information about a particular change. - QGLShaderProgram, QGLShader * New classes for using shader programs written in the GL Shading Language. + - QGraphicsEffect + * New classes for applying graphics effects to graphics items and widgets. + - Boxes demo ported to use new 3D math and shader program classes. - OpenVG graphics system added. @@ -323,6 +326,8 @@ QtGui * [201649] Added QWidget::previousInFocusChain * [254563] Fixed a crash when setting a focus in a widget tree that contains invisible widgets + * [QTBUG-5012] Fixed uninitialized background when using + QWidget::render with Qt::WA_NoSystemBackground and window opacity set. - QFontEngineQPF * Make alphaMapForGlyph() generate the correct color table for @@ -333,6 +338,11 @@ QtGui * New qt_paint_device_metric() function to replace the friend declarations for window surface classes that need to access metric(). + - QPainter + * [QTBUG-1666] Made QPainter::drawText() respect Qt::TextDontClip flag + also in vertical direction. + * [254658] Improved clipping performance in OpenGL paint engine. + - QPainterPath * [QTBUG-1537] Fixed bug where the points of a rounded rectangle were added in counter-clockwise order instead of clockwise order like other shapes. @@ -588,6 +598,9 @@ Qt for Linux/X11 - Improved EGL integration on X11 (including better visual selection). + - Made Qt::WA_TranslucentBackground work in combination with native + child widgets. + - Support Qt::WA_TranslucentBackground on top-level QGLWidgets on X11, both (EGL & glX). This allows OpenGL (& ES) rendering to semi-transparent widgets if a compositing window manager is running. -- cgit v0.12 From 75715c8e9322f2a144ecd2f0d89751a88287d753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Tue, 10 Nov 2009 17:43:03 +0100 Subject: Removed mention of purged graphics effects from the documentation. --- doc/src/qt4-intro.qdoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/qt4-intro.qdoc b/doc/src/qt4-intro.qdoc index 8154921..2f74451 100644 --- a/doc/src/qt4-intro.qdoc +++ b/doc/src/qt4-intro.qdoc @@ -608,9 +608,9 @@ \section1 Graphics Effects Effects can be used to alter the appearance of UI elements such as - \l{QGraphicsItem}s and \l{QWidget}s. A range of standard effects such - as blurring, colorizing or blooming is provided, and it is possible to - implement custom effects. + \l{QGraphicsItem}s and \l{QWidget}s. A couple of standard effects such + as blurring, colorizing and drop shadow are provided, and it is + possible to implement custom effects. \table \row -- cgit v0.12 From 744f74c9f401734eb84ddba4751e5a54e0efffc8 Mon Sep 17 00:00:00 2001 From: Jedrzej Nowacki Date: Tue, 10 Nov 2009 17:47:59 +0200 Subject: Changelog update Changelog update contains all major changes in QtWebkit, QtScript and brief information about the state machine framework. Reviewed-by: Simon Hausmann --- dist/changes-4.6.0 | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/dist/changes-4.6.0 b/dist/changes-4.6.0 index 54b48fa..06fe500 100644 --- a/dist/changes-4.6.0 +++ b/dist/changes-4.6.0 @@ -51,6 +51,8 @@ information about a particular change. - QAbstractVideoSurface, QVideoFrame * New abstract video output classes. + - New state machine framework added to QtCore + Third party components ---------------------- @@ -197,7 +199,7 @@ QtGui * Cached items are now always invalidated when update() is called. * Added input hints. -- QGraphicsLayout + - QGraphicsLayout * Introduced QGraphicsLayout::addChildLayoutItem() - QGraphicsObject @@ -497,6 +499,11 @@ QtOpenGL - Added lots of OpenGL autotests. +QtScript + * A lot of internal changes and optimizations. + * Improved ECMA script compliance. + * New method, QScriptString::toArrayIndex(), for converting QScriptString to a QtScript array index. + QtSql * [QTBUG-3162] Views for Sql table models should not reset state on failed queries. * [QTBUG-5251] Fix retrieval of SQL 'TIME' information for PostgreSQL. @@ -536,6 +543,35 @@ QtSvg - QSvgPaintEngine * [257052] Changed drawImage() to ignore aspect ratio. +QtWebKit + - Many bug fixes. + + - QWebElement + * New class; introduced to implement DOM like operations on a web page. + + - QWebFrame + * New properties for an URL and a focus management. + * New signals delivering current loading status. + + - QWebInspector + * New class for embedding the WebInspector as a QWidget + + - QWebHistory + * Streaming operators for saving and restoring QWebHistory's state. + + - QWebPage + * New property; preferredContentsSize for setting layout of the page in the viewport. + * New slot; shouldInterruptJavaScript, called when JavaScript program is running too long. + + - QWebSecurityOrigin: + * New functions for defining local URL schemes. + + - QWebSettings + * New options for text encoding, printing shrink factor and off-line web application cache (HTML5). + + - QWebView + * Support for render hints. + QtXml - QDomDocument @@ -1012,6 +1048,9 @@ Qt for Windows CE Animation framework for animation. The hellogl and overpainting examples now compile on OpenGL/ES 1.1. Also common code is factored. +- Changed QWebFrame::setHtml() and setContent() to not affect the back/forward + and the session history. + - qmake no longer adds Qt internal dependencies to the linker when Qt is built in shared mode (not static). This means that applications that made use of platform-specific API may need to adjust the LIBS -- cgit v0.12 From d752092080c4094bb4736108cff95a4b08abd750 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 10 Nov 2009 14:27:24 +0100 Subject: Removed unused public Api from QS60Style QS60Style::setStyleProperty() and QS60Style::styleProperty() were intended as generic property setter/getters, but are not needed anymore. Reviewed-by: Sami Merila modified: src/gui/styles/qs60style.cpp modified: src/gui/styles/qs60style.h modified: src/gui/styles/qs60style_p.h modified: src/gui/styles/qs60style_s60.cpp modified: src/gui/styles/qs60style_simulated.cpp modified: src/s60installs/eabi/QtGuiu.def --- src/gui/styles/qs60style.cpp | 44 ---------------------------------- src/gui/styles/qs60style.h | 4 ---- src/gui/styles/qs60style_p.h | 8 ------- src/gui/styles/qs60style_s60.cpp | 17 ------------- src/gui/styles/qs60style_simulated.cpp | 10 -------- src/s60installs/eabi/QtGuiu.def | 4 ++-- 6 files changed, 2 insertions(+), 85 deletions(-) diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp index b5e92c7..02ffb29 100644 --- a/src/gui/styles/qs60style.cpp +++ b/src/gui/styles/qs60style.cpp @@ -301,32 +301,6 @@ short QS60StylePrivate::pixelMetric(int metric) return returnValue; } -void QS60StylePrivate::setStyleProperty(const char *name, const QVariant &value) -{ - if (name == propertyKeyCurrentlayout) { - static const QStringList layouts = styleProperty(propertyKeyLayouts).toStringList(); - const QString layout = value.toString(); - Q_ASSERT(layouts.contains(layout)); - const int layoutIndex = layouts.indexOf(layout); - setCurrentLayout(layoutIndex); - QApplication::setLayoutDirection(m_layoutHeaders[layoutIndex].mirroring ? Qt::RightToLeft : Qt::LeftToRight); - clearCaches(); - refreshUI(); - } -} - -QVariant QS60StylePrivate::styleProperty(const char *name) const -{ - if (name == propertyKeyLayouts) { - static QStringList layouts; - if (layouts.isEmpty()) - for (int i = 0; i < m_numberOfLayouts; i++) - layouts.append(QLatin1String(m_layoutHeaders[i].layoutName)); - return layouts; - } - return QVariant(); -} - QColor QS60StylePrivate::stateColor(const QColor &color, const QStyleOption *option) { QColor retColor (color); @@ -2873,24 +2847,6 @@ void QS60Style::unpolish(QApplication *application) } /*! - Sets the style property \a name to the \a value. - */ -void QS60Style::setStyleProperty(const char *name, const QVariant &value) -{ - Q_D(QS60Style); - d->setStyleProperty_specific(name, value); -} - -/*! - Returns the value of style property \a name. - */ -QVariant QS60Style::styleProperty(const char *name) const -{ - Q_D(const QS60Style); - return d->styleProperty_specific(name); -} - -/*! \reimp */ bool QS60Style::event(QEvent *e) diff --git a/src/gui/styles/qs60style.h b/src/gui/styles/qs60style.h index ab10792..885ea40 100644 --- a/src/gui/styles/qs60style.h +++ b/src/gui/styles/qs60style.h @@ -79,10 +79,6 @@ public: #ifndef Q_NO_USING_KEYWORD using QCommonStyle::polish; #endif - - void setStyleProperty(const char *name, const QVariant &value); - QVariant styleProperty(const char *name) const; - bool event(QEvent *e); #ifndef Q_WS_S60 diff --git a/src/gui/styles/qs60style_p.h b/src/gui/styles/qs60style_p.h index 46547bf..b9789b9 100644 --- a/src/gui/styles/qs60style_p.h +++ b/src/gui/styles/qs60style_p.h @@ -388,14 +388,6 @@ public: // draws a specific skin part static void drawSkinPart(QS60StyleEnums::SkinParts part, QPainter *painter, const QRect &rect, SkinElementFlags flags = KDefaultSkinElementFlags); - // sets style property - void setStyleProperty(const char *name, const QVariant &value); - // sets specific style property - void setStyleProperty_specific(const char *name, const QVariant &value); - // gets style property - QVariant styleProperty(const char *name) const; - // gets specific style property - QVariant styleProperty_specific(const char *name) const; // gets pixel metrics value static short pixelMetric(int metric); // gets color. 'index' is NOT 0-based. diff --git a/src/gui/styles/qs60style_s60.cpp b/src/gui/styles/qs60style_s60.cpp index c2a207c..b5f2d1c 100644 --- a/src/gui/styles/qs60style_s60.cpp +++ b/src/gui/styles/qs60style_s60.cpp @@ -1014,23 +1014,6 @@ QS60StylePrivate::QS60StylePrivate() setActiveLayout(); } -void QS60StylePrivate::setStyleProperty_specific(const char *name, const QVariant &value) -{ - if (QLatin1String(name) == QLatin1String("foo")) { - // BaR - } else { - setStyleProperty(name, value); - } -} - -QVariant QS60StylePrivate::styleProperty_specific(const char *name) const -{ - if (QLatin1String(name) == QLatin1String("foo")) - return QLatin1String("Bar"); - else - return styleProperty(name); -} - QColor QS60StylePrivate::s60Color(QS60StyleEnums::ColorLists list, int index, const QStyleOption *option) { diff --git a/src/gui/styles/qs60style_simulated.cpp b/src/gui/styles/qs60style_simulated.cpp index 706b4e9..4317483 100644 --- a/src/gui/styles/qs60style_simulated.cpp +++ b/src/gui/styles/qs60style_simulated.cpp @@ -308,16 +308,6 @@ QPixmap QS60StylePrivate::frame(SkinFrameElements frame, const QSize &size, return result; } -void QS60StylePrivate::setStyleProperty_specific(const char *name, const QVariant &value) -{ - setStyleProperty(name, value); -} - -QVariant QS60StylePrivate::styleProperty_specific(const char *name) const -{ - return styleProperty(name); -} - QPixmap QS60StylePrivate::backgroundTexture() { if (!m_background) { diff --git a/src/s60installs/eabi/QtGuiu.def b/src/s60installs/eabi/QtGuiu.def index 5d66fb7..3a46700 100644 --- a/src/s60installs/eabi/QtGuiu.def +++ b/src/s60installs/eabi/QtGuiu.def @@ -7006,7 +7006,7 @@ EXPORTS _ZN9QPolygonFC2ERK8QPolygon @ 7005 NONAME _ZN9QS60Style11qt_metacallEN11QMetaObject4CallEiPPv @ 7006 NONAME _ZN9QS60Style11qt_metacastEPKc @ 7007 NONAME - _ZN9QS60Style16setStylePropertyEPKcRK8QVariant @ 7008 NONAME + _ZN9QS60Style16setStylePropertyEPKcRK8QVariant @ 7008 NONAME ABSENT _ZN9QS60Style16staticMetaObjectE @ 7009 NONAME DATA 16 _ZN9QS60Style19getStaticMetaObjectEv @ 7010 NONAME _ZN9QS60Style5eventEP6QEvent @ 7011 NONAME @@ -10445,7 +10445,7 @@ EXPORTS _ZNK9QS60Style11drawControlEN6QStyle14ControlElementEPK12QStyleOptionP8QPainterPK7QWidget @ 10444 NONAME _ZNK9QS60Style11pixelMetricEN6QStyle11PixelMetricEPK12QStyleOptionPK7QWidget @ 10445 NONAME _ZNK9QS60Style13drawPrimitiveEN6QStyle16PrimitiveElementEPK12QStyleOptionP8QPainterPK7QWidget @ 10446 NONAME - _ZNK9QS60Style13stylePropertyEPKc @ 10447 NONAME + _ZNK9QS60Style13stylePropertyEPKc @ 10447 NONAME ABSENT _ZNK9QS60Style14subControlRectEN6QStyle14ComplexControlEPK19QStyleOptionComplexNS0_10SubControlEPK7QWidget @ 10448 NONAME _ZNK9QS60Style14subElementRectEN6QStyle10SubElementEPK12QStyleOptionPK7QWidget @ 10449 NONAME _ZNK9QS60Style16sizeFromContentsEN6QStyle12ContentsTypeEPK12QStyleOptionRK5QSizePK7QWidget @ 10450 NONAME -- cgit v0.12 From 7005ca9f0f6b1e535ad2b26d3fcf46dffacc3f13 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 10 Nov 2009 18:08:21 +0100 Subject: Qt covers BC break in Symbian Workaround: fntstore.h has an inlined function 'COpenFont* CBitmapFont::OpenFont()' that returns a private data member. The header will change between minor SDK versions, thus break BC. But Qt has to build on any SDK version and run on other versions of Symbian OS. Also Qt does not want to deliver that BC to Qt based apps. This hack performs the needed pointer arithmetic to get the right COpenFont* pointer, no matter if the 'Flexible Memory Model' is already supported or not. The author is not proud of this commit. Task-number: QT-2250 Reviewed-by: Iain Reviewed-by: Shane Kearns modified: src/gui/text/qfontdatabase_s60.cpp --- src/gui/text/qfontdatabase_s60.cpp | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/gui/text/qfontdatabase_s60.cpp b/src/gui/text/qfontdatabase_s60.cpp index 1a6bb11..ca5be0e 100644 --- a/src/gui/text/qfontdatabase_s60.cpp +++ b/src/gui/text/qfontdatabase_s60.cpp @@ -136,6 +136,23 @@ QFontDatabaseS60StoreImplementation::~QFontDatabaseS60StoreImplementation() m_heap->Close(); } +#ifndef FNTSTORE_H_INLINES_SUPPORT_FMM +/* + Workaround: fntstore.h has an inlined function 'COpenFont* CBitmapFont::OpenFont()' + that returns a private data member. The header will change between SDKs. But Qt has + to build on any SDK version and run on other versions of Symbian OS. + This function performs the needed pointer arithmetic to get the right COpenFont* +*/ +COpenFont* OpenFontFromBitmapFont(const CBitmapFont* aBitmapFont) +{ + const TInt offsetIOpenFont = 92; // '_FOFF(CBitmapFont, iOpenFont)' ..if iOpenFont weren't private + const TUint valueIOpenFont = *(TUint*)PtrAdd(aBitmapFont, offsetIOpenFont); + return (valueIOpenFont & 1) ? + (COpenFont*)PtrAdd(aBitmapFont, valueIOpenFont & ~1) : // New behavior: iOpenFont is offset + (COpenFont*)valueIOpenFont; // Old behavior: iOpenFont is pointer +} +#endif // FNTSTORE_H_INLINES_SUPPORT_FMM + const QFontEngineS60Extensions *QFontDatabaseS60StoreImplementation::extension(const QString &typeface) const { if (!m_extensions.contains(typeface)) { @@ -144,8 +161,14 @@ const QFontEngineS60Extensions *QFontDatabaseS60StoreImplementation::extension(c spec.iHeight = 1; const TInt err = m_store->GetNearestFontToDesignHeightInPixels(font, spec); Q_ASSERT(err == KErrNone && font); - CBitmapFont *bitmapFont = static_cast(font); - m_extensions.insert(typeface, new QFontEngineS60Extensions(font, bitmapFont->OpenFont())); + const CBitmapFont *bitmapFont = static_cast(font); + COpenFont *openFont = +#ifdef FNTSTORE_H_INLINES_SUPPORT_FMM + bitmapFont->openFont(); +#else + OpenFontFromBitmapFont(bitmapFont); +#endif // FNTSTORE_H_INLINES_SUPPORT_FMM + m_extensions.insert(typeface, new QFontEngineS60Extensions(font, openFont)); } return m_extensions.value(typeface); } -- cgit v0.12 From f890cb88c75efdc92f513e47ee4df35c87886476 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Tue, 10 Nov 2009 18:58:05 +0100 Subject: qfontcombobox auto test added to tests/auto/auto.pro Reviewed-by: TrustMe --- tests/auto/auto.pro | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index 1ec4c16..46f26f8 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -135,6 +135,7 @@ SUBDIRS += \ qfocusevent \ qfocusframe \ qfont \ + qfontcombobox \ qfontdatabase \ qfontdialog \ qfontmetrics \ -- cgit v0.12