asset browser: implement filtering
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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()));
|
||||
|
||||
Reference in New Issue
Block a user