From dba352fd6f056ee85307efa3ce112d6f0c656336 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Sun, 7 Sep 2014 18:35:50 +1000 Subject: [PATCH 01/13] Check all views before exiting. --- apps/opencs/view/doc/viewmanager.cpp | 41 ++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/apps/opencs/view/doc/viewmanager.cpp b/apps/opencs/view/doc/viewmanager.cpp index 6f4217aa8..e7d948ee7 100644 --- a/apps/opencs/view/doc/viewmanager.cpp +++ b/apps/opencs/view/doc/viewmanager.cpp @@ -174,15 +174,15 @@ bool CSVDoc::ViewManager::closeRequest (View *view) bool continueWithClose = true; - if (iter!=mViews.end()) + if (iter!=mViews.end()) // found view in mViews { bool last = countViews (view->getDocument())<=1; - if (last) + if (last) // only this view for the document continueWithClose = notifySaveOnClose (view); else { - (*iter)->deleteLater(); + (*iter)->deleteLater(); // there are other views, delete this one mViews.erase (iter); updateIndices(); @@ -343,6 +343,37 @@ void CSVDoc::ViewManager::onExitWarningHandler (int state, CSMDoc::Document *doc void CSVDoc::ViewManager::exitApplication (CSVDoc::View *view) { - if (notifySaveOnClose (view)) - QApplication::instance()->exit(); + // close the current view first + if(!closeRequest(view)) + return; // don't exit the application + else + { + view->deleteLater(); // ok to close the current view + view->setVisible(false); + std::vector::iterator iter = std::find (mViews.begin(), mViews.end(), view); + if (iter!=mViews.end()) + { + mViews.erase (iter); + updateIndices(); + } + + // attempt to close all other views + while(!mViews.empty()) + { + // raise the window + mViews.back()->activateWindow(); + mViews.back()->raise(); + // attempt to close it + if (!closeRequest(mViews.back())) + return; + else + { + mViews.back()->deleteLater(); + mViews.back()->setVisible(false); + mViews.pop_back(); + updateIndices(); + } + } + } + QApplication::instance()->exit(); } From cedf1171e3936724ad4ffdcb811fc83b70ce0231 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Sun, 7 Sep 2014 18:37:33 +1000 Subject: [PATCH 02/13] Cleanup comments. --- apps/opencs/view/doc/viewmanager.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/opencs/view/doc/viewmanager.cpp b/apps/opencs/view/doc/viewmanager.cpp index e7d948ee7..5b6dbaaf6 100644 --- a/apps/opencs/view/doc/viewmanager.cpp +++ b/apps/opencs/view/doc/viewmanager.cpp @@ -174,15 +174,15 @@ bool CSVDoc::ViewManager::closeRequest (View *view) bool continueWithClose = true; - if (iter!=mViews.end()) // found view in mViews + if (iter!=mViews.end()) { bool last = countViews (view->getDocument())<=1; - if (last) // only this view for the document + if (last) continueWithClose = notifySaveOnClose (view); else { - (*iter)->deleteLater(); // there are other views, delete this one + (*iter)->deleteLater(); mViews.erase (iter); updateIndices(); @@ -345,10 +345,10 @@ void CSVDoc::ViewManager::exitApplication (CSVDoc::View *view) { // close the current view first if(!closeRequest(view)) - return; // don't exit the application + return; else { - view->deleteLater(); // ok to close the current view + view->deleteLater(); view->setVisible(false); std::vector::iterator iter = std::find (mViews.begin(), mViews.end(), view); if (iter!=mViews.end()) @@ -363,7 +363,6 @@ void CSVDoc::ViewManager::exitApplication (CSVDoc::View *view) // raise the window mViews.back()->activateWindow(); mViews.back()->raise(); - // attempt to close it if (!closeRequest(mViews.back())) return; else From ad8d722763a322255c6b52a7e1cb924383b3d8a7 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Tue, 9 Sep 2014 10:05:06 +1000 Subject: [PATCH 03/13] Close documents rather than views. --- apps/opencs/view/doc/viewmanager.cpp | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/apps/opencs/view/doc/viewmanager.cpp b/apps/opencs/view/doc/viewmanager.cpp index 5b6dbaaf6..e31540173 100644 --- a/apps/opencs/view/doc/viewmanager.cpp +++ b/apps/opencs/view/doc/viewmanager.cpp @@ -343,36 +343,33 @@ void CSVDoc::ViewManager::onExitWarningHandler (int state, CSMDoc::Document *doc void CSVDoc::ViewManager::exitApplication (CSVDoc::View *view) { - // close the current view first - if(!closeRequest(view)) + // close the current document first + if(!notifySaveOnClose(view)) return; else { - view->deleteLater(); + CSMDoc::Document * document = view->getDocument(); + if(document) + mDocumentManager.removeDocument(document); view->setVisible(false); - std::vector::iterator iter = std::find (mViews.begin(), mViews.end(), view); - if (iter!=mViews.end()) - { - mViews.erase (iter); - updateIndices(); - } - // attempt to close all other views + // attempt to close all other documents while(!mViews.empty()) { // raise the window mViews.back()->activateWindow(); mViews.back()->raise(); - if (!closeRequest(mViews.back())) + if (!notifySaveOnClose(mViews.back())) return; else { - mViews.back()->deleteLater(); + document = mViews.back()->getDocument(); + if(document) + mDocumentManager.removeDocument(document); mViews.back()->setVisible(false); mViews.pop_back(); - updateIndices(); } } } - QApplication::instance()->exit(); + // Editor exits (via a signal) when the last document is deleted } From 84f57845755954d36c4003b0bd05236aed25b72b Mon Sep 17 00:00:00 2001 From: cc9cii Date: Tue, 9 Sep 2014 13:04:48 +1000 Subject: [PATCH 04/13] Remove document when closing the last view. Should resolve Bug #1292. --- apps/opencs/view/doc/view.cpp | 5 +++++ apps/opencs/view/doc/viewmanager.cpp | 12 ++++++++---- apps/opencs/view/doc/viewmanager.hpp | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/opencs/view/doc/view.cpp b/apps/opencs/view/doc/view.cpp index 4868f20ff..384ae6c54 100644 --- a/apps/opencs/view/doc/view.cpp +++ b/apps/opencs/view/doc/view.cpp @@ -24,6 +24,11 @@ void CSVDoc::View::closeEvent (QCloseEvent *event) { if (!mViewManager.closeRequest (this)) event->ignore(); + else + { + // closeRequest() returns true if last document + mViewManager.removeDocument(mDocument); + } } void CSVDoc::View::setupFileMenu() diff --git a/apps/opencs/view/doc/viewmanager.cpp b/apps/opencs/view/doc/viewmanager.cpp index e31540173..47a52891e 100644 --- a/apps/opencs/view/doc/viewmanager.cpp +++ b/apps/opencs/view/doc/viewmanager.cpp @@ -192,6 +192,12 @@ bool CSVDoc::ViewManager::closeRequest (View *view) return continueWithClose; } +void CSVDoc::ViewManager::removeDocument (CSMDoc::Document *document) +{ + if(document) + mDocumentManager.removeDocument(document); +} + bool CSVDoc::ViewManager::notifySaveOnClose (CSVDoc::View *view) { bool result = true; @@ -349,8 +355,7 @@ void CSVDoc::ViewManager::exitApplication (CSVDoc::View *view) else { CSMDoc::Document * document = view->getDocument(); - if(document) - mDocumentManager.removeDocument(document); + removeDocument(document); view->setVisible(false); // attempt to close all other documents @@ -364,8 +369,7 @@ void CSVDoc::ViewManager::exitApplication (CSVDoc::View *view) else { document = mViews.back()->getDocument(); - if(document) - mDocumentManager.removeDocument(document); + removeDocument(document); mViews.back()->setVisible(false); mViews.pop_back(); } diff --git a/apps/opencs/view/doc/viewmanager.hpp b/apps/opencs/view/doc/viewmanager.hpp index 8cc92774b..6be3aba5a 100644 --- a/apps/opencs/view/doc/viewmanager.hpp +++ b/apps/opencs/view/doc/viewmanager.hpp @@ -55,6 +55,7 @@ namespace CSVDoc ///< Return number of views for \a document. bool closeRequest (View *view); + void removeDocument (CSMDoc::Document *document); signals: From 4471fe771ee6790eee7e5e4e65120360c42a5664 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Tue, 9 Sep 2014 21:09:37 +1000 Subject: [PATCH 05/13] Fix logic errors. --- apps/opencs/view/doc/view.cpp | 2 +- apps/opencs/view/doc/viewmanager.cpp | 48 ++++++++++++++++++++++------ apps/opencs/view/doc/viewmanager.hpp | 2 +- 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/apps/opencs/view/doc/view.cpp b/apps/opencs/view/doc/view.cpp index 384ae6c54..63bb9efb1 100644 --- a/apps/opencs/view/doc/view.cpp +++ b/apps/opencs/view/doc/view.cpp @@ -27,7 +27,7 @@ void CSVDoc::View::closeEvent (QCloseEvent *event) else { // closeRequest() returns true if last document - mViewManager.removeDocument(mDocument); + mViewManager.removeDocAndView(mDocument); } } diff --git a/apps/opencs/view/doc/viewmanager.cpp b/apps/opencs/view/doc/viewmanager.cpp index 47a52891e..a037219a4 100644 --- a/apps/opencs/view/doc/viewmanager.cpp +++ b/apps/opencs/view/doc/viewmanager.cpp @@ -172,7 +172,7 @@ bool CSVDoc::ViewManager::closeRequest (View *view) { std::vector::iterator iter = std::find (mViews.begin(), mViews.end(), view); - bool continueWithClose = true; + bool continueWithClose = false; if (iter!=mViews.end()) { @@ -192,10 +192,22 @@ bool CSVDoc::ViewManager::closeRequest (View *view) return continueWithClose; } -void CSVDoc::ViewManager::removeDocument (CSMDoc::Document *document) +// NOTE: This method assumes that it is called only if the last document +void CSVDoc::ViewManager::removeDocAndView (CSMDoc::Document *document) { - if(document) - mDocumentManager.removeDocument(document); + for (std::vector::const_iterator iter (mViews.begin()); iter!=mViews.end(); ++iter) + { + // the first match should also be the only match + if((*iter)->getDocument() == document) + { + mDocumentManager.removeDocument(document); + (*iter)->deleteLater(); + mViews.erase (iter); + + updateIndices(); + return; + } + } } bool CSVDoc::ViewManager::notifySaveOnClose (CSVDoc::View *view) @@ -354,14 +366,23 @@ void CSVDoc::ViewManager::exitApplication (CSVDoc::View *view) return; else { + // don't bother closing views or updating indicies, but remove from mViews CSMDoc::Document * document = view->getDocument(); - removeDocument(document); - view->setVisible(false); + std::vector remainingViews; + for (std::vector::const_iterator iter (mViews.begin()); iter!=mViews.end(); ++iter) + { + if(document == (*iter)->getDocument()) + (*iter)->setVisible(false); + else + remainingViews.push_back(*iter); + } + mDocumentManager.removeDocument(document); + mViews = remainingViews; // attempt to close all other documents while(!mViews.empty()) { - // raise the window + // raise the window to alert the user mViews.back()->activateWindow(); mViews.back()->raise(); if (!notifySaveOnClose(mViews.back())) @@ -369,9 +390,16 @@ void CSVDoc::ViewManager::exitApplication (CSVDoc::View *view) else { document = mViews.back()->getDocument(); - removeDocument(document); - mViews.back()->setVisible(false); - mViews.pop_back(); + remainingViews.clear(); + for (std::vector::const_iterator iter (mViews.begin()); iter!=mViews.end(); ++iter) + { + if(document == (*iter)->getDocument()) + (*iter)->setVisible(false); + else + remainingViews.push_back(*iter); + } + mDocumentManager.removeDocument(document); + mViews = remainingViews; } } } diff --git a/apps/opencs/view/doc/viewmanager.hpp b/apps/opencs/view/doc/viewmanager.hpp index 6be3aba5a..e0121a7fb 100644 --- a/apps/opencs/view/doc/viewmanager.hpp +++ b/apps/opencs/view/doc/viewmanager.hpp @@ -55,7 +55,7 @@ namespace CSVDoc ///< Return number of views for \a document. bool closeRequest (View *view); - void removeDocument (CSMDoc::Document *document); + void removeDocAndView (CSMDoc::Document *document); signals: From fdc20c595dea9a36f00a975581cc3183a7204fcb Mon Sep 17 00:00:00 2001 From: cc9cii Date: Tue, 9 Sep 2014 21:24:54 +1000 Subject: [PATCH 06/13] Fix gcc compile error. --- apps/opencs/view/doc/viewmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/opencs/view/doc/viewmanager.cpp b/apps/opencs/view/doc/viewmanager.cpp index a037219a4..7690af401 100644 --- a/apps/opencs/view/doc/viewmanager.cpp +++ b/apps/opencs/view/doc/viewmanager.cpp @@ -195,7 +195,7 @@ bool CSVDoc::ViewManager::closeRequest (View *view) // NOTE: This method assumes that it is called only if the last document void CSVDoc::ViewManager::removeDocAndView (CSMDoc::Document *document) { - for (std::vector::const_iterator iter (mViews.begin()); iter!=mViews.end(); ++iter) + for (std::vector::iterator iter (mViews.begin()); iter!=mViews.end(); ++iter) { // the first match should also be the only match if((*iter)->getDocument() == document) From 77171b788bcd8c53c816c2fb091e39048bd0e46f Mon Sep 17 00:00:00 2001 From: cc9cii Date: Wed, 10 Sep 2014 14:03:25 +1000 Subject: [PATCH 07/13] Made popup messagebox non-modal. --- apps/opencs/view/doc/viewmanager.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/opencs/view/doc/viewmanager.cpp b/apps/opencs/view/doc/viewmanager.cpp index 7690af401..03d7a2638 100644 --- a/apps/opencs/view/doc/viewmanager.cpp +++ b/apps/opencs/view/doc/viewmanager.cpp @@ -228,13 +228,18 @@ bool CSVDoc::ViewManager::notifySaveOnClose (CSVDoc::View *view) bool CSVDoc::ViewManager::showModifiedDocumentMessageBox (CSVDoc::View *view) { - QMessageBox messageBox; + emit closeMessageBox(); + + QMessageBox messageBox(view); CSMDoc::Document *document = view->getDocument(); messageBox.setText ("The document has been modified."); messageBox.setInformativeText ("Do you want to save your changes?"); messageBox.setStandardButtons (QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); messageBox.setDefaultButton (QMessageBox::Save); + messageBox.setWindowModality (Qt::NonModal); + messageBox.hide(); + messageBox.show(); bool retVal = true; From 89f76080225f270ebfd7a54a19b3c74331742d12 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Wed, 10 Sep 2014 14:40:41 +1000 Subject: [PATCH 08/13] Refactor for better legibility. --- apps/opencs/view/doc/viewmanager.cpp | 45 +++++++++++----------------- apps/opencs/view/doc/viewmanager.hpp | 1 + 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/apps/opencs/view/doc/viewmanager.cpp b/apps/opencs/view/doc/viewmanager.cpp index 03d7a2638..a058ea7a2 100644 --- a/apps/opencs/view/doc/viewmanager.cpp +++ b/apps/opencs/view/doc/viewmanager.cpp @@ -364,17 +364,17 @@ void CSVDoc::ViewManager::onExitWarningHandler (int state, CSMDoc::Document *doc } } -void CSVDoc::ViewManager::exitApplication (CSVDoc::View *view) +bool CSVDoc::ViewManager::removeDocument (CSVDoc::View *view) { - // close the current document first if(!notifySaveOnClose(view)) - return; + return false; else { // don't bother closing views or updating indicies, but remove from mViews CSMDoc::Document * document = view->getDocument(); std::vector remainingViews; - for (std::vector::const_iterator iter (mViews.begin()); iter!=mViews.end(); ++iter) + std::vector::const_iterator iter = mViews.begin(); + for (; iter!=mViews.end(); ++iter) { if(document == (*iter)->getDocument()) (*iter)->setVisible(false); @@ -383,30 +383,21 @@ void CSVDoc::ViewManager::exitApplication (CSVDoc::View *view) } mDocumentManager.removeDocument(document); mViews = remainingViews; + } + return true; +} - // attempt to close all other documents - while(!mViews.empty()) - { - // raise the window to alert the user - mViews.back()->activateWindow(); - mViews.back()->raise(); - if (!notifySaveOnClose(mViews.back())) - return; - else - { - document = mViews.back()->getDocument(); - remainingViews.clear(); - for (std::vector::const_iterator iter (mViews.begin()); iter!=mViews.end(); ++iter) - { - if(document == (*iter)->getDocument()) - (*iter)->setVisible(false); - else - remainingViews.push_back(*iter); - } - mDocumentManager.removeDocument(document); - mViews = remainingViews; - } - } +void CSVDoc::ViewManager::exitApplication (CSVDoc::View *view) +{ + if(!removeDocument(view)) // close the current document first + return; + + while(!mViews.empty()) // attempt to close all other documents + { + mViews.back()->activateWindow(); + mViews.back()->raise(); // raise the window to alert the user + if(!removeDocument(mViews.back())) + return; } // Editor exits (via a signal) when the last document is deleted } diff --git a/apps/opencs/view/doc/viewmanager.hpp b/apps/opencs/view/doc/viewmanager.hpp index e0121a7fb..753d7f0cb 100644 --- a/apps/opencs/view/doc/viewmanager.hpp +++ b/apps/opencs/view/doc/viewmanager.hpp @@ -41,6 +41,7 @@ namespace CSVDoc bool notifySaveOnClose (View *view = 0); bool showModifiedDocumentMessageBox (View *view); bool showSaveInProgressMessageBox (View *view); + bool removeDocument(View *view); public: From f7c1b169b38b60ff9dd9d2cbcb3a5207b407f519 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Wed, 10 Sep 2014 20:00:07 +1000 Subject: [PATCH 09/13] Place the settings window on the center of window with keyboard focus. Should resolve Bug #1838. --- apps/opencs/view/settings/dialog.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/apps/opencs/view/settings/dialog.cpp b/apps/opencs/view/settings/dialog.cpp index 56bc1fdfe..72a022c9d 100644 --- a/apps/opencs/view/settings/dialog.cpp +++ b/apps/opencs/view/settings/dialog.cpp @@ -114,8 +114,20 @@ void CSVSettings::Dialog::show() setViewValues(); } - QPoint screenCenter = QApplication::desktop()->screenGeometry().center(); - - move (screenCenter - geometry().center()); + QWidget *currView = QApplication::activeWindow(); + if(currView) + { + // place at the center of the window with focus + QSize size = currView->size(); + move(currView->geometry().x()+(size.width() - frameGeometry().width())/2, + currView->geometry().y()+(size.height() - frameGeometry().height())/2); + } + else + { + // something's gone wrong, place at the center of the screen + QPoint screenCenter = QApplication::desktop()->screenGeometry().center(); + move(screenCenter - QPoint(frameGeometry().width()/2, + frameGeometry().height()/2)); + } QWidget::show(); } From 227eb12295415c1755e3b954c08fdaac9046022c Mon Sep 17 00:00:00 2001 From: cc9cii Date: Wed, 10 Sep 2014 20:29:47 +1000 Subject: [PATCH 10/13] Added document name to showModifiedDocumentMessageBox. --- apps/opencs/view/doc/viewmanager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/opencs/view/doc/viewmanager.cpp b/apps/opencs/view/doc/viewmanager.cpp index a058ea7a2..638b42d5f 100644 --- a/apps/opencs/view/doc/viewmanager.cpp +++ b/apps/opencs/view/doc/viewmanager.cpp @@ -233,6 +233,7 @@ bool CSVDoc::ViewManager::showModifiedDocumentMessageBox (CSVDoc::View *view) QMessageBox messageBox(view); CSMDoc::Document *document = view->getDocument(); + messageBox.setWindowTitle (document->getSavePath().filename().string().c_str()); messageBox.setText ("The document has been modified."); messageBox.setInformativeText ("Do you want to save your changes?"); messageBox.setStandardButtons (QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); From ae0fb77e30b0f437ca2086b0af03c69a771e79bb Mon Sep 17 00:00:00 2001 From: cc9cii Date: Wed, 10 Sep 2014 21:23:38 +1000 Subject: [PATCH 11/13] Move recordfilterbox label 2 pixels to right. Resolves Bug #1839. --- apps/opencs/view/filter/recordfilterbox.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/opencs/view/filter/recordfilterbox.cpp b/apps/opencs/view/filter/recordfilterbox.cpp index ec5647618..ef2aeb4d3 100644 --- a/apps/opencs/view/filter/recordfilterbox.cpp +++ b/apps/opencs/view/filter/recordfilterbox.cpp @@ -13,7 +13,9 @@ CSVFilter::RecordFilterBox::RecordFilterBox (CSMWorld::Data& data, QWidget *pare layout->setContentsMargins (0, 0, 0, 0); - layout->addWidget (new QLabel ("Record Filter", this)); + QLabel *label = new QLabel("Record Filter", this); + label->setIndent(2); + layout->addWidget (label); mEdit = new EditWidget (data, this); From 85596322f33160fbc0482261d2bd9652d4f82c33 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Wed, 10 Sep 2014 23:13:56 +1000 Subject: [PATCH 12/13] Update status bar when record filter is changed. Should resolve Bug #1290. --- apps/opencs/view/world/table.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/opencs/view/world/table.cpp b/apps/opencs/view/world/table.cpp index 43a34e41d..a9b0373c8 100644 --- a/apps/opencs/view/world/table.cpp +++ b/apps/opencs/view/world/table.cpp @@ -448,12 +448,12 @@ void CSVWorld::Table::tableSizeUpdate() size = rows; } - tableSizeChanged (size, deleted, modified); + emit tableSizeChanged (size, deleted, modified); } void CSVWorld::Table::selectionSizeUpdate() { - selectionSizeChanged (selectionModel()->selectedRows().size()); + emit selectionSizeChanged (selectionModel()->selectedRows().size()); } void CSVWorld::Table::requestFocus (const std::string& id) @@ -467,6 +467,8 @@ void CSVWorld::Table::requestFocus (const std::string& id) void CSVWorld::Table::recordFilterChanged (boost::shared_ptr filter) { mProxyModel->setFilter (filter); + tableSizeUpdate(); + selectionSizeUpdate(); } void CSVWorld::Table::mouseMoveEvent (QMouseEvent* event) From faac91472c1bcb208cc944f9cfd6fe80e136677f Mon Sep 17 00:00:00 2001 From: cc9cii Date: Wed, 10 Sep 2014 23:30:42 +1000 Subject: [PATCH 13/13] Allow '-' and '_' in new addon name. Resolves Bug #1789. --- apps/opencs/view/doc/filewidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/opencs/view/doc/filewidget.cpp b/apps/opencs/view/doc/filewidget.cpp index 9cd2fad42..f18fe695a 100644 --- a/apps/opencs/view/doc/filewidget.cpp +++ b/apps/opencs/view/doc/filewidget.cpp @@ -17,7 +17,7 @@ CSVDoc::FileWidget::FileWidget (QWidget *parent) : QWidget (parent), mAddon (fal QHBoxLayout *layout = new QHBoxLayout (this); mInput = new QLineEdit (this); - mInput->setValidator (new QRegExpValidator(QRegExp("^[a-zA-Z0-9\\s]*$"))); + mInput->setValidator (new QRegExpValidator(QRegExp("^[a-zA-Z0-9_-\\s]*$"))); layout->addWidget (mInput, 1);