defuze.me
Client
|
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 }