mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-02-22 23:49:58 -05:00
Add signal for changes in Group.
This commit is contained in:
parent
bfb75da123
commit
e28ed4891b
@ -33,6 +33,11 @@ Group* Database::rootGroup()
|
|||||||
return m_rootGroup;
|
return m_rootGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Group* Database::rootGroup() const
|
||||||
|
{
|
||||||
|
return m_rootGroup;
|
||||||
|
}
|
||||||
|
|
||||||
void Database::setRootGroup(Group* group)
|
void Database::setRootGroup(Group* group)
|
||||||
{
|
{
|
||||||
Q_ASSERT(group == 0 || group->database() == this);
|
Q_ASSERT(group == 0 || group->database() == this);
|
||||||
|
@ -34,6 +34,7 @@ class Database : public QObject
|
|||||||
public:
|
public:
|
||||||
Database();
|
Database();
|
||||||
Group* rootGroup();
|
Group* rootGroup();
|
||||||
|
const Group* rootGroup() const;
|
||||||
void setRootGroup(Group* group);
|
void setRootGroup(Group* group);
|
||||||
Metadata* metadata();
|
Metadata* metadata();
|
||||||
static QImage icon(int number);
|
static QImage icon(int number);
|
||||||
@ -41,6 +42,9 @@ public:
|
|||||||
Entry* resolveEntry(const Uuid& uuid);
|
Entry* resolveEntry(const Uuid& uuid);
|
||||||
Group* resolveGroup(const Uuid& uuid);
|
Group* resolveGroup(const Uuid& uuid);
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void groupChanged(const Group* group);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Entry* recFindEntry(const Uuid& uuid, Group* group);
|
Entry* recFindEntry(const Uuid& uuid, Group* group);
|
||||||
Group* recFindGroup(const Uuid& uuid, Group* group);
|
Group* recFindGroup(const Uuid& uuid, Group* group);
|
||||||
|
@ -79,6 +79,8 @@ void Group::setUuid(const Uuid& uuid)
|
|||||||
void Group::setName(const QString& name)
|
void Group::setName(const QString& name)
|
||||||
{
|
{
|
||||||
m_name = name;
|
m_name = name;
|
||||||
|
|
||||||
|
Q_EMIT groupChanged(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Group::setNotes(const QString& notes)
|
void Group::setNotes(const QString& notes)
|
||||||
@ -92,6 +94,8 @@ void Group::setIcon(int iconNumber)
|
|||||||
|
|
||||||
m_iconNumber = iconNumber;
|
m_iconNumber = iconNumber;
|
||||||
m_customIcon = Uuid();
|
m_customIcon = Uuid();
|
||||||
|
|
||||||
|
Q_EMIT groupChanged(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Group::setIcon(const Uuid& uuid)
|
void Group::setIcon(const Uuid& uuid)
|
||||||
@ -100,6 +104,8 @@ void Group::setIcon(const Uuid& uuid)
|
|||||||
|
|
||||||
m_iconNumber = 0;
|
m_iconNumber = 0;
|
||||||
m_customIcon = uuid;
|
m_customIcon = uuid;
|
||||||
|
|
||||||
|
Q_EMIT groupChanged(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Group::setTimeInfo(const TimeInfo& timeInfo)
|
void Group::setTimeInfo(const TimeInfo& timeInfo)
|
||||||
@ -135,6 +141,7 @@ void Group::setParent(Group* parent)
|
|||||||
m_parent->m_children.removeAll(this);
|
m_parent->m_children.removeAll(this);
|
||||||
}
|
}
|
||||||
else if (m_db) {
|
else if (m_db) {
|
||||||
|
// parent was a Database
|
||||||
m_db->setRootGroup(0);
|
m_db->setRootGroup(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,6 +180,11 @@ const Database* Group::database() const
|
|||||||
return m_db;
|
return m_db;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<Group*> Group::children()
|
||||||
|
{
|
||||||
|
return m_children;
|
||||||
|
}
|
||||||
|
|
||||||
QList<const Group*> Group::children() const
|
QList<const Group*> Group::children() const
|
||||||
{
|
{
|
||||||
QList<const Group*> constChildren;
|
QList<const Group*> constChildren;
|
||||||
@ -183,9 +195,9 @@ QList<const Group*> Group::children() const
|
|||||||
return constChildren;
|
return constChildren;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<Group*> Group::children()
|
QList<Entry*> Group::entries()
|
||||||
{
|
{
|
||||||
return m_children;
|
return m_entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<const Entry*> Group::entries() const
|
QList<const Entry*> Group::entries() const
|
||||||
@ -198,11 +210,6 @@ QList<const Entry*> Group::entries() const
|
|||||||
return constEntries;
|
return constEntries;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<Entry*> Group::entries()
|
|
||||||
{
|
|
||||||
return m_entries;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Group::addEntry(Entry *entry)
|
void Group::addEntry(Entry *entry)
|
||||||
{
|
{
|
||||||
Q_ASSERT(entry != 0);
|
Q_ASSERT(entry != 0);
|
||||||
@ -217,6 +224,9 @@ void Group::removeEntry(Entry* entry)
|
|||||||
|
|
||||||
void Group::recSetDatabase(Database* db)
|
void Group::recSetDatabase(Database* db)
|
||||||
{
|
{
|
||||||
|
disconnect(SIGNAL(groupChanged(const Group*)), m_db);
|
||||||
|
connect(this, SIGNAL(groupChanged(const Group*)), db, SIGNAL(groupChanged(const Group*)));
|
||||||
|
|
||||||
m_db = db;
|
m_db = db;
|
||||||
|
|
||||||
Q_FOREACH (Group* group, m_children) {
|
Q_FOREACH (Group* group, m_children) {
|
||||||
|
@ -56,13 +56,16 @@ public:
|
|||||||
void setParent(Database* db);
|
void setParent(Database* db);
|
||||||
|
|
||||||
const Database* database() const;
|
const Database* database() const;
|
||||||
QList<const Group*> children() const;
|
|
||||||
QList<Group*> children();
|
QList<Group*> children();
|
||||||
QList<const Entry*> entries() const;
|
QList<const Group*> children() const;
|
||||||
QList<Entry*> entries();
|
QList<Entry*> entries();
|
||||||
|
QList<const Entry*> entries() const;
|
||||||
void addEntry(Entry* entry);
|
void addEntry(Entry* entry);
|
||||||
void removeEntry(Entry* entry);
|
void removeEntry(Entry* entry);
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void groupChanged(const Group* group);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void recSetDatabase(Database* db);
|
void recSetDatabase(Database* db);
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@ Uuid::Uuid(const QByteArray& data)
|
|||||||
Uuid Uuid::random() {
|
Uuid Uuid::random() {
|
||||||
QByteArray randomAray;
|
QByteArray randomAray;
|
||||||
// TODO fill with random data
|
// TODO fill with random data
|
||||||
|
randomAray.fill(1, 16);
|
||||||
return Uuid(randomAray);
|
return Uuid(randomAray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,21 +17,19 @@
|
|||||||
|
|
||||||
#include "GroupModel.h"
|
#include "GroupModel.h"
|
||||||
|
|
||||||
|
#include "core/Database.h"
|
||||||
#include "core/Group.h"
|
#include "core/Group.h"
|
||||||
|
|
||||||
GroupModel::GroupModel(const Group* rootGroup, QObject* parent) : QAbstractItemModel(parent)
|
GroupModel::GroupModel(const Database* db, QObject* parent) : QAbstractItemModel(parent)
|
||||||
{
|
{
|
||||||
m_root = rootGroup;
|
m_root = db->rootGroup();
|
||||||
}
|
connect(db, SIGNAL(groupChanged(const Group*)), SLOT(groupChanged(const Group*)));
|
||||||
|
|
||||||
void GroupModel::setRootGroup(const Group* group)
|
|
||||||
{
|
|
||||||
m_root = group;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int GroupModel::rowCount(const QModelIndex& parent) const
|
int GroupModel::rowCount(const QModelIndex& parent) const
|
||||||
{
|
{
|
||||||
if (!parent.isValid()) {
|
if (!parent.isValid()) {
|
||||||
|
// we have exactly 1 root item
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -75,11 +73,13 @@ QModelIndex GroupModel::parent(const QModelIndex& index) const
|
|||||||
const Group* parentGroup = childGroup->parentGroup();
|
const Group* parentGroup = childGroup->parentGroup();
|
||||||
|
|
||||||
if (!parentGroup) {
|
if (!parentGroup) {
|
||||||
|
// index is already the root group
|
||||||
return QModelIndex();
|
return QModelIndex();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const Group* grandParentGroup = parentGroup->parentGroup();
|
const Group* grandParentGroup = parentGroup->parentGroup();
|
||||||
if (!grandParentGroup) {
|
if (!grandParentGroup) {
|
||||||
|
// parent is the root group
|
||||||
return createIndex(0, 0, parentGroup);
|
return createIndex(0, 0, parentGroup);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -90,12 +90,21 @@ QModelIndex GroupModel::parent(const QModelIndex& index) const
|
|||||||
|
|
||||||
QVariant GroupModel::data(const QModelIndex& index, int role) const
|
QVariant GroupModel::data(const QModelIndex& index, int role) const
|
||||||
{
|
{
|
||||||
if (!index.isValid() || role != Qt::DisplayRole) {
|
if (!index.isValid()) {
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
|
|
||||||
const Group* group = groupFromIndex(index);
|
const Group* group = groupFromIndex(index);
|
||||||
return group->name();
|
|
||||||
|
if (role == Qt::DisplayRole) {
|
||||||
|
return group->name();
|
||||||
|
}
|
||||||
|
else if (role == Qt::DecorationRole) {
|
||||||
|
return group->icon();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant GroupModel::headerData(int section, Qt::Orientation orientation, int role) const
|
QVariant GroupModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||||
@ -118,3 +127,18 @@ const Group* GroupModel::groupFromIndex(const QModelIndex& index) const
|
|||||||
|
|
||||||
return static_cast<const Group*>(index.internalPointer());
|
return static_cast<const Group*>(index.internalPointer());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GroupModel::groupChanged(const Group* group)
|
||||||
|
{
|
||||||
|
int row;
|
||||||
|
|
||||||
|
if (!group->parentGroup()) {
|
||||||
|
row = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
row = group->parentGroup()->children().indexOf(group);
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex index = createIndex(row, 0, group);
|
||||||
|
Q_EMIT dataChanged(index, index);
|
||||||
|
}
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include <QtCore/QAbstractItemModel>
|
#include <QtCore/QAbstractItemModel>
|
||||||
|
|
||||||
|
class Database;
|
||||||
class Group;
|
class Group;
|
||||||
|
|
||||||
class GroupModel : public QAbstractItemModel
|
class GroupModel : public QAbstractItemModel
|
||||||
@ -27,8 +28,7 @@ class GroupModel : public QAbstractItemModel
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit GroupModel(const Group* rootGroup, QObject* parent = 0);
|
explicit GroupModel(const Database* db, QObject* parent = 0);
|
||||||
void setRootGroup(const Group* group);
|
|
||||||
|
|
||||||
int rowCount(const QModelIndex& parent = QModelIndex()) const;
|
int rowCount(const QModelIndex& parent = QModelIndex()) const;
|
||||||
int columnCount(const QModelIndex& parent = QModelIndex()) const;
|
int columnCount(const QModelIndex& parent = QModelIndex()) const;
|
||||||
@ -41,6 +41,10 @@ private:
|
|||||||
QModelIndex createIndex(int row, int column, const Group* group) const;
|
QModelIndex createIndex(int row, int column, const Group* group) const;
|
||||||
const Group* groupFromIndex(const QModelIndex& index) const;
|
const Group* groupFromIndex(const QModelIndex& index) const;
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void groupChanged(const Group* group);
|
||||||
|
|
||||||
|
private:
|
||||||
const Group* m_root;
|
const Group* m_root;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ int main(int argc, char **argv)
|
|||||||
Parser* parser = new Parser(db);
|
Parser* parser = new Parser(db);
|
||||||
parser->parse(QString(KEEPASSX_TEST_DIR).append("/NewDatabase.xml"));
|
parser->parse(QString(KEEPASSX_TEST_DIR).append("/NewDatabase.xml"));
|
||||||
|
|
||||||
GroupModel groupModel(db->rootGroup());
|
GroupModel groupModel(db);
|
||||||
|
|
||||||
QTreeView view;
|
QTreeView view;
|
||||||
view.setModel(&groupModel);
|
view.setModel(&groupModel);
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <QtTest/QSignalSpy>
|
||||||
#include <QtTest/QTest>
|
#include <QtTest/QTest>
|
||||||
|
|
||||||
#include "core/Database.h"
|
#include "core/Database.h"
|
||||||
@ -65,6 +66,15 @@ void TestGroup::testParenting()
|
|||||||
QVERIFY(g1->children().at(0) == g2);
|
QVERIFY(g1->children().at(0) == g2);
|
||||||
QVERIFY(g1->children().at(1) == g3);
|
QVERIFY(g1->children().at(1) == g3);
|
||||||
QVERIFY(g3->children().contains(g4));
|
QVERIFY(g3->children().contains(g4));
|
||||||
|
|
||||||
|
QSignalSpy spy(db, SIGNAL(groupChanged(const Group*)));
|
||||||
|
g2->setName("test");
|
||||||
|
g4->setName("test");
|
||||||
|
g3->setName("test");
|
||||||
|
g1->setName("test");
|
||||||
|
g3->setIcon(Uuid::random());
|
||||||
|
g1->setIcon(2);
|
||||||
|
QVERIFY(spy.count() == 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
QTEST_MAIN(TestGroup);
|
QTEST_MAIN(TestGroup);
|
||||||
|
@ -15,9 +15,11 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <QtTest/QSignalSpy>
|
||||||
#include <QtTest/QTest>
|
#include <QtTest/QTest>
|
||||||
|
|
||||||
#include "modeltest.h"
|
#include "modeltest.h"
|
||||||
|
#include "core/Database.h"
|
||||||
#include "core/Group.h"
|
#include "core/Group.h"
|
||||||
#include "gui/GroupModel.h"
|
#include "gui/GroupModel.h"
|
||||||
|
|
||||||
@ -31,7 +33,10 @@ private Q_SLOTS:
|
|||||||
|
|
||||||
void TestGroupModel::test()
|
void TestGroupModel::test()
|
||||||
{
|
{
|
||||||
|
Database* db = new Database();
|
||||||
|
|
||||||
Group* groupRoot = new Group();
|
Group* groupRoot = new Group();
|
||||||
|
groupRoot->setParent(db);
|
||||||
groupRoot->setName("groupRoot");
|
groupRoot->setName("groupRoot");
|
||||||
|
|
||||||
Group* group1 = new Group();
|
Group* group1 = new Group();
|
||||||
@ -54,7 +59,7 @@ void TestGroupModel::test()
|
|||||||
group2->setName("group2");
|
group2->setName("group2");
|
||||||
group2->setParent(groupRoot);
|
group2->setParent(groupRoot);
|
||||||
|
|
||||||
GroupModel* model = new GroupModel(groupRoot, this);
|
GroupModel* model = new GroupModel(db, this);
|
||||||
|
|
||||||
new ModelTest(model, this);
|
new ModelTest(model, this);
|
||||||
|
|
||||||
@ -72,7 +77,13 @@ void TestGroupModel::test()
|
|||||||
QVERIFY(model->data(index121) == "group121");
|
QVERIFY(model->data(index121) == "group121");
|
||||||
QVERIFY(model->data(index2) == "group2");
|
QVERIFY(model->data(index2) == "group2");
|
||||||
|
|
||||||
|
QSignalSpy spy(model, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)));
|
||||||
|
group11->setName("test");
|
||||||
|
group121->setIcon(4);
|
||||||
|
QVERIFY(spy.count() == 2);
|
||||||
|
|
||||||
delete groupRoot;
|
delete groupRoot;
|
||||||
|
delete db;
|
||||||
}
|
}
|
||||||
|
|
||||||
QTEST_MAIN(TestGroupModel);
|
QTEST_MAIN(TestGroupModel);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user