implement dark theme

minimap creator: make filters work
This commit is contained in:
Skarn
2020-10-27 01:43:00 +03:00
parent 5761b56a0e
commit 7f21eb0bd3
9 changed files with 665 additions and 67 deletions

View File

@@ -209,10 +209,11 @@ ENDIF()
includePlattform("postfind")
include_directories ("${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/tmp")
include_directories(PRIVATE ${CMAKE_BINARY_DIR})
include_directories(PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
# And do the job.
INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/src" )
INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/src/noggit/ui/style/framelesswindow" )
COLLECT_FILES(false noggit_root_sources src/noggit .cpp)
COLLECT_FILES(true noggit_ui_sources src/noggit/ui .cpp)
COLLECT_FILES(false math_sources src/math .cpp)

View File

@@ -2373,7 +2373,7 @@ selection_result MapView::intersect_result(bool terrain_only)
( model_view().transposed()
, intersect_ray()
, terrain_only
, terrainMode == editing_mode::object
, terrainMode == editing_mode::object || terrainMode == editing_mode::minimap
, _draw_terrain.get()
, _draw_wmo.get()
, _draw_models.get()

View File

@@ -1911,7 +1911,7 @@ void World::drawMinimap ( MapTile *tile
}
// M2s / models
if (settings->draw_m2)
if (settings->draw_m2 || settings->use_filters)
{
if (need_model_updates)
@@ -1936,10 +1936,54 @@ void World::drawMinimap ( MapTile *tile
for (auto &it : _models_by_filename)
{
std::vector<ModelInstance*> instances;
if (settings->use_filters)
{
instances = it.second;
for (auto instance : it.second)
{
bool found_model = false;
bool found_instance = false;
for (int i = 0; i < settings->m2_model_filter_include->count(); ++i)
{
auto item_wgt_m = reinterpret_cast<noggit::ui::MinimapM2ModelFilterEntry *>(
settings->m2_model_filter_include->itemWidget(settings->m2_model_filter_include->item(i)));
if (item_wgt_m->getFileName().toStdString() == instance->model->filename
&& item_wgt_m->getSizeCategory() <= instance->size_cat)
{
found_model = true;
}
}
for (int i = 0; i < settings->m2_instance_filter_include->count(); ++i)
{
auto item_wgt_i = reinterpret_cast<noggit::ui::MinimapInstanceFilterEntry*>(
settings->m2_instance_filter_include->itemWidget(settings->m2_instance_filter_include->item(i)));
if (item_wgt_i->getUid() == instance->uid)
{
found_instance = true;
}
}
if (!(found_model || found_instance))
{
std::vector<ModelInstance*>::iterator position = std::find(instances.begin(), instances.end(), instance);
if (position != instances.end())
{
instances.erase(position);
}
}
}
}
it.second[0]->model->wait_until_loaded();
it.second[0]->model->draw(model_view, it.second, m2_shader, frustum, culldistance, camera_pos, false,
animtime, false, false, model_with_particles,
model_boxes_to_draw, display_mode::in_2D
it.second[0]->model->draw(model_view, settings->use_filters ? instances : it.second, m2_shader, frustum,
culldistance, camera_pos, false,animtime, false,
false, model_with_particles,model_boxes_to_draw, display_mode::in_2D
);
}
@@ -1984,16 +2028,52 @@ void World::drawMinimap ( MapTile *tile
wmo_program.uniform("exterior_diffuse_color", diffuse_color);
wmo_program.uniform("exterior_ambient_color", ambient_color);
_model_instance_storage.for_each_wmo_instance([&](WMOInstance &wmo)
{
wmo.wmo->wait_until_loaded();
wmo.draw(wmo_program, model_view, projection, frustum,
culldistance, camera_pos, false, false,
false, _liquid_render.get(), current_selection(),
animtime, skies->hasSkies(), display_mode::in_2D
);
_model_instance_storage.for_each_wmo_instance(
[&](WMOInstance &wmo)
{
if (settings->use_filters)
{
bool found_model = false;
bool found_instance = false;
});
for (int i = 0; i < settings->wmo_model_filter_exclude->count(); ++i)
{
auto item_wgt_m = reinterpret_cast<noggit::ui::MinimapWMOModelFilterEntry*>(
settings->wmo_model_filter_exclude->itemWidget(settings->wmo_model_filter_exclude->item(i)));
if (item_wgt_m->getFileName().toStdString() == wmo.wmo->filename)
{
found_model = true;
}
}
for (int i = 0; i < settings->wmo_instance_filter_exclude->count(); ++i)
{
auto item_wgt_i = reinterpret_cast<noggit::ui::MinimapInstanceFilterEntry*>(
settings->wmo_instance_filter_exclude->itemWidget(settings->wmo_instance_filter_exclude->item(i)));
if (item_wgt_i->getUid() == wmo.mUniqueID)
{
found_instance = true;
}
}
// For WMOs we exclude models from rendering
if (found_model || found_instance)
{
return;
}
}
wmo.wmo->wait_until_loaded();
wmo.draw(wmo_program, model_view, projection, frustum,
culldistance, camera_pos, false, false,
false, _liquid_render.get(), current_selection(),
animtime, skies->hasSkies(), display_mode::in_2D
);
});
gl.enable(GL_BLEND);
gl.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

View File

@@ -161,6 +161,7 @@ public:
boost::optional<selection_type> get_last_selected_model() const;
bool has_selection() const { return !_current_selection.empty(); }
bool has_multiple_model_selected() const { return _selected_model_count > 1; }
int get_selected_model_count() const { return _selected_model_count; }
void set_current_selection(selection_type entry);
void add_to_selection(selection_type entry);
void remove_from_selection(selection_type entry);

View File

@@ -290,19 +290,9 @@ Noggit::Noggit(int argc, char *argv[])
qApp->setStyle(new DarkStyle);
// create frameless window (and set windowState or title)
FramelessWindow framelessWindow;
framelessWindow.setWindowState(Qt::WindowMaximized);
framelessWindow.setWindowTitle("Noggit Red");
//framelessWindow.setWindowIcon(a.style()->standardIcon(QStyle::SP_DesktopIcon));
main_window = std::make_unique<noggit::ui::main_window>();
// add the mainwindow to our custom frameless window
framelessWindow.setContent(main_window.get());
framelessWindow.showMaximized();
/*if (fullscreen)
if (fullscreen)
{
main_window->showFullScreen();
}
@@ -310,7 +300,6 @@ Noggit::Noggit(int argc, char *argv[])
{
main_window->showMaximized();
}
*/
}
namespace
@@ -366,12 +355,5 @@ int main(int argc, char *argv[])
Noggit app (argc, argv);
QFile File("./themes/dark/theme.qss");
File.open(QFile::ReadOnly);
QString StyleSheet = QLatin1String(File.readAll());
qapp.setStyleSheet(StyleSheet);
return qapp.exec();
}

View File

@@ -70,7 +70,8 @@ enum class editing_mode
water,
mccv,
object,
minimap
minimap,
stamp
};
enum water_opacity

View File

@@ -125,42 +125,164 @@ namespace noggit
draw_elevation->setChecked(_render_settings.draw_elevation);
render_settings_box_layout->addRow (draw_elevation);
auto use_filters = new QCheckBox("Use filters", render_settings_box);
use_filters->setChecked(_render_settings.use_filters);
render_settings_box_layout->addRow (use_filters);
_progress_bar = new QProgressBar(this);
_progress_bar->setRange(0, 4096);
generate_layout->addRow (_progress_bar);
// Filter
auto filter_widget = new QWidget(this);
filter_widget->setContentsMargins(0, 0, 0, 0);
auto filter_layout = new QFormLayout(filter_widget);
filter_layout->setContentsMargins(0, 0, 0, 0);
settings_tabs->addTab(filter_widget, "Filter");
auto m2_include_box = new QGroupBox("Render options", filter_widget);
filter_layout->addRow(m2_include_box);
auto filter_tabs = new QTabWidget(filter_widget);
filter_tabs->setTabPosition(QTabWidget::East);
filter_tabs->setDocumentMode(true);
filter_layout->addRow(filter_tabs);
auto m2_include_box_layout = new QFormLayout (m2_include_box);
// M2 model include tab
auto m2_include_widget = new QWidget(filter_tabs);
filter_tabs->addTab(m2_include_widget, "M2 Model");
_m2_model_filter_include = new QListWidget(m2_include_box);
auto m2_include_box_layout = new QFormLayout(m2_include_widget);
m2_include_box_layout->setContentsMargins(0, 0, 0, 0);
m2_include_widget->setLayout(m2_include_box_layout);
auto search_filter_m2 = new QLineEdit(this);
search_filter_m2->setMinimumWidth(220);
m2_include_box_layout->addRow("Filter:", search_filter_m2);
_m2_model_filter_include = new QListWidget(m2_include_widget);
_render_settings.m2_model_filter_include = _m2_model_filter_include;
_m2_model_filter_include->setAlternatingRowColors(true);
m2_include_box_layout->addRow(_m2_model_filter_include);
auto m2_include_box_layout_btns = new QHBoxLayout(m2_include_box);
auto m2_include_box_layout_btns = new QHBoxLayout(m2_include_widget);
m2_include_box_layout->addRow(m2_include_box_layout_btns);
auto add_btn = new QPushButton(m2_include_box);
auto add_btn = new QPushButton("Add", m2_include_widget);
add_btn->setIcon(font_awesome_icon(font_awesome::plus));
m2_include_box_layout_btns->addWidget(add_btn);
auto remove_btn = new QPushButton(m2_include_box);
auto remove_btn = new QPushButton("Remove", m2_include_widget);
remove_btn->setIcon(font_awesome_icon(font_awesome::timescircle));
m2_include_box_layout_btns->addWidget(remove_btn);
auto clear_btn = new QPushButton("Clear all", m2_include_widget);
clear_btn->setIcon(font_awesome_icon(font_awesome::trash));
m2_include_box_layout_btns->addWidget(clear_btn);
// M2 instance include tab
auto m2_instance_include_widget = new QWidget(filter_tabs);
filter_tabs->addTab(m2_instance_include_widget, "M2 Instance");
auto m2_instance_include_box_layout = new QFormLayout(m2_instance_include_widget);
m2_instance_include_box_layout->setContentsMargins(0, 0, 0, 0);
m2_instance_include_widget->setLayout(m2_instance_include_box_layout);
auto search_filter_m2i = new QLineEdit(this);
search_filter_m2i->setMinimumWidth(220);
m2_instance_include_box_layout->addRow("Filter:", search_filter_m2i);
_m2_instance_filter_include = new QListWidget(m2_instance_include_widget);
_render_settings.m2_instance_filter_include = _m2_instance_filter_include;
_m2_instance_filter_include->setAlternatingRowColors(true);
m2_instance_include_box_layout->addRow(_m2_instance_filter_include);
auto m2_instance_include_box_layout_btns = new QHBoxLayout(m2_instance_include_widget);
m2_instance_include_box_layout->addRow(m2_instance_include_box_layout_btns);
auto add_btn_m2i = new QPushButton("Add", m2_instance_include_widget);
add_btn_m2i->setIcon(font_awesome_icon(font_awesome::plus));
m2_instance_include_box_layout_btns->addWidget(add_btn_m2i);
auto remove_btn_m2i = new QPushButton("Remove", m2_instance_include_widget);
remove_btn_m2i->setIcon(font_awesome_icon(font_awesome::timescircle));
m2_instance_include_box_layout_btns->addWidget(remove_btn_m2i);
auto clear_btn_m2i = new QPushButton("Clear all", m2_instance_include_widget);
clear_btn_m2i->setIcon(font_awesome_icon(font_awesome::trash));
m2_instance_include_box_layout_btns->addWidget(clear_btn_m2i);
// WMO model exclude tab
auto wmo_exclude_widget = new QWidget(filter_tabs);
filter_tabs->addTab(wmo_exclude_widget, "WMO Model");
auto wmo_exclude_box_layout = new QFormLayout(wmo_exclude_widget);
wmo_exclude_box_layout->setContentsMargins(0, 0, 0, 0);
wmo_exclude_widget->setLayout(wmo_exclude_box_layout);
auto search_filter_wmo = new QLineEdit(this);
search_filter_wmo->setMinimumWidth(220);
wmo_exclude_box_layout->addRow("Filter:", search_filter_wmo);
_wmo_model_filter_exclude = new QListWidget(wmo_exclude_widget);
_render_settings.wmo_model_filter_exclude = _wmo_model_filter_exclude;
_wmo_model_filter_exclude->setAlternatingRowColors(true);
wmo_exclude_box_layout->addRow(_wmo_model_filter_exclude);
auto wmo_exclude_box_layout_btns = new QHBoxLayout(wmo_exclude_widget);
wmo_exclude_box_layout->addRow(wmo_exclude_box_layout_btns);
auto add_btn_wmo = new QPushButton("Add", wmo_exclude_widget);
add_btn_wmo->setIcon(font_awesome_icon(font_awesome::plus));
wmo_exclude_box_layout_btns->addWidget(add_btn_wmo);
auto remove_btn_wmo = new QPushButton("Remove", wmo_exclude_widget);
remove_btn_wmo->setIcon(font_awesome_icon(font_awesome::timescircle));
wmo_exclude_box_layout_btns->addWidget(remove_btn_wmo);
auto clear_btn_wmo = new QPushButton("Clear all", wmo_exclude_widget);
clear_btn_wmo->setIcon(font_awesome_icon(font_awesome::trash));
wmo_exclude_box_layout_btns->addWidget(clear_btn_wmo);
// WMO instance exclude tab
auto wmo_instance_exclude_widget = new QWidget(filter_tabs);
filter_tabs->addTab(wmo_instance_exclude_widget, "WMO Instance");
auto wmo_instance_exclude_box_layout = new QFormLayout(wmo_instance_exclude_widget);
wmo_instance_exclude_box_layout->setContentsMargins(0, 0, 0, 0);
wmo_instance_exclude_widget->setLayout(wmo_instance_exclude_box_layout);
auto search_filter_wmo_i = new QLineEdit(this);
search_filter_wmo_i->setMinimumWidth(220);
wmo_instance_exclude_box_layout->addRow("Filter:", search_filter_wmo_i);
_wmo_instance_filter_exclude = new QListWidget(wmo_instance_exclude_widget);
_render_settings.wmo_instance_filter_exclude = _wmo_instance_filter_exclude;
_wmo_instance_filter_exclude->setAlternatingRowColors(true);
wmo_instance_exclude_box_layout->addRow(_wmo_instance_filter_exclude);
auto wmo_instance_exclude_box_layout_btns = new QHBoxLayout(wmo_instance_exclude_widget);
wmo_instance_exclude_box_layout->addRow(wmo_instance_exclude_box_layout_btns);
auto add_btn_wmo_i = new QPushButton("Add", wmo_instance_exclude_widget);
add_btn_wmo_i->setIcon(font_awesome_icon(font_awesome::plus));
wmo_instance_exclude_box_layout_btns->addWidget(add_btn_wmo_i);
auto remove_btn_wmo_i = new QPushButton("Remove", wmo_instance_exclude_widget);
remove_btn_wmo_i->setIcon(font_awesome_icon(font_awesome::timescircle));
wmo_instance_exclude_box_layout_btns->addWidget(remove_btn_wmo_i);
auto clear_btn_wmo_i = new QPushButton("Clear all", wmo_instance_exclude_widget);
clear_btn_wmo_i->setIcon(font_awesome_icon(font_awesome::trash));
wmo_instance_exclude_box_layout_btns->addWidget(clear_btn_wmo_i);
// Connections
// Filter buttons
// M2 model filter
connect(add_btn, &QPushButton::clicked,
[=]()
{
@@ -171,17 +293,9 @@ namespace noggit
for (auto& selection : world->current_selection())
{
if (selection.which() == eEntry_MapChunk)
{
continue;
}
std::string path;
if (selection.which() == eEntry_Model)
{
path = boost::get<selected_model_type>(selection)->model->filename;
includeM2Model(path);
includeM2Model(boost::get<selected_model_type>(selection)->model->filename);
}
}
@@ -192,12 +306,98 @@ namespace noggit
connect(remove_btn, &QPushButton::clicked,
[=]()
{
for (auto item : _m2_model_filter_include->selectedItems())
if (!world->get_selected_model_count())
{
auto item_ = _m2_model_filter_include->takeItem(_m2_model_filter_include->row(item));
delete item_;
for (auto item : _m2_model_filter_include->selectedItems())
{
auto item_ = _m2_model_filter_include->takeItem(_m2_model_filter_include->row(item));
delete item_;
}
return;
}
for (auto& selection : world->current_selection())
{
if (selection.which() == eEntry_Model)
{
unincludeM2Model(boost::get<selected_model_type>(selection)->model->filename);
}
}
}
);
connect(clear_btn, &QPushButton::clicked,
[=]()
{
_m2_model_filter_include->clear();
}
);
// M2 instance filter
connect(add_btn_m2i, &QPushButton::clicked,
[=]()
{
if (!world->has_selection())
{
return;
}
for (auto& selection : world->current_selection())
{
if (selection.which() == eEntry_Model)
{
includeM2Instance(boost::get<selected_model_type>(selection)->uid);
}
}
}
);
connect(remove_btn_m2i, &QPushButton::clicked,
[=]()
{
if (!world->get_selected_model_count())
{
for (auto item : _m2_instance_filter_include->selectedItems())
{
auto item_ = _m2_instance_filter_include->takeItem(_m2_instance_filter_include->row(item));
delete item_;
}
return;
}
for (auto& selection : world->current_selection())
{
if (selection.which() == eEntry_Model)
{
unincludeM2Instance(boost::get<selected_model_type>(selection)->uid);
}
}
}
);
connect(clear_btn_m2i, &QPushButton::clicked,
[=]()
{
_m2_instance_filter_include->clear();
}
);
// WMO model filter
connect(add_btn_wmo, &QPushButton::clicked,
[=]()
{
if (!world->has_selection())
{
return;
@@ -205,17 +405,9 @@ namespace noggit
for (auto& selection : world->current_selection())
{
if (selection.which() == eEntry_MapChunk)
if (selection.which() == eEntry_WMO)
{
continue;
}
std::string path;
if (selection.which() == eEntry_Model)
{
path = boost::get<selected_model_type>(selection)->model->filename;
unincludeM2Model(path);
excludeWMOModel(boost::get<selected_wmo_type>(selection)->wmo->filename);
}
}
@@ -223,6 +415,163 @@ namespace noggit
}
);
connect(remove_btn_wmo, &QPushButton::clicked,
[=]()
{
if (!world->get_selected_model_count())
{
for (auto item : _wmo_model_filter_exclude->selectedItems())
{
auto item_ = _wmo_model_filter_exclude->takeItem(_wmo_model_filter_exclude->row(item));
delete item_;
}
return;
}
for (auto& selection : world->current_selection())
{
if (selection.which() == eEntry_WMO)
{
unexcludeWMOModel(boost::get<selected_wmo_type>(selection)->wmo->filename);
}
}
}
);
connect(clear_btn_wmo, &QPushButton::clicked,
[=]()
{
_wmo_model_filter_exclude->clear();
}
);
// WMO instance filter
connect(add_btn_wmo_i, &QPushButton::clicked,
[=]()
{
if (!world->has_selection())
{
return;
}
for (auto& selection : world->current_selection())
{
if (selection.which() == eEntry_WMO)
{
excludeWMOInstance(boost::get<selected_wmo_type>(selection)->mUniqueID);
}
}
}
);
connect(remove_btn_wmo_i, &QPushButton::clicked,
[=]()
{
if (!world->get_selected_model_count())
{
for (auto item : _wmo_instance_filter_exclude->selectedItems())
{
auto item_ = _wmo_instance_filter_exclude->takeItem(_wmo_instance_filter_exclude->row(item));
delete item_;
}
return;
}
for (auto& selection : world->current_selection())
{
if (selection.which() == eEntry_WMO)
{
unexcludeWMOInstance(boost::get<selected_wmo_type>(selection)->mUniqueID);
}
}
}
);
connect(clear_btn_wmo_i, &QPushButton::clicked,
[=]()
{
_wmo_instance_filter_exclude->clear();
}
);
// Search filters
connect ( search_filter_m2, qOverload<const QString&> (&QLineEdit::textChanged)
, [&] (const QString& s)
{
for (int i = 0; i < _m2_model_filter_include->count(); ++i)
{
MinimapM2ModelFilterEntry* item_wgt = reinterpret_cast<MinimapM2ModelFilterEntry*>(
_m2_model_filter_include->itemWidget(_m2_model_filter_include->item(i)));
std::string filename = item_wgt->getFileName().toStdString();
std::string filter = s.toStdString();
bool isHidden = !filter.empty() && filename.find(filter) == std::string::npos;
_m2_model_filter_include->item(i)->setHidden(isHidden);
}
}
);
connect ( search_filter_m2i, qOverload<const QString&> (&QLineEdit::textChanged)
, [&] (const QString& s)
{
for (int i = 0; i < _m2_instance_filter_include->count(); ++i)
{
MinimapInstanceFilterEntry* item_wgt = reinterpret_cast<MinimapInstanceFilterEntry*>(
_m2_instance_filter_include->itemWidget(_m2_instance_filter_include->item(i)));
std::string uid = std::to_string(item_wgt->getUid());
std::string filter = s.toStdString();
bool isHidden = !filter.empty() && uid.find(filter) == std::string::npos;
_m2_instance_filter_include->item(i)->setHidden(isHidden);
}
}
);
connect ( search_filter_wmo, qOverload<const QString&> (&QLineEdit::textChanged)
, [&] (const QString& s)
{
for (int i = 0; i < _wmo_model_filter_exclude->count(); ++i)
{
MinimapWMOModelFilterEntry* item_wgt = reinterpret_cast<MinimapWMOModelFilterEntry*>(
_wmo_model_filter_exclude->itemWidget(_wmo_model_filter_exclude->item(i)));
std::string filename = item_wgt->getFileName().toStdString();
std::string filter = s.toStdString();
bool isHidden = !filter.empty() && filename.find(filter) == std::string::npos;
_wmo_model_filter_exclude->item(i)->setHidden(isHidden);
}
}
);
connect ( search_filter_wmo_i, qOverload<const QString&> (&QLineEdit::textChanged)
, [&] (const QString& s)
{
for (int i = 0; i < _wmo_instance_filter_exclude->count(); ++i)
{
MinimapInstanceFilterEntry* item_wgt = reinterpret_cast<MinimapInstanceFilterEntry*>(
_wmo_instance_filter_exclude->itemWidget(_wmo_instance_filter_exclude->item(i)));
std::string uid = std::to_string(item_wgt->getUid());
std::string filter = s.toStdString();
bool isHidden = !filter.empty() && uid.find(filter) == std::string::npos;
_wmo_instance_filter_exclude->item(i)->setHidden(isHidden);
}
}
);
connect ( _radius_spin, qOverload<double> (&QDoubleSpinBox::valueChanged)
, [&] (double v)
{
@@ -275,6 +624,11 @@ namespace noggit
_render_settings.draw_elevation = s;
});
connect (use_filters, &QCheckBox::stateChanged, [this] (int s)
{
_render_settings.use_filters = s;
});
// Buttons
connect(cur_adt_btn, &QPushButton::clicked, [=]() {
_render_settings.export_mode = MinimapGenMode::CURRENT_ADT;
@@ -416,16 +770,154 @@ namespace noggit
}
void MinimapCreator::includeM2Instance(uint32_t uid)
{
bool already_added = false;
for (int i = 0; i < _m2_instance_filter_include->count(); ++i)
{
if (reinterpret_cast<MinimapInstanceFilterEntry*>(_m2_instance_filter_include->itemWidget(
_m2_instance_filter_include->item(i)))->getUid() == uid)
{
already_added = true;
break;
}
}
if (already_added)
{
return;
}
auto item = new QListWidgetItem();
_m2_instance_filter_include->addItem(item);
auto entry_wgt = new MinimapInstanceFilterEntry(this);
entry_wgt->setUid(uid);
item->setSizeHint(entry_wgt->minimumSizeHint());
_m2_instance_filter_include->setItemWidget(item, entry_wgt);
}
void MinimapCreator::unincludeM2Instance(uint32_t uid)
{
for (int i = 0; i < _m2_model_filter_include->count(); ++i )
{
if (reinterpret_cast<MinimapInstanceFilterEntry*>(_m2_instance_filter_include->itemWidget(
_m2_instance_filter_include->item(i)))->getUid() == uid)
{
auto item = _m2_model_filter_include->takeItem(i);
delete item;
}
}
}
void MinimapCreator::excludeWMOModel(std::string filename)
{
bool already_added = false;
for (int i = 0; i < _wmo_model_filter_exclude->count(); ++i)
{
if (!reinterpret_cast<MinimapWMOModelFilterEntry*>(_wmo_model_filter_exclude->itemWidget(
_wmo_model_filter_exclude->item(i)))->getFileName().toStdString().compare(filename))
{
already_added = true;
break;
}
}
if (already_added)
{
return;
}
auto item = new QListWidgetItem();
_wmo_model_filter_exclude->addItem(item);
auto entry_wgt = new MinimapWMOModelFilterEntry(this);
entry_wgt->setFileName(filename);
item->setSizeHint(entry_wgt->minimumSizeHint());
_wmo_model_filter_exclude->setItemWidget(item, entry_wgt);
}
void MinimapCreator::unexcludeWMOModel(std::string filename)
{
for (int i = 0; i < _wmo_model_filter_exclude->count(); ++i )
{
if (!reinterpret_cast<MinimapWMOModelFilterEntry*>(_wmo_model_filter_exclude->itemWidget(
_wmo_model_filter_exclude->item(i)))->getFileName().toStdString().compare(filename))
{
auto item = _wmo_model_filter_exclude->takeItem(i);
delete item;
}
}
}
void MinimapCreator::excludeWMOInstance(uint32_t uid)
{
bool already_added = false;
for (int i = 0; i < _wmo_instance_filter_exclude->count(); ++i)
{
if (reinterpret_cast<MinimapInstanceFilterEntry*>(_wmo_instance_filter_exclude->itemWidget(
_wmo_instance_filter_exclude->item(i)))->getUid() == uid)
{
already_added = true;
break;
}
}
if (already_added)
{
return;
}
auto item = new QListWidgetItem();
_wmo_instance_filter_exclude->addItem(item);
auto entry_wgt = new MinimapInstanceFilterEntry(this);
entry_wgt->setUid(uid);
item->setSizeHint(entry_wgt->minimumSizeHint());
_wmo_instance_filter_exclude->setItemWidget(item, entry_wgt);
}
void MinimapCreator::unexcludeWMOInstance(uint32_t uid)
{
for (int i = 0; i < _wmo_instance_filter_exclude->count(); ++i )
{
if (reinterpret_cast<MinimapInstanceFilterEntry*>(_wmo_instance_filter_exclude->itemWidget(
_wmo_instance_filter_exclude->item(i)))->getUid() == uid)
{
auto item = _wmo_instance_filter_exclude->takeItem(i);
delete item;
}
}
}
MinimapM2ModelFilterEntry::MinimapM2ModelFilterEntry(MinimapCreator* parent) : QWidget(parent)
{
auto layout = new QHBoxLayout(this);
layout->setContentsMargins(5, 2, 5, 2);
layout->addWidget(_filename = new QLineEdit(this));
_filename->setEnabled(false);
layout->addWidget(_size_category_spin = new QDoubleSpinBox(this));
_size_category_spin->setRange (0.0f, 100.0f);
_size_category_spin->setDecimals (2);
_size_category_spin->setRange (0.0f, 1000.0f);
_size_category_spin->setValue (0.0);
}
MinimapWMOModelFilterEntry::MinimapWMOModelFilterEntry(MinimapCreator* parent) : QWidget(parent)
{
auto layout = new QHBoxLayout(this);
layout->addWidget(_filename = new QLineEdit(this));
layout->setContentsMargins(5, 2, 5, 2);
_filename->setEnabled(false);
}
MinimapInstanceFilterEntry::MinimapInstanceFilterEntry(MinimapCreator* parent) : QWidget(parent)
{
auto layout = new QHBoxLayout(this);
layout->addWidget(_uid_label = new QLabel(this));
layout->setContentsMargins(5, 2, 5, 2);
}
}
}

View File

@@ -6,6 +6,7 @@
#include <QWidget>
#include <QtWidgets/QSlider>
#include <QDoubleSpinBox>
#include <QSpinBox>
#include <QProgressBar>
#include <QLineEdit>
#include <QListWidget>
@@ -39,10 +40,14 @@ struct MinimapRenderSettings
bool draw_water = true;
bool draw_adt_grid = false;
bool draw_elevation = false;
bool use_filters = false;
std::array<bool, 4096> selected_tiles = {false};
QListWidget* m2_model_filter_include;
QListWidget* m2_instance_filter_include;
QListWidget* wmo_model_filter_exclude;
QListWidget* wmo_instance_filter_exclude;
// Filtering
/*
@@ -82,6 +87,14 @@ namespace noggit
void includeM2Model(std::string filename);
void unincludeM2Model(std::string filename);
void includeM2Instance(uint32_t uid);
void unincludeM2Instance(uint32_t uid);
void excludeWMOModel(std::string filename);
void unexcludeWMOModel(std::string filename);
void excludeWMOInstance(uint32_t uid);
void unexcludeWMOInstance(uint32_t uid);
private:
float _radius = 0.01f;
@@ -91,6 +104,9 @@ namespace noggit
minimap_widget* _minimap_widget;
QProgressBar* _progress_bar;
QListWidget* _m2_model_filter_include;
QListWidget* _m2_instance_filter_include;
QListWidget* _wmo_model_filter_exclude;
QListWidget* _wmo_instance_filter_exclude;
};
@@ -107,5 +123,30 @@ namespace noggit
QLineEdit* _filename;
QDoubleSpinBox* _size_category_spin;
};
class MinimapWMOModelFilterEntry : public QWidget
{
public:
MinimapWMOModelFilterEntry(MinimapCreator* parent = nullptr);
QString getFileName() { return _filename->text(); };
void setFileName(const std::string& filename) { _filename->setText(QString(filename.c_str())); };
private:
QLineEdit* _filename;
};
class MinimapInstanceFilterEntry : public QWidget
{
public:
MinimapInstanceFilterEntry(MinimapCreator* parent = nullptr);
uint32_t getUid() { return _uid; };
void setUid(uint32_t uid) { _uid = uid; _uid_label->setText(QString::fromStdString(std::to_string(uid))); };
private:
uint32_t _uid;
QLabel* _uid_label;
};
}
}

View File

@@ -20,7 +20,7 @@ namespace noggit
add_tool_icon (editing_mode::mccv, tr("Vertex Painter"), font_noggit::TOOL_VERTEX_PAINT);
add_tool_icon (editing_mode::object, tr("Object Editor"), font_noggit::TOOL_OBJECT_EDITOR);
add_tool_icon (editing_mode::minimap, tr("Minimap Editor"), font_noggit::TOOL_MINIMAP_EDITOR);
add_tool_icon(editing_mode::stamp, tr("Stamp Mode"), font_noggit::TOOL_STAMP);
add_tool_icon(editing_mode::stamp, tr("Stamp Mode"), font_noggit::TOOL_STAMP);
}
void toolbar::add_tool_icon(editing_mode mode, const QString& name, const font_noggit::icons& icon)