diff --git a/modules/gui/src/file_loader.cc b/modules/gui/src/file_loader.cc index ac35f1a6a0bc03873dc1bdcebbdcde023b4df2eb..b013bdfdf39b894d673849c7062a1627ddff166e 100644 --- a/modules/gui/src/file_loader.cc +++ b/modules/gui/src/file_loader.cc @@ -132,21 +132,24 @@ void FileLoader::AddToScene(const QString& filename, gfx::GfxObjP obj) gfx::GfxObjP FileLoader::NoHandlerFound(const QString& filename) { - FileTypeDialog dialog(filename); + /// FIXME: This currently leaks! I haven't found a way to allocate the dialog + /// on the stack without crashing the program. + /// This is BZDNG-192 + FileTypeDialog* dialog=new FileTypeDialog(filename); try{ - if(dialog.exec()){ - if(dialog.GetEntityHandler()){ - return TryLoadEntity(filename, dialog.GetEntityHandler()); + if(dialog->exec()){ + if(dialog->GetEntityHandler()){ + return TryLoadEntity(filename, dialog->GetEntityHandler()); } - if(dialog.GetSequenceHandler()){ - return TryLoadAlignment(filename, dialog.GetSequenceHandler()); + if(dialog->GetSequenceHandler()){ + return TryLoadAlignment(filename, dialog->GetSequenceHandler()); } - if(dialog.GetSurfaceHandler()){ - return TryLoadSurface(filename,dialog.GetSurfaceHandler()); + if(dialog->GetSurfaceHandler()){ + return TryLoadSurface(filename,dialog->GetSurfaceHandler()); } #if OST_IMG_ENABLED - if(dialog.GetMapHandler()){ - return TryLoadMap(filename,dialog.GetMapHandler()); + if(dialog->GetMapHandler()){ + return TryLoadMap(filename,dialog->GetMapHandler()); } #endif } @@ -251,7 +254,8 @@ gfx::GfxObjP FileLoader::TryLoadEntity(const QString& filename, io::EntityIOHand conop::BuilderP builder = conop::Conopology::Instance().GetBuilder(); conop::Conopology::Instance().ConnectAll(builder,eh,0); } - gfx::GfxObjP obj(new gfx::Entity(file_info.baseName().toStdString(),eh,mol::Query(selection.toStdString()))); + gfx::GfxObjP obj(new gfx::Entity(file_info.baseName().toStdString(), + eh, mol::Query(selection.toStdString()))); return obj; } } diff --git a/modules/gui/src/file_type_dialog.cc b/modules/gui/src/file_type_dialog.cc index caf11bc83b38de6232557828feb57da9cd1e93cb..d0a45602eefe595d68d1de5e91e3e4f1b1fb804a 100644 --- a/modules/gui/src/file_type_dialog.cc +++ b/modules/gui/src/file_type_dialog.cc @@ -29,6 +29,75 @@ #include <QHeaderView> namespace ost { namespace gui { + +namespace { + +class FileTypeList : public QTableWidget { +public: + FileTypeList(QWidget* parent=NULL): QTableWidget(parent) + { + this->setShowGrid(false); + this->horizontalHeader()->setStretchLastSection(true); + this->setColumnCount(2); + this->setAttribute(Qt::WA_MacSmallSize); + this->verticalHeader()->setVisible(false); + this->horizontalHeader()->setVisible(false); + this->setSelectionBehavior(QAbstractItemView::SelectRows); + this->setSelectionMode(QAbstractItemView::SingleSelection); + io::EntityIOHFList entity_handler = io::IOManager::Instance().GetAvailableEntityHandler(); + for(unsigned int i = 0 ; i < entity_handler.size() ; i++){ + QVariant handler = QVariant(); + handler.setValue(entity_handler[i]); + this->AddRow(this->rowCount(),entity_handler[i]->GetFormatName().c_str(),entity_handler[i]->GetFormatDescription().c_str(),handler); + } + + io::AlignmentIOFList alignment_handler = io::IOManager::Instance().GetAvailableAlignmentHandler(); + for(unsigned int i = 0 ; i < alignment_handler.size() ; i++){ + QVariant handler = QVariant(); + handler.setValue(alignment_handler[i]); + this->AddRow(this->rowCount(),alignment_handler[i]->GetFormatName().c_str(),alignment_handler[i]->GetFormatDescription().c_str(),handler); + } + +#if OST_IMG_ENABLED + io::MapIOFList map_handler = io::IOManager::Instance().GetAvailableMapHandler(); + for(unsigned int i = 0 ; i < map_handler.size() ; i++){ + QVariant handler = QVariant(); + handler.setValue(map_handler[i]); + this->AddRow(this->rowCount(),map_handler[i]->GetFormatName().c_str(),map_handler[i]->GetFormatDescription().c_str(),handler); + } +#endif + + io::SurfaceIOFList surf_handler = io::IOManager::Instance().GetAvailableSurfaceHandler(); + for(unsigned int i = 0 ; i < surf_handler.size() ; i++){ + QVariant handler = QVariant(); + handler.setValue(surf_handler[i]); + this->AddRow(this->rowCount(),surf_handler[i]->GetFormatName().c_str(),surf_handler[i]->GetFormatDescription().c_str(),handler); + } + } + + virtual void mouseDoubleClickEvent(QMouseEvent* event) + { + QTableWidget::mouseDoubleClickEvent(event); + dynamic_cast<QDialog*>(parent())->accept(); + } + + void AddRow(int row, const QString& format_name, const QString& format_descr, + QVariant& variant) + { + this->insertRow(row); + QTableWidgetItem* new_item = new QTableWidgetItem(format_name); + new_item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); + new_item->setData(Qt::UserRole,variant); + this->setItem(row, 0, new_item); + new_item = new QTableWidgetItem(format_descr); + new_item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); + this->setItem(row, 1, new_item); + } +}; + +} + + FileTypeDialog::FileTypeDialog(const QString& file_name, QWidget* parent): QDialog(parent),entity_handler_(),seq_handler_(), surf_handler_() #if OST_IMG_ENABLED @@ -41,16 +110,9 @@ FileTypeDialog::FileTypeDialog(const QString& file_name, QWidget* parent): label_ = new QLabel("The file format could not be recognized, " "please select the type of the file from the list:"); label_->setWordWrap(true); - list_ = new QTableWidget(this); - list_->setShowGrid(false); - list_->horizontalHeader()->setStretchLastSection(true); - list_->setColumnCount(2); - list_->setAttribute(Qt::WA_MacSmallSize); - list_->verticalHeader()->setVisible(false); - list_->horizontalHeader()->setVisible(false); - list_->setSelectionBehavior(QAbstractItemView::SelectRows); - list_->setSelectionMode(QAbstractItemView::SingleSelection); - QHBoxLayout* hb=new QHBoxLayout(); + list_ = new FileTypeList(this); + + QHBoxLayout* hb=new QHBoxLayout; vb->addWidget(label_); vb->addWidget(list_); hb->setDirection(QBoxLayout::LeftToRight); @@ -63,52 +125,11 @@ FileTypeDialog::FileTypeDialog(const QString& file_name, QWidget* parent): load_btn->setDefault(true); connect(load_btn, SIGNAL(clicked()), this, SLOT(accept())); connect(cancel_btn, SIGNAL(clicked()), this, SLOT(reject())); - - io::EntityIOHFList entity_handler = io::IOManager::Instance().GetAvailableEntityHandler(); - for(unsigned int i = 0 ; i < entity_handler.size() ; i++){ - QVariant handler = QVariant(); - handler.setValue(entity_handler[i]); - this->AddRow(list_->rowCount(),entity_handler[i]->GetFormatName().c_str(),entity_handler[i]->GetFormatDescription().c_str(),handler); - } - - io::AlignmentIOFList alignment_handler = io::IOManager::Instance().GetAvailableAlignmentHandler(); - for(unsigned int i = 0 ; i < alignment_handler.size() ; i++){ - QVariant handler = QVariant(); - handler.setValue(alignment_handler[i]); - this->AddRow(list_->rowCount(),alignment_handler[i]->GetFormatName().c_str(),alignment_handler[i]->GetFormatDescription().c_str(),handler); - } - -#if OST_IMG_ENABLED - io::MapIOFList map_handler = io::IOManager::Instance().GetAvailableMapHandler(); - for(unsigned int i = 0 ; i < map_handler.size() ; i++){ - QVariant handler = QVariant(); - handler.setValue(map_handler[i]); - this->AddRow(list_->rowCount(),map_handler[i]->GetFormatName().c_str(),map_handler[i]->GetFormatDescription().c_str(),handler); - } -#endif - - io::SurfaceIOFList surf_handler = io::IOManager::Instance().GetAvailableSurfaceHandler(); - for(unsigned int i = 0 ; i < surf_handler.size() ; i++){ - QVariant handler = QVariant(); - handler.setValue(surf_handler[i]); - this->AddRow(list_->rowCount(),surf_handler[i]->GetFormatName().c_str(),surf_handler[i]->GetFormatDescription().c_str(),handler); - } - list_->resizeColumnsToContents(); } -void FileTypeDialog::AddRow(int row, const QString& format_name, const QString& format_descr, QVariant& variant){ - list_->insertRow(row); - QTableWidgetItem* new_item = new QTableWidgetItem(format_name); - new_item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); - new_item->setData(Qt::UserRole,variant); - list_->setItem(row, 0, new_item); - new_item = new QTableWidgetItem(format_descr); - new_item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); - list_->setItem(row, 1, new_item); -} - -void FileTypeDialog::accept(){ +void FileTypeDialog::accept() +{ QList<QTableWidgetItem*> items = list_->selectedItems(); for(int i=0; i<items.size();i++){ if(items[i]->column()==0){ @@ -137,7 +158,7 @@ void FileTypeDialog::accept(){ #endif } } - this->QDialog::accept(); + QDialog::accept(); } io::EntityIOHandlerP FileTypeDialog::GetEntityHandler(){ diff --git a/modules/gui/src/file_type_dialog.hh b/modules/gui/src/file_type_dialog.hh index 2ce157556ddd2a9623b80417e9d2e48f1fc48d58..b711cbe2233d6d15ff8c551098913b1e1f6aae15 100644 --- a/modules/gui/src/file_type_dialog.hh +++ b/modules/gui/src/file_type_dialog.hh @@ -20,7 +20,7 @@ #define OST_GUI_FILE_TYPE_DIALOG_HH /* - Author: Stefan Scheuber + Author: Stefan Scheuber, Marco Biasini */ #include <ost/gui/module_config.hh> @@ -51,14 +51,9 @@ public: #if OST_IMG_ENABLED io::MapIOHandlerPtr GetMapHandler(); #endif - public slots: - virtual void accept (); - + virtual void accept(); private: - void AddRow(int row, const QString& format_name, const QString& format_descr, QVariant& variant); - - QTableWidget* list_; QLabel* label_; io::EntityIOHandlerP entity_handler_;