Skip to content

Commit

Permalink
Implemented Drag&Drop support for content (BlueBrain#6), minor cleanu…
Browse files Browse the repository at this point in the history
…p in Configuration.cpp
  • Loading branch information
Raphael Dumusc committed Aug 26, 2013
1 parent db73c12 commit 9317b5f
Show file tree
Hide file tree
Showing 3 changed files with 178 additions and 47 deletions.
24 changes: 12 additions & 12 deletions src/Configuration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
#include "main.h"

#include <QDomElement>
#include <fstream>

Configuration::Configuration(const char * filename)
: filename_(filename)
Expand Down Expand Up @@ -116,9 +115,11 @@ Configuration::Configuration(const char * filename)
if (query_.evaluateTo(&qstring))
{
qstring.remove(QRegExp("[\\n\\t\\r]"));
backgroundColor_.setNamedColor(qstring);
if(!backgroundColor_.isValid())
backgroundColor_ = Qt::black;

if(QColor::isValidColor(qstring))
{
backgroundColor_.setNamedColor(qstring);
}
}

// get tile parameters (if we're not rank 0)
Expand Down Expand Up @@ -299,16 +300,15 @@ bool Configuration::save()
background.setAttribute("uri", backgroundUri_);
background.setAttribute("color", backgroundColor_.name());

QString xml = doc.toString(4);
std::ofstream ofs(filename_.toStdString().c_str());

if(ofs.good())
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
ofs << xml.toStdString();
return true;
put_flog(LOG_ERROR, "could not open configuration xml file for saving");
return false;
}
put_flog(LOG_ERROR, "could not write xml configuration file");
return false;
QTextStream out(&file);
out << doc.toString(4);
file.close();
return true;
}

int Configuration::getMyNumTiles()
Expand Down
189 changes: 154 additions & 35 deletions src/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,9 @@ MainWindow::MainWindow()
#if ENABLE_PYTHON_SUPPORT
PythonConsole::init();
#endif

// rank 0 window setup
resize(800,600);
setAcceptDrops(true);

// create menus in menu bar
QMenu * fileMenu = menuBar()->addMenu("&File");
Expand Down Expand Up @@ -429,51 +429,78 @@ void MainWindow::openContent()
}
}

void MainWindow::openContentsDirectory()
void MainWindow::estimateGridSize(unsigned int numElem, int &gridX, int &gridY)
{
QString directoryName = QFileDialog::getExistingDirectory(this);
gridX = (int)(ceil(sqrt(numElem)));
gridY = (gridX*(gridX-1)>=(int)numElem) ? gridX-1 : gridX;
}

void MainWindow::addContentDirectory(const QString& directoryName, int gridX, int gridY)
{
QDir directory(directoryName);
directory.setFilter(QDir::Files);
directory.setNameFilters( ContentFactory::getSupportedFilesFilter() );

QFileInfoList list = directory.entryInfoList();

// Prevent opening of folders with an excessively large number of items
if (list.size() > 16)
{
QString msg = "Opening this folder will create " + QString::number(list.size()) + " content elements. Are you sure you want to continue?";
QMessageBox::StandardButton reply = QMessageBox::question(this, "Warning", msg, QMessageBox::Yes|QMessageBox::No);
if (reply != QMessageBox::Yes)
return;
}

// If the grid size is unspecified, compute one large enough to hold all the elements
if (gridX <= 0 || gridY <= 0)
{
estimateGridSize(list.size(), gridX, gridY);
}

int gridX = QInputDialog::getInt(this, "Grid X dimension", "Grid X dimension");
int gridY = QInputDialog::getInt(this, "Grid Y dimension", "Grid Y dimension");
float w = 1./(float)gridX;
float h = 1./(float)gridY;

if(!directoryName.isEmpty())
{
QDir directory(directoryName);
directory.setFilter(QDir::Files);
directory.setNameFilters( ContentFactory::getSupportedFilesFilter() );
int contentIndex = 0;

QFileInfoList list = directory.entryInfoList();
for(int i=0; i<list.size() && contentIndex < gridX*gridY; i++)
{
QFileInfo fileInfo = list.at(i);

int contentIndex = 0;
boost::shared_ptr<Content> c = ContentFactory::getContent(fileInfo.absoluteFilePath().toStdString());

for(int i=0; i<list.size() && contentIndex < gridX*gridY; i++)
if(c != NULL)
{
QFileInfo fileInfo = list.at(i);
boost::shared_ptr<ContentWindowManager> cwm(new ContentWindowManager(c));

boost::shared_ptr<Content> c = ContentFactory::getContent(fileInfo.absoluteFilePath().toStdString());
g_displayGroupManager->addContentWindowManager(cwm);

if(c != NULL)
{
boost::shared_ptr<ContentWindowManager> cwm(new ContentWindowManager(c));
int x = contentIndex % gridX;
int y = contentIndex / gridX;

g_displayGroupManager->addContentWindowManager(cwm);
cwm->setCoordinates(x*w, y*h, w, h);

int x = contentIndex % gridX;
int y = contentIndex / gridX;
contentIndex++;

cwm->setCoordinates(x*w, y*h, w, h);
put_flog(LOG_DEBUG, "added file %s", fileInfo.absoluteFilePath().toStdString().c_str());
}
else
{
put_flog(LOG_DEBUG, "ignoring unsupported file %s", fileInfo.absoluteFilePath().toStdString().c_str());
}
}
}

contentIndex++;
void MainWindow::openContentsDirectory()
{
QString directoryName = QFileDialog::getExistingDirectory(this);

put_flog(LOG_DEBUG, "added file %s", fileInfo.absoluteFilePath().toStdString().c_str());
}
else
{
put_flog(LOG_DEBUG, "ignoring unsupported file %s", fileInfo.absoluteFilePath().toStdString().c_str());
}
}
if(!directoryName.isEmpty())
{
int gridX = QInputDialog::getInt(this, "Grid X dimension", "Grid X dimension");
int gridY = QInputDialog::getInt(this, "Grid Y dimension", "Grid Y dimension");

addContentDirectory(directoryName, gridX, gridY);
}
}

