From 62b2de63b7f7b19dab94f5350957dcd72556561d Mon Sep 17 00:00:00 2001 From: thunder2 Date: Mon, 5 Sep 2011 21:19:07 +0000 Subject: [PATCH] Added new widget to display an avatar with or without the status frame - AvatarWidget. Changed all existing avatars to AvatarWidget. git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@4589 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- retroshare-gui/src/RetroShare.pro | 3 + retroshare-gui/src/gui/FriendsDialog.cpp | 60 +--- retroshare-gui/src/gui/FriendsDialog.h | 4 - retroshare-gui/src/gui/FriendsDialog.ui | 26 +- retroshare-gui/src/gui/MessengerWindow.cpp | 48 +-- retroshare-gui/src/gui/MessengerWindow.h | 6 +- retroshare-gui/src/gui/MessengerWindow.ui | 32 +- .../src/gui/chat/PopupChatDialog.cpp | 78 +---- retroshare-gui/src/gui/chat/PopupChatDialog.h | 4 - .../src/gui/chat/PopupChatDialog.ui | 36 +-- .../src/gui/common/AvatarWidget.cpp | 282 ++++++++++++++++++ retroshare-gui/src/gui/common/AvatarWidget.h | 72 +++++ retroshare-gui/src/gui/common/AvatarWidget.ui | 46 +++ .../src/gui/connect/ConfCertDialog.cpp | 28 +- .../src/gui/connect/ConfCertDialog.h | 3 - .../src/gui/connect/ConfCertDialog.ui | 60 ++-- retroshare-gui/src/gui/feeds/ChatMsgItem.cpp | 15 +- retroshare-gui/src/gui/feeds/ChatMsgItem.h | 1 - retroshare-gui/src/gui/feeds/ChatMsgItem.ui | 21 +- retroshare-gui/src/gui/feeds/ForumMsgItem.cpp | 69 +---- retroshare-gui/src/gui/feeds/ForumMsgItem.h | 6 - retroshare-gui/src/gui/feeds/ForumMsgItem.ui | 38 ++- retroshare-gui/src/gui/feeds/MsgItem.cpp | 18 +- retroshare-gui/src/gui/feeds/MsgItem.h | 1 - retroshare-gui/src/gui/feeds/MsgItem.ui | 18 +- retroshare-gui/src/gui/feeds/PeerItem.cpp | 16 +- retroshare-gui/src/gui/feeds/PeerItem.h | 1 - retroshare-gui/src/gui/feeds/PeerItem.ui | 24 +- retroshare-gui/src/gui/feeds/SecurityItem.cpp | 16 +- retroshare-gui/src/gui/feeds/SecurityItem.h | 1 - retroshare-gui/src/gui/feeds/SecurityItem.ui | 24 +- retroshare-gui/src/gui/images.qrc | 21 +- ...rstatus_bg.png => avatarstatus-bg-116.png} | Bin ...mystatus_bg.png => avatarstatus-bg-70.png} | Bin ..._away.png => avatarstatus-bg-away-116.png} | Bin ...g_idle.png => avatarstatus-bg-away-70.png} | Bin ..._busy.png => avatarstatus-bg-busy-116.png} | Bin ...g_busy.png => avatarstatus-bg-busy-70.png} | Bin ...ne.png => avatarstatus-bg-offline-116.png} | Bin ...ine.png => avatarstatus-bg-offline-70.png} | Bin ...ine.png => avatarstatus-bg-online-116.png} | Bin ...line.png => avatarstatus-bg-online-70.png} | Bin retroshare-gui/src/gui/images/no_avatar.png | Bin 4019 -> 0 bytes retroshare-gui/src/lang/retroshare_de.qm | Bin 330219 -> 330696 bytes retroshare-gui/src/lang/retroshare_de.ts | 245 +++++++++------ retroshare-gui/src/main.cpp | 2 - 46 files changed, 730 insertions(+), 595 deletions(-) create mode 100644 retroshare-gui/src/gui/common/AvatarWidget.cpp create mode 100644 retroshare-gui/src/gui/common/AvatarWidget.h create mode 100644 retroshare-gui/src/gui/common/AvatarWidget.ui rename retroshare-gui/src/gui/images/{avatarstatus_bg.png => avatarstatus-bg-116.png} (100%) rename retroshare-gui/src/gui/images/{mystatus_bg.png => avatarstatus-bg-70.png} (100%) rename retroshare-gui/src/gui/images/{avatarstatus_bg_away.png => avatarstatus-bg-away-116.png} (100%) rename retroshare-gui/src/gui/images/{mystatus_bg_idle.png => avatarstatus-bg-away-70.png} (100%) rename retroshare-gui/src/gui/images/{avatarstatus_bg_busy.png => avatarstatus-bg-busy-116.png} (100%) rename retroshare-gui/src/gui/images/{mystatus_bg_busy.png => avatarstatus-bg-busy-70.png} (100%) rename retroshare-gui/src/gui/images/{avatarstatus_bg_offline.png => avatarstatus-bg-offline-116.png} (100%) rename retroshare-gui/src/gui/images/{mystatus_bg_offline.png => avatarstatus-bg-offline-70.png} (100%) rename retroshare-gui/src/gui/images/{avatarstatus_bg_online.png => avatarstatus-bg-online-116.png} (100%) rename retroshare-gui/src/gui/images/{mystatus_bg_online.png => avatarstatus-bg-online-70.png} (100%) delete mode 100644 retroshare-gui/src/gui/images/no_avatar.png diff --git a/retroshare-gui/src/RetroShare.pro b/retroshare-gui/src/RetroShare.pro index 542045420..df2accaef 100644 --- a/retroshare-gui/src/RetroShare.pro +++ b/retroshare-gui/src/RetroShare.pro @@ -315,6 +315,7 @@ HEADERS += rshare.h \ gui/common/PopularityDefs.h \ gui/common/GroupTreeWidget.h \ gui/common/RSTreeView.h \ + gui/common/AvatarWidget.h \ gui/style/RSStyle.h \ gui/style/StyleDialog.h \ gui/MessagesDialog.h \ @@ -432,6 +433,7 @@ FORMS += gui/StartDialog.ui \ gui/im_history/ImHistoryBrowser.ui \ gui/groups/CreateGroup.ui \ gui/common/GroupTreeWidget.ui \ + gui/common/AvatarWidget.ui \ gui/style/StyleDialog.ui \ gui/dht/DhtWindow.ui \ gui/GetStartedDialog.ui @@ -536,6 +538,7 @@ SOURCES += main.cpp \ gui/common/PopularityDefs.cpp \ gui/common/GroupTreeWidget.cpp \ gui/common/RSTreeView.cpp \ + gui/common/AvatarWidget.cpp \ gui/style/RSStyle.cpp \ gui/style/StyleDialog.cpp \ gui/settings/configpage.cpp \ diff --git a/retroshare-gui/src/gui/FriendsDialog.cpp b/retroshare-gui/src/gui/FriendsDialog.cpp index e27ba38b3..86d08cae8 100644 --- a/retroshare-gui/src/gui/FriendsDialog.cpp +++ b/retroshare-gui/src/gui/FriendsDialog.cpp @@ -136,9 +136,7 @@ FriendsDialog::FriendsDialog(QWidget *parent) connect( ui.peertreeWidget, SIGNAL( itemDoubleClicked ( QTreeWidgetItem *, int)), this, SLOT(chatfriend(QTreeWidgetItem *))); connect( ui.peertreeWidget->header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(peerSortIndicatorChanged(int,Qt::SortOrder))); - connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateOwnStatus(QString,int))); - connect( ui.avatartoolButton, SIGNAL(clicked()), SLOT(getAvatar())); connect( ui.mypersonalstatuslabel, SIGNAL(clicked()), SLOT(statusmessage())); connect( ui.actionSet_your_Avatar, SIGNAL(triggered()), this, SLOT(getAvatar())); connect( ui.actionSet_your_Personal_Message, SIGNAL(triggered()), this, SLOT(statusmessage())); @@ -151,6 +149,9 @@ FriendsDialog::FriendsDialog(QWidget *parent) connect(ui.actionSort_Peers_Ascending_Order, SIGNAL(triggered()), this, SLOT(sortPeersAscendingOrder())); connect(ui.actionSort_Peers_Descending_Order, SIGNAL(triggered()), this, SLOT(sortPeersDescendingOrder())); + ui.avatar->setFrameType(AvatarWidget::STATUS_FRAME); + ui.avatar->setOwnId(); + ui.peertabWidget->setTabPosition(QTabWidget::North); ui.peertabWidget->addTab(new ProfileWidget(), tr("Profile")); NewsFeed *newsFeed = new NewsFeed(); @@ -239,7 +240,6 @@ FriendsDialog::FriendsDialog(QWidget *parent) sizes << height() << 100; // Qt calculates the right sizes ui.splitter_2->setSizes(sizes); - updateAvatar(); loadmypersonalstatus(); displayMenu(); @@ -1411,18 +1411,6 @@ void FriendsDialog::updateStatusString(const QString& peer_id, const QString& st QTimer::singleShot(5000,this,SLOT(resetStatusBar())) ; } -void FriendsDialog::updatePeersAvatar(const QString& peer_id) -{ -#ifdef FRIENDS_DEBUG - std::cerr << "FriendsDialog: Got notified of new avatar for peer " << peer_id.toStdString() << std::endl ; -#endif - - PopupChatDialog *pcd = PopupChatDialog::getPrivateChat(peer_id.toStdString(), 0); - if (pcd) { - pcd->updatePeerAvatar(peer_id.toStdString()); - } -} - void FriendsDialog::updatePeerStatusString(const QString& peer_id,const QString& status_string,bool is_private_chat) { if(is_private_chat) @@ -1794,15 +1782,6 @@ void FriendsDialog::viewprofile() } #endif -void FriendsDialog::updateAvatar() -{ - QPixmap avatar; - AvatarDefs::getOwnAvatar(avatar, ""); - ui.avatartoolButton->setIcon(avatar); - - PopupChatDialog::updateAllAvatars(); -} - void FriendsDialog::getAvatar() { QByteArray ba; @@ -2239,36 +2218,3 @@ void FriendsDialog::newsFeedChanged(int count) ui.peertabWidget->tabBar()->setTabIcon(newsFeedTabIndex, QIcon(IMAGE_NEWSFEED)); } } - -void FriendsDialog::updateOwnStatus(const QString &peer_id, int status) -{ - // add self nick + own status - if (peer_id.toStdString() == rsPeers->getOwnId()) - { - // my status has changed - - switch (status) { - case RS_STATUS_OFFLINE: - ui.avatartoolButton->setStyleSheet("QToolButton#avatartoolButton{border-image:url(:/images/mystatus_bg_offline.png); }"); - break; - - case RS_STATUS_INACTIVE: - ui.avatartoolButton->setStyleSheet("QToolButton#avatartoolButton{border-image:url(:/images/mystatus_bg_idle.png); }"); - break; - - case RS_STATUS_ONLINE: - ui.avatartoolButton->setStyleSheet("QToolButton#avatartoolButton{border-image:url(:/images/mystatus_bg_online.png); }"); - break; - - case RS_STATUS_AWAY: - ui.avatartoolButton->setStyleSheet("QToolButton#avatartoolButton{border-image:url(:/images/mystatus_bg_idle.png); }"); - break; - - case RS_STATUS_BUSY: - ui.avatartoolButton->setStyleSheet("QToolButton#avatartoolButton{border-image:url(:/images/mystatus_bg_busy.png); }"); - break; - } - - return; - } -} diff --git a/retroshare-gui/src/gui/FriendsDialog.h b/retroshare-gui/src/gui/FriendsDialog.h index 685ac5ea5..b00ed5583 100644 --- a/retroshare-gui/src/gui/FriendsDialog.h +++ b/retroshare-gui/src/gui/FriendsDialog.h @@ -85,9 +85,6 @@ public slots: // called by notifyQt when another peer is typing (in group chant and private chat) void updatePeerStatusString(const QString& peer_id,const QString& status_string,bool is_private_chat) ; - void updatePeersAvatar(const QString& peer_id); - void updateAvatar(); // called by notifyQt to update the avatar when it gets changed by another component - void groupsChanged(int type); protected: @@ -148,7 +145,6 @@ private slots: void getFont(); void getAvatar(); - void updateOwnStatus(const QString &peer_id, int status); void on_actionAdd_Group_activated(); void on_actionCreate_New_Forum_activated(); diff --git a/retroshare-gui/src/gui/FriendsDialog.ui b/retroshare-gui/src/gui/FriendsDialog.ui index f062d9ed8..305dc7c3e 100644 --- a/retroshare-gui/src/gui/FriendsDialog.ui +++ b/retroshare-gui/src/gui/FriendsDialog.ui @@ -779,7 +779,7 @@ background: white;} 1 - + 61 @@ -792,24 +792,6 @@ background: white;} 61 - - Add or Change your Avatar - - - QToolButton#avatartoolButton{border-image: url(:/images/mystatus_bg.png);} - - - - - - - 43 - 43 - - - - true - @@ -1566,6 +1548,12 @@ background: white;} + + AvatarWidget + QWidget +
gui/common/AvatarWidget.h
+ 1 +
RSTabWidget QTabWidget diff --git a/retroshare-gui/src/gui/MessengerWindow.cpp b/retroshare-gui/src/gui/MessengerWindow.cpp index 612db2068..871e50a24 100644 --- a/retroshare-gui/src/gui/MessengerWindow.cpp +++ b/retroshare-gui/src/gui/MessengerWindow.cpp @@ -132,11 +132,13 @@ MessengerWindow::MessengerWindow(QWidget* parent, Qt::WFlags flags) m_compareRole = new RSTreeWidgetItemCompareRole; m_compareRole->setRole(COLUMN_NAME, ROLE_SORT); + ui.avatar->setFrameType(AvatarWidget::STATUS_FRAME); + ui.avatar->setOwnId(); + connect( ui.messengertreeWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( messengertreeWidgetCostumPopupMenu( QPoint ) ) ); #ifndef MINIMAL_RSGUI connect( ui.messengertreeWidget, SIGNAL(itemDoubleClicked ( QTreeWidgetItem *, int)), this, SLOT(chatfriend(QTreeWidgetItem *))); - connect( ui.avatarButton, SIGNAL(clicked()), SLOT(getAvatar())); connect( ui.shareButton, SIGNAL(clicked()), SLOT(openShareManager())); connect( ui.addIMAccountButton, SIGNAL(clicked( bool ) ), this , SLOT( addFriend() ) ); #endif // MINIMAL_RSGUI @@ -214,7 +216,6 @@ MessengerWindow::MessengerWindow(QWidget* parent, Qt::WFlags flags) ui.statusButton->setMenu(pStatusMenu); } - updateAvatar(); loadmystatusmessage(); #endif // MINIMAL_RSGUI @@ -683,7 +684,7 @@ void MessengerWindow::insertPeers() gpg_item -> setText(COLUMN_STATE, StatusDefs::name(it->status)); QPixmap avatar; - AvatarDefs::getAvatarFromSslId(it->id, avatar, ":/images/no_avatar_70.png"); + AvatarDefs::getAvatarFromSslId(it->id, avatar); QIcon avatar_icon(avatar); gpg_item->setIcon(COLUMN_STATE, avatar_icon); @@ -1076,25 +1077,6 @@ void MessengerWindow::sendMessage() MessageComposer::msgFriend(id, false); } -void MessengerWindow::updateAvatar() -{ - QPixmap avatar; - AvatarDefs::getOwnAvatar(avatar); - ui.avatarButton->setIcon(avatar); -} - -void MessengerWindow::getAvatar() -{ - QByteArray ba; - if (misc::getOpenAvatarPicture(this, ba)) - { -#ifdef MSG_DEBUG - std::cerr << "Avatar image size = " << ba.size() << std::endl ; -#endif - rsMsgs->setOwnAvatarData((unsigned char *)(ba.data()), ba.size()) ; // last char 0 included. - } -} - /** Loads own personal status message */ void MessengerWindow::loadmystatusmessage() { @@ -1116,28 +1098,6 @@ void MessengerWindow::updateOwnStatus(const QString &peer_id, int status) ui.statusButton->setText(m_nickName + " (" + StatusDefs::name(status) + ")"); - switch (status) { - case RS_STATUS_OFFLINE: - ui.avatarButton->setStyleSheet("QToolButton#avatarButton{border-image:url(:/images/mystatus_bg_offline.png); }"); - break; - - case RS_STATUS_INACTIVE: - ui.avatarButton->setStyleSheet("QToolButton#avatarButton{border-image:url(:/images/mystatus_bg_idle.png); }"); - break; - - case RS_STATUS_ONLINE: - ui.avatarButton->setStyleSheet("QToolButton#avatarButton{border-image:url(:/images/mystatus_bg_online.png); }"); - break; - - case RS_STATUS_AWAY: - ui.avatarButton->setStyleSheet("QToolButton#avatarButton{border-image:url(:/images/mystatus_bg_idle.png); }"); - break; - - case RS_STATUS_BUSY: - ui.avatarButton->setStyleSheet("QToolButton#avatarButton{border-image:url(:/images/mystatus_bg_busy.png); }"); - break; - } - return; } } diff --git a/retroshare-gui/src/gui/MessengerWindow.h b/retroshare-gui/src/gui/MessengerWindow.h index 56de22122..9ab8986b1 100644 --- a/retroshare-gui/src/gui/MessengerWindow.h +++ b/retroshare-gui/src/gui/MessengerWindow.h @@ -45,7 +45,6 @@ class MessengerWindow : public RWindow public slots: void updateMessengerDisplay() ; #ifndef MINIMAL_RSGUI - void updateAvatar(); void loadmystatusmessage(); #endif // MINIMAL_RSGUI @@ -88,9 +87,6 @@ private slots: /** Open Shared Manager **/ void openShareManager(); - /** get own last stored Avatar**/ - void getAvatar(); - void updateOwnStatus(const QString &peer_id, int status); void savestatusmessage(); @@ -137,4 +133,4 @@ private: Ui::MessengerWindow ui; }; -#endif \ No newline at end of file +#endif diff --git a/retroshare-gui/src/gui/MessengerWindow.ui b/retroshare-gui/src/gui/MessengerWindow.ui index d2146d8fa..93c1bd1c9 100644 --- a/retroshare-gui/src/gui/MessengerWindow.ui +++ b/retroshare-gui/src/gui/MessengerWindow.ui @@ -47,7 +47,7 @@ 6 - + 70 @@ -60,25 +60,6 @@ 70 - - Click to Change your Avatar - - - QToolButton#avatarButton{border-image: url(:/images/mystatus_bg.png);} - - - - :/images/user/personal64.png:/images/user/personal64.png - - - - 50 - 50 - - - - true - @@ -401,9 +382,6 @@ border: 1px solid #CCCCCC; false - - false - @@ -473,6 +451,14 @@ border: 1px solid #CCCCCC; + + + AvatarWidget + QWidget +
gui/common/AvatarWidget.h
+ 1 +
+
diff --git a/retroshare-gui/src/gui/chat/PopupChatDialog.cpp b/retroshare-gui/src/gui/chat/PopupChatDialog.cpp index cff6a5337..9fef26f93 100644 --- a/retroshare-gui/src/gui/chat/PopupChatDialog.cpp +++ b/retroshare-gui/src/gui/chat/PopupChatDialog.cpp @@ -127,12 +127,17 @@ PopupChatDialog::PopupChatDialog(const std::string &id, const QString &name, QWi connect(ui.actionSave_Chat_History, SIGNAL(triggered()), this, SLOT(fileSaveAs())); connect(ui.actionClearOfflineMessages, SIGNAL(triggered()), this, SLOT(clearOfflineMessages())); - connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(const QString&, int)), this, SLOT(updateStatus(const QString&, int))); connect(NotifyQt::getInstance(), SIGNAL(peerHasNewCustomStateString(const QString&, const QString&)), this, SLOT(updatePeersCustomStateString(const QString&, const QString&))); connect(ui.chattextEdit,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(contextMenu(QPoint))); + ui.avatarWidget->setFrameType(AvatarWidget::STATUS_FRAME); + ui.avatarWidget->setId(dialogId, false); + + ui.ownAvatarWidget->setFrameType(AvatarWidget::STATUS_FRAME); + ui.ownAvatarWidget->setOwnId(); + // Create the status bar resetStatusBar(); @@ -164,9 +169,6 @@ PopupChatDialog::PopupChatDialog(const std::string &id, const QString &name, QWi colorChanged(mCurrentColor); fontChanged(mCurrentFont); - updateOwnAvatar() ; - updatePeerAvatar(id) ; - // load settings processSettings(true); @@ -179,11 +181,6 @@ PopupChatDialog::PopupChatDialog(const std::string &id, const QString &name, QWi rsStatus->getStatus(dialogId, peerStatusInfo); updateStatus(QString::fromStdString(dialogId), peerStatusInfo.status); - StatusInfo ownStatusInfo; - if (rsStatus->getOwnStatus(ownStatusInfo)) { - updateStatus(QString::fromStdString(ownStatusInfo.id), ownStatusInfo.status); - } - // initialize first custom state string QString customStateString = QString::fromUtf8(rsMsgs->getCustomStateString(dialogId).c_str()); updatePeersCustomStateString(QString::fromStdString(dialogId), customStateString); @@ -413,12 +410,6 @@ void PopupChatDialog::chatFriend(const std::string &id) } } -/*static*/ void PopupChatDialog::updateAllAvatars() -{ - for(std::map::const_iterator it(chatDialogs.begin());it!=chatDialogs.end();++it) - it->second->updateOwnAvatar() ; -} - void PopupChatDialog::focusDialog() { ui.chattextEdit->setFocus(); @@ -845,25 +836,6 @@ void PopupChatDialog::on_actionDelete_Chat_History_triggered() } } -void PopupChatDialog::updatePeerAvatar(const std::string& peer_id) -{ -#ifdef CHAT_DEBUG - std::cerr << "popupchatDialog::updatePeerAvatar() updating avatar for peer " << peer_id << std::endl ; - std::cerr << "Requesting avatar image for peer " << peer_id << std::endl ; -#endif - - QPixmap avatar; - AvatarDefs::getAvatarFromSslId(peer_id, avatar); - ui.avatarlabel->setPixmap(avatar); -} - -void PopupChatDialog::updateOwnAvatar() -{ - QPixmap avatar; - AvatarDefs::getOwnAvatar(avatar); - ui.myavatarlabel->setPixmap(avatar); -} - void PopupChatDialog::addExtraFile() { QString file; @@ -1119,35 +1091,25 @@ void PopupChatDialog::updateStatus(const QString &peer_id, int status) switch (status) { case RS_STATUS_OFFLINE: - ui.avatarlabel->setStyleSheet("QLabel#avatarlabel{ border-image:url(:/images/avatarstatus_bg_offline.png); }"); - ui.avatarlabel->setEnabled(false); ui.infoframe->setVisible(true); ui.infolabel->setText(dialogName + " " + tr("apears to be Offline.") +"\n" + tr("Messages you send will be delivered after Friend is again Online")); break; case RS_STATUS_INACTIVE: - ui.avatarlabel->setStyleSheet("QLabel#avatarlabel{ border-image:url(:/images/avatarstatus_bg_away.png); }"); - ui.avatarlabel->setEnabled(true); ui.infoframe->setVisible(true); ui.infolabel->setText(dialogName + " " + tr("is Idle and may not reply")); break; case RS_STATUS_ONLINE: - ui.avatarlabel->setStyleSheet("QLabel#avatarlabel{ border-image:url(:/images/avatarstatus_bg_online.png); }"); - ui.avatarlabel->setEnabled(true); ui.infoframe->setVisible(false); break; case RS_STATUS_AWAY: - ui.avatarlabel->setStyleSheet("QLabel#avatarlabel{ border-image:url(:/images/avatarstatus_bg_away.png); }"); - ui.avatarlabel->setEnabled(true); ui.infolabel->setText(dialogName + " " + tr("is Away and may not reply")); ui.infoframe->setVisible(true); break; case RS_STATUS_BUSY: - ui.avatarlabel->setStyleSheet("QLabel#avatarlabel{ border-image:url(:/images/avatarstatus_bg_busy.png); }"); - ui.avatarlabel->setEnabled(true); ui.infolabel->setText(dialogName + " " + tr("is Busy and may not reply")); ui.infoframe->setVisible(true); break; @@ -1166,34 +1128,6 @@ void PopupChatDialog::updateStatus(const QString &peer_id, int status) return; } - if (stdPeerId == rsPeers->getOwnId()) { - // my status has changed - - switch (status) { - case RS_STATUS_OFFLINE: - ui.myavatarlabel->setStyleSheet("QLabel#myavatarlabel{border-image:url(:/images/avatarstatus_bg_offline.png); }"); - break; - - case RS_STATUS_INACTIVE: - ui.myavatarlabel->setStyleSheet("QLabel#myavatarlabel{border-image:url(:/images/avatarstatus_bg_away.png); }"); - break; - - case RS_STATUS_ONLINE: - ui.myavatarlabel->setStyleSheet("QLabel#myavatarlabel{border-image:url(:/images/avatarstatus_bg_online.png); }"); - break; - - case RS_STATUS_AWAY: - ui.myavatarlabel->setStyleSheet("QLabel#myavatarlabel{border-image:url(:/images/avatarstatus_bg_away.png); }"); - break; - - case RS_STATUS_BUSY: - ui.myavatarlabel->setStyleSheet("QLabel#myavatarlabel{border-image:url(:/images/avatarstatus_bg_busy.png); }"); - break; - } - - return; - } - // ignore status change } diff --git a/retroshare-gui/src/gui/chat/PopupChatDialog.h b/retroshare-gui/src/gui/chat/PopupChatDialog.h index b1dca12ef..0719dee8c 100644 --- a/retroshare-gui/src/gui/chat/PopupChatDialog.h +++ b/retroshare-gui/src/gui/chat/PopupChatDialog.h @@ -48,11 +48,9 @@ public: static PopupChatDialog *getPrivateChat(const std::string &id, uint chatflags); static void cleanupChat(); static void chatFriend(const std::string &id); - static void updateAllAvatars(); static void privateChatChanged(int list, int type); void updateStatusString(const QString& peer_id, const QString& statusString); - void updatePeerAvatar(const std::string&); std::string getPeerId() { return dialogId; } QString getTitle() { return dialogName; } bool hasNewMessages() { return newMessages; } @@ -81,8 +79,6 @@ protected: void insertChatMsgs(); void addChatMsg(bool incoming, const std::string &id, const QString &name, const QDateTime &sendTime, const QDateTime &recvTime, const QString &message, enumChatType chatType, bool addToHistory); - void updateOwnAvatar(); - private slots: void pasteLink() ; void contextMenu(QPoint) ; diff --git a/retroshare-gui/src/gui/chat/PopupChatDialog.ui b/retroshare-gui/src/gui/chat/PopupChatDialog.ui index e34c2df43..79fd76df2 100644 --- a/retroshare-gui/src/gui/chat/PopupChatDialog.ui +++ b/retroshare-gui/src/gui/chat/PopupChatDialog.ui @@ -139,7 +139,7 @@ 9 - + 116 @@ -152,18 +152,6 @@ 116 - - QLabel{ -border-image: url(:/images/avatarstatus_bg.png); - -} - - - - - - Qt::AlignCenter - @@ -180,7 +168,7 @@ border-image: url(:/images/avatarstatus_bg.png); - + 116 @@ -193,18 +181,6 @@ border-image: url(:/images/avatarstatus_bg.png); 116 - - QLabel{ -border-image: url(:/images/avatarstatus_bg.png); - -} - - - - - - Qt::AlignCenter - @@ -929,6 +905,14 @@ background: white;} + + + AvatarWidget + QWidget +
gui/common/AvatarWidget.h
+ 1 +
+
diff --git a/retroshare-gui/src/gui/common/AvatarWidget.cpp b/retroshare-gui/src/gui/common/AvatarWidget.cpp new file mode 100644 index 000000000..24d6dd1a9 --- /dev/null +++ b/retroshare-gui/src/gui/common/AvatarWidget.cpp @@ -0,0 +1,282 @@ +/**************************************************************** + * This file is distributed under the following license: + * + * Copyright (c) 2010, RetroShare Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#include +#include +#include + +#include "gui/notifyqt.h" +#include "gui/common/AvatarDefs.h" +#include "util/misc.h" + +#include "AvatarWidget.h" +#include "ui_AvatarWidget.h" + +#include + +AvatarWidget::AvatarWidget(QWidget *parent) : + QWidget(parent), ui(new Ui::AvatarWidget) +{ + ui->setupUi(this); + + mFlag.isOwnId = false; + mFlag.isGpg = false; + + setFrameType(NO_FRAME); + + /* connect signals */ + connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(const QString&)), this, SLOT(updateAvatar(const QString&))); + connect(NotifyQt::getInstance(), SIGNAL(ownAvatarChanged()), this, SLOT(updateOwnAvatar())); +} + +AvatarWidget::~AvatarWidget() +{ + delete ui; +} + +static bool isSmall(const QSize &size) +{ + if (size.width() <= 70 && size.height() <= 70) { + return true; + } + + return false; +} + +void AvatarWidget::resizeEvent(QResizeEvent *event) +{ + if (mFrameType == NO_FRAME) { + return; + } + + QSize widgetSize = size(); + QSize avatarSize; + if (isSmall(widgetSize)) { + avatarSize = QSize(widgetSize.width() * 50 / 70, widgetSize.height() * 50 / 70); + } else { + avatarSize = QSize(widgetSize.width() * 96 / 116, widgetSize.height() * 96 / 116); + } + int x = (widgetSize.width() - avatarSize.width()) / 2; + int y = (widgetSize.height() - avatarSize.height()) / 2; + ui->avatarFrameLayout->setContentsMargins(x, y, x, y); + + refreshStatus(); +} + +void AvatarWidget::mouseReleaseEvent(QMouseEvent *event) +{ + if (mFlag.isOwnId) { + QByteArray ba; + if (misc::getOpenAvatarPicture(this, ba)) { + rsMsgs->setOwnAvatarData((unsigned char*)(ba.data()), ba.size()); // last char 0 included. + } + } +} + +void AvatarWidget::setFrameType(FrameType type) +{ + mFrameType = type; + + switch (mFrameType) { + case NO_FRAME: + disconnect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateStatus(const QString&, int))); + ui->avatarFrameLayout->setContentsMargins(0, 0, 0, 0); + break; + case NORMAL_FRAME: + disconnect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateStatus(const QString&, int))); + break; + case STATUS_FRAME: + connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateStatus(const QString&, int))); + break; + } + + refreshStatus(); + updateAvatar(QString::fromStdString(mId)); +} + +void AvatarWidget::setId(const std::string &id, bool isGpg) +{ + mId = id; + mFlag.isGpg = isGpg; + + if (mId == rsPeers->getOwnId()) { + mFlag.isOwnId = true; + ui->avatar->setToolTip(tr("Click to change your avatar")); + } + + ui->avatar->setPixmap(QPixmap()); + + if (mId.empty()) { + ui->avatar->setEnabled(false); + } + + refreshStatus(); + updateAvatar(QString::fromStdString(mId)); +} + +void AvatarWidget::setOwnId() +{ + setId(rsPeers->getOwnId(), false); +} + +void AvatarWidget::refreshStatus() +{ + switch (mFrameType) { + case NO_FRAME: + ui->avatarFrame->setStyleSheet(""); + break; + case NORMAL_FRAME: + ui->avatarFrame->setStyleSheet(isSmall(size()) ? "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-70.png); }" : "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-116.png); }"); + break; + case STATUS_FRAME: + { + StatusInfo statusInfo; + + // No check of return value. Non existing status info is handled as offline. + if (mFlag.isOwnId) { + rsStatus->getOwnStatus(statusInfo); + } else { + rsStatus->getStatus(mId, statusInfo); + } + updateStatus(QString::fromStdString(statusInfo.id), statusInfo.status); + } + break; + } +} + +static QString getStatusFrame(bool small, int status) +{ + if (small) { + switch (status) { + case RS_STATUS_OFFLINE: + return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-offline-70.png); }"; + case RS_STATUS_INACTIVE: + return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-idle-70.png); }"; + case RS_STATUS_ONLINE: + return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-online-70.png); }"; + case RS_STATUS_AWAY: + return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-away-70.png); }"; + case RS_STATUS_BUSY: + return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-busy-70.png); }"; + } + + return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-70.png); }"; + } else { + switch (status) { + case RS_STATUS_OFFLINE: + return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-offline-116.png); }"; + case RS_STATUS_INACTIVE: + return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-away-116.png); }"; + case RS_STATUS_ONLINE: + return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-online-116.png); }"; + case RS_STATUS_AWAY: + return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-away-116.png); }"; + case RS_STATUS_BUSY: + return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-busy-116.png); }"; + } + + return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-116.png); }"; + } + + return ""; +} + +void AvatarWidget::updateStatus(const QString peerId, int status) +{ + if (mFrameType != STATUS_FRAME) { + return; + } + + if (mId.empty()) { + ui->avatarFrame->setStyleSheet(getStatusFrame(isSmall(size()), RS_STATUS_OFFLINE)); + return; + } + + /* set style for status */ + if (mId == peerId.toStdString()) { + // the peers status has changed + + ui->avatarFrame->setStyleSheet(getStatusFrame(isSmall(size()), status)); + + ui->avatar->setEnabled(((uint32_t) status == RS_STATUS_OFFLINE) ? false : true); + + return; + } + + // ignore status change +} + +void AvatarWidget::updateAvatar(const QString &peerId) +{ + QString defaultAvatar = ":/images/no_avatar_background.png"; + + if (mId.empty()) { + QPixmap avatar(defaultAvatar); + ui->avatar->setPixmap(avatar); + return; + } + + if (mFlag.isOwnId) { + QPixmap avatar; + AvatarDefs::getOwnAvatar(avatar); + ui->avatar->setPixmap(avatar); + return; + } + + if (mFlag.isGpg) { + if (mId == peerId.toStdString()) { + /* called from AvatarWidget with gpg id */ + QPixmap avatar; + AvatarDefs::getAvatarFromGpgId(mId, avatar, defaultAvatar); + ui->avatar->setPixmap(avatar); + return; + } + + /* Is this one of the ssl ids of the gpg id ? */ + std::list sslIds; + if (rsPeers->getAssociatedSSLIds(mId, sslIds) == false) { + return; + } + + if (std::find(sslIds.begin(), sslIds.end(), peerId.toStdString()) != sslIds.end()) { + /* One of the ssl ids of the gpg id */ + QPixmap avatar; + AvatarDefs::getAvatarFromGpgId(mId, avatar, defaultAvatar); + ui->avatar->setPixmap(avatar); + } + + return; + } + + if (mId == peerId.toStdString()) { + QPixmap avatar; + AvatarDefs::getAvatarFromSslId(mId, avatar, defaultAvatar); + ui->avatar->setPixmap(avatar); + return; + } +} + +void AvatarWidget::updateOwnAvatar() +{ + if (mFlag.isOwnId) { + updateAvatar(QString::fromStdString(mId)); + } +} diff --git a/retroshare-gui/src/gui/common/AvatarWidget.h b/retroshare-gui/src/gui/common/AvatarWidget.h new file mode 100644 index 000000000..38cf75bab --- /dev/null +++ b/retroshare-gui/src/gui/common/AvatarWidget.h @@ -0,0 +1,72 @@ +/**************************************************************** + * This file is distributed under the following license: + * + * Copyright (c) 2010, RetroShare Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#ifndef AVATARWIDGET_H +#define AVATARWIDGET_H + +#include + +namespace Ui { + class AvatarWidget; +} + +class AvatarWidget : public QWidget +{ + Q_OBJECT + +public: + enum FrameType { + NO_FRAME, + NORMAL_FRAME, + STATUS_FRAME + }; + +public: + AvatarWidget(QWidget *parent = 0); + ~AvatarWidget(); + + void setFrameType(FrameType type); + void setId(const std::string& id, bool isGpg); + void setOwnId(); + +protected: + void resizeEvent(QResizeEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + +private slots: + void updateStatus(const QString peerId, int status); + void updateAvatar(const QString& peerId); + void updateOwnAvatar(); + +private: + void refreshStatus(); + + Ui::AvatarWidget *ui; + + std::string mId; + struct { + bool isOwnId : 1; + bool isGpg : 1; + } mFlag; + FrameType mFrameType; +}; + +#endif // AVATARWIDGET_H diff --git a/retroshare-gui/src/gui/common/AvatarWidget.ui b/retroshare-gui/src/gui/common/AvatarWidget.ui new file mode 100644 index 000000000..4fcdd9605 --- /dev/null +++ b/retroshare-gui/src/gui/common/AvatarWidget.ui @@ -0,0 +1,46 @@ + + + AvatarWidget + + + + 0 + 0 + 116 + 116 + + + + + 0 + + + + + QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-116.png); } + + + + 10 + + + + + true + + + true + + + Qt::AlignCenter + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/connect/ConfCertDialog.cpp b/retroshare-gui/src/gui/connect/ConfCertDialog.cpp index a94c00a04..f236eb955 100644 --- a/retroshare-gui/src/gui/connect/ConfCertDialog.cpp +++ b/retroshare-gui/src/gui/connect/ConfCertDialog.cpp @@ -79,10 +79,6 @@ ConfCertDialog::ConfCertDialog(const std::string& id, QWidget *parent, Qt::WFlag connect(ui.signKeyButton, SIGNAL(clicked()), this, SLOT(signGPGKey())); connect(ui.trusthelpButton, SIGNAL(clicked()), this, SLOT(showHelpDialog())); - connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(const QString&)), this, SLOT(updatePeersAvatar(const QString&))); - - isOnlyGpg = false; - #ifndef MINIMAL_RSGUI MainWindow *w = MainWindow::getInstance(); if (w) { @@ -143,8 +139,6 @@ void ConfCertDialog::load() return; } - isOnlyGpg = detail.isOnlyGPGdetail; - ui.name->setText(QString::fromUtf8(detail.name.c_str())); ui.peerid->setText(QString::fromStdString(detail.id)); @@ -155,6 +149,7 @@ void ConfCertDialog::load() ui.rsid->setToolTip(link.title()); if (!detail.isOnlyGPGdetail) { + ui.avatar->setId(mId, false); ui.loc->setText(QString::fromUtf8(detail.location.c_str())); // Dont Show a timestamp in RS calculate the day @@ -199,6 +194,8 @@ void ConfCertDialog::load() ui.rsid->hide(); ui.label_rsid->hide(); } else { + ui.avatar->setId(mId, true); + ui.rsid->show(); ui.label_rsid->show(); ui.loc->hide(); @@ -335,8 +332,6 @@ void ConfCertDialog::load() font.setStyle(QFont::StyleNormal); ui.userCertificateText->setFont(font); ui.userCertificateText->setText(QString::fromUtf8(invite.c_str())); - - updatePeersAvatar(QString::fromStdString(mId)); } @@ -450,20 +445,3 @@ void ConfCertDialog::showHelpDialog(const QString &topic) helpBrowser = new HelpBrowser(this); helpBrowser->showWindow(topic); } - -void ConfCertDialog::updatePeersAvatar(const QString& peer_id) -{ - if (isOnlyGpg) { - QPixmap avatar; - AvatarDefs::getAvatarFromGpgId(mId, avatar); - ui.AvatarLabel->setPixmap(avatar); - - return; - } - - if (mId == peer_id.toStdString()) { - QPixmap avatar; - AvatarDefs::getAvatarFromSslId(mId, avatar); - ui.AvatarLabel->setPixmap(avatar); - } -} diff --git a/retroshare-gui/src/gui/connect/ConfCertDialog.h b/retroshare-gui/src/gui/connect/ConfCertDialog.h index 0ab9ae18a..5900a7b8d 100644 --- a/retroshare-gui/src/gui/connect/ConfCertDialog.h +++ b/retroshare-gui/src/gui/connect/ConfCertDialog.h @@ -60,11 +60,8 @@ private slots: /** Called when a child window requests the given help topic. */ void showHelpDialog(const QString &topic); - void updatePeersAvatar(const QString& peer_id); - private: std::string mId; - bool isOnlyGpg; /** Qt Designer generated object */ Ui::ConfCertDialog ui; diff --git a/retroshare-gui/src/gui/connect/ConfCertDialog.ui b/retroshare-gui/src/gui/connect/ConfCertDialog.ui index 10ec06709..899d68197 100644 --- a/retroshare-gui/src/gui/connect/ConfCertDialog.ui +++ b/retroshare-gui/src/gui/connect/ConfCertDialog.ui @@ -32,20 +32,7 @@ Details - - - - - 96 - 96 - - - - - - - - + Peer Info @@ -189,7 +176,7 @@
- + Qt::Vertical @@ -202,7 +189,7 @@ - + Peer Address @@ -366,7 +353,7 @@ - + Qt::Vertical @@ -379,6 +366,37 @@ + + + + QFrame::Panel + + + QFrame::Sunken + + + + 0 + + + + + + 96 + 96 + + + + + 96 + 96 + + + + + + + @@ -733,6 +751,14 @@ p, li { white-space: pre-wrap; } + + + AvatarWidget + QWidget +
gui/common/AvatarWidget.h
+ 1 +
+
diff --git a/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp b/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp index a36b6c8ac..f24be8384 100644 --- a/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp @@ -66,9 +66,10 @@ ChatMsgItem::ChatMsgItem(FeedHolder *parent, uint32_t feedId, std::string peerId connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(const QString&)), this, SLOT(updateAvatar(const QString&))); + avatar->setId(mPeerId, false); + updateItemStatic(); updateItem(); - updateAvatar(QString::fromStdString(mPeerId)); insertChat(message); } @@ -222,18 +223,6 @@ void ChatMsgItem::openChat() } } -void ChatMsgItem::updateAvatar(const QString &peer_id) -{ - if (peer_id.toStdString() != mPeerId) { - /* it 's not me */ - return; - } - - QPixmap avatar; - AvatarDefs::getAvatarFromSslId(mPeerId, avatar, ":/images/user/personal64.png"); - avatar_label->setPixmap(avatar); -} - void ChatMsgItem::togglequickmessage() { if (messageframe->isHidden()) diff --git a/retroshare-gui/src/gui/feeds/ChatMsgItem.h b/retroshare-gui/src/gui/feeds/ChatMsgItem.h index afbfbeff2..5446aab36 100644 --- a/retroshare-gui/src/gui/feeds/ChatMsgItem.h +++ b/retroshare-gui/src/gui/feeds/ChatMsgItem.h @@ -50,7 +50,6 @@ private slots: void openChat(); void updateItem(); - void updateAvatar(const QString &peer_id); void togglequickmessage(); void sendMessage(); diff --git a/retroshare-gui/src/gui/feeds/ChatMsgItem.ui b/retroshare-gui/src/gui/feeds/ChatMsgItem.ui index 97ac35efb..8c9078476 100644 --- a/retroshare-gui/src/gui/feeds/ChatMsgItem.ui +++ b/retroshare-gui/src/gui/feeds/ChatMsgItem.ui @@ -43,7 +43,7 @@ border-radius: 10px} - + 70 @@ -57,19 +57,10 @@ border-radius: 10px} - QLabel#avatar_label{border: 2px solid black; + QWidget#avatar{border: 2px solid black; } - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - 0 - @@ -331,6 +322,14 @@ border-radius: 10px} + + + AvatarWidget + QWidget +
gui/common/AvatarWidget.h
+ 1 +
+
diff --git a/retroshare-gui/src/gui/feeds/ForumMsgItem.cpp b/retroshare-gui/src/gui/feeds/ForumMsgItem.cpp index 5b0d60cc9..2b3c479e7 100644 --- a/retroshare-gui/src/gui/feeds/ForumMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/ForumMsgItem.cpp @@ -60,8 +60,6 @@ ForumMsgItem::ForumMsgItem(FeedHolder *parent, uint32_t feedId, const std::strin connect( replyButton, SIGNAL( clicked( void ) ), this, SLOT( replyToPost ( void ) ) ); connect( sendButton, SIGNAL( clicked( ) ), this, SLOT( sendMsg() ) ); - connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(const QString&)), this, SLOT(updateAvatar(const QString&))); - subjectLabel->setMinimumWidth(20); small(); @@ -142,8 +140,8 @@ void ForumMsgItem::updateItemStatic() link.createForum(msg.forumId, msg.msgId); if (mIsTop) - { - mGpgIdPrev = msg.srcId; + { + avatar->setId(msg.srcId, true); if (rsPeers->getPeerName(msg.srcId) !="") { @@ -168,7 +166,7 @@ void ForumMsgItem::updateItemStatic() } else { - mGpgIdNext = msg.srcId; + nextavatar->setId(msg.srcId, true); if (rsPeers->getPeerName(msg.srcId) !="") { @@ -194,7 +192,7 @@ void ForumMsgItem::updateItemStatic() ForumMsgInfo msgParent; if (rsForums->getForumMessage(mForumId, msg.parentId, msgParent)) { - mGpgIdPrev = msgParent.srcId; + avatar->setId(msgParent.srcId, true); RetroShareLink linkParent; linkParent.createForum(msgParent.forumId, msgParent.msgId); @@ -234,9 +232,6 @@ void ForumMsgItem::updateItemStatic() } unsubscribeButton->hide(); - - showAvatar("", true); - showAvatar("", false); } @@ -397,59 +392,3 @@ void ForumMsgItem::sendMsg() } } } - -void ForumMsgItem::updateAvatar(const QString &peer_id) -{ - if (mGpgIdPrev.empty() == false) { - /* Is this one of the ssl ids of the gpg id ? */ - std::list sslIds; - if (rsPeers->getAssociatedSSLIds(mGpgIdPrev, sslIds) == false) { - return; - } - - if (std::find(sslIds.begin(), sslIds.end(), peer_id.toStdString()) != sslIds.end()) { - /* One of the ssl ids of the gpg id */ - showAvatar(peer_id.toStdString(), false); - } - } - - if (mGpgIdNext.empty() == false) { - /* Is this one of the ssl ids of the gpg id ? */ - std::list sslIds; - if (rsPeers->getAssociatedSSLIds(mGpgIdNext, sslIds) == false) { - return; - } - - if (std::find(sslIds.begin(), sslIds.end(), peer_id.toStdString()) != sslIds.end()) { - /* One of the ssl ids of the gpg id */ - showAvatar(peer_id.toStdString(), true); - } - } -} - -void ForumMsgItem::showAvatar(const std::string &peer_id, bool next) -{ - std::string gpgId = next ? mGpgIdNext : mGpgIdPrev; - QLabel *avatarLabel = next ? nextavatarlabel : avatarlabel; - - if (gpgId.empty()) { - avatarLabel->setPixmap(QPixmap(":/images/user/personal64.png")); - return; - } - - QPixmap avatar; - - if (gpgId == rsPeers->getGPGOwnId()) { - /* Its me */ - AvatarDefs::getOwnAvatar(avatar, ":/images/user/personal64.png"); - } else { - if (peer_id.empty()) { - /* Show the first available avatar of one of the ssl ids */ - AvatarDefs::getAvatarFromGpgId(gpgId, avatar, ":/images/user/personal64.png"); - } else { - AvatarDefs::getAvatarFromSslId(peer_id, avatar, ":/images/user/personal64.png"); - } - } - - avatarLabel->setPixmap(avatar); -} diff --git a/retroshare-gui/src/gui/feeds/ForumMsgItem.h b/retroshare-gui/src/gui/feeds/ForumMsgItem.h index 4a93a2a5c..20cbbcb5b 100644 --- a/retroshare-gui/src/gui/feeds/ForumMsgItem.h +++ b/retroshare-gui/src/gui/feeds/ForumMsgItem.h @@ -50,21 +50,15 @@ private slots: void replyToPost(); void sendMsg(); - void updateItem(); - void updateAvatar(const QString &peer_id); private: - void showAvatar(const std::string &peer_id, bool next); - FeedHolder *mParent; uint32_t mFeedId; bool canReply; std::string mForumId; std::string mPostId; - std::string mGpgIdPrev; - std::string mGpgIdNext; bool mIsHome; bool mIsTop; }; diff --git a/retroshare-gui/src/gui/feeds/ForumMsgItem.ui b/retroshare-gui/src/gui/feeds/ForumMsgItem.ui index c2e281855..79e5f603a 100644 --- a/retroshare-gui/src/gui/feeds/ForumMsgItem.ui +++ b/retroshare-gui/src/gui/feeds/ForumMsgItem.ui @@ -64,7 +64,7 @@ border-radius: 10px} - :/images/konversation.png + :/images/konversation.png Qt::AlignCenter @@ -209,7 +209,7 @@ border-radius: 10px} - + :/images/mail_delete.png:/images/mail_delete.png @@ -229,7 +229,7 @@ border-radius: 10px} - + :/images/replymail24.png:/images/replymail24.png @@ -249,7 +249,7 @@ border-radius: 10px} - + :/images/edit_add24.png:/images/edit_add24.png @@ -269,7 +269,7 @@ border-radius: 10px} - + :/images/close_normal.png:/images/close_normal.png @@ -290,7 +290,7 @@ border-radius: 10px} - + 32 @@ -303,12 +303,6 @@ border-radius: 10px} 32 - - - - - true - @@ -457,7 +451,7 @@ border-radius: 10px} - + 32 @@ -470,12 +464,6 @@ border-radius: 10px} 32 - - - - - true - @@ -624,6 +612,16 @@ border-radius: 10px} - + + + AvatarWidget + QWidget +
gui/common/AvatarWidget.h
+ 1 +
+
+ + + diff --git a/retroshare-gui/src/gui/feeds/MsgItem.cpp b/retroshare-gui/src/gui/feeds/MsgItem.cpp index 9eff852cc..7f234e225 100644 --- a/retroshare-gui/src/gui/feeds/MsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/MsgItem.cpp @@ -56,12 +56,9 @@ MsgItem::MsgItem(FeedHolder *parent, uint32_t feedId, std::string msgId, bool is connect( deleteButton, SIGNAL( clicked( void ) ), this, SLOT( deleteMsg ( void ) ) ); connect( replyButton, SIGNAL( clicked( void ) ), this, SLOT( replyMsg ( void ) ) ); - connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(const QString&)), this, SLOT(updateAvatar(const QString&))); - small(); updateItemStatic(); updateItem(); - updateAvatar(QString::fromStdString(mPeerId)); } @@ -84,6 +81,8 @@ void MsgItem::updateItemStatic() /* get peer Id */ mPeerId = mi.srcId; + avatar->setId(mPeerId, false); + QString title; QString timestamp; QString srcName = QString::fromUtf8(rsPeers->getPeerName(mi.srcId).c_str()); @@ -276,16 +275,3 @@ void MsgItem::playMedia() std::cerr << std::endl; #endif } - -void MsgItem::updateAvatar(const QString &peer_id) -{ - if (peer_id.toStdString() != mPeerId) { - /* it 's not me */ - return; - } - - QPixmap avatar; - AvatarDefs::getAvatarFromSslId(mPeerId, avatar, ":/images/user/personal64.png"); - avatarlabel->setPixmap(avatar); -} - diff --git a/retroshare-gui/src/gui/feeds/MsgItem.h b/retroshare-gui/src/gui/feeds/MsgItem.h index d1d220815..2e7f04cc2 100644 --- a/retroshare-gui/src/gui/feeds/MsgItem.h +++ b/retroshare-gui/src/gui/feeds/MsgItem.h @@ -52,7 +52,6 @@ private slots: void replyMsg(); void updateItem(); - void updateAvatar(const QString &peer_id); private: FeedHolder *mParent; diff --git a/retroshare-gui/src/gui/feeds/MsgItem.ui b/retroshare-gui/src/gui/feeds/MsgItem.ui index 99d77348a..870097761 100644 --- a/retroshare-gui/src/gui/feeds/MsgItem.ui +++ b/retroshare-gui/src/gui/feeds/MsgItem.ui @@ -42,7 +42,7 @@ border-radius: 10px} 0 - + 70 @@ -56,14 +56,10 @@ border-radius: 10px} - QLabel#avatarlabel{border: 2px solid blue; -background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, -stop: 0 #2291E0, stop: 1 #3EB3FF); + QWidget#avatar{border: 2px solid blue; +background-color: #2291E0; } - - true - @@ -275,6 +271,14 @@ stop: 0 #2291E0, stop: 1 #3EB3FF);
+ + + AvatarWidget + QWidget +
gui/common/AvatarWidget.h
+ 1 +
+
diff --git a/retroshare-gui/src/gui/feeds/PeerItem.cpp b/retroshare-gui/src/gui/feeds/PeerItem.cpp index 2b69ee7f6..222f707ae 100644 --- a/retroshare-gui/src/gui/feeds/PeerItem.cpp +++ b/retroshare-gui/src/gui/feeds/PeerItem.cpp @@ -64,7 +64,6 @@ PeerItem::PeerItem(FeedHolder *parent, uint32_t feedId, std::string peerId, uint connect( sendmsgButton, SIGNAL( clicked( ) ), this, SLOT( sendMessage() ) ); - connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(const QString&)), this, SLOT(updateAvatar(const QString&))); connect(NotifyQt::getInstance(), SIGNAL(friendsChanged()), this, SLOT(updateItem())); QMenu *msgmenu = new QMenu(); @@ -72,10 +71,11 @@ PeerItem::PeerItem(FeedHolder *parent, uint32_t feedId, std::string peerId, uint quickmsgButton->setMenu(msgmenu); + avatar->setId(mPeerId, false); + small(); updateItemStatic(); updateItem(); - updateAvatar(QString::fromStdString(mPeerId)); } @@ -309,18 +309,6 @@ void PeerItem::openChat() } } -void PeerItem::updateAvatar(const QString &peer_id) -{ - if (peer_id.toStdString() != mPeerId) { - /* it 's not me */ - return; - } - - QPixmap avatar; - AvatarDefs::getAvatarFromSslId(mPeerId, avatar, ":/images/user/personal64.png"); - avatar_label->setPixmap(avatar); -} - void PeerItem::togglequickmessage() { if (messageframe->isHidden()) diff --git a/retroshare-gui/src/gui/feeds/PeerItem.h b/retroshare-gui/src/gui/feeds/PeerItem.h index 009fe6ab5..012a32f74 100644 --- a/retroshare-gui/src/gui/feeds/PeerItem.h +++ b/retroshare-gui/src/gui/feeds/PeerItem.h @@ -57,7 +57,6 @@ private slots: void openChat(); void updateItem(); - void updateAvatar(const QString &peer_id); void togglequickmessage(); void sendMessage(); diff --git a/retroshare-gui/src/gui/feeds/PeerItem.ui b/retroshare-gui/src/gui/feeds/PeerItem.ui index 7d07769b9..2ecb892ae 100644 --- a/retroshare-gui/src/gui/feeds/PeerItem.ui +++ b/retroshare-gui/src/gui/feeds/PeerItem.ui @@ -63,7 +63,7 @@ border-radius: 10px} 0 - + 70 @@ -77,20 +77,10 @@ border-radius: 10px} - QLabel#avatar_label{border: 2px solid green; - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); + QWidget#avatar{border: 2px solid green; + background-color: #BDDF7D; } - - - - - true - - - 0 - @@ -575,6 +565,14 @@ border-radius: 10px} + + + AvatarWidget + QWidget +
gui/common/AvatarWidget.h
+ 1 +
+
diff --git a/retroshare-gui/src/gui/feeds/SecurityItem.cpp b/retroshare-gui/src/gui/feeds/SecurityItem.cpp index 144608eba..89232a12e 100644 --- a/retroshare-gui/src/gui/feeds/SecurityItem.cpp +++ b/retroshare-gui/src/gui/feeds/SecurityItem.cpp @@ -75,7 +75,6 @@ SecurityItem::SecurityItem(FeedHolder *parent, uint32_t feedId, std::string gpgI connect(removeFriendButton, SIGNAL(clicked()), this, SLOT(removeFriend())); connect(peerDetailsButton, SIGNAL(clicked()), this, SLOT(peerDetails())); - connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(const QString&)), this, SLOT(updateAvatar(const QString&))); connect(NotifyQt::getInstance(), SIGNAL(friendsChanged()), this, SLOT(updateItem())); QMenu *msgmenu = new QMenu(); @@ -83,10 +82,11 @@ SecurityItem::SecurityItem(FeedHolder *parent, uint32_t feedId, std::string gpgI quickmsgButton->setMenu(msgmenu); + avatar->setId(mSslId, false); + small(); updateItemStatic(); updateItem(); - updateAvatar(QString::fromStdString(mSslId)); } @@ -379,18 +379,6 @@ void SecurityItem::openChat() } } -void SecurityItem::updateAvatar(const QString &peer_id) -{ - if (peer_id.toStdString() != mSslId) { - /* it 's not me */ - return; - } - - QPixmap avatar; - AvatarDefs::getAvatarFromSslId(mSslId, avatar, ":/images/user/personal64.png"); - avatar_label->setPixmap(avatar); -} - void SecurityItem::togglequickmessage() { if (messageframe->isHidden()) diff --git a/retroshare-gui/src/gui/feeds/SecurityItem.h b/retroshare-gui/src/gui/feeds/SecurityItem.h index fd9054249..e087b48c3 100644 --- a/retroshare-gui/src/gui/feeds/SecurityItem.h +++ b/retroshare-gui/src/gui/feeds/SecurityItem.h @@ -57,7 +57,6 @@ private slots: void openChat(); void updateItem(); - void updateAvatar(const QString &peer_id); void togglequickmessage(); void sendMessage(); diff --git a/retroshare-gui/src/gui/feeds/SecurityItem.ui b/retroshare-gui/src/gui/feeds/SecurityItem.ui index 43ff63086..46d88328a 100644 --- a/retroshare-gui/src/gui/feeds/SecurityItem.ui +++ b/retroshare-gui/src/gui/feeds/SecurityItem.ui @@ -60,7 +60,7 @@ border-radius: 10px} 0 - + 70 @@ -74,20 +74,10 @@ border-radius: 10px} - QLabel#avatar_label{border: 2px solid green; - background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #BDDF7D, stop: 1 #49881F); + QWidget#avatar{border: 2px solid red; + background-color: #FDBF7D; } - - - - - true - - - 0 - @@ -623,6 +613,14 @@ border-radius: 10px} + + + AvatarWidget + QWidget +
gui/common/AvatarWidget.h
+ 1 +
+
diff --git a/retroshare-gui/src/gui/images.qrc b/retroshare-gui/src/gui/images.qrc index 889b7e693..d64a4e210 100644 --- a/retroshare-gui/src/gui/images.qrc +++ b/retroshare-gui/src/gui/images.qrc @@ -48,11 +48,16 @@ images/admin-48.png images/user/add_group22.png images/user/add_group256.png - images/avatarstatus_bg.png - images/avatarstatus_bg_online.png - images/avatarstatus_bg_away.png - images/avatarstatus_bg_busy.png - images/avatarstatus_bg_offline.png + images/avatarstatus-bg-116.png + images/avatarstatus-bg-online-116.png + images/avatarstatus-bg-away-116.png + images/avatarstatus-bg-busy-116.png + images/avatarstatus-bg-offline-116.png + images/avatarstatus-bg-70.png + images/avatarstatus-bg-online-70.png + images/avatarstatus-bg-away-70.png + images/avatarstatus-bg-busy-70.png + images/avatarstatus-bg-offline-70.png images/browse-looking.gif images/back.png images/backgroundl.png @@ -298,18 +303,12 @@ images/message.png images/messages_new.png images/messenger.png - images/mystatus_bg_idle.png - images/mystatus_bg_busy.png - images/mystatus_bg_online.png - images/mystatus_bg_offline.png - images/mystatus_bg.png images/network.png images/network16.png images/network32.png images/new-mail-alert.png images/new_forum16.png images/newmsg.png - images/no_avatar.png images/no_avatar_70.png images/no_avatar_background.png images/openimage.png diff --git a/retroshare-gui/src/gui/images/avatarstatus_bg.png b/retroshare-gui/src/gui/images/avatarstatus-bg-116.png similarity index 100% rename from retroshare-gui/src/gui/images/avatarstatus_bg.png rename to retroshare-gui/src/gui/images/avatarstatus-bg-116.png diff --git a/retroshare-gui/src/gui/images/mystatus_bg.png b/retroshare-gui/src/gui/images/avatarstatus-bg-70.png similarity index 100% rename from retroshare-gui/src/gui/images/mystatus_bg.png rename to retroshare-gui/src/gui/images/avatarstatus-bg-70.png diff --git a/retroshare-gui/src/gui/images/avatarstatus_bg_away.png b/retroshare-gui/src/gui/images/avatarstatus-bg-away-116.png similarity index 100% rename from retroshare-gui/src/gui/images/avatarstatus_bg_away.png rename to retroshare-gui/src/gui/images/avatarstatus-bg-away-116.png diff --git a/retroshare-gui/src/gui/images/mystatus_bg_idle.png b/retroshare-gui/src/gui/images/avatarstatus-bg-away-70.png similarity index 100% rename from retroshare-gui/src/gui/images/mystatus_bg_idle.png rename to retroshare-gui/src/gui/images/avatarstatus-bg-away-70.png diff --git a/retroshare-gui/src/gui/images/avatarstatus_bg_busy.png b/retroshare-gui/src/gui/images/avatarstatus-bg-busy-116.png similarity index 100% rename from retroshare-gui/src/gui/images/avatarstatus_bg_busy.png rename to retroshare-gui/src/gui/images/avatarstatus-bg-busy-116.png diff --git a/retroshare-gui/src/gui/images/mystatus_bg_busy.png b/retroshare-gui/src/gui/images/avatarstatus-bg-busy-70.png similarity index 100% rename from retroshare-gui/src/gui/images/mystatus_bg_busy.png rename to retroshare-gui/src/gui/images/avatarstatus-bg-busy-70.png diff --git a/retroshare-gui/src/gui/images/avatarstatus_bg_offline.png b/retroshare-gui/src/gui/images/avatarstatus-bg-offline-116.png similarity index 100% rename from retroshare-gui/src/gui/images/avatarstatus_bg_offline.png rename to retroshare-gui/src/gui/images/avatarstatus-bg-offline-116.png diff --git a/retroshare-gui/src/gui/images/mystatus_bg_offline.png b/retroshare-gui/src/gui/images/avatarstatus-bg-offline-70.png similarity index 100% rename from retroshare-gui/src/gui/images/mystatus_bg_offline.png rename to retroshare-gui/src/gui/images/avatarstatus-bg-offline-70.png diff --git a/retroshare-gui/src/gui/images/avatarstatus_bg_online.png b/retroshare-gui/src/gui/images/avatarstatus-bg-online-116.png similarity index 100% rename from retroshare-gui/src/gui/images/avatarstatus_bg_online.png rename to retroshare-gui/src/gui/images/avatarstatus-bg-online-116.png diff --git a/retroshare-gui/src/gui/images/mystatus_bg_online.png b/retroshare-gui/src/gui/images/avatarstatus-bg-online-70.png similarity index 100% rename from retroshare-gui/src/gui/images/mystatus_bg_online.png rename to retroshare-gui/src/gui/images/avatarstatus-bg-online-70.png diff --git a/retroshare-gui/src/gui/images/no_avatar.png b/retroshare-gui/src/gui/images/no_avatar.png deleted file mode 100644 index eac675fdd93cb9d6718ce7003e8aef4bf1aa3489..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4019 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 EKlXdxGynhq delta 17292 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 abbrechen + + AvatarWidget + + + Click to change your avatar + Klick zum Ändern deines Avatars + + BandwidthGraph @@ -678,7 +686,7 @@ p, li { white-space: pre-wrap; } CertificatePage - + Certificate files Zertifikat-Dateien @@ -1069,7 +1077,7 @@ p, li { white-space: pre-wrap; } ChatMsgItem - + Remove Item Eintrag entfernen @@ -1105,7 +1113,7 @@ p, li { white-space: pre-wrap; } Abbrechen - + Quick Message Schnelle Nachrricht @@ -1338,7 +1346,7 @@ p, li { white-space: pre-wrap; } ConfCertDialog - + Cancel Abbrechen @@ -1348,7 +1356,7 @@ p, li { white-space: pre-wrap; } OK - + Peer Info Nachbar Info @@ -1368,12 +1376,12 @@ p, li { white-space: pre-wrap; } Peer ID - + Peer Address Adresse des Nachbarn - + Deny Friend Blockiere Freund @@ -1409,7 +1417,7 @@ p, li { white-space: pre-wrap; } Nachbar Schlüssel ist unterzeichnet von: - + Last Contact Letzter Kontakt @@ -1434,7 +1442,7 @@ p, li { white-space: pre-wrap; } Status - + Local Address Lokale Adresse @@ -1455,7 +1463,7 @@ p, li { white-space: pre-wrap; } Adressenliste - + None Nicht @@ -1497,14 +1505,14 @@ p, li { white-space: pre-wrap; } Übernehmen und Schliessen - - + + RetroShare - - + + Error : cannot get peer details. Fehler: Kann Peer Details nicht ermitteln. @@ -1571,22 +1579,22 @@ und meinen GPG Schlüssel nicht unterzeichnet Vertrauen - + Dynamic DNS Dynamisches DNS - + Show Help for Trust Settings and Signing Zeige Hilfe - + RetroShare ID - + Certificate Zertifikat @@ -1594,7 +1602,7 @@ und meinen GPG Schlüssel nicht unterzeichnet ConnectFriendWizard - + Connect Friend Wizard Assistent um sich zu einem Freund zu verbinden @@ -2295,6 +2303,21 @@ p, li { white-space: pre-wrap; } Name Name + + + check peers you would like to share private publish key with + Wähle die Nachbarn, an die du den privaten Schlüssel verteilen möchtest + + + + Share Key With + Schlüssel verteilen an + + + + Contacts: + Kontakte: + Description @@ -2306,7 +2329,7 @@ p, li { white-space: pre-wrap; } Typ: - + Public - Anyone can read and publish (Shared Publish Key) Öffentlich - Jeder kann lesen und schreiben (gemeinsamer Veröffentlichungs-Schlüssel) @@ -2322,6 +2345,21 @@ p, li { white-space: pre-wrap; } + Key Sharing + Schlüsselverteilung + + + + Key recipients can publish to restricted-type channels, and can view and publish for private-type channels + + + + + Share Private Publish Key + Verteile privaten Schlüssel + + + Allowed Messages Erlaubte Nachrichten @@ -2346,7 +2384,7 @@ p, li { white-space: pre-wrap; } Erstellen - + Please add a Name Bitte Name hinzüfügen @@ -3129,7 +3167,7 @@ Das ist nützlich, wenn Du eine externe Festplatte freigibst und die Datei nicht EmailPage - + Invite Friends by Email Lade Freunde per Email ein @@ -3636,13 +3674,13 @@ p, li { white-space: pre-wrap; } - - + + Subject: Betreff: - + Unsubscribe To Forum Forum abbestellen @@ -3652,7 +3690,7 @@ p, li { white-space: pre-wrap; } Antwort - + Send Senden @@ -3662,7 +3700,7 @@ p, li { white-space: pre-wrap; } Unterzeichnen - + Forum Post Beitrag @@ -3684,7 +3722,7 @@ p, li { white-space: pre-wrap; } Als Antwort auf - + Please give a Text Message Bitte Nachricht eingeben @@ -3738,7 +3776,7 @@ p, li { white-space: pre-wrap; } ForumsDialog - + Subscribe to Forum Forum abonnieren @@ -3764,11 +3802,16 @@ p, li { white-space: pre-wrap; } + Share Forum + + + + Restore Publish Rights for Forum - + Copy RetroShare Link Kopiere RetroShare Link @@ -3835,7 +3878,7 @@ p, li { white-space: pre-wrap; } Du kannst einem anonymen Autor nicht antworten - + Your Forums Deine Foren @@ -3977,7 +4020,7 @@ p, li { white-space: pre-wrap; } Druckvorschau - + Start New Thread Erstelle neues Thema @@ -4027,7 +4070,7 @@ p, li { white-space: pre-wrap; } ForumsFillThread - + Anonymous Anonym @@ -4081,12 +4124,11 @@ p, li { white-space: pre-wrap; } Status - Add or Change your Avatar - Wähle oder ändere dein Avatar Bild + Wähle oder ändere dein Avatar Bild - + Edit Personal message Statusnachricht ändern @@ -4142,7 +4184,7 @@ p, li { white-space: pre-wrap; } - + Add Friend Freund hinzufügen @@ -4259,7 +4301,7 @@ p, li { white-space: pre-wrap; } Löscht den gespeicherten und angezeigten Chat Verlauf - + Profile Profil @@ -4274,7 +4316,7 @@ p, li { white-space: pre-wrap; } Willkommen bei RetroShare's Gruppenchat. - + me ich @@ -4421,7 +4463,7 @@ p, li { white-space: pre-wrap; } tippt... - + New group chat Neuer Gruppenchat @@ -4432,7 +4474,7 @@ p, li { white-space: pre-wrap; } Willst Du wirklich den Nachrichtenverlauf physisch löschen? - + Add Extra File Zusätzliche Datei hinzufügen @@ -5754,7 +5796,7 @@ p, li { white-space: pre-wrap; } IntroPage - + &Make friend with selected friends of my friends &Füge ausgewählte Freunde Deiner Freunde hinzu @@ -6119,7 +6161,7 @@ Bitte gib etwas Speicher frei und drücke OK. MessageComposer - + Compose Verfassen @@ -6605,7 +6647,7 @@ Willst Du die Nachricht speichern ? Unterstützte Bilddateien (*.png *.jpeg *.jpg *.gif) - + Add Extra File Zusätzliche Datei hinzufügen @@ -6626,7 +6668,7 @@ Willst Du die Nachricht speichern ? Datei nicht gefunden oder Dateiname nicht akzeptiert. - + Friend Recommendation(s) Freundempfehlung(en) @@ -7331,7 +7373,7 @@ p, li { white-space: pre-wrap; } MessengerWindow - + Expand all Alle erweitern @@ -7391,7 +7433,7 @@ p, li { white-space: pre-wrap; } <strong>RetroShare Instanz</strong> - + Save Certificate Zertifikat speichern @@ -7401,12 +7443,11 @@ p, li { white-space: pre-wrap; } Zertifikate (*.pqi) - Click to Change your Avatar - Klick zum Ändern deines Avatars + Klick zum Ändern deines Avatars - + Add a Friend Einen Freund hinzufügen @@ -7421,7 +7462,7 @@ p, li { white-space: pre-wrap; } Suche Freunde - + Sort Descending Order Absteigend sortieren @@ -7448,22 +7489,22 @@ p, li { white-space: pre-wrap; } Verstecke offline Freunde - + Reset Zurücksetzen - + Sort by State Sortiere nach Status - + Recomend this Friend to... Freund weiterempfehlen... - + RetroShare Messenger @@ -7477,7 +7518,7 @@ p, li { white-space: pre-wrap; } MsgItem - + Remove Item Entferne Element @@ -8155,13 +8196,13 @@ p, li { white-space: pre-wrap; } PeerItem - + Remove Item Entferne Element - + Expand Erweitern @@ -8274,7 +8315,7 @@ p, li { white-space: pre-wrap; } Verbergen - + Quick Message Schnelle Nachrricht @@ -8710,7 +8751,7 @@ p, li { white-space: pre-wrap; } PopupChatDialog - + Hide Avatar Avatar verstecken @@ -8725,7 +8766,7 @@ p, li { white-space: pre-wrap; } Willst Du wirklich den Nachrichtenverlauf physisch löschen? - + Load Picture File Lade Bilddatei @@ -8735,12 +8776,12 @@ p, li { white-space: pre-wrap; } Datei nicht gefunden oder Dateiname nicht akzeptiert. - + Messages you send will be delivered after Friend is again Online Nachrichten, die Du versendest gehen bei diesem Freund erst wieder ein wenn er Online ist - + Bold Fett @@ -8813,7 +8854,7 @@ p, li { white-space: pre-wrap; } Durchgestrichen - + Add Extra File Zusätzlich eine Datei hinzufügen @@ -8850,7 +8891,7 @@ p, li { white-space: pre-wrap; } Text Datei (*.txt );;Alle Dateien (*) - + Your Friend is offline Do you want to send them a Message instead Dein Freund ist Offline willst du ihm stattdessen eine Nachricht senden @@ -8861,27 +8902,27 @@ Do you want to send them a Message instead Bild anhängen - + is Idle and may not reply antwortet möglicherweise nicht, da der Status auf "Untätig" gesetzt wurde - + is Away and may not reply antwortet möglicherweise nicht, da der Status auf "Abwesend" gesetzt wurde - + is Busy and may not reply antwortet möglicherweise nicht, da der Status auf "Beschäftigt" gesetzt wurde - + apears to be Offline. ist Offline. - + Paste RetroShare Link RetroShare Link einfügen @@ -8896,7 +8937,7 @@ Do you want to send them a Message instead Schliessen - + Friend not Online Freund ist nicht online @@ -9083,7 +9124,7 @@ Do you want to send them a Message instead ProfileView - + Clear Photo Photo entfernen @@ -9562,7 +9603,7 @@ Lockdatei: Link ist fehlerhaft. - + Deny friend Blockiere Freund @@ -10091,7 +10132,7 @@ p, li { white-space: pre-wrap; } RsidPage - + RetroShare ID RetroShare ID @@ -10407,8 +10448,8 @@ p, li { white-space: pre-wrap; } SecurityItem - - + + Expand Erweitern @@ -10498,7 +10539,7 @@ p, li { white-space: pre-wrap; } Nachricht schreiben - + Connect Attempt Verbindungsversuch @@ -10523,7 +10564,7 @@ p, li { white-space: pre-wrap; } Unbekanntes Sicherheitsproblem - + @@ -10543,7 +10584,7 @@ p, li { white-space: pre-wrap; } Willst du diesen Freund entfernen? - + Quick Message Schnelle Nachrricht @@ -10843,7 +10884,7 @@ p, li { white-space: pre-wrap; } Abbrechen - + Select A Folder To Share Wähle einen Ordner zum Freigeben aus @@ -10907,7 +10948,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Wähle die Freunde aus, mit denen Du den Kanal teilen möchtest.</span></p></body></html> - + RetroShare @@ -12041,7 +12082,7 @@ p, li { white-space: pre-wrap; } TextPage - + Use text representation of the PGP certificates. Verwende diesen Text als PGP Zertifikat. @@ -12071,7 +12112,32 @@ p, li { white-space: pre-wrap; } Bereinige Zertifikat - + + No or misspelled BEGIN tag found + + + + + No or misspelled END tag found + + + + + No checksum found (the last 5 chars should be separated by a '=' char), or no newline after tag line (e.g. line beginning with Version:) + + + + + Unknown error. Your cert is probably not even a certificate. + + + + + Certificate cleaning error + + + + Save as... Speichern unter... @@ -12091,7 +12157,7 @@ p, li { white-space: pre-wrap; } - + Text certificate Text-Zertifikat @@ -12106,7 +12172,7 @@ p, li { white-space: pre-wrap; } Starte das Standard-Emailprogramm - + Connect Friend Help Verbindungshilfe @@ -12121,7 +12187,7 @@ p, li { white-space: pre-wrap; } Dein Zertiifkat ist in in die Zwischenablage kopiert worden - + RetroShare Invite RetroShare Einladung @@ -12560,7 +12626,12 @@ p, li { white-space: pre-wrap; } TreeStyle_RDM - + + My files + + + + FILE DATEI diff --git a/retroshare-gui/src/main.cpp b/retroshare-gui/src/main.cpp index e86012f56..93dfee507 100644 --- a/retroshare-gui/src/main.cpp +++ b/retroshare-gui/src/main.cpp @@ -285,8 +285,6 @@ int main(int argc, char *argv[]) QObject::connect(notify,SIGNAL(downloadCompleteCountChanged(int)) ,w ,SLOT(updateTransfers(int) )); QObject::connect(notify,SIGNAL(chatStatusChanged(const QString&,const QString&,bool)),w->friendsDialog,SLOT(updatePeerStatusString(const QString&,const QString&,bool))); - QObject::connect(notify,SIGNAL(peerHasNewAvatar(const QString&)),w->friendsDialog,SLOT(updatePeersAvatar(const QString&))); - QObject::connect(notify,SIGNAL(ownAvatarChanged()),w->friendsDialog,SLOT(updateAvatar())); QObject::connect(notify,SIGNAL(ownStatusMessageChanged()),w->friendsDialog,SLOT(loadmypersonalstatus())); QObject::connect(notify,SIGNAL(logInfoChanged(const QString&)) ,w->networkDialog,SLOT(setLogInfo(QString))) ;