From e9664d80bd7db5b3d6d4a24a55497faaeb1be271 Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Wed, 19 Feb 2014 11:22:47 +0100 Subject: [PATCH 01/21] make convert enumns public static --- apps/opencs/model/world/tablemimedata.cpp | 2 +- apps/opencs/model/world/tablemimedata.hpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/opencs/model/world/tablemimedata.cpp b/apps/opencs/model/world/tablemimedata.cpp index ee37dfce6a..062996a88d 100644 --- a/apps/opencs/model/world/tablemimedata.cpp +++ b/apps/opencs/model/world/tablemimedata.cpp @@ -121,7 +121,7 @@ bool CSMWorld::TableMimeData::fromDocument (const CSMDoc::Document& document) co return &document == &mDocument; } -CSMWorld::UniversalId::Type CSMWorld::TableMimeData::convertEnums (CSMWorld::ColumnBase::Display type) const +CSMWorld::UniversalId::Type CSMWorld::TableMimeData::convertEnums (CSMWorld::ColumnBase::Display type) { switch (type) { diff --git a/apps/opencs/model/world/tablemimedata.hpp b/apps/opencs/model/world/tablemimedata.hpp index 010a18acb2..7244b4f2ee 100644 --- a/apps/opencs/model/world/tablemimedata.hpp +++ b/apps/opencs/model/world/tablemimedata.hpp @@ -50,12 +50,13 @@ namespace CSMWorld UniversalId returnMatching(CSMWorld::ColumnBase::Display type) const; + static CSMWorld::UniversalId::Type convertEnums(CSMWorld::ColumnBase::Display type); + private: std::vector mUniversalId; QStringList mObjectsFormats; const CSMDoc::Document& mDocument; - CSMWorld::UniversalId::Type convertEnums(CSMWorld::ColumnBase::Display type) const; }; } #endif // TABLEMIMEDATA_H \ No newline at end of file From dd95ed8e4c197ff5b9c51767c9c89b05020bba74 Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Wed, 19 Feb 2014 12:32:48 +0100 Subject: [PATCH 02/21] Accept drops on the filterbox --- apps/opencs/view/filter/filterbox.cpp | 18 ++++++++++++++++++ apps/opencs/view/filter/filterbox.hpp | 7 +++++++ 2 files changed, 25 insertions(+) diff --git a/apps/opencs/view/filter/filterbox.cpp b/apps/opencs/view/filter/filterbox.cpp index 2731708841..e1fb0c6164 100644 --- a/apps/opencs/view/filter/filterbox.cpp +++ b/apps/opencs/view/filter/filterbox.cpp @@ -2,6 +2,7 @@ #include "filterbox.hpp" #include +#include #include "recordfilterbox.hpp" @@ -21,4 +22,21 @@ CSVFilter::FilterBox::FilterBox (CSMWorld::Data& data, QWidget *parent) connect (recordFilterBox, SIGNAL (filterChanged (boost::shared_ptr)), this, SIGNAL (recordFilterChanged (boost::shared_ptr))); + + setAcceptDrops(true); +} + +void CSVFilter::FilterBox::dropEvent (QDropEvent* event) +{ + +} + +void CSVFilter::FilterBox::dragEnterEvent (QDragEnterEvent* event) +{ + event->acceptProposedAction(); +} + +void CSVFilter::FilterBox::dragMoveEvent (QDragMoveEvent* event) +{ + event->accept(); } \ No newline at end of file diff --git a/apps/opencs/view/filter/filterbox.hpp b/apps/opencs/view/filter/filterbox.hpp index 2524fa0a38..6268643f36 100644 --- a/apps/opencs/view/filter/filterbox.hpp +++ b/apps/opencs/view/filter/filterbox.hpp @@ -16,6 +16,12 @@ namespace CSVFilter { Q_OBJECT + void dragEnterEvent (QDragEnterEvent* event); + + void dropEvent (QDropEvent* event); + + void dragMoveEvent(QDragMoveEvent *event); + public: FilterBox (CSMWorld::Data& data, QWidget *parent = 0); @@ -28,3 +34,4 @@ namespace CSVFilter } #endif + From d7a1abb30bb95bc55d9e60783622f0ae05aeeceb Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Wed, 19 Feb 2014 12:55:39 +0100 Subject: [PATCH 03/21] emit signal with types (will be connected to the tablesubview) --- apps/opencs/view/filter/filterbox.cpp | 13 +++++++++++++ apps/opencs/view/filter/filterbox.hpp | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/apps/opencs/view/filter/filterbox.cpp b/apps/opencs/view/filter/filterbox.cpp index e1fb0c6164..b191c065f5 100644 --- a/apps/opencs/view/filter/filterbox.cpp +++ b/apps/opencs/view/filter/filterbox.cpp @@ -6,6 +6,8 @@ #include "recordfilterbox.hpp" +#include + CSVFilter::FilterBox::FilterBox (CSMWorld::Data& data, QWidget *parent) : QWidget (parent) { @@ -28,7 +30,18 @@ CSVFilter::FilterBox::FilterBox (CSMWorld::Data& data, QWidget *parent) void CSVFilter::FilterBox::dropEvent (QDropEvent* event) { + const CSMWorld::TableMimeData* mime = dynamic_cast (event->mimeData()); + std::vector records = mime->getData(); + + std::vector types; + + for (std::vector::iterator it = records.begin(); it != records.end(); ++it) + { + types.push_back(it->getType()); + } + + emit recordDropped(types); } void CSVFilter::FilterBox::dragEnterEvent (QDragEnterEvent* event) diff --git a/apps/opencs/view/filter/filterbox.hpp b/apps/opencs/view/filter/filterbox.hpp index 6268643f36..a96e7203e9 100644 --- a/apps/opencs/view/filter/filterbox.hpp +++ b/apps/opencs/view/filter/filterbox.hpp @@ -1,9 +1,12 @@ #ifndef CSV_FILTER_FILTERBOX_H #define CSV_FILTER_FILTERBOX_H +#include + #include #include "../../model/filter/node.hpp" +#include "../../model/world/universalid.hpp" namespace CSMWorld { @@ -29,6 +32,7 @@ namespace CSVFilter signals: void recordFilterChanged (boost::shared_ptr filter); + void recordDropped (const std::vector& types); }; } From fca7701359473c1320cc782126f1224720edbb7a Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Wed, 19 Feb 2014 16:15:51 +0100 Subject: [PATCH 04/21] Column titles retrived and passed to the filterbox. --- apps/opencs/model/world/tablemimedata.cpp | 164 +++++++++++++++++++++- apps/opencs/model/world/tablemimedata.hpp | 1 + apps/opencs/view/filter/filterbox.cpp | 29 ++-- apps/opencs/view/filter/filterbox.hpp | 5 +- apps/opencs/view/world/table.cpp | 18 +++ apps/opencs/view/world/table.hpp | 3 + apps/opencs/view/world/tablesubview.cpp | 21 +++ apps/opencs/view/world/tablesubview.hpp | 2 + 8 files changed, 229 insertions(+), 14 deletions(-) diff --git a/apps/opencs/model/world/tablemimedata.cpp b/apps/opencs/model/world/tablemimedata.cpp index 062996a88d..6daf9d5542 100644 --- a/apps/opencs/model/world/tablemimedata.cpp +++ b/apps/opencs/model/world/tablemimedata.cpp @@ -64,6 +64,7 @@ std::vector< CSMWorld::UniversalId > CSMWorld::TableMimeData::getData() const return mUniversalId; } + bool CSMWorld::TableMimeData::holdsType (CSMWorld::UniversalId::Type type) const { for (std::vector::const_iterator it = mUniversalId.begin(); it != mUniversalId.end(); ++it) @@ -282,4 +283,165 @@ CSMWorld::UniversalId::Type CSMWorld::TableMimeData::convertEnums (CSMWorld::Col break; } } -// kate: indent-mode cstyle; indent-width 4; replace-tabs on; + +CSMWorld::ColumnBase::Display CSMWorld::TableMimeData::convertEnums (CSMWorld::UniversalId::Type type) +{ + switch (type) + { + case CSMWorld::UniversalId::Type_Race: + return CSMWorld::ColumnBase::Display_Race; + break; + + case CSMWorld::UniversalId::Type_Skill: + return CSMWorld::ColumnBase::Display_Skill; + break; + + case CSMWorld::UniversalId::Type_Class: + return CSMWorld::ColumnBase::Display_Class; + break; + + case CSMWorld::UniversalId::Type_Faction: + return CSMWorld::ColumnBase::Display_Faction; + break; + + case CSMWorld::UniversalId::Type_Sound: + return CSMWorld::ColumnBase::Display_Sound; + break; + + case CSMWorld::UniversalId::Type_Region: + return CSMWorld::ColumnBase::Display_Region; + break; + + case CSMWorld::UniversalId::Type_Birthsign: + return CSMWorld::ColumnBase::Display_Birthsign; + break; + + case CSMWorld::UniversalId::Type_Spell: + return CSMWorld::ColumnBase::Display_Spell; + break; + + case CSMWorld::UniversalId::Type_Cell: + return CSMWorld::ColumnBase::Display_Cell; + break; + + case CSMWorld::UniversalId::Type_Referenceable: + return CSMWorld::ColumnBase::Display_Referenceable; + break; + + case CSMWorld::UniversalId::Type_Activator: + return CSMWorld::ColumnBase::Display_Activator; + break; + + case CSMWorld::UniversalId::Type_Potion: + return CSMWorld::ColumnBase::Display_Potion; + break; + + case CSMWorld::UniversalId::Type_Apparatus: + return CSMWorld::ColumnBase::Display_Apparatus; + break; + + case CSMWorld::UniversalId::Type_Armor: + return CSMWorld::ColumnBase::Display_Armor; + break; + + case CSMWorld::UniversalId::Type_Book: + return CSMWorld::ColumnBase::Display_Book; + break; + + case CSMWorld::UniversalId::Type_Clothing: + return CSMWorld::ColumnBase::Display_Clothing; + break; + + case CSMWorld::UniversalId::Type_Container: + return CSMWorld::ColumnBase::Display_Container; + break; + + case CSMWorld::UniversalId::Type_Creature: + return CSMWorld::ColumnBase::Display_Creature; + break; + + case CSMWorld::UniversalId::Type_Door: + return CSMWorld::ColumnBase::Display_Door; + break; + + case CSMWorld::UniversalId::Type_Ingredient: + return CSMWorld::ColumnBase::Display_Ingredient; + break; + + case CSMWorld::UniversalId::Type_CreatureLevelledList: + return CSMWorld::ColumnBase::Display_CreatureLevelledList; + break; + + case CSMWorld::UniversalId::Type_ItemLevelledList: + return CSMWorld::ColumnBase::Display_ItemLevelledList; + break; + + case CSMWorld::UniversalId::Type_Light: + return CSMWorld::ColumnBase::Display_Light; + break; + + case CSMWorld::UniversalId::Type_Lockpick: + return CSMWorld::ColumnBase::Display_Lockpick; + break; + + case CSMWorld::UniversalId::Type_Miscellaneous: + return CSMWorld::ColumnBase::Display_Miscellaneous; + break; + + case CSMWorld::UniversalId::Type_Npc: + return CSMWorld::ColumnBase::Display_Npc; + break; + + case CSMWorld::UniversalId::Type_Probe: + return CSMWorld::ColumnBase::Display_Probe; + break; + + case CSMWorld::UniversalId::Type_Repair: + return CSMWorld::ColumnBase::Display_Repair; + break; + + case CSMWorld::UniversalId::Type_Static: + return CSMWorld::ColumnBase::Display_Static; + break; + + case CSMWorld::UniversalId::Type_Weapon: + return CSMWorld::ColumnBase::Display_Weapon; + break; + + case CSMWorld::UniversalId::Type_Reference: + return CSMWorld::ColumnBase::Display_Reference; + break; + + case CSMWorld::UniversalId::Type_Filter: + return CSMWorld::ColumnBase::Display_Filter; + break; + + case CSMWorld::UniversalId::Type_Topic: + return CSMWorld::ColumnBase::Display_Topic; + break; + + case CSMWorld::UniversalId::Type_Journal: + return CSMWorld::ColumnBase::Display_Journal; + break; + + case CSMWorld::UniversalId::Type_TopicInfo: + return CSMWorld::ColumnBase::Display_TopicInfo; + break; + + case CSMWorld::UniversalId::Type_JournalInfo: + return CSMWorld::ColumnBase::Display_JournalInfo; + break; + + case CSMWorld::UniversalId::Type_Scene: + return CSMWorld::ColumnBase::Display_Scene; + break; + + case CSMWorld::UniversalId::Type_Script: + return CSMWorld::ColumnBase::Display_Script; + break; + + default: + return CSMWorld::ColumnBase::Display_String; + break; + } +} \ No newline at end of file diff --git a/apps/opencs/model/world/tablemimedata.hpp b/apps/opencs/model/world/tablemimedata.hpp index 7244b4f2ee..7687f3555f 100644 --- a/apps/opencs/model/world/tablemimedata.hpp +++ b/apps/opencs/model/world/tablemimedata.hpp @@ -51,6 +51,7 @@ namespace CSMWorld UniversalId returnMatching(CSMWorld::ColumnBase::Display type) const; static CSMWorld::UniversalId::Type convertEnums(CSMWorld::ColumnBase::Display type); + static CSMWorld::ColumnBase::Display convertEnums(CSMWorld::UniversalId::Type type); private: std::vector mUniversalId; diff --git a/apps/opencs/view/filter/filterbox.cpp b/apps/opencs/view/filter/filterbox.cpp index b191c065f5..8996060c33 100644 --- a/apps/opencs/view/filter/filterbox.cpp +++ b/apps/opencs/view/filter/filterbox.cpp @@ -30,18 +30,9 @@ CSVFilter::FilterBox::FilterBox (CSMWorld::Data& data, QWidget *parent) void CSVFilter::FilterBox::dropEvent (QDropEvent* event) { - const CSMWorld::TableMimeData* mime = dynamic_cast (event->mimeData()); + std::vector data = dynamic_cast (event->mimeData())->getData(); - std::vector records = mime->getData(); - - std::vector types; - - for (std::vector::iterator it = records.begin(); it != records.end(); ++it) - { - types.push_back(it->getType()); - } - - emit recordDropped(types); + emit recordDropped(data); } void CSVFilter::FilterBox::dragEnterEvent (QDragEnterEvent* event) @@ -52,4 +43,18 @@ void CSVFilter::FilterBox::dragEnterEvent (QDragEnterEvent* event) void CSVFilter::FilterBox::dragMoveEvent (QDragMoveEvent* event) { event->accept(); -} \ No newline at end of file +} + +void CSVFilter::FilterBox::createFilter (std::vector< std::pair< std::string, std::vector< std::string > > >& filterSource) +{ + for (unsigned i = 0; i < filterSource.size(); ++i) //test + { + std::cout< > >& filterSource); + signals: void recordFilterChanged (boost::shared_ptr filter); - void recordDropped (const std::vector& types); + void recordDropped (std::vector& types); }; } diff --git a/apps/opencs/view/world/table.cpp b/apps/opencs/view/world/table.cpp index f1d89e22cc..2642777cf7 100644 --- a/apps/opencs/view/world/table.cpp +++ b/apps/opencs/view/world/table.cpp @@ -507,3 +507,21 @@ void CSVWorld::Table::dragMoveEvent(QDragMoveEvent *event) { event->accept(); } + +std::vector CSVWorld::Table::getColumnsWithDisplay(CSMWorld::ColumnBase::Display display) const +{ + int count = mModel->columnCount(); + + std::vector titles; + for (int i = 0; i < count; ++i) + { + CSMWorld::ColumnBase::Display columndisplay = static_cast + (mModel->headerData (i, Qt::Horizontal, CSMWorld::ColumnBase::Role_Display).toInt()); + + if (display == columndisplay) + { + titles.push_back(mModel->headerData (i, Qt::Horizontal).toString().toStdString()); + } + } + return titles; +} \ No newline at end of file diff --git a/apps/opencs/view/world/table.hpp b/apps/opencs/view/world/table.hpp index ff08db06fa..3b72c36d5b 100644 --- a/apps/opencs/view/world/table.hpp +++ b/apps/opencs/view/world/table.hpp @@ -8,6 +8,7 @@ #include #include "../../model/filter/node.hpp" +#include "../../model/world/columnbase.hpp" namespace CSMDoc { class Document; @@ -82,6 +83,8 @@ namespace CSVWorld void updateEditorSetting (const QString &settingName, const QString &settingValue); + std::vector getColumnsWithDisplay(CSMWorld::ColumnBase::Display display) const; + signals: void editRequest (int row); diff --git a/apps/opencs/view/world/tablesubview.cpp b/apps/opencs/view/world/tablesubview.cpp index d379db51a5..e57016d34e 100644 --- a/apps/opencs/view/world/tablesubview.cpp +++ b/apps/opencs/view/world/tablesubview.cpp @@ -4,6 +4,7 @@ #include #include "../../model/doc/document.hpp" +#include "../../model/world/tablemimedata.hpp" #include "../filter/filterbox.hpp" #include "table.hpp" @@ -60,6 +61,12 @@ CSVWorld::TableSubView::TableSubView (const CSMWorld::UniversalId& id, CSMDoc::D connect (filterBox, SIGNAL (recordFilterChanged (boost::shared_ptr)), mTable, SLOT (recordFilterChanged (boost::shared_ptr))); + + connect(filterBox, SIGNAL(recordDropped(std::vector&)), + this, SLOT(createFilterRequest(std::vector&))); + + connect(this, SIGNAL(createFilterRequest(std::vector > >&)), + filterBox, SLOT(createFilter(std::vector > >&))); } void CSVWorld::TableSubView::setEditLock (bool locked) @@ -87,3 +94,17 @@ void CSVWorld::TableSubView::cloneRequest(const CSMWorld::UniversalId& toClone) { emit cloneRequest(toClone.getId(), toClone.getType()); } + +void CSVWorld::TableSubView::createFilterRequest (std::vector< CSMWorld::UniversalId>& types) +{ + std::vector > > filterSource; + + for (std::vector::iterator it = types.begin(); it != types.end(); ++it) + { + std::pair > pair( //splited long line + std::make_pair(it->getId(), mTable->getColumnsWithDisplay(CSMWorld::TableMimeData::convertEnums(it->getType())))); + + filterSource.push_back(pair); + } + emit createFilterRequest(filterSource); +} \ No newline at end of file diff --git a/apps/opencs/view/world/tablesubview.hpp b/apps/opencs/view/world/tablesubview.hpp index d728dc2f38..23b62bcd9d 100644 --- a/apps/opencs/view/world/tablesubview.hpp +++ b/apps/opencs/view/world/tablesubview.hpp @@ -42,11 +42,13 @@ namespace CSVWorld signals: void cloneRequest(const std::string&, const CSMWorld::UniversalId::Type); + void createFilterRequest(std::vector > >& filterSource); private slots: void editRequest (int row); void cloneRequest (const CSMWorld::UniversalId& toClone); + void createFilterRequest(std::vector< CSMWorld::UniversalId >& types); }; } From c7b3e139aa622488fd169183483ec13320a6b7b4 Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Thu, 20 Feb 2014 11:07:04 +0100 Subject: [PATCH 05/21] Propagate signal to the edit widget --- apps/opencs/view/filter/editwidget.cpp | 14 ++++++++++++++ apps/opencs/view/filter/editwidget.hpp | 2 ++ apps/opencs/view/filter/filterbox.cpp | 17 +++-------------- apps/opencs/view/filter/filterbox.hpp | 4 +--- apps/opencs/view/filter/recordfilterbox.cpp | 3 +++ apps/opencs/view/filter/recordfilterbox.hpp | 1 + apps/opencs/view/world/tablesubview.cpp | 2 +- 7 files changed, 25 insertions(+), 18 deletions(-) diff --git a/apps/opencs/view/filter/editwidget.cpp b/apps/opencs/view/filter/editwidget.cpp index 708d450325..997ecf546d 100644 --- a/apps/opencs/view/filter/editwidget.cpp +++ b/apps/opencs/view/filter/editwidget.cpp @@ -56,3 +56,17 @@ 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) +{ + for (unsigned i = 0; i < filterSource.size(); ++i) //test + { + std::cout< > >& filterSource); }; } diff --git a/apps/opencs/view/filter/filterbox.cpp b/apps/opencs/view/filter/filterbox.cpp index 8996060c33..b07df550e4 100644 --- a/apps/opencs/view/filter/filterbox.cpp +++ b/apps/opencs/view/filter/filterbox.cpp @@ -25,6 +25,9 @@ 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 > >&))); + setAcceptDrops(true); } @@ -44,17 +47,3 @@ void CSVFilter::FilterBox::dragMoveEvent (QDragMoveEvent* event) { event->accept(); } - -void CSVFilter::FilterBox::createFilter (std::vector< std::pair< std::string, std::vector< std::string > > >& filterSource) -{ - for (unsigned i = 0; i < filterSource.size(); ++i) //test - { - std::cout< > >& filterSource); - signals: void recordFilterChanged (boost::shared_ptr filter); void recordDropped (std::vector& types); + void createFilterRequest(std::vector > >& filterSource); }; } diff --git a/apps/opencs/view/filter/recordfilterbox.cpp b/apps/opencs/view/filter/recordfilterbox.cpp index c405177b01..2eaf45ad9c 100644 --- a/apps/opencs/view/filter/recordfilterbox.cpp +++ b/apps/opencs/view/filter/recordfilterbox.cpp @@ -24,4 +24,7 @@ CSVFilter::RecordFilterBox::RecordFilterBox (CSMWorld::Data& data, QWidget *pare connect ( editWidget, SIGNAL (filterChanged (boost::shared_ptr)), this, SIGNAL (filterChanged (boost::shared_ptr))); + + connect(this, SIGNAL(createFilterRequest(std::vector > >&)), + editWidget, SLOT(createFilterRequest(std::vector > >&))); } diff --git a/apps/opencs/view/filter/recordfilterbox.hpp b/apps/opencs/view/filter/recordfilterbox.hpp index 057d69518d..454e341297 100644 --- a/apps/opencs/view/filter/recordfilterbox.hpp +++ b/apps/opencs/view/filter/recordfilterbox.hpp @@ -27,6 +27,7 @@ namespace CSVFilter signals: void filterChanged (boost::shared_ptr filter); + void createFilterRequest(std::vector > >& filterSource); }; } diff --git a/apps/opencs/view/world/tablesubview.cpp b/apps/opencs/view/world/tablesubview.cpp index e57016d34e..581daba68d 100644 --- a/apps/opencs/view/world/tablesubview.cpp +++ b/apps/opencs/view/world/tablesubview.cpp @@ -66,7 +66,7 @@ CSVWorld::TableSubView::TableSubView (const CSMWorld::UniversalId& id, CSMDoc::D this, SLOT(createFilterRequest(std::vector&))); connect(this, SIGNAL(createFilterRequest(std::vector > >&)), - filterBox, SLOT(createFilter(std::vector > >&))); + filterBox, SIGNAL(createFilterRequest(std::vector > >&))); } void CSVWorld::TableSubView::setEditLock (bool locked) From eb3cbaa4e189b734ab1a454cfb220fc30c8ae294 Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Thu, 20 Feb 2014 12:25:47 +0100 Subject: [PATCH 06/21] Create filter on droping record. --- apps/opencs/view/filter/editwidget.cpp | 46 +++++++++++++++++++++++++- apps/opencs/view/filter/editwidget.hpp | 3 ++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/apps/opencs/view/filter/editwidget.cpp b/apps/opencs/view/filter/editwidget.cpp index 997ecf546d..4d77ff02ff 100644 --- a/apps/opencs/view/filter/editwidget.cpp +++ b/apps/opencs/view/filter/editwidget.cpp @@ -2,6 +2,7 @@ #include "editwidget.hpp" #include +#include #include "../../model/world/data.hpp" @@ -59,6 +60,11 @@ void CSVFilter::EditWidget::filterRowsInserted (const QModelIndex& parent, int s void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::string, std::vector< std::string > > >& filterSource) { + clear(); + + std::string filter(generateFilter(*filterSource.begin())); + insert(QString::fromStdString(filter)); + for (unsigned i = 0; i < filterSource.size(); ++i) //test { std::cout< >& seekedString) +{ + const unsigned columns = seekedString.second.size(); + + bool multipleColumns = false; + switch (columns) + { + case 0: //empty + return ""; //no column to filter + break; + + case 1: //one column to look for + multipleColumns = false; + break; + + default: + multipleColumns = true; + break; + } + + std::stringstream ss; + if (multipleColumns) + { + ss<<"!or("; + for (unsigned i = 0; i < columns; ++i) + { + ss<<"string("<<'"'< filter); + private: + std::string generateFilter(std::pair >& seekedString); + private slots: void textChanged (const QString& text); From 4fe21dc38f54f49d23a8d5fed641e73e512d2584 Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Thu, 20 Feb 2014 12:43:09 +0100 Subject: [PATCH 07/21] Const correctness --- apps/opencs/view/filter/editwidget.cpp | 2 +- apps/opencs/view/filter/editwidget.hpp | 2 +- apps/opencs/view/world/table.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/opencs/view/filter/editwidget.cpp b/apps/opencs/view/filter/editwidget.cpp index 4d77ff02ff..fb1e5bcb2c 100644 --- a/apps/opencs/view/filter/editwidget.cpp +++ b/apps/opencs/view/filter/editwidget.cpp @@ -77,7 +77,7 @@ void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::st } } -std::string CSVFilter::EditWidget::generateFilter (std::pair< std::string, std::vector< std::string > >& seekedString) +std::string CSVFilter::EditWidget::generateFilter (std::pair< std::string, std::vector< std::string > >& seekedString) const { const unsigned columns = seekedString.second.size(); diff --git a/apps/opencs/view/filter/editwidget.hpp b/apps/opencs/view/filter/editwidget.hpp index f39b0f8e3d..da99c40316 100644 --- a/apps/opencs/view/filter/editwidget.hpp +++ b/apps/opencs/view/filter/editwidget.hpp @@ -34,7 +34,7 @@ namespace CSVFilter void filterChanged (boost::shared_ptr filter); private: - std::string generateFilter(std::pair >& seekedString); + std::string generateFilter(std::pair >& seekedString) const; private slots: diff --git a/apps/opencs/view/world/table.cpp b/apps/opencs/view/world/table.cpp index 2642777cf7..fd0ba0f192 100644 --- a/apps/opencs/view/world/table.cpp +++ b/apps/opencs/view/world/table.cpp @@ -510,7 +510,7 @@ void CSVWorld::Table::dragMoveEvent(QDragMoveEvent *event) std::vector CSVWorld::Table::getColumnsWithDisplay(CSMWorld::ColumnBase::Display display) const { - int count = mModel->columnCount(); + const int count = mModel->columnCount(); std::vector titles; for (int i = 0; i < count; ++i) From b788ab8b4c0d3870d5020449e7df4aad9d7e93e1 Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Thu, 20 Feb 2014 14:10:03 +0100 Subject: [PATCH 08/21] correcting --- apps/opencs/model/world/tablemimedata.cpp | 156 +++++++++++----------- apps/opencs/view/filter/editwidget.cpp | 3 +- apps/opencs/view/world/table.cpp | 2 +- 3 files changed, 80 insertions(+), 81 deletions(-) diff --git a/apps/opencs/model/world/tablemimedata.cpp b/apps/opencs/model/world/tablemimedata.cpp index 6daf9d5542..de7875cc2a 100644 --- a/apps/opencs/model/world/tablemimedata.cpp +++ b/apps/opencs/model/world/tablemimedata.cpp @@ -128,159 +128,159 @@ CSMWorld::UniversalId::Type CSMWorld::TableMimeData::convertEnums (CSMWorld::Col { case CSMWorld::ColumnBase::Display_Race: return CSMWorld::UniversalId::Type_Race; - break; + case CSMWorld::ColumnBase::Display_Skill: return CSMWorld::UniversalId::Type_Skill; - break; + case CSMWorld::ColumnBase::Display_Class: return CSMWorld::UniversalId::Type_Class; - break; + case CSMWorld::ColumnBase::Display_Faction: return CSMWorld::UniversalId::Type_Faction; - break; + case CSMWorld::ColumnBase::Display_Sound: return CSMWorld::UniversalId::Type_Sound; - break; + case CSMWorld::ColumnBase::Display_Region: return CSMWorld::UniversalId::Type_Region; - break; + case CSMWorld::ColumnBase::Display_Birthsign: return CSMWorld::UniversalId::Type_Birthsign; - break; + case CSMWorld::ColumnBase::Display_Spell: return CSMWorld::UniversalId::Type_Spell; - break; + case CSMWorld::ColumnBase::Display_Cell: return CSMWorld::UniversalId::Type_Cell; - break; + case CSMWorld::ColumnBase::Display_Referenceable: return CSMWorld::UniversalId::Type_Referenceable; - break; + case CSMWorld::ColumnBase::Display_Activator: return CSMWorld::UniversalId::Type_Activator; - break; + case CSMWorld::ColumnBase::Display_Potion: return CSMWorld::UniversalId::Type_Potion; - break; + case CSMWorld::ColumnBase::Display_Apparatus: return CSMWorld::UniversalId::Type_Apparatus; - break; + case CSMWorld::ColumnBase::Display_Armor: return CSMWorld::UniversalId::Type_Armor; - break; + case CSMWorld::ColumnBase::Display_Book: return CSMWorld::UniversalId::Type_Book; - break; + case CSMWorld::ColumnBase::Display_Clothing: return CSMWorld::UniversalId::Type_Clothing; - break; + case CSMWorld::ColumnBase::Display_Container: return CSMWorld::UniversalId::Type_Container; - break; + case CSMWorld::ColumnBase::Display_Creature: return CSMWorld::UniversalId::Type_Creature; - break; + case CSMWorld::ColumnBase::Display_Door: return CSMWorld::UniversalId::Type_Door; - break; + case CSMWorld::ColumnBase::Display_Ingredient: return CSMWorld::UniversalId::Type_Ingredient; - break; + case CSMWorld::ColumnBase::Display_CreatureLevelledList: return CSMWorld::UniversalId::Type_CreatureLevelledList; - break; + case CSMWorld::ColumnBase::Display_ItemLevelledList: return CSMWorld::UniversalId::Type_ItemLevelledList; - break; + case CSMWorld::ColumnBase::Display_Light: return CSMWorld::UniversalId::Type_Light; - break; + case CSMWorld::ColumnBase::Display_Lockpick: return CSMWorld::UniversalId::Type_Lockpick; - break; + case CSMWorld::ColumnBase::Display_Miscellaneous: return CSMWorld::UniversalId::Type_Miscellaneous; - break; + case CSMWorld::ColumnBase::Display_Npc: return CSMWorld::UniversalId::Type_Npc; - break; + case CSMWorld::ColumnBase::Display_Probe: return CSMWorld::UniversalId::Type_Probe; - break; + case CSMWorld::ColumnBase::Display_Repair: return CSMWorld::UniversalId::Type_Repair; - break; + case CSMWorld::ColumnBase::Display_Static: return CSMWorld::UniversalId::Type_Static; - break; + case CSMWorld::ColumnBase::Display_Weapon: return CSMWorld::UniversalId::Type_Weapon; - break; + case CSMWorld::ColumnBase::Display_Reference: return CSMWorld::UniversalId::Type_Reference; - break; + case CSMWorld::ColumnBase::Display_Filter: return CSMWorld::UniversalId::Type_Filter; - break; + case CSMWorld::ColumnBase::Display_Topic: return CSMWorld::UniversalId::Type_Topic; - break; + case CSMWorld::ColumnBase::Display_Journal: return CSMWorld::UniversalId::Type_Journal; - break; + case CSMWorld::ColumnBase::Display_TopicInfo: return CSMWorld::UniversalId::Type_TopicInfo; - break; + case CSMWorld::ColumnBase::Display_JournalInfo: return CSMWorld::UniversalId::Type_JournalInfo; - break; + case CSMWorld::ColumnBase::Display_Scene: return CSMWorld::UniversalId::Type_Scene; - break; + case CSMWorld::ColumnBase::Display_Script: return CSMWorld::UniversalId::Type_Script; - break; + default: return CSMWorld::UniversalId::Type_None; - break; + } } @@ -290,158 +290,158 @@ CSMWorld::ColumnBase::Display CSMWorld::TableMimeData::convertEnums (CSMWorld::U { case CSMWorld::UniversalId::Type_Race: return CSMWorld::ColumnBase::Display_Race; - break; + case CSMWorld::UniversalId::Type_Skill: return CSMWorld::ColumnBase::Display_Skill; - break; + case CSMWorld::UniversalId::Type_Class: return CSMWorld::ColumnBase::Display_Class; - break; + case CSMWorld::UniversalId::Type_Faction: return CSMWorld::ColumnBase::Display_Faction; - break; + case CSMWorld::UniversalId::Type_Sound: return CSMWorld::ColumnBase::Display_Sound; - break; + case CSMWorld::UniversalId::Type_Region: return CSMWorld::ColumnBase::Display_Region; - break; + case CSMWorld::UniversalId::Type_Birthsign: return CSMWorld::ColumnBase::Display_Birthsign; - break; + case CSMWorld::UniversalId::Type_Spell: return CSMWorld::ColumnBase::Display_Spell; - break; + case CSMWorld::UniversalId::Type_Cell: return CSMWorld::ColumnBase::Display_Cell; - break; + case CSMWorld::UniversalId::Type_Referenceable: return CSMWorld::ColumnBase::Display_Referenceable; - break; + case CSMWorld::UniversalId::Type_Activator: return CSMWorld::ColumnBase::Display_Activator; - break; + case CSMWorld::UniversalId::Type_Potion: return CSMWorld::ColumnBase::Display_Potion; - break; + case CSMWorld::UniversalId::Type_Apparatus: return CSMWorld::ColumnBase::Display_Apparatus; - break; + case CSMWorld::UniversalId::Type_Armor: return CSMWorld::ColumnBase::Display_Armor; - break; + case CSMWorld::UniversalId::Type_Book: return CSMWorld::ColumnBase::Display_Book; - break; + case CSMWorld::UniversalId::Type_Clothing: return CSMWorld::ColumnBase::Display_Clothing; - break; + case CSMWorld::UniversalId::Type_Container: return CSMWorld::ColumnBase::Display_Container; - break; + case CSMWorld::UniversalId::Type_Creature: return CSMWorld::ColumnBase::Display_Creature; - break; + case CSMWorld::UniversalId::Type_Door: return CSMWorld::ColumnBase::Display_Door; - break; + case CSMWorld::UniversalId::Type_Ingredient: return CSMWorld::ColumnBase::Display_Ingredient; - break; + case CSMWorld::UniversalId::Type_CreatureLevelledList: return CSMWorld::ColumnBase::Display_CreatureLevelledList; - break; + case CSMWorld::UniversalId::Type_ItemLevelledList: return CSMWorld::ColumnBase::Display_ItemLevelledList; - break; + case CSMWorld::UniversalId::Type_Light: return CSMWorld::ColumnBase::Display_Light; - break; + case CSMWorld::UniversalId::Type_Lockpick: return CSMWorld::ColumnBase::Display_Lockpick; - break; + case CSMWorld::UniversalId::Type_Miscellaneous: return CSMWorld::ColumnBase::Display_Miscellaneous; - break; + case CSMWorld::UniversalId::Type_Npc: return CSMWorld::ColumnBase::Display_Npc; - break; + case CSMWorld::UniversalId::Type_Probe: return CSMWorld::ColumnBase::Display_Probe; - break; + case CSMWorld::UniversalId::Type_Repair: return CSMWorld::ColumnBase::Display_Repair; - break; + case CSMWorld::UniversalId::Type_Static: return CSMWorld::ColumnBase::Display_Static; - break; + case CSMWorld::UniversalId::Type_Weapon: return CSMWorld::ColumnBase::Display_Weapon; - break; + case CSMWorld::UniversalId::Type_Reference: return CSMWorld::ColumnBase::Display_Reference; - break; + case CSMWorld::UniversalId::Type_Filter: return CSMWorld::ColumnBase::Display_Filter; - break; + case CSMWorld::UniversalId::Type_Topic: return CSMWorld::ColumnBase::Display_Topic; - break; + case CSMWorld::UniversalId::Type_Journal: return CSMWorld::ColumnBase::Display_Journal; - break; + case CSMWorld::UniversalId::Type_TopicInfo: return CSMWorld::ColumnBase::Display_TopicInfo; - break; + case CSMWorld::UniversalId::Type_JournalInfo: return CSMWorld::ColumnBase::Display_JournalInfo; - break; + case CSMWorld::UniversalId::Type_Scene: return CSMWorld::ColumnBase::Display_Scene; - break; + case CSMWorld::UniversalId::Type_Script: return CSMWorld::ColumnBase::Display_Script; - break; + default: return CSMWorld::ColumnBase::Display_String; - break; + } } \ No newline at end of file diff --git a/apps/opencs/view/filter/editwidget.cpp b/apps/opencs/view/filter/editwidget.cpp index fb1e5bcb2c..2ccef17a86 100644 --- a/apps/opencs/view/filter/editwidget.cpp +++ b/apps/opencs/view/filter/editwidget.cpp @@ -63,7 +63,7 @@ void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::st clear(); std::string filter(generateFilter(*filterSource.begin())); - insert(QString::fromStdString(filter)); + insert(QString::fromUtf8(filter.c_str())); for (unsigned i = 0; i < filterSource.size(); ++i) //test { @@ -86,7 +86,6 @@ std::string CSVFilter::EditWidget::generateFilter (std::pair< std::string, std:: { case 0: //empty return ""; //no column to filter - break; case 1: //one column to look for multipleColumns = false; diff --git a/apps/opencs/view/world/table.cpp b/apps/opencs/view/world/table.cpp index fd0ba0f192..e242365fed 100644 --- a/apps/opencs/view/world/table.cpp +++ b/apps/opencs/view/world/table.cpp @@ -496,7 +496,7 @@ void CSVWorld::Table::dropEvent(QDropEvent *event) CSMWorld::UniversalId record (mime->returnMatching (display)); std::auto_ptr command (new CSMWorld::ModifyCommand - (*mProxyModel, index, QVariant (QString::fromStdString (record.getId())))); + (*mProxyModel, index, QVariant (QString::fromUtf8 (record.getId().c_str())))); mUndoStack.push (command.release()); } From 38a86b5015c2d126d968fc37e025c4df57770184 Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Thu, 20 Feb 2014 14:13:12 +0100 Subject: [PATCH 09/21] We can handle droping multiple records --- apps/opencs/view/filter/editwidget.cpp | 70 +++++++++++++++++++++----- 1 file changed, 58 insertions(+), 12 deletions(-) diff --git a/apps/opencs/view/filter/editwidget.cpp b/apps/opencs/view/filter/editwidget.cpp index 2ccef17a86..5ea99c5dcc 100644 --- a/apps/opencs/view/filter/editwidget.cpp +++ b/apps/opencs/view/filter/editwidget.cpp @@ -60,20 +60,66 @@ void CSVFilter::EditWidget::filterRowsInserted (const QModelIndex& parent, int s void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::string, std::vector< std::string > > >& filterSource) { - clear(); + const unsigned count = filterSource.size(); + bool multipleElements = false; - std::string filter(generateFilter(*filterSource.begin())); - insert(QString::fromUtf8(filter.c_str())); - - for (unsigned i = 0; i < filterSource.size(); ++i) //test + switch (count) { - std::cout< Date: Thu, 20 Feb 2014 16:55:51 +0100 Subject: [PATCH 10/21] try with the passing action --- apps/opencs/view/filter/editwidget.cpp | 54 +++++++++++++++++---- apps/opencs/view/filter/editwidget.hpp | 4 +- apps/opencs/view/filter/filterbox.cpp | 6 +-- apps/opencs/view/filter/filterbox.hpp | 6 ++- apps/opencs/view/filter/recordfilterbox.cpp | 4 +- apps/opencs/view/filter/recordfilterbox.hpp | 4 +- apps/opencs/view/world/table.cpp | 16 +++++- apps/opencs/view/world/tablesubview.cpp | 12 ++--- apps/opencs/view/world/tablesubview.hpp | 8 ++- 9 files changed, 87 insertions(+), 27 deletions(-) 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); }; } From 7dff34ebf1f8d4c9b2fcba94dbd3fd4358ffc6de Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Thu, 20 Feb 2014 19:15:09 +0100 Subject: [PATCH 11/21] Features implemented. Time to debug. --- apps/opencs/view/filter/editwidget.cpp | 82 +++++++++++++++----------- 1 file changed, 48 insertions(+), 34 deletions(-) diff --git a/apps/opencs/view/filter/editwidget.cpp b/apps/opencs/view/filter/editwidget.cpp index 0668634930..624fe3cde3 100644 --- a/apps/opencs/view/filter/editwidget.cpp +++ b/apps/opencs/view/filter/editwidget.cpp @@ -60,7 +60,7 @@ void CSVFilter::EditWidget::filterRowsInserted (const QModelIndex& parent, int s } void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::string, std::vector< std::string > > >& filterSource, - Qt::DropAction action) + Qt::DropAction action) { const unsigned count = filterSource.size(); bool multipleElements = false; @@ -80,7 +80,7 @@ void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::st } Qt::KeyboardModifiers key = QApplication::keyboardModifiers(); - QString oldContent(text()); + QString oldContent (text()); bool replaceMode = false; bool orMode = true; @@ -103,59 +103,73 @@ void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::st } if (oldContent.isEmpty() || - !oldContent.contains(QRegExp("^!.*$", Qt::CaseInsensitive))) + !oldContent.contains (QRegExp ("^!.*$", Qt::CaseInsensitive))) { replaceMode = true; } + if (!replaceMode) + { + int index = oldContent.indexOf ('('); + + if (index != 0) + { + oldContent.remove ('!'); + } + } + std::string orAnd; + if (orMode) { - orAnd = "or"; + orAnd = "!or("; } else { - orAnd = "and"; + orAnd = "!and("; } + clear(); + std::stringstream ss; + if (multipleElements) //TODO appending to the existing filter { - std::stringstream ss; if (replaceMode) { ss<<"!or("; - - for (unsigned i = 0; i < count; ++i) - { - ss<2) - { - clear(); - insert (QString::fromUtf8 (ss.str().c_str())); - } } else { - //not handled (yet) TODO + ss << orAnd << oldContent.toStdString() << ','; + } + + for (unsigned i = 0; i < count; ++i) + { + ss<5) + { + insert (QString::fromUtf8 (ss.str().c_str())); } } else { - if (replaceMode) + if (!replaceMode) { - std::string filter(generateFilter(filterSource[0])); - - if (!filter.empty()) - { - clear(); - insert ('!' + QString::fromUtf8 (generateFilter(filterSource[0]).c_str())); - } + ss << orAnd << oldContent.toStdString()<<','; } else { - //not handled (yet) TODO + ss<<'!'; } + + ss << generateFilter (filterSource[0]); + if (!replaceMode) + { + ss<<')'; + } + + insert (QString::fromStdString (ss.str().c_str())); } } From 1c35a85adfef75fae749accac051f0359694d175 Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Thu, 20 Feb 2014 19:27:51 +0100 Subject: [PATCH 12/21] fixed bugs, added extra display_type --- apps/opencs/model/world/columnbase.hpp | 1 + apps/opencs/model/world/tablemimedata.cpp | 3 +-- apps/opencs/view/filter/editwidget.cpp | 7 +++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/opencs/model/world/columnbase.hpp b/apps/opencs/model/world/columnbase.hpp index e689c6a3f5..e043336080 100644 --- a/apps/opencs/model/world/columnbase.hpp +++ b/apps/opencs/model/world/columnbase.hpp @@ -26,6 +26,7 @@ namespace CSMWorld enum Display { + Display_None, //Do not use Display_String, //CONCRETE TYPES STARTS HERE diff --git a/apps/opencs/model/world/tablemimedata.cpp b/apps/opencs/model/world/tablemimedata.cpp index de7875cc2a..b56c9c8c25 100644 --- a/apps/opencs/model/world/tablemimedata.cpp +++ b/apps/opencs/model/world/tablemimedata.cpp @@ -441,7 +441,6 @@ CSMWorld::ColumnBase::Display CSMWorld::TableMimeData::convertEnums (CSMWorld::U default: - return CSMWorld::ColumnBase::Display_String; - + return CSMWorld::ColumnBase::Display_None; } } \ No newline at end of file diff --git a/apps/opencs/view/filter/editwidget.cpp b/apps/opencs/view/filter/editwidget.cpp index 624fe3cde3..d3a2c50a44 100644 --- a/apps/opencs/view/filter/editwidget.cpp +++ b/apps/opencs/view/filter/editwidget.cpp @@ -130,7 +130,7 @@ void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::st clear(); std::stringstream ss; - if (multipleElements) //TODO appending to the existing filter + if (multipleElements) { if (replaceMode) { @@ -169,7 +169,10 @@ void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::st ss<<')'; } - insert (QString::fromStdString (ss.str().c_str())); + if (ss.str().length() >4) + { + insert (QString::fromStdString (ss.str().c_str())); + } } } From 55e908357021300088f22a21bff5835cd1865e7f Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Fri, 21 Feb 2014 10:27:23 +0100 Subject: [PATCH 13/21] refactorisation --- apps/opencs/view/filter/editwidget.cpp | 48 ++++++++------------------ 1 file changed, 15 insertions(+), 33 deletions(-) diff --git a/apps/opencs/view/filter/editwidget.cpp b/apps/opencs/view/filter/editwidget.cpp index d3a2c50a44..b6a5618a1a 100644 --- a/apps/opencs/view/filter/editwidget.cpp +++ b/apps/opencs/view/filter/editwidget.cpp @@ -65,7 +65,7 @@ void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::st const unsigned count = filterSource.size(); bool multipleElements = false; - switch (count) + switch (count) //setting multipleElements; { case 0: //empty return; //nothing to do here @@ -83,17 +83,17 @@ void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::st QString oldContent (text()); bool replaceMode = false; - bool orMode = true; + std::string orAnd; - switch (key) + switch (key) //setting replaceMode and string used to glue expressions { case Qt::ShiftModifier: - orMode = true; + orAnd = "!or("; replaceMode = false; break; case Qt::ControlModifier: - orMode = false; + orAnd = "!and("; replaceMode = false; break; @@ -102,32 +102,16 @@ void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::st break; } - if (oldContent.isEmpty() || - !oldContent.contains (QRegExp ("^!.*$", Qt::CaseInsensitive))) + if (oldContent.isEmpty() || !oldContent.contains (QRegExp ("^!.*$", Qt::CaseInsensitive))) //if line edit is empty or it does not contain one shot filter go into replace mode { replaceMode = true; } if (!replaceMode) { - int index = oldContent.indexOf ('('); - - if (index != 0) - { - oldContent.remove ('!'); - } + oldContent.remove ('!'); } - std::string orAnd; - - if (orMode) - { - orAnd = "!or("; - } else { - orAnd = "!and("; - } - - clear(); std::stringstream ss; if (multipleElements) @@ -150,29 +134,27 @@ void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::st } ss<<')'; - - if (ss.str().length() >5) - { - insert (QString::fromUtf8 (ss.str().c_str())); - } } else { if (!replaceMode) { - ss << orAnd << oldContent.toStdString()<<','; + ss << orAnd << oldContent.toStdString() <<','; } else { ss<<'!'; } ss << generateFilter (filterSource[0]); + if (!replaceMode) { ss<<')'; } - if (ss.str().length() >4) - { - insert (QString::fromStdString (ss.str().c_str())); - } + } + + if (ss.str().length() >4) + { + clear(); + insert (QString::fromStdString (ss.str().c_str())); } } From fcf17805a0215b699b6aeaf84f804ab816b6916b Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Fri, 21 Feb 2014 12:48:39 +0100 Subject: [PATCH 14/21] Installing basic event filter --- apps/opencs/view/world/tablesubview.cpp | 14 +++++++++++++- apps/opencs/view/world/tablesubview.hpp | 3 +++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/apps/opencs/view/world/tablesubview.cpp b/apps/opencs/view/world/tablesubview.cpp index 21496dab73..ec509ae134 100644 --- a/apps/opencs/view/world/tablesubview.cpp +++ b/apps/opencs/view/world/tablesubview.cpp @@ -44,6 +44,9 @@ CSVWorld::TableSubView::TableSubView (const CSMWorld::UniversalId& id, CSMDoc::D mTable->tableSizeUpdate(); mTable->selectionSizeUpdate(); + mTable->installEventFilter(this); + mBottom->installEventFilter(this); + filterBox->installEventFilter(this); if (mBottom->canCreateAndDelete()) { @@ -107,4 +110,13 @@ void CSVWorld::TableSubView::createFilterRequest (std::vector< CSMWorld::Univers filterSource.push_back(pair); } emit createFilterRequest(filterSource, action); -} \ No newline at end of file +} + +bool CSVWorld::TableSubView::eventFilter (QObject* object, QEvent* event) +{ + return false; +} + +void CSVWorld::TableSubView::dropEvent (QDropEvent* event) +{ +} diff --git a/apps/opencs/view/world/tablesubview.hpp b/apps/opencs/view/world/tablesubview.hpp index e8c75d3a34..399d6ce0ba 100644 --- a/apps/opencs/view/world/tablesubview.hpp +++ b/apps/opencs/view/world/tablesubview.hpp @@ -41,6 +41,9 @@ namespace CSVWorld virtual void setStatusBar (bool show); + bool eventFilter(QObject* object, QEvent *event); + void dropEvent(QDropEvent *event); + signals: void cloneRequest(const std::string&, const CSMWorld::UniversalId::Type); From e2dce535433e5f0cbcb04a57ce54f7430ec3c07f Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Fri, 21 Feb 2014 12:55:01 +0100 Subject: [PATCH 15/21] additional check on droping to prevent exception --- apps/opencs/view/world/table.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/opencs/view/world/table.cpp b/apps/opencs/view/world/table.cpp index f2999bbbde..edf3bc6dea 100644 --- a/apps/opencs/view/world/table.cpp +++ b/apps/opencs/view/world/table.cpp @@ -499,6 +499,11 @@ void CSVWorld::Table::dropEvent(QDropEvent *event) { QModelIndex index = indexAt (event->pos()); + if (!index.isValid()) + { + return; + } + const CSMWorld::TableMimeData* mime = dynamic_cast (event->mimeData()); if (mime->fromDocument (mDocument)) { From e348c6baa9e2714d7393d3af4b0a9dd80f1af1b2 Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Fri, 21 Feb 2014 13:30:52 +0100 Subject: [PATCH 16/21] =?UTF-8?q?accept=20drops=20from=20filters=20table.?= =?UTF-8?q?=20Cool.=20=E2=98=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/opencs/view/filter/editwidget.cpp | 9 ++++++++- apps/opencs/view/filter/editwidget.hpp | 2 ++ apps/opencs/view/filter/filterbox.cpp | 1 + apps/opencs/view/filter/filterbox.hpp | 1 + apps/opencs/view/filter/recordfilterbox.cpp | 2 ++ apps/opencs/view/filter/recordfilterbox.hpp | 1 + apps/opencs/view/world/table.hpp | 3 +-- apps/opencs/view/world/tablesubview.cpp | 22 +++++++++++++++------ apps/opencs/view/world/tablesubview.hpp | 3 ++- 9 files changed, 34 insertions(+), 10 deletions(-) diff --git a/apps/opencs/view/filter/editwidget.cpp b/apps/opencs/view/filter/editwidget.cpp index b6a5618a1a..cc1578bdd9 100644 --- a/apps/opencs/view/filter/editwidget.cpp +++ b/apps/opencs/view/filter/editwidget.cpp @@ -154,7 +154,7 @@ void CSVFilter::EditWidget::createFilterRequest (std::vector< std::pair< std::st if (ss.str().length() >4) { clear(); - insert (QString::fromStdString (ss.str().c_str())); + insert (QString::fromUtf8(ss.str().c_str())); } } @@ -194,3 +194,10 @@ std::string CSVFilter::EditWidget::generateFilter (std::pair< std::string, std:: return ss.str(); } + +void CSVFilter::EditWidget::useFilterRequest (const std::string& idOfFilter) +{ + clear(); + insert(QString::fromUtf8(idOfFilter.c_str())); +} + diff --git a/apps/opencs/view/filter/editwidget.hpp b/apps/opencs/view/filter/editwidget.hpp index 59fb898837..555b6d3602 100644 --- a/apps/opencs/view/filter/editwidget.hpp +++ b/apps/opencs/view/filter/editwidget.hpp @@ -49,6 +49,8 @@ namespace CSVFilter void createFilterRequest(std::vector > >& filterSource, Qt::DropAction action); + + void useFilterRequest(const std::string& idOfFilter); }; } diff --git a/apps/opencs/view/filter/filterbox.cpp b/apps/opencs/view/filter/filterbox.cpp index 132beca228..a332880252 100644 --- a/apps/opencs/view/filter/filterbox.cpp +++ b/apps/opencs/view/filter/filterbox.cpp @@ -28,6 +28,7 @@ CSVFilter::FilterBox::FilterBox (CSMWorld::Data& data, QWidget *parent) connect(this, SIGNAL(createFilterRequest(std::vector > >&, Qt::DropAction)), recordFilterBox, SIGNAL(createFilterRequest(std::vector > >&, Qt::DropAction))); + connect(this, SIGNAL(useFilterRequest(const std::string&)), recordFilterBox, SIGNAL(useFilterRequest(const std::string&))); setAcceptDrops(true); } diff --git a/apps/opencs/view/filter/filterbox.hpp b/apps/opencs/view/filter/filterbox.hpp index 0c5ba667bd..3817d5e709 100644 --- a/apps/opencs/view/filter/filterbox.hpp +++ b/apps/opencs/view/filter/filterbox.hpp @@ -36,6 +36,7 @@ namespace CSVFilter void recordDropped (std::vector& types, Qt::DropAction action); void createFilterRequest(std::vector > >& filterSource, Qt::DropAction action); + void useFilterRequest(const std::string& idOfFilter); }; } diff --git a/apps/opencs/view/filter/recordfilterbox.cpp b/apps/opencs/view/filter/recordfilterbox.cpp index 530ce87145..2a1a1407fa 100644 --- a/apps/opencs/view/filter/recordfilterbox.cpp +++ b/apps/opencs/view/filter/recordfilterbox.cpp @@ -27,4 +27,6 @@ CSVFilter::RecordFilterBox::RecordFilterBox (CSMWorld::Data& data, QWidget *pare connect(this, SIGNAL(createFilterRequest(std::vector > >&, Qt::DropAction)), editWidget, SLOT(createFilterRequest(std::vector > >&, Qt::DropAction))); + + connect(this, SIGNAL(useFilterRequest(const std::string&)), editWidget, SLOT(useFilterRequest(const std::string&))); } diff --git a/apps/opencs/view/filter/recordfilterbox.hpp b/apps/opencs/view/filter/recordfilterbox.hpp index ac21c840f7..3638dc6c34 100644 --- a/apps/opencs/view/filter/recordfilterbox.hpp +++ b/apps/opencs/view/filter/recordfilterbox.hpp @@ -30,6 +30,7 @@ namespace CSVFilter void filterChanged (boost::shared_ptr filter); void createFilterRequest(std::vector > >& filterSource, Qt::DropAction action); + void useFilterRequest(const std::string& idOfFilter); }; } diff --git a/apps/opencs/view/world/table.hpp b/apps/opencs/view/world/table.hpp index 3b72c36d5b..615a31b4d7 100644 --- a/apps/opencs/view/world/table.hpp +++ b/apps/opencs/view/world/table.hpp @@ -64,10 +64,9 @@ namespace CSVWorld void dragEnterEvent(QDragEnterEvent *event); - void dropEvent(QDropEvent *event); - void dragMoveEvent(QDragMoveEvent *event); + void dropEvent(QDropEvent *event); public: diff --git a/apps/opencs/view/world/tablesubview.cpp b/apps/opencs/view/world/tablesubview.cpp index ec509ae134..e330d47758 100644 --- a/apps/opencs/view/world/tablesubview.cpp +++ b/apps/opencs/view/world/tablesubview.cpp @@ -2,6 +2,7 @@ #include "tablesubview.hpp" #include +#include #include "../../model/doc/document.hpp" #include "../../model/world/tablemimedata.hpp" @@ -44,7 +45,7 @@ CSVWorld::TableSubView::TableSubView (const CSMWorld::UniversalId& id, CSMDoc::D mTable->tableSizeUpdate(); mTable->selectionSizeUpdate(); - mTable->installEventFilter(this); + mTable->viewport()->installEventFilter(this); mBottom->installEventFilter(this); filterBox->installEventFilter(this); @@ -68,6 +69,8 @@ CSVWorld::TableSubView::TableSubView (const CSMWorld::UniversalId& id, CSMDoc::D connect(filterBox, SIGNAL(recordDropped(std::vector&, Qt::DropAction)), this, SLOT(createFilterRequest(std::vector&, Qt::DropAction))); + connect(this, SIGNAL(useFilterRequest(const std::string&)), filterBox, SIGNAL(useFilterRequest(const std::string&))); + connect(this, SIGNAL(createFilterRequest(std::vector > >&, Qt::DropAction)), filterBox, SIGNAL(createFilterRequest(std::vector > >&, Qt::DropAction))); } @@ -114,9 +117,16 @@ void CSVWorld::TableSubView::createFilterRequest (std::vector< CSMWorld::Univers bool CSVWorld::TableSubView::eventFilter (QObject* object, QEvent* event) { + if (event->type() == QEvent::Drop) + { + QDropEvent* drop = dynamic_cast(event); + const CSMWorld::TableMimeData* data = dynamic_cast(drop->mimeData()); + bool handled = data->holdsType(CSMWorld::UniversalId::Type_Filter); + if (handled) + { + emit useFilterRequest(data->returnMatching(CSMWorld::UniversalId::Type_Filter).getId()); + } + return handled; + } return false; -} - -void CSVWorld::TableSubView::dropEvent (QDropEvent* event) -{ -} +} \ No newline at end of file diff --git a/apps/opencs/view/world/tablesubview.hpp b/apps/opencs/view/world/tablesubview.hpp index 399d6ce0ba..1f67e0262a 100644 --- a/apps/opencs/view/world/tablesubview.hpp +++ b/apps/opencs/view/world/tablesubview.hpp @@ -41,14 +41,15 @@ namespace CSVWorld virtual void setStatusBar (bool show); + protected: bool eventFilter(QObject* object, QEvent *event); - void dropEvent(QDropEvent *event); signals: void cloneRequest(const std::string&, const CSMWorld::UniversalId::Type); void createFilterRequest(std::vector > >& filterSource, Qt::DropAction action); + void useFilterRequest(const std::string& idOfFilter); private slots: From c3f350e3fb1b7936ad1d78bc79c04054d5489dac Mon Sep 17 00:00:00 2001 From: cc9cii Date: Sat, 22 Feb 2014 12:06:50 +1100 Subject: [PATCH 17/21] Allow MinGW64 compilation in Windows/msys --- .gitignore | 1 + apps/openmw/mwrender/videoplayer.cpp | 2 +- apps/openmw/mwworld/worldimp.cpp | 2 +- components/files/configurationmanager.hpp | 2 +- extern/sdl4ogre/sdlwindowhelper.cpp | 4 ++++ libs/platform/string.h | 2 +- 6 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 3975c4521b..ca58fc0064 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ Doxygen ## ides/editors *~ +*.bak *.kdev4 *.swp *.swo diff --git a/apps/openmw/mwrender/videoplayer.cpp b/apps/openmw/mwrender/videoplayer.cpp index adf20dc633..4209fb9781 100644 --- a/apps/openmw/mwrender/videoplayer.cpp +++ b/apps/openmw/mwrender/videoplayer.cpp @@ -385,7 +385,7 @@ class MovieAudioDecoder : public MWSound::Sound_Decoder } void open(const std::string&) -#ifdef _WIN32 +#ifdef _MSC_VER { fail(std::string("Invalid call to ")+__FUNCSIG__); } #else { fail(std::string("Invalid call to ")+__PRETTY_FUNCTION__); } diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index be6c0b338f..21780fd5c9 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -1,5 +1,5 @@ #include "worldimp.hpp" -#ifdef _WIN32 +#if defined(_WIN32) && !defined(__MINGW32__) #include #elif defined HAVE_UNORDERED_MAP #include diff --git a/components/files/configurationmanager.hpp b/components/files/configurationmanager.hpp index 35144fe04f..9f31a7f2d5 100644 --- a/components/files/configurationmanager.hpp +++ b/components/files/configurationmanager.hpp @@ -1,7 +1,7 @@ #ifndef COMPONENTS_FILES_CONFIGURATIONMANAGER_HPP #define COMPONENTS_FILES_CONFIGURATIONMANAGER_HPP -#ifdef _WIN32 +#if defined(_WIN32) && !defined(__MINGW32__) #include #elif defined HAVE_UNORDERED_MAP #include diff --git a/extern/sdl4ogre/sdlwindowhelper.cpp b/extern/sdl4ogre/sdlwindowhelper.cpp index f819043cfd..2a54a86369 100644 --- a/extern/sdl4ogre/sdlwindowhelper.cpp +++ b/extern/sdl4ogre/sdlwindowhelper.cpp @@ -31,7 +31,11 @@ SDLWindowHelper::SDLWindowHelper (SDL_Window* window, int w, int h, #ifdef WIN32 case SDL_SYSWM_WINDOWS: // Windows code +#ifdef __MINGW64__ + winHandle = Ogre::StringConverter::toString((DWORD_PTR)wmInfo.info.win.window); +#else winHandle = Ogre::StringConverter::toString((unsigned long)wmInfo.info.win.window); +#endif /* __MINGW64__ */ break; #elif __MACOSX__ case SDL_SYSWM_COCOA: diff --git a/libs/platform/string.h b/libs/platform/string.h index 5368d757cc..7f08765879 100644 --- a/libs/platform/string.h +++ b/libs/platform/string.h @@ -9,7 +9,7 @@ #include #if (defined(__APPLE__) && __MAC_OS_X_VERSION_MIN_REQUIRED < 1070) || defined(__MINGW32__) // need our own implementation of strnlen -#ifdef __MINGW32__ +#ifdef __MINGW32__ && !__MINGW64__ static size_t strnlen(const char *s, size_t n) { const char *p = (const char *)memchr(s, 0, n); From c241405d91bfa7dff7cd7149c7b81e1989b345be Mon Sep 17 00:00:00 2001 From: cc9cii Date: Sat, 22 Feb 2014 12:15:20 +1100 Subject: [PATCH 18/21] Fix Windows save & load. --- apps/openmw/engine.cpp | 5 ++++- apps/openmw/mwstate/statemanagerimp.cpp | 2 +- components/esm/esmwriter.cpp | 8 ++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index e80bd954e3..09757786b0 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -2,6 +2,7 @@ #include +#include #include #include @@ -339,8 +340,10 @@ std::string OMW::Engine::loadSettings (Settings::Manager & settings) void OMW::Engine::prepareEngine (Settings::Manager & settings) { + boost::filesystem::path saves(mCfgMgr.getUserDataPath() / "saves"); + mEnvironment.setStateManager ( - new MWState::StateManager (mCfgMgr.getUserDataPath() / "saves", mContentFiles.at (0))); + new MWState::StateManager (saves.make_preferred(), mContentFiles.at (0))); Nif::NIFFile::CacheLock cachelock; diff --git a/apps/openmw/mwstate/statemanagerimp.cpp b/apps/openmw/mwstate/statemanagerimp.cpp index ba0e1d056f..265069dc46 100644 --- a/apps/openmw/mwstate/statemanagerimp.cpp +++ b/apps/openmw/mwstate/statemanagerimp.cpp @@ -176,7 +176,7 @@ void MWState::StateManager::saveGame (const std::string& description, const Slot else slot = mCharacterManager.getCurrentCharacter()->updateSlot (slot, profile); - std::ofstream stream (slot->mPath.string().c_str()); + std::ofstream stream (slot->mPath.string().c_str(), std::ios::binary); ESM::ESMWriter writer; diff --git a/components/esm/esmwriter.cpp b/components/esm/esmwriter.cpp index f38591b7bf..91f123eb71 100644 --- a/components/esm/esmwriter.cpp +++ b/components/esm/esmwriter.cpp @@ -80,8 +80,8 @@ namespace ESM rec.name = name; rec.position = mStream->tellp(); rec.size = 0; - writeT(0); // Size goes here - writeT(0); // Unused header? + writeT(0); // Size goes here + writeT(0); // Unused header? writeT(flags); mRecords.push_back(rec); @@ -105,7 +105,7 @@ namespace ESM rec.name = name; rec.position = mStream->tellp(); rec.size = 0; - writeT(0); // Size goes here + writeT(0); // Size goes here mRecords.push_back(rec); assert(mRecords.back().size == 0); @@ -120,7 +120,7 @@ namespace ESM mStream->seekp(rec.position); mCounting = false; - write (reinterpret_cast (&rec.size), sizeof(int)); + write (reinterpret_cast (&rec.size), sizeof(uint32_t)); mCounting = true; mStream->seekp(0, std::ios::end); From 29a33364cc4f72fc86b3cbb3b6617bf13983388c Mon Sep 17 00:00:00 2001 From: cc9cii Date: Sat, 22 Feb 2014 17:21:19 +1100 Subject: [PATCH 19/21] Another attempt at fixing MinGW64 --- libs/platform/string.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/platform/string.h b/libs/platform/string.h index 7f08765879..be2e976b2d 100644 --- a/libs/platform/string.h +++ b/libs/platform/string.h @@ -9,7 +9,7 @@ #include #if (defined(__APPLE__) && __MAC_OS_X_VERSION_MIN_REQUIRED < 1070) || defined(__MINGW32__) // need our own implementation of strnlen -#ifdef __MINGW32__ && !__MINGW64__ +#if defined(__MINGW32__) && !defined(__MINGW64__) static size_t strnlen(const char *s, size_t n) { const char *p = (const char *)memchr(s, 0, n); From ac606a865c5fa2ffbf1dfe521ae0bf5f1384a786 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Sat, 22 Feb 2014 23:22:23 +1100 Subject: [PATCH 20/21] Back out unnecessary change. --- apps/openmw/engine.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index 09757786b0..e80bd954e3 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -2,7 +2,6 @@ #include -#include #include #include @@ -340,10 +339,8 @@ std::string OMW::Engine::loadSettings (Settings::Manager & settings) void OMW::Engine::prepareEngine (Settings::Manager & settings) { - boost::filesystem::path saves(mCfgMgr.getUserDataPath() / "saves"); - mEnvironment.setStateManager ( - new MWState::StateManager (saves.make_preferred(), mContentFiles.at (0))); + new MWState::StateManager (mCfgMgr.getUserDataPath() / "saves", mContentFiles.at (0))); Nif::NIFFile::CacheLock cachelock; From fcfc8fcccb90a9cd7429eeb7209bc447ea59879d Mon Sep 17 00:00:00 2001 From: cc9cii Date: Sat, 22 Feb 2014 23:45:13 +1100 Subject: [PATCH 21/21] Revert "Allow MinGW64 compilation in Windows/msys" This reverts commit c3f350e3fb1b7936ad1d78bc79c04054d5489dac. Conflicts: libs/platform/string.h --- .gitignore | 1 - apps/openmw/mwrender/videoplayer.cpp | 2 +- apps/openmw/mwworld/worldimp.cpp | 2 +- components/files/configurationmanager.hpp | 2 +- extern/sdl4ogre/sdlwindowhelper.cpp | 4 ---- libs/platform/string.h | 2 +- 6 files changed, 4 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index ca58fc0064..3975c4521b 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ Doxygen ## ides/editors *~ -*.bak *.kdev4 *.swp *.swo diff --git a/apps/openmw/mwrender/videoplayer.cpp b/apps/openmw/mwrender/videoplayer.cpp index 4209fb9781..adf20dc633 100644 --- a/apps/openmw/mwrender/videoplayer.cpp +++ b/apps/openmw/mwrender/videoplayer.cpp @@ -385,7 +385,7 @@ class MovieAudioDecoder : public MWSound::Sound_Decoder } void open(const std::string&) -#ifdef _MSC_VER +#ifdef _WIN32 { fail(std::string("Invalid call to ")+__FUNCSIG__); } #else { fail(std::string("Invalid call to ")+__PRETTY_FUNCTION__); } diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 21780fd5c9..be6c0b338f 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -1,5 +1,5 @@ #include "worldimp.hpp" -#if defined(_WIN32) && !defined(__MINGW32__) +#ifdef _WIN32 #include #elif defined HAVE_UNORDERED_MAP #include diff --git a/components/files/configurationmanager.hpp b/components/files/configurationmanager.hpp index 9f31a7f2d5..35144fe04f 100644 --- a/components/files/configurationmanager.hpp +++ b/components/files/configurationmanager.hpp @@ -1,7 +1,7 @@ #ifndef COMPONENTS_FILES_CONFIGURATIONMANAGER_HPP #define COMPONENTS_FILES_CONFIGURATIONMANAGER_HPP -#if defined(_WIN32) && !defined(__MINGW32__) +#ifdef _WIN32 #include #elif defined HAVE_UNORDERED_MAP #include diff --git a/extern/sdl4ogre/sdlwindowhelper.cpp b/extern/sdl4ogre/sdlwindowhelper.cpp index 2a54a86369..f819043cfd 100644 --- a/extern/sdl4ogre/sdlwindowhelper.cpp +++ b/extern/sdl4ogre/sdlwindowhelper.cpp @@ -31,11 +31,7 @@ SDLWindowHelper::SDLWindowHelper (SDL_Window* window, int w, int h, #ifdef WIN32 case SDL_SYSWM_WINDOWS: // Windows code -#ifdef __MINGW64__ - winHandle = Ogre::StringConverter::toString((DWORD_PTR)wmInfo.info.win.window); -#else winHandle = Ogre::StringConverter::toString((unsigned long)wmInfo.info.win.window); -#endif /* __MINGW64__ */ break; #elif __MACOSX__ case SDL_SYSWM_COCOA: diff --git a/libs/platform/string.h b/libs/platform/string.h index be2e976b2d..5368d757cc 100644 --- a/libs/platform/string.h +++ b/libs/platform/string.h @@ -9,7 +9,7 @@ #include #if (defined(__APPLE__) && __MAC_OS_X_VERSION_MIN_REQUIRED < 1070) || defined(__MINGW32__) // need our own implementation of strnlen -#if defined(__MINGW32__) && !defined(__MINGW64__) +#ifdef __MINGW32__ static size_t strnlen(const char *s, size_t n) { const char *p = (const char *)memchr(s, 0, n);