1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-04-27 10:06:49 +00:00

Use std::variant and std::visit instead of function overloads, add float type search, fix QMetaType and Type conversion

This commit is contained in:
unelsson 2023-01-26 00:05:51 +02:00
parent ba6c47bb07
commit 9b808a495c
8 changed files with 89 additions and 87 deletions

View file

@ -1,6 +1,7 @@
#include "editwidget.hpp" #include "editwidget.hpp"
#include <sstream> #include <sstream>
#include <variant>
#include <QAction> #include <QAction>
#include <QApplication> #include <QApplication>
@ -8,6 +9,7 @@
#include <QMenu> #include <QMenu>
#include <QRegularExpression> #include <QRegularExpression>
#include <QString> #include <QString>
#include <QVariant>
#include <apps/opencs/model/filter/parser.hpp> #include <apps/opencs/model/filter/parser.hpp>
#include <apps/opencs/model/world/universalid.hpp> #include <apps/opencs/model/world/universalid.hpp>
@ -95,9 +97,21 @@ void CSVFilter::EditWidget::filterRowsInserted(const QModelIndex& parent, int st
} }
void CSVFilter::EditWidget::createFilterRequest( void CSVFilter::EditWidget::createFilterRequest(
std::vector<std::pair<std::string, std::vector<std::string>>>& filterSource, Qt::DropAction action, std::string stringOrValue) std::vector<std::pair<std::variant<std::string, QVariant>, std::vector<std::string>>>& filterSource,
Qt::DropAction action)
{ {
const unsigned count = filterSource.size(); std::string stringOrValue = "string";
std::vector<std::pair<std::string, std::vector<std::string>>> newFilter;
for (auto pair : filterSource)
{
std::string searchString = std::visit(FilterVisitor(), pair.first).first;
stringOrValue = std::visit(FilterVisitor(), pair.first).second;
std::vector<std::string> column = pair.second;
newFilter.emplace_back(std::make_pair(searchString, column));
}
const unsigned count = newFilter.size();
bool multipleElements = false; bool multipleElements = false;
switch (count) // setting multipleElements; switch (count) // setting multipleElements;
@ -165,7 +179,7 @@ void CSVFilter::EditWidget::createFilterRequest(
for (unsigned i = 0; i < count; ++i) for (unsigned i = 0; i < count; ++i)
{ {
ss << generateFilter(filterSource[i], stringOrValue); ss << generateFilter(newFilter[i], stringOrValue);
if (i + 1 != count) if (i + 1 != count)
{ {
@ -186,7 +200,7 @@ void CSVFilter::EditWidget::createFilterRequest(
ss << '!'; ss << '!';
} }
ss << generateFilter(filterSource[0], stringOrValue); ss << generateFilter(newFilter[0], stringOrValue);
if (!replaceMode) if (!replaceMode)
{ {
@ -201,21 +215,8 @@ void CSVFilter::EditWidget::createFilterRequest(
} }
} }
void CSVFilter::EditWidget::createFilterRequest( std::string CSVFilter::EditWidget::generateFilter(
std::vector<std::pair<int, std::vector<std::string>>>& filterSource, Qt::DropAction action) std::pair<std::string, std::vector<std::string>>& seekedString, std::string stringOrValue) const
{
std::vector<std::pair<std::string, std::vector<std::string>>> convertedFilter;
std::string stringOrValue = "value";
for (auto pair : filterSource)
{
std::string a = std::to_string(pair.first);
std::vector<std::string> b = pair.second;
convertedFilter.emplace_back(std::make_pair (a, b));
}
createFilterRequest(convertedFilter, action, stringOrValue);
}
std::string CSVFilter::EditWidget::generateFilter(std::pair<std::string, std::vector<std::string>>& seekedString, std::string stringOrValue) const
{ {
const unsigned columns = seekedString.second.size(); const unsigned columns = seekedString.second.size();
@ -235,7 +236,8 @@ std::string CSVFilter::EditWidget::generateFilter(std::pair<std::string, std::ve
} }
std::string quotesResolved = seekedString.first; std::string quotesResolved = seekedString.first;
if (stringOrValue == "string") quotesResolved = '"' + seekedString.first + '"'; if (stringOrValue == "string")
quotesResolved = '"' + seekedString.first + '"';
std::stringstream ss; std::stringstream ss;
if (multipleColumns) if (multipleColumns)

View file

@ -3,10 +3,12 @@
#include <QLineEdit> #include <QLineEdit>
#include <QPalette> #include <QPalette>
#include <QVariant>
#include <memory> #include <memory>
#include <string> #include <string>
#include <utility> #include <utility>
#include <variant>
#include <vector> #include <vector>
#include "../../model/filter/parser.hpp" #include "../../model/filter/parser.hpp"
@ -29,6 +31,26 @@ namespace CSMWorld
namespace CSVFilter namespace CSVFilter
{ {
struct FilterVisitor
{
std::pair<std::string, std::string> operator()(const std::string& stringData)
{
std::string stringOrValue = "string";
return std::make_pair(stringData, stringOrValue);
}
std::pair<std::string, std::string> operator()(const QVariant& variantData)
{
std::string stringOrValue;
QMetaType::Type dataType = static_cast<QMetaType::Type>(variantData.type());
if (dataType == QMetaType::QString || dataType == QMetaType::Bool || dataType == QMetaType::Int)
stringOrValue = "string";
if (dataType == QMetaType::Int || dataType == QMetaType::Float)
stringOrValue = "value";
return std::make_pair(variantData.toString().toStdString(), stringOrValue);
}
};
class EditWidget : public QLineEdit class EditWidget : public QLineEdit
{ {
Q_OBJECT Q_OBJECT
@ -44,17 +66,16 @@ namespace CSVFilter
EditWidget(CSMWorld::Data& data, QWidget* parent = nullptr); EditWidget(CSMWorld::Data& data, QWidget* parent = nullptr);
void createFilterRequest( void createFilterRequest(
std::vector<std::pair<std::string, std::vector<std::string>>>& filterSource, Qt::DropAction action, std::string stringOrValue = "string"); std::vector<std::pair<std::variant<std::string, QVariant>, std::vector<std::string>>>& filterSource,
Qt::DropAction action);
void createFilterRequest(
std::vector<std::pair<int, std::vector<std::string>>>& filterSource, Qt::DropAction action);
signals: signals:
void filterChanged(std::shared_ptr<CSMFilter::Node> filter); void filterChanged(std::shared_ptr<CSMFilter::Node> filter);
private: private:
std::string generateFilter(std::pair<std::string, std::vector<std::string>>& seekedString, std::string stringOrValue) const; std::string generateFilter(
std::pair<std::string, std::vector<std::string>>& seekedString, std::string stringOrValue) const;
void contextMenuEvent(QContextMenuEvent* event) override; void contextMenuEvent(QContextMenuEvent* event) override;

View file

@ -2,10 +2,12 @@
#include <string> #include <string>
#include <utility> #include <utility>
#include <variant>
#include <vector> #include <vector>
#include <QDragEnterEvent> #include <QDragEnterEvent>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QVariant>
#include "recordfilterbox.hpp" #include "recordfilterbox.hpp"
@ -48,21 +50,15 @@ void CSVFilter::FilterBox::dropEvent(QDropEvent* event)
QModelIndex index = mime->getIndexAtDragStart(); QModelIndex index = mime->getIndexAtDragStart();
const CSVWorld::DragRecordTable* dragTable = mime->getTableOfDragStart(); const CSVWorld::DragRecordTable* dragTable = mime->getTableOfDragStart();
std::string searchString = ""; QVariant qData;
std::string searchColumn = ""; std::string searchColumn;
bool isValue(false);
if (index.isValid() && dragTable) if (index.isValid() && dragTable)
{ {
QVariant::Type dataType = dragTable->model()->data(index).type(); qData = dragTable->model()->data(index);
searchColumn = dragTable->model()->headerData(index.column(), Qt::Horizontal).toString().toStdString(); searchColumn = dragTable->model()->headerData(index.column(), Qt::Horizontal).toString().toStdString();
Log(Debug::Warning) << "Data: " << searchString;
Log(Debug::Warning) << "Header: " << searchColumn;
Log(Debug::Warning) << "Type:" << dataType;
if (dataType == QMetaType::QString || dataType == QMetaType::Bool || dataType == QMetaType::Int) searchString = dragTable->model()->data(index).toString().toStdString();
if (dataType == QMetaType::Int) isValue = true;
} }
emit recordDropped(universalIdData, event->proposedAction(), searchString, searchColumn, isValue); emit recordDropped(universalIdData, std::make_pair(qData, searchColumn), event->proposedAction());
} }
void CSVFilter::FilterBox::dragEnterEvent(QDragEnterEvent* event) void CSVFilter::FilterBox::dragEnterEvent(QDragEnterEvent* event)
@ -76,13 +72,8 @@ void CSVFilter::FilterBox::dragMoveEvent(QDragMoveEvent* event)
} }
void CSVFilter::FilterBox::createFilterRequest( void CSVFilter::FilterBox::createFilterRequest(
std::vector<std::pair<std::string, std::vector<std::string>>>& filterSource, Qt::DropAction action) std::vector<std::pair<std::variant<std::string, QVariant>, std::vector<std::string>>>& filterSource,
{ Qt::DropAction action)
mRecordFilterBox->createFilterRequest(filterSource, action);
}
void CSVFilter::FilterBox::createFilterRequest(
std::vector<std::pair<int, std::vector<std::string>>>& filterSource, Qt::DropAction action)
{ {
mRecordFilterBox->createFilterRequest(filterSource, action); mRecordFilterBox->createFilterRequest(filterSource, action);
} }

View file

@ -4,8 +4,10 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include <utility> #include <utility>
#include <variant>
#include <vector> #include <vector>
#include <QVariant>
#include <QWidget> #include <QWidget>
class QDragEnterEvent; class QDragEnterEvent;
@ -39,10 +41,8 @@ namespace CSVFilter
void setRecordFilter(const std::string& filter); void setRecordFilter(const std::string& filter);
void createFilterRequest( void createFilterRequest(
std::vector<std::pair<std::string, std::vector<std::string>>>& filterSource, Qt::DropAction action); std::vector<std::pair<std::variant<std::string, QVariant>, std::vector<std::string>>>& filterSource,
Qt::DropAction action);
void createFilterRequest(
std::vector<std::pair<int, std::vector<std::string>>>& filterSource, Qt::DropAction action);
private: private:
void dragEnterEvent(QDragEnterEvent* event) override; void dragEnterEvent(QDragEnterEvent* event) override;
@ -53,8 +53,8 @@ namespace CSVFilter
signals: signals:
void recordFilterChanged(std::shared_ptr<CSMFilter::Node> filter); void recordFilterChanged(std::shared_ptr<CSMFilter::Node> filter);
void recordDropped(std::vector<CSMWorld::UniversalId>& types, Qt::DropAction action, void recordDropped(std::vector<CSMWorld::UniversalId>& types, std::pair<QVariant, std::string> columnSearchData,
const std::string& searchString, const std::string& searchColumn, bool isValue); Qt::DropAction action);
}; };
} }

View file

@ -1,7 +1,10 @@
#include "recordfilterbox.hpp" #include "recordfilterbox.hpp"
#include <variant>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QLabel> #include <QLabel>
#include <QVariant>
#include "editwidget.hpp" #include "editwidget.hpp"
@ -32,13 +35,8 @@ void CSVFilter::RecordFilterBox::setFilter(const std::string& filter)
} }
void CSVFilter::RecordFilterBox::createFilterRequest( void CSVFilter::RecordFilterBox::createFilterRequest(
std::vector<std::pair<std::string, std::vector<std::string>>>& filterSource, Qt::DropAction action) std::vector<std::pair<std::variant<std::string, QVariant>, std::vector<std::string>>>& filterSource,
{ Qt::DropAction action)
mEdit->createFilterRequest(filterSource, action);
}
void CSVFilter::RecordFilterBox::createFilterRequest(
std::vector<std::pair<int, std::vector<std::string>>>& filterSource, Qt::DropAction action)
{ {
mEdit->createFilterRequest(filterSource, action); mEdit->createFilterRequest(filterSource, action);
} }

