diff options
author | Remko Tronçon <git@el-tramo.be> | 2011-02-06 22:50:30 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2011-02-07 15:22:48 (GMT) |
commit | afcfa9dd33cfb5e36edf7d8148a7f8b24c976741 (patch) | |
tree | c16d40dbb089a9bcf70fafc2d50def34a9984e58 /Swift/QtUI | |
parent | 90a511ed523cfaf500dd27316b12e128e0c70ce3 (diff) | |
download | swift-contrib-afcfa9dd33cfb5e36edf7d8148a7f8b24c976741.zip swift-contrib-afcfa9dd33cfb5e36edf7d8148a7f8b24c976741.tar.bz2 |
Reworking contact editing.
Collapsed rename, group edit, and remove into one dialog.
Moved contact editing logic to controllers.
Diffstat (limited to 'Swift/QtUI')
-rw-r--r-- | Swift/QtUI/ChatList/QtChatListWindow.h | 3 | ||||
-rw-r--r-- | Swift/QtUI/ContextMenus/QtContextMenu.cpp | 14 | ||||
-rw-r--r-- | Swift/QtUI/ContextMenus/QtContextMenu.h | 17 | ||||
-rw-r--r-- | Swift/QtUI/ContextMenus/QtRosterContextMenu.cpp | 112 | ||||
-rw-r--r-- | Swift/QtUI/ContextMenus/QtRosterContextMenu.h | 34 | ||||
-rw-r--r-- | Swift/QtUI/QtContactEditWindow.cpp | 136 | ||||
-rw-r--r-- | Swift/QtUI/QtContactEditWindow.h | 52 | ||||
-rw-r--r-- | Swift/QtUI/QtMainWindow.cpp | 3 | ||||
-rw-r--r-- | Swift/QtUI/QtMainWindow.h | 8 | ||||
-rw-r--r-- | Swift/QtUI/QtSetGroupsDialog.cpp | 106 | ||||
-rw-r--r-- | Swift/QtUI/QtSetGroupsDialog.h | 37 | ||||
-rw-r--r-- | Swift/QtUI/QtUIFactory.cpp | 6 | ||||
-rw-r--r-- | Swift/QtUI/QtUIFactory.h | 1 | ||||
-rw-r--r-- | Swift/QtUI/Roster/QtTreeWidget.cpp | 43 | ||||
-rw-r--r-- | Swift/QtUI/Roster/QtTreeWidget.h | 3 | ||||
-rw-r--r-- | Swift/QtUI/SConscript | 4 |
16 files changed, 227 insertions, 352 deletions
diff --git a/Swift/QtUI/ChatList/QtChatListWindow.h b/Swift/QtUI/ChatList/QtChatListWindow.h index b389474..3a3e95f 100644 --- a/Swift/QtUI/ChatList/QtChatListWindow.h +++ b/Swift/QtUI/ChatList/QtChatListWindow.h @@ -12,7 +12,6 @@ #include "Swift/Controllers/UIEvents/UIEventStream.h" #include "Swift/QtUI/ChatList/ChatListModel.h" #include "Swift/QtUI/ChatList/ChatListDelegate.h" -#include "Swift/QtUI/ContextMenus/QtContextMenu.h" namespace Swift { @@ -34,13 +33,13 @@ namespace Swift { protected: void contextMenuEvent(QContextMenuEvent* event); + private: void setupContextMenus(); bool bookmarksEnabled_; UIEventStream* eventStream_; ChatListModel* model_; ChatListDelegate* delegate_; - QtContextMenu* contextMenu_; QMenu* mucMenu_; QMenu* emptyMenu_; ChatListItem* contextMenuItem_; diff --git a/Swift/QtUI/ContextMenus/QtContextMenu.cpp b/Swift/QtUI/ContextMenus/QtContextMenu.cpp deleted file mode 100644 index c74fb31..0000000 --- a/Swift/QtUI/ContextMenus/QtContextMenu.cpp +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (c) 2010 Kevin Smith - * Licensed under the GNU General Public License v3. - * See Documentation/Licenses/GPLv3.txt for more information. - */ - -#include "ContextMenus/QtContextMenu.h" - -namespace Swift { - -QtContextMenu::~QtContextMenu() { -} - -} diff --git a/Swift/QtUI/ContextMenus/QtContextMenu.h b/Swift/QtUI/ContextMenus/QtContextMenu.h deleted file mode 100644 index 9e73ef9..0000000 --- a/Swift/QtUI/ContextMenus/QtContextMenu.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2010 Kevin Smith - * Licensed under the GNU General Public License v3. - * See Documentation/Licenses/GPLv3.txt for more information. - */ - -#pragma once - -namespace Swift { - class RosterItem; - class QtContextMenu { - public: - virtual ~QtContextMenu(); - - virtual void show(RosterItem* item) = 0; - }; -} diff --git a/Swift/QtUI/ContextMenus/QtRosterContextMenu.cpp b/Swift/QtUI/ContextMenus/QtRosterContextMenu.cpp deleted file mode 100644 index 9bbbbca..0000000 --- a/Swift/QtUI/ContextMenus/QtRosterContextMenu.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2010 Kevin Smith - * Licensed under the GNU General Public License v3. - * See Documentation/Licenses/GPLv3.txt for more information. - */ - -#include "Swift/QtUI/ContextMenus/QtRosterContextMenu.h" - -#include <QInputDialog> -#include <QLineEdit> -#include <QMenu> -#include <QDebug> -#include <QDialog> -#include <QMessageBox> - -#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, QtTreeWidget* treeWidget) : eventStream_(eventStream), treeWidget_(treeWidget), item_(NULL) { -} - -void QtRosterContextMenu::show(RosterItem* item) { - ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item); - item_ = item; - QMenu contextMenu; - if (contact) { - contextMenu.addAction("Rename", this, SLOT(handleRenameContact())); - contextMenu.addAction("Groups", this, SLOT(handleRegroupContact())); - contextMenu.addSeparator(); - contextMenu.addAction("Remove", this, SLOT(handleRemoveContact())); - } - GroupRosterItem* group = dynamic_cast<GroupRosterItem*>(item); - if (group) { - contextMenu.addAction("Rename", this, SLOT(handleRenameGroup())); - } - 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() { - ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item_); - assert(contact); - QMessageBox msgBox; - msgBox.setWindowTitle("Confirm contact deletion"); - msgBox.setText("Are you sure you want to delete this contact?"); - msgBox.setInformativeText(QString("This will remove the contact '%1' from all groups they may be in.").arg(P2QSTRING(contact->getJID().toString()))); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - msgBox.setDefaultButton(QMessageBox::Yes); - int ret = msgBox.exec(); - if (ret == QMessageBox::Yes) { - eventStream_->send(boost::shared_ptr<UIEvent>(new RemoveRosterItemUIEvent(contact->getJID()))); - } -} - -void QtRosterContextMenu::handleRenameContact() { - ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item_); - assert(contact); - bool ok; - QString newName = QInputDialog::getText(NULL, "Rename contact", "New name for " + P2QSTRING(item_->getDisplayName()), QLineEdit::Normal, P2QSTRING(item_->getDisplayName()), &ok); - if (ok) { - eventStream_->send(boost::shared_ptr<UIEvent>(new RenameRosterItemUIEvent(contact->getJID(), Q2PSTRING(newName)))); - } -} - -void QtRosterContextMenu::handleRenameGroup() { - GroupRosterItem* group = dynamic_cast<GroupRosterItem*>(item_); - assert(group); - bool ok; - QString newName = QInputDialog::getText(NULL, "Rename group", "New name for " + P2QSTRING(item_->getDisplayName()), QLineEdit::Normal, P2QSTRING(item_->getDisplayName()), &ok); - if (ok) { - std::vector<String> addedGroups; - std::vector<String> removedGroups; - addedGroups.push_back(Q2PSTRING(newName)); - removedGroups.push_back(group->getDisplayName()); - foreach (RosterItem* child, group->getChildren()) { - ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(child); - assert(contact); - boost::shared_ptr<RegroupRosterItemUIEvent> regroupItem(new RegroupRosterItemUIEvent(contact->getJID(), addedGroups, removedGroups)); - eventStream_->send(regroupItem); - } - } -} - -} diff --git a/Swift/QtUI/ContextMenus/QtRosterContextMenu.h b/Swift/QtUI/ContextMenus/QtRosterContextMenu.h deleted file mode 100644 index 0a88a8e..0000000 --- a/Swift/QtUI/ContextMenus/QtRosterContextMenu.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2010 Kevin Smith - * Licensed under the GNU General Public License v3. - * See Documentation/Licenses/GPLv3.txt for more information. - */ - -#pragma once - -#include <QObject> - -#include "Swift/QtUI/ContextMenus/QtContextMenu.h" -#include "Swift/QtUI/Roster/QtTreeWidget.h" -#include "Swift/Controllers/UIEvents/UIEventStream.h" - -namespace Swift { - class RosterItem; - class QtRosterContextMenu : public QObject, public QtContextMenu { - Q_OBJECT - public: - QtRosterContextMenu(UIEventStream* eventStream, QtTreeWidget* treeWidget); - void show(RosterItem* item); - - private slots: - void handleRemoveContact(); - void handleRenameContact(); - void handleRenameGroup(); - void handleRegroupContact(); - - private: - UIEventStream* eventStream_; - QtTreeWidget* treeWidget_; - RosterItem* item_; - }; -} diff --git a/Swift/QtUI/QtContactEditWindow.cpp b/Swift/QtUI/QtContactEditWindow.cpp new file mode 100644 index 0000000..6eb4316 --- /dev/null +++ b/Swift/QtUI/QtContactEditWindow.cpp @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2010 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include "QtContactEditWindow.h" + +#include <algorithm> + +#include <QScrollArea> +#include <QBoxLayout> +#include <QLabel> +#include <QCheckBox> +#include <QLineEdit> +#include <QDialogButtonBox> +#include <QMessageBox> +#include <QPushButton> + +#include "Swift/QtUI/QtSwiftUtil.h" + +namespace Swift { + +QtContactEditWindow::QtContactEditWindow() : groups_(NULL) { + resize(300,300); + setWindowTitle("Edit contact"); + + QBoxLayout* layout = new QVBoxLayout(this); + setContentsMargins(0,0,0,0); + + jidLabel_ = new QLabel(this); + jidLabel_->setAlignment(Qt::AlignHCenter); + layout->addWidget(jidLabel_); + + QHBoxLayout* nameLayout = new QHBoxLayout(); + + QLabel* label = new QLabel("Name:", this); + nameLayout->addWidget(label); + name_ = new QLineEdit(this); + nameLayout->addWidget(name_); + layout->addLayout(nameLayout); + + layout->addWidget(new QLabel("Groups:", this)); + + groupsArea_ = new QScrollArea(this); + layout->addWidget(groupsArea_); + groupsArea_->setWidgetResizable(true); + groupsArea_->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + groupsArea_->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + + QHBoxLayout* buttonLayout = new QHBoxLayout(); + layout->addLayout(buttonLayout); + QPushButton* removeButton = new QPushButton("Remove contact", this); + connect(removeButton, SIGNAL(clicked()), this, SLOT(handleRemoveContact())); + buttonLayout->addWidget(removeButton); + QPushButton* okButton = new QPushButton("Ok", this); + connect(okButton, SIGNAL(clicked()), this, SLOT(handleUpdateContact())); + buttonLayout->addStretch(); + buttonLayout->addWidget(okButton); +} + +void QtContactEditWindow::setContact(const JID& jid, const String& name, const std::vector<String>& groups, const std::set<String>& allGroups) { + jid_ = jid; + + jidLabel_->setText("<b>" + P2QSTRING(jid.toString()) + "</b>"); + name_->setText(P2QSTRING(name)); + + delete groups_; + checkBoxes_.clear(); + groups_ = new QWidget(groupsArea_); + groupsArea_->setWidget(groups_); + QVBoxLayout* scrollLayout = new QVBoxLayout(groups_); + + foreach (String group, allGroups) { + QCheckBox* check = new QCheckBox(groups_); + check->setText(P2QSTRING(group)); + check->setCheckState(Qt::Unchecked); + checkBoxes_[group] = check; + scrollLayout->addWidget(check); + } + foreach (String group, groups) { + checkBoxes_[group]->setCheckState(Qt::Checked); + } + + QHBoxLayout* newGroupLayout = new QHBoxLayout(); + newGroup_ = new QCheckBox(groups_); + newGroup_->setText("New Group:"); + newGroup_->setCheckState(Qt::Unchecked); + newGroupLayout->addWidget(newGroup_); + newGroupName_ = new QLineEdit(groups_); + newGroupLayout->addWidget(newGroupName_); + scrollLayout->addLayout(newGroupLayout); + + scrollLayout->addItem(new QSpacerItem(20, 73, QSizePolicy::Minimum, QSizePolicy::Expanding)); +} + +void QtContactEditWindow::setEnabled(bool b) { + QWidget::setEnabled(b); +} + +void QtContactEditWindow::show() { + QWidget::show(); + QWidget::activateWindow(); +} + +void QtContactEditWindow::hide() { + QWidget::hide(); +} + +void QtContactEditWindow::handleRemoveContact() { + QMessageBox msgBox; + msgBox.setWindowTitle("Confirm contact deletion"); + msgBox.setText("Are you sure you want to delete this contact?"); + msgBox.setInformativeText(QString("This will remove the contact '%1' from all groups they may be in.").arg(P2QSTRING(jid_.toString()))); + msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + msgBox.setDefaultButton(QMessageBox::Yes); + int ret = msgBox.exec(); + if (ret == QMessageBox::Yes) { + onRemoveContactRequest(); + } +} + +void QtContactEditWindow::handleUpdateContact() { + std::vector<String> groups; + foreach(const CheckBoxMap::value_type& group, checkBoxes_) { + if (group.second->checkState() == Qt::Checked) { + groups.push_back(group.first); + } + } + if (newGroup_->checkState() == Qt::Checked && !newGroupName_->text().isEmpty()) { + groups.push_back(Q2PSTRING(newGroupName_->text())); + } + onChangeContactRequest(Q2PSTRING(name_->text()), groups); +} + +} diff --git a/Swift/QtUI/QtContactEditWindow.h b/Swift/QtUI/QtContactEditWindow.h new file mode 100644 index 0000000..a731480 --- /dev/null +++ b/Swift/QtUI/QtContactEditWindow.h @@ -0,0 +1,52 @@ +/* + * 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 <QWidget> + +#include <Swift/Controllers/UIInterfaces/ContactEditWindow.h> +#include <Swiften/Base/String.h> +#include <Swiften/JID/JID.h> + +class QScrollArea; +class QLabel; +class QLineEdit; +class QCheckBox; + +namespace Swift { + class QtContactEditWindow : public QWidget, public ContactEditWindow { + Q_OBJECT + + public: + QtContactEditWindow(); + + virtual void setContact(const JID& jid, const String& name, const std::vector<String>& groups, const std::set<String>& allGroups); + + void setEnabled(bool); + void show(); + void hide(); + + private slots: + void handleRemoveContact(); + void handleUpdateContact(); + + private: + typedef std::map<String, QCheckBox*> CheckBoxMap; + JID jid_; + QLabel* jidLabel_; + CheckBoxMap checkBoxes_; + QLineEdit* name_; + QScrollArea* groupsArea_; + QWidget* groups_; + QCheckBox* newGroup_; + QLineEdit* newGroupName_; + }; +} + diff --git a/Swift/QtUI/QtMainWindow.cpp b/Swift/QtUI/QtMainWindow.cpp index ccf5a59..63ce32b 100644 --- a/Swift/QtUI/QtMainWindow.cpp +++ b/Swift/QtUI/QtMainWindow.cpp @@ -59,8 +59,6 @@ QtMainWindow::QtMainWindow(QtSettingsProvider* settings, UIEventStream* uiEventS contactTabLayout->setContentsMargins(0, 0, 0, 0); treeWidget_ = new QtTreeWidget(uiEventStream_); - contextMenu_ = new QtRosterContextMenu(uiEventStream_, treeWidget_); - treeWidget_->setContextMenu(contextMenu_); contactTabLayout->addWidget(treeWidget_); tabs_->addTab(contactsTabWidget_, "&Contacts"); @@ -108,7 +106,6 @@ QtMainWindow::QtMainWindow(QtSettingsProvider* settings, UIEventStream* uiEventS QtMainWindow::~QtMainWindow() { uiEventStream_->onUIEvent.disconnect(boost::bind(&QtMainWindow::handleUIEvent, this, _1)); - delete contextMenu_; } QtEventWindow* QtMainWindow::getEventWindow() { diff --git a/Swift/QtUI/QtMainWindow.h b/Swift/QtUI/QtMainWindow.h index 67b89d8..66b0caf 100644 --- a/Swift/QtUI/QtMainWindow.h +++ b/Swift/QtUI/QtMainWindow.h @@ -4,8 +4,7 @@ * See Documentation/Licenses/GPLv3.txt for more information. */ -#ifndef SWIFT_QtMainWindow_H -#define SWIFT_QtMainWindow_H +#pragma once #include <QWidget> #include <QMenu> @@ -13,7 +12,6 @@ #include "Swift/QtUI/QtRosterHeader.h" #include "Swift/QtUI/EventViewer/QtEventWindow.h" #include "Swift/QtUI/ChatList/QtChatListWindow.h" -#include "Swift/QtUI/ContextMenus/QtRosterContextMenu.h" #include <vector> @@ -73,10 +71,6 @@ namespace Swift { QtEventWindow* eventWindow_; QtChatListWindow* chatListWindow_; UIEventStream* uiEventStream_; - QtRosterContextMenu* contextMenu_; bool lastOfflineState_; }; } - -#endif - diff --git a/Swift/QtUI/QtSetGroupsDialog.cpp b/Swift/QtUI/QtSetGroupsDialog.cpp deleted file mode 100644 index d19a55d..0000000 --- a/Swift/QtUI/QtSetGroupsDialog.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - * 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) { - //resize(300,300); - setWindowTitle("Edit contact"); - QBoxLayout* layout = new QBoxLayout(QBoxLayout::TopToBottom, this); - setContentsMargins(0,0,0,0); - QScrollArea* scrollArea = new QScrollArea(this); - layout->addWidget(scrollArea); - scrollArea->setWidgetResizable(true); - scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); - QWidget* scroll = new QWidget(scrollArea); - scrollArea->setWidget(scroll); - QVBoxLayout* scrollLayout = new QVBoxLayout(scroll); - QLabel* label = new QLabel(scroll); - label->setText("Choose groups for " + P2QSTRING(contact->getDisplayName()) + " (" + P2QSTRING(contact->getJID().toString()) + ")"); - 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); - } - - QHBoxLayout* newGroupLayout = new QHBoxLayout(); - newGroup_ = new QCheckBox(scroll); - newGroup_->setText("New Group:"); - newGroup_->setCheckState(Qt::Unchecked); - newGroupLayout->addWidget(newGroup_); - newGroupName_ = new QLineEdit(scroll); - newGroupLayout->addWidget(newGroupName_); - scrollLayout->addLayout(newGroupLayout); - - scrollLayout->addItem(new QSpacerItem(20, 73, QSizePolicy::Minimum, QSizePolicy::Expanding)); - - 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 && pair.first != "Contacts") { - 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 deleted file mode 100644 index e8300f5..0000000 --- a/Swift/QtUI/QtSetGroupsDialog.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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/QtUIFactory.cpp b/Swift/QtUI/QtUIFactory.cpp index 35dc4ea..4832205 100644 --- a/Swift/QtUI/QtUIFactory.cpp +++ b/Swift/QtUI/QtUIFactory.cpp @@ -22,6 +22,7 @@ #include "MUCSearch/QtMUCSearchWindow.h" #include "UserSearch/QtUserSearchWindow.h" #include "QtProfileWindow.h" +#include "QtContactEditWindow.h" namespace Swift { @@ -94,4 +95,9 @@ ProfileWindow* QtUIFactory::createProfileWindow() { return new QtProfileWindow(); } +ContactEditWindow* QtUIFactory::createContactEditWindow() { + return new QtContactEditWindow(); +} + + } diff --git a/Swift/QtUI/QtUIFactory.h b/Swift/QtUI/QtUIFactory.h index 199cebf..aa88fa3 100644 --- a/Swift/QtUI/QtUIFactory.h +++ b/Swift/QtUI/QtUIFactory.h @@ -36,6 +36,7 @@ namespace Swift { virtual UserSearchWindow* createUserSearchWindow(UserSearchWindow::Type type, UIEventStream* eventStream); virtual JoinMUCWindow* createJoinMUCWindow(); virtual ProfileWindow* createProfileWindow(); + virtual ContactEditWindow* createContactEditWindow(); private slots: void handleLoginWindowGeometryChanged(); diff --git a/Swift/QtUI/Roster/QtTreeWidget.cpp b/Swift/QtUI/Roster/QtTreeWidget.cpp index cecb557..3c0b303 100644 --- a/Swift/QtUI/Roster/QtTreeWidget.cpp +++ b/Swift/QtUI/Roster/QtTreeWidget.cpp @@ -6,15 +6,19 @@ #include "Roster/QtTreeWidget.h" +#include <QMenu> +#include <QContextMenuEvent> +#include <QInputDialog> +#include <boost/smart_ptr/make_shared.hpp> + #include "Swiften/Base/Platform.h" #include "Swiften/Roster/ContactRosterItem.h" #include "Swiften/Roster/GroupRosterItem.h" #include "Swift/Controllers/UIEvents/UIEventStream.h" #include "Swift/Controllers/UIEvents/RequestChatUIEvent.h" - -#include <qdebug.h> -#include <QMenu> -#include <QContextMenuEvent> +#include "Swift/Controllers/UIEvents/RequestContactEditorUIEvent.h" +#include "Swift/Controllers/UIEvents/RenameGroupUIEvent.h" +#include "QtSwiftUtil.h" namespace Swift { @@ -25,7 +29,6 @@ QtTreeWidget::QtTreeWidget(UIEventStream* eventStream, QWidget* parent) : QTreeV delegate_ = new RosterDelegate(this); setItemDelegate(delegate_); setHeaderHidden(true); - contextMenu_ = NULL; #ifdef SWIFT_PLATFORM_MACOSX setAlternatingRowColors(true); #endif @@ -52,10 +55,6 @@ void QtTreeWidget::setRosterModel(Roster* roster) { expandAll(); } -void QtTreeWidget::setContextMenu(QtContextMenu* contextMenu) { - contextMenu_ = contextMenu; -} - QtTreeWidgetItem* QtTreeWidget::getRoot() { return treeRoot_; } @@ -77,13 +76,29 @@ void QtTreeWidget::handleItemActivated(const QModelIndex& index) { } void QtTreeWidget::contextMenuEvent(QContextMenuEvent* event) { - if (!contextMenu_) { + QModelIndex index = indexAt(event->pos()); + if (!index.isValid()) { return; } - QModelIndex index = indexAt(event->pos()); - RosterItem* item = index.isValid() ? static_cast<RosterItem*>(index.internalPointer()) : NULL; - if (item) { - contextMenu_->show(item); + RosterItem* item = static_cast<RosterItem*>(index.internalPointer()); + QMenu contextMenu; + if (ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item)) { + QAction* editContact = contextMenu.addAction("Edit"); + QAction* result = contextMenu.exec(event->globalPos()); + if (result == editContact) { + eventStream_->send(boost::make_shared<RequestContactEditorUIEvent>(contact->getJID())); + } + } + else if (GroupRosterItem* group = dynamic_cast<GroupRosterItem*>(item)) { + QAction* renameGroup = contextMenu.addAction("Rename"); + QAction* result = contextMenu.exec(event->globalPos()); + if (result == renameGroup) { + bool ok; + QString newName = QInputDialog::getText(NULL, "Rename group", "New name for " + P2QSTRING(group->getDisplayName()), QLineEdit::Normal, P2QSTRING(group->getDisplayName()), &ok); + if (ok) { + eventStream_->send(boost::make_shared<RenameGroupUIEvent>(group->getDisplayName(), Q2PSTRING(newName))); + } + } } } diff --git a/Swift/QtUI/Roster/QtTreeWidget.h b/Swift/QtUI/Roster/QtTreeWidget.h index 838c453..ff11567 100644 --- a/Swift/QtUI/Roster/QtTreeWidget.h +++ b/Swift/QtUI/Roster/QtTreeWidget.h @@ -12,7 +12,6 @@ #include "Swift/QtUI/Roster/QtTreeWidget.h" #include "Swift/QtUI/Roster/RosterModel.h" #include "Swift/QtUI/Roster/RosterDelegate.h" -#include "Swift/QtUI/ContextMenus/QtContextMenu.h" namespace Swift { class UIEventStream; @@ -24,7 +23,6 @@ class QtTreeWidget : public QTreeView{ ~QtTreeWidget(); void show(); QtTreeWidgetItem* getRoot(); - void setContextMenu(QtContextMenu* contextMenu); void setRosterModel(Roster* roster); Roster* getRoster() {return roster_;} private slots: @@ -42,7 +40,6 @@ class QtTreeWidget : public QTreeView{ Roster* roster_; RosterDelegate* delegate_; QtTreeWidgetItem* treeRoot_; - QtContextMenu* contextMenu_; UIEventStream* eventStream_; }; diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript index b16fb7d..d27dc8c 100644 --- a/Swift/QtUI/SConscript +++ b/Swift/QtUI/SConscript @@ -90,7 +90,7 @@ sources = [ "QtBookmarkDetailWindow.cpp", "QtAddBookmarkWindow.cpp", "QtEditBookmarkWindow.cpp", - "QtSetGroupsDialog.cpp", + "QtContactEditWindow.cpp", "ChatSnippet.cpp", "MessageSnippet.cpp", "SystemMessageSnippet.cpp", @@ -120,8 +120,6 @@ sources = [ "UserSearch/QtUserSearchWindow.cpp", "UserSearch/UserSearchModel.cpp", "UserSearch/UserSearchDelegate.cpp", - "ContextMenus/QtRosterContextMenu.cpp", - "ContextMenus/QtContextMenu.cpp", "QtSubscriptionRequestWindow.cpp", "QtRosterHeader.cpp", "QtWebView.cpp", |