mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
Multi-window: Alert window storing chat, add group widgets, update statuses and avatars
This commit is contained in:
parent
fa3ab02cec
commit
c684d31d02
|
@ -84,6 +84,7 @@ void Group::updatePeer(int peerId, QString name)
|
||||||
|
|
||||||
widget->onUserListChanged();
|
widget->onUserListChanged();
|
||||||
chatForm->onUserListChanged();
|
chatForm->onUserListChanged();
|
||||||
|
emit userListChanged(getGroupWidget());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Group::setName(const QString& name)
|
void Group::setName(const QString& name)
|
||||||
|
@ -91,7 +92,14 @@ void Group::setName(const QString& name)
|
||||||
chatForm->setName(name);
|
chatForm->setName(name);
|
||||||
|
|
||||||
if (widget->isActive())
|
if (widget->isActive())
|
||||||
GUI::setWindowTitle(name);
|
GUI::setWindowTitle(name);
|
||||||
|
|
||||||
|
emit titleChanged(this->getGroupWidget());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Group::getName() const
|
||||||
|
{
|
||||||
|
return widget->getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Group::regeneratePeerList()
|
void Group::regeneratePeerList()
|
||||||
|
@ -117,6 +125,7 @@ void Group::regeneratePeerList()
|
||||||
|
|
||||||
widget->onUserListChanged();
|
widget->onUserListChanged();
|
||||||
chatForm->onUserListChanged();
|
chatForm->onUserListChanged();
|
||||||
|
emit userListChanged(getGroupWidget());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Group::isAvGroupchat() const
|
bool Group::isAvGroupchat() const
|
||||||
|
|
|
@ -61,9 +61,14 @@ public:
|
||||||
|
|
||||||
void updatePeer(int peerId, QString newName);
|
void updatePeer(int peerId, QString newName);
|
||||||
void setName(const QString& name);
|
void setName(const QString& name);
|
||||||
|
QString getName() const;
|
||||||
|
|
||||||
QString resolveToxId(const ToxId &id) const;
|
QString resolveToxId(const ToxId &id) const;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void titleChanged(GroupWidget* widget);
|
||||||
|
void userListChanged(GroupWidget* widget);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GroupWidget* widget;
|
GroupWidget* widget;
|
||||||
GroupChatForm* chatForm;
|
GroupChatForm* chatForm;
|
||||||
|
|
|
@ -20,16 +20,23 @@
|
||||||
#include "contentdialog.h"
|
#include "contentdialog.h"
|
||||||
#include "contentlayout.h"
|
#include "contentlayout.h"
|
||||||
#include "friendwidget.h"
|
#include "friendwidget.h"
|
||||||
|
#include "groupwidget.h"
|
||||||
#include "style.h"
|
#include "style.h"
|
||||||
|
#include "widget.h"
|
||||||
#include "tool/adjustingscrollarea.h"
|
#include "tool/adjustingscrollarea.h"
|
||||||
#include "src/persistence/settings.h"
|
#include "src/persistence/settings.h"
|
||||||
#include "src/friend.h"
|
#include "src/friend.h"
|
||||||
#include "src/friendlist.h"
|
#include "src/friendlist.h"
|
||||||
|
#include "src/group.h"
|
||||||
|
#include "src/widget/form/chatform.h"
|
||||||
|
#include "src/core/core.h"
|
||||||
#include <QBoxLayout>
|
#include <QBoxLayout>
|
||||||
#include <QSplitter>
|
#include <QSplitter>
|
||||||
|
#include <QGuiApplication>
|
||||||
|
|
||||||
ContentDialog* ContentDialog::currentDialog = nullptr;
|
ContentDialog* ContentDialog::currentDialog = nullptr;
|
||||||
QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>> ContentDialog::friendList;
|
QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>> ContentDialog::friendList;
|
||||||
|
QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>> ContentDialog::groupList;
|
||||||
|
|
||||||
ContentDialog::ContentDialog(QWidget* parent)
|
ContentDialog::ContentDialog(QWidget* parent)
|
||||||
: QDialog(parent, Qt::Window)
|
: QDialog(parent, Qt::Window)
|
||||||
|
@ -101,16 +108,66 @@ ContentDialog::~ContentDialog()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContentDialog::addFriend(int friendId, QString id)
|
FriendWidget* ContentDialog::addFriend(int friendId, QString id)
|
||||||
{
|
{
|
||||||
FriendWidget* friendWidget = new FriendWidget(friendId, id);
|
FriendWidget* friendWidget = new FriendWidget(friendId, id);
|
||||||
friendLayout->insertWidget(friendLayout->count() - 1, friendWidget);
|
friendLayout->insertWidget(friendLayout->count() - 1, friendWidget);
|
||||||
|
|
||||||
onChatroomWidgetClicked(friendWidget);
|
Friend* frnd = friendWidget->getFriend();
|
||||||
|
|
||||||
|
onChatroomWidgetClicked(friendWidget, false);
|
||||||
|
|
||||||
|
connect(frnd, &Friend::displayedNameChanged, this, &ContentDialog::updateFriendWidget);
|
||||||
connect(friendWidget, &FriendWidget::chatroomWidgetClicked, this, &ContentDialog::onChatroomWidgetClicked);
|
connect(friendWidget, &FriendWidget::chatroomWidgetClicked, this, &ContentDialog::onChatroomWidgetClicked);
|
||||||
|
connect(friendWidget, SIGNAL(chatroomWidgetClicked(GenericChatroomWidget*)), frnd->getChatForm(), SLOT(focusInput()));
|
||||||
|
connect(Core::getInstance(), &Core::friendAvatarChanged, friendWidget, &FriendWidget::onAvatarChange);
|
||||||
|
connect(Core::getInstance(), &Core::friendAvatarRemoved, friendWidget, &FriendWidget::onAvatarRemoved);
|
||||||
|
|
||||||
friendList.insert(friendId, std::make_tuple(this, friendWidget));
|
friendList.insert(friendId, std::make_tuple(this, friendWidget));
|
||||||
|
|
||||||
|
return friendWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
GroupWidget* ContentDialog::addGroup(int groupId, const QString& name)
|
||||||
|
{
|
||||||
|
GroupWidget* groupWidget = new GroupWidget(groupId, name);
|
||||||
|
friendLayout->insertWidget(friendLayout->count() - 1, groupWidget);
|
||||||
|
|
||||||
|
Group* group = groupWidget->getGroup();
|
||||||
|
connect(group, &Group::titleChanged, this, &ContentDialog::updateGroupWidget);
|
||||||
|
connect(group, &Group::userListChanged, this, &ContentDialog::updateGroupWidget);
|
||||||
|
connect(groupWidget, &GroupWidget::chatroomWidgetClicked, this, &ContentDialog::onChatroomWidgetClicked);
|
||||||
|
|
||||||
|
onChatroomWidgetClicked(groupWidget, false);
|
||||||
|
|
||||||
|
groupList.insert(groupId, std::make_tuple(this, groupWidget));
|
||||||
|
|
||||||
|
return groupWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContentDialog::removeFriend(int friendId)
|
||||||
|
{
|
||||||
|
remove(friendId, friendList);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContentDialog::removeGroup(int groupId)
|
||||||
|
{
|
||||||
|
remove(groupId, groupList);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ContentDialog::hasFriendWidget(int friendId, GenericChatroomWidget* chatroomWidget)
|
||||||
|
{
|
||||||
|
return hasWidget(friendId, chatroomWidget, friendList);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ContentDialog::hasGroupWidget(int groupId, GenericChatroomWidget *chatroomWidget)
|
||||||
|
{
|
||||||
|
return hasWidget(groupId, chatroomWidget, groupList);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ContentDialog::chatroomWidgetCount() const
|
||||||
|
{
|
||||||
|
return friendLayout->count() - 1; // Don't include the stretch.
|
||||||
}
|
}
|
||||||
|
|
||||||
ContentDialog* ContentDialog::current()
|
ContentDialog* ContentDialog::current()
|
||||||
|
@ -118,16 +175,81 @@ ContentDialog* ContentDialog::current()
|
||||||
return currentDialog;
|
return currentDialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ContentDialog::showChatroomWidget(int friendId)
|
bool ContentDialog::existsFriendWidget(int friendId, bool focus)
|
||||||
{
|
{
|
||||||
auto widgetIt = friendList.find(friendId);
|
return existsWidget(friendId, focus, friendList);
|
||||||
if (widgetIt == friendList.end())
|
}
|
||||||
return false;
|
|
||||||
|
|
||||||
std::get<0>(widgetIt.value())->activateWindow();
|
bool ContentDialog::existsGroupWidget(int groupId, bool focus)
|
||||||
std::get<0>(widgetIt.value())->onChatroomWidgetClicked(std::get<1>(widgetIt.value()));
|
{
|
||||||
|
return existsWidget(groupId, focus, groupList);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
void ContentDialog::updateFriendStatus(int friendId)
|
||||||
|
{
|
||||||
|
updateStatus(friendId, friendList);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContentDialog::updateFriendStatusMessage(int friendId, const QString &message)
|
||||||
|
{
|
||||||
|
auto iter = friendList.find(friendId);
|
||||||
|
|
||||||
|
if (iter == friendList.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::get<1>(iter.value())->setStatusMsg(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContentDialog::updateGroupStatus(int groupId)
|
||||||
|
{
|
||||||
|
updateStatus(groupId, groupList);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ContentDialog::isFriendWidgetActive(int friendId)
|
||||||
|
{
|
||||||
|
return isWidgetActive(friendId, friendList);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ContentDialog::isGroupWidgetActive(int groupId)
|
||||||
|
{
|
||||||
|
return isWidgetActive(groupId, groupList);
|
||||||
|
}
|
||||||
|
|
||||||
|
ContentDialog* ContentDialog::getFriendDialog(int friendId)
|
||||||
|
{
|
||||||
|
return getDialog(friendId, friendList);
|
||||||
|
}
|
||||||
|
|
||||||
|
ContentDialog* ContentDialog::getGroupDialog(int groupId)
|
||||||
|
{
|
||||||
|
return getDialog(groupId, groupList);
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <QDragEnterEvent>
|
||||||
|
#include <QMimeData>
|
||||||
|
void ContentDialog::dragEnterEvent(QDragEnterEvent *event)
|
||||||
|
{
|
||||||
|
if (event->mimeData()->hasFormat("friend"))
|
||||||
|
event->acceptProposedAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContentDialog::dropEvent(QDropEvent *event)
|
||||||
|
{
|
||||||
|
if (event->mimeData()->hasFormat("friend"))
|
||||||
|
{
|
||||||
|
//int friendId = ev->mimeData()->data("friend").toInt();
|
||||||
|
//Core::getInstance()->groupInviteFriend(friendId, groupId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContentDialog::changeEvent(QEvent *event)
|
||||||
|
{
|
||||||
|
QWidget::changeEvent(event);
|
||||||
|
if (event->type() == QEvent::ActivationChange)
|
||||||
|
{
|
||||||
|
if (isActiveWindow())
|
||||||
|
currentDialog = this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContentDialog::resizeEvent(QResizeEvent* event)
|
void ContentDialog::resizeEvent(QResizeEvent* event)
|
||||||
|
@ -143,8 +265,27 @@ void ContentDialog::closeEvent(QCloseEvent* event)
|
||||||
QWidget::closeEvent(event);
|
QWidget::closeEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContentDialog::onChatroomWidgetClicked(GenericChatroomWidget *widget)
|
void ContentDialog::onChatroomWidgetClicked(GenericChatroomWidget *widget, bool group)
|
||||||
{
|
{
|
||||||
|
if (group)
|
||||||
|
{
|
||||||
|
ContentDialog* contentDialog = new ContentDialog();
|
||||||
|
contentDialog->show();
|
||||||
|
|
||||||
|
if (widget->getFriend() != nullptr)
|
||||||
|
{
|
||||||
|
removeFriend(widget->getFriend()->getFriendID());
|
||||||
|
Widget::getInstance()->addFriendDialog(widget->getFriend(), contentDialog);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
removeGroup(widget->getGroup()->getGroupId());
|
||||||
|
Widget::getInstance()->addGroupDialog(widget->getGroup(), contentDialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
contentLayout->clear();
|
contentLayout->clear();
|
||||||
|
|
||||||
if (activeChatroomWidget != nullptr)
|
if (activeChatroomWidget != nullptr)
|
||||||
|
@ -153,14 +294,29 @@ void ContentDialog::onChatroomWidgetClicked(GenericChatroomWidget *widget)
|
||||||
activeChatroomWidget = widget;
|
activeChatroomWidget = widget;
|
||||||
|
|
||||||
widget->setChatForm(contentLayout);
|
widget->setChatForm(contentLayout);
|
||||||
setWindowTitle(widget->getName());
|
|
||||||
widget->setAsActiveChatroom();
|
widget->setAsActiveChatroom();
|
||||||
widget->resetEventFlags();
|
widget->resetEventFlags();
|
||||||
widget->updateStatusLight();
|
widget->updateStatusLight();
|
||||||
QString windowTitle = widget->getName();
|
setWindowTitle(widget->getTitle());
|
||||||
if (!widget->getStatusString().isNull())
|
|
||||||
windowTitle += " (" + widget->getStatusString() + ")";
|
if (widget->getFriend() != nullptr)
|
||||||
setWindowTitle(windowTitle);
|
widget->getFriend()->getFriendWidget()->updateStatusLight();
|
||||||
|
else
|
||||||
|
widget->getGroup()->getGroupWidget()->updateStatusLight();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContentDialog::updateFriendWidget(FriendWidget *w, Status s)
|
||||||
|
{
|
||||||
|
// Note: This argument friend widget is not the one stored here!
|
||||||
|
Q_UNUSED(s); // Use it after friend list improvements are merged, to sort contacts here.
|
||||||
|
|
||||||
|
std::get<1>(friendList.find(w->friendId).value())->setName(w->getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContentDialog::updateGroupWidget(GroupWidget *w)
|
||||||
|
{
|
||||||
|
std::get<1>(groupList.find(w->groupId).value())->setName(w->getName());
|
||||||
|
static_cast<GroupWidget*>(std::get<1>(groupList.find(w->groupId).value()))->onUserListChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContentDialog::saveDialogGeometry()
|
void ContentDialog::saveDialogGeometry()
|
||||||
|
@ -172,3 +328,100 @@ void ContentDialog::saveSplitterState()
|
||||||
{
|
{
|
||||||
Settings::getInstance().setDialogSplitterState(splitter->saveState());
|
Settings::getInstance().setDialogSplitterState(splitter->saveState());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ContentDialog::remove(int id, const QHash<int, std::tuple<ContentDialog *, GenericChatroomWidget *> > &list)
|
||||||
|
{
|
||||||
|
auto iter = list.find(id);
|
||||||
|
|
||||||
|
if (iter == list.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
GenericChatroomWidget* chatroomWidget = std::get<1>(iter.value());
|
||||||
|
|
||||||
|
if (activeChatroomWidget == chatroomWidget)
|
||||||
|
{
|
||||||
|
// Need to find replacement to show here instead.
|
||||||
|
if (chatroomWidgetCount() > 0)
|
||||||
|
{
|
||||||
|
int index = friendLayout->indexOf(chatroomWidget) - 1;
|
||||||
|
|
||||||
|
// Don't let it go below 0. If it does, then we're first. Go second.
|
||||||
|
if (index < 0)
|
||||||
|
index = 1;
|
||||||
|
|
||||||
|
GenericChatroomWidget* chatroomWidget = static_cast<GenericChatroomWidget*>(friendLayout->itemAt(index)->widget());
|
||||||
|
onChatroomWidgetClicked(chatroomWidget, false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
contentLayout->clear();
|
||||||
|
activeChatroomWidget = nullptr;
|
||||||
|
deleteLater();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
friendLayout->removeWidget(chatroomWidget);
|
||||||
|
chatroomWidget->deleteLater();
|
||||||
|
friendList.remove(id);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ContentDialog::hasWidget(int id, GenericChatroomWidget* chatroomWidget, const QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>>& list)
|
||||||
|
{
|
||||||
|
auto iter = list.find(id);
|
||||||
|
|
||||||
|
if (iter == list.end() || std::get<0>(iter.value()) != this)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return chatroomWidget == std::get<1>(iter.value());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ContentDialog::existsWidget(int id, bool focus, const QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>>& list)
|
||||||
|
{
|
||||||
|
auto iter = list.find(id);
|
||||||
|
if (iter == list.end())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (focus)
|
||||||
|
{
|
||||||
|
std::get<0>(iter.value())->raise();
|
||||||
|
std::get<0>(iter.value())->activateWindow();
|
||||||
|
std::get<0>(iter.value())->onChatroomWidgetClicked(std::get<1>(iter.value()), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContentDialog::updateStatus(int id, const QHash<int, std::tuple<ContentDialog *, GenericChatroomWidget *> > &list)
|
||||||
|
{
|
||||||
|
auto iter = list.find(id);
|
||||||
|
|
||||||
|
if (iter == list.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
GenericChatroomWidget* chatroomWidget = std::get<1>(iter.value());
|
||||||
|
chatroomWidget->updateStatusLight();
|
||||||
|
|
||||||
|
if(chatroomWidget->isActive())
|
||||||
|
std::get<0>(iter.value())->setWindowTitle(chatroomWidget->getTitle());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ContentDialog::isWidgetActive(int id, const QHash<int, std::tuple<ContentDialog *, GenericChatroomWidget *> > &list)
|
||||||
|
{
|
||||||
|
auto iter = list.find(id);
|
||||||
|
|
||||||
|
if (iter == list.end())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return std::get<0>(iter.value())->activeChatroomWidget == std::get<1>(iter.value());
|
||||||
|
}
|
||||||
|
|
||||||
|
ContentDialog* ContentDialog::getDialog(int id, const QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>>& list)
|
||||||
|
{
|
||||||
|
auto iter = list.find(id);
|
||||||
|
|
||||||
|
if (iter == list.end())
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
return std::get<0>(iter.value());
|
||||||
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
#include "src/core/corestructs.h"
|
||||||
|
|
||||||
template <typename K, typename V> class QHash;
|
template <typename K, typename V> class QHash;
|
||||||
|
|
||||||
|
@ -29,6 +30,8 @@ class QSplitter;
|
||||||
class QVBoxLayout;
|
class QVBoxLayout;
|
||||||
class ContentLayout;
|
class ContentLayout;
|
||||||
class GenericChatroomWidget;
|
class GenericChatroomWidget;
|
||||||
|
class FriendWidget;
|
||||||
|
class GroupWidget;
|
||||||
|
|
||||||
class ContentDialog : public QDialog
|
class ContentDialog : public QDialog
|
||||||
{
|
{
|
||||||
|
@ -36,27 +39,56 @@ class ContentDialog : public QDialog
|
||||||
public:
|
public:
|
||||||
ContentDialog(QWidget* parent = 0);
|
ContentDialog(QWidget* parent = 0);
|
||||||
~ContentDialog();
|
~ContentDialog();
|
||||||
void addFriend(int friendId, QString id);
|
|
||||||
|
FriendWidget* addFriend(int friendId, QString id);
|
||||||
|
GroupWidget* addGroup(int groupId, const QString& name);
|
||||||
|
void removeFriend(int friendId);
|
||||||
|
void removeGroup(int groupId);
|
||||||
|
bool hasFriendWidget(int friendId, GenericChatroomWidget* chatroomWidget);
|
||||||
|
bool hasGroupWidget(int groupId, GenericChatroomWidget* chatroomWidget);
|
||||||
|
int chatroomWidgetCount() const;
|
||||||
|
|
||||||
static ContentDialog* current();
|
static ContentDialog* current();
|
||||||
static bool showChatroomWidget(int friendId);
|
static bool existsFriendWidget(int friendId, bool focus);
|
||||||
|
static bool existsGroupWidget(int groupId, bool focus);
|
||||||
|
static void updateFriendStatus(int friendId);
|
||||||
|
static void updateFriendStatusMessage(int friendId, const QString &message);
|
||||||
|
static void updateGroupStatus(int groupId);
|
||||||
|
static bool isFriendWidgetActive(int friendId);
|
||||||
|
static bool isGroupWidgetActive(int groupId);
|
||||||
|
static ContentDialog* getFriendDialog(int friendId);
|
||||||
|
static ContentDialog* getGroupDialog(int groupId);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
void dragEnterEvent(QDragEnterEvent* event) final override;
|
||||||
|
void dropEvent(QDropEvent* event) final override;
|
||||||
|
void changeEvent(QEvent* event) override;
|
||||||
void resizeEvent(QResizeEvent* event) override;
|
void resizeEvent(QResizeEvent* event) override;
|
||||||
void closeEvent(QCloseEvent* event) override;
|
void closeEvent(QCloseEvent* event) override;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onChatroomWidgetClicked(GenericChatroomWidget* widget);
|
void onChatroomWidgetClicked(GenericChatroomWidget* widget, bool group);
|
||||||
|
void updateFriendWidget(FriendWidget* w, Status s);
|
||||||
|
void updateGroupWidget(GroupWidget* w);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void saveDialogGeometry();
|
void saveDialogGeometry();
|
||||||
void saveSplitterState();
|
void saveSplitterState();
|
||||||
|
|
||||||
|
void remove(int id, const QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>>& list);
|
||||||
|
bool hasWidget(int id, GenericChatroomWidget* chatroomWidget, const QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>>& list);
|
||||||
|
static bool existsWidget(int id, bool focus, const QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>>& list);
|
||||||
|
static void updateStatus(int id, const QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>>& list);
|
||||||
|
static bool isWidgetActive(int id, const QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>>& list);
|
||||||
|
static ContentDialog* getDialog(int id, const QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>>& list);
|
||||||
|
|
||||||
QSplitter* splitter;
|
QSplitter* splitter;
|
||||||
QVBoxLayout* friendLayout;
|
QVBoxLayout* friendLayout;
|
||||||
ContentLayout* contentLayout;
|
ContentLayout* contentLayout;
|
||||||
GenericChatroomWidget* activeChatroomWidget;
|
GenericChatroomWidget* activeChatroomWidget;
|
||||||
static ContentDialog* currentDialog;
|
static ContentDialog* currentDialog;
|
||||||
static QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>> friendList;
|
static QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>> friendList;
|
||||||
|
static QHash<int, std::tuple<ContentDialog*, GenericChatroomWidget*>> groupList;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CONTENTDIALOG_H
|
#endif // CONTENTDIALOG_H
|
||||||
|
|
|
@ -219,7 +219,7 @@ void ChatForm::onFileRecvRequest(ToxFile file)
|
||||||
Widget* w = Widget::getInstance();
|
Widget* w = Widget::getInstance();
|
||||||
if (!w->isFriendWidgetCurActiveWidget(f)|| w->isMinimized() || !w->isActiveWindow())
|
if (!w->isFriendWidgetCurActiveWidget(f)|| w->isMinimized() || !w->isActiveWindow())
|
||||||
{
|
{
|
||||||
w->newMessageAlert(f->getFriendWidget());
|
w->newFriendMessageAlert(file.friendId);
|
||||||
f->setEventFlag(true);
|
f->setEventFlag(true);
|
||||||
f->getFriendWidget()->updateStatusLight();
|
f->getFriendWidget()->updateStatusLight();
|
||||||
}
|
}
|
||||||
|
@ -302,7 +302,7 @@ void ChatForm::onAvInvite(uint32_t FriendId, int CallId, bool video)
|
||||||
Widget* w = Widget::getInstance();
|
Widget* w = Widget::getInstance();
|
||||||
if (!w->isFriendWidgetCurActiveWidget(f)|| w->isMinimized() || !w->isActiveWindow())
|
if (!w->isFriendWidgetCurActiveWidget(f)|| w->isMinimized() || !w->isActiveWindow())
|
||||||
{
|
{
|
||||||
w->newMessageAlert(f->getFriendWidget());
|
w->newFriendMessageAlert(FriendId);
|
||||||
f->setEventFlag(true);
|
f->setEventFlag(true);
|
||||||
f->getFriendWidget()->updateStatusLight();
|
f->getFriendWidget()->updateStatusLight();
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,8 +68,22 @@ void FriendWidget::contextMenuEvent(QContextMenuEvent * event)
|
||||||
ToxId id = FriendList::findFriend(friendId)->getToxId();
|
ToxId id = FriendList::findFriend(friendId)->getToxId();
|
||||||
QString dir = Settings::getInstance().getAutoAcceptDir(id);
|
QString dir = Settings::getInstance().getAutoAcceptDir(id);
|
||||||
QMenu menu;
|
QMenu menu;
|
||||||
menu.addAction(tr("Open Chat"));
|
QAction* openChat = menu.addAction(tr("Open chat"));
|
||||||
menu.addAction(tr("Open Chat in New Window"));
|
QAction* openChatWindow = nullptr;
|
||||||
|
QAction* removeChatWindow = nullptr;
|
||||||
|
|
||||||
|
if (!Settings::getInstance().getSeparateWindow() || !Settings::getInstance().getDontGroupWindows())
|
||||||
|
{
|
||||||
|
ContentDialog* contentDialog = ContentDialog::getFriendDialog(friendId);
|
||||||
|
bool notAlone = contentDialog != nullptr && contentDialog->chatroomWidgetCount() > 1;
|
||||||
|
|
||||||
|
if (contentDialog == nullptr || notAlone)
|
||||||
|
openChatWindow = menu.addAction(tr("Open chat in new window"));
|
||||||
|
|
||||||
|
if (notAlone && contentDialog->hasFriendWidget(friendId, this))
|
||||||
|
removeChatWindow = menu.addAction(tr("Remove chat from this window"));
|
||||||
|
}
|
||||||
|
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
QMenu* inviteMenu = menu.addMenu(tr("Invite to group","Menu to invite a friend to a groupchat"));
|
QMenu* inviteMenu = menu.addMenu(tr("Invite to group","Menu to invite a friend to a groupchat"));
|
||||||
QMap<QAction*, Group*> groupActions;
|
QMap<QAction*, Group*> groupActions;
|
||||||
|
@ -160,6 +174,22 @@ void FriendWidget::contextMenuEvent(QContextMenuEvent * event)
|
||||||
emit removeFriend(friendId);
|
emit removeFriend(friendId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (selectedItem == openChat)
|
||||||
|
{
|
||||||
|
emit chatroomWidgetClicked(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (selectedItem == openChatWindow)
|
||||||
|
{
|
||||||
|
emit chatroomWidgetClicked(this, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (selectedItem == removeChatWindow)
|
||||||
|
{
|
||||||
|
ContentDialog* contentDialog = ContentDialog::getFriendDialog(friendId);
|
||||||
|
contentDialog->removeFriend(friendId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
else if (selectedItem == autoAccept)
|
else if (selectedItem == autoAccept)
|
||||||
{
|
{
|
||||||
if (!autoAccept->isChecked())
|
if (!autoAccept->isChecked())
|
||||||
|
@ -282,7 +312,7 @@ void FriendWidget::updateStatusLight()
|
||||||
statusPic.setMargin(0);
|
statusPic.setMargin(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString FriendWidget::getStatusString()
|
QString FriendWidget::getStatusString() const
|
||||||
{
|
{
|
||||||
Friend* f = FriendList::findFriend(friendId);
|
Friend* f = FriendList::findFriend(friendId);
|
||||||
Status status = f->getStatus();
|
Status status = f->getStatus();
|
||||||
|
@ -313,10 +343,10 @@ void FriendWidget::search(const QString &searchString, bool hide)
|
||||||
circleWidget->search(searchString);
|
circleWidget->search(searchString);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FriendWidget::chatFormIsSet() const
|
bool FriendWidget::chatFormIsSet(bool focus) const
|
||||||
{
|
{
|
||||||
Friend* f = FriendList::findFriend(friendId);
|
Friend* f = FriendList::findFriend(friendId);
|
||||||
return f->getChatForm()->isVisible() || ContentDialog::showChatroomWidget(friendId);
|
return ContentDialog::existsFriendWidget(friendId, focus) || f->getChatForm()->isVisible();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FriendWidget::setChatForm(ContentLayout* contentLayout)
|
void FriendWidget::setChatForm(ContentLayout* contentLayout)
|
||||||
|
|
|
@ -32,10 +32,10 @@ public:
|
||||||
virtual void setAsActiveChatroom() override;
|
virtual void setAsActiveChatroom() override;
|
||||||
virtual void setAsInactiveChatroom() override;
|
virtual void setAsInactiveChatroom() override;
|
||||||
virtual void updateStatusLight() override;
|
virtual void updateStatusLight() override;
|
||||||
virtual bool chatFormIsSet() const override;
|
virtual bool chatFormIsSet(bool focus) const override;
|
||||||
virtual void setChatForm(ContentLayout* contentLayout) override;
|
virtual void setChatForm(ContentLayout* contentLayout) override;
|
||||||
virtual void resetEventFlags() override;
|
virtual void resetEventFlags() override;
|
||||||
virtual QString getStatusString() override;
|
virtual QString getStatusString() const override;
|
||||||
virtual Friend* getFriend() const override;
|
virtual Friend* getFriend() const override;
|
||||||
void search(const QString &searchString, bool hide = false);
|
void search(const QString &searchString, bool hide = false);
|
||||||
|
|
||||||
|
|
|
@ -144,6 +144,16 @@ QString GenericChatroomWidget::getStatusMsg() const
|
||||||
return statusMessageLabel->text();
|
return statusMessageLabel->text();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString GenericChatroomWidget::getTitle() const
|
||||||
|
{
|
||||||
|
QString title = getName();
|
||||||
|
|
||||||
|
if (!getStatusString().isNull())
|
||||||
|
title += QStringLiteral(" (") + getStatusString() + QStringLiteral(")");
|
||||||
|
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
void GenericChatroomWidget::reloadTheme()
|
void GenericChatroomWidget::reloadTheme()
|
||||||
{
|
{
|
||||||
QPalette p;
|
QPalette p;
|
||||||
|
|
|
@ -28,6 +28,7 @@ class QVBoxLayout;
|
||||||
class QHBoxLayout;
|
class QHBoxLayout;
|
||||||
class ContentLayout;
|
class ContentLayout;
|
||||||
class Friend;
|
class Friend;
|
||||||
|
class Group;
|
||||||
|
|
||||||
class GenericChatroomWidget : public GenericChatItemWidget
|
class GenericChatroomWidget : public GenericChatItemWidget
|
||||||
{
|
{
|
||||||
|
@ -38,11 +39,12 @@ public:
|
||||||
virtual void setAsActiveChatroom() = 0;
|
virtual void setAsActiveChatroom() = 0;
|
||||||
virtual void setAsInactiveChatroom() = 0;
|
virtual void setAsInactiveChatroom() = 0;
|
||||||
virtual void updateStatusLight() = 0;
|
virtual void updateStatusLight() = 0;
|
||||||
virtual bool chatFormIsSet() const = 0;
|
virtual bool chatFormIsSet(bool focus) const = 0;
|
||||||
virtual void setChatForm(ContentLayout* contentLayout) = 0;
|
virtual void setChatForm(ContentLayout* contentLayout) = 0;
|
||||||
virtual void resetEventFlags() = 0;
|
virtual void resetEventFlags() = 0;
|
||||||
virtual QString getStatusString() = 0;
|
virtual QString getStatusString() const = 0;
|
||||||
virtual Friend* getFriend() const{return nullptr;}
|
virtual Friend* getFriend() const{return nullptr;}
|
||||||
|
virtual Group* getGroup() const{return nullptr;}
|
||||||
|
|
||||||
virtual bool eventFilter(QObject *, QEvent *) final override;
|
virtual bool eventFilter(QObject *, QEvent *) final override;
|
||||||
|
|
||||||
|
@ -52,6 +54,7 @@ public:
|
||||||
void setName(const QString& name);
|
void setName(const QString& name);
|
||||||
void setStatusMsg(const QString& status);
|
void setStatusMsg(const QString& status);
|
||||||
QString getStatusMsg() const;
|
QString getStatusMsg() const;
|
||||||
|
QString getTitle() const;
|
||||||
|
|
||||||
void reloadTheme();
|
void reloadTheme();
|
||||||
|
|
||||||
|
@ -59,7 +62,7 @@ public slots:
|
||||||
void compactChange(bool compact);
|
void compactChange(bool compact);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void chatroomWidgetClicked(GenericChatroomWidget* widget);
|
void chatroomWidgetClicked(GenericChatroomWidget* widget, bool group = false);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void mouseReleaseEvent(QMouseEvent* event) override;
|
virtual void mouseReleaseEvent(QMouseEvent* event) override;
|
||||||
|
|
|
@ -19,8 +19,10 @@
|
||||||
|
|
||||||
#include "groupwidget.h"
|
#include "groupwidget.h"
|
||||||
#include "maskablepixmapwidget.h"
|
#include "maskablepixmapwidget.h"
|
||||||
|
#include "contentdialog.h"
|
||||||
#include "src/grouplist.h"
|
#include "src/grouplist.h"
|
||||||
#include "src/group.h"
|
#include "src/group.h"
|
||||||
|
#include "src/persistence/settings.h"
|
||||||
#include "form/groupchatform.h"
|
#include "form/groupchatform.h"
|
||||||
#include "src/widget/style.h"
|
#include "src/widget/style.h"
|
||||||
#include "src/core/core.h"
|
#include "src/core/core.h"
|
||||||
|
@ -62,6 +64,25 @@ void GroupWidget::contextMenuEvent(QContextMenuEvent* event)
|
||||||
installEventFilter(this); // Disable leave event.
|
installEventFilter(this); // Disable leave event.
|
||||||
|
|
||||||
QMenu menu(this);
|
QMenu menu(this);
|
||||||
|
|
||||||
|
QAction* openChat = menu.addAction(tr("Open chat"));
|
||||||
|
QAction* openChatWindow = nullptr;
|
||||||
|
QAction* removeChatWindow = nullptr;
|
||||||
|
|
||||||
|
if (!Settings::getInstance().getSeparateWindow() || !Settings::getInstance().getDontGroupWindows())
|
||||||
|
{
|
||||||
|
ContentDialog* contentDialog = ContentDialog::getGroupDialog(groupId);
|
||||||
|
bool notAlone = contentDialog != nullptr && contentDialog->chatroomWidgetCount() > 1;
|
||||||
|
|
||||||
|
if (contentDialog == nullptr || notAlone)
|
||||||
|
openChatWindow = menu.addAction(tr("Open chat in new window"));
|
||||||
|
|
||||||
|
if (notAlone && contentDialog->hasGroupWidget(groupId, this))
|
||||||
|
removeChatWindow = menu.addAction(tr("Remove chat from this window"));
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.addSeparator();
|
||||||
|
|
||||||
QAction* setTitle = menu.addAction(tr("Set title..."));
|
QAction* setTitle = menu.addAction(tr("Set title..."));
|
||||||
QAction* quitGroup = menu.addAction(tr("Quit group","Menu to quit a groupchat"));
|
QAction* quitGroup = menu.addAction(tr("Quit group","Menu to quit a groupchat"));
|
||||||
|
|
||||||
|
@ -78,6 +99,22 @@ void GroupWidget::contextMenuEvent(QContextMenuEvent* event)
|
||||||
{
|
{
|
||||||
emit removeGroup(groupId);
|
emit removeGroup(groupId);
|
||||||
}
|
}
|
||||||
|
else if (selectedItem == openChat)
|
||||||
|
{
|
||||||
|
emit chatroomWidgetClicked(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (selectedItem == openChatWindow)
|
||||||
|
{
|
||||||
|
emit chatroomWidgetClicked(this, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (selectedItem == removeChatWindow)
|
||||||
|
{
|
||||||
|
ContentDialog* contentDialog = ContentDialog::getGroupDialog(groupId);
|
||||||
|
contentDialog->removeGroup(groupId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
else if (selectedItem == setTitle)
|
else if (selectedItem == setTitle)
|
||||||
{
|
{
|
||||||
editName();
|
editName();
|
||||||
|
@ -122,7 +159,7 @@ void GroupWidget::updateStatusLight()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QString GroupWidget::getStatusString()
|
QString GroupWidget::getStatusString() const
|
||||||
{
|
{
|
||||||
Group *g = GroupList::findGroup(groupId);
|
Group *g = GroupList::findGroup(groupId);
|
||||||
|
|
||||||
|
@ -137,10 +174,16 @@ void GroupWidget::editName()
|
||||||
nameLabel->editBegin();
|
nameLabel->editBegin();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GroupWidget::chatFormIsSet() const
|
Group* GroupWidget::getGroup() const
|
||||||
{
|
{
|
||||||
|
return GroupList::findGroup(groupId);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GroupWidget::chatFormIsSet(bool focus) const
|
||||||
|
{
|
||||||
|
(void)focus;
|
||||||
Group* g = GroupList::findGroup(groupId);
|
Group* g = GroupList::findGroup(groupId);
|
||||||
return g->getChatForm()->isVisible();
|
return ContentDialog::existsGroupWidget(groupId, focus) || g->getChatForm()->isVisible();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GroupWidget::setChatForm(ContentLayout* contentLayout)
|
void GroupWidget::setChatForm(ContentLayout* contentLayout)
|
||||||
|
|
|
@ -30,10 +30,11 @@ public:
|
||||||
virtual void setAsInactiveChatroom() final override;
|
virtual void setAsInactiveChatroom() final override;
|
||||||
virtual void setAsActiveChatroom() final override;
|
virtual void setAsActiveChatroom() final override;
|
||||||
virtual void updateStatusLight() final override;
|
virtual void updateStatusLight() final override;
|
||||||
virtual bool chatFormIsSet() const final override;
|
virtual bool chatFormIsSet(bool focus) const final override;
|
||||||
virtual void setChatForm(ContentLayout* contentLayout) override;
|
virtual void setChatForm(ContentLayout* contentLayout) override;
|
||||||
virtual void resetEventFlags() final override;
|
virtual void resetEventFlags() final override;
|
||||||
virtual QString getStatusString() final override;
|
virtual QString getStatusString() const final override;
|
||||||
|
virtual Group* getGroup() const override;
|
||||||
void setName(const QString& name);
|
void setName(const QString& name);
|
||||||
void onUserListChanged();
|
void onUserListChanged();
|
||||||
void editName();
|
void editName();
|
||||||
|
|
|
@ -332,13 +332,12 @@ void Widget::init()
|
||||||
contentLayout = nullptr;
|
contentLayout = nullptr;
|
||||||
onSeparateWindowChanged(Settings::getInstance().getSeparateWindow(), false);
|
onSeparateWindowChanged(Settings::getInstance().getSeparateWindow(), false);
|
||||||
|
|
||||||
if (contentLayout != nullptr)
|
|
||||||
onAddClicked();
|
|
||||||
|
|
||||||
ui->addButton->setCheckable(true);
|
ui->addButton->setCheckable(true);
|
||||||
ui->transferButton->setCheckable(true);
|
ui->transferButton->setCheckable(true);
|
||||||
ui->settingsButton->setCheckable(true);
|
ui->settingsButton->setCheckable(true);
|
||||||
setActiveToolMenuButton(Widget::AddButton);
|
|
||||||
|
if (contentLayout != nullptr)
|
||||||
|
onAddClicked();
|
||||||
|
|
||||||
//restore window state
|
//restore window state
|
||||||
restoreGeometry(Settings::getInstance().getWindowGeometry());
|
restoreGeometry(Settings::getInstance().getWindowGeometry());
|
||||||
|
@ -568,6 +567,7 @@ void Widget::onSeparateWindowChanged(bool separate, bool clicked)
|
||||||
resize(ui->statusPanel->width(), height());
|
resize(ui->statusPanel->width(), height());
|
||||||
|
|
||||||
setWindowTitle(QString());
|
setWindowTitle(QString());
|
||||||
|
setActiveToolMenuButton(None);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clicked)
|
if (clicked)
|
||||||
|
@ -795,7 +795,7 @@ void Widget::addFriend(int friendId, const QString &userId)
|
||||||
Core* core = Nexus::getCore();
|
Core* core = Nexus::getCore();
|
||||||
connect(newfriend, &Friend::displayedNameChanged, this, &Widget::onFriendDisplayChanged);
|
connect(newfriend, &Friend::displayedNameChanged, this, &Widget::onFriendDisplayChanged);
|
||||||
connect(settingsWidget, &SettingsWidget::compactToggled, newfriend->getFriendWidget(), &GenericChatroomWidget::compactChange);
|
connect(settingsWidget, &SettingsWidget::compactToggled, newfriend->getFriendWidget(), &GenericChatroomWidget::compactChange);
|
||||||
connect(newfriend->getFriendWidget(), SIGNAL(chatroomWidgetClicked(GenericChatroomWidget*)), this, SLOT(onChatroomWidgetClicked(GenericChatroomWidget*)));
|
connect(newfriend->getFriendWidget(), SIGNAL(chatroomWidgetClicked(GenericChatroomWidget*,bool)), this, SLOT(onChatroomWidgetClicked(GenericChatroomWidget*,bool)));
|
||||||
connect(newfriend->getFriendWidget(), SIGNAL(removeFriend(int)), this, SLOT(removeFriend(int)));
|
connect(newfriend->getFriendWidget(), SIGNAL(removeFriend(int)), this, SLOT(removeFriend(int)));
|
||||||
connect(newfriend->getFriendWidget(), SIGNAL(copyFriendIdToClipboard(int)), this, SLOT(copyFriendIdToClipboard(int)));
|
connect(newfriend->getFriendWidget(), SIGNAL(copyFriendIdToClipboard(int)), this, SLOT(copyFriendIdToClipboard(int)));
|
||||||
connect(newfriend->getFriendWidget(), SIGNAL(chatroomWidgetClicked(GenericChatroomWidget*)), newfriend->getChatForm(), SLOT(focusInput()));
|
connect(newfriend->getFriendWidget(), SIGNAL(chatroomWidgetClicked(GenericChatroomWidget*)), newfriend->getChatForm(), SLOT(focusInput()));
|
||||||
|
@ -883,6 +883,8 @@ void Widget::onFriendStatusChanged(int friendId, Status status)
|
||||||
setWindowTitle(windowTitle);
|
setWindowTitle(windowTitle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ContentDialog::updateFriendStatus(friendId);
|
||||||
|
|
||||||
//won't print the message if there were no messages before
|
//won't print the message if there were no messages before
|
||||||
if (!f->getChatForm()->isEmpty()
|
if (!f->getChatForm()->isEmpty()
|
||||||
&& Settings::getInstance().getStatusChangeNotificationEnabled())
|
&& Settings::getInstance().getStatusChangeNotificationEnabled())
|
||||||
|
@ -921,6 +923,8 @@ void Widget::onFriendStatusMessageChanged(int friendId, const QString& message)
|
||||||
QString str = message; str.replace('\n', ' ');
|
QString str = message; str.replace('\n', ' ');
|
||||||
str.remove('\r'); str.remove(QChar((char)0)); // null terminator...
|
str.remove('\r'); str.remove(QChar((char)0)); // null terminator...
|
||||||
f->setStatusMessage(str);
|
f->setStatusMessage(str);
|
||||||
|
|
||||||
|
ContentDialog::updateFriendStatusMessage(friendId, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::onFriendUsernameChanged(int friendId, const QString& username)
|
void Widget::onFriendUsernameChanged(int friendId, const QString& username)
|
||||||
|
@ -948,39 +952,46 @@ void Widget::onFriendDisplayChanged(FriendWidget *friendWidget, Status s)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::onChatroomWidgetClicked(GenericChatroomWidget *widget)
|
void Widget::onChatroomWidgetClicked(GenericChatroomWidget *widget, bool group)
|
||||||
{
|
{
|
||||||
if (Settings::getInstance().getSeparateWindow())
|
widget->resetEventFlags();
|
||||||
|
widget->updateStatusLight();
|
||||||
|
|
||||||
|
if (widget->chatFormIsSet(true))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (Settings::getInstance().getSeparateWindow() || group)
|
||||||
{
|
{
|
||||||
if (!widget->chatFormIsSet())
|
ContentDialog* dialog = nullptr;
|
||||||
|
|
||||||
|
if (!Settings::getInstance().getDontGroupWindows() && !group)
|
||||||
|
dialog = ContentDialog::current();
|
||||||
|
|
||||||
|
if (dialog == nullptr)
|
||||||
|
dialog = new ContentDialog();
|
||||||
|
|
||||||
|
dialog->show();
|
||||||
|
Friend* frnd = widget->getFriend();
|
||||||
|
|
||||||
|
if (frnd != nullptr)
|
||||||
{
|
{
|
||||||
ContentDialog* dialog = nullptr;
|
addFriendDialog(frnd, dialog);
|
||||||
|
|
||||||
if (!Settings::getInstance().getDontGroupWindows())
|
|
||||||
dialog = ContentDialog::current();
|
|
||||||
|
|
||||||
if (dialog == nullptr)
|
|
||||||
dialog = new ContentDialog();
|
|
||||||
|
|
||||||
dialog->show();
|
|
||||||
Friend* frnd = widget->getFriend();
|
|
||||||
if (frnd != nullptr)
|
|
||||||
{
|
|
||||||
dialog->addFriend(frnd->getFriendID(), frnd->getDisplayedName());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Group* group = widget->getGroup();
|
||||||
|
addGroupDialog(group, dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
dialog->raise();
|
||||||
|
dialog->activateWindow();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hideMainForms(widget);
|
hideMainForms(widget);
|
||||||
widget->setChatForm(contentLayout);
|
widget->setChatForm(contentLayout);
|
||||||
widget->setAsActiveChatroom();
|
widget->setAsActiveChatroom();
|
||||||
widget->resetEventFlags();
|
setWindowTitle(widget->getTitle());
|
||||||
widget->updateStatusLight();
|
|
||||||
QString windowTitle = widget->getName();
|
|
||||||
if (!widget->getStatusString().isNull())
|
|
||||||
windowTitle += " (" + widget->getStatusString() + ")";
|
|
||||||
setWindowTitle(windowTitle);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -996,9 +1007,11 @@ void Widget::onFriendMessageReceived(int friendId, const QString& message, bool
|
||||||
HistoryKeeper::getInstance()->addChatEntry(f->getToxId().publicKey, isAction ? "/me " + f->getDisplayedName() + " " + message : message,
|
HistoryKeeper::getInstance()->addChatEntry(f->getToxId().publicKey, isAction ? "/me " + f->getDisplayedName() + " " + message : message,
|
||||||
f->getToxId().publicKey, timestamp, true);
|
f->getToxId().publicKey, timestamp, true);
|
||||||
|
|
||||||
f->setEventFlag(f->getFriendWidget() != activeChatroomWidget);
|
f->setEventFlag(f->getFriendWidget() != activeChatroomWidget && !ContentDialog::isFriendWidgetActive(friendId));
|
||||||
newMessageAlert(f->getFriendWidget());
|
newFriendMessageAlert(friendId);
|
||||||
f->getFriendWidget()->updateStatusLight();
|
f->getFriendWidget()->updateStatusLight();
|
||||||
|
ContentDialog::updateFriendStatus(friendId);
|
||||||
|
|
||||||
if (f->getFriendWidget()->isActive())
|
if (f->getFriendWidget()->isActive())
|
||||||
{
|
{
|
||||||
QString windowTitle = f->getFriendWidget()->getName();
|
QString windowTitle = f->getFriendWidget()->getName();
|
||||||
|
@ -1017,25 +1030,91 @@ void Widget::onReceiptRecieved(int friendId, int receipt)
|
||||||
f->getChatForm()->getOfflineMsgEngine()->dischargeReceipt(receipt);
|
f->getChatForm()->getOfflineMsgEngine()->dischargeReceipt(receipt);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::newMessageAlert(GenericChatroomWidget* chat)
|
void Widget::addFriendDialog(Friend *frnd, ContentDialog *dialog)
|
||||||
|
{
|
||||||
|
FriendWidget* friendWidget = dialog->addFriend(frnd->getFriendID(), frnd->getDisplayedName());
|
||||||
|
|
||||||
|
friendWidget->setStatusMsg(frnd->getFriendWidget()->getStatusMsg());
|
||||||
|
|
||||||
|
connect(friendWidget, SIGNAL(removeFriend(int)), this, SLOT(removeFriend(int)));
|
||||||
|
connect(friendWidget, SIGNAL(copyFriendIdToClipboard(int)), this, SLOT(copyFriendIdToClipboard(int)));
|
||||||
|
|
||||||
|
connect(Core::getInstance(), &Core::friendAvatarChanged, friendWidget, &FriendWidget::onAvatarChange);
|
||||||
|
connect(Core::getInstance(), &Core::friendAvatarRemoved, friendWidget, &FriendWidget::onAvatarRemoved);
|
||||||
|
|
||||||
|
QPixmap avatar = Settings::getInstance().getSavedAvatar(frnd->getToxId().toString());
|
||||||
|
if (!avatar.isNull())
|
||||||
|
friendWidget->onAvatarChange(frnd->getFriendID(), avatar);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Widget::addGroupDialog(Group *group, ContentDialog *dialog)
|
||||||
|
{
|
||||||
|
GroupWidget* groupWidget = dialog->addGroup(group->getGroupId(), group->getName());
|
||||||
|
connect(groupWidget, SIGNAL(removeGroup(int)), this, SLOT(removeGroup(int)));
|
||||||
|
connect(groupWidget, SIGNAL(chatroomWidgetClicked(GenericChatroomWidget*)), group->getChatForm(), SLOT(focusInput()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Widget::newFriendMessageAlert(int friendId)
|
||||||
|
{
|
||||||
|
bool hasActive;
|
||||||
|
QWidget* currentWindow;
|
||||||
|
ContentDialog* contentDialog = ContentDialog::getFriendDialog(friendId);
|
||||||
|
|
||||||
|
if (contentDialog != nullptr)
|
||||||
|
{
|
||||||
|
currentWindow = contentDialog->window();
|
||||||
|
hasActive = ContentDialog::isFriendWidgetActive(friendId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentWindow = window();
|
||||||
|
hasActive = activeChatroomWidget != nullptr && FriendList::findFriend(friendId)->getFriendWidget() == activeChatroomWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
newMessageAlert(currentWindow, hasActive);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Widget::newGroupMessageAlert(int groupId)
|
||||||
|
{
|
||||||
|
bool hasActive;
|
||||||
|
QWidget* currentWindow;
|
||||||
|
ContentDialog* contentDialog = ContentDialog::getGroupDialog(groupId);
|
||||||
|
|
||||||
|
if (contentDialog != nullptr)
|
||||||
|
{
|
||||||
|
currentWindow = contentDialog->window();
|
||||||
|
hasActive = ContentDialog::isGroupWidgetActive(groupId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentWindow = window();
|
||||||
|
hasActive = activeChatroomWidget != nullptr && GroupList::findGroup(groupId)->getGroupWidget() == activeChatroomWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
newMessageAlert(currentWindow, hasActive);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Widget::newMessageAlert(QWidget* currentWindow, bool isActive)
|
||||||
{
|
{
|
||||||
bool inactiveWindow = isMinimized() || !isActiveWindow();
|
bool inactiveWindow = isMinimized() || !isActiveWindow();
|
||||||
if (!inactiveWindow && activeChatroomWidget != nullptr && chat == activeChatroomWidget)
|
|
||||||
|
if (!inactiveWindow && isActive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (ui->statusButton->property("status").toString() == "busy")
|
if (ui->statusButton->property("status").toString() == "busy")
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QApplication::alert(this);
|
QApplication::alert(currentWindow);
|
||||||
|
|
||||||
if (inactiveWindow)
|
if (inactiveWindow)
|
||||||
eventFlag = true;
|
eventFlag = true;
|
||||||
|
|
||||||
if (Settings::getInstance().getShowWindow())
|
if (Settings::getInstance().getShowWindow())
|
||||||
{
|
{
|
||||||
show();
|
currentWindow->activateWindow();
|
||||||
|
currentWindow->show();
|
||||||
if (inactiveWindow && Settings::getInstance().getShowInFront())
|
if (inactiveWindow && Settings::getInstance().getShowInFront())
|
||||||
setWindowState(Qt::WindowActive);
|
currentWindow->setWindowState(Qt::WindowActive);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Settings::getInstance().getNotifySound())
|
if (Settings::getInstance().getNotifySound())
|
||||||
|
@ -1052,9 +1131,6 @@ void Widget::newMessageAlert(GenericChatroomWidget* chat)
|
||||||
|
|
||||||
Audio::playMono16Sound(sndData);
|
Audio::playMono16Sound(sndData);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (activeChatroomWidget != chat)
|
|
||||||
ui->friendList->trackWidget(chat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::playRingtone()
|
void Widget::playRingtone()
|
||||||
|
@ -1212,12 +1288,14 @@ void Widget::onGroupMessageReceived(int groupnumber, int peernumber, const QStri
|
||||||
g->setEventFlag(static_cast<GenericChatroomWidget*>(g->getGroupWidget()) != activeChatroomWidget);
|
g->setEventFlag(static_cast<GenericChatroomWidget*>(g->getGroupWidget()) != activeChatroomWidget);
|
||||||
|
|
||||||
if (targeted || Settings::getInstance().getGroupAlwaysNotify())
|
if (targeted || Settings::getInstance().getGroupAlwaysNotify())
|
||||||
newMessageAlert(g->getGroupWidget());
|
newGroupMessageAlert(g->getGroupId());
|
||||||
|
|
||||||
if (targeted)
|
if (targeted)
|
||||||
g->setMentionedFlag(true); // useful for highlighting line or desktop notifications
|
g->setMentionedFlag(true); // useful for highlighting line or desktop notifications
|
||||||
|
|
||||||
g->getGroupWidget()->updateStatusLight();
|
g->getGroupWidget()->updateStatusLight();
|
||||||
|
ContentDialog::updateGroupStatus(g->getGroupId());
|
||||||
|
|
||||||
if (g->getGroupWidget()->isActive())
|
if (g->getGroupWidget()->isActive())
|
||||||
{
|
{
|
||||||
QString windowTitle = g->getGroupWidget()->getName();
|
QString windowTitle = g->getGroupWidget()->getName();
|
||||||
|
@ -1325,7 +1403,7 @@ Group *Widget::createGroup(int groupId)
|
||||||
newgroup->getGroupWidget()->updateStatusLight();
|
newgroup->getGroupWidget()->updateStatusLight();
|
||||||
|
|
||||||
connect(settingsWidget, &SettingsWidget::compactToggled, newgroup->getGroupWidget(), &GenericChatroomWidget::compactChange);
|
connect(settingsWidget, &SettingsWidget::compactToggled, newgroup->getGroupWidget(), &GenericChatroomWidget::compactChange);
|
||||||
connect(newgroup->getGroupWidget(), SIGNAL(chatroomWidgetClicked(GenericChatroomWidget*)), this, SLOT(onChatroomWidgetClicked(GenericChatroomWidget*)));
|
connect(newgroup->getGroupWidget(), SIGNAL(chatroomWidgetClicked(GenericChatroomWidget*,bool)), this, SLOT(onChatroomWidgetClicked(GenericChatroomWidget*,bool)));
|
||||||
connect(newgroup->getGroupWidget(), SIGNAL(removeGroup(int)), this, SLOT(removeGroup(int)));
|
connect(newgroup->getGroupWidget(), SIGNAL(removeGroup(int)), this, SLOT(removeGroup(int)));
|
||||||
connect(newgroup->getGroupWidget(), SIGNAL(chatroomWidgetClicked(GenericChatroomWidget*)), newgroup->getChatForm(), SLOT(focusInput()));
|
connect(newgroup->getGroupWidget(), SIGNAL(chatroomWidgetClicked(GenericChatroomWidget*)), newgroup->getChatForm(), SLOT(focusInput()));
|
||||||
connect(newgroup->getChatForm(), &GroupChatForm::sendMessage, core, &Core::sendGroupMessage);
|
connect(newgroup->getChatForm(), &GroupChatForm::sendMessage, core, &Core::sendGroupMessage);
|
||||||
|
|
|
@ -52,6 +52,7 @@ class AddFriendForm;
|
||||||
class CircleWidget;
|
class CircleWidget;
|
||||||
class QActionGroup;
|
class QActionGroup;
|
||||||
class ContentLayout;
|
class ContentLayout;
|
||||||
|
class ContentDialog;
|
||||||
|
|
||||||
class Widget final : public QMainWindow
|
class Widget final : public QMainWindow
|
||||||
{
|
{
|
||||||
|
@ -64,7 +65,10 @@ public:
|
||||||
QString getUsername();
|
QString getUsername();
|
||||||
Camera* getCamera();
|
Camera* getCamera();
|
||||||
static Widget* getInstance();
|
static Widget* getInstance();
|
||||||
void newMessageAlert(GenericChatroomWidget* chat);
|
void addFriendDialog(Friend* frnd, ContentDialog* dialog);
|
||||||
|
void addGroupDialog(Group* group, ContentDialog* dialog);
|
||||||
|
void newFriendMessageAlert(int friendId);
|
||||||
|
void newGroupMessageAlert(int groupId);
|
||||||
bool isFriendWidgetCurActiveWidget(const Friend* f) const;
|
bool isFriendWidgetCurActiveWidget(const Friend* f) const;
|
||||||
bool getIsWindowMinimized();
|
bool getIsWindowMinimized();
|
||||||
void updateIcons();
|
void updateIcons();
|
||||||
|
@ -147,8 +151,8 @@ private slots:
|
||||||
void onTransferClicked();
|
void onTransferClicked();
|
||||||
void showProfile();
|
void showProfile();
|
||||||
void onUsernameChanged(const QString& newUsername, const QString& oldUsername);
|
void onUsernameChanged(const QString& newUsername, const QString& oldUsername);
|
||||||
|
void onChatroomWidgetClicked(GenericChatroomWidget *, bool group);
|
||||||
void onStatusMessageChanged(const QString& newStatusMessage);
|
void onStatusMessageChanged(const QString& newStatusMessage);
|
||||||
void onChatroomWidgetClicked(GenericChatroomWidget *);
|
|
||||||
void removeFriend(int friendId);
|
void removeFriend(int friendId);
|
||||||
void copyFriendIdToClipboard(int friendId);
|
void copyFriendIdToClipboard(int friendId);
|
||||||
void removeGroup(int groupId);
|
void removeGroup(int groupId);
|
||||||
|
@ -188,6 +192,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void newMessageAlert(QWidget* currentWindow, bool isActive);
|
||||||
void setActiveToolMenuButton(ActiveToolMenuButton newActiveButton);
|
void setActiveToolMenuButton(ActiveToolMenuButton newActiveButton);
|
||||||
void hideMainForms(GenericChatroomWidget* chatroomWidget);
|
void hideMainForms(GenericChatroomWidget* chatroomWidget);
|
||||||
Group *createGroup(int groupId);
|
Group *createGroup(int groupId);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user