1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

Merge branch 'master' of github.com:tux3/qTox into default_dir_for_saving

This commit is contained in:
agilob 2015-09-03 17:57:23 +01:00
commit 31c44b9db0
No known key found for this signature in database
GPG Key ID: 296F0B764741106C
20 changed files with 48 additions and 649 deletions

View File

@ -189,7 +189,7 @@ sudo dnf install qt-devel qt-doc qt-creator qt5-qtsvg qt5-qtsvg-devel openal-sof
#### openSUSE:
```bash
sudo zypper install patterns-openSUSE-devel_basis libqt5-qtbase-common-devel libqt5-qtsvg-devel libqt5-linguist libQt5Network-devel libQt5OpenGL-devel libQt5Concurrent-devel libQt5Xml-devel libQt5Sql-devel openal-soft-devel qrencode-devel libXScrnSaver-devel libQt5Sql5-sqlite ffmpeg
sudo zypper install patterns-openSUSE-devel_basis libqt5-qtbase-common-devel libqt5-qtsvg-devel libqt5-linguist libQt5Network-devel libQt5OpenGL-devel libQt5Concurrent-devel libQt5Xml-devel libQt5Sql-devel openal-soft-devel qrencode-devel libXScrnSaver-devel libQt5Sql5-sqlite libffmpeg-devel
```
<a name="slackware-other-deps" />

View File

@ -495,8 +495,7 @@ SOURCES += \
src/widget/friendlistlayout.cpp \
src/widget/genericchatitemlayout.cpp \
src/widget/categorywidget.cpp \
src/widget/tool/removefrienddialog.cpp \
src/widget/form/groupinviteform.cpp
src/widget/tool/removefrienddialog.cpp
HEADERS += \
src/audio/audio.h \
@ -540,5 +539,4 @@ HEADERS += \
src/widget/friendlistlayout.h \
src/widget/genericchatitemlayout.h \
src/widget/categorywidget.h \
src/widget/tool/removefrienddialog.h \
src/widget/form/groupinviteform.h
src/widget/tool/removefrienddialog.h

View File

@ -19,12 +19,20 @@ elif which dnf; then
openal-soft-devel libXScrnSaver-devel qrencode-devel \
opus-devel libvpx-devel qt5-qttools-devel glib2-devel \
gdk-pixbuf2-devel gtk2-devel
elif which zypper; then
sudo zypper in \
git patterns-openSUSE-devel_basis libqt5-qtbase-common-devel \
libqt5-qtsvg-devel libqt5-linguist libQt5Network-devel \
libQt5OpenGL-devel libQt5Concurrent-devel libQt5Xml-devel \
libQt5Sql-devel openal-soft-devel qrencode-devel \
libXScrnSaver-devel libQt5Sql5-sqlite libffmpeg-devel \
libsodium-devel libvpx-devel libopus-devel patterns-openSUSE-devel_basis
else
echo "Unknown package manager, attempting to compile anyways"
fi
./bootstrap.sh
if [ -e /etc/redhat-release ]; then
if [ -e /etc/redhat-release -o -e /etc/zypp ]; then
qmake-qt5
else
qmake

View File

@ -1062,24 +1062,19 @@ void Core::groupInviteFriend(uint32_t friendId, int groupId)
tox_invite_friend(tox, friendId, groupId);
}
int Core::createGroup(uint8_t type)
void Core::createGroup(uint8_t type)
{
if (type == TOX_GROUPCHAT_TYPE_TEXT)
{
int group = tox_add_groupchat(tox);
emit emptyGroupCreated(group);
return group;
emit emptyGroupCreated(tox_add_groupchat(tox));
}
else if (type == TOX_GROUPCHAT_TYPE_AV)
{
int group = toxav_add_av_groupchat(tox, &Audio::playGroupAudioQueued, this);
emit emptyGroupCreated(group);
return group;
emit emptyGroupCreated(toxav_add_av_groupchat(tox, &Audio::playGroupAudioQueued, this));
}
else
{
qWarning() << "createGroup: Unknown type "<<type;
return -1;
}
}

View File

@ -105,7 +105,7 @@ public slots:
void acceptFriendRequest(const QString& userId);
void requestFriendship(const QString& friendAddress, const QString& message);
void groupInviteFriend(uint32_t friendId, int groupId);
int createGroup(uint8_t type = TOX_GROUPCHAT_TYPE_AV);
void createGroup(uint8_t type = TOX_GROUPCHAT_TYPE_AV);
void removeFriend(uint32_t friendId, bool fake = false);
void removeGroup(int groupId, bool fake = false);

View File

