From b8a73b1d16afd4f3aa0e8e39447024ec541df4c8 Mon Sep 17 00:00:00 2001 From: Kevin Smith <git@kismith.co.uk> Date: Fri, 11 Feb 2011 11:25:42 +0000 Subject: Allow deletion of items from login list. Resolves: #711 Release-Notes: Highlighting an item in the login account list and pressing detele will now prompt you to remove the cached credentials for that account. diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index 98599bb..31a1d5a 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -137,6 +137,7 @@ MainController::MainController( loginWindow_->selectUser(selectedLoginJID); loginWindow_->setLoginAutomatically(loginAutomatically); loginWindow_->onLoginRequest.connect(boost::bind(&MainController::handleLoginRequest, this, _1, _2, _3, _4, _5)); + loginWindow_->onPurgeSavedLoginRequest.connect(boost::bind(&MainController::handlePurgeSavedLoginRequest, this, _1)); loginWindow_->onCancelLoginRequest.connect(boost::bind(&MainController::handleCancelLoginRequest, this)); loginWindow_->onQuitRequest.connect(boost::bind(&MainController::handleQuitRequest, this)); @@ -367,6 +368,11 @@ void MainController::handleLoginRequest(const String &username, const String &pa performLoginFromCachedCredentials(); } +void MainController::handlePurgeSavedLoginRequest(const String& username) { + settings_->removeProfile(username); + loginWindow_->removeAvailableAccount(username); +} + void MainController::performLoginFromCachedCredentials() { /* If we logged in with a bare JID, and we have a full bound JID, re-login with the * bound JID to try and keep dynamically assigned resources */ diff --git a/Swift/Controllers/MainController.h b/Swift/Controllers/MainController.h index 09f17d2..07bf661 100644 --- a/Swift/Controllers/MainController.h +++ b/Swift/Controllers/MainController.h @@ -92,6 +92,7 @@ namespace Swift { void handleEventQueueLengthChange(int count); void handleVCardReceived(const JID& j, VCard::ref vCard); void handleUIEvent(boost::shared_ptr<UIEvent> event); + void handlePurgeSavedLoginRequest(const String& username); void sendPresence(boost::shared_ptr<Presence> presence); void handleInputIdleChanged(bool); void logout(); diff --git a/Swift/Controllers/Settings/DummySettingsProvider.h b/Swift/Controllers/Settings/DummySettingsProvider.h index 6c3dd52..631b68d 100644 --- a/Swift/Controllers/Settings/DummySettingsProvider.h +++ b/Swift/Controllers/Settings/DummySettingsProvider.h @@ -21,6 +21,7 @@ class DummySettingsProvider : public SettingsProvider { virtual void storeInt(const String &, int ) {} virtual std::vector<String> getAvailableProfiles() {return std::vector<String>();} virtual void createProfile(const String& ) {} + virtual void removeProfile(const String& ) {} }; } diff --git a/Swift/Controllers/Settings/SettingsProvider.h b/Swift/Controllers/Settings/SettingsProvider.h index 7ddf789..a2cdad4 100644 --- a/Swift/Controllers/Settings/SettingsProvider.h +++ b/Swift/Controllers/Settings/SettingsProvider.h @@ -24,6 +24,7 @@ class SettingsProvider { virtual void storeInt(const String &settingPath, int settingValue) = 0; virtual std::vector<String> getAvailableProfiles() = 0; virtual void createProfile(const String& profile) = 0; + virtual void removeProfile(const String& profile) = 0; }; } diff --git a/Swift/Controllers/UIInterfaces/LoginWindow.h b/Swift/Controllers/UIInterfaces/LoginWindow.h index a25cdb9..fc28424 100644 --- a/Swift/Controllers/UIInterfaces/LoginWindow.h +++ b/Swift/Controllers/UIInterfaces/LoginWindow.h @@ -23,6 +23,7 @@ namespace Swift { virtual void setMessage(const String&) = 0; virtual void setIsLoggingIn(bool loggingIn) = 0; virtual void addAvailableAccount(const String& defaultJID, const String& defaultPassword, const String& defaultCertificate) = 0; + virtual void removeAvailableAccount(const String& jid) = 0; boost::signal<void (const String&, const String&, const String& /* certificateFile */, bool /* remember password*/, bool /* login automatically */)> onLoginRequest; virtual void setLoginAutomatically(bool loginAutomatically) = 0; virtual void quit() = 0; @@ -31,5 +32,6 @@ namespace Swift { boost::signal<void ()> onCancelLoginRequest; boost::signal<void ()> onQuitRequest; + boost::signal<void (const String&)> onPurgeSavedLoginRequest; }; } diff --git a/Swift/QtUI/QtLoginWindow.cpp b/Swift/QtUI/QtLoginWindow.cpp index a3e52dc..c3fdac2 100644 --- a/Swift/QtUI/QtLoginWindow.cpp +++ b/Swift/QtUI/QtLoginWindow.cpp @@ -193,7 +193,11 @@ bool QtLoginWindow::eventFilter(QObject *obj, QEvent *event) { if (obj == username_->view() && event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); if (keyEvent->key() == Qt::Key_Delete || keyEvent->key() == Qt::Key_Backspace) { - QMessageBox::information(this, "Remove profile", "Remove the profile '" + username_->view()->currentIndex().data().toString() + "'?"); + QString jid(username_->view()->currentIndex().data().toString()); + int result = QMessageBox::question(this, "Remove profile", "Remove the profile '" + jid + "'?", QMessageBox::Yes | QMessageBox::No); + if (result == QMessageBox::Yes) { + onPurgeSavedLoginRequest(Q2PSTRING(jid)); + } return true; } } @@ -221,6 +225,22 @@ void QtLoginWindow::selectUser(const String& username) { } } +void QtLoginWindow::removeAvailableAccount(const String& jid) { + QString username = P2QSTRING(jid); + int index = -1; + for (int i = 0; i < usernames_.count(); i++) { + if (username == usernames_[i]) { + index = i; + } + } + if (index >= 0) { + usernames_.removeAt(index); + passwords_.removeAt(index); + certificateFiles_.removeAt(index); + username_->removeItem(index); + } +} + void QtLoginWindow::addAvailableAccount(const String& defaultJID, const String& defaultPassword, const String& defaultCertificate) { QString username = P2QSTRING(defaultJID); int index = -1; diff --git a/Swift/QtUI/QtLoginWindow.h b/Swift/QtUI/QtLoginWindow.h index 90defd1..6987906 100644 --- a/Swift/QtUI/QtLoginWindow.h +++ b/Swift/QtUI/QtLoginWindow.h @@ -34,6 +34,7 @@ namespace Swift { virtual void loggedOut(); virtual void setMessage(const String& message); virtual void addAvailableAccount(const String& defaultJID, const String& defaultPassword, const String& defaultCertificate); + virtual void removeAvailableAccount(const String& jid); virtual void setLoginAutomatically(bool loginAutomatically); virtual void setIsLoggingIn(bool loggingIn); void selectUser(const String& user); diff --git a/Swift/QtUI/QtSettingsProvider.cpp b/Swift/QtUI/QtSettingsProvider.cpp index ea0013a..4bddce3 100644 --- a/Swift/QtUI/QtSettingsProvider.cpp +++ b/Swift/QtUI/QtSettingsProvider.cpp @@ -60,6 +60,18 @@ void QtSettingsProvider::createProfile(const String& profile) { settings_.setValue("profileList", stringList); } +void QtSettingsProvider::removeProfile(const String& profile) { + QString profileStart(P2QSTRING(profile) + ":"); + foreach (QString key, settings_.allKeys()) { + if (key.startsWith(profileStart)) { + settings_.remove(key); + } + } + QStringList stringList = settings_.value("profileList").toStringList(); + stringList.removeAll(P2QSTRING(profile)); + settings_.setValue("profileList", stringList); +} + QSettings* QtSettingsProvider::getQSettings() { return &settings_; } diff --git a/Swift/QtUI/QtSettingsProvider.h b/Swift/QtUI/QtSettingsProvider.h index 5cdafd5..d1dbc5e 100644 --- a/Swift/QtUI/QtSettingsProvider.h +++ b/Swift/QtUI/QtSettingsProvider.h @@ -25,6 +25,7 @@ class QtSettingsProvider : public SettingsProvider { virtual void storeInt(const String &settingPath, int settingValue); virtual std::vector<String> getAvailableProfiles(); virtual void createProfile(const String& profile); + virtual void removeProfile(const String& profile); QSettings* getQSettings(); private: QSettings settings_; -- cgit v0.10.2-6-g49f6