Skip to content

Commit

Permalink
Connection tree improvements (#4013)
Browse files Browse the repository at this point in the history
- Move icon paths to qml
- Render icons on qml side & get rid of useless model code.
- Rewrite TreeView
- Use single TableViewColumn
- Remove direct method calls
- Remove refresh timer
- Clean up code
- Remove itemDepth method
- Emit item change on removal
- Add shortcuts support to inline menu
- Fix #3997: No reload function in virtual folders
- Rewrite database menu with InlineMenu component
- Fix docs url
- Use improved ImageButton in InlineMenu
- Fix minor layout issues in db inline menu
  • Loading branch information
uglide committed Feb 22, 2018
1 parent 0470220 commit 5185cae
Show file tree
Hide file tree
Showing 24 changed files with 402 additions and 557 deletions.
23 changes: 6 additions & 17 deletions src/modules/connections-tree/items/databaseitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,6 @@ QString DatabaseItem::getDisplayName() const
.arg(liveUpdate);
}

QString DatabaseItem::getIconUrl() const
{
if (isLocked()) return QString("qrc:/images/wait.svg");
return QString("qrc:/images/db.svg");
}

bool DatabaseItem::isEnabled() const {return true;}

void DatabaseItem::notifyModel()
Expand Down Expand Up @@ -141,20 +135,16 @@ void DatabaseItem::loadKeys(std::function<void ()> callback)

if (callback) {
callback();
} else {
emit m_model.itemChanged(getSelf());
}
});
}

QVariant DatabaseItem::metadata(const QString &key)
QVariantMap DatabaseItem::metadata() const
{
if (key == "filter")
return m_filter.pattern();
if (key == "live_update")
return m_liveUpdateTimer.isActive();

return QVariant();
QVariantMap metadata = TreeItem::metadata();
metadata["filter"] = m_filter.pattern();
metadata["live_update"] = m_liveUpdateTimer.isActive();
return metadata;
}

void DatabaseItem::setMetadata(const QString &key, QVariant value)
Expand Down Expand Up @@ -194,8 +184,7 @@ void DatabaseItem::unload()

m_operations->notifyDbWasUnloaded(m_dbIndex);

unlock();
emit m_model.itemChanged(getSelf());
unlock();
}

void DatabaseItem::reload()
Expand Down
10 changes: 3 additions & 7 deletions src/modules/connections-tree/items/databaseitem.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,17 @@ class DatabaseItem : public QObject, public AbstractNamespaceItem

QString getDisplayName() const override;

QString getIconUrl() const override;

QString getType() const override { return "database"; }

int itemDepth() const override { return 1; }
QString getType() const override { return "database"; }

bool isEnabled() const override;

void notifyModel() override;

void loadKeys(std::function<void()> callback=std::function<void()>());

void unload();
void unload();

QVariant metadata(const QString&) override;
QVariantMap metadata() const override;

void setMetadata(const QString&, QVariant) override;

Expand Down
8 changes: 3 additions & 5 deletions src/modules/connections-tree/items/keyitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <QMessageBox>
#include <qredisclient/utils/text.h>

#include "connections-tree/model.h"
#include "connections-tree/utils.h"

using namespace ConnectionsTree;
Expand Down Expand Up @@ -48,11 +49,6 @@ QByteArray KeyItem::getName() const
return m_fullPath;
}

QString KeyItem::getIconUrl() const
{
return QString("qrc:/images/key.svg");
}

