QSize TabButton::sizeHint() const { ensurePolished(); int h = normalHeight(); int w = normalWidth(); return QSize(w, h); }
int DirectionGeometryBucketMove::minNormalWidth() const { if (m_minNormalWidth >= 0) return m_minNormalWidth; if (!input) return 0; int result = numeric_limits<int>::max(); for (const Bucket::Item& item: input->items()) { result = min(result, normalWidth(item)); } return m_minNormalWidth = result; }
Cost BL::calc(const int areaW) { vector<Id> ids = getImageIds(); sort(ids.begin(), ids.end(), DecreasingNormalWidthCmp(this)); typedef vector<S> V; typedef V::iterator Itr; V v; v.push_back(S(Point(0, 0), 0, areaW)); list<Id> idsList(ids.begin(), ids.end()); while (!idsList.empty()) { Itr insertItr = v.end(); int bestY = numeric_limits<int>::max(); //insertItr list<Id>::iterator idsListBestItr = idsList.begin(); for (list<Id>::iterator idsListItr = idsList.begin(); idsListItr != idsList.end(); ++idsListItr) { const int w = normalWidth(*idsListItr); bool wasBetter = false; //cache friendly for (Itr itr = v.begin(); itr != v.end(); ++itr) { if (itr->left + itr->right >= w && itr->point.y < bestY) { insertItr = itr; bestY = itr->point.y; wasBetter = true; } } if (wasBetter) idsListBestItr = idsListItr; if (!morePrecisie) break; } const Id item = *idsListBestItr; idsList.erase(idsListBestItr); //init const int itemW = normalWidth(item); const int itemH = normalHeight(item); Point insertPoint(insertItr->point.x - insertItr->left, insertItr->point.y); const int insertY1(insertPoint.y); const int insertY2(insertY1 + itemH); const int insertX1(insertPoint.x); const int insertX2(insertX1 + itemW); Itr firstCovered = v.begin(); Itr firstNotCovered = v.end(); S s1(Point(insertPoint.x, insertPoint.y + itemH), insertPoint.x, areaW - insertPoint.x); S s2(Point(insertPoint.x + itemW, insertPoint.y + itemH), insertPoint.x + itemW, areaW - insertPoint.x - itemW); S s3(Point(insertPoint.x + itemW, insertPoint.y), 0, areaW - insertPoint.x - itemW); //firstCovered firstCovered = insertItr; for (Itr itr = v.begin(); itr != v.end(); ++itr) { if (insertX1 <= itr->point.x && itr->point.x <= insertX2 && itr->point.y <= insertY2) { firstCovered = itr; break; } } //firstNotCovered for (Itr itr = v.begin(); itr != v.end(); ++itr) { if (insertX2 <= itr->point.x) { firstNotCovered = itr; break; } } //correct existing items for (Itr itr = v.begin(); itr != v.end(); ++itr) { if (itr->point.y < insertY2) { if (itr->point.x <= insertX1) { int newRight = insertX1 - itr->point.x; if (newRight < itr->right) itr->right = newRight; } else if (insertX2 <= itr->point.x) { int newLeft = itr->point.x - insertX2; if (newLeft < itr->left) itr->left = newLeft; } } } //s1.left for (Itr itr = firstCovered; ;) { if (itr->point.y > s1.point.y) { s1.left = s1.point.x - itr->point.x; break; } if (itr == v.begin()) break; --itr; } //s1.right for (Itr itr = firstNotCovered; itr != v.end(); ++itr) { if (itr->point.y > s1.point.y) { s1.right = itr->point.x - s1.point.x; break; } } //s2.left s2.left = s1.left + itemW; //s2.right s2.right = s1.right - itemW; //s3.right for (Itr itr = firstNotCovered; itr != v.end(); ++itr) { if (itr->point.y > s3.point.y) { s3.right = itr->point.x - s3.point.x; break; } } //insert item result.add(item, normalPoint(insertPoint)); //reconstruction V v2; for (Itr itr = v.begin(); itr != firstCovered; ++itr) v2.push_back(*itr); v2.push_back(s1); v2.push_back(s2); v2.push_back(s3); for (Itr itr = firstNotCovered; itr != v.end(); ++itr) v2.push_back(*itr); v = v2; } checkForCollisions(); return calcResultCost(); }