View file

@ -4,8 +4,10 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include <utility> #include <utility>
#include <variant>
#include <vector> #include <vector>
#include <QVariant>
#include <QWidget> #include <QWidget>
namespace CSMFilter namespace CSMFilter
@ -36,10 +38,8 @@ namespace CSVFilter
void useFilterRequest(const std::string& idOfFilter); void useFilterRequest(const std::string& idOfFilter);
void createFilterRequest( void createFilterRequest(
std::vector<std::pair<std::string, std::vector<std::string>>>& filterSource, Qt::DropAction action); std::vector<std::pair<std::variant<std::string, QVariant>, std::vector<std::string>>>& filterSource,
Qt::DropAction action);
void createFilterRequest(
std::vector<std::pair<int, std::vector<std::string>>>& filterSource, Qt::DropAction action);
signals: signals:

View file

@ -9,9 +9,11 @@
#include <QPushButton> #include <QPushButton>
#include <QScreen> #include <QScreen>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QVariant>
#include <algorithm> #include <algorithm>
#include <utility> #include <utility>
#include <variant>
#include <apps/opencs/view/doc/subview.hpp> #include <apps/opencs/view/doc/subview.hpp>
@ -152,10 +154,10 @@ void CSVWorld::TableSubView::cloneRequest(const CSMWorld::UniversalId& toClone)
emit cloneRequest(toClone.getId(), toClone.getType()); emit cloneRequest(toClone.getId(), toClone.getType());
} }
void CSVWorld::TableSubView::createFilterRequest(std::vector<CSMWorld::UniversalId>& types, Qt::DropAction action, void CSVWorld::TableSubView::createFilterRequest(
const std::string& searchString, const std::string& searchColumn, bool isValue) std::vector<CSMWorld::UniversalId>& types, std::pair<QVariant, std::string> columnSearchData, Qt::DropAction action)
{ {
std::vector<std::pair<std::string, std::vector<std::string>>> filterSource; std::vector<std::pair<std::variant<std::string, QVariant>, std::vector<std::string>>> filterSource;
std::vector<std::string> refIdColumns = mTable->getColumnsWithDisplay( std::vector<std::string> refIdColumns = mTable->getColumnsWithDisplay(
CSMWorld::TableMimeData::convertEnums(CSMWorld::UniversalId::Type_Referenceable)); CSMWorld::TableMimeData::convertEnums(CSMWorld::UniversalId::Type_Referenceable));
@ -178,31 +180,18 @@ void CSVWorld::TableSubView::createFilterRequest(std::vector<CSMWorld::Universal
if (!filterSource.empty()) if (!filterSource.empty())
mFilterBox->createFilterRequest(filterSource, action); mFilterBox->createFilterRequest(filterSource, action);
else if (isValue) else
{ {
try QVariant qData = columnSearchData.first;
{ std::string searchColumn = columnSearchData.second;
std::vector<std::pair<int, std::vector<std::string>>> valueFilterSource;
std::vector<std::pair<std::variant<std::string, QVariant>, std::vector<std::string>>> valueFilterSource;
std::vector<std::string> searchColumns; std::vector<std::string> searchColumns;
searchColumns.emplace_back(searchColumn); searchColumns.emplace_back(searchColumn);
int searchValue = std::stoi(searchString); valueFilterSource.emplace_back(qData, searchColumns);
Log(Debug::Warning) << "Debug: " << searchValue;
valueFilterSource.emplace_back(searchValue, searchColumns);
mFilterBox->createFilterRequest(valueFilterSource, action); mFilterBox->createFilterRequest(valueFilterSource, action);
} }
catch (...)
{
Log(Debug::Warning) << "Error in converting the filter request value to integer.";
}
}
else if (searchString != "")
{
std::vector<std::string> searchColumns;
searchColumns.emplace_back(searchColumn);
filterSource.emplace_back(searchString, searchColumns);
mFilterBox->createFilterRequest(filterSource, action);
}
} }
bool CSVWorld::TableSubView::eventFilter(QObject* object, QEvent* event) bool CSVWorld::TableSubView::eventFilter(QObject* object, QEvent* event)

View file

@ -4,6 +4,7 @@
#include "../doc/subview.hpp" #include "../doc/subview.hpp"
#include <QModelIndex> #include <QModelIndex>
#include <QVariant>
#include <QWidget> #include <QWidget>
#include <string> #include <string>
@ -61,8 +62,8 @@ namespace CSVWorld
void editRequest(const CSMWorld::UniversalId& id, const std::string& hint); void editRequest(const CSMWorld::UniversalId& id, const std::string& hint);
void cloneRequest(const CSMWorld::UniversalId& toClone); void cloneRequest(const CSMWorld::UniversalId& toClone);
void createFilterRequest(std::vector<CSMWorld::UniversalId>& types, Qt::DropAction action, void createFilterRequest(std::vector<CSMWorld::UniversalId>& types,
const std::string& searchString, const std::string& searchColumn, bool isValue); std::pair<QVariant, std::string> columnSearchData, Qt::DropAction action);
void toggleOptions(); void toggleOptions();
public slots: public slots: