diff options
author | Kevin Smith <git@kismith.co.uk> | 2010-10-04 16:08:10 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2010-10-04 16:08:10 (GMT) |
commit | 8ca471e7304e813fa55ebf512a8f30f146fe6b41 (patch) | |
tree | e962968f1f7afc0bc6c73a776e3ee75e8c7deaba /Swift | |
parent | 026e8a67d871d99f4f0c0bddb6d16d12521f1e1c (diff) | |
download | swift-contrib-8ca471e7304e813fa55ebf512a8f30f146fe6b41.zip swift-contrib-8ca471e7304e813fa55ebf512a8f30f146fe6b41.tar.bz2 |
Assign contacts to groups.
Another patch will follow shortly to stop them appearing offline
after a roster change like this.
Resolves: #272
Release-Notes: It's now possible to assign your contacts to groups.
Diffstat (limited to 'Swift')
-rw-r--r-- | Swift/QtUI/ContextMenus/QtRosterContextMenu.cpp | 42 | ||||
-rw-r--r-- | Swift/QtUI/ContextMenus/QtRosterContextMenu.h | 5 | ||||
-rw-r--r-- | Swift/QtUI/QtMainWindow.cpp | 2 | ||||
-rw-r--r-- | Swift/QtUI/QtSetGroupsDialog.cpp | 95 | ||||
-rw-r--r-- | Swift/QtUI/QtSetGroupsDialog.h | 37 | ||||
-rw-r--r-- | Swift/QtUI/Roster/QtTreeWidget.cpp | 1 | ||||
-rw-r--r-- | Swift/QtUI/Roster/QtTreeWidget.h | 2 | ||||
-rw-r--r-- | Swift/QtUI/SConscript | 1 |
8 files changed, 178 insertions, 7 deletions
diff --git a/Swift/QtUI/ContextMenus/QtRosterContextMenu.cpp b/Swift/QtUI/ContextMenus/QtRosterContextMenu.cpp index 59c3b78..1641266 100644 --- a/Swift/QtUI/ContextMenus/QtRosterContextMenu.cpp +++ b/Swift/QtUI/ContextMenus/QtRosterContextMenu.cpp @@ -10,20 +10,26 @@ #include <QLineEdit> #include <QMenu> #include <QDebug> +#include <QDialog> #include <boost/shared_ptr.hpp> #include "Swiften/Roster/ContactRosterItem.h" +#include "Swiften/Roster/GroupRosterItem.h" #include "Swiften/Base/String.h" +#include "Swiften/Roster/Roster.h" #include "Swift/Controllers/UIEvents/UIEvent.h" #include "Swift/Controllers/UIEvents/RemoveRosterItemUIEvent.h" #include "Swift/Controllers/UIEvents/RenameRosterItemUIEvent.h" #include "Swift/QtUI/QtSwiftUtil.h" +#include "Swift/QtUI/QtSetGroupsDialog.h" + namespace Swift { -QtRosterContextMenu::QtRosterContextMenu(UIEventStream* eventStream) { +QtRosterContextMenu::QtRosterContextMenu(UIEventStream* eventStream, QtTreeWidget* treeWidget) { eventStream_ = eventStream; + treeWidget_ = treeWidget; } void QtRosterContextMenu::show(RosterItem* item) { @@ -32,10 +38,36 @@ void QtRosterContextMenu::show(RosterItem* item) { return; } item_ = item; - QMenu* contextMenu = new QMenu(); - contextMenu->addAction("Remove", this, SLOT(handleRemoveContact())); - contextMenu->addAction("Rename", this, SLOT(handleRenameContact())); - contextMenu->exec(QCursor::pos()); + QMenu contextMenu; + contextMenu.addAction("Remove", this, SLOT(handleRemoveContact())); + contextMenu.addAction("Rename", this, SLOT(handleRenameContact())); + contextMenu.addAction("Groups", this, SLOT(handleRegroupContact())); + /*QMenu* groupsMenu = contextMenu.addMenu("Groups"); + std::map<QAction, String> groupActions; + for (int i = 0; i < 0; i++) { + String groupName; + groupActions[groupsMenu->addAction(P2QSTRING(groupName))] = groupName; + } + groupsMenu->addSeparator(); + groupsMenu->addAction("New Group", this SLOT(handleNewGroup()));*/ + contextMenu.exec(QCursor::pos()); +} + +void QtRosterContextMenu::handleRegroupContact() { + QList<QString> allGroups; + foreach (RosterItem* item, treeWidget_->getRoster()->getRoot()->getChildren()) { + GroupRosterItem* group = dynamic_cast<GroupRosterItem*>(item); + if (group) { + allGroups.push_back(P2QSTRING(group->getDisplayName())); + } + } + ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item_); + assert(contact); + QtSetGroupsDialog groupDialog(contact, allGroups); + + if (groupDialog.exec() == QDialog::Accepted) { + eventStream_->send(groupDialog.getRegroupEvent()); + } } void QtRosterContextMenu::handleRemoveContact() { diff --git a/Swift/QtUI/ContextMenus/QtRosterContextMenu.h b/Swift/QtUI/ContextMenus/QtRosterContextMenu.h index 44f3314..f2c7e1f 100644 --- a/Swift/QtUI/ContextMenus/QtRosterContextMenu.h +++ b/Swift/QtUI/ContextMenus/QtRosterContextMenu.h @@ -9,6 +9,7 @@ #include <QObject> #include "Swift/QtUI/ContextMenus/QtContextMenu.h" +#include "Swift/QtUI/Roster/QtTreeWidget.h" #include "Swift/Controllers/UIEvents/UIEventStream.h" namespace Swift { @@ -16,15 +17,17 @@ namespace Swift { class QtRosterContextMenu : public QObject, public QtContextMenu { Q_OBJECT public: - QtRosterContextMenu(UIEventStream* eventStream); + QtRosterContextMenu(UIEventStream* eventStream, QtTreeWidget* treeWidget); void show(RosterItem* item); private slots: void handleRemoveContact(); void handleRenameContact(); + void handleRegroupContact(); private: RosterItem* item_; UIEventStream* eventStream_; + QtTreeWidget* treeWidget_; }; } diff --git a/Swift/QtUI/QtMainWindow.cpp b/Swift/QtUI/QtMainWindow.cpp index 6f7783f..f669e95 100644 --- a/Swift/QtUI/QtMainWindow.cpp +++ b/Swift/QtUI/QtMainWindow.cpp @@ -53,7 +53,7 @@ QtMainWindow::QtMainWindow(UIEventStream* uiEventStream) : QWidget() { contactTabLayout->setContentsMargins(0, 0, 0, 0); treeWidget_ = new QtTreeWidget(uiEventStream_); - contextMenu_ = new QtRosterContextMenu(uiEventStream_); + contextMenu_ = new QtRosterContextMenu(uiEventStream_, treeWidget_); treeWidget_->setContextMenu(contextMenu_); treeWidget_->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); contactTabLayout->addWidget(treeWidget_); diff --git a/Swift/QtUI/QtSetGroupsDialog.cpp b/Swift/QtUI/QtSetGroupsDialog.cpp new file mode 100644 index 0000000..ad24122 --- /dev/null +++ b/Swift/QtUI/QtSetGroupsDialog.cpp @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2010 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include "QtSetGroupsDialog.h" + +#include <algorithm> + +#include <QScrollArea> +#include <QBoxLayout> +#include <QLabel> +#include <QDialogButtonBox> + +#include "Swift/QtUI/QtSwiftUtil.h" + +namespace Swift { + +QtSetGroupsDialog::QtSetGroupsDialog(ContactRosterItem* contact, const QList<QString>& allGroups) : contact_(contact) { + QBoxLayout* layout = new QBoxLayout(QBoxLayout::TopToBottom, this); + QScrollArea* scroll = new QScrollArea(this); + layout->addWidget(scroll); + QBoxLayout* scrollLayout = new QBoxLayout(QBoxLayout::TopToBottom, scroll); + QLabel* label = new QLabel(scroll); + label->setText("Choose new groups for " + P2QSTRING(contact->getDisplayName())); + scrollLayout->addWidget(label); + foreach (QString group, allGroups) { + QCheckBox* check = new QCheckBox(scroll); + check->setText(group); + check->setCheckState(Qt::Unchecked); + checkBoxes_[Q2PSTRING(group)] = check; + scrollLayout->addWidget(check); + } + foreach (String group, contact->getGroups()) { + checkBoxes_[group]->setCheckState(Qt::Checked); + } + QWidget* newGroupWidget = new QWidget(scroll); + QBoxLayout* newGroupLayout = new QBoxLayout(QBoxLayout::LeftToRight, newGroupWidget); + scrollLayout->addWidget(newGroupWidget); + newGroup_ = new QCheckBox(newGroupWidget); + newGroup_->setText("New Group:"); + newGroup_->setCheckState(Qt::Unchecked); + newGroupLayout->addWidget(newGroup_); + newGroupName_ = new QLineEdit(newGroupWidget); + newGroupLayout->addWidget(newGroupName_); + QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this); + layout->addWidget(buttons); + connect(buttons, SIGNAL(accepted()), this, SLOT(accept())); + connect(buttons, SIGNAL(rejected()), this, SLOT(reject())); +} + +QtSetGroupsDialog::~QtSetGroupsDialog() { + // TODO Auto-generated destructor stub +} + +typedef std::pair<String, QCheckBox*> CheckStringPair; + +boost::shared_ptr<RegroupRosterItemUIEvent> QtSetGroupsDialog::getRegroupEvent() { + std::vector<String> addedGroups; + std::vector<String> removedGroups; + std::vector<String> existingGroups = contact_->getGroups(); + int tickedCount = 0; + bool wantsContacts = false; + foreach (CheckStringPair pair, checkBoxes_) { + bool existing = std::find(existingGroups.begin(), existingGroups.end(), pair.first) != existingGroups.end(); + if (pair.second->checkState() == Qt::Checked) { + tickedCount++; + if (pair.first == "Contacts") { + wantsContacts = true; + } + if (!existing) { + addedGroups.push_back(pair.first); + } + } else { + if (existing) { + removedGroups.push_back(pair.first); + } + } + } + if (newGroup_->checkState() == Qt::Checked) { + tickedCount++; + String name = Q2PSTRING(newGroupName_->text()); + if (std::find(existingGroups.begin(), existingGroups.end(), name) == existingGroups.end()) { + addedGroups.push_back(name); + } + } + if (tickedCount > 1 && wantsContacts) { + addedGroups.push_back("Contacts"); + } + boost::shared_ptr<RegroupRosterItemUIEvent> result(new RegroupRosterItemUIEvent(contact_->getJID(), addedGroups, removedGroups)); + return result; +} + +} diff --git a/Swift/QtUI/QtSetGroupsDialog.h b/Swift/QtUI/QtSetGroupsDialog.h new file mode 100644 index 0000000..e8300f5 --- /dev/null +++ b/Swift/QtUI/QtSetGroupsDialog.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2010 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include <map> + +#include <boost/shared_ptr.hpp> + +#include <QDialog> +#include <QCheckBox> +#include <QLineEdit> +#include <QList> + +#include "Swiften/Roster/ContactRosterItem.h" +#include "Swift/Controllers/UIEvents/RegroupRosterItemUIEvent.h" + +namespace Swift { + +class QtSetGroupsDialog : public QDialog { + Q_OBJECT + public: + QtSetGroupsDialog(ContactRosterItem* contact, const QList<QString>& allGroups); + virtual ~QtSetGroupsDialog(); + boost::shared_ptr<RegroupRosterItemUIEvent> getRegroupEvent(); + private: + ContactRosterItem* contact_; + std::map<String, QCheckBox*> checkBoxes_; + QCheckBox* newGroup_; + QLineEdit* newGroupName_; +}; + +} + diff --git a/Swift/QtUI/Roster/QtTreeWidget.cpp b/Swift/QtUI/Roster/QtTreeWidget.cpp index 6ace3df..885cba6 100644 --- a/Swift/QtUI/Roster/QtTreeWidget.cpp +++ b/Swift/QtUI/Roster/QtTreeWidget.cpp @@ -46,6 +46,7 @@ QtTreeWidget::~QtTreeWidget() { } void QtTreeWidget::setRosterModel(Roster* roster) { + roster_ = roster; model_->setRoster(roster); expandAll(); } diff --git a/Swift/QtUI/Roster/QtTreeWidget.h b/Swift/QtUI/Roster/QtTreeWidget.h index 796afed..838c453 100644 --- a/Swift/QtUI/Roster/QtTreeWidget.h +++ b/Swift/QtUI/Roster/QtTreeWidget.h @@ -26,6 +26,7 @@ class QtTreeWidget : public QTreeView{ QtTreeWidgetItem* getRoot(); void setContextMenu(QtContextMenu* contextMenu); void setRosterModel(Roster* roster); + Roster* getRoster() {return roster_;} private slots: void handleItemActivated(const QModelIndex&); void handleModelItemExpanded(const QModelIndex&, bool expanded); @@ -38,6 +39,7 @@ class QtTreeWidget : public QTreeView{ private: void drawBranches(QPainter*, const QRect&, const QModelIndex&) const; RosterModel* model_; + Roster* roster_; RosterDelegate* delegate_; QtTreeWidgetItem* treeRoot_; QtContextMenu* contextMenu_; diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript index 609eb5d..a3631e5 100644 --- a/Swift/QtUI/SConscript +++ b/Swift/QtUI/SConscript @@ -83,6 +83,7 @@ sources = [ "QtBookmarkDetailWindow.cpp", "QtAddBookmarkWindow.cpp", "QtEditBookmarkWindow.cpp", + "QtSetGroupsDialog.cpp", "ChatSnippet.cpp", "MessageSnippet.cpp", "SystemMessageSnippet.cpp", |