QList<QSharedPointer<TreeItem>> KeyItem::getAllChilds() const
{
return QList<QSharedPointer<TreeItem>>();
Expand Down Expand Up @@ -100,4 +96,6 @@ int KeyItem::getDbIndex() const
void KeyItem::setRemoved()
{
m_removed = true;

emit m_model.itemChanged(getSelf());
}
8 changes: 2 additions & 6 deletions src/modules/connections-tree/items/keyitem.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,9 @@ class KeyItem : public TreeItem

QString getDisplayName() const override;

QByteArray getName() const override;
QByteArray getName() const override;

QString getIconUrl() const override;

QString getType() const override { return "key"; }

int itemDepth() const override { return m_fullPath.count(m_operations->getNamespaceSeparator().toUtf8()) + 2; }
QString getType() const override { return "key"; }

QList<QSharedPointer<TreeItem>> getAllChilds() const override;

Expand Down
64 changes: 34 additions & 30 deletions src/modules/connections-tree/items/namespaceitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,32 +19,26 @@ NamespaceItem::NamespaceItem(const QByteArray &fullPath,
m_displayName = m_fullPath.mid(m_fullPath.lastIndexOf(m_operations->getNamespaceSeparator()) + 1);

m_eventHandlers.insert("click", [this]() {

if (m_childItems.size() == 0) {
QString nsFilter = QString("%1%2*").arg(QString::fromUtf8(m_fullPath)).arg(m_operations->getNamespaceSeparator());

qDebug() << "NS Filter" << nsFilter;

if (m_childItems.size() == 0) {
lock();
emit m_model.itemChanged(getSelf());

m_operations->loadNamespaceItems(qSharedPointerDynamicCast<AbstractNamespaceItem>(getSelf()),
nsFilter, [this](const QString& err) {
unlock();
if (!err.isEmpty())
return showLoadingError(err);

setExpanded(true);
emit m_model.itemChanged(getSelf());
emit m_model.expandItem(getSelf());
});
} else {
load();
} else if (!isExpanded()) {
setExpanded(true);
emit m_model.itemChanged(getSelf());
emit m_model.expandItem(getSelf());
}
});

m_eventHandlers.insert("reload", [this]() {
lock();

if (m_childItems.size()) {
clear();
}

load();
});

m_eventHandlers.insert("delete", [this]() {
m_operations->deleteDbNamespace(*this);
});
Expand All @@ -60,16 +54,6 @@ QByteArray NamespaceItem::getName() const
return m_displayName;
}

QString NamespaceItem::getIconUrl() const
{
if (isLocked()) return QString("qrc:/images/wait.svg");
return QString("qrc:/images/namespace.svg");
}

int NamespaceItem::itemDepth() const {
return m_fullPath.count(m_operations->getNamespaceSeparator().toUtf8()) + 2;
}

bool NamespaceItem::isEnabled() const
{
return m_removed == false;
Expand All @@ -82,5 +66,25 @@ QByteArray NamespaceItem::getFullPath() const

void NamespaceItem::setRemoved()
{
m_removed = true;
m_removed = true;

clear();

emit m_model.itemChanged(getSelf());
}

void NamespaceItem::load()
{
QString nsFilter = QString("%1%2*").arg(QString::fromUtf8(m_fullPath)).arg(m_operations->getNamespaceSeparator());

m_operations->loadNamespaceItems(qSharedPointerDynamicCast<AbstractNamespaceItem>(getSelf()),
nsFilter, [this](const QString& err) {
unlock();
if (!err.isEmpty())
return showLoadingError(err);

setExpanded(true);
emit m_model.itemChanged(getSelf());
emit m_model.expandItem(getSelf());
});
}
9 changes: 4 additions & 5 deletions src/modules/connections-tree/items/namespaceitem.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,15 @@ class NamespaceItem : public QObject, public AbstractNamespaceItem

QByteArray getFullPath() const;

QString getIconUrl() const override;

QString getType() const override { return "namespace"; }

int itemDepth() const override;
QString getType() const override { return "namespace"; }

bool isEnabled() const override;

void setRemoved();

protected:
void load();

private:
QByteArray m_fullPath;
QByteArray m_displayName;
Expand Down
37 changes: 16 additions & 21 deletions src/modules/connections-tree/items/serveritem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,21 +72,6 @@ QString ServerItem::getDisplayName() const
return m_name;
}

QString ServerItem::getIconUrl() const
{
if (isLocked()) return QString("qrc:/images/wait.svg");
if (isDatabaseListLoaded()) {
if (m_operations->mode() == "cluster") {
return QString("qrc:/images/cluster.svg");
} else if (m_operations->mode() == "sentinel") {
return QString("qrc:/images/sentinel.svg");
} else {
return QString("qrc:/images/server.svg");
}
}
return QString("qrc:/images/server_offline.svg");
}

QList<QSharedPointer<TreeItem> > ServerItem::getAllChilds() const
{
return m_databases;
Expand Down Expand Up @@ -133,8 +118,7 @@ bool ServerItem::isDatabaseListLoaded() const

void ServerItem::load()
{
lock();
emit m_model.itemChanged(m_self);
lock();

std::function<void(RedisClient::DatabaseList)> callback = [this](RedisClient::DatabaseList databases) {

Expand All @@ -154,15 +138,13 @@ void ServerItem::load()

emit m_model.itemChildsLoaded(m_self);

unlock();
emit m_model.itemChanged(m_self);
unlock();
};

try {
m_operations->getDatabases(callback);
} catch (const ConnectionsTree::Operations::Exception& e) {
unlock();
emit m_model.itemChanged(m_self);
unlock();
emit m_model.error(QObject::tr("Cannot load databases:\n\n") + QString(e.what()));
}
}
Expand Down Expand Up @@ -214,3 +196,16 @@ void ServerItem::setWeakPointer(QWeakPointer<ServerItem> self)
{
m_self = self;
}

QVariantMap ConnectionsTree::ServerItem::metadata() const
{
QVariantMap meta = TreeItem::metadata();

if (isDatabaseListLoaded()) {
meta["server_type"] = m_operations->mode();
} else {
meta["server_type"] = "unknown";
}

return meta;
}
8 changes: 3 additions & 5 deletions src/modules/connections-tree/items/serveritem.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,11 @@ class ServerItem : public QObject, public TreeItem

~ServerItem();

QString getDisplayName() const override;
QString getDisplayName() const override;

QString getIconUrl() const override;
QString getType() const override { return "server"; }

QString getType() const override { return "server"; }

int itemDepth() const override { return 0; }
QVariantMap metadata() const;

QList<QSharedPointer<TreeItem>> getAllChilds() const override;

Expand Down
21 changes: 21 additions & 0 deletions src/modules/connections-tree/items/treeitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,25 @@ ConnectionsTree::TreeItem::TreeItem(Model &m)

}

QVariant ConnectionsTree::TreeItem::metadata(const QString &key) const
{
if (!metadata().contains(key))
return QVariant();

return metadata()[key];
}

QVariantMap ConnectionsTree::TreeItem::metadata() const
{
QVariantMap meta;
meta["name"] = getDisplayName();
meta["full_name"] = getName();
meta["type"] = getType();
meta["locked"] = isLocked();
meta["state"] = isEnabled();
return meta;
}

int ConnectionsTree::TreeItem::row() const
{
if (!parent())
Expand Down Expand Up @@ -49,11 +68,13 @@ ConnectionsTree::Model &ConnectionsTree::TreeItem::model()
void ConnectionsTree::TreeItem::lock()
{
m_locked = true;
emit m_model.itemChanged(getSelf());
}

void ConnectionsTree::TreeItem::unlock()
{
m_locked = false;
emit m_model.itemChanged(getSelf());
}

void ConnectionsTree::TreeItem::handleEvent(QString event)
Expand Down
10 changes: 4 additions & 6 deletions src/modules/connections-tree/items/treeitem.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,7 @@ class TreeItem {

virtual QByteArray getFullPath() const { return QByteArray(); }

virtual QString getIconUrl() const = 0;

virtual QString getType() const = 0;

virtual int itemDepth() const = 0;
virtual QString getType() const = 0;

virtual QList<QSharedPointer<TreeItem>> getAllChilds() const = 0;

Expand All @@ -44,7 +40,9 @@ class TreeItem {

virtual bool supportChildItems() const { return true; }

virtual QVariant metadata(const QString&) { return QVariant(); }
virtual QVariant metadata(const QString& key) const;

virtual QVariantMap metadata() const;

virtual void setMetadata(const QString&, QVariant) {}

Expand Down
Loading

0 comments on commit 5185cae

Please sign in to comment.