Expand Down Expand Up @@ -523,12 +550,17 @@ void MainWindow::loadState()

if(!filename.isEmpty())
{
bool success = g_displayGroupManager->loadStateXMLFile(filename.toStdString());
loadState(filename);
}
}

if(success != true)
{
QMessageBox::warning(this, "Error", "Could not load state file.", QMessageBox::Ok, QMessageBox::Ok);
}
void MainWindow::loadState(const QString& filename)
{
bool success = g_displayGroupManager->loadStateXMLFile(filename.toStdString());

if(!success)
{
QMessageBox::warning(this, "Error", "Could not load state file.", QMessageBox::Ok, QMessageBox::Ok);
}
}

Expand Down Expand Up @@ -584,6 +616,93 @@ void MainWindow::setEnableSkeletonTracking(bool enable)
}
#endif

QStringList MainWindow::extractValidContentUrls(const QMimeData* data)
{
QStringList pathList;

if (data->hasUrls())
{
QList<QUrl> urlList = data->urls();

foreach (QUrl url, urlList)
{
QString extension = QFileInfo(url.toLocalFile().toLower()).suffix();
if (ContentFactory::getSupportedExtensions().contains(extension))
pathList.append(url.toLocalFile());
}
}

return pathList;
}

QStringList MainWindow::extractFolderUrls(const QMimeData* data)
{
QStringList pathList;

if (data->hasUrls())
{
QList<QUrl> urlList = data->urls();

foreach (QUrl url, urlList)
{
if (QDir(url.toLocalFile()).exists())
pathList.append(url.toLocalFile());
}
}

return pathList;
}

QString MainWindow::extractStateFile(const QMimeData* data)
{
QList<QUrl> urlList = data->urls();
if (urlList.size() == 1)
{
QUrl url = urlList[0];
QString extension = QFileInfo(url.toLocalFile().toLower()).suffix();
if (extension == "dcx")
return url.toLocalFile();
}
return QString();
}

void MainWindow::dragEnterEvent(QDragEnterEvent* event)
{
QStringList pathList = extractValidContentUrls(event->mimeData());
QStringList dirList = extractFolderUrls(event->mimeData());
QString stateFile = extractStateFile(event->mimeData());

if (!pathList.empty() || !dirList.empty() || !stateFile.isNull())
{
event->acceptProposedAction();
}
}

void MainWindow::dropEvent(QDropEvent* event)
{
QStringList pathList = extractValidContentUrls(event->mimeData());
foreach (QString url, pathList)
{
addContent(url);
}

QStringList dirList = extractFolderUrls(event->mimeData());
if (dirList.size() > 0)
{
QString url = dirList[0]; // Only one directory at a time

addContentDirectory(url);
}

QString stateFile = extractStateFile(event->mimeData());
if (!stateFile.isNull())
{
loadState(stateFile);
}

event->acceptProposedAction();
}

void MainWindow::updateGLWindows()
{
if( g_displayGroupManager->getOptions()->getShowMouseCursor( ))
Expand Down
12 changes: 12 additions & 0 deletions src/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,20 @@ class MainWindow : public QMainWindow {
void disableSkeletonTracking();
#endif

protected:
void dragEnterEvent(QDragEnterEvent *event);
void dropEvent(QDropEvent *event);

private:
void addContent(const QString &filename);
void addContentDirectory(const QString &directoryName, int gridX=0, int gridY=0);
void loadState(const QString &filename);

void estimateGridSize(unsigned int numElem, int &gridX, int &gridY);

QStringList extractValidContentUrls(const QMimeData* data);
QStringList extractFolderUrls(const QMimeData *data);
QString extractStateFile(const QMimeData *data);

std::vector<boost::shared_ptr<GLWindow> > glWindows_;
boost::shared_ptr<GLWindow> activeGLWindow_;
Expand Down

0 comments on commit 9317b5f

Please sign in to comment.