linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #04622
[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2635: Users frame fixes
------------------------------------------------------------
revno: 2635
fixes bug: https://launchpad.net/bugs/832350
committer: Jacek Sieka <arnetheduck@xxxxxxxxx>
branch nick: dcplusplus
timestamp: Thu 2011-10-13 22:43:14 +0900
message:
Users frame fixes
modified:
dcpp/FavoriteManager.cpp
dcpp/FavoriteManager.h
dcpp/FavoriteManagerListener.h
dcpp/stdinc.h
win32/HubFrame.cpp
win32/HubFrame.h
win32/UsersFrame.cpp
win32/UsersFrame.h
win32/stdafx.h
--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk
Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'dcpp/FavoriteManager.cpp'
--- dcpp/FavoriteManager.cpp 2011-10-01 14:33:43 +0000
+++ dcpp/FavoriteManager.cpp 2011-10-13 13:43:14 +0000
@@ -580,6 +580,7 @@
if(i != users.end()) {
FavoriteUser& fu = i->second;
fu.update(info);
+ fire(FavoriteManagerListener::UserUpdated(), i->second);
save();
}
}
@@ -618,6 +619,12 @@
return false;
}
+optional<FavoriteUser> FavoriteManager::getFavoriteUser(const UserPtr &aUser) const {
+ Lock l(cs);
+ auto i = users.find(aUser->getCID());
+ return i == users.end() ? optional<FavoriteUser>() : i->second;
+}
+
bool FavoriteManager::hasSlot(const UserPtr& aUser) const {
Lock l(cs);
FavoriteMap::const_iterator i = users.find(aUser->getCID());
@@ -643,6 +650,9 @@
i->second.setFlag(FavoriteUser::FLAG_GRANTSLOT);
else
i->second.unsetFlag(FavoriteUser::FLAG_GRANTSLOT);
+
+ fire(FavoriteManagerListener::UserUpdated(), i->second);
+
save();
}
void FavoriteManager::setUserDescription(const UserPtr& aUser, const string& description) {
@@ -651,6 +661,9 @@
if(i == users.end())
return;
i->second.setDescription(description);
+
+ fire(FavoriteManagerListener::UserUpdated(), i->second);
+
save();
}
=== modified file 'dcpp/FavoriteManager.h'
--- dcpp/FavoriteManager.h 2011-10-02 12:14:41 +0000
+++ dcpp/FavoriteManager.h 2011-10-13 13:43:14 +0000
@@ -19,6 +19,8 @@
#ifndef DCPLUSPLUS_DCPP_FAVORITE_MANAGER_H
#define DCPLUSPLUS_DCPP_FAVORITE_MANAGER_H
+#include <boost/optional.hpp>
+
#include "SettingsManager.h"
#include "CriticalSection.h"
@@ -34,6 +36,8 @@
namespace dcpp {
+using boost::optional;
+
class SimpleXML;
/**
@@ -72,6 +76,7 @@
bool isFavoriteUser(const UserPtr& aUser) const { Lock l(cs); return users.find(aUser->getCID()) != users.end(); }
void removeFavoriteUser(const UserPtr& aUser);
+ optional<FavoriteUser> getFavoriteUser(const UserPtr& aUser) const;
bool hasSlot(const UserPtr& aUser) const;
void setUserDescription(const UserPtr& aUser, const string& description);
void setAutoGrant(const UserPtr& aUser, bool grant);
=== modified file 'dcpp/FavoriteManagerListener.h'
--- dcpp/FavoriteManagerListener.h 2011-03-29 20:40:28 +0000
+++ dcpp/FavoriteManagerListener.h 2011-10-13 13:43:14 +0000
@@ -35,10 +35,11 @@
typedef X<3> FavoriteAdded;
typedef X<4> FavoriteRemoved;
typedef X<5> UserAdded;
- typedef X<6> UserRemoved;
- typedef X<7> StatusChanged;
- typedef X<8> LoadedFromCache;
- typedef X<9> Corrupted;
+ typedef X<6> UserUpdated;
+ typedef X<7> UserRemoved;
+ typedef X<8> StatusChanged;
+ typedef X<9> LoadedFromCache;
+ typedef X<10> Corrupted;
virtual void on(DownloadStarting, const string&) noexcept { }
virtual void on(DownloadFailed, const string&) noexcept { }
@@ -46,6 +47,7 @@
virtual void on(FavoriteAdded, const FavoriteHubEntryPtr) noexcept { }
virtual void on(FavoriteRemoved, const FavoriteHubEntryPtr) noexcept { }
virtual void on(UserAdded, const FavoriteUser&) noexcept { }
+ virtual void on(UserUpdated, const FavoriteUser&) noexcept { }
virtual void on(UserRemoved, const FavoriteUser&) noexcept { }
virtual void on(StatusChanged, const UserPtr&) noexcept { }
virtual void on(LoadedFromCache, const string&, const string&) noexcept { }
=== modified file 'dcpp/stdinc.h'
--- dcpp/stdinc.h 2011-05-04 19:32:00 +0000
+++ dcpp/stdinc.h 2011-10-13 13:43:14 +0000
@@ -70,6 +70,7 @@
#include <boost/intrusive_ptr.hpp>
#include <boost/noncopyable.hpp>
+#include <boost/optional.hpp>
#include <boost/range/algorithm/find_if.hpp>
#include <boost/range/algorithm/find.hpp>
#include <boost/regex.hpp>
=== modified file 'win32/HubFrame.cpp'
--- win32/HubFrame.cpp 2011-10-10 20:18:18 +0000
+++ win32/HubFrame.cpp 2011-10-13 13:43:14 +0000
@@ -793,7 +793,7 @@
void HubFrame::on(Connected, Client*) noexcept {
callAsync([this] { onConnected(); });
}
-void HubFrame::on(UserUpdated, Client*, const OnlineUser& user) noexcept {
+void HubFrame::on(ClientListener::UserUpdated, Client*, const OnlineUser& user) noexcept {
addTask(UPDATE_USER_JOIN, user);
}
void HubFrame::on(UsersUpdated, Client*, const OnlineUserList& aList) noexcept {
=== modified file 'win32/HubFrame.h'
--- win32/HubFrame.h 2011-09-30 11:33:12 +0000
+++ win32/HubFrame.h 2011-10-13 13:43:14 +0000
@@ -276,7 +276,7 @@
// ClientListener
virtual void on(Connecting, Client*) noexcept;
virtual void on(Connected, Client*) noexcept;
- virtual void on(UserUpdated, Client*, const OnlineUser&) noexcept;
+ virtual void on(ClientListener::UserUpdated, Client*, const OnlineUser&) noexcept;
virtual void on(UsersUpdated, Client*, const OnlineUserList&) noexcept;
virtual void on(ClientListener::UserRemoved, Client*, const OnlineUser&) noexcept;
virtual void on(Redirect, Client*, const string&) noexcept;
=== modified file 'win32/UsersFrame.cpp'
--- win32/UsersFrame.cpp 2011-10-10 20:18:18 +0000
+++ win32/UsersFrame.cpp 2011-10-13 13:43:14 +0000
@@ -226,38 +226,51 @@
SettingsManager::getInstance()->set(SettingsManager::USERSFRAME_WIDTHS, WinUtil::toString(users->getColumnWidths()));
}
-UsersFrame::UserInfo::UserInfo(const FavoriteUser& u) :
-UserInfoBase(HintedUser(u.getUser(), Util::emptyString)) /// @todo fav users aren't aware of hub hints for now
-{
- update(u);
-}
-
-UsersFrame::UserInfo::UserInfo(const UserPtr& u) :
-UserInfoBase(HintedUser(u, Util::emptyString)) /// @todo fav users aren't aware of hub hints for now
-{
- update(u);
+UsersFrame::UserInfo::UserInfo(const UserPtr& u, bool visible) :
+UserInfoBase(HintedUser(u, Util::emptyString))
+{
+ update(u, visible);
}
void UsersFrame::UserInfo::remove() {
FavoriteManager::getInstance()->removeFavoriteUser(user);
}
-void UsersFrame::UserInfo::update(const UserPtr& u) {
- columns[COLUMN_NICK] = WinUtil::getNicks(u, Util::emptyString);
- columns[COLUMN_HUB] = u->isOnline() ? WinUtil::getHubNames(u, Util::emptyString).first : Util::emptyStringT;
- columns[COLUMN_SEEN] = u->isOnline() ? T_("Online") : Text::toT(Util::formatTime("%Y-%m-%d %H:%M", FavoriteManager::getInstance()->getLastSeen(u)));
+void UsersFrame::UserInfo::update(const UserPtr& u, bool visible) {
+ auto fu = FavoriteManager::getInstance()->getFavoriteUser(u);
+ if(fu) {
+ isFavorite = true;
+ grantSlot = fu->isSet(FavoriteUser::FLAG_GRANTSLOT);
+ columns[COLUMN_NICK] = Text::toT(fu->getNick());
+ if(!visible) {
+ return;
+ }
+ columns[COLUMN_DESCRIPTION] = Text::toT(fu->getDescription());
+
+ if(u->isOnline()) {
+ columns[COLUMN_SEEN] = T_("Online");
+ columns[COLUMN_HUB] = WinUtil::getHubNames(u, Util::emptyString).first;
+ } else {
+ columns[COLUMN_SEEN] = fu->getLastSeen() > 0 ? Text::toT(Util::formatTime("%Y-%m-%d %H:%M", fu->getLastSeen())) : T_("Offline");
+ columns[COLUMN_HUB] = Text::toT(fu->getUrl());
+ }
+ } else {
+ isFavorite = false;
+ grantSlot = false;
+ columns[COLUMN_NICK] = WinUtil::getNicks(u, Util::emptyString);
+
+ if(!visible) {
+ return;
+ }
+ if(u->isOnline()) {
+ columns[COLUMN_SEEN] = T_("Online");
+ columns[COLUMN_HUB] = WinUtil::getHubNames(u, Util::emptyString).first;
+ } else {
+ columns[COLUMN_SEEN] = T_("Offline");
+ }
+ }
+
columns[COLUMN_CID] = Text::toT(u->getCID().toBase32());
-
- isFavorite = FavoriteManager::getInstance()->isFavoriteUser(u);
- grantSlot = FavoriteManager::getInstance()->hasSlot(u);
-}
-
-void UsersFrame::UserInfo::update(const FavoriteUser& u) {
- columns[COLUMN_NICK] = Text::toT(u.getNick());
- columns[COLUMN_HUB] = u.getUser()->isOnline() ? WinUtil::getHubNames(u.getUser(), Util::emptyString).first : Text::toT(u.getUrl());
- columns[COLUMN_SEEN] = u.getUser()->isOnline() ? T_("Online") : Text::toT(Util::formatTime("%Y-%m-%d %H:%M", u.getLastSeen()));
- columns[COLUMN_DESCRIPTION] = Text::toT(u.getDescription());
- columns[COLUMN_CID] = Text::toT(u.getUser()->getCID().toBase32());
}
void UsersFrame::addUser(const UserPtr& aUser) {
@@ -267,11 +280,11 @@
auto ui = userInfos.find(aUser);
if(ui == userInfos.end()) {
- auto x = dwt::make_shared<UserInfo>(aUser);
- userInfos.insert(std::make_pair(aUser, x));
+ auto x = userInfos.insert(std::make_pair(aUser, UserInfo(aUser, false))).first;
- if(matches(*x)) {
- users->insert(x.get());
+ if(matches(x->second)) {
+ x->second.update(aUser, true);
+ users->insert(&x->second);
}
} else {
updateUser(aUser);
@@ -281,16 +294,19 @@
void UsersFrame::updateUser(const UserPtr& aUser) {
auto ui = userInfos.find(aUser);
if(ui != userInfos.end()) {
- if(!show(aUser, true)) {
- users->erase(ui->second.get());
- userInfos.erase(ui);
+ ui->second.update(aUser, false);
+
+ if(!show(aUser, false)) {
+ users->erase(&ui->second);
+ if(!show(aUser, true)) {
+ userInfos.erase(aUser);
+ }
return;
}
- ui->second->update(aUser);
-
- if(matches(*ui->second)) {
- auto i = users->find(ui->second.get());
+ if(matches(ui->second)) {
+ ui->second.update(aUser, true);
+ auto i = users->find(&ui->second);
if(i != -1) {
if(users->getSelected() == i) {
handleSelectionChanged();
@@ -298,7 +314,7 @@
users->update(i);
}
} else {
- users->insert(ui->second.get());
+ users->insert(&ui->second);
}
}
}
@@ -460,15 +476,10 @@
} else {
FavoriteManager::getInstance()->addFavoriteUser(ui->getUser());
}
-
- ui->isFavorite = !ui->isFavorite;
- users->update(item.first);
break;
case COLUMN_SLOT:
FavoriteManager::getInstance()->setAutoGrant(ui->getUser(), !ui->grantSlot);
- ui->grantSlot = !ui->grantSlot;
- users->update(item.first);
break;
default:
@@ -482,8 +493,9 @@
HoldRedraw h(users);
users->clear();
for(auto i = userInfos.begin(); i != userInfos.end(); ++i) {
- if(matches(*i->second)) {
- users->insert(i->second.get());
+ if(matches(i->second)) {
+ i->second.update(i->first, true);
+ users->insert(&i->second);
}
}
}
@@ -534,6 +546,10 @@
callAsync([=] { addUser(u); });
}
+void UsersFrame::on(FavoriteManagerListener::UserUpdated, const FavoriteUser& aUser) noexcept {
+ auto u = aUser.getUser();
+ callAsync([=] { updateUser(u); });
+}
void UsersFrame::on(UserRemoved, const FavoriteUser& aUser) noexcept {
auto u = aUser.getUser();
callAsync([=] { updateUser(u); });
@@ -547,7 +563,7 @@
callAsync([=] { addUser(aUser); });
}
-void UsersFrame::on(UserUpdated, const UserPtr& aUser) noexcept {
+void UsersFrame::on(ClientManagerListener::UserUpdated, const UserPtr& aUser) noexcept {
callAsync([=] { updateUser(aUser); });
}
=== modified file 'win32/UsersFrame.h'
--- win32/UsersFrame.h 2011-05-04 19:32:00 +0000
+++ win32/UsersFrame.h 2011-10-13 13:43:14 +0000
@@ -82,8 +82,7 @@
class UserInfo : public UserInfoBase {
public:
- UserInfo(const UserPtr& u);
- UserInfo(const FavoriteUser& u);
+ UserInfo(const UserPtr& u, bool visible);
const tstring& getText(int col) const {
return columns[col];
@@ -107,8 +106,7 @@
void remove();
- void update(const UserPtr& u);
- void update(const FavoriteUser& u);
+ void update(const UserPtr& u, bool visible);
tstring columns[COLUMN_LAST];
@@ -134,8 +132,7 @@
static dwt::ImageListPtr userIcons;
- // TODO change to unique_ptr once g++ map supports it (no move insert in 4.5 it seems...)
- std::unordered_map<UserPtr, dwt::shared_ptr<UserInfo>, User::Hash> userInfos;
+ std::unordered_map<UserPtr, UserInfo, User::Hash> userInfos;
bool startup;
@@ -159,12 +156,13 @@
// FavoriteManagerListener
virtual void on(UserAdded, const FavoriteUser& aUser) noexcept;
+ virtual void on(FavoriteManagerListener::UserUpdated, const FavoriteUser& aUser) noexcept;
virtual void on(UserRemoved, const FavoriteUser& aUser) noexcept;
virtual void on(StatusChanged, const UserPtr& aUser) noexcept;
// ClientManagerListner
virtual void on(UserConnected, const UserPtr& aUser) noexcept;
- virtual void on(UserUpdated, const UserPtr& aUser) noexcept;
+ virtual void on(ClientManagerListener::UserUpdated, const UserPtr& aUser) noexcept;
virtual void on(UserDisconnected, const UserPtr& aUser) noexcept;
// UploadManagerListener
=== modified file 'win32/stdafx.h'
--- win32/stdafx.h 2011-08-22 16:13:21 +0000
+++ win32/stdafx.h 2011-10-13 13:43:14 +0000
@@ -30,6 +30,7 @@
#ifdef HAS_PCH
+
#include <dwt/forward.h>
#include <dwt/util/StringUtils.h>
#include <dwt/widgets/Button.h>