root / kadu-core / status / status-container-manager.cpp @ 673213a7
History | View | Annotate | Download (8.5 kB)
| 1 | /*
|
|---|---|
| 2 | * %kadu copyright begin% |
| 3 | * Copyright 2009, 2010, 2010, 2011 Piotr Galiszewski (piotr.galiszewski@kadu.im) |
| 4 | * Copyright 2010 Wojciech Treter (juzefwt@gmail.com) |
| 5 | * Copyright 2010, 2011 Piotr Dąbrowski (ultr@ultr.pl) |
| 6 | * Copyright 2009, 2009, 2010, 2011 Rafał Malinowski (rafal.przemyslaw.malinowski@gmail.com) |
| 7 | * Copyright 2010, 2011 Bartosz Brachaczek (b.brachaczek@gmail.com) |
| 8 | * %kadu copyright end% |
| 9 | * |
| 10 | * This program is free software; you can redistribute it and/or |
| 11 | * modify it under the terms of the GNU General Public License as |
| 12 | * published by the Free Software Foundation; either version 2 of |
| 13 | * the License, or (at your option) any later version. |
| 14 | * |
| 15 | * This program is distributed in the hope that it will be useful, |
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 18 | * GNU General Public License for more details. |
| 19 | * |
| 20 | * You should have received a copy of the GNU General Public License |
| 21 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 22 | */ |
| 23 | |
| 24 | #include "accounts/account-manager.h" |
| 25 | #include "accounts/account.h" |
| 26 | #include "configuration/main-configuration-holder.h" |
| 27 | #include "core/core.h" |
| 28 | #include "icons/icons-manager.h" |
| 29 | #include "icons/kadu-icon.h" |
| 30 | #include "identities/identity-manager.h" |
| 31 | #include "protocols/protocol.h" |
| 32 | #include "status/all-accounts-status-container.h" |
| 33 | #include "status/status-container-aware-object.h" |
| 34 | #include "status/status-type-manager.h" |
| 35 | #include "status/status-type.h" |
| 36 | |
| 37 | #include "status-container-manager.h" |
| 38 | |
| 39 | StatusContainerManager * StatusContainerManager::Instance = 0;
|
| 40 | |
| 41 | StatusContainerManager * StatusContainerManager::instance() |
| 42 | {
|
| 43 | if (!Instance)
|
| 44 | Instance = new StatusContainerManager();
|
| 45 | return Instance;
|
| 46 | } |
| 47 | |
| 48 | StatusContainerManager::StatusContainerManager() : |
| 49 | StatusContainer(0), DefaultStatusContainer(0) |
| 50 | {
|
| 51 | AllAccountsContainer = new AllAccountsStatusContainer(this); |
| 52 | |
| 53 | if (MainConfigurationHolder::instance()->isSetStatusPerIdentity())
|
| 54 | triggerAllIdentitiesAdded(); |
| 55 | else if (MainConfigurationHolder::instance()->isSetStatusPerAccount()) |
| 56 | triggerAllAccountsRegistered(); |
| 57 | else
|
| 58 | registerStatusContainer(AllAccountsContainer); |
| 59 | |
| 60 | connect(MainConfigurationHolder::instance(), SIGNAL(setStatusModeChanged()), this, SLOT(setStatusModeChanged()));
|
| 61 | connect(AccountManager::instance(), SIGNAL(accountUpdated(Account)), this, SLOT(updateIdentities()));
|
| 62 | } |
| 63 | |
| 64 | StatusContainerManager::~StatusContainerManager() |
| 65 | {
|
| 66 | disconnect(AccountManager::instance(), 0, this, 0); |
| 67 | disconnect(MainConfigurationHolder::instance(), 0, this, 0); |
| 68 | |
| 69 | if (MainConfigurationHolder::instance()->isSetStatusPerIdentity())
|
| 70 | triggerAllIdentitiesRemoved(); |
| 71 | else if (MainConfigurationHolder::instance()->isSetStatusPerAccount()) |
| 72 | triggerAllAccountsUnregistered(); |
| 73 | else
|
| 74 | unregisterStatusContainer(AllAccountsContainer); |
| 75 | } |
| 76 | |
| 77 | void StatusContainerManager::updateIdentities()
|
| 78 | {
|
| 79 | if (!MainConfigurationHolder::instance()->isSetStatusPerIdentity())
|
| 80 | return;
|
| 81 | |
| 82 | foreach (const Identity &identity, IdentityManager::instance()->items())
|
| 83 | if (StatusContainers.contains(identity) && !identity.hasAnyAccountWithDetails())
|
| 84 | unregisterStatusContainer(identity); |
| 85 | else if (!StatusContainers.contains(identity) && identity.hasAnyAccountWithDetails()) |
| 86 | registerStatusContainer(identity); |
| 87 | } |
| 88 | |
| 89 | void StatusContainerManager::accountRegistered(Account account)
|
| 90 | {
|
| 91 | if (MainConfigurationHolder::instance()->isSetStatusPerAccount() && !StatusContainers.contains(account.statusContainer()))
|
| 92 | registerStatusContainer(account.statusContainer()); |
| 93 | |
| 94 | if (MainConfigurationHolder::instance()->isSetStatusPerIdentity() && !StatusContainers.contains(account.accountIdentity()))
|
| 95 | updateIdentities(); |
| 96 | } |
| 97 | |
| 98 | void StatusContainerManager::accountUnregistered(Account account)
|
| 99 | {
|
| 100 | if (MainConfigurationHolder::instance()->isSetStatusPerAccount() && StatusContainers.contains(account.statusContainer()))
|
| 101 | unregisterStatusContainer(account.statusContainer()); |
| 102 | |
| 103 | if (MainConfigurationHolder::instance()->isSetStatusPerIdentity())
|
| 104 | updateIdentities(); |
| 105 | } |
| 106 | |
| 107 | void StatusContainerManager::identityAdded(Identity identity)
|
| 108 | {
|
| 109 | if (MainConfigurationHolder::instance()->isSetStatusPerIdentity() && !StatusContainers.contains(identity) && identity.hasAnyAccountWithDetails())
|
| 110 | registerStatusContainer(identity); |
| 111 | } |
| 112 | |
| 113 | void StatusContainerManager::identityRemoved(Identity identity)
|
| 114 | {
|
| 115 | if (MainConfigurationHolder::instance()->isSetStatusPerIdentity() && StatusContainers.contains(identity))
|
| 116 | unregisterStatusContainer(identity); |
| 117 | } |
| 118 | |
| 119 | void StatusContainerManager::cleanStatusContainers()
|
| 120 | {
|
| 121 | while (!StatusContainers.isEmpty())
|
| 122 | unregisterStatusContainer(StatusContainers.at(0));
|
| 123 | } |
| 124 | |
| 125 | void StatusContainerManager::addAllAccounts()
|
| 126 | {
|
| 127 | foreach (Account account, AccountManager::instance()->items()) |
| 128 | registerStatusContainer(account.statusContainer()); |
| 129 | } |
| 130 | |
| 131 | void StatusContainerManager::addAllIdentities()
|
| 132 | {
|
| 133 | updateIdentities(); |
| 134 | } |
| 135 | |
| 136 | void StatusContainerManager::setDefaultStatusContainer(StatusContainer *defaultStatusContainer)
|
| 137 | {
|
| 138 | if (defaultStatusContainer == DefaultStatusContainer)
|
| 139 | return;
|
| 140 | |
| 141 | if (DefaultStatusContainer)
|
| 142 | disconnect(DefaultStatusContainer, 0, this, 0); |
| 143 | |
| 144 | if (this != defaultStatusContainer) |
| 145 | DefaultStatusContainer = defaultStatusContainer; |
| 146 | else
|
| 147 | DefaultStatusContainer = 0;
|
| 148 | |
| 149 | if (DefaultStatusContainer)
|
| 150 | connect(DefaultStatusContainer, SIGNAL(statusUpdated()), this, SIGNAL(statusUpdated()));
|
| 151 | |
| 152 | emit statusUpdated(); |
| 153 | } |
| 154 | |
| 155 | void StatusContainerManager::setStatusModeChanged()
|
| 156 | {
|
| 157 | cleanStatusContainers(); |
| 158 | if (MainConfigurationHolder::instance()->isSetStatusPerIdentity())
|
| 159 | addAllIdentities(); |
| 160 | else if (MainConfigurationHolder::instance()->isSetStatusPerAccount()) |
| 161 | addAllAccounts(); |
| 162 | else
|
| 163 | registerStatusContainer(AllAccountsContainer); |
| 164 | } |
| 165 | |
| 166 | void StatusContainerManager::registerStatusContainer(StatusContainer *statusContainer)
|
| 167 | {
|
| 168 | if (StatusContainers.isEmpty())
|
| 169 | setDefaultStatusContainer(statusContainer); |
| 170 | |
| 171 | emit statusContainerAboutToBeRegistered(statusContainer); |
| 172 | StatusContainers.append(statusContainer); |
| 173 | emit statusContainerRegistered(statusContainer); |
| 174 | StatusContainerAwareObject::notifyStatusContainerRegistered(statusContainer); |
| 175 | |
| 176 | connect(statusContainer, SIGNAL(statusUpdated()), this, SIGNAL(statusUpdated()));
|
| 177 | } |
| 178 | |
| 179 | void StatusContainerManager::unregisterStatusContainer(StatusContainer *statusContainer)
|
| 180 | {
|
| 181 | emit statusContainerAboutToBeUnregistered(statusContainer); |
| 182 | StatusContainers.removeAll(statusContainer); |
| 183 | emit statusContainerUnregistered(statusContainer); |
| 184 | StatusContainerAwareObject::notifyStatusContainerUnregistered(statusContainer); |
| 185 | |
| 186 | if (statusContainer == DefaultStatusContainer)
|
| 187 | {
|
| 188 | if (StatusContainers.isEmpty())
|
| 189 | setDefaultStatusContainer(0);
|
| 190 | else
|
| 191 | setDefaultStatusContainer(StatusContainers.at(0));
|
| 192 | } |
| 193 | |
| 194 | disconnect(statusContainer, 0, this, 0); |
| 195 | } |
| 196 | |
| 197 | bool StatusContainerManager::allStatusOfType(StatusType type)
|
| 198 | {
|
| 199 | if (StatusTypeNone == type)
|
| 200 | return false; |
| 201 | |
| 202 | foreach (StatusContainer *container, StatusContainers) |
| 203 | if (container->status().type() != type)
|
| 204 | return false; |
| 205 | return true; |
| 206 | } |
| 207 | |
| 208 | QString StatusContainerManager::statusContainerName() |
| 209 | {
|
| 210 | return tr("All"); |
| 211 | } |
| 212 | |
| 213 | void StatusContainerManager::setStatus(Status status, StatusChangeSource source)
|
| 214 | {
|
| 215 | foreach (StatusContainer *container, StatusContainers) |
| 216 | container->setStatus(status, source); |
| 217 | } |
| 218 | |
| 219 | Status StatusContainerManager::status() |
| 220 | {
|
| 221 | return DefaultStatusContainer
|
| 222 | ? DefaultStatusContainer->status() |
| 223 | : Status(); |
| 224 | } |
| 225 | |
| 226 | bool StatusContainerManager::isStatusSettingInProgress()
|
| 227 | {
|
| 228 | return DefaultStatusContainer
|
| 229 | ? DefaultStatusContainer->isStatusSettingInProgress() |
| 230 | : false;
|
| 231 | } |
| 232 | |
| 233 | KaduIcon StatusContainerManager::statusIcon() |
| 234 | {
|
| 235 | return statusIcon(status());
|
| 236 | } |
| 237 | |
| 238 | KaduIcon StatusContainerManager::statusIcon(const Status &status)
|
| 239 | {
|
| 240 | if (!DefaultStatusContainer)
|
| 241 | return StatusTypeManager::instance()->statusIcon("common", StatusTypeOffline); |
| 242 | |
| 243 | return StatusTypeManager::instance()->statusIcon("common", status); |
| 244 | } |
| 245 | |
| 246 | QList<StatusType> StatusContainerManager::supportedStatusTypes() |
| 247 | {
|
| 248 | return DefaultStatusContainer
|
| 249 | ? DefaultStatusContainer->supportedStatusTypes() |
| 250 | : QList<StatusType>(); |
| 251 | } |
| 252 | |
| 253 | int StatusContainerManager::maxDescriptionLength()
|
| 254 | {
|
| 255 | return DefaultStatusContainer
|
| 256 | ? DefaultStatusContainer->maxDescriptionLength() |
| 257 | : -1;
|
| 258 | } |
| 259 | |
| 260 | QString StatusContainerManager::statusNamePrefix() |
| 261 | {
|
| 262 | return tr("All") + ' '; |
| 263 | } |
| 264 | |
| 265 | Status StatusContainerManager::loadStatus() |
| 266 | {
|
| 267 | return DefaultStatusContainer
|
| 268 | ? DefaultStatusContainer->loadStatus() |
| 269 | : Status(); |
| 270 | } |
| 271 | |
| 272 | void StatusContainerManager::storeStatus(Status status)
|
| 273 | {
|
| 274 | foreach (StatusContainer *statusContainer, StatusContainers) |
| 275 | statusContainer->storeStatus(status); |
| 276 | } |
| 277 | |
| 278 | QList<StatusContainer *> StatusContainerManager::subStatusContainers() |
| 279 | {
|
| 280 | return StatusContainers;
|
| 281 | } |