forked from blue/squawk
Better way to store expanded elements in roster, several clean ups, translations
This commit is contained in:
parent
7e9eed2075
commit
d162494ec8
@ -3,9 +3,12 @@
|
|||||||
## Squawk 0.2.3 (UNRELEASED)
|
## Squawk 0.2.3 (UNRELEASED)
|
||||||
### Bug fixes
|
### Bug fixes
|
||||||
- "Add contact" and "Join conference" menu are enabled once again (pavavno)!
|
- "Add contact" and "Join conference" menu are enabled once again (pavavno)!
|
||||||
|
- availability is now read from the same section of config file it was stored
|
||||||
|
|
||||||
### Improvements
|
### Improvements
|
||||||
- deactivated accounts now don't appear in combobox of "Add contact" and "Join conference" dialogues
|
- deactivated accounts now don't appear in combobox of "Add contact" and "Join conference" dialogues
|
||||||
|
- all of the expandable roster items now get saved between launches
|
||||||
|
- settings file on the disk is not rewritten every roster element expansion or collapse
|
||||||
|
|
||||||
### New features
|
### New features
|
||||||
- Now you can enable tray icon from settings!
|
- Now you can enable tray icon from settings!
|
||||||
|
@ -30,16 +30,18 @@ Application::Application(Core::Squawk* p_core):
|
|||||||
storage(),
|
storage(),
|
||||||
trayIcon(nullptr),
|
trayIcon(nullptr),
|
||||||
actionQuit(Shared::icon("application-exit"), tr("Quit")),
|
actionQuit(Shared::icon("application-exit"), tr("Quit")),
|
||||||
actionToggle(tr("Minimize to tray"))
|
actionToggle(QApplication::windowIcon(), tr("Minimize to tray")),
|
||||||
|
expandedPaths()
|
||||||
{
|
{
|
||||||
connect(&actionQuit, &QAction::triggered, this, &Application::quit);
|
connect(&actionQuit, &QAction::triggered, this, &Application::quit);
|
||||||
connect(&actionToggle, &QAction::triggered, this, &Application::toggleSquawk);
|
connect(&actionToggle, &QAction::triggered, this, &Application::toggleSquawk);
|
||||||
|
|
||||||
connect(&roster, &Models::Roster::unnoticedMessage, this, &Application::notify);
|
connect(&roster, &Models::Roster::unnoticedMessage, this, &Application::notify);
|
||||||
connect(&roster, &Models::Roster::unreadMessagesCountChanged, this, &Application::unreadMessagesCountChanged);
|
connect(&roster, &Models::Roster::unreadMessagesCountChanged, this, &Application::unreadMessagesCountChanged);
|
||||||
|
connect(&roster, &Models::Roster::addedElement, this, &Application::onAddedElement);
|
||||||
|
|
||||||
|
|
||||||
//connecting myself to the backed
|
//connecting myself to the backend
|
||||||
connect(this, &Application::changeState, core, &Core::Squawk::changeState);
|
connect(this, &Application::changeState, core, &Core::Squawk::changeState);
|
||||||
connect(this, &Application::setRoomJoined, core, &Core::Squawk::setRoomJoined);
|
connect(this, &Application::setRoomJoined, core, &Core::Squawk::setRoomJoined);
|
||||||
connect(this, &Application::setRoomAutoJoin, core, &Core::Squawk::setRoomAutoJoin);
|
connect(this, &Application::setRoomAutoJoin, core, &Core::Squawk::setRoomAutoJoin);
|
||||||
@ -70,7 +72,7 @@ Application::Application(Core::Squawk* p_core):
|
|||||||
connect(core, &Core::Squawk::changeAccount, this, &Application::changeAccount);
|
connect(core, &Core::Squawk::changeAccount, this, &Application::changeAccount);
|
||||||
connect(core, &Core::Squawk::removeAccount, this, &Application::removeAccount);
|
connect(core, &Core::Squawk::removeAccount, this, &Application::removeAccount);
|
||||||
|
|
||||||
connect(core, &Core::Squawk::addContact, this, &Application::addContact);
|
connect(core, &Core::Squawk::addContact, &roster, &Models::Roster::addContact);
|
||||||
connect(core, &Core::Squawk::addGroup, this, &Application::addGroup);
|
connect(core, &Core::Squawk::addGroup, this, &Application::addGroup);
|
||||||
connect(core, &Core::Squawk::removeGroup, &roster, &Models::Roster::removeGroup);
|
connect(core, &Core::Squawk::removeGroup, &roster, &Models::Roster::removeGroup);
|
||||||
connect(core, qOverload<const QString&, const QString&>(&Core::Squawk::removeContact),
|
connect(core, qOverload<const QString&, const QString&>(&Core::Squawk::removeContact),
|
||||||
@ -168,6 +170,8 @@ void Application::createMainWindow()
|
|||||||
connect(squawk, &Squawk::openConversation, this, &Application::openConversation);
|
connect(squawk, &Squawk::openConversation, this, &Application::openConversation);
|
||||||
connect(squawk, &Squawk::changeState, this, &Application::setState);
|
connect(squawk, &Squawk::changeState, this, &Application::setState);
|
||||||
connect(squawk, &Squawk::changeTray, this, &Application::onChangeTray);
|
connect(squawk, &Squawk::changeTray, this, &Application::onChangeTray);
|
||||||
|
connect(squawk, &Squawk::itemExpanded, this, &Application::onItemExpanded);
|
||||||
|
connect(squawk, &Squawk::itemCollapsed, this, &Application::onItemCollapsed);
|
||||||
connect(squawk, &Squawk::quit, this, &Application::quit);
|
connect(squawk, &Squawk::quit, this, &Application::quit);
|
||||||
connect(squawk, &Squawk::closing, this, &Application::onSquawkClosing);
|
connect(squawk, &Squawk::closing, this, &Application::onSquawkClosing);
|
||||||
|
|
||||||
@ -192,7 +196,19 @@ void Application::createMainWindow()
|
|||||||
|
|
||||||
dialogueQueue.setParentWidnow(squawk);
|
dialogueQueue.setParentWidnow(squawk);
|
||||||
squawk->stateChanged(availability);
|
squawk->stateChanged(availability);
|
||||||
|
squawk->raise();
|
||||||
squawk->show();
|
squawk->show();
|
||||||
|
squawk->activateWindow();
|
||||||
|
|
||||||
|
for (const std::list<QString>& entry : expandedPaths) {
|
||||||
|
QModelIndex ind = roster.getIndexByPath(entry);
|
||||||
|
if (ind.isValid()) {
|
||||||
|
squawk->expand(ind);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(squawk, &Squawk::itemExpanded, this, &Application::onItemExpanded);
|
||||||
|
connect(squawk, &Squawk::itemCollapsed, this, &Application::onItemCollapsed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,6 +308,32 @@ void Application::toggleSquawk()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Application::onItemCollapsed(const QModelIndex& index)
|
||||||
|
{
|
||||||
|
std::list<QString> address = roster.getItemPath(index);
|
||||||
|
if (address.size() > 0) {
|
||||||
|
expandedPaths.erase(address);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::onItemExpanded(const QModelIndex& index)
|
||||||
|
{
|
||||||
|
std::list<QString> address = roster.getItemPath(index);
|
||||||
|
if (address.size() > 0) {
|
||||||
|
expandedPaths.insert(address);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::onAddedElement(const std::list<QString>& path)
|
||||||
|
{
|
||||||
|
if (squawk != nullptr && expandedPaths.count(path) > 0) {
|
||||||
|
QModelIndex index = roster.getIndexByPath(path);
|
||||||
|
if (index.isValid()) {
|
||||||
|
squawk->expand(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Application::notify(const QString& account, const Shared::Message& msg)
|
void Application::notify(const QString& account, const Shared::Message& msg)
|
||||||
{
|
{
|
||||||
QString jid = msg.getPenPalJid();
|
QString jid = msg.getPenPalJid();
|
||||||
@ -427,6 +469,18 @@ void Application::readSettings()
|
|||||||
} else {
|
} else {
|
||||||
avail = static_cast<int>(Shared::Availability::online);
|
avail = static_cast<int>(Shared::Availability::online);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
settings.beginGroup("roster");
|
||||||
|
QStringList entries = settings.allKeys();
|
||||||
|
for (const QString& entry : entries) {
|
||||||
|
QStringList p = entry.split("/");
|
||||||
|
if (p.last() == "expanded" && settings.value(entry, false).toBool()) {
|
||||||
|
p.pop_back();
|
||||||
|
expandedPaths.emplace(p.begin(), p.end());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.endGroup();
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
setState(Shared::Global::fromInt<Shared::Availability>(avail));
|
setState(Shared::Global::fromInt<Shared::Availability>(avail));
|
||||||
@ -440,7 +494,22 @@ void Application::readSettings()
|
|||||||
void Application::writeSettings()
|
void Application::writeSettings()
|
||||||
{
|
{
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
|
settings.beginGroup("ui");
|
||||||
settings.setValue("availability", static_cast<int>(availability));
|
settings.setValue("availability", static_cast<int>(availability));
|
||||||
|
|
||||||
|
settings.remove("roster");
|
||||||
|
settings.beginGroup("roster");
|
||||||
|
for (const std::list<QString>& address : expandedPaths) {
|
||||||
|
QString path = "";
|
||||||
|
for (const QString& hop : address) {
|
||||||
|
path += hop + "/";
|
||||||
|
}
|
||||||
|
path += "expanded";
|
||||||
|
settings.setValue(path, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.endGroup();
|
||||||
|
settings.endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::requestPassword(const QString& account, bool authenticationError) {
|
void Application::requestPassword(const QString& account, bool authenticationError) {
|
||||||
@ -611,25 +680,6 @@ void Application::changeAccount(const QString& account, const QMap<QString, QVar
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::addContact(const QString& account, const QString& jid, const QString& group, const QMap<QString, QVariant>& data)
|
|
||||||
{
|
|
||||||
roster.addContact(account, jid, group, data);
|
|
||||||
|
|
||||||
if (squawk != nullptr) {
|
|
||||||
QSettings settings;
|
|
||||||
settings.beginGroup("ui");
|
|
||||||
settings.beginGroup("roster");
|
|
||||||
settings.beginGroup(account);
|
|
||||||
if (settings.value("expanded", false).toBool()) {
|
|
||||||
QModelIndex ind = roster.getAccountIndex(account);
|
|
||||||
squawk->expand(ind);
|
|
||||||
}
|
|
||||||
settings.endGroup();
|
|
||||||
settings.endGroup();
|
|
||||||
settings.endGroup();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Application::addGroup(const QString& account, const QString& name)
|
void Application::addGroup(const QString& account, const QString& name)
|
||||||
{
|
{
|
||||||
roster.addGroup(account, name);
|
roster.addGroup(account, name);
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
#define APPLICATION_H
|
#define APPLICATION_H
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <list>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QDBusInterface>
|
#include <QDBusInterface>
|
||||||
@ -76,7 +78,6 @@ protected slots:
|
|||||||
void openConversation(const Models::Roster::ElId& id, const QString& resource = "");
|
void openConversation(const Models::Roster::ElId& id, const QString& resource = "");
|
||||||
|
|
||||||
void addGroup(const QString& account, const QString& name);
|
void addGroup(const QString& account, const QString& name);
|
||||||
void addContact(const QString& account, const QString& jid, const QString& group, const QMap<QString, QVariant>& data);
|
|
||||||
|
|
||||||
void requestPassword(const QString& account, bool authenticationError);
|
void requestPassword(const QString& account, bool authenticationError);
|
||||||
|
|
||||||
@ -97,6 +98,9 @@ private slots:
|
|||||||
void onChangeTray(bool enabled, bool hide);
|
void onChangeTray(bool enabled, bool hide);
|
||||||
void trayClicked(QSystemTrayIcon::ActivationReason reason);
|
void trayClicked(QSystemTrayIcon::ActivationReason reason);
|
||||||
void toggleSquawk();
|
void toggleSquawk();
|
||||||
|
void onItemExpanded(const QModelIndex& index);
|
||||||
|
void onItemCollapsed(const QModelIndex& index);
|
||||||
|
void onAddedElement(const std::list<QString>& path);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void createMainWindow();
|
void createMainWindow();
|
||||||
@ -122,6 +126,7 @@ private:
|
|||||||
QSystemTrayIcon* trayIcon;
|
QSystemTrayIcon* trayIcon;
|
||||||
QAction actionQuit;
|
QAction actionQuit;
|
||||||
QAction actionToggle;
|
QAction actionToggle;
|
||||||
|
std::set<std::list<QString>> expandedPaths;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // APPLICATION_H
|
#endif // APPLICATION_H
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -75,6 +75,11 @@ void Models::Element::update(const QString& field, const QVariant& value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString Models::Element::getId() const
|
||||||
|
{
|
||||||
|
return jid;
|
||||||
|
}
|
||||||
|
|
||||||
QString Models::Element::getAvatarPath() const
|
QString Models::Element::getAvatarPath() const
|
||||||
{
|
{
|
||||||
return avatarPath;
|
return avatarPath;
|
||||||
|
@ -38,6 +38,7 @@ public:
|
|||||||
QString getAvatarPath() const;
|
QString getAvatarPath() const;
|
||||||
|
|
||||||
virtual void update(const QString& field, const QVariant& value);
|
virtual void update(const QString& field, const QVariant& value);
|
||||||
|
virtual QString getId() const override;
|
||||||
|
|
||||||
void addMessage(const Shared::Message& data);
|
void addMessage(const Shared::Message& data);
|
||||||
void changeMessage(const QString& id, const QMap<QString, QVariant>& data);
|
void changeMessage(const QString& id, const QMap<QString, QVariant>& data);
|
||||||
|
@ -181,6 +181,11 @@ QString Models::Item::getName() const
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString Models::Item::getId() const
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
QVariant Models::Item::data(int column) const
|
QVariant Models::Item::data(int column) const
|
||||||
{
|
{
|
||||||
if (column != 0) {
|
if (column != 0) {
|
||||||
|
@ -65,6 +65,7 @@ class Item : public QObject{
|
|||||||
virtual void appendChild(Item *child);
|
virtual void appendChild(Item *child);
|
||||||
virtual void removeChild(int index);
|
virtual void removeChild(int index);
|
||||||
virtual QString getDisplayedName() const;
|
virtual QString getDisplayedName() const;
|
||||||
|
virtual QString getId() const;
|
||||||
QString getName() const;
|
QString getName() const;
|
||||||
void setName(const QString& name);
|
void setName(const QString& name);
|
||||||
|
|
||||||
|
@ -75,6 +75,11 @@ QString Models::Reference::getDisplayedName() const
|
|||||||
return original->getDisplayedName();
|
return original->getDisplayedName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString Models::Reference::getId() const
|
||||||
|
{
|
||||||
|
return original->getId();
|
||||||
|
}
|
||||||
|
|
||||||
Models::Item * Models::Reference::dereference()
|
Models::Item * Models::Reference::dereference()
|
||||||
{
|
{
|
||||||
return original;
|
return original;
|
||||||
|
@ -38,6 +38,8 @@ public:
|
|||||||
QString getDisplayedName() const override;
|
QString getDisplayedName() const override;
|
||||||
void appendChild(Models::Item * child) override;
|
void appendChild(Models::Item * child) override;
|
||||||
void removeChild(int index) override;
|
void removeChild(int index) override;
|
||||||
|
QString getId() const override;
|
||||||
|
|
||||||
Item* dereference();
|
Item* dereference();
|
||||||
const Item* dereferenceConst() const;
|
const Item* dereferenceConst() const;
|
||||||
|
|
||||||
|
@ -76,7 +76,6 @@ private:
|
|||||||
private:
|
private:
|
||||||
bool autoJoin;
|
bool autoJoin;
|
||||||
bool joined;
|
bool joined;
|
||||||
QString jid;
|
|
||||||
QString nick;
|
QString nick;
|
||||||
QString subject;
|
QString subject;
|
||||||
std::map<QString, Participant*> participants;
|
std::map<QString, Participant*> participants;
|
||||||
|
@ -52,6 +52,8 @@ void Models::Roster::addAccount(const QMap<QString, QVariant>& data)
|
|||||||
root->appendChild(acc);
|
root->appendChild(acc);
|
||||||
accounts.insert(std::make_pair(acc->getName(), acc));
|
accounts.insert(std::make_pair(acc->getName(), acc));
|
||||||
accountsModel->addAccount(acc);
|
accountsModel->addAccount(acc);
|
||||||
|
|
||||||
|
emit addedElement({acc->getId()});
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant Models::Roster::data (const QModelIndex& index, int role) const
|
QVariant Models::Roster::data (const QModelIndex& index, int role) const
|
||||||
@ -433,6 +435,9 @@ void Models::Roster::addGroup(const QString& account, const QString& name)
|
|||||||
Group* group = new Group({{"name", name}});
|
Group* group = new Group({{"name", name}});
|
||||||
groups.insert(std::make_pair(id, group));
|
groups.insert(std::make_pair(id, group));
|
||||||
acc->appendChild(group);
|
acc->appendChild(group);
|
||||||
|
|
||||||
|
|
||||||
|
emit addedElement({acc->getId(), group->getId()});
|
||||||
} else {
|
} else {
|
||||||
qDebug() << "An attempt to add group " << name << " to non existing account " << account << ", skipping";
|
qDebug() << "An attempt to add group " << name << " to non existing account " << account << ", skipping";
|
||||||
}
|
}
|
||||||
@ -470,6 +475,7 @@ void Models::Roster::addContact(const QString& account, const QString& jid, cons
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::list<QString> path = {acc->getId()};
|
||||||
if (group == "") {
|
if (group == "") {
|
||||||
if (acc->getContact(jid) != -1) {
|
if (acc->getContact(jid) != -1) {
|
||||||
qDebug() << "An attempt to add a contact" << jid << "to the ungrouped contact set of account" << account << "for the second time, skipping";
|
qDebug() << "An attempt to add a contact" << jid << "to the ungrouped contact set of account" << account << "for the second time, skipping";
|
||||||
@ -486,6 +492,7 @@ void Models::Roster::addContact(const QString& account, const QString& jid, cons
|
|||||||
}
|
}
|
||||||
|
|
||||||
parent = itr->second;
|
parent = itr->second;
|
||||||
|
path.push_back(parent->getId());
|
||||||
|
|
||||||
if (parent->getContact(jid) != -1) {
|
if (parent->getContact(jid) != -1) {
|
||||||
qDebug() << "An attempt to add a contact" << jid << "to the group" << group << "for the second time, skipping";
|
qDebug() << "An attempt to add a contact" << jid << "to the group" << group << "for the second time, skipping";
|
||||||
@ -502,11 +509,14 @@ void Models::Roster::addContact(const QString& account, const QString& jid, cons
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
path.push_back(contact->getId());
|
||||||
|
|
||||||
if (ref == 0) {
|
if (ref == 0) {
|
||||||
ref = new Reference(contact);
|
ref = new Reference(contact);
|
||||||
}
|
}
|
||||||
parent->appendChild(ref);
|
parent->appendChild(ref);
|
||||||
|
|
||||||
|
emit addedElement(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Models::Roster::removeGroup(const QString& account, const QString& name)
|
void Models::Roster::removeGroup(const QString& account, const QString& name)
|
||||||
@ -694,6 +704,7 @@ void Models::Roster::addPresence(const QString& account, const QString& jid, con
|
|||||||
if (itr != contacts.end()) {
|
if (itr != contacts.end()) {
|
||||||
itr->second->addPresence(name, data);
|
itr->second->addPresence(name, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Models::Roster::removePresence(const QString& account, const QString& jid, const QString& name)
|
void Models::Roster::removePresence(const QString& account, const QString& jid, const QString& name)
|
||||||
@ -809,6 +820,8 @@ void Models::Roster::addRoom(const QString& account, const QString jid, const QM
|
|||||||
connect(room, &Room::unreadMessagesCountChanged, this, &Roster::recalculateUnreadMessages);
|
connect(room, &Room::unreadMessagesCountChanged, this, &Roster::recalculateUnreadMessages);
|
||||||
rooms.insert(std::make_pair(id, room));
|
rooms.insert(std::make_pair(id, room));
|
||||||
acc->appendChild(room);
|
acc->appendChild(room);
|
||||||
|
|
||||||
|
emit addedElement({acc->getId(), room->getId()});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Models::Roster::changeRoom(const QString& account, const QString jid, const QMap<QString, QVariant>& data)
|
void Models::Roster::changeRoom(const QString& account, const QString jid, const QMap<QString, QVariant>& data)
|
||||||
@ -961,7 +974,7 @@ bool Models::Roster::markMessageAsRead(const Models::Roster::ElId& elementId, co
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QModelIndex Models::Roster::getAccountIndex(const QString& name)
|
QModelIndex Models::Roster::getAccountIndex(const QString& name) const
|
||||||
{
|
{
|
||||||
std::map<QString, Account*>::const_iterator itr = accounts.find(name);
|
std::map<QString, Account*>::const_iterator itr = accounts.find(name);
|
||||||
if (itr == accounts.end()) {
|
if (itr == accounts.end()) {
|
||||||
@ -971,7 +984,7 @@ QModelIndex Models::Roster::getAccountIndex(const QString& name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QModelIndex Models::Roster::getGroupIndex(const QString& account, const QString& name)
|
QModelIndex Models::Roster::getGroupIndex(const QString& account, const QString& name) const
|
||||||
{
|
{
|
||||||
std::map<QString, Account*>::const_iterator itr = accounts.find(account);
|
std::map<QString, Account*>::const_iterator itr = accounts.find(account);
|
||||||
if (itr == accounts.end()) {
|
if (itr == accounts.end()) {
|
||||||
@ -987,7 +1000,7 @@ QModelIndex Models::Roster::getGroupIndex(const QString& account, const QString&
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QModelIndex Models::Roster::getContactIndex(const QString& account, const QString& jid, const QString& resource)
|
QModelIndex Models::Roster::getContactIndex(const QString& account, const QString& jid, const QString& resource) const
|
||||||
{
|
{
|
||||||
std::map<QString, Account*>::const_iterator itr = accounts.find(account);
|
std::map<QString, Account*>::const_iterator itr = accounts.find(account);
|
||||||
if (itr == accounts.end()) {
|
if (itr == accounts.end()) {
|
||||||
@ -1113,3 +1126,66 @@ void Models::Roster::recalculateUnreadMessages()
|
|||||||
}
|
}
|
||||||
emit unreadMessagesCountChanged(count);
|
emit unreadMessagesCountChanged(count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::list<QString> Models::Roster::getItemPath(const QModelIndex& index) const
|
||||||
|
{
|
||||||
|
std::list<QString> result;
|
||||||
|
if (index.isValid() && index.model() == this) {
|
||||||
|
Item* item = static_cast<Item*>(index.internalPointer());
|
||||||
|
while (item->type != Item::root) {
|
||||||
|
result.push_front(item->getId());
|
||||||
|
item = item->parentItem();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex Models::Roster::getIndexByPath(const std::list<QString>& path) const
|
||||||
|
{
|
||||||
|
if (path.empty())
|
||||||
|
return QModelIndex();
|
||||||
|
|
||||||
|
QModelIndex current;
|
||||||
|
for (const QString& hop : path) {
|
||||||
|
int rows = rowCount(current);
|
||||||
|
bool found = false;
|
||||||
|
for (int i = 0; i < rows; ++i) {
|
||||||
|
QModelIndex el = index(i, 0, current);
|
||||||
|
Item* item = static_cast<Item*>(el.internalPointer());
|
||||||
|
if (item->getId() == hop) {
|
||||||
|
found = true;
|
||||||
|
current = el;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
return current; //this way I will return the last matching model index, may be it's logically incorrect
|
||||||
|
|
||||||
|
|
||||||
|
// std::list<QString>::const_iterator pathItr = path.begin();
|
||||||
|
// QString accName = *pathItr;
|
||||||
|
// QModelIndex accIndex = getAccountIndex(accName);
|
||||||
|
// if (path.size() == 1)
|
||||||
|
// return accIndex;
|
||||||
|
//
|
||||||
|
// if (!accIndex.isValid())
|
||||||
|
// return QModelIndex();
|
||||||
|
//
|
||||||
|
// ++pathItr;
|
||||||
|
// ElId id{accName, *pathItr};
|
||||||
|
// QModelIndex contactIndex = getContactIndex(id.account, id.name);
|
||||||
|
// if (!contactIndex.isValid())
|
||||||
|
// contactIndex = getGroupIndex(id.account, id.name);
|
||||||
|
//
|
||||||
|
// if (path.size() == 2)
|
||||||
|
// return contactIndex;
|
||||||
|
//
|
||||||
|
// if (!contactIndex.isValid())
|
||||||
|
// return QModelIndex();
|
||||||
|
//
|
||||||
|
// ++pathItr;
|
||||||
|
}
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <qabstractitemmodel.h>
|
#include <qabstractitemmodel.h>
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <list>
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
|
|
||||||
#include "shared/message.h"
|
#include "shared/message.h"
|
||||||
@ -86,9 +87,12 @@ public:
|
|||||||
QString getContactIconPath(const QString& account, const QString& jid, const QString& resource) const;
|
QString getContactIconPath(const QString& account, const QString& jid, const QString& resource) const;
|
||||||
Account* getAccount(const QString& name);
|
Account* getAccount(const QString& name);
|
||||||
const Account* getAccountConst(const QString& name) const;
|
const Account* getAccountConst(const QString& name) const;
|
||||||
QModelIndex getAccountIndex(const QString& name);
|
QModelIndex getAccountIndex(const QString& name) const;
|
||||||
QModelIndex getGroupIndex(const QString& account, const QString& name);
|
QModelIndex getGroupIndex(const QString& account, const QString& name) const;
|
||||||
QModelIndex getContactIndex(const QString& account, const QString& jid, const QString& resource = "");
|
QModelIndex getContactIndex(const QString& account, const QString& jid, const QString& resource = "") const;
|
||||||
|
QModelIndex getIndexByPath(const std::list<QString>& path) const;
|
||||||
|
std::list<QString> getItemPath(const QModelIndex& index) const;
|
||||||
|
|
||||||
bool markMessageAsRead(const ElId& elementId, const QString& messageId);
|
bool markMessageAsRead(const ElId& elementId, const QString& messageId);
|
||||||
void responseArchive(const QString& account, const QString& jid, const std::list<Shared::Message>& list, bool last);
|
void responseArchive(const QString& account, const QString& jid, const std::list<Shared::Message>& list, bool last);
|
||||||
|
|
||||||
@ -104,6 +108,7 @@ signals:
|
|||||||
void unreadMessagesCountChanged(int count);
|
void unreadMessagesCountChanged(int count);
|
||||||
void unnoticedMessage(const QString& account, const Shared::Message& msg);
|
void unnoticedMessage(const QString& account, const Shared::Message& msg);
|
||||||
void localPathInvalid(const QString& path);
|
void localPathInvalid(const QString& path);
|
||||||
|
void addedElement(const std::list<QString>& path); //emits only on addition of Account, Contact, Room or Group. Presence and Participant are ignored
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onAccountDataChanged(const QModelIndex& tl, const QModelIndex& br, const QVector<int>& roles);
|
void onAccountDataChanged(const QModelIndex& tl, const QModelIndex& br, const QVector<int>& roles);
|
||||||
|
@ -60,7 +60,8 @@ Squawk::Squawk(Models::Roster& p_rosterModel, QWidget *parent) :
|
|||||||
connect(m_ui->comboBox, qOverload<int>(&QComboBox::activated), this, &Squawk::onComboboxActivated);
|
connect(m_ui->comboBox, qOverload<int>(&QComboBox::activated), this, &Squawk::onComboboxActivated);
|
||||||
//connect(m_ui->roster, &QTreeView::doubleClicked, this, &Squawk::onRosterItemDoubleClicked);
|
//connect(m_ui->roster, &QTreeView::doubleClicked, this, &Squawk::onRosterItemDoubleClicked);
|
||||||
connect(m_ui->roster, &QTreeView::customContextMenuRequested, this, &Squawk::onRosterContextMenu);
|
connect(m_ui->roster, &QTreeView::customContextMenuRequested, this, &Squawk::onRosterContextMenu);
|
||||||
connect(m_ui->roster, &QTreeView::collapsed, this, &Squawk::onItemCollepsed);
|
connect(m_ui->roster, &QTreeView::collapsed, this, &Squawk::itemCollapsed);
|
||||||
|
connect(m_ui->roster, &QTreeView::expanded, this, &Squawk::itemExpanded);
|
||||||
connect(m_ui->roster->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &Squawk::onRosterSelectionChanged);
|
connect(m_ui->roster->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &Squawk::onRosterSelectionChanged);
|
||||||
|
|
||||||
connect(rosterModel.accountsModel, &Models::Accounts::changed, this, &Squawk::onAccountsChanged);
|
connect(rosterModel.accountsModel, &Models::Accounts::changed, this, &Squawk::onAccountsChanged);
|
||||||
@ -491,49 +492,7 @@ void Squawk::writeSettings()
|
|||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
settings.setValue("splitter", m_ui->splitter->saveState());
|
settings.setValue("splitter", m_ui->splitter->saveState());
|
||||||
settings.remove("roster");
|
|
||||||
settings.beginGroup("roster");
|
|
||||||
int size = rosterModel.accountsModel->rowCount(QModelIndex());
|
|
||||||
for (int i = 0; i < size; ++i) {
|
|
||||||
QModelIndex acc = rosterModel.index(i, 0, QModelIndex());
|
|
||||||
Models::Account* account = rosterModel.accountsModel->getAccount(i);
|
|
||||||
QString accName = account->getName();
|
|
||||||
settings.beginGroup(accName);
|
|
||||||
|
|
||||||
settings.setValue("expanded", m_ui->roster->isExpanded(acc));
|
|
||||||
std::deque<QString> groups = rosterModel.groupList(accName);
|
|
||||||
for (const QString& groupName : groups) {
|
|
||||||
settings.beginGroup(groupName);
|
|
||||||
QModelIndex gIndex = rosterModel.getGroupIndex(accName, groupName);
|
|
||||||
settings.setValue("expanded", m_ui->roster->isExpanded(gIndex));
|
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
}
|
|
||||||
|
|
||||||
settings.endGroup();
|
|
||||||
}
|
|
||||||
settings.endGroup();
|
|
||||||
settings.endGroup();
|
|
||||||
|
|
||||||
settings.sync();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Squawk::onItemCollepsed(const QModelIndex& index)
|
|
||||||
{
|
|
||||||
QSettings settings;
|
|
||||||
Models::Item* item = static_cast<Models::Item*>(index.internalPointer());
|
|
||||||
switch (item->type) {
|
|
||||||
case Models::Item::account:
|
|
||||||
settings.setValue("ui/roster/" + item->getName() + "/expanded", false);
|
|
||||||
break;
|
|
||||||
case Models::Item::group: {
|
|
||||||
QModelIndex accInd = rosterModel.parent(index);
|
|
||||||
Models::Account* account = rosterModel.accountsModel->getAccount(accInd.row());
|
|
||||||
settings.setValue("ui/roster/" + account->getName() + "/" + item->getName() + "/expanded", false);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Squawk::onRosterSelectionChanged(const QModelIndex& current, const QModelIndex& previous)
|
void Squawk::onRosterSelectionChanged(const QModelIndex& current, const QModelIndex& previous)
|
||||||
|
@ -83,6 +83,8 @@ signals:
|
|||||||
void openConversation(const Models::Roster::ElId& id, const QString& resource = "");
|
void openConversation(const Models::Roster::ElId& id, const QString& resource = "");
|
||||||
|
|
||||||
void modifyAccountRequest(const QString&, const QMap<QString, QVariant>&);
|
void modifyAccountRequest(const QString&, const QMap<QString, QVariant>&);
|
||||||
|
void itemExpanded (const QModelIndex& index);
|
||||||
|
void itemCollapsed (const QModelIndex& index);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Models::Roster::ElId currentConversationId() const;
|
Models::Roster::ElId currentConversationId() const;
|
||||||
@ -127,7 +129,6 @@ private slots:
|
|||||||
void onComboboxActivated(int index);
|
void onComboboxActivated(int index);
|
||||||
void onRosterItemDoubleClicked(const QModelIndex& item);
|
void onRosterItemDoubleClicked(const QModelIndex& item);
|
||||||
void onRosterContextMenu(const QPoint& point);
|
void onRosterContextMenu(const QPoint& point);
|
||||||
void onItemCollepsed(const QModelIndex& index);
|
|
||||||
void onRosterSelectionChanged(const QModelIndex& current, const QModelIndex& previous);
|
void onRosterSelectionChanged(const QModelIndex& current, const QModelIndex& previous);
|
||||||
void onContextAboutToHide();
|
void onContextAboutToHide();
|
||||||
void onAboutSquawkCalled();
|
void onAboutSquawkCalled();
|
||||||
|
@ -100,7 +100,7 @@ void PageGeneral::onTrayChecked(int state)
|
|||||||
emit variableModified("tray", enabled);
|
emit variableModified("tray", enabled);
|
||||||
m_ui->hideTrayInput->setEnabled(enabled);
|
m_ui->hideTrayInput->setEnabled(enabled);
|
||||||
if (!enabled) {
|
if (!enabled) {
|
||||||
m_ui->hideTrayInput->setEnabled(false);
|
m_ui->hideTrayInput->setChecked(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user