//============ tileVertically===========// void KMdiChildArea::tileVertically() { KMdiChildFrm *lpTop=topChild(); int numVisible=getVisibleChildCount(); // count visible windows if(numVisible<1)return; int w = width() / numVisible; int lastWidth = 0; if( numVisible > 1) lastWidth = width() - (w * (numVisible - 1)); else lastWidth = w; int h = height(); int posX = 0; int countVisible = 0; for(KMdiChildFrm *lpC=m_pZ->first();lpC;lpC=m_pZ->next()){ if(lpC->m_state != KMdiChildFrm::Minimized){ if(lpC->m_state==KMdiChildFrm::Maximized)lpC->restorePressed(); countVisible++; if( countVisible < numVisible) { lpC->setGeometry( posX, 0, w, h); posX += w; } else { // last visible childframe lpC->setGeometry( posX, 0, lastWidth, h); } } } if (lpTop) { lpTop->m_pClient->activate(); } }
//============ tileAnodine ============// void KMdiChildArea::tileAnodine() { KMdiChildFrm *lpTop=topChild(); int numVisible=getVisibleChildCount(); // count visible windows if(numVisible<1)return; int numCols=int(sqrt((double)numVisible)); // set columns to square root of visible count // create an array to form grid layout int *numRows=new int[numCols]; int numCurCol=0; while(numCurCol<numCols){ numRows[numCurCol]=numCols; // create primary grid values numCurCol++; } int numDiff=numVisible-(numCols*numCols); // count extra rows int numCurDiffCol=numCols; // set column limiting for grid updates while(numDiff>0){ numCurDiffCol--; numRows[numCurDiffCol]++; // add extra rows to column grid if(numCurDiffCol<1)numCurDiffCol=numCols; // rotate through the grid numDiff--; } numCurCol=0; int numCurRow=0; int curX=0; int curY=0; // the following code will size everything based on my grid above // there is no limit to the number of windows it will handle // it's great when a kick-ass theory works!!! // Pragma :) int xQuantum=width()/numCols; int yQuantum=height()/numRows[numCurCol]; for(KMdiChildFrm *lpC=m_pZ->first();lpC;lpC=m_pZ->next()){ if(lpC->m_state != KMdiChildFrm::Minimized){ if(lpC->m_state==KMdiChildFrm::Maximized)lpC->restorePressed(); lpC->setGeometry(curX,curY,xQuantum,yQuantum); numCurRow++; curY+=yQuantum; if(numCurRow==numRows[numCurCol]){ numCurRow=0; numCurCol++; curY=0; curX+=xQuantum; if(numCurCol!=numCols)yQuantum=height()/numRows[numCurCol]; } } } delete[] numRows; if (lpTop) { lpTop->m_pClient->activate(); } }
void KviMdiManager::tileAllInternal(int maxWnds, bool bHorizontal) //int maxWnds,bool bHorizontal { //NUM WINDOWS = 1,2,3,4,5,6,7,8,9 static int colstable[9]={ 1,1,1,2,2,2,3,3,3 }; //num columns static int rowstable[9]={ 1,2,3,2,3,3,3,3,3 }; //num rows static int lastwindw[9]={ 1,1,1,1,2,1,3,2,1 }; //last window multiplier static int colrecall[9]={ 0,0,0,3,3,3,6,6,6 }; //adjust self static int rowrecall[9]={ 0,0,0,0,4,4,4,4,4 }; //adjust self int * pColstable = bHorizontal ? colstable : rowstable; int * pRowstable = bHorizontal ? rowstable : colstable; int * pColrecall = bHorizontal ? colrecall : rowrecall; int * pRowrecall = bHorizontal ? rowrecall : colrecall; if (g_pApp->kviClosingDown()) return; m_bInSDIMode=false; ensureNoMaximized(); KviMdiChild * lpTop = (KviMdiChild*)activeSubWindow(); if (!lpTop) return; int numVisible = getVisibleChildCount(); if (numVisible < 1) return; int numToHandle = ((numVisible > maxWnds) ? maxWnds : numVisible); int xQuantum = viewport()->width() / pColstable[numToHandle-1]; if(xQuantum < ((lpTop->minimumSize().width() > KVI_MDICHILD_MIN_WIDTH) ? lpTop->minimumSize().width() : KVI_MDICHILD_MIN_WIDTH)) { if (pColrecall[numToHandle-1] == 0) qDebug("Tile : Not enouh space"); else tileAllInternal(pColrecall[numToHandle-1], bHorizontal); return; } int yQuantum = viewport()->height() / pRowstable[numToHandle-1]; if(yQuantum < ((lpTop->minimumSize().height() > KVI_MDICHILD_MIN_HEIGHT) ? lpTop->minimumSize().height() : KVI_MDICHILD_MIN_HEIGHT)) { if (pRowrecall[numToHandle-1] == 0) qDebug("Tile : Not enough space"); else tileAllInternal(pRowrecall[numToHandle-1], bHorizontal); return; } int curX = 0; int curY = 0; int curRow = 1; int curCol = 1; int curWin = 1; QList<QMdiSubWindow *> tmp = subWindowList(QMdiArea::StackingOrder); for(int i = 0; i < tmp.count(); i++) { KviMdiChild * lpC = (KviMdiChild*) tmp.at(i); if(lpC->state()!=KviMdiChild::Minimized) { if((curWin%numToHandle)==0) { lpC->move(curX, curY); lpC->resize(xQuantum * lastwindw[numToHandle-1], yQuantum); } else { lpC->move(curX, curY); lpC->resize(xQuantum, yQuantum); } //example : 12 windows : 3 cols 3 rows if (curCol < pColstable[numToHandle-1]) { //curCol < 3 curX += xQuantum; //add a column in the same row curCol++; //increase current column } else { curX = 0; //new row curCol = 1; //column 1 if (curRow < pRowstable[numToHandle-1]) { //curRow < 3 curY += yQuantum; //add a row curRow++; } else { curY = 0; //restart from beginning curRow = 1; } } curWin++; } } if(lpTop)lpTop->setFocus(); }
void KMdiChildArea::tileAllInternal(int maxWnds) { //NUM WINDOWS = 1,2,3,4,5,6,7,8,9 static int colstable[9]={ 1,1,1,2,2,2,3,3,3 }; //num columns static int rowstable[9]={ 1,2,3,2,3,3,3,3,3 }; //num rows static int lastwindw[9]={ 1,1,1,1,2,1,3,2,1 }; //last window multiplier static int colrecall[9]={ 0,0,0,3,3,3,6,6,6 }; //adjust self static int rowrecall[9]={ 0,0,0,0,4,4,4,4,4 }; //adjust self KMdiChildFrm *lpTop = topChild(); int numVisible = getVisibleChildCount(); if (numVisible<1) return; int numToHandle = ((numVisible > maxWnds) ? maxWnds : numVisible); int xQuantum = width()/colstable[numToHandle-1]; if (xQuantum < ((lpTop->minimumSize().width() > m_defaultChildFrmSize.width()) ? lpTop->minimumSize().width() : m_defaultChildFrmSize.width())) { if (colrecall[numToHandle-1] != 0) { tileAllInternal(colrecall[numToHandle-1]); return; } } int yQuantum=height()/rowstable[numToHandle-1]; if (yQuantum < ((lpTop->minimumSize().height() > m_defaultChildFrmSize.height()) ? lpTop->minimumSize().height() : m_defaultChildFrmSize.height())) { if (rowrecall[numToHandle-1] != 0) { tileAllInternal(rowrecall[numToHandle-1]); return; } } int curX=0; int curY=0; int curRow=1; int curCol=1; int curWin=1; for (KMdiChildFrm *lpC=m_pZ->first();lpC;lpC=m_pZ->next()) { if (lpC->m_state!=KMdiChildFrm::Minimized) { //restore the window if (lpC->m_state==KMdiChildFrm::Maximized) lpC->restorePressed(); if ((curWin%numToHandle)==0) lpC->setGeometry(curX,curY,xQuantum * lastwindw[numToHandle-1],yQuantum); else lpC->setGeometry(curX,curY,xQuantum,yQuantum); //example : 12 windows : 3 cols 3 rows if (curCol<colstable[numToHandle-1]) { //curCol<3 curX+=xQuantum; //add a column in the same row curCol++; //increase current column } else { curX = 0; //new row curCol = 1; //column 1 if (curRow < rowstable[numToHandle-1]) { //curRow<3 curY += yQuantum; //add a row curRow++; // } else { curY = 0; //restart from beginning curRow = 1; // } } curWin++; } } if (lpTop) lpTop->m_pClient->activate(); }