diff --git a/assets/icons/Silk-Icons.LICENSE b/assets/icons/Silk-Icons.LICENSE new file mode 100644 index 0000000..2cf67dc --- /dev/null +++ b/assets/icons/Silk-Icons.LICENSE @@ -0,0 +1,22 @@ +Silk icon set 1.3 + +_________________________________________ +Mark James +http://www.famfamfam.com/lab/icons/silk/ +_________________________________________ + +This work is licensed under a +Creative Commons Attribution 2.5 License. +[ http://creativecommons.org/licenses/by/2.5/ ] + +This means you may use it for any purpose, +and make any changes you like. +All I ask is that you include a link back +to this page in your credits. + +Are you using this icon set? Send me an email +(including a link or picture if available) to +mjames@gmail.com + +Any other questions about this icon set please +contact mjames@gmail.com \ No newline at end of file diff --git a/assets/icons/instance.png b/assets/icons/instance.png new file mode 100644 index 0000000..33af046 Binary files /dev/null and b/assets/icons/instance.png differ diff --git a/assets/icons/part.png b/assets/icons/part.png new file mode 100644 index 0000000..7851cf3 Binary files /dev/null and b/assets/icons/part.png differ diff --git a/assets/icons/script.png b/assets/icons/script.png new file mode 100644 index 0000000..0f9ed4d Binary files /dev/null and b/assets/icons/script.png differ diff --git a/assets/icons/workspace.png b/assets/icons/workspace.png new file mode 100644 index 0000000..68f21d3 Binary files /dev/null and b/assets/icons/workspace.png differ diff --git a/editor/explorermodel.cpp b/editor/explorermodel.cpp index d39742b..00ca0fc 100644 --- a/editor/explorermodel.cpp +++ b/editor/explorermodel.cpp @@ -1,14 +1,20 @@ #include "explorermodel.h" #include "objects/base/instance.h" #include "qcontainerfwd.h" +#include "qicon.h" +#include "qimage.h" +#include "qnamespace.h" #include "qobject.h" #include "qwidget.h" #include "common.h" #include #include +#include "objects/base/instance.h" // https://doc.qt.io/qt-6/qtwidgets-itemviews-simpletreemodel-example.html#testing-the-model +std::map instanceIconCache; + ExplorerModel::ExplorerModel(InstanceRef dataRoot, QWidget *parent) : QAbstractItemModel(parent) , rootItem(dataRoot) { @@ -96,11 +102,18 @@ int ExplorerModel::columnCount(const QModelIndex &parent) const { } QVariant ExplorerModel::data(const QModelIndex &index, int role) const { - if (!index.isValid() || role != Qt::DisplayRole) + if (!index.isValid()) return {}; - const Instance *item = static_cast(index.internalPointer()); - return QString::fromStdString(item->name); + Instance *item = static_cast(index.internalPointer()); + + switch (role) { + case Qt::DisplayRole: + return QString::fromStdString(item->name); + case Qt::DecorationRole: + return iconOf(item->GetClass()); + } + return {}; } QVariant ExplorerModel::headerData(int section, Qt::Orientation orientation, @@ -113,4 +126,15 @@ Qt::ItemFlags ExplorerModel::flags(const QModelIndex &index) const { return index.isValid() ? QAbstractItemModel::flags(index) : Qt::ItemFlags(Qt::NoItemFlags); +} + +QImage ExplorerModel::iconOf(InstanceType* type) const { + if (instanceIconCache.count(type->className)) return instanceIconCache[type->className]; + + InstanceType* currentClass = type; + while (currentClass->explorerIcon.empty()) currentClass = currentClass->super; + + QImage icon("assets/icons/" + QString::fromStdString(currentClass->explorerIcon)); + instanceIconCache[type->className] = icon; + return icon; } \ No newline at end of file diff --git a/editor/explorermodel.h b/editor/explorermodel.h index 80cc004..6317625 100644 --- a/editor/explorermodel.h +++ b/editor/explorermodel.h @@ -30,6 +30,7 @@ public: private: InstanceRef rootItem; QModelIndex toIndex(InstanceRef item); + QImage iconOf(InstanceType* type) const; }; #endif // EXPLORERMODEL_H diff --git a/editor/mainwindow.cpp b/editor/mainwindow.cpp index aff9e84..22f2cee 100644 --- a/editor/mainwindow.cpp +++ b/editor/mainwindow.cpp @@ -28,6 +28,7 @@ MainWindow::MainWindow(QWidget *parent) setMouseTracking(true); ui->explorerView->setModel(new ExplorerModel(std::dynamic_pointer_cast(workspace))); + ui->explorerView->setRootIsDecorated(false); simulationInit(); diff --git a/src/objects/base/instance.cpp b/src/objects/base/instance.cpp index e9c84f5..6cbd305 100644 --- a/src/objects/base/instance.cpp +++ b/src/objects/base/instance.cpp @@ -9,6 +9,7 @@ static InstanceType TYPE_ { .super = NULL, .className = "Instance", .constructor = NULL, // Instance is abstract and therefore not creatable + .explorerIcon = "instance", }; InstanceType* Instance::TYPE = &TYPE_; diff --git a/src/objects/base/instance.h b/src/objects/base/instance.h index 865ccb5..bb7baa6 100644 --- a/src/objects/base/instance.h +++ b/src/objects/base/instance.h @@ -9,6 +9,7 @@ struct InstanceType { InstanceType* super; // May be null std::string className; InstanceConstructor constructor; + std::string explorerIcon = ""; }; // Base class for all instances in the data model diff --git a/src/objects/part.cpp b/src/objects/part.cpp index 3459581..d91fbae 100644 --- a/src/objects/part.cpp +++ b/src/objects/part.cpp @@ -5,6 +5,7 @@ static InstanceType TYPE_ { .super = Instance::TYPE, .className = "Part", .constructor = &Part::CreateGeneric, + .explorerIcon = "part", }; InstanceType* Part::TYPE = &TYPE_;