src/hbwidgets/editors/hbsmileyengine_p.cpp
changeset 21 4633027730f5
parent 7 923ff622b8b9
equal deleted inserted replaced
7:923ff622b8b9 21:4633027730f5
    47     QFont f = static_cast<const QTextCharFormat&>(format).font();
    47     QFont f = static_cast<const QTextCharFormat&>(format).font();
    48     QFontMetricsF fm(f);
    48     QFontMetricsF fm(f);
    49 
    49 
    50     // TODO: optimize this
    50     // TODO: optimize this
    51     HbIcon icon = animator->icon();
    51     HbIcon icon = animator->icon();
    52     qreal iconHeight = fm.height() * smiley.scaleFactor;
    52     qreal iconHeight = fm.height() * smiley.engine->smileyScaleFactor();
    53 
    53 
    54     if(icon.height() != iconHeight) {
    54     if(icon.height() != iconHeight) {
    55         icon.setHeight(iconHeight);
    55         icon.setHeight(iconHeight);
    56         animator->setIcon(icon);
    56         animator->setIcon(icon);
    57     }
    57     }
   133     cleanUp();
   133     cleanUp();
   134 }
   134 }
   135 
   135 
   136 void HbSmileyEnginePrivate::insertSmiley( QTextCursor cursor, const QString& name)
   136 void HbSmileyEnginePrivate::insertSmiley( QTextCursor cursor, const QString& name)
   137 {
   137 {
       
   138     Q_Q(HbSmileyEngine);
   138     QTextCharFormat hbiconFormat;
   139     QTextCharFormat hbiconFormat;
   139     QTextCursor *tmpCursor = new QTextCursor(cursor);
   140     QTextCursor *tmpCursor = new QTextCursor(cursor);
   140     hbiconFormat.setObjectType(HbIconTextFormat);
   141     hbiconFormat.setObjectType(HbIconTextFormat);
   141 
   142 
   142     HbSmileyDataType smiley;
   143     HbSmileyDataType smiley;
   143     HbIconAnimator *animator = lookupAnimator(name);
   144     HbIconAnimator *animator = lookupAnimator(name);
   144     smiley.cursor = tmpCursor;
   145     smiley.cursor = tmpCursor;
   145     smiley.animator = animator;
   146     smiley.animator = animator;
   146     smiley.scaleFactor = mScaleFactor;
   147     smiley.engine = q;
   147 
   148 
   148     hbiconFormat.setProperty(HbIconTextObject::HbSmileyData, qVariantFromValue(smiley));
   149     hbiconFormat.setProperty(HbIconTextObject::HbSmileyData, qVariantFromValue(smiley));
   149 
   150 
   150     mEdited = false;
   151     mEdited = false;
   151     tmpCursor->insertText(QString(QChar::ObjectReplacementCharacter), hbiconFormat);
   152     tmpCursor->insertText(QString(QChar::ObjectReplacementCharacter), hbiconFormat);
   158 void HbSmileyEnginePrivate::insertSmileys( QTextCursor cursor, bool insertOne)
   159 void HbSmileyEnginePrivate::insertSmileys( QTextCursor cursor, bool insertOne)
   159 {
   160 {
   160     QTextCursor initialCursor = cursor;
   161     QTextCursor initialCursor = cursor;
   161     initialCursor.beginEditBlock();
   162     initialCursor.beginEditBlock();
   162 
   163 
   163     QString regexpStr;
   164     const QRegExp &rx = mSmileyTheme.regExp();
   164     foreach (QString pattern, mSmileyTheme.patterns()) {
   165 
   165         regexpStr += QRegExp::escape(pattern) + "|";
       
   166     }
       
   167     regexpStr.remove(regexpStr.count()-1, 1);
       
   168 
       
   169     QRegExp rx(regexpStr);
       
   170     cursor = mDocument->find(rx, cursor);
   166     cursor = mDocument->find(rx, cursor);
   171     while ( !cursor.isNull()){
   167     while ( !cursor.isNull()){
   172         insertSmiley(cursor, mSmileyTheme.smiley(cursor.selectedText()));
   168         insertSmiley(cursor, mSmileyTheme.smiley(cursor.selectedText()));
   173         if (insertOne) {
   169         if (insertOne) {
   174             break;
   170             break;
   251 void HbSmileyEnginePrivate::_q_animationProgressed()
   247 void HbSmileyEnginePrivate::_q_animationProgressed()
   252 {
   248 {
   253     Q_Q(HbSmileyEngine);
   249     Q_Q(HbSmileyEngine);
   254     HbIconAnimator *animator = qobject_cast<HbIconAnimator *>(q->sender());
   250     HbIconAnimator *animator = qobject_cast<HbIconAnimator *>(q->sender());
   255     Q_ASSERT(animator);
   251     Q_ASSERT(animator);
   256 
   252     q->updateSmileys(mAnimatorToCursors.value(animator));
   257     foreach(QTextCursor *cursor, mAnimatorToCursors.value(animator)) {
       
   258         QTextCursor tmpCursor(*cursor);
       
   259         tmpCursor.setPosition(tmpCursor.position()+1, QTextCursor::KeepAnchor);
       
   260 
       
   261         // update a bogus property, which will trigger a paint
       
   262         QTextCharFormat format;
       
   263         format.setProperty(HbIconTextObject::HbSmileyData+1, QString("Dummy"));
       
   264         mEdited = false;
       
   265         tmpCursor.mergeCharFormat(format);
       
   266         mEdited = true;
       
   267     }
       
   268 }
   253 }
   269 
   254 
   270 void HbSmileyEnginePrivate::_q_documentContentsChanged(int position, int charsRemoved, int charsAdded)
   255 void HbSmileyEnginePrivate::_q_documentContentsChanged(int position, int charsRemoved, int charsAdded)
   271 {
   256 {
   272     Q_UNUSED(position);
   257     Q_UNUSED(position);
   361 
   346 
   362 void HbSmileyEngine::setSmileyScaleFactor(qreal scaleFactor)
   347 void HbSmileyEngine::setSmileyScaleFactor(qreal scaleFactor)
   363 {
   348 {
   364     Q_D(HbSmileyEngine);
   349     Q_D(HbSmileyEngine);
   365     if (d->mScaleFactor != scaleFactor) {
   350     if (d->mScaleFactor != scaleFactor) {
   366         // Note: it is assumed that the scale factor is not changed on the fly hence we do not need to redraw the smileyes.
       
   367         d->mScaleFactor = scaleFactor;
   351         d->mScaleFactor = scaleFactor;
   368     }
   352         updateSmileys(d->mCursorToAnimator.keys());
       
   353     }
       
   354 }
       
   355 
       
   356 qreal HbSmileyEngine::smileyScaleFactor() const
       
   357 {
       
   358     Q_D(const HbSmileyEngine);
       
   359     return d->mScaleFactor;
   369 }
   360 }
   370 
   361 
   371 void HbSmileyEngine::startAnimation()
   362 void HbSmileyEngine::startAnimation()
   372 {
   363 {
   373     Q_D(HbSmileyEngine);
   364     Q_D(HbSmileyEngine);
   402 {
   393 {
   403     Q_D(HbSmileyEngine);
   394     Q_D(HbSmileyEngine);
   404     d->insertSmileys(cursor,true);
   395     d->insertSmileys(cursor,true);
   405 }
   396 }
   406 
   397 
       
   398 void HbSmileyEngine::updateSmileys(QList<QTextCursor*> cursors)
       
   399 {
       
   400     Q_D(HbSmileyEngine);
       
   401 
       
   402     if(cursors.isEmpty()) {
       
   403         return;
       
   404     }
       
   405 
       
   406     QTextCursor* initialCursor = cursors.first();
       
   407     initialCursor->beginEditBlock();
       
   408 
       
   409     foreach(QTextCursor *cursor, cursors) {
       
   410         QTextCursor tmpCursor(*cursor);
       
   411         tmpCursor.setPosition(tmpCursor.position()+1, QTextCursor::KeepAnchor);
       
   412 
       
   413         // update a bogus property, which will trigger a paint
       
   414         QTextCharFormat format;
       
   415         format.setProperty(HbIconTextObject::HbSmileyData+1, QString("Dummy"));
       
   416         d->mEdited = false;
       
   417         tmpCursor.mergeCharFormat(format);
       
   418         d->mEdited = true;
       
   419     }
       
   420     initialCursor->endEditBlock();
       
   421 }
       
   422 
   407 #include "moc_hbsmileyengine_p.cpp"
   423 #include "moc_hbsmileyengine_p.cpp"