phonebookui/pbkcommonui/src/cntcontactcarddatacontainer.cpp
changeset 27 de1630741fbe
parent 25 76a2435edfd4
child 31 2a11b5b00470
--- a/phonebookui/pbkcommonui/src/cntcontactcarddatacontainer.cpp	Fri Apr 16 14:53:18 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntcontactcarddatacontainer.cpp	Mon May 03 12:24:20 2010 +0300
@@ -16,10 +16,13 @@
 */
 
 #include "cntcontactcarddatacontainer.h"
+#include "cntcontactcarddataitem.h"
 #include <cntmaptileservice.h> //For fetching maptile
 
+#include <QPainter>
 #include <qtcontacts.h>
 #include <hbicon.h>
+#include <cntviewparams.h>
 
 #include "cntstringmapper.h"
 
@@ -29,17 +32,13 @@
 CntContactCardDataContainer::CntContactCardDataContainer(QContact* contact, QObject *parent) : mContact(contact), mSeparatorIndex(-1)
 {
     Q_UNUSED(parent);
-    mDataPointer = new CntContactCardContainerData;
-    //Non standard types needs to be registered before they can be used by QVariant
-    qRegisterMetaType<QContactDetail>();
-    
     if (contact->type() == QContactType::TypeGroup)
     {
         initializeGroupData();
     }
     else
     {
-        initializeData();
+        initializeActionsData();
         initializeDetailsData();
     }
 }
@@ -49,13 +48,16 @@
 */
 CntContactCardDataContainer::~CntContactCardDataContainer()
 {
-
+    while (!mDataItemList.isEmpty())
+    {
+        delete mDataItemList.takeFirst();
+    }
 }
 
 /*!
 Initialize contact details which include actions.
 */
