mirror of
https://github.com/lucaspalomodevelop/meshlab.git
synced 2026-03-18 18:44:39 +00:00
383 lines
12 KiB
C++
383 lines
12 KiB
C++
/****************************************************************************
|
||
* MeshLab o o *
|
||
* A versatile mesh processing toolbox o o *
|
||
* _ O _ *
|
||
* Copyright(C) 2005 \/)\/ *
|
||
* Visual Computing Lab /\/| *
|
||
* ISTI - Italian National Research Council | *
|
||
* \ *
|
||
* All rights reserved. *
|
||
* *
|
||
* This program is free software; you can redistribute it and/or modify *
|
||
* it under the terms of the GNU General Public License as published by *
|
||
* the Free Software Foundation; either version 2 of the License, or *
|
||
* (at your option) any later version. *
|
||
* *
|
||
* This program is distributed in the hope that it will be useful, *
|
||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) *
|
||
* for more details. *
|
||
* *
|
||
****************************************************************************/
|
||
#include "multiViewer_Container.h"
|
||
#include "glarea.h"
|
||
|
||
using namespace vcg;
|
||
|
||
MultiViewer_Container::MultiViewer_Container(QWidget *parent)
|
||
: QWidget(parent)
|
||
{
|
||
viewerList = QVector<Viewer*>();
|
||
|
||
mainLayout = new QGridLayout;
|
||
mainSplitter = new QSplitter();
|
||
mainSplitter->setChildrenCollapsible(false);
|
||
mainSplitter->setOpaqueResize(false);
|
||
mainLayout->addWidget(mainSplitter);
|
||
|
||
idCounter=0;
|
||
|
||
layerDialog = new LayerDialog(this);
|
||
layerDialog->setAllowedAreas ( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
|
||
|
||
setLayout(mainLayout);
|
||
|
||
}
|
||
|
||
MultiViewer_Container::~MultiViewer_Container(){
|
||
foreach(Viewer* viewer, viewerList)
|
||
delete viewer;
|
||
delete mainLayout;
|
||
delete mainSplitter;
|
||
delete layerDialog;
|
||
}
|
||
|
||
int MultiViewer_Container::getNextViewerId(){
|
||
return idCounter++;
|
||
}
|
||
|
||
void MultiViewer_Container::addView(Viewer* viewer, bool horiz){
|
||
viewerList.append(viewer);
|
||
int count = viewerCounter();
|
||
|
||
if (count==1){
|
||
mainSplitter->addWidget((GLArea*) viewer);
|
||
}
|
||
|
||
else{
|
||
GLArea* current = (GLArea*)currentView();
|
||
QSplitter* parentSplitter = qobject_cast<QSplitter *>(current->parent());
|
||
if(parentSplitter->count()==1){
|
||
if(horiz)
|
||
parentSplitter->setOrientation(Qt::Horizontal);
|
||
else parentSplitter->setOrientation(Qt::Vertical);
|
||
|
||
QSplitter* newSplitter = new QSplitter(Qt::Horizontal);
|
||
|
||
parentSplitter->addWidget(newSplitter);
|
||
newSplitter->addWidget((GLArea*)viewer);
|
||
|
||
QList<int> *sizes = new QList<int>();
|
||
|
||
if(parentSplitter->orientation()== Qt::Horizontal){
|
||
sizes->append(parentSplitter->width()/2);
|
||
sizes->append(parentSplitter->width()/2);
|
||
}
|
||
else{
|
||
sizes->append(parentSplitter->height()/2);
|
||
sizes->append(parentSplitter->height()/2);
|
||
}
|
||
|
||
parentSplitter->setSizes(*sizes);
|
||
|
||
newSplitter->setChildrenCollapsible(false);
|
||
|
||
}
|
||
else{
|
||
int index = parentSplitter->indexOf(current);
|
||
QSplitter* newSplitter;
|
||
if(horiz)
|
||
newSplitter = new QSplitter(Qt::Horizontal);
|
||
else newSplitter = new QSplitter(Qt::Vertical);
|
||
|
||
QList<int> sizes2 = parentSplitter->sizes();
|
||
parentSplitter->insertWidget(index, newSplitter);
|
||
|
||
QSplitter* newSplitter2 = new QSplitter(Qt::Horizontal);
|
||
newSplitter2->addWidget((GLArea*)viewer);
|
||
current->setParent(newSplitter);
|
||
newSplitter->addWidget(newSplitter2);
|
||
|
||
QList<int> *sizes = new QList<int>();
|
||
if(newSplitter->orientation()== Qt::Horizontal){
|
||
sizes->append(parentSplitter->width()/2);
|
||
sizes->append(parentSplitter->width()/2);
|
||
}
|
||
else{
|
||
sizes->append(parentSplitter->height()/2);
|
||
sizes->append(parentSplitter->height()/2);
|
||
}
|
||
|
||
parentSplitter->setSizes(sizes2);
|
||
newSplitter->setSizes(*sizes);
|
||
|
||
newSplitter->setChildrenCollapsible(false);
|
||
newSplitter2->setChildrenCollapsible(false);
|
||
}
|
||
}
|
||
|
||
|
||
//if (count<=2){
|
||
// if(horiz)
|
||
// mainSplitter->setOrientation(Qt::Horizontal);
|
||
// else mainSplitter->setOrientation(Qt::Vertical);
|
||
// mainSplitter->addWidget((GLArea*)viewer);
|
||
//}
|
||
//else{
|
||
// GLArea* current = (GLArea*)currentView();
|
||
// QSplitter* parentSplitter = qobject_cast<QSplitter *>(current->parent());
|
||
// if(parentSplitter->count()==2){
|
||
// int index = parentSplitter->indexOf(current);
|
||
// QSplitter* newSplitter;
|
||
// if(horiz)
|
||
// newSplitter = new QSplitter(Qt::Horizontal);
|
||
// else newSplitter = new QSplitter(Qt::Vertical);
|
||
// parentSplitter->insertWidget(index, newSplitter);
|
||
// current->setParent(newSplitter);
|
||
// newSplitter->addWidget((GLArea*)viewer);
|
||
|
||
// newSplitter->setChildrenCollapsible(false);
|
||
// }
|
||
// /*else{
|
||
// if(horiz)
|
||
// parentSplitter->setOrientation(Qt::Horizontal);
|
||
// else parentSplitter->setOrientation(Qt::Vertical);
|
||
// parentSplitter->addWidget((GLArea*)viewer);
|
||
// }*/
|
||
//}
|
||
|
||
//if (count==1){
|
||
// mainSplitter->addWidget((GLArea*) viewer);
|
||
//}
|
||
//else if (count==2){
|
||
// if(horiz)
|
||
// mainSplitter->setOrientation(Qt::Horizontal);
|
||
// else mainSplitter->setOrientation(Qt::Vertical);
|
||
// QSplitter* newSplitter = new QSplitter(Qt::Horizontal);
|
||
// newSplitter->addWidget((GLArea*)viewer);
|
||
// newSplitter->setChildrenCollapsible(false);
|
||
// newSplitter->setOpaqueResize(false);
|
||
|
||
// QList<int> *sizes = new QList<int>();
|
||
// int width = mainSplitter->width();
|
||
// int heigh = mainSplitter->height();
|
||
// if(mainSplitter->orientation()== Qt::Horizontal){
|
||
// sizes->append(mainSplitter->width()/2);
|
||
// sizes->append(mainSplitter->width()/2);
|
||
// }
|
||
// else{
|
||
// sizes->append(mainSplitter->height()/2);
|
||
// sizes->append(mainSplitter->height()/2);
|
||
// }
|
||
//
|
||
|
||
// mainSplitter->addWidget(newSplitter);
|
||
// mainSplitter->setSizes(*sizes);
|
||
//}
|
||
//else{
|
||
// GLArea* current = (GLArea*)currentView();
|
||
// QSplitter* parentSplitter = qobject_cast<QSplitter *>(current->parent());
|
||
// if(parentSplitter->count()==2){
|
||
//
|
||
// int index = parentSplitter->indexOf(current);
|
||
// QSplitter* newSplitter;
|
||
// if(horiz)
|
||
// newSplitter = new QSplitter(Qt::Horizontal);
|
||
// else newSplitter = new QSplitter(Qt::Vertical);
|
||
// QList<int> sizes2 = parentSplitter->sizes();
|
||
// parentSplitter->insertWidget(index, newSplitter);
|
||
// parentSplitter->setSizes(sizes2);
|
||
|
||
// current->setParent(newSplitter);
|
||
// QSplitter* newSplitter2 = new QSplitter(Qt::Horizontal);
|
||
// newSplitter2->addWidget((GLArea*)viewer);
|
||
// newSplitter->addWidget(newSplitter2);
|
||
|
||
|
||
// QList<int> *sizes = new QList<int>();
|
||
// int width = parentSplitter->width();
|
||
// int heigh = parentSplitter->height();
|
||
// if(newSplitter->orientation()== Qt::Horizontal){
|
||
// sizes->append(parentSplitter->width()/2);
|
||
// sizes->append(parentSplitter->width()/2);
|
||
// }
|
||
// else{
|
||
// sizes->append(parentSplitter->height()/2);
|
||
// sizes->append(parentSplitter->height()/2);
|
||
// }
|
||
|
||
// newSplitter->setSizes(*sizes);
|
||
|
||
// newSplitter->setChildrenCollapsible(false);
|
||
// newSplitter2->setChildrenCollapsible(false);
|
||
// /*newSplitter->setOpaqueResize(false);
|
||
// newSplitter2->setOpaqueResize(false);*/
|
||
// }
|
||
// else{
|
||
// //if(parentSplitter->count()==2){
|
||
// //int index = parentSplitter->indexOf(current);
|
||
// if(horiz)
|
||
// parentSplitter->setOrientation(Qt::Horizontal);
|
||
// else parentSplitter->setOrientation(Qt::Vertical);
|
||
|
||
// QSplitter* newSplitter = new QSplitter(Qt::Horizontal);
|
||
|
||
// parentSplitter->addWidget(newSplitter);
|
||
// newSplitter->addWidget((GLArea*)viewer);
|
||
|
||
// QList<int> *sizes = new QList<int>();
|
||
// int width = parentSplitter->width();
|
||
// int heigh = parentSplitter->height();
|
||
// if(parentSplitter->orientation()== Qt::Horizontal){
|
||
// sizes->append(parentSplitter->width()/2);
|
||
// sizes->append(parentSplitter->width()/2);
|
||
// }
|
||
// else{
|
||
// sizes->append(parentSplitter->height()/2);
|
||
// sizes->append(parentSplitter->height()/2);
|
||
// }
|
||
|
||
// parentSplitter->setSizes(*sizes);
|
||
|
||
// newSplitter->setChildrenCollapsible(false);
|
||
// //newSplitter->setOpaqueResize(false);
|
||
// }
|
||
// //}
|
||
// /*else{
|
||
// if(horiz)
|
||
// parentSplitter->setOrientation(Qt::Horizontal);
|
||
// else parentSplitter->setOrientation(Qt::Vertical);
|
||
// parentSplitter->addWidget((GLArea*)viewer);
|
||
// }*/
|
||
//}
|
||
|
||
currentId = viewer->getId();
|
||
//action for new viewer
|
||
connect((GLArea*) viewer, SIGNAL(currentViewerChanged(int)), this, SLOT(updateCurrent(int)));
|
||
|
||
}
|
||
|
||
void MultiViewer_Container::removeView(int viewerId){
|
||
//DA RIFARE
|
||
for (int i=0; i< viewerList.count(); i++){
|
||
Viewer* viewer = viewerList.at(i);
|
||
if (viewer->getId() == viewerId){
|
||
viewerList.remove(i);
|
||
QSplitter* parentSplitter = qobject_cast<QSplitter *>(((GLArea*)viewer)->parent());
|
||
delete viewer;
|
||
if(parentSplitter->count()==0)
|
||
delete parentSplitter;
|
||
if(parentSplitter->count()==1){
|
||
QSplitter* parentParentSplitter = qobject_cast<QSplitter *>(parentSplitter->parent());
|
||
if(parentParentSplitter){
|
||
int index = parentParentSplitter->indexOf(parentSplitter);
|
||
parentParentSplitter->insertWidget(index,parentSplitter->widget(0));
|
||
delete parentSplitter;
|
||
}
|
||
}
|
||
|
||
currentId = viewerList.at(0)->getId(); //per default il current <20> il primo viewer della lista (sempre presente)
|
||
|
||
updateLayout();
|
||
}
|
||
}
|
||
|
||
|
||
/*if(horiz)
|
||
parentSplitter->setOrientation(Qt::Horizontal);
|
||
else
|
||
parentSplitter->setOrientation(Qt::Vertical);*/
|
||
}
|
||
|
||
void MultiViewer_Container::connectToLayerDialog(Viewer* viewer){
|
||
connect(((GLArea*) viewer)->meshDoc, SIGNAL(currentMeshChanged(int)),layerDialog, SLOT(updateTable()));
|
||
}
|
||
|
||
void MultiViewer_Container::updateCurrent(int current){
|
||
currentId=current;
|
||
}
|
||
|
||
void MultiViewer_Container::updateLayout(){
|
||
foreach(Viewer* viewer, viewerList)
|
||
//splitter->removeWidget((GLArea*)viewer);
|
||
for (int i=0; i< viewerList.count(); i++){
|
||
int row = i/2;
|
||
int column = i%2;
|
||
//splitter->addWidget((GLArea*)viewerList.at(i));//, row, column);
|
||
}
|
||
}
|
||
|
||
Viewer* MultiViewer_Container::currentView(){
|
||
foreach ( Viewer* viewer, viewerList)
|
||
if (viewer->getId() == currentId)
|
||
return viewer;
|
||
}
|
||
|
||
int MultiViewer_Container::viewerCounter(){
|
||
return viewerList.count();
|
||
}
|
||
|
||
void MultiViewer_Container::resizeEvent ( QResizeEvent * event ) {
|
||
/*if(data->imageList.size()!=0){
|
||
imageVis->adjustSize();
|
||
}*/
|
||
}
|
||
/// update all the visual widgets at one time (glw, imageVis, tree, imageMag)
|
||
void MultiViewer_Container::updateAll(){
|
||
/*glw->update();
|
||
imageVis->update();
|
||
imageMag->update();
|
||
tree->updatePoints();*/
|
||
}
|
||
void MultiViewer_Container::keyPressEvent(QKeyEvent *keyEv){
|
||
//keyEv->accept();
|
||
//
|
||
//// if the Delete key is pressed, then remove the selected point
|
||
//if((data->selectedImagePoint.x()!=-1 || data->selectedMeshPoint!=-1) && keyEv->key() == Qt::Key_Delete){
|
||
//
|
||
// if(data->selectedImagePoint.x()!=-1){
|
||
// data->deleteImagePoint(data->selectedImagePoint);
|
||
// imageMag->update();
|
||
// glw->update();
|
||
// }
|
||
// else{ data->deleteMeshPoint(data->selectedMeshPoint);
|
||
// glw->update();
|
||
// }
|
||
//
|
||
//}else
|
||
// // if any of WASD keys are pressed, then move the selected image point
|
||
// if(data->selectedImagePoint.x()!=-1 && (keyEv->key() == Qt::Key_A || keyEv->key() == Qt::Key_S || keyEv->key() == Qt::Key_D || keyEv->key() == Qt::Key_W)){
|
||
// QPoint currentPoint = data->selectedImagePoint;
|
||
//
|
||
// switch(keyEv->key()){
|
||
// case Qt::Key_A:
|
||
// currentPoint.setX(currentPoint.x()-1);
|
||
// data->setSelectedImagePoint(currentPoint);
|
||
// break;
|
||
// case Qt::Key_D:
|
||
// currentPoint.setX(currentPoint.x()+1);
|
||
// data->setSelectedImagePoint(currentPoint);
|
||
// break;
|
||
// case Qt::Key_W:
|
||
// currentPoint.setY(currentPoint.y()-1);
|
||
// data->setSelectedImagePoint(currentPoint);
|
||
// break;
|
||
// case Qt::Key_S:
|
||
// currentPoint.setY(currentPoint.y()+1);
|
||
// data->setSelectedImagePoint(currentPoint);
|
||
// break;
|
||
// }
|
||
// imageMag->update();
|
||
//}
|
||
} |