asset browser: implement filtering

This commit is contained in:
Skarn
2020-11-15 03:05:35 +03:00
parent 5a59dca4dc
commit e696579082
4 changed files with 145 additions and 49 deletions

View File

@@ -21,12 +21,25 @@ AssetBrowserWidget::AssetBrowserWidget(QWidget *parent)
ui->setupUi(this);
_model = new QStandardItemModel(this);
ui->listfileTree->setIconSize(QSize(128, 128));
ui->listfileTree->setModel(_model);
_sort_model = new QSortFilterProxyModel(this);
_sort_model->setFilterCaseSensitivity(Qt::CaseInsensitive);
_sort_model->setFilterRole(Qt::UserRole);
_sort_model->setRecursiveFilteringEnabled(true);
_preview_renderer = new PreviewRenderer(128, 128, noggit::NoggitRenderContext::ASSET_BROWSER_PREVIEW, this);
ui->listfileTree->setIconSize(QSize(90, 90));
_sort_model->setSourceModel(_model);
ui->listfileTree->setModel(_sort_model);
_preview_renderer = new PreviewRenderer(90, 90,
noggit::NoggitRenderContext::ASSET_BROWSER_PREVIEW, this);
_preview_renderer->setVisible(false);
// just to initialize context, ugly-ish
_preview_renderer->setModelOffscreen("world/wmo/azeroth/buildings/human_farm/farm.wmo");
_preview_renderer->renderToPixmap();
connect(ui->listfileTree->selectionModel(), &QItemSelectionModel::selectionChanged
,[=] (const QItemSelection& selected, const QItemSelection& deselected)
{
@@ -35,7 +48,7 @@ AssetBrowserWidget::AssetBrowserWidget(QWidget *parent)
auto path = index.data(Qt::UserRole).toString();
if (path.endsWith(".wmo") || path.endsWith(".m2"))
{
ui->openGLWidget->setModel(path.toStdString());
ui->viewport->setModel(path.toStdString());
}
}
}
@@ -45,7 +58,7 @@ AssetBrowserWidget::AssetBrowserWidget(QWidget *parent)
connect(ui->listfileTree, &QTreeView::expanded
,[this] (const QModelIndex& index)
{
for (int i = 0; i != _model->rowCount(index); ++i)
for (int i = 0; i != _sort_model->rowCount(index); ++i)
{
auto child = index.child(i, 0);
auto path = child.data(Qt::UserRole).toString();
@@ -54,7 +67,7 @@ AssetBrowserWidget::AssetBrowserWidget(QWidget *parent)
_preview_renderer->setModelOffscreen(path.toStdString());
auto preview_pixmap = _preview_renderer->renderToPixmap();
auto item = _model->itemFromIndex(child);
auto item = _model->itemFromIndex(_sort_model->mapToSource(child));
item->setIcon(QIcon(*preview_pixmap));
}
}
@@ -62,6 +75,14 @@ AssetBrowserWidget::AssetBrowserWidget(QWidget *parent)
);
// Handle search
connect(ui->searchButton, &QPushButton::clicked
,[this]()
{
_sort_model->setFilterFixedString(ui->searchField->text());
}
);
auto start = std::chrono::high_resolution_clock::now();
@@ -120,6 +141,9 @@ void AssetBrowserWidget::updateModelData()
QSettings settings;
QString project_dir = settings.value("project/path").toString();
recurseDirectory(tree_mgr, project_dir, project_dir);
_sort_model->setSortRole(Qt::UserRole);
_sort_model->sort(0, Qt::AscendingOrder);
}
AssetBrowserWidget::~AssetBrowserWidget()

View File

@@ -7,6 +7,7 @@
#include <QWidget>
#include <QStandardItemModel>
#include <QSortFilterProxyModel>
namespace noggit
@@ -22,6 +23,7 @@ namespace noggit
private:
::Ui::AssetBrowser* ui;
QStandardItemModel* _model;
QSortFilterProxyModel* _sort_model;
PreviewRenderer* _preview_renderer;

View File

@@ -16,51 +16,115 @@
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QTreeView" name="listfileTree">
<property name="sizeIncrement">
<size>
<width>1</width>
<height>1</height>
</size>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="alternatingRowColors">
<bool>false</bool>
</property>
<property name="iconSize">
<size>
<width>64</width>
<height>64</height>
</size>
</property>
<property name="uniformRowHeights">
<bool>false</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="animated">
<bool>true</bool>
</property>
<property name="headerHidden">
<bool>true</bool>
</property>
<property name="expandsOnDoubleClick">
<bool>false</bool>
</property>
<widget class="QWidget" name="verticalLayoutWidget">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLineEdit" name="searchField"/>
</item>
<item>
<widget class="QPushButton" name="searchButton">
<property name="text">
<string>Search</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTreeView" name="listfileTree">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>15</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>280</width>
<height>0</height>
</size>
</property>
<property name="sizeIncrement">
<size>
<width>1</width>
<height>1</height>
</size>
</property>
<property name="baseSize">
<size>
<width>560</width>
<height>0</height>
</size>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="alternatingRowColors">
<bool>false</bool>
</property>
<property name="iconSize">
<size>
<width>64</width>
<height>64</height>
</size>
</property>
<property name="uniformRowHeights">
<bool>false</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="animated">
<bool>true</bool>
</property>
<property name="headerHidden">
<bool>true</bool>
</property>
<property name="expandsOnDoubleClick">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="noggit::Red::AssetBrowser::ModelViewer" name="openGLWidget">
<widget class="noggit::Red::AssetBrowser::ModelViewer" name="viewport">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>720</width>

View File

@@ -92,7 +92,7 @@ void PreviewRenderer::resetCamera()
radius = std::max((_camera.position - extents[0]).length(), (_camera.position - extents[1]).length());
float distance_factor = abs( aspect_ratio() * radius / sin(_camera.fov()._ / 2.f));
_camera.move_forward_factor(-1.f, distance_factor);
_camera.move_forward_factor(-1.f, 0.75f * distance_factor);
}
@@ -366,12 +366,18 @@ QPixmap* PreviewRenderer::renderToPixmap()
auto& async_loader = AsyncLoader::instance();
while(async_loader.is_loading())
do
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
std::this_thread::sleep_for(std::chrono::nanoseconds (10));
gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
draw();
}
} while (async_loader.is_loading());
// Clearing alpha from image
gl.colorMask(false, false, false, true);
gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
gl.colorMask(true, true, true, true);
QPixmap result{};
result = std::move(QPixmap::fromImage(pixel_buffer.toImage()));