-void CntContactCardDataContainer::initializeData()
+void CntContactCardDataContainer::initializeActionsData()
 {
     QList<QContactActionDescriptor> actionDescriptors = mContact->availableActions();
     QStringList availableActions;
@@ -66,54 +68,57 @@
 
     QList<QContactDetail> details = mContact->details();
     for (int i = 0; i < details.count(); i++)
-    {
-        QString context;
-        if (details[i].contexts().count())
-        {
-            context = mStringMapper.getMappedDetail(details[i].contexts().at(0));
-        }
-        
+    { 
         if (availableActions.contains("call", Qt::CaseInsensitive) && supportsDetail("call", details[i]) && details[i].definitionName() == QContactPhoneNumber::DefinitionName)
         {
             QContactPhoneNumber number(details.at(i));
-            QVariantList dataList;
-            //type
-            dataList.append("call");
-            //name
-            QStringList list;
-            list << mStringMapper.getMappedDetail(number.subTypes().at(0)) << context;
-            QString name = list.join(" ");
-            dataList.append(qtTrId("Call %1").arg(name.trimmed()));
-            //data
-            dataList.append(number.number());
-            //icon
-            dataList.append(mStringMapper.getMappedLauncherIcon(number.subTypes().at(0)));
-            //detail
-            QContactDetail detail(number);
-            QVariant var;
-            var.setValue(detail);
-            dataList.append(var);
-            mDataPointer->mDataList.insert(rowCount(), dataList);
+            QString title;
+            QString icon;
+            if (!number.contexts().isEmpty())
+            {
+                title = mStringMapper.getContactCardListLocString(number.subTypes().first(), number.contexts().first());
+                icon = mStringMapper.getContactCardIconString(number.subTypes().first(), number.contexts().first());
+            }
+            else
+            {
+                title = mStringMapper.getContactCardListLocString(number.subTypes().first(), QString());
+                icon = mStringMapper.getContactCardIconString(number.subTypes().first(), QString());
+            }
+             
+            CntContactCardDataItem* dataItem = new CntContactCardDataItem(title, true);
+            dataItem->setAction("call");
+            dataItem->setValueText(number.number());
+            dataItem->setIcon(HbIcon(icon));
+            dataItem->setContactDetail(number);
+            mDataItemList.insert(itemCount(), dataItem);
         }
        
        if (availableActions.contains("message", Qt::CaseInsensitive) && supportsDetail("message", details[i]) && details[i].definitionName() == QContactPhoneNumber::DefinitionName)
        {
            QContactPhoneNumber number(details.at(i));
-           QVariantList dataList;
-           //type
-           dataList.append("message");
-           //name
-           dataList.append(hbTrId("txt_phob_menu_send_message"));
-           //data
-           dataList.append(number.number());
-           //icon
-           dataList.append("qtg_large_message");
-           //detail
-           QContactDetail detail(number);
-           QVariant var;
-           var.setValue(detail);
-           dataList.append(var);
-           mDataPointer->mDataList.insert(rowCount(), dataList);
+           CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_send_message"), true);
+           dataItem->setAction("message");
+           dataItem->setValueText(number.number());
+           QString icon;
+           if (number.contexts().isEmpty())
+           {
+               icon = "qtg_large_message";
+           }
+           else if (number.contexts().first() == QContactDetail::ContextHome)
+           {
+               icon = "qtg_large_message_home";
+           }
+           else if (number.contexts().first() == QContactDetail::ContextWork)
+           {
+               icon = "qtg_large_message_work";
+           }
+           else
+           {
+               icon = "qtg_large_message";
+           }
+           dataItem->setIcon(HbIcon(icon));
+           dataItem->setContactDetail(number);
+           mDataItemList.insert(itemCount(), dataItem);
        }    
     }
     
@@ -122,33 +127,29 @@
     {
         QList<QContactDetail> details = actionDetails("email", *mContact);
         for (int i = 0; i < details.count(); i++)
-        {
-            QString context;
-            if (details[i].contexts().count())
-            {
-                context = mStringMapper.getMappedDetail(details[i].contexts().at(0));
-            }
-            
+        {   
             if (details[i].definitionName() == QContactEmailAddress::DefinitionName)
             {
                 QContactEmailAddress email(details.at(i));
-                QVariantList dataList;
-                //action
-                dataList.append("email");
-                //name
-                QStringList list;
-                list << mStringMapper.getMappedDetail(email.definitionName()) << context;
-                dataList.append(qtTrId("Mail %1").arg(list.join(" ").trimmed()));
-                //data
-                dataList.append(email.emailAddress());
-                //icon
-                dataList.append("qtg_large_email");
-                //detail
-                QContactDetail detail(email);
-                QVariant var;
-                var.setValue(detail);
-                dataList.append(var);
-                mDataPointer->mDataList.insert(rowCount(), dataList);
+                QString title;
+                QString icon;
+                if (!email.contexts().isEmpty())
+                {
+                    title = mStringMapper.getContactCardListLocString(email.definitionName(), email.contexts().first());
+                    icon = mStringMapper.getContactCardIconString(email.definitionName(), email.contexts().first());
+                }
+                else
+                {
+                    title = mStringMapper.getContactCardListLocString(email.definitionName(), QString());
+                    icon = mStringMapper.getContactCardIconString(email.definitionName(), QString());
+                }
+                 
+                CntContactCardDataItem* dataItem = new CntContactCardDataItem(title, true);
+                dataItem->setAction("email");
+                dataItem->setValueText(email.emailAddress(), Qt::ElideLeft);
+                dataItem->setIcon(HbIcon(icon));
+                dataItem->setContactDetail(email);
+                mDataItemList.insert(itemCount(), dataItem);
             }
         }
     }
@@ -160,60 +161,34 @@
 void CntContactCardDataContainer::initializeGroupData()
 {
     // get the conference number
+    QContactPhoneNumber confCallNumber = mContact->detail<QContactPhoneNumber>();
     
-    QContactPhoneNumber confCallNumber = mContact->detail<QContactPhoneNumber>();
-        
-    QVariantList callDataList;
-    //type
-    callDataList.append("call");
-    //name
-    callDataList.append(hbTrId("txt_phob_dblist_conference_call"));
-    //data
-    callDataList.append(confCallNumber.number());
-    //icon
-    callDataList.append("qtg_large_call_group");
-    //detail
-    QContactDetail detail(confCallNumber);
-    QVariant var;
-    var.setValue(detail);
-    callDataList.append(var);
-    if(confCallNumber.number() != NULL)
-        {
-        mDataPointer->mDataList.insert(rowCount(), callDataList);
-        }
+    //call
+    if (confCallNumber.number() != NULL)
+    {
+        CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_conference_call"), true);
+        dataItem->setAction("call");
+        dataItem->setValueText(confCallNumber.number());
+        dataItem->setIcon(HbIcon("qtg_large_call_group"));
+        dataItem->setContactDetail(confCallNumber);  
+        mDataItemList.insert(itemCount(), dataItem);
+    }
     
-    QVariantList messageDataList;
-    //type
-    messageDataList.append("message");
-    //name
-    messageDataList.append(hbTrId("txt_phob_list_send_group_message"));
-    //data
-    messageDataList.append(confCallNumber.number());
-    //icon
-    messageDataList.append("qtg_large_message");
-    //detail
-    QContactDetail messageDetail(confCallNumber);
-    QVariant messageVar;
-    messageVar.setValue(messageDetail);
-    messageDataList.append(messageVar);
-    mDataPointer->mDataList.insert(rowCount(), messageDataList);
+    //message
+    CntContactCardDataItem* dataMessageItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_send_val_members"), true);
+    dataMessageItem->setAction("message");
+    dataMessageItem->setValueText(confCallNumber.number());
+    dataMessageItem->setIcon(HbIcon("qtg_large_message"));
+    dataMessageItem->setContactDetail(confCallNumber);  
+    mDataItemList.insert(itemCount(), dataMessageItem);
     
-    QVariantList emailDataList;
-    //type
-    emailDataList.append("email");
-    //name
-    emailDataList.append(hbTrId("txt_phob_list_send_group_mail"));
-    //data
-    emailDataList.append(confCallNumber.number());
-    //icon
-    emailDataList.append("qtg_large_email");
-    //detail
-    QContactDetail emailDetail(confCallNumber);
-    QVariant emailVar;
-    emailVar.setValue(emailDetail);
-    emailDataList.append(emailVar);
-    mDataPointer->mDataList.insert(rowCount(), emailDataList);
-  
+    //email
+    CntContactCardDataItem* dataEmailItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_email"), true);
+    dataEmailItem->setAction("email");
+    dataEmailItem->setValueText(confCallNumber.number());
+    dataEmailItem->setIcon(HbIcon("qtg_large_email"));
+    dataEmailItem->setContactDetail(confCallNumber);  
+    mDataItemList.insert(itemCount(), dataEmailItem);
 }
 
 /*!
@@ -232,28 +207,27 @@
         sourceAddressType = CntMapTileService::AddressPreference;
         QVariantList addressList;
         //no action
-        addressList.append(QString());
+        QString title;
         if (addressDetails[i].contexts().isEmpty())
         {
-            addressList.append(hbTrId("txt_phob_formlabel_address"));
+            title = hbTrId("txt_phob_formlabel_address");
         }
         else
         {
             if ( addressDetails[i].contexts().at(0) == contextHome )
             {
                 sourceAddressType = CntMapTileService::AddressHome;
-                addressList.append(hbTrId("txt_phob_formlabel_address_home"));
+                title = hbTrId("txt_phob_formlabel_address_home");
             }
             else if (addressDetails[i].contexts().at(0) == contextWork)
             {
                 sourceAddressType = CntMapTileService::AddressWork;
-                addressList.append(hbTrId("txt_phob_formlabel_address_work"));
+                title = hbTrId("txt_phob_formlabel_address_work");
             }
         }
-        QStringList address;
+        CntContactCardDataItem* dataItem = new CntContactCardDataItem(title, false);
         
-        if (!addressDetails[i].postOfficeBox().isEmpty())
-            address.append(addressDetails[i].postOfficeBox());
+        QStringList address;
         if (!addressDetails[i].street().isEmpty())
             address.append(addressDetails[i].street());
         if (!addressDetails[i].postcode().isEmpty())
@@ -264,21 +238,16 @@
             address.append(addressDetails[i].region());
         if (!addressDetails[i].country().isEmpty())
             address.append(addressDetails[i].country());
+                
+        dataItem->setValueText(address.join(" "));
+        dataItem->setContactDetail(addressDetails[i]);
+        addSeparator(itemCount());
+        mDataItemList.insert(itemCount(), dataItem);
         
-        addressList.append(address.join(" "));
-        //no icon
-        addressList.append(QString());
-        //detail
-        QContactDetail detail(addressDetails[i]);
-        QVariant var;
-        var.setValue(detail);
-        addressList.append(var);
-        addSeparator(rowCount());
-        mDataPointer->mDataList.insert(rowCount(), addressList);
         //Check whether location feature enabled
         if (mLocationFeatureEnabled)
         {
-            TUint32 contactId = mContact->id().localId();
+            QContactLocalId contactId = mContact->id().localId();
          
             //Get the maptile image path
             QString imageFile = CntMapTileService::getMapTileImage(contactId, sourceAddressType);
@@ -291,9 +260,26 @@
                 maptileImage.append(QString(" "));
                 maptileImage.append(QString(" "));
     
-                maptileImage.append( imageFile );
-                addSeparator(rowCount());
-                mDataPointer->mDataList.insert(rowCount(), maptileImage);
+                //Display the maptile image
+                HbIcon icon(imageFile);
+                QIcon mapTileIcon;
+                
+                QPainter painter;
+                QPixmap baloon(":/icons/pin.png");                
+                QPixmap map(icon.pixmap());
+
+                //Display pin image in the center of maptile image
+                painter.begin(&map);
+                painter.drawPixmap((map.width()/2), 
+                               ((map.height()/2)-(baloon.height())), baloon);
+                painter.end();
+                mapTileIcon.addPixmap(map);
+                                
+                addSeparator(itemCount());
+                
+                CntContactCardDataItem* dataItem = new CntContactCardDataItem(QString(), false);
+                dataItem->setIcon(HbIcon(mapTileIcon));
+                mDataItemList.insert(itemCount(), dataItem);
 		    }
         }
     } 
@@ -302,62 +288,35 @@
     QList<QContactBirthday> birthdayDetails = mContact->details<QContactBirthday>();
     for (int i = 0; i < birthdayDetails.count(); i++)
     {
-        QVariantList dateList;
-        //no action
-        dateList.append(QString());
-        dateList.append(hbTrId("txt_phob_formlabel_birthday"));
-        dateList.append(birthdayDetails[i].date().toString("dd MMMM yyyy"));
-        //no icon
-        dateList.append(QString());
-        //detail
-        QContactDetail detail(birthdayDetails[i]);
-        QVariant var;
-        var.setValue(detail);
-        dateList.append(var);
-        addSeparator(rowCount());
-        mDataPointer->mDataList.insert(rowCount(), dateList);
+        CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_birthday"), false);
+        dataItem->setValueText(birthdayDetails[i].date().toString("dd MMMM yyyy"));
+        dataItem->setContactDetail(birthdayDetails[i]);  
+        addSeparator(itemCount());
+        mDataItemList.insert(itemCount(), dataItem);
     }
 
     //anniversary
     QList<QContactAnniversary> anniversaryDetails = mContact->details<QContactAnniversary>();
     for (int i = 0; i < anniversaryDetails.count(); i++)
     {
-        QVariantList dateList;
-        //no action
-        dateList.append(QString());
-        dateList.append(hbTrId("txt_phob_formlabel_anniversary"));
-        dateList.append(anniversaryDetails[i].originalDate().toString("dd MMMM yyyy"));
-        //no icon
-        dateList.append(QString());
-        //detail
-        QContactDetail detail(anniversaryDetails[i]);
-        QVariant var;
-        var.setValue(detail);
-        dateList.append(var);
-        addSeparator(rowCount());
-        mDataPointer->mDataList.insert(rowCount(), dateList);
+        CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_anniversary"), false);
+        dataItem->setValueText(anniversaryDetails[i].originalDate().toString("dd MMMM yyyy"));
+        dataItem->setContactDetail(anniversaryDetails[i]);  
+        addSeparator(itemCount());
+        mDataItemList.insert(itemCount(), dataItem);
     }
     
     //ringing tone
-    QList<QContactAvatar> ringtoneDetails = mContact->details<QContactAvatar>();
+    QList<QContactRingtone> ringtoneDetails = mContact->details<QContactRingtone>();
     for (int i = 0; i < ringtoneDetails.count(); i++)
     {
-        if (ringtoneDetails.at(i).subType() == QContactAvatar::SubTypeAudioRingtone)
+        if (!ringtoneDetails.at(i).audioRingtoneUrl().isEmpty())
         {
-            QVariantList dataList;
-            //no action
-            dataList.append(QString());
-            dataList.append(hbTrId("txt_phob_formlabel_ringing_tone"));
-            dataList.append(ringtoneDetails[i].avatar());
-            //no icon
-            dataList.append(QString());
-            //detail
-            QContactDetail detail(ringtoneDetails[i]);
-            QVariant var;
-            var.setValue(detail);
-            dataList.append(var);
-            addSeparator(rowCount());
-            mDataPointer->mDataList.insert(rowCount(), dataList);
+            CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_ringing_tone"), false);
+            dataItem->setValueText(ringtoneDetails[i].audioRingtoneUrl().toString());
+            dataItem->setContactDetail(ringtoneDetails[i]);  
+            addSeparator(itemCount());
+            mDataItemList.insert(itemCount(), dataItem);
             break;
         }
     }
@@ -366,57 +325,28 @@
     QList<QContactNote> noteDetails = mContact->details<QContactNote>();
     for (int i = 0; i < noteDetails.count(); i++)
     {
-        QVariantList noteList;
-        //no action
-        noteList.append(QString());
-        noteList.append(hbTrId("txt_phob_formlabel_note2"));
-        noteList.append(noteDetails[i].note());
-        //no icon
-        noteList.append(QString());
-        //detail
-        QContactDetail detail(noteDetails[i]);
-        QVariant var;
-        var.setValue(detail);
-        noteList.append(var);
-        addSeparator(rowCount());
-        mDataPointer->mDataList.insert(rowCount(), noteList);
+        CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_note"), false);
+        dataItem->setValueText(noteDetails[i].note());
+        dataItem->setContactDetail(noteDetails[i]);  
+        addSeparator(itemCount());
+        mDataItemList.insert(itemCount(), dataItem);
     }
 
     //family details
     QList<QContactFamily> familyDetails = mContact->details<QContactFamily>();
     for (int i = 0; i < familyDetails.count(); i++)
     {
-        // Spouse
-        QVariantList spouseList;
-        //no action
-        spouseList.append(QString());
-        spouseList.append(hbTrId("txt_phob_formlabel_spouse"));
-        spouseList.append(familyDetails[i].spouse());
-        //no icon
-        spouseList.append(QString());
-        //detail
-        QContactDetail spouseDetail(familyDetails[i]);
-        QVariant varSpouse;
-        varSpouse.setValue(spouseDetail);
-        spouseList.append(varSpouse);
-        addSeparator(rowCount());
-        mDataPointer->mDataList.insert(rowCount(), spouseList);
-
-        // Children
-        QVariantList childrenList;
-        //no action
-        childrenList.append(QString());
-        childrenList.append(hbTrId("txt_phob_formlabel_children"));
-        childrenList.append(familyDetails[i].children().join(", "));
-        //no icon
-        childrenList.append(QString());
-        //detail
-        QContactDetail childrenDetail(familyDetails[i]);
-        QVariant varChild;
-        varChild.setValue(childrenDetail);
-        childrenList.append(varChild);
-        addSeparator(rowCount());
-        mDataPointer->mDataList.insert(rowCount(), childrenList);
+        CntContactCardDataItem* dataSpouseItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_spouse"), false);
+        dataSpouseItem->setValueText(familyDetails[i].spouse());
+        dataSpouseItem->setContactDetail(familyDetails[i]);  
+        addSeparator(itemCount());
+        mDataItemList.insert(itemCount(), dataSpouseItem);
+        
+        CntContactCardDataItem* dataChildrenItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_children"), false);
+        dataChildrenItem->setValueText(familyDetails[i].children().join(", "));
+        dataChildrenItem->setContactDetail(familyDetails[i]);  
+        addSeparator(itemCount());
+        mDataItemList.insert(itemCount(), dataChildrenItem);
     }
 }
 
@@ -426,9 +356,9 @@
 bool CntContactCardDataContainer::supportsDetail(const QString &actionName, const QContactDetail &contactDetail)
 {    
     QList<QContactActionDescriptor> actionDescriptors = QContactAction::actionDescriptors(actionName, "symbian");
-    QContactAction* contactAction = QContactAction::action(actionDescriptors.at(0));
+    QContactAction* contactAction = QContactAction::action(actionDescriptors.first());
     
-    bool isSupportDetail = contactAction->supportsDetail(contactDetail);
+    bool isSupportDetail = contactAction->isDetailSupported(contactDetail);
     
     delete contactAction;
     
@@ -441,7 +371,7 @@
 QList<QContactDetail> CntContactCardDataContainer::actionDetails(const QString &actionName, const QContact &contact)
 {
     QList<QContactActionDescriptor> actionDescriptors = QContactAction::actionDescriptors(actionName, "symbian");
-    QContactAction* contactAction = QContactAction::action(actionDescriptors.at(0));
+    QContactAction* contactAction = QContactAction::action(actionDescriptors.first());
 
     QList<QContactDetail> details = contactAction->supportedDetails(contact);
 
@@ -451,64 +381,18 @@
 }
 
 /*!
-Returns the data for the given index with a role
+Returns the data for the given index
 */
-QVariant CntContactCardDataContainer::data(int index, int role) const
+CntContactCardDataItem* CntContactCardDataContainer::dataItem(int index) const
 {
     if (index < 0)
-        return QVariant();
-    
-    QVariantList values = mDataPointer->mDataList.at(index);
-    
-    if (index == mSeparatorIndex)
     {
-         if (role == Qt::DisplayRole)
-         {
-             return QVariant(values[action].toString());
-         }
-         return QVariant();
-    }
-    
-    if (role == Qt::DisplayRole)
-    {
-        QStringList list;
-        QString field = values[text].toString();
-        if(mContact->isPreferredDetail(values[action].toString(), values[detail].value<QContactDetail>()))
-        {
-            field.prepend("<u>");
-            field.append("</u>");
-        }
-        QString value = values[valueText].toString();
-        list << field << value;
-        
-        return QVariant(list);
+        return NULL;
     }
-     
-    else if (role == Qt::DecorationRole)
+    else
     {
-        if (!values[icon].toString().isEmpty())
-        {
-            QList<QVariant> icons;
-            HbIcon itemIcon(values[icon].toString());
-            icons.append(itemIcon);
-            return QVariant(icons);
-        }
-    }
-    
-    else if (role == Qt::UserRole+1)
-    {
-        //TODO: Find out better solution!!!
-        QMap<QString, QVariant> map;
-      
-        map.insert("action", values[action]);
-        map.insert("name", values[text]);
-        map.insert("data", values[valueText]);
-        map.insert("icon", values[icon]);
-        map.insert("detail", values[detail]);
-        return map;
-    }
-
-    return QVariant();
+        return mDataItemList.at(index);
+    }  
 }
 
 /*!
@@ -519,24 +403,16 @@
     if (mSeparatorIndex == -1)
     {
         mSeparatorIndex = index;
-        QVariantList separatorList;
-        separatorList.append(hbTrId("txt_phob_subtitle_details"));
-        mDataPointer->mDataList.insert(rowCount(), separatorList);
+        CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_subtitle_details"), false);
+        mDataItemList.insert(itemCount(), dataItem);
     }
 }
 
 /*!
-Returns the amount of rows in the container
+Returns the amount of items in the container
 */
-int CntContactCardDataContainer::rowCount() const
+int CntContactCardDataContainer::itemCount() const
 {
-    return mDataPointer->mDataList.count();
+    return mDataItemList.count();
 }
 
-/*!
-Called when a detail is set as preferred, model needs to be refreshed
-*/
-void CntContactCardDataContainer::preferredUpdated()
-{
-    //emit layoutChanged();
-}