defuze.me  Client
tab.cpp
00001 /**************************************************************************
00002 ** defuze.me Epitech Innovative Project
00003 **
00004 ** Copyright 2010-2011
00005 **   Athena Calmettes - Jocelyn De La Rosa - Francois Gaillard
00006 **   Adrien Jarthon - Alexandre Moore - Luc Peres - Arnaud Sellier
00007 **
00008 ** All rights reserved.
00009 **************************************************************************/
00010 
00011 #include "tab.hpp"
00012 #include "module.hpp"
00013 #include "droplocation.hpp"
00014 #include <QDebug>
00015 
00016 using namespace Gui;
00017 
00018 Tab::Tab(const QString &name) : name(name)
00019 {
00020     grid = new GridWidget(this);
00021 }
00022 
00023 Tab::~Tab()
00024 {
00025     delete grid;
00026 }
00027 
00028 QString Tab::getName() const
00029 {
00030     return name;
00031 }
00032 
00033 GridWidget* Tab::getGrid() const
00034 {
00035     return grid;
00036 }
00037 
00038 int Tab::columnCount() const
00039 {
00040     return getGrid()->getColumnsLayout()->count();
00041 }
00042 
00043 void Tab::addModule(Module *module)
00044 {
00045     if (module->getColumn() == -1)
00046         module->setPosition(QPoint(columnCount(), module->getRow()));
00047     if (module->getColumn() >= columnCount())
00048     {
00049         int columns = columnCount();
00050         while (columns <= module->getColumn())
00051         {
00052             getGrid()->getColumnsLayout()->addLayout(new QVBoxLayout);
00053             ++columns;
00054         }
00055     }
00056     GridElement *elem = new GridElement(module->title, getGrid());
00057     elem->setModule(module);
00058     elements[module] = elem;
00059     int row = 0;
00060     while (row < elem->getRow() &&
00061            row < grid->getColumn(elem->getColumn())->count() &&
00062            row >= static_cast<GridElement*>(grid->getColumn(elem->getColumn())->itemAt(row)->widget())->getRow())
00063         row++;
00064     grid->getColumn(module->getColumn())->insertWidget(row, elem);
00065 }
00066 
00067 void Tab::cleanGrid(QWidget *targetDropLocation)
00068 {
00069     QList<QWidget*> toRemove;
00070     for (int i = 0 ; i < columnCount() ; ++i)
00071     {
00072         for (int j = 0 ; j < grid->getColumn(i)->count() ; ++j)
00073         {
00074             if (!dynamic_cast<GridElement*>(grid->getColumn(i)->itemAt(j)->widget()))
00075             {
00076                 if (grid->getColumn(i)->itemAt(j)->widget() != targetDropLocation)
00077                     toRemove << grid->getColumn(i)->itemAt(j)->widget();
00078                 else
00079                     grid->getColumn(i)->takeAt(j);
00080             }
00081         }
00082 
00083     }
00084     while (!toRemove.isEmpty())
00085         delete toRemove.takeFirst();
00086     int offset = 0;
00087     for (int i = 0 ; i < columnCount() ; ++i)
00088     {
00089         int column = i - offset;
00090 
00091         if (!grid->getColumn(column)->count())
00092         {
00093             delete grid->getColumnsLayout()->itemAt(column)->layout();
00094             offset += 1;
00095         }
00096         else
00097         {
00098             for (int j = 0 ; j < grid->getColumn(column)->count() ; ++j)
00099             {
00100                 GridElement *elem = static_cast<GridElement*>(grid->getColumn(column)->itemAt(j)->widget());
00101                 elem->setPosition(QPoint(column, j));
00102             }
00103         }
00104     }
00105 //  grid->layout()->setContentsMargins(9,9,9,9);
00106 //  grid->layout()->setSpacing(6);
00107 }
00108 
00109 void Tab::showDropLocations(QPoint sourcePosition)
00110 {
00111     cleanGrid();
00112 //  grid->layout()->setContentsMargins(0, 0, 0, 0);
00113 //  grid->layout()->setSpacing(0);
00114     int offset = 0;
00115     int orientation = 0;
00116     int initialColumnCount = columnCount();
00117     for (int i = 0 ; i < initialColumnCount ; ++i)
00118     {
00119         int column = i + offset;
00120         showColumnDropLocations(column, orientation, offset, sourcePosition);
00121     }
00122 }
00123 
00124 void Tab::showRowDropLocations(int column, int initialColumn, QPoint &sourcePosition)
00125 {
00126     int initialRowCount = grid->getColumn(column)->count();
00127     if (initialColumn == sourcePosition.x())
00128     {
00129         int offset = 0;
00130         int orientation = 0;
00131         for (int i = 0 ; i < initialRowCount ; ++i)
00132         {
00133             int row = i + offset;
00134             if (row - offset == sourcePosition.y())
00135                 orientation = -1;
00136             if (orientation >= 0)
00137             {
00138                 showDropLocation(QPoint(column, row + orientation), false);
00139                 offset += 1;
00140             }
00141             else
00142                 orientation = 1;
00143         }
00144     }
00145     else
00146     {
00147         int offset = 0;
00148         for (int i = 0 ; i < initialRowCount ; ++i)
00149         {
00150             int row = i + offset;
00151             if (row == 0)
00152             {
00153                 showDropLocation(QPoint(column, row), false);
00154                 showDropLocation(QPoint(column, row + 2), false);
00155                 offset += 2;
00156             }
00157             else
00158             {
00159                 showDropLocation(QPoint(column, row + 1), false);
00160                 offset += 1;
00161             }
00162         }
00163     }
00164 }
00165 
00166 void Tab::showColumnDropLocations(int & column, int &orientation, int &offset, QPoint &sourcePosition)
00167 {
00168     if (column - offset == sourcePosition.x())
00169         orientation = -1;
00170     if (orientation >= 0)
00171     {
00172         showDropLocation(QPoint(column + orientation, 0), true);
00173         showRowDropLocations(column + 1 - orientation, column - offset, sourcePosition);
00174         ++offset;
00175     }
00176     else if (grid->getColumn(column)->count() > 1)
00177     {
00178         showDropLocation(QPoint(column, 0), true);
00179         showRowDropLocations(column + 1, column - offset, sourcePosition);
00180         showDropLocation(QPoint(column + 2, 0), true);
00181         offset += 2;
00182         orientation = 1;
00183     }
00184     else
00185         orientation = 1;
00186 }
00187 
00188 void Tab::showDropLocation(QPoint targetPosition, bool newColumn)
00189 {
00190     if (newColumn)
00191     {
00192         grid->getColumnsLayout()->insertLayout(targetPosition.x(), new QVBoxLayout);
00193         grid->getColumn(targetPosition.x())->addWidget(new DropLocation(this,
00194                                                                         targetPosition,
00195                                                                         newColumn,
00196                                                                         grid));
00197     }
00198     else
00199         grid->getColumn(targetPosition.x())->insertWidget(targetPosition.y(), new DropLocation(this,
00200                                                                                                targetPosition,
00201                                                                                                false,
00202                                                                                                grid));
00203 }
00204 
00205 void Tab::insertGridElement(GridElement *gridElement,
00206                             QPoint &targetPosition,
00207                             bool __attribute__((unused)) newColumn)
00208 {
00209     QWidget *dropLocation = grid->getColumn(targetPosition.x())->takeAt(targetPosition.y())->widget();
00210     grid->getColumn(targetPosition.x())->insertWidget(targetPosition.y(), gridElement);
00211     cleanGrid(dropLocation);
00212 }
00213 
00214 GridElement *Tab::getGridElementByModule(Module *module) const
00215 {
00216     return elements[module];
00217 }