diff --git a/src/misc/settings.cpp b/src/misc/settings.cpp index 47fccab47..037b4cbb6 100644 --- a/src/misc/settings.cpp +++ b/src/misc/settings.cpp @@ -138,6 +138,7 @@ void Settings::load() minimizeOnClose = s.value("minimizeOnClose", false).toBool(); useNativeStyle = s.value("nativeStyle", false).toBool(); style = s.value("style", "None").toString(); + statusChangeNotificationEnabled = s.value("statusChangeNotificationEnabled", false).toBool(); s.endGroup(); s.beginGroup("State"); @@ -245,6 +246,7 @@ void Settings::save(QString path) s.setValue("minimizeOnClose", minimizeOnClose); s.setValue("nativeStyle", useNativeStyle); s.setValue("style",style); + s.setValue("statusChangeNotificationEnabled", statusChangeNotificationEnabled); s.endGroup(); s.beginGroup("State"); @@ -377,6 +379,16 @@ void Settings::setAutostartInTray(bool newValue) autostartInTray = newValue; } +bool Settings::getStatusChangeNotificationEnabled() const +{ + return statusChangeNotificationEnabled; +} + +void Settings::setStatusChangeNotificationEnabled(bool newValue) +{ + statusChangeNotificationEnabled = newValue; +} + bool Settings::getUseTranslations() const { return useTranslations; diff --git a/src/misc/settings.h b/src/misc/settings.h index 9ff506ba3..79675fbd8 100644 --- a/src/misc/settings.h +++ b/src/misc/settings.h @@ -138,10 +138,14 @@ public: bool isMinimizeOnCloseEnabled() const; void setMinimizeOnClose(bool newValue); + bool getStatusChangeNotificationEnabled() const; + void setStatusChangeNotificationEnabled(bool newValue); + // Privacy bool isTypingNotificationEnabled() const; void setTypingNotification(bool enabled); + // State bool getUseNativeStyle() const; void setUseNativeStyle(bool value); @@ -211,6 +215,7 @@ private: int firstColumnHandlePos; int secondColumnHandlePosFromRight; QString timestampFormat; + bool statusChangeNotificationEnabled; // Privacy bool typingNotification; diff --git a/src/widget/chatareawidget.cpp b/src/widget/chatareawidget.cpp index 542e3be40..0e5b58eb3 100644 --- a/src/widget/chatareawidget.cpp +++ b/src/widget/chatareawidget.cpp @@ -118,6 +118,11 @@ void ChatAreaWidget::insertMessage(ChatAction *msgAction) messages.append(msgAction); } +int ChatAreaWidget::getNumberOfMessages() +{ + return messages.size(); +} + void ChatAreaWidget::onSliderRangeChanged() { QScrollBar* scroll = verticalScrollBar(); diff --git a/src/widget/chatareawidget.h b/src/widget/chatareawidget.h index d1e2dbe8f..923da19af 100644 --- a/src/widget/chatareawidget.h +++ b/src/widget/chatareawidget.h @@ -33,6 +33,7 @@ public: int nameColWidth() {return nameWidth;} void setNameColWidth(int w); + int getNumberOfMessages(); signals: void onFileTranfertInterract(QString widgetName, QString buttonName); diff --git a/src/widget/form/genericchatform.cpp b/src/widget/form/genericchatform.cpp index 0d31288e1..a42a956dd 100644 --- a/src/widget/form/genericchatform.cpp +++ b/src/widget/form/genericchatform.cpp @@ -127,6 +127,11 @@ GenericChatForm::GenericChatForm(QWidget *parent) : connect(chatWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onChatContextMenuRequested(QPoint))); } +int GenericChatForm::getNumberOfMessages() +{ + return chatWidget->getNumberOfMessages(); +} + void GenericChatForm::setName(const QString &newName) { nameLabel->setText(newName); diff --git a/src/widget/form/genericchatform.h b/src/widget/form/genericchatform.h index b8c373d23..0baa4f315 100644 --- a/src/widget/form/genericchatform.h +++ b/src/widget/form/genericchatform.h @@ -46,7 +46,8 @@ public: virtual void show(Ui::MainWindow &ui); void addMessage(QString author, QString message, bool isAction = false, QDateTime datetime=QDateTime::currentDateTime()); void addSystemInfoMessage(const QString &message, const QString &type, const QDateTime &datetime=QDateTime::currentDateTime()); - + int getNumberOfMessages(); + signals: void sendMessage(int, QString); void sendAction(int, QString); diff --git a/src/widget/form/settings/generalform.cpp b/src/widget/form/settings/generalform.cpp index e2ae4cb1c..df952892a 100644 --- a/src/widget/form/settings/generalform.cpp +++ b/src/widget/form/settings/generalform.cpp @@ -33,6 +33,7 @@ GeneralForm::GeneralForm() : bodyUI->cbUseTranslations->setChecked(Settings::getInstance().getUseTranslations()); bodyUI->cbMakeToxPortable->setChecked(Settings::getInstance().getMakeToxPortable()); bodyUI->startInTray->setChecked(Settings::getInstance().getAutostartInTray()); + bodyUI->statusChangesCheckbox->setChecked(Settings::getInstance().getStatusChangeNotificationEnabled()); for (auto entry : SmileyPack::listSmileyPacks()) { @@ -40,7 +41,7 @@ GeneralForm::GeneralForm() : } bodyUI->smileyPackBrowser->setCurrentIndex(bodyUI->smileyPackBrowser->findData(Settings::getInstance().getSmileyPack())); reloadSmiles(); - + bodyUI->styleBrowser->addItems(QStyleFactory::keys()); bodyUI->styleBrowser->addItem("None"); if(QStyleFactory::keys().contains(Settings::getInstance().getStyle())) @@ -61,6 +62,7 @@ GeneralForm::GeneralForm() : connect(bodyUI->cbUseTranslations, &QCheckBox::stateChanged, this, &GeneralForm::onUseTranslationUpdated); connect(bodyUI->cbMakeToxPortable, &QCheckBox::stateChanged, this, &GeneralForm::onMakeToxPortableUpdated); connect(bodyUI->startInTray, &QCheckBox::stateChanged, this, &GeneralForm::onSetAutostartInTray); + connect(bodyUI->statusChangesCheckbox, &QCheckBox::stateChanged, this, &GeneralForm::onSetStatusChange); connect(bodyUI->smileyPackBrowser, SIGNAL(currentIndexChanged(int)), this, SLOT(onSmileyBrowserIndexChanged(int))); // new syntax can't handle overloaded signals... (at least not in a pretty way) connect(bodyUI->cbUDPDisabled, &QCheckBox::stateChanged, this, &GeneralForm::onUDPUpdated); @@ -101,6 +103,11 @@ void GeneralForm::onStyleSelected(QString style) this->setStyle(QStyleFactory::create(style)); } +void GeneralForm::onSetStatusChange() +{ + Settings::getInstance().setStatusChangeNotificationEnabled(bodyUI->statusChangesCheckbox->isChecked()); +} + void GeneralForm::onSmileyBrowserIndexChanged(int index) { QString filename = bodyUI->smileyPackBrowser->itemData(index).toString(); diff --git a/src/widget/form/settings/generalform.h b/src/widget/form/settings/generalform.h index b2ca84b56..ab8325526 100644 --- a/src/widget/form/settings/generalform.h +++ b/src/widget/form/settings/generalform.h @@ -43,6 +43,7 @@ private slots: void onProxyPortEdited(int port); void onUseProxyUpdated(); void onStyleSelected(QString style); + void onSetStatusChange(); private: Ui::GeneralSettings *bodyUI; diff --git a/src/widget/form/settings/generalsettings.ui b/src/widget/form/settings/generalsettings.ui index d0d31b622..f10025c52 100644 --- a/src/widget/form/settings/generalsettings.ui +++ b/src/widget/form/settings/generalsettings.ui @@ -53,6 +53,13 @@ + + + + Show contacts' status changes + + + diff --git a/src/widget/widget.cpp b/src/widget/widget.cpp index 124f60f90..bbff4ad90 100644 --- a/src/widget/widget.cpp +++ b/src/widget/widget.cpp @@ -151,7 +151,6 @@ Widget::Widget(QWidget *parent) connect(core, SIGNAL(fileUploadFinished(const QString&)), &filesForm, SLOT(onFileUploadComplete(const QString&))); connect(core, &Core::friendAdded, this, &Widget::addFriend); connect(core, &Core::failedToAddFriend, this, &Widget::addFriendFailed); - connect(core, &Core::friendStatusChanged, this, &Widget::onFriendStatusChanged); connect(core, &Core::friendUsernameChanged, this, &Widget::onFriendUsernameChanged); connect(core, &Core::friendStatusChanged, this, &Widget::onFriendStatusChanged); connect(core, &Core::friendStatusMessageChanged, this, &Widget::onFriendStatusMessageChanged); @@ -538,6 +537,23 @@ void Widget::onFriendStatusChanged(int friendId, Status status) f->friendStatus = status; f->widget->updateStatusLight(); + + QString fStatus = ""; + switch(f->friendStatus){ + case Status::Away: + fStatus = tr("away", "contact status"); break; + case Status::Busy: + fStatus = tr("busy", "contact status"); break; + case Status::Offline: + fStatus = tr("offline", "contact status"); break; + default: + fStatus = tr("online", "contact status"); break; + } + + //won't print the message if there were no messages before + if(f->chatForm->getNumberOfMessages() != 0 + && Settings::getInstance().getStatusChangeNotificationEnabled() == true) + f->chatForm->addSystemInfoMessage(tr("%1 is now %2", "e.g. \"Dubslow is now online\"").arg(f->getName()).arg(fStatus), "white"); } void Widget::onFriendStatusMessageChanged(int friendId, const QString& message) diff --git a/src/widget/widget.h b/src/widget/widget.h index 4f50a133c..602e8a889 100644 --- a/src/widget/widget.h +++ b/src/widget/widget.h @@ -90,7 +90,7 @@ private slots: void setStatusMessage(const QString &statusMessage); void addFriend(int friendId, const QString& userId); void addFriendFailed(const QString& userId); - void onFriendStatusChanged(int friendId, Status status); + void onFriendStatusChanged(int friendId, Status status); void onFriendStatusMessageChanged(int friendId, const QString& message); void onFriendUsernameChanged(int friendId, const QString& username); void onChatroomWidgetClicked(GenericChatroomWidget *);