[SCM] ktp-contact-list packaging branch, master, updated. debian/15.12.1-2-1070-g6c56f91

Maximiliano Curia maxy at moszumanska.debian.org
Sat May 28 00:05:50 UTC 2016


Gitweb-URL: http://git.debian.org/?p=pkg-kde/applications/ktp-contact-list.git;a=commitdiff;h=40570ba

The following commit has been merged in the master branch:
commit 40570ba07f44933a07d82e3d7ea0449bf666bc2a
Author: Martin Klapetek <martin.klapetek at gmail.com>
Date:   Thu Apr 7 19:14:44 2011 +0200

    Initial avatars support plus KConfig for storing the selected avatar. This will hold all other settings in the future.
---
 CMakeLists.txt          |   1 +
 accounts-model-item.cpp |   5 +-
 main-widget.cpp         | 162 +++++++++++++++++++++++++++++++++++++++++++-----
 main-widget.h           |   7 ++-
 main-widget.ui          |  42 +++++++------
 5 files changed, 179 insertions(+), 38 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 548e8c8..d5f7faf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -51,6 +51,7 @@ kde4_add_executable (telepathy-kde-contactlist
 target_link_libraries (telepathy-kde-contactlist
                        ${TELEPATHY_QT4_LIBRARIES}
                        ${KDE4_KDEUI_LIBS}
+                       ${KDE4_KIO_LIBS}
                        ${KDE4_KCMUTILS_LIBS}
 )
 
diff --git a/accounts-model-item.cpp b/accounts-model-item.cpp
index c96921f..33e4467 100644
--- a/accounts-model-item.cpp
+++ b/accounts-model-item.cpp
@@ -136,7 +136,7 @@ QVariant AccountsModelItem::data(int role) const
     case AccountsModel::IdRole:
         return mPriv->mAccount->uniqueIdentifier();
     case AccountsModel::AvatarRole:
-        return QVariant(); //TODO: Return account icon
+        return QVariant::fromValue(mPriv->mAccount->avatar());
     case AccountsModel::ValidRole:
         return mPriv->mAccount->isValid();
     case AccountsModel::EnabledRole:
@@ -198,6 +198,9 @@ bool AccountsModelItem::setData(int role, const QVariant &value)
     case AccountsModel::NicknameRole:
         setNickname(value.toString());
         return true;
+    case AccountsModel::AvatarRole:
+        mPriv->mAccount->setAvatar(value.value<Tp::Avatar>());
+        return true;
     default:
         return false;
     }
diff --git a/main-widget.cpp b/main-widget.cpp
index 2e049a1..6930a3d 100644
--- a/main-widget.cpp
+++ b/main-widget.cpp
@@ -30,7 +30,7 @@
 #include <QtGui/QPushButton>
 #include <QtGui/QToolButton>
 #include <QtCore/QWeakPointer>
-
+#include <QWidgetAction>
 
 #include <TelepathyQt4/PendingReady>
 #include <TelepathyQt4/PendingChannelRequest>
@@ -44,6 +44,9 @@
 #include <KMenu>
 #include <KMessageBox>
 #include <KSettings/Dialog>
+#include <KSharedConfig>
+#include <KFileDialog>
+#include <KMessageBox>
 
 #include "main-widget.h"
 #include "ui_main-widget.h"
@@ -70,19 +73,22 @@ MainWidget::MainWidget(QWidget *parent)
     m_filterBar->hide();
     setWindowIcon(KIcon("telepathy"));
 
-//     QIcon icon;
-//     icon.addFile(user.faceIconPath());
-//     m_userAccountIconButton->setIcon(icon);
-
     m_userAccountNameLabel->setText(user.property(KUser::FullName).isNull() ?
         user.loginName() : user.property(KUser::FullName).toString()
     );
 
+    m_userAccountIconButton->setPopupMode(QToolButton::InstantPopup);
+
+    m_avatarButtonMenu = new KMenu(m_userAccountIconButton);
+    m_avatarButtonMenu->addAction(i18n("Load from file..."), this, SLOT(loadAvatarFromFile()));
+
+    m_userAccountIconButton->setMenu(m_avatarButtonMenu);
+
     QToolButton *settingsButton = new QToolButton(this);
     settingsButton->setIcon(KIcon("configure"));
     settingsButton->setPopupMode(QToolButton::InstantPopup);
 
-    QMenu *settingsButtonMenu = new QMenu(settingsButton);
+    KMenu *settingsButtonMenu = new KMenu(settingsButton);
     settingsButtonMenu->addAction(i18n("Configure accounts..."), this, SLOT(showSettingsKCM()));
     settingsButtonMenu->addSeparator();
     settingsButtonMenu->addMenu(helpMenu());
@@ -226,17 +232,6 @@ void MainWidget::onAccountManagerReady(Tp::PendingOperation* op)
     m_contactsListView->expandAll();
 }
 
