[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