From 20d3385909a2f9d886e7e0781357b23474e9f8dc Mon Sep 17 00:00:00 2001 From: Kevin Smith Date: Wed, 21 Sep 2011 09:12:21 +0100 Subject: Distinguish between Roster and MUC list widgets diff --git a/Swift/QtUI/QtChatWindow.cpp b/Swift/QtUI/QtChatWindow.cpp index d7ffc65..a52d2de 100644 --- a/Swift/QtUI/QtChatWindow.cpp +++ b/Swift/QtUI/QtChatWindow.cpp @@ -71,7 +71,6 @@ QtChatWindow::QtChatWindow(const QString &contact, QtChatTheme* theme, UIEventSt logRosterSplitter_->addWidget(messageLog_); treeWidget_ = new QtTreeWidget(eventStream_); - treeWidget_->setEditable(false); treeWidget_->hide(); logRosterSplitter_->addWidget(treeWidget_); logRosterSplitter_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); diff --git a/Swift/QtUI/QtMainWindow.cpp b/Swift/QtUI/QtMainWindow.cpp index 51aaf3e..7c84773 100644 --- a/Swift/QtUI/QtMainWindow.cpp +++ b/Swift/QtUI/QtMainWindow.cpp @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include #include @@ -62,8 +62,7 @@ QtMainWindow::QtMainWindow(QtSettingsProvider* settings, UIEventStream* uiEventS contactTabLayout->setSpacing(0); contactTabLayout->setContentsMargins(0, 0, 0, 0); - treeWidget_ = new QtTreeWidget(uiEventStream_); - treeWidget_->setEditable(true); + treeWidget_ = new QtRosterWidget(uiEventStream_); contactTabLayout->addWidget(treeWidget_); tabs_->addTab(contactsTabWidget_, tr("&Contacts")); diff --git a/Swift/QtUI/QtMainWindow.h b/Swift/QtUI/QtMainWindow.h index bb3e9df..321fa2d 100644 --- a/Swift/QtUI/QtMainWindow.h +++ b/Swift/QtUI/QtMainWindow.h @@ -25,8 +25,7 @@ class QMenu; class QTabWidget; namespace Swift { - class QtTreeWidget; - class QtTreeWidgetFactory; + class QtRosterWidget; class TreeWidget; class UIEventStream; class QtTabWidget; @@ -36,7 +35,7 @@ namespace Swift { Q_OBJECT public: QtMainWindow(QtSettingsProvider*, UIEventStream* eventStream); - ~QtMainWindow(); + virtual ~QtMainWindow(); std::vector getMenus() {return menus_;} void setMyNick(const std::string& name); void setMyJID(const JID& jid); @@ -66,7 +65,7 @@ namespace Swift { private: QtSettingsProvider* settings_; std::vector menus_; - QtTreeWidget* treeWidget_; + QtRosterWidget* treeWidget_; QtRosterHeader* meView_; QAction* addUserAction_; QAction* editUserAction_; diff --git a/Swift/QtUI/Roster/QtOccupantListWidget.cpp b/Swift/QtUI/Roster/QtOccupantListWidget.cpp new file mode 100644 index 0000000..2f992bf --- /dev/null +++ b/Swift/QtUI/Roster/QtOccupantListWidget.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2011 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + + +#include "Roster/QtOccupantListWidget.h" + +#include +#include +#include + +#include "Swift/Controllers/Roster/ContactRosterItem.h" +#include "Swift/Controllers/Roster/GroupRosterItem.h" +#include "Swift/Controllers/UIEvents/UIEventStream.h" +#include "QtSwiftUtil.h" + +namespace Swift { + +QtOccupantListWidget::QtOccupantListWidget(UIEventStream* eventStream, QWidget* parent) : QtTreeWidget(eventStream, parent) { + +} + +QtOccupantListWidget::~QtOccupantListWidget() { + +} + +void QtOccupantListWidget::contextMenuEvent(QContextMenuEvent* event) { +// QModelIndex index = indexAt(event->pos()); +// if (!index.isValid()) { +// return; +// } +// RosterItem* item = static_cast(index.internalPointer()); +// QMenu contextMenu; +// if (ContactRosterItem* contact = dynamic_cast(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(contact->getJID())); +// } +// else if (result == removeContact) { +// if (QtContactEditWindow::confirmContactDeletion(contact->getJID())) { +// eventStream_->send(boost::make_shared(contact->getJID())); +// } +// } +// } +// else if (GroupRosterItem* group = dynamic_cast(item)) { +// QAction* renameGroupAction = contextMenu.addAction(tr("Rename")); +// QAction* result = contextMenu.exec(event->globalPos()); +// if (result == renameGroupAction) { +// renameGroup(group); +// } +// } +} + +} + diff --git a/Swift/QtUI/Roster/QtOccupantListWidget.h b/Swift/QtUI/Roster/QtOccupantListWidget.h new file mode 100644 index 0000000..5444210 --- /dev/null +++ b/Swift/QtUI/Roster/QtOccupantListWidget.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2011 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include "Swift/QtUI/Roster/QtTreeWidget.h" + +namespace Swift { + +class QtOccupantListWidget : public QtTreeWidget { + Q_OBJECT + public: + QtOccupantListWidget(UIEventStream* eventStream, QWidget* parent = 0); + virtual ~QtOccupantListWidget(); + protected: + void contextMenuEvent(QContextMenuEvent* event); +}; + +} + diff --git a/Swift/QtUI/Roster/QtRosterWidget.cpp b/Swift/QtUI/Roster/QtRosterWidget.cpp new file mode 100644 index 0000000..79d7f67 --- /dev/null +++ b/Swift/QtUI/Roster/QtRosterWidget.cpp @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2011 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include "Roster/QtRosterWidget.h" + +#include +#include +#include + +#include "Swift/Controllers/UIEvents/RequestContactEditorUIEvent.h" +#include "Swift/Controllers/UIEvents/RemoveRosterItemUIEvent.h" +#include "Swift/Controllers/UIEvents/RenameGroupUIEvent.h" +#include "QtContactEditWindow.h" +#include "Swift/Controllers/Roster/ContactRosterItem.h" +#include "Swift/Controllers/Roster/GroupRosterItem.h" +#include "Swift/Controllers/UIEvents/UIEventStream.h" +#include "QtSwiftUtil.h" + +namespace Swift { + +QtRosterWidget::QtRosterWidget(UIEventStream* eventStream, QWidget* parent) : QtTreeWidget(eventStream, parent) { + +} + +QtRosterWidget::~QtRosterWidget() { + +} + +void QtRosterWidget::handleEditUserActionTriggered(bool /*checked*/) { + QModelIndexList selectedIndexList = getSelectedIndexes(); + if (selectedIndexList.empty()) { + return; + } + QModelIndex index = selectedIndexList[0]; + if (!index.isValid()) { + return; + } + RosterItem* item = static_cast(index.internalPointer()); + if (ContactRosterItem* contact = dynamic_cast(item)) { + eventStream_->send(boost::make_shared(contact->getJID())); + } +} + +void QtRosterWidget::contextMenuEvent(QContextMenuEvent* event) { + QModelIndex index = indexAt(event->pos()); + if (!index.isValid()) { + return; + } + RosterItem* item = static_cast(index.internalPointer()); + QMenu contextMenu; + if (ContactRosterItem* contact = dynamic_cast(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(contact->getJID())); + } + else if (result == removeContact) { + if (QtContactEditWindow::confirmContactDeletion(contact->getJID())) { + eventStream_->send(boost::make_shared(contact->getJID())); + } + } + } + else if (GroupRosterItem* group = dynamic_cast(item)) { + QAction* renameGroupAction = contextMenu.addAction(tr("Rename")); + QAction* result = contextMenu.exec(event->globalPos()); + if (result == renameGroupAction) { + renameGroup(group); + } + } +} + +void QtRosterWidget::renameGroup(GroupRosterItem* group) { + bool ok; + QString newName = QInputDialog::getText(NULL, tr("Rename group"), tr("Enter a new name for group '%1':").arg(P2QSTRING(group->getDisplayName())), QLineEdit::Normal, P2QSTRING(group->getDisplayName()), &ok); + if (ok) { + eventStream_->send(boost::make_shared(group->getDisplayName(), Q2PSTRING(newName))); + } +} + +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(current.internalPointer()); + if (dynamic_cast(item)) { + valid = true; + } + } + onSomethingSelectedChanged(valid); + QTreeView::currentChanged(current, previous); +} + +} diff --git a/Swift/QtUI/Roster/QtRosterWidget.h b/Swift/QtUI/Roster/QtRosterWidget.h new file mode 100644 index 0000000..7781e07 --- /dev/null +++ b/Swift/QtUI/Roster/QtRosterWidget.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2011 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include "Swift/QtUI/Roster/QtTreeWidget.h" + +namespace Swift { + +class QtRosterWidget : public QtTreeWidget { + Q_OBJECT + public: + QtRosterWidget(UIEventStream* eventStream, QWidget* parent = 0); + 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 1296872..7de4028 100644 --- a/Swift/QtUI/Roster/QtTreeWidget.cpp +++ b/Swift/QtUI/Roster/QtTreeWidget.cpp @@ -6,9 +6,6 @@ #include "Roster/QtTreeWidget.h" -#include -#include -#include #include #include "Swiften/Base/Platform.h" @@ -16,15 +13,11 @@ #include "Swift/Controllers/Roster/GroupRosterItem.h" #include "Swift/Controllers/UIEvents/UIEventStream.h" #include "Swift/Controllers/UIEvents/RequestChatUIEvent.h" -#include "Swift/Controllers/UIEvents/RequestContactEditorUIEvent.h" -#include "Swift/Controllers/UIEvents/RemoveRosterItemUIEvent.h" -#include "Swift/Controllers/UIEvents/RenameGroupUIEvent.h" #include "QtSwiftUtil.h" -#include "QtContactEditWindow.h" namespace Swift { -QtTreeWidget::QtTreeWidget(UIEventStream* eventStream, QWidget* parent) : QTreeView(parent), editable_(false) { +QtTreeWidget::QtTreeWidget(UIEventStream* eventStream, QWidget* parent) : QTreeView(parent) { eventStream_ = eventStream; model_ = new RosterModel(this); setModel(model_); @@ -88,22 +81,6 @@ QModelIndexList QtTreeWidget::getSelectedIndexes() const { return selectedIndexList; } -void QtTreeWidget::currentChanged(const QModelIndex& current, const QModelIndex& previous) { - bool valid = false; - QModelIndexList selectedIndexList = getSelectedIndexes(); - if (!editable_ || 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(current.internalPointer()); - if (dynamic_cast(item)) { - valid = true; - } - } - onSomethingSelectedChanged(valid); - QTreeView::currentChanged(current, previous); -} - void QtTreeWidget::handleItemActivated(const QModelIndex& index) { RosterItem* item = static_cast(index.internalPointer()); ContactRosterItem* contact = dynamic_cast(item); @@ -112,64 +89,6 @@ void QtTreeWidget::handleItemActivated(const QModelIndex& index) { } } -void QtTreeWidget::handleEditUserActionTriggered(bool /*checked*/) { - if (!editable_) { - return; - } - QModelIndexList selectedIndexList = getSelectedIndexes(); - if (selectedIndexList.empty()) { - return; - } - QModelIndex index = selectedIndexList[0]; - if (!index.isValid()) { - return; - } - RosterItem* item = static_cast(index.internalPointer()); - if (ContactRosterItem* contact = dynamic_cast(item)) { - eventStream_->send(boost::make_shared(contact->getJID())); - } -} - -void QtTreeWidget::contextMenuEvent(QContextMenuEvent* event) { - if (!editable_) { - return; - } - QModelIndex index = indexAt(event->pos()); - if (!index.isValid()) { - return; - } - RosterItem* item = static_cast(index.internalPointer()); - QMenu contextMenu; - if (ContactRosterItem* contact = dynamic_cast(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(contact->getJID())); - } - else if (result == removeContact) { - if (QtContactEditWindow::confirmContactDeletion(contact->getJID())) { - eventStream_->send(boost::make_shared(contact->getJID())); - } - } - } - else if (GroupRosterItem* group = dynamic_cast(item)) { - QAction* renameGroupAction = contextMenu.addAction(tr("Rename")); - QAction* result = contextMenu.exec(event->globalPos()); - if (result == renameGroupAction) { - renameGroup(group); - } - } -} - -void QtTreeWidget::renameGroup(GroupRosterItem* group) { - bool ok; - QString newName = QInputDialog::getText(NULL, tr("Rename group"), tr("Enter a new name for group '%1':").arg(P2QSTRING(group->getDisplayName())), QLineEdit::Normal, P2QSTRING(group->getDisplayName()), &ok); - if (ok) { - eventStream_->send(boost::make_shared(group->getDisplayName(), Q2PSTRING(newName))); - } -} - void QtTreeWidget::handleExpanded(const QModelIndex& index) { GroupRosterItem* item = dynamic_cast(static_cast(index.internalPointer())); if (item) { diff --git a/Swift/QtUI/Roster/QtTreeWidget.h b/Swift/QtUI/Roster/QtTreeWidget.h index 4ecba83..c45a1cd 100644 --- a/Swift/QtUI/Roster/QtTreeWidget.h +++ b/Swift/QtUI/Roster/QtTreeWidget.h @@ -23,13 +23,6 @@ class QtTreeWidget : public QTreeView{ QtTreeWidgetItem* getRoot(); void setRosterModel(Roster* roster); Roster* getRoster() {return roster_;} - void setEditable(bool b) { editable_ = b; } - - signals: - void onSomethingSelectedChanged(bool); - - public slots: - void handleEditUserActionTriggered(bool checked); private slots: void handleItemActivated(const QModelIndex&); @@ -37,23 +30,20 @@ class QtTreeWidget : public QTreeView{ void handleExpanded(const QModelIndex&); void handleCollapsed(const QModelIndex&); void handleClicked(const QModelIndex&); - protected: - void contextMenuEvent(QContextMenuEvent* event); - protected slots: - virtual void currentChanged(const QModelIndex& current, const QModelIndex& previous); + protected: + QModelIndexList getSelectedIndexes() const; private: - void renameGroup(GroupRosterItem* group); void drawBranches(QPainter*, const QRect&, const QModelIndex&) const; - QModelIndexList getSelectedIndexes() const; + protected: + UIEventStream* eventStream_; + private: RosterModel* model_; Roster* roster_; RosterDelegate* delegate_; QtTreeWidgetItem* treeRoot_; - UIEventStream* eventStream_; - bool editable_; }; } diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript index 24299fb..33450ed 100644 --- a/Swift/QtUI/SConscript +++ b/Swift/QtUI/SConscript @@ -104,6 +104,8 @@ sources = [ "Roster/RosterDelegate.cpp", "Roster/GroupItemDelegate.cpp", "Roster/DelegateCommons.cpp", + "Roster/QtRosterWidget.cpp", + "Roster/QtOccupantListWidget.cpp", "EventViewer/EventModel.cpp", "EventViewer/EventDelegate.cpp", "EventViewer/TwoLineDelegate.cpp", -- cgit v0.10.2-6-g49f6