@ -25,7 +25,6 @@
#include "src/net/autoupdate.h"
#include "src/persistence/toxsave.h"
#include "src/persistence/profile.h"
#include "src/persistence/profilelocker.h"
#include "src/widget/loginscreen.h"
#include "src/widget/translator.h"
#include "src/video/camerasource.h"
@ -163,13 +162,6 @@ int main(int argc, char *argv[])
ipc.registerEventHandler("save", &toxSaveEventHandler);
ipc.registerEventHandler("activate", &toxActivateEventHandler);
// If we're the IPC owner and we just started, then
// either we're the only running instance or any other instance
// is already so frozen it lost ownership.
// It's safe to remove any potential stale locks in this situation.
if (ipc.isCurrentOwner())
ProfileLocker::clearAllLocks();
if (parser.isSet("p"))
{
QString profileName = parser.value("p");

View File

@ -368,7 +368,7 @@ QSplitter:handle{
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="statusLayout">
<layout class="QVBoxLayout" name="verticalLayout_6">
<property name="spacing">
<number>0</number>
</property>
@ -1085,7 +1085,7 @@ QSplitter:handle{
<x>0</x>
<y>0</y>
<width>284</width>
<height>393</height>
<height>398</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5"/>

View File

@ -49,6 +49,7 @@ bool ProfileLocker::lock(QString profile)
return true;
QLockFile* newLock = new QLockFile(lockPathFromName(profile));
newLock->setStaleLockTime(0);
if (!newLock->tryLock())
{
delete newLock;
@ -71,23 +72,6 @@ void ProfileLocker::unlock()
curLockName.clear();
}
void ProfileLocker::clearAllLocks()
{
qDebug() << "clearAllLocks: Wiping out all lock files";
if (lockfile)
unlock();
QDir dir(Settings::getInstance().getSettingsDirPath());
dir.setFilter(QDir::Files);
dir.setNameFilters({"*.lock"});
QFileInfoList files = dir.entryInfoList();
for (QFileInfo fileInfo : files)
{
QFile file(fileInfo.absoluteFilePath());
file.remove();
}
}
void ProfileLocker::assertLock()
{
if (!lockfile)

View File

@ -48,10 +48,6 @@ public:
static bool hasLock();
/// Return the name of the currently loaded profile, a null string if there is none
static QString getCurLockName();
/// Releases all locks on all profiles
/// DO NOT call unless all we're the only qTox instance
/// and we don't hold any lock yet.
static void clearAllLocks();
/// Check that we actually own the lock
/// In case the file was deleted on disk, restore it
/// If we can't get a lock, exit qTox immediately

View File

@ -301,23 +301,8 @@ void Settings::loadPersonnal(Profile* profile)
ps.endArray();
ps.endGroup();
ps.beginGroup("Requests");
unreadFriendRequests = ps.value("unread", 0).toUInt();
size = ps.beginReadArray("Request");
friendLst.reserve(size);
for (int i = 0; i < size; i ++)
{
ps.setArrayIndex(i);
QPair<QString, QString> request;
request.first = ps.value("addr").toString();
request.second = ps.value("message").toString();
friendRequests.push_back(request);
}
ps.endArray();
ps.endGroup();
ps.beginGroup("General");
compactLayout = ps.value("compactLayout", false).toBool();
compactLayout = ps.value("compactLayout", true).toBool();
ps.endGroup();
ps.beginGroup("Circles");
@ -336,8 +321,8 @@ void Settings::loadPersonnal(Profile* profile)
ps.endGroup();
ps.beginGroup("Privacy");
typingNotification = ps.value("typingNotification", false).toBool();
enableLogging = ps.value("enableLogging", false).toBool();
typingNotification = ps.value("typingNotification", true).toBool();
enableLogging = ps.value("enableLogging", true).toBool();
ps.endGroup();
}
@ -482,22 +467,7 @@ void Settings::savePersonal(QString profileName, QString password)
if (getEnableLogging())
ps.setValue("activity", frnd.activity);
++index;
}
ps.endArray();
ps.endGroup();
ps.beginGroup("Requests");
ps.setValue("unread", unreadFriendRequests);
ps.beginWriteArray("Request", friendRequests.size());
index = 0;
for (auto& request : friendRequests)
{
ps.setArrayIndex(index);
ps.setValue("addr", request.first);
ps.setValue("message", request.second);
++index;
index++;
}
ps.endArray();
ps.endGroup();
@ -1409,48 +1379,6 @@ void Settings::setCircleExpanded(int id, bool expanded)
circleLst[id].expanded = expanded;
}
void Settings::addFriendRequest(const QString &friendAddress, const QString &message)
{
QMutexLocker locker{&bigLock};
QPair<QString, QString> request(friendAddress, message);
if (friendRequests.indexOf(request) != -1)
return;
friendRequests.push_back(request);
++unreadFriendRequests;
}
unsigned int Settings::getUnreadFriendRequests() const
{
QMutexLocker locker{&bigLock};
return unreadFriendRequests;
}
QPair<QString, QString> Settings::getFriendRequest(int index) const
{
QMutexLocker locker{&bigLock};
return friendRequests.at(index);
}
int Settings::getFriendRequestSize() const
{
QMutexLocker locker{&bigLock};
return friendRequests.size();
}
void Settings::clearUnreadFriendRequests()
{
QMutexLocker locker{&bigLock};
unreadFriendRequests = 0;
}
void Settings::removeFriendRequest(int index)
{
QMutexLocker locker{&bigLock};
friendRequests.removeAt(index);
}
int Settings::removeCircle(int id)
{
// Replace index with last one and remove last one instead.

View File

@ -251,13 +251,6 @@ public:
bool getCircleExpanded(int id) const;
void setCircleExpanded(int id, bool expanded);
void addFriendRequest(const QString &friendAddress, const QString &message);
unsigned int getUnreadFriendRequests() const;
QPair<QString, QString> getFriendRequest(int index) const;
int getFriendRequestSize() const;
void clearUnreadFriendRequests();
void removeFriendRequest(int index);
// Assume all widgets have unique names
// Don't use it to save every single thing you want to save, use it
// for some general purpose widgets, such as MainWindows or Splitters,
@ -334,9 +327,6 @@ private:
bool autoSaveEnabled;
QString globalAutoAcceptDir;
QList<QPair<QString, QString>> friendRequests;
unsigned int unreadFriendRequests;
// GUI
QString smileyPack;
int emojiFontPointSize;

View File

@ -23,8 +23,6 @@
#include <QMessageBox>
#include <QErrorMessage>
#include <QClipboard>
#include <QTabWidget>
#include <QSignalMapper>
#include <tox/tox.h>
#include "ui_mainwindow.h"
#include "src/nexus.h"
@ -37,20 +35,12 @@
AddFriendForm::AddFriendForm()
{
tabWidget = new QTabWidget();
main = new QWidget(tabWidget), head = new QWidget();
main = new QWidget(), head = new QWidget();
QFont bold;
bold.setBold(true);
headLabel.setFont(bold);
tabWidget->addTab(main, QString());
QScrollArea* scrollArea = new QScrollArea(tabWidget);
QWidget* requestWidget = new QWidget(tabWidget);
scrollArea->setWidget(requestWidget);
scrollArea->setWidgetResizable(true);
requestsLayout = new QVBoxLayout(requestWidget);
requestsLayout->addStretch(1);
tabWidget->addTab(scrollArea, QString());
retranslateUi();
main->setLayout(&layout);
layout.addWidget(&toxIdLabel);
@ -62,35 +52,25 @@ AddFriendForm::AddFriendForm()
head->setLayout(&headLayout);
headLayout.addWidget(&headLabel);
connect(tabWidget, &QTabWidget::currentChanged, this, &AddFriendForm::onCurrentChanged);
connect(&toxId,&QLineEdit::returnPressed, this, &AddFriendForm::onSendTriggered);
connect(&sendButton, SIGNAL(clicked()), this, SLOT(onSendTriggered()));
connect(Nexus::getCore(), &Core::usernameSet, this, &AddFriendForm::onUsernameSet);
retranslateUi();
Translator::registerHandler(std::bind(&AddFriendForm::retranslateUi, this), this);
int size = Settings::getInstance().getFriendRequestSize();
for (int i = 0; i < size; ++i)
{
QPair<QString, QString> request = Settings::getInstance().getFriendRequest(i);
addFriendRequestWidget(request.first, request.second);
}
}
AddFriendForm::~AddFriendForm()
{
Translator::unregister(this);
head->deleteLater();
tabWidget->deleteLater();
main->deleteLater();
}
void AddFriendForm::show(Ui::MainWindow &ui)
{
ui.mainContent->layout()->addWidget(tabWidget);
ui.mainContent->layout()->addWidget(main);
ui.mainHead->layout()->addWidget(head);
tabWidget->show();
main->show();
head->show();
setIdFromClipboard();
toxId.setFocus();
@ -102,18 +82,6 @@ QString AddFriendForm::getMessage() const
return !msg.isEmpty() ? msg : message.placeholderText();
}
void AddFriendForm::setMode(Mode mode)
{
tabWidget->setCurrentIndex(mode);
}
void AddFriendForm::addFriendRequest(const QString &friendAddress, const QString &message)
{
addFriendRequestWidget(friendAddress, message);
Settings::getInstance().addFriendRequest(friendAddress, message);
onCurrentChanged(tabWidget->currentIndex());
}
void AddFriendForm::onUsernameSet(const QString& username)
{
lastUsername = username;
@ -173,37 +141,6 @@ void AddFriendForm::setIdFromClipboard()
}
}
void AddFriendForm::onFriendRequestAccepted()
{
QWidget* friendWidget = static_cast<QWidget*>(sender());
int index = requestsLayout->indexOf(friendWidget);
friendWidget->deleteLater();
requestsLayout->removeWidget(friendWidget);
emit friendRequestAccepted(Settings::getInstance().getFriendRequest(requestsLayout->count() - index - 1).first);
Settings::getInstance().removeFriendRequest(requestsLayout->count() - index - 1);
Settings::getInstance().savePersonal();
}
void AddFriendForm::onFriendRequestRejected()
{
QWidget* friendWidget = static_cast<QWidget*>(sender());
int index = requestsLayout->indexOf(friendWidget);
friendWidget->deleteLater();
requestsLayout->removeWidget(friendWidget);
Settings::getInstance().removeFriendRequest(requestsLayout->count() - index - 1);
Settings::getInstance().savePersonal();
}
void AddFriendForm::onCurrentChanged(int index)
{
if (index == FriendRequest && Settings::getInstance().getUnreadFriendRequests() != 0)
{
Settings::getInstance().clearUnreadFriendRequests();
Settings::getInstance().savePersonal();
emit friendRequestsSeen();
}
}
void AddFriendForm::retranslateUi()
{
headLabel.setText(tr("Add Friends"));
@ -213,54 +150,4 @@ void AddFriendForm::retranslateUi()
message.setPlaceholderText(tr("%1 here! Tox me maybe?",
"Default message in friend requests if the field is left blank. Write something appropriate!")
.arg(lastUsername));
tabWidget->setTabText(0, tr("Add a friend"));
tabWidget->setTabText(1, tr("Friend requests"));
for (QPushButton* acceptButton : acceptButtons)
retranslateAcceptButton(acceptButton);
for (QPushButton* rejectButton : rejectButtons)
retranslateRejectButton(rejectButton);
}
void AddFriendForm::addFriendRequestWidget(const QString &friendAddress, const QString &message)
{
QWidget* friendWidget = new QWidget(tabWidget);
QHBoxLayout* friendLayout = new QHBoxLayout(friendWidget);
QVBoxLayout* horLayout = new QVBoxLayout();
horLayout->setMargin(0);
friendLayout->addLayout(horLayout);
CroppingLabel* friendLabel = new CroppingLabel(friendWidget);
friendLabel->setText("<b>" + friendAddress + "</b>");
horLayout->addWidget(friendLabel);
QLabel* messageLabel = new QLabel(message);
messageLabel->setWordWrap(true);
horLayout->addWidget(messageLabel, 1);
QPushButton* acceptButton = new QPushButton(friendWidget);
acceptButtons.insert(acceptButton);
connect(acceptButton, &QPushButton::released, this, &AddFriendForm::onFriendRequestAccepted);
friendLayout->addWidget(acceptButton);
retranslateAcceptButton(acceptButton);
QPushButton* rejectButton = new QPushButton(friendWidget);
acceptButtons.insert(acceptButton);
connect(acceptButton, &QPushButton::released, this, &AddFriendForm::onFriendRequestAccepted);
friendLayout->addWidget(rejectButton);
retranslateRejectButton(rejectButton);
requestsLayout->insertWidget(0, friendWidget);
}
void AddFriendForm::retranslateAcceptButton(QPushButton *acceptButton)
{
acceptButton->setText(tr("Accept"));
}
void AddFriendForm::retranslateRejectButton(QPushButton *rejectButton)
{
rejectButton->setText(tr("Reject"));
}

View File

@ -25,9 +25,6 @@
#include <QLineEdit>
#include <QTextEdit>
#include <QPushButton>
#include <QSet>
class QTabWidget;
namespace Ui {class MainWindow;}
@ -35,13 +32,6 @@ class AddFriendForm : public QObject
{
Q_OBJECT
public:
enum Mode
{
AddFriend = 0,
FriendRequest = 1,
GroupInvite = 2
};
AddFriendForm();
AddFriendForm(const AddFriendForm&) = delete;
AddFriendForm& operator=(const AddFriendForm&) = delete;
@ -49,29 +39,18 @@ public:
void show(Ui::MainWindow &ui);
QString getMessage() const;
void setMode(Mode mode);
void addFriendRequest(const QString& friendAddress, const QString& message);
signals:
void friendRequested(const QString& friendAddress, const QString& message);
void friendRequestAccepted(const QString& friendAddress);
void friendRequestsSeen();
public slots:
void onUsernameSet(const QString& userName);
private slots:
void onSendTriggered();
void onFriendRequestAccepted();
void onFriendRequestRejected();
void onCurrentChanged(int index);
private:
void retranslateUi();
void addFriendRequestWidget(const QString& friendAddress, const QString& message);
void retranslateAcceptButton(QPushButton* acceptButton);
void retranslateRejectButton(QPushButton* rejectButton);
private:
void setIdFromClipboard();
@ -82,10 +61,6 @@ private:
QVBoxLayout layout, headLayout;
QWidget *head, *main;
QString lastUsername; // Cached username so we can retranslate the invite message
QTabWidget* tabWidget;
QVBoxLayout* requestsLayout;
QSet<QPushButton*> acceptButtons;
QSet<QPushButton*> rejectButtons;
};
#endif // ADDFRIENDFORM_H

View File

@ -1,155 +0,0 @@
/*
Copyright © 2015 by The qTox Project
This file is part of qTox, a Qt-based graphical interface for Tox.
qTox is libre software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
qTox is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with qTox. If not, see <http://www.gnu.org/licenses/>.
*/
#include "groupinviteform.h"
#include <tox/tox.h>
#include <QSignalMapper>
#include <QPushButton>
#include <QBoxLayout>
#include <QGroupBox>
#include <QDateTime>
#include <QLabel>
#include "ui_mainwindow.h"
#include "src/widget/tool/croppinglabel.h"
#include "src/widget/translator.h"
#include "src/nexus.h"
#include "src/core/core.h"
GroupInviteForm::GroupInviteForm()
{
QVBoxLayout* layout = new QVBoxLayout(this);
createButton = new QPushButton(this);
connect(createButton, &QPushButton::released, [this]()
{
emit groupCreate(TOX_GROUPCHAT_TYPE_AV);
});
inviteBox = new QGroupBox(this);
inviteLayout = new QVBoxLayout(inviteBox);
inviteLayout->addStretch(1);
layout->addWidget(createButton);
layout->addWidget(inviteBox);
QFont bold;
bold.setBold(true);
headLabel = new QLabel(this);
headLabel->setFont(bold);
headWidget = new QWidget(this);
QHBoxLayout* headLayout = new QHBoxLayout(headWidget);
headLayout->addWidget(headLabel);
retranslateUi();
Translator::registerHandler(std::bind(&GroupInviteForm::retranslateUi, this), this);
}
void GroupInviteForm::show(Ui::MainWindow &ui)
{
ui.mainContent->layout()->addWidget(this);
ui.mainHead->layout()->addWidget(headWidget);
QWidget::show();
headWidget->show();
}
void GroupInviteForm::addGroupInvite(int32_t friendId, uint8_t type, QByteArray invite)
{
QWidget* groupWidget = new QWidget(this);
QHBoxLayout* groupLayout = new QHBoxLayout(groupWidget);
CroppingLabel* groupLabel = new CroppingLabel(this);
groupLabel->setText(tr("Invited by <b>%1</b> on %2.").arg(Nexus::getCore()->getFriendUsername(friendId), QDateTime::currentDateTime().toString()));
groupLayout->addWidget(groupLabel);
QPushButton* acceptButton = new QPushButton(this);
acceptButtons.insert(acceptButton);
connect(acceptButton, &QPushButton::released, this, &GroupInviteForm::onGroupInviteAccepted);
groupLayout->addWidget(acceptButton);
retranslateAcceptButton(acceptButton);
QPushButton* rejectButton = new QPushButton(this);
rejectButtons.insert(rejectButton);
connect(rejectButton, &QPushButton::released, this, &GroupInviteForm::onGroupInviteRejected);
groupLayout->addWidget(rejectButton);
retranslateRejectButton(rejectButton);
inviteLayout->insertWidget(0, groupWidget);
GroupInvite group;
group.friendId = friendId;
group.type = type;
group.invite = invite;
groupInvites.push_front(group);
if (isVisible())
emit groupInvitesSeen();
}
void GroupInviteForm::showEvent(QShowEvent* event)
{
QWidget::showEvent(event);
emit groupInvitesSeen();
}
void GroupInviteForm::onGroupInviteAccepted()
{
QWidget* groupWidget = static_cast<QWidget*>(sender());
int index = inviteLayout->indexOf(groupWidget);
GroupInvite invite = groupInvites.at(index);
groupInvites.removeAt(index);
groupWidget->deleteLater();
inviteLayout->removeWidget(groupWidget);
emit groupInviteAccepted(invite.friendId, invite.type, invite.invite);
}
void GroupInviteForm::onGroupInviteRejected()
{
QWidget* groupWidget = static_cast<QWidget*>(sender());
int index = inviteLayout->indexOf(groupWidget);
groupInvites.removeAt(index);
groupWidget->deleteLater();
inviteLayout->removeWidget(groupWidget);
}
void GroupInviteForm::retranslateUi()
{
headLabel->setText(tr("Groups"));
createButton->setText(tr("Create new group"));
inviteBox->setTitle(tr("Group invites"));
for (QPushButton* acceptButton : acceptButtons)
retranslateAcceptButton(acceptButton);
for (QPushButton* rejectButton : rejectButtons)
retranslateRejectButton(rejectButton);
}
void GroupInviteForm::retranslateAcceptButton(QPushButton *acceptButton)
{
acceptButton->setText(tr("Join"));
}
void GroupInviteForm::retranslateRejectButton(QPushButton *rejectButton)
{
rejectButton->setText(tr("Decline"));
}

View File

@ -1,78 +0,0 @@
/*
Copyright © 2015 by The qTox Project
This file is part of qTox, a Qt-based graphical interface for Tox.
qTox is libre software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
qTox is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with qTox. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GROUPINVITEFORM_H
#define GROUPINVITEFORM_H
#include <QWidget>
#include <QSet>
class QLabel;
class QVBoxLayout;
class QPushButton;
class QGroupBox;
class QSignalMapper;
namespace Ui {class MainWindow;}
class GroupInviteForm : public QWidget
{
Q_OBJECT
public:
GroupInviteForm();
void show(Ui::MainWindow &ui);
void addGroupInvite(int32_t friendId, uint8_t type, QByteArray invite);
signals:
void groupCreate(uint8_t type);
void groupInviteAccepted(int32_t friendId, uint8_t type, QByteArray invite);
void groupInvitesSeen();
protected:
void showEvent(QShowEvent* event) final override;
private slots:
void onGroupInviteAccepted();
void onGroupInviteRejected();
private:
void retranslateUi();
void retranslateAcceptButton(QPushButton* acceptButton);
void retranslateRejectButton(QPushButton* rejectButton);
private:
struct GroupInvite
{
int32_t friendId;
uint8_t type;
QByteArray invite;
};
QWidget* headWidget;
QLabel* headLabel;
QPushButton* createButton;
QGroupBox* inviteBox;
QVBoxLayout* inviteLayout;
QSet<QPushButton*> acceptButtons;
QSet<QPushButton*> rejectButtons;
QList<GroupInvite> groupInvites;
};
#endif // GROUPINVITEFORM_H

View File

@ -68,16 +68,17 @@ void FriendWidget::contextMenuEvent(QContextMenuEvent * event)
QString dir = Settings::getInstance().getAutoAcceptDir(id);
QMenu menu;
QMenu* inviteMenu = menu.addMenu(tr("Invite to group","Menu to invite a friend to a groupchat"));
QAction* newGroupAction = inviteMenu->addAction(tr("To new group"));
inviteMenu->addSeparator();
QMap<QAction*, Group*> groupActions;
for (Group* group : GroupList::getAllGroups())
{
QAction* groupAction = inviteMenu->addAction(tr("Invite to group '%1'").arg(group->getGroupWidget()->getName()));
QAction* groupAction = inviteMenu->addAction(group->getGroupWidget()->getName());
groupActions[groupAction] = group;
}
if (groupActions.isEmpty())
inviteMenu->setEnabled(false);
int circleId = Settings::getInstance().getFriendCircleID(FriendList::findFriend(friendId)->getToxId());
CircleWidget *circleWidget = CircleWidget::getFromID(circleId);
@ -173,11 +174,6 @@ void FriendWidget::contextMenuEvent(QContextMenuEvent * event)
Settings::getInstance().setAutoAcceptDir(id, dir);
}
}
else if (selectedItem == newGroupAction)
{
int groupId = Core::getInstance()->createGroup();
Core::getInstance()->groupInviteFriend(friendId, groupId);
}
else if (selectedItem == newCircleAction)
{
if (circleWidget != nullptr)

View File

@ -152,14 +152,14 @@ void ScreenshotGrabber::setupScene(QGraphicsScene* scene)
void ScreenshotGrabber::useNothingSelectedTooltip()
{
helperTooltip->setHtml(tr("Click and drag to select a region.<br>Press <b>Space</b> to hide/show qTox window.<br>Press <b>Escape</b> to cancel.",
helperTooltip->setHtml(tr("Click and drag to select a region. Press <b>Space</b> to hide/show qTox window, or <b>Escape</b> to cancel.",
"Help text shown when no region has been selected yet"));
adjustTooltipPosition();
}
void ScreenshotGrabber::useRegionSelectedTooltip()
{
helperTooltip->setHtml(tr("Press <b>Enter</b> to send a screenshot of the selected region or select a new region.<br>Press <b>Space</b> to hide/show qTox window and repeat region selection.<br> Press <b>Escape</b> to cancel.",
helperTooltip->setHtml(tr("Press <b>Enter</b> to send a screenshot of the selection, <b>Space</b> to hide/show qTox window, or <b>Escape</b> to cancel.",
"Help text shown when a region has been selected"));
adjustTooltipPosition();
}

View File

@ -44,7 +44,6 @@
#include "src/persistence/offlinemsgengine.h"
#include "src/widget/translator.h"
#include "src/widget/form/addfriendform.h"
#include "src/widget/form/groupinviteform.h"
#include "src/widget/form/filesform.h"
#include "src/widget/form/profileform.h"
#include "src/widget/form/settingswidget.h"
@ -226,7 +225,6 @@ void Widget::init()
filesForm = new FilesForm();
addFriendForm = new AddFriendForm;
groupInviteForm = new GroupInviteForm;
profileForm = new ProfileForm();
settingsWidget = new SettingsWidget();
@ -244,7 +242,6 @@ void Widget::init()
connect(ui->statusLabel, &CroppingLabel::editFinished, this, &Widget::onStatusMessageChanged);
connect(ui->mainSplitter, &QSplitter::splitterMoved, this, &Widget::onSplitterMoved);
connect(addFriendForm, &AddFriendForm::friendRequested, this, &Widget::friendRequested);
connect(groupInviteForm, &GroupInviteForm::groupCreate, Core::getInstance(), &Core::createGroup);
connect(timer, &QTimer::timeout, this, &Widget::onUserAwayCheck);
connect(timer, &QTimer::timeout, this, &Widget::onEventIconTick);
connect(timer, &QTimer::timeout, this, &Widget::onTryCreateTrayIcon);
@ -337,7 +334,6 @@ void Widget::init()
addFriendForm->show(*ui);
setWindowTitle(tr("Add friend"));
ui->addButton->setCheckable(true);
ui->groupButton->setCheckable(true);
ui->transferButton->setCheckable(true);
ui->settingsButton->setCheckable(true);
setActiveToolMenuButton(Widget::AddButton);
@ -349,15 +345,6 @@ void Widget::init()
AutoUpdater::checkUpdatesAsyncInteractive();
#endif
friendRequestsButton = nullptr;
groupInvitesButton = nullptr;
unreadGroupInvites = 0;
connect(addFriendForm, &AddFriendForm::friendRequestsSeen, this, &Widget::friendRequestsUpdate);
connect(addFriendForm, &AddFriendForm::friendRequestAccepted, this, &Widget::friendRequestAccepted);
connect(groupInviteForm, &GroupInviteForm::groupInvitesSeen, this, &Widget::groupInvitesClear);
connect(groupInviteForm, &GroupInviteForm::groupInviteAccepted, this, &Widget::onGroupInviteAccepted);
retranslateUi();
Translator::registerHandler(std::bind(&Widget::retranslateUi, this), this);
@ -422,7 +409,6 @@ Widget::~Widget()
delete profileForm;
delete settingsWidget;
delete addFriendForm;
delete groupInviteForm;
delete filesForm;
delete timer;
delete offlineMsgTimer;
@ -549,7 +535,6 @@ void Widget::forceShow()
void Widget::onAddClicked()
{
hideMainForms();
addFriendForm->setMode(AddFriendForm::AddFriend);
addFriendForm->show(*ui);
setWindowTitle(tr("Add friend"));
setActiveToolMenuButton(Widget::AddButton);
@ -558,11 +543,7 @@ void Widget::onAddClicked()
void Widget::onGroupClicked()
{
hideMainForms();
groupInviteForm->show(*ui);
setWindowTitle(tr("Group invites"));
setActiveToolMenuButton(Widget::GroupButton);
activeChatroomWidget = nullptr;
Nexus::getCore()->createGroup();
}
void Widget::onTransferClicked()
@ -992,9 +973,10 @@ void Widget::playRingtone()
void Widget::onFriendRequestReceived(const QString& userId, const QString& message)
{
QApplication::alert(this);
eventFlag = true;
friendRequestRecieved(userId, message);
FriendRequestDialog dialog(this, userId, message);
if (dialog.exec() == QDialog::Accepted)
emit friendRequestAccepted(userId);
}
void Widget::updateFriendActivity(Friend *frnd)
@ -1074,9 +1056,15 @@ void Widget::onGroupInviteReceived(int32_t friendId, uint8_t type, QByteArray in
{
if (type == TOX_GROUPCHAT_TYPE_TEXT || type == TOX_GROUPCHAT_TYPE_AV)
{
++unreadGroupInvites;
groupInvitesUpdate();
groupInviteForm->addGroupInvite(friendId, type, invite);
if (GUI::askQuestion(tr("Group invite", "popup title"), tr("%1 has invited you to a groupchat. Would you like to join?", "popup text").arg(Nexus::getCore()->getFriendUsername(friendId)), true, false))
{
int groupId = Nexus::getCore()->joinGroupchat(friendId, type, (uint8_t*)invite.data(), invite.length());
if (groupId < 0)
{
qWarning() << "onGroupInviteReceived: Unable to accept group invite";
return;
}
}
}
else
{
@ -1085,16 +1073,6 @@ void Widget::onGroupInviteReceived(int32_t friendId, uint8_t type, QByteArray in
}
}
void Widget::onGroupInviteAccepted(int32_t friendId, uint8_t type, QByteArray invite)
{
int groupId = Nexus::getCore()->joinGroupchat(friendId, type, (uint8_t*)invite.data(), invite.length());
if (groupId < 0)
{
qWarning() << "onGroupInviteAccepted: Unable to accept group invite";
return;
}
}
void Widget::onGroupMessageReceived(int groupnumber, int peernumber, const QString& message, bool isAction)
{
Group* g = GroupList::findGroup(groupnumber);
@ -1685,71 +1663,11 @@ bool Widget::groupsVisible() const
void Widget::friendListContextMenu(const QPoint &pos)
{
QMenu menu(this);
QAction *createGroupAction = menu.addAction(tr("Create new group..."));
QAction *addCircleAction = menu.addAction(tr("Add new circle..."));
QAction *chosenAction = menu.exec(ui->friendList->mapToGlobal(pos));
if (chosenAction == addCircleAction)
contactListWidget->addCircleWidget();
else if (chosenAction == createGroupAction)
Nexus::getCore()->createGroup();
}
void Widget::friendRequestRecieved(const QString& friendAddress, const QString& message)
{
addFriendForm->addFriendRequest(friendAddress, message);
friendRequestsUpdate();
}
void Widget::friendRequestsUpdate()
{
unsigned int unreadFriendRequests = Settings::getInstance().getUnreadFriendRequests();
if (unreadFriendRequests == 0)
{
delete friendRequestsButton;
friendRequestsButton = nullptr;
}
else if (!friendRequestsButton)
{
friendRequestsButton = new QPushButton(this);
friendRequestsButton->setObjectName("green");
ui->statusLayout->insertWidget(2, friendRequestsButton);
connect(friendRequestsButton, &QPushButton::released, [this]()
{
onGroupClicked();
});
}
if (friendRequestsButton)
friendRequestsButton->setText(tr("%n New Friend Request(s)", "", unreadFriendRequests));
}
void Widget::groupInvitesUpdate()
{
if (unreadGroupInvites == 0)
{
delete groupInvitesButton;
groupInvitesButton = nullptr;
}
else if (!groupInvitesButton)
{
groupInvitesButton = new QPushButton(this);
groupInvitesButton->setObjectName("green");
ui->statusLayout->insertWidget(2, groupInvitesButton);
connect(groupInvitesButton, &QPushButton::released, this, &Widget::onGroupClicked);
}
if (groupInvitesButton)
groupInvitesButton->setText(tr("%n New Group Invite(s)", "", unreadGroupInvites));
}
void Widget::groupInvitesClear()
{
unreadGroupInvites = 0;
groupInvitesUpdate();
}
void Widget::setActiveToolMenuButton(ActiveToolMenuButton newActiveButton)
@ -1786,9 +1704,6 @@ void Widget::retranslateUi()
statusAway->setText(tr("Away", "Button to set your status to 'Away'"));
statusBusy->setText(tr("Busy", "Button to set your status to 'Busy'"));
setWindowTitle(tr("Settings"));
friendRequestsUpdate();
groupInvitesUpdate();
}
#ifdef Q_OS_MAC

View File

@ -49,10 +49,8 @@ class FilesForm;
class ProfileForm;
class SettingsWidget;
class AddFriendForm;
class GroupInviteForm;
class CircleWidget;
class QActionGroup;
class QPushButton;
class Widget final : public QMainWindow
{
@ -113,7 +111,6 @@ public slots:
void onReceiptRecieved(int friendId, int receipt);
void onEmptyGroupCreated(int groupId);
void onGroupInviteReceived(int32_t friendId, uint8_t type, QByteArray invite);
void onGroupInviteAccepted(int32_t friendId, uint8_t type, QByteArray invite);
void onGroupMessageReceived(int groupnumber, int peernumber, const QString& message, bool isAction);
void onGroupNamelistChanged(int groupnumber, int peernumber, uint8_t change);
void onGroupTitleChanged(int groupnumber, const QString& author, const QString& title);
@ -162,10 +159,6 @@ private slots:
void onSplitterMoved(int pos, int index);
void processOfflineMsgs();
void friendListContextMenu(const QPoint &pos);
void friendRequestRecieved(const QString& friendAddress, const QString& message);
void friendRequestsUpdate();
void groupInvitesUpdate();
void groupInvitesClear();
#ifdef Q_OS_MAC
void bringAllToFront();
@ -233,7 +226,6 @@ private:
QSplitter *centralLayout;
QPoint dragPosition;
AddFriendForm *addFriendForm;
GroupInviteForm* groupInviteForm;
ProfileForm *profileForm;
SettingsWidget *settingsWidget;
FilesForm *filesForm;
@ -249,9 +241,6 @@ private:
bool eventFlag;
bool eventIcon;
bool wasMaximized = false;
QPushButton* friendRequestsButton;
QPushButton* groupInvitesButton;
unsigned int unreadGroupInvites;
#ifdef Q_OS_MAC
QAction* fullscreenAction;

View File

@ -25,26 +25,6 @@ QToolButton::menu-indicator {
image: none
}
QPushButton#green {
background: none;
background-color: #6bc260;
color: white;
border-style: none;
border-radius: 4px;
padding: 4px;
margin: 4px 8px;
}
QPushButton#green:hover
{
background-color: #79c76f;
}
QPushButton#green:pressed
{
background-color: #51b244;
}
/**
Uncomment this after https://github.com/tux3/qTox/pull/1640
is merged!
@ -116,4 +96,3 @@ QListView {
position: relative;
bottom: 2px;
}