-void MainWidget::onAccountReady(Tp::PendingOperation* op)
-{
-    if (op->isError()) {
-        qWarning() << "Account cannot become ready";
-        return;
-    }
-
-    Tp::PendingReady *pendingReady = qobject_cast<Tp::PendingReady*>(op);
-    Q_ASSERT(pendingReady);
-}
-
 void MainWidget::onAccountConnectionStatusChanged(Tp::ConnectionStatus status)
 {
     kDebug() << "Connection status is" << status;
@@ -280,6 +275,14 @@ void MainWidget::onNewAccountAdded(const Tp::AccountPtr& account)
 
     if(account->isEnabled()) {
         bt->show();
+        loadAvatar(account);
+    }
+
+    KSharedConfigPtr config = KGlobal::config();
+    KConfigGroup avatarGroup(config, "Avatar");
+    if (avatarGroup.readEntry("method", QString()) == QLatin1String("account")) {
+        //this also updates the avatar if it was changed somewhere else
+        selectAvatarFromAccount(avatarGroup.readEntry("source", QString()));
     }
 }
 
@@ -556,6 +559,9 @@ void MainWidget::onCustomContextMenuRequested(const QPoint &)
     /*if (contact->isBlocked()) {
      *        action = menu->addAction(i18n("Unlock User"));
      *        connect(action, SIGNAL(triggered(bool)),
+     T p::Avatar avatar = m_model->data(m_modelFilter->mapToSource(m_modelFilter->index(0, 0)*),
+     AccountsModel::AvatarRole).value<Tp::Avatar>();
+     icon.addPixmap(QPixmap::fromImage(QImage::fromData(avatar.avatarData)).scaled(64, 64));
      *                SLOT(slotUnblockContactTriggered()));
 } else {
     action = menu->addAction(i18n("Block User"));
@@ -727,3 +733,125 @@ void MainWidget::showSettingsKCM()
     dialog->setAttribute(Qt::WA_DeleteOnClose);
     dialog->show();
 }
+
+void MainWidget::loadAvatar(const Tp::AccountPtr &account)
+{
+    if (!account->avatar().avatarData.isEmpty()) {
+        QIcon icon;
+        Tp::Avatar avatar = account->avatar();
+        icon.addPixmap(QPixmap::fromImage(QImage::fromData(avatar.avatarData)).scaled(48, 48));
+
+        QToolButton *avatarButton = new QToolButton(this);
+        avatarButton->setIcon(icon);
+        avatarButton->setIconSize(QSize(48, 48));
+        avatarButton->setText(i18nc("String in menu saying Use avatar from account X",
+                                    "Use from %1").arg(account->displayName()));
+        avatarButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+
+        QWidgetAction *avatarAction = new QWidgetAction(m_avatarButtonMenu);
+        avatarAction->setDefaultWidget(avatarButton);
+        avatarAction->setData(account->uniqueIdentifier());
+
+        connect(avatarButton, SIGNAL(clicked(bool)),
+                avatarAction, SIGNAL(triggered(bool)));
+
+        connect(avatarAction, SIGNAL(triggered(bool)),
+                this, SLOT(selectAvatarFromAccount()));
+
+
+        m_avatarButtonMenu->addAction(avatarAction);
+    }
+}
+
+void MainWidget::selectAvatarFromAccount()
+{
+    selectAvatarFromAccount(qobject_cast<QWidgetAction*>(sender())->data().toString());
+}
+
+void MainWidget::selectAvatarFromAccount(const QString &accountUID)
+{
+    if (accountUID.isEmpty()) {
+        kDebug() << "Supplied accountUID is empty, aborting...";
+        return;
+    }
+
+    Tp::Avatar avatar = qobject_cast<AccountsModelItem*>(m_model->accountItemForId(accountUID))->data(AccountsModel::AvatarRole).value<Tp::Avatar>();
+
+    foreach (Tp::AccountPtr account, m_accountManager->allAccounts()) {
+        //don't set the avatar for the account from where it was taken
+        if (account->uniqueIdentifier() == accountUID) {
+            continue;
+        }
+
+        account->setAvatar(avatar);
+    }
+
+    //add the selected avatar as the icon of avatar button
+    QIcon icon;
+    icon.addPixmap(QPixmap::fromImage(QImage::fromData(avatar.avatarData)).scaled(48, 48));
+    m_userAccountIconButton->setIcon(icon);
+
+    m_avatarButtonMenu->close();
+
+    //save the selected account into config
+    KSharedConfigPtr config = KGlobal::config();
+    KConfigGroup avatarGroup(config, "Avatar");
+    avatarGroup.writeEntry("method", "account");
+    avatarGroup.writeEntry("source", accountUID);
+    avatarGroup.config()->sync();
+
+}
+
+void MainWidget::loadAvatarFromFile()
+{
+    //FIXME: Think of network files, which QFile won't open
+    KUrl file = KFileDialog::getImageOpenUrl();
+
+    if (file.isEmpty() || !file.isValid()) {
+        return;
+    }
+
+    KMimeType::Ptr mime = KMimeType::findByUrl(file);
+
+    if (!mime->name().contains("image/")) {
+        KMessageBox::error(this, i18n("The file you have selected doesn't seem to be an image! \
+                                       Please select an image file."));
+        return;
+    }
+
+    QFile imageBuffer(file.toLocalFile());
+    imageBuffer.open(QIODevice::ReadWrite);
+    if (!imageBuffer.isOpen() || !imageBuffer.isReadable()) {
+        //FIXME: probably should also tell the user what to do, no? but what to do? :)
+        KMessageBox::error(this, i18n("Sorry, the image couldn't be processed."));
+        imageBuffer.close();
+        return;
+    }
+
+    Tp::Avatar avatar;
+    avatar.avatarData = imageBuffer.readAll();
+    avatar.MIMEType = mime->name();
+
+    foreach (Tp::AccountPtr account, m_accountManager->allAccounts()) {
+        Tp::PendingOperation *op = account->setAvatar(avatar);
+
+        //connect for eventual error displaying
+        connect(op, SIGNAL(finished(Tp::PendingOperation*)),
+                this, SLOT(slotGenericOperationFinished(Tp::PendingOperation*)));
+    }
+
+    //add the selected avatar to the avatar button
+    QIcon icon;
+    icon.addPixmap(QPixmap::fromImage(QImage::fromData(avatar.avatarData)).scaled(48, 48));
+    m_userAccountIconButton->setIcon(icon);
+
+    //since all the accounts will have the same avatar,
+    //we take simply the first in AM and use this in config
+    KSharedConfigPtr config = KGlobal::config();
+    KConfigGroup avatarGroup(config, "Avatar");
+    avatarGroup.writeEntry("method", "account");
+    avatarGroup.writeEntry("source", m_accountManager->allAccounts().first()->uniqueIdentifier());
+    avatarGroup.config()->sync();
+
+    imageBuffer.close();
+}
diff --git a/main-widget.h b/main-widget.h
index e310b35..e348883 100644
--- a/main-widget.h
+++ b/main-widget.h
@@ -68,7 +68,6 @@ public Q_SLOTS:
     void startTextChannel(const QModelIndex &index);
     void onContactListDoubleClick(const QModelIndex &index);
     void onConnectionChanged(const Tp::ConnectionPtr &connection);
-    void onAccountReady(Tp::PendingOperation *op);
     void onAccountConnectionStatusChanged(Tp::ConnectionStatus status);
     void showMessageToUser(const QString &text, const SystemMessageType type);
     void addOverlayButtons();
@@ -80,7 +79,10 @@ public Q_SLOTS:
     void showSettingsKCM();
     void onAddContactRequest();
     void onAddContactRequestFoundContacts(Tp::PendingOperation *operation);
-
+    void loadAvatar(const Tp::AccountPtr &account);
+    void selectAvatarFromAccount(const QString &accountUID);
+    void selectAvatarFromAccount();
+    void loadAvatarFromFile();
     //    void startAudioChannel();
     //    void startVideoChannel();
 
@@ -104,6 +106,7 @@ private:
     AccountFilterModel     *m_modelFilter;
     Tp::AccountManagerPtr   m_accountManager;
     KMenu                  *m_accountMenu;
+    KMenu                  *m_avatarButtonMenu;
     KSelectAction          *m_setStatusAction;
     ContactDelegate        *m_delegate;
 };
diff --git a/main-widget.ui b/main-widget.ui
index bc1fb9b..d000b9b 100644
--- a/main-widget.ui
+++ b/main-widget.ui
@@ -23,11 +23,34 @@
     </property>
     <item>
      <layout class="QGridLayout" name="gridLayout">
+      <property name="horizontalSpacing">
+       <number>-1</number>
+      </property>
+      <property name="verticalSpacing">
+       <number>0</number>
+      </property>
       <item row="2" column="1">
        <layout class="QHBoxLayout" name="m_accountButtonsLayout"/>
       </item>
+      <item row="1" column="1">
+       <widget class="KLineEdit" name="m_presenceMessageEdit">
+        <property name="placeholderText">
+         <string>Set your status message here...</string>
+        </property>
+        <property name="showClearButton" stdset="0">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QLabel" name="m_userAccountNameLabel">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
       <item row="0" column="0" rowspan="3">
-       <widget class="QPushButton" name="m_userAccountIconButton">
+       <widget class="QToolButton" name="m_userAccountIconButton">
         <property name="minimumSize">
          <size>
           <width>64</width>
@@ -51,23 +74,6 @@
         </property>
        </widget>
       </item>
-      <item row="1" column="1">
-       <widget class="KLineEdit" name="m_presenceMessageEdit">
-        <property name="placeholderText">
-         <string>Set your status message here...</string>
-        </property>
-        <property name="showClearButton" stdset="0">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="QLabel" name="m_userAccountNameLabel">
-        <property name="text">
-         <string comment="KDE::DoNotExtract">TextLabel</string>
-        </property>
-       </widget>
-      </item>
      </layout>
     </item>
     <item>

-- 
ktp-contact-list packaging



More information about the pkg-kde-commits mailing list