diff options
author | Kevin Smith <git@kismith.co.uk> | 2011-09-21 12:25:27 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2011-09-23 16:47:57 (GMT) |
commit | f9c432ca127d6e7d87b49d2fbf6aace34bea0e06 (patch) | |
tree | d7f069d3c48cc3d768e770df614fe87ade6f3902 /Swift/QtUI/Roster | |
parent | 20d3385909a2f9d886e7e0781357b23474e9f8dc (diff) | |
download | swift-f9c432ca127d6e7d87b49d2fbf6aace34bea0e06.zip swift-f9c432ca127d6e7d87b49d2fbf6aace34bea0e06.tar.bz2 |
Add support for kicking people from MUCs.
This also introduces a new DOM-like parser structure, used for the
MUC parsers.
Partially
Resolves: #689
Diffstat (limited to 'Swift/QtUI/Roster')
-rw-r--r-- | Swift/QtUI/Roster/QtOccupantListWidget.cpp | 53 | ||||
-rw-r--r-- | Swift/QtUI/Roster/QtOccupantListWidget.h | 7 | ||||
-rw-r--r-- | Swift/QtUI/Roster/QtRosterWidget.cpp | 16 | ||||
-rw-r--r-- | Swift/QtUI/Roster/QtRosterWidget.h | 5 | ||||
-rw-r--r-- | Swift/QtUI/Roster/QtTreeWidget.cpp | 15 | ||||
-rw-r--r-- | Swift/QtUI/Roster/QtTreeWidget.h | 4 |
6 files changed, 52 insertions, 48 deletions
diff --git a/Swift/QtUI/Roster/QtOccupantListWidget.cpp b/Swift/QtUI/Roster/QtOccupantListWidget.cpp index 2f992bf..cbda0f1 100644 --- a/Swift/QtUI/Roster/QtOccupantListWidget.cpp +++ b/Swift/QtUI/Roster/QtOccupantListWidget.cpp @@ -9,6 +9,7 @@ #include <QContextMenuEvent> #include <QMenu> +#include <QAction> #include <QInputDialog> #include "Swift/Controllers/Roster/ContactRosterItem.h" @@ -26,33 +27,33 @@ QtOccupantListWidget::~QtOccupantListWidget() { } +void QtOccupantListWidget::setAvailableOccupantActions(const std::vector<ChatWindow::OccupantAction>& actions) { + availableOccupantActions_ = actions; +} + void QtOccupantListWidget::contextMenuEvent(QContextMenuEvent* event) { -// QModelIndex index = indexAt(event->pos()); -// if (!index.isValid()) { -// return; -// } -// RosterItem* item = static_cast<RosterItem*>(index.internalPointer()); -// QMenu contextMenu; -// if (ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item)) { -// QAction* editContact = contextMenu.addAction(tr("Edit")); -// QAction* removeContact = contextMenu.addAction(tr("Remove")); -// QAction* result = contextMenu.exec(event->globalPos()); -// if (result == editContact) { -// eventStream_->send(boost::make_shared<RequestContactEditorUIEvent>(contact->getJID())); -// } -// else if (result == removeContact) { -// if (QtContactEditWindow::confirmContactDeletion(contact->getJID())) { -// eventStream_->send(boost::make_shared<RemoveRosterItemUIEvent>(contact->getJID())); -// } -// } -// } -// else if (GroupRosterItem* group = dynamic_cast<GroupRosterItem*>(item)) { -// QAction* renameGroupAction = contextMenu.addAction(tr("Rename")); -// QAction* result = contextMenu.exec(event->globalPos()); -// if (result == renameGroupAction) { -// renameGroup(group); -// } -// } + QModelIndex index = indexAt(event->pos()); + if (!index.isValid()) { + return; + } + RosterItem* item = static_cast<RosterItem*>(index.internalPointer()); + ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item); + if (contact) { + QMenu contextMenu; + std::map<QAction*, ChatWindow::OccupantAction> actions; + foreach (ChatWindow::OccupantAction availableAction, availableOccupantActions_) { + QString text = "Error: missing string"; + switch (availableAction) { + case ChatWindow::Kick: text = tr("Kick user"); break; + } + QAction* action = contextMenu.addAction(text); + actions[action] = availableAction; + } + QAction* result = contextMenu.exec(event->globalPos()); + if (result) { + onOccupantActionSelected(actions[result], contact); + } + } } } diff --git a/Swift/QtUI/Roster/QtOccupantListWidget.h b/Swift/QtUI/Roster/QtOccupantListWidget.h index 5444210..ef29c00 100644 --- a/Swift/QtUI/Roster/QtOccupantListWidget.h +++ b/Swift/QtUI/Roster/QtOccupantListWidget.h @@ -8,6 +8,9 @@ #include "Swift/QtUI/Roster/QtTreeWidget.h" +#include "Swiften/Base/boost_bsignals.h" +#include "Swift/Controllers/UIInterfaces/ChatWindow.h" + namespace Swift { class QtOccupantListWidget : public QtTreeWidget { @@ -15,8 +18,12 @@ class QtOccupantListWidget : public QtTreeWidget { public: QtOccupantListWidget(UIEventStream* eventStream, QWidget* parent = 0); virtual ~QtOccupantListWidget(); + void setAvailableOccupantActions(const std::vector<ChatWindow::OccupantAction>& actions); + boost::signal<void (ChatWindow::OccupantAction, ContactRosterItem*)> onOccupantActionSelected; protected: void contextMenuEvent(QContextMenuEvent* event); + private: + std::vector<ChatWindow::OccupantAction> availableOccupantActions_; }; } diff --git a/Swift/QtUI/Roster/QtRosterWidget.cpp b/Swift/QtUI/Roster/QtRosterWidget.cpp index 79d7f67..923f977 100644 --- a/Swift/QtUI/Roster/QtRosterWidget.cpp +++ b/Swift/QtUI/Roster/QtRosterWidget.cpp @@ -81,20 +81,4 @@ void QtRosterWidget::renameGroup(GroupRosterItem* group) { } } -void QtRosterWidget::currentChanged(const QModelIndex& current, const QModelIndex& previous) { - bool valid = false; - QModelIndexList selectedIndexList = getSelectedIndexes(); - if (selectedIndexList.empty() || !selectedIndexList[0].isValid()) { - /* I didn't quite understand why using current didn't seem to work here.*/ - } - else if (current.isValid()) { - RosterItem* item = static_cast<RosterItem*>(current.internalPointer()); - if (dynamic_cast<ContactRosterItem*>(item)) { - valid = true; - } - } - onSomethingSelectedChanged(valid); - QTreeView::currentChanged(current, previous); -} - } diff --git a/Swift/QtUI/Roster/QtRosterWidget.h b/Swift/QtUI/Roster/QtRosterWidget.h index 7781e07..f870237 100644 --- a/Swift/QtUI/Roster/QtRosterWidget.h +++ b/Swift/QtUI/Roster/QtRosterWidget.h @@ -9,7 +9,6 @@ #include "Swift/QtUI/Roster/QtTreeWidget.h" namespace Swift { - class QtRosterWidget : public QtTreeWidget { Q_OBJECT public: @@ -17,12 +16,8 @@ class QtRosterWidget : public QtTreeWidget { virtual ~QtRosterWidget(); public slots: void handleEditUserActionTriggered(bool checked); - signals: - void onSomethingSelectedChanged(bool); protected: void contextMenuEvent(QContextMenuEvent* event); - protected slots: - virtual void currentChanged(const QModelIndex& current, const QModelIndex& previous); private: void renameGroup(GroupRosterItem* group); }; diff --git a/Swift/QtUI/Roster/QtTreeWidget.cpp b/Swift/QtUI/Roster/QtTreeWidget.cpp index 7de4028..96a078b 100644 --- a/Swift/QtUI/Roster/QtTreeWidget.cpp +++ b/Swift/QtUI/Roster/QtTreeWidget.cpp @@ -81,6 +81,21 @@ QModelIndexList QtTreeWidget::getSelectedIndexes() const { return selectedIndexList; } +void QtTreeWidget::currentChanged(const QModelIndex& current, const QModelIndex& previous) { + RosterItem* item = NULL; + QModelIndexList selectedIndexList = getSelectedIndexes(); + if (selectedIndexList.empty() || !selectedIndexList[0].isValid()) { + /* I didn't quite understand why using current didn't seem to work here.*/ + } + else if (current.isValid()) { + item = static_cast<RosterItem*>(current.internalPointer()); + item = dynamic_cast<ContactRosterItem*>(item); + } + onSomethingSelectedChanged(item); + QTreeView::currentChanged(current, previous); +} + + void QtTreeWidget::handleItemActivated(const QModelIndex& index) { RosterItem* item = static_cast<RosterItem*>(index.internalPointer()); ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item); diff --git a/Swift/QtUI/Roster/QtTreeWidget.h b/Swift/QtUI/Roster/QtTreeWidget.h index c45a1cd..1ad56d6 100644 --- a/Swift/QtUI/Roster/QtTreeWidget.h +++ b/Swift/QtUI/Roster/QtTreeWidget.h @@ -23,6 +23,7 @@ class QtTreeWidget : public QTreeView{ QtTreeWidgetItem* getRoot(); void setRosterModel(Roster* roster); Roster* getRoster() {return roster_;} + boost::signal<void (RosterItem*)> onSomethingSelectedChanged; private slots: void handleItemActivated(const QModelIndex&); @@ -35,7 +36,8 @@ class QtTreeWidget : public QTreeView{ QModelIndexList getSelectedIndexes() const; private: void drawBranches(QPainter*, const QRect&, const QModelIndex&) const; - + protected slots: + virtual void currentChanged(const QModelIndex& current, const QModelIndex& previous); protected: UIEventStream* eventStream_; |