diff --git a/apps/opencs/view/filter/editwidget.cpp b/apps/opencs/view/filter/editwidget.cpp index 5ea99c5dcc..0668634930 100644 --- a/apps/opencs/view/filter/editwidget.cpp +++ b/apps/opencs/view/filter/editwidget.cpp @@ -3,6 +3,7 @@ #include #include +#include #include "../../model/world/data.hpp" @@ -58,7 +59,8 @@ void CSVFilter::EditWidget::filterRowsInserted (const QModelIndex& parent, int s textChanged (text()); } -void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::string, std::vector< std::string > > >& filterSource) +void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::string, std::vector< std::string > > >& filterSource, + Qt::DropAction action) { const unsigned count = filterSource.size(); bool multipleElements = false; @@ -77,9 +79,34 @@ void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::st break; } + Qt::KeyboardModifiers key = QApplication::keyboardModifiers(); QString oldContent(text()); - bool replaceMode = oldContent.isEmpty() or !oldContent.contains(QRegExp("^!.*$", Qt::CaseInsensitive)); - bool orMode = true; //not orMode = andMode, + + bool replaceMode = false; + bool orMode = true; + + switch (key) + { + case Qt::ShiftModifier: + orMode = true; + replaceMode = false; + break; + + case Qt::ControlModifier: + orMode = false; + replaceMode = false; + break; + + default: + replaceMode = true; + break; + } + + if (oldContent.isEmpty() || + !oldContent.contains(QRegExp("^!.*$", Qt::CaseInsensitive))) + { + replaceMode = true; + } std::string orAnd; if (orMode) @@ -89,12 +116,12 @@ void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::st orAnd = "and"; } - if (multipleElements) //TODO Currently only 'or' is handled, we should be able to handle 'and' as well and be able to drag records into the EditWidget already filled with the filter + if (multipleElements) //TODO appending to the existing filter { std::stringstream ss; if (replaceMode) { - ss<<'!'<2) + { + clear(); + insert (QString::fromUtf8 (ss.str().c_str())); + } } else { //not handled (yet) TODO } } else { if (replaceMode) { - clear(); - insert ('!' + QString::fromUtf8 (generateFilter(filterSource[0]).c_str())); + std::string filter(generateFilter(filterSource[0])); + + if (!filter.empty()) + { + clear(); + insert ('!' + QString::fromUtf8 (generateFilter(filterSource[0]).c_str())); + } } else { //not handled (yet) TODO } diff --git a/apps/opencs/view/filter/editwidget.hpp b/apps/opencs/view/filter/editwidget.hpp index da99c40316..59fb898837 100644 --- a/apps/opencs/view/filter/editwidget.hpp +++ b/apps/opencs/view/filter/editwidget.hpp @@ -5,6 +5,7 @@ #include #include +#include #include "../../model/filter/parser.hpp" #include "../../model/filter/node.hpp" @@ -46,7 +47,8 @@ namespace CSVFilter void filterRowsInserted (const QModelIndex& parent, int start, int end); - void createFilterRequest(std::vector > >& filterSource); + void createFilterRequest(std::vector > >& filterSource, + Qt::DropAction action); }; } diff --git a/apps/opencs/view/filter/filterbox.cpp b/apps/opencs/view/filter/filterbox.cpp index b07df550e4..132beca228 100644 --- a/apps/opencs/view/filter/filterbox.cpp +++ b/apps/opencs/view/filter/filterbox.cpp @@ -25,8 +25,8 @@ CSVFilter::FilterBox::FilterBox (CSMWorld::Data& data, QWidget *parent) SIGNAL (filterChanged (boost::shared_ptr)), this, SIGNAL (recordFilterChanged (boost::shared_ptr))); - connect(this, SIGNAL(createFilterRequest(std::vector > >&)), - recordFilterBox, SIGNAL(createFilterRequest(std::vector > >&))); + connect(this, SIGNAL(createFilterRequest(std::vector > >&, Qt::DropAction)), + recordFilterBox, SIGNAL(createFilterRequest(std::vector > >&, Qt::DropAction))); setAcceptDrops(true); } @@ -35,7 +35,7 @@ void CSVFilter::FilterBox::dropEvent (QDropEvent* event) { std::vector data = dynamic_cast (event->mimeData())->getData(); - emit recordDropped(data); + emit recordDropped(data, event->proposedAction()); } void CSVFilter::FilterBox::dragEnterEvent (QDragEnterEvent* event) diff --git a/apps/opencs/view/filter/filterbox.hpp b/apps/opencs/view/filter/filterbox.hpp index 66de340b4f..0c5ba667bd 100644 --- a/apps/opencs/view/filter/filterbox.hpp +++ b/apps/opencs/view/filter/filterbox.hpp @@ -4,6 +4,7 @@ #include #include +#include #include "../../model/filter/node.hpp" #include "../../model/world/universalid.hpp" @@ -32,8 +33,9 @@ namespace CSVFilter signals: void recordFilterChanged (boost::shared_ptr filter); - void recordDropped (std::vector& types); - void createFilterRequest(std::vector > >& filterSource); + void recordDropped (std::vector& types, Qt::DropAction action); + void createFilterRequest(std::vector > >& filterSource, + Qt::DropAction action); }; } diff --git a/apps/opencs/view/filter/recordfilterbox.cpp b/apps/opencs/view/filter/recordfilterbox.cpp index 2eaf45ad9c..530ce87145 100644 --- a/apps/opencs/view/filter/recordfilterbox.cpp +++ b/apps/opencs/view/filter/recordfilterbox.cpp @@ -25,6 +25,6 @@ CSVFilter::RecordFilterBox::RecordFilterBox (CSMWorld::Data& data, QWidget *pare editWidget, SIGNAL (filterChanged (boost::shared_ptr)), this, SIGNAL (filterChanged (boost::shared_ptr))); - connect(this, SIGNAL(createFilterRequest(std::vector > >&)), - editWidget, SLOT(createFilterRequest(std::vector > >&))); + connect(this, SIGNAL(createFilterRequest(std::vector > >&, Qt::DropAction)), + editWidget, SLOT(createFilterRequest(std::vector > >&, Qt::DropAction))); } diff --git a/apps/opencs/view/filter/recordfilterbox.hpp b/apps/opencs/view/filter/recordfilterbox.hpp index 454e341297..ac21c840f7 100644 --- a/apps/opencs/view/filter/recordfilterbox.hpp +++ b/apps/opencs/view/filter/recordfilterbox.hpp @@ -4,6 +4,7 @@ #include #include +#include #include @@ -27,7 +28,8 @@ namespace CSVFilter signals: void filterChanged (boost::shared_ptr filter); - void createFilterRequest(std::vector > >& filterSource); + void createFilterRequest(std::vector > >& filterSource, + Qt::DropAction action); }; } diff --git a/apps/opencs/view/world/table.cpp b/apps/opencs/view/world/table.cpp index e242365fed..f2999bbbde 100644 --- a/apps/opencs/view/world/table.cpp +++ b/apps/opencs/view/world/table.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -471,7 +472,20 @@ void CSVWorld::Table::mouseMoveEvent (QMouseEvent* event) drag->setMimeData (mime); drag->setPixmap (QString::fromStdString (mime->getIcon())); - drag->exec(); + + Qt::DropActions action = Qt::IgnoreAction; + switch (QApplication::keyboardModifiers()) + { + case Qt::ControlModifier: + action = Qt::CopyAction; + break; + + case Qt::ShiftModifier: + action = Qt::MoveAction; + break; + } + + drag->exec(action); } } diff --git a/apps/opencs/view/world/tablesubview.cpp b/apps/opencs/view/world/tablesubview.cpp index 581daba68d..21496dab73 100644 --- a/apps/opencs/view/world/tablesubview.cpp +++ b/apps/opencs/view/world/tablesubview.cpp @@ -62,11 +62,11 @@ CSVWorld::TableSubView::TableSubView (const CSMWorld::UniversalId& id, CSMDoc::D SIGNAL (recordFilterChanged (boost::shared_ptr)), mTable, SLOT (recordFilterChanged (boost::shared_ptr))); - connect(filterBox, SIGNAL(recordDropped(std::vector&)), - this, SLOT(createFilterRequest(std::vector&))); + connect(filterBox, SIGNAL(recordDropped(std::vector&, Qt::DropAction)), + this, SLOT(createFilterRequest(std::vector&, Qt::DropAction))); - connect(this, SIGNAL(createFilterRequest(std::vector > >&)), - filterBox, SIGNAL(createFilterRequest(std::vector > >&))); + connect(this, SIGNAL(createFilterRequest(std::vector > >&, Qt::DropAction)), + filterBox, SIGNAL(createFilterRequest(std::vector > >&, Qt::DropAction))); } void CSVWorld::TableSubView::setEditLock (bool locked) @@ -95,7 +95,7 @@ void CSVWorld::TableSubView::cloneRequest(const CSMWorld::UniversalId& toClone) emit cloneRequest(toClone.getId(), toClone.getType()); } -void CSVWorld::TableSubView::createFilterRequest (std::vector< CSMWorld::UniversalId>& types) +void CSVWorld::TableSubView::createFilterRequest (std::vector< CSMWorld::UniversalId>& types, Qt::DropAction action) { std::vector > > filterSource; @@ -106,5 +106,5 @@ void CSVWorld::TableSubView::createFilterRequest (std::vector< CSMWorld::Univers filterSource.push_back(pair); } - emit createFilterRequest(filterSource); + emit createFilterRequest(filterSource, action); } \ No newline at end of file diff --git a/apps/opencs/view/world/tablesubview.hpp b/apps/opencs/view/world/tablesubview.hpp index 23b62bcd9d..e8c75d3a34 100644 --- a/apps/opencs/view/world/tablesubview.hpp +++ b/apps/opencs/view/world/tablesubview.hpp @@ -3,6 +3,8 @@ #include "../doc/subview.hpp" +#include + class QModelIndex; namespace CSMWorld @@ -42,13 +44,15 @@ namespace CSVWorld signals: void cloneRequest(const std::string&, const CSMWorld::UniversalId::Type); - void createFilterRequest(std::vector > >& filterSource); + void createFilterRequest(std::vector > >& filterSource, + Qt::DropAction action); private slots: void editRequest (int row); void cloneRequest (const CSMWorld::UniversalId& toClone); - void createFilterRequest(std::vector< CSMWorld::UniversalId >& types); + void createFilterRequest(std::vector< CSMWorld::UniversalId >& types, + Qt::DropAction action); }; }