mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-26 00:23:55 -07:00
refactor method for positioning cards in ZoneViewZone (#5203)
* refactor out method for positioning cards in zone view * rename some variables * use max/min * some small formatting stuff
This commit is contained in:
parent
24b5dab456
commit
37bb1367db
2 changed files with 63 additions and 42 deletions
|
|
@ -112,73 +112,86 @@ void ZoneViewZone::reorganizeCards()
|
||||||
for (int i = 0; i < cardCount; ++i)
|
for (int i = 0; i < cardCount; ++i)
|
||||||
cards[i]->setId(i);
|
cards[i]->setId(i);
|
||||||
|
|
||||||
int cols = qFloor(qSqrt((double)cardCount / 2));
|
|
||||||
if (cols > 7)
|
|
||||||
cols = 7;
|
|
||||||
int rows = qCeil((double)cardCount / cols);
|
|
||||||
if (rows < 1)
|
|
||||||
rows = 1;
|
|
||||||
if (minRows == 0)
|
|
||||||
minRows = rows;
|
|
||||||
else if (rows < minRows) {
|
|
||||||
rows = minRows;
|
|
||||||
cols = qCeil((double)cardCount / minRows);
|
|
||||||
}
|
|
||||||
if (cols < 2)
|
|
||||||
cols = 2;
|
|
||||||
|
|
||||||
qDebug() << "reorganizeCards: rows=" << rows << "cols=" << cols;
|
|
||||||
|
|
||||||
CardList cardsToDisplay(cards);
|
CardList cardsToDisplay(cards);
|
||||||
if (sortByName || sortByType)
|
if (sortByName || sortByType)
|
||||||
cardsToDisplay.sort((sortByName ? CardList::SortByName : 0) | (sortByType ? CardList::SortByType : 0));
|
cardsToDisplay.sort((sortByName ? CardList::SortByName : 0) | (sortByType ? CardList::SortByType : 0));
|
||||||
|
|
||||||
int typeColumn = 0;
|
auto gridSize = positionCardsForDisplay(cardsToDisplay, pileView && sortByType);
|
||||||
int longestRow = 0;
|
|
||||||
if (pileView && sortByType) { // we need sort by type enabled for the feature to work
|
qreal aleft = 0;
|
||||||
int typeRow = 0;
|
qreal atop = 0;
|
||||||
|
qreal awidth = gridSize.cols * CARD_WIDTH + (CARD_WIDTH / 2) + HORIZONTAL_PADDING;
|
||||||
|
qreal aheight = (gridSize.rows * CARD_HEIGHT) / 3 + CARD_HEIGHT * 1.3;
|
||||||
|
optimumRect = QRectF(aleft, atop, awidth, aheight);
|
||||||
|
|
||||||
|
updateGeometry();
|
||||||
|
emit optimumRectChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the position of each card to the proper position for the view
|
||||||
|
*
|
||||||
|
* @param cards The cards to reposition. Will modify the cards in the list.
|
||||||
|
* @param groupByType Whether to make piles by card type. If true, then expects `cards` to be sorted by type.
|
||||||
|
*
|
||||||
|
* @returns The number of rows and columns to display
|
||||||
|
*/
|
||||||
|
ZoneViewZone::GridSize ZoneViewZone::positionCardsForDisplay(CardList &cards, bool groupByType)
|
||||||
|
{
|
||||||
|
int cardCount = cards.size();
|
||||||
|
if (groupByType) {
|
||||||
|
int row = 0;
|
||||||
|
int col = 0;
|
||||||
|
int longestRow = 0;
|
||||||
QString lastCardType;
|
QString lastCardType;
|
||||||
for (int i = 0; i < cardCount; i++) {
|
for (int i = 0; i < cardCount; i++) {
|
||||||
CardItem *c = cardsToDisplay.at(i);
|
CardItem *c = cards.at(i);
|
||||||
QString cardType = c->getInfo() ? c->getInfo()->getMainCardType() : "";
|
QString cardType = c->getInfo() ? c->getInfo()->getMainCardType() : "";
|
||||||
|
|
||||||
if (i) { // if not the first card
|
if (i) { // if not the first card
|
||||||
if (cardType == lastCardType)
|
if (cardType == lastCardType)
|
||||||
typeRow++; // add below current card
|
row++; // add below current card
|
||||||
else { // if no match then move card to next column
|
else { // if no match then move card to next column
|
||||||
typeColumn++;
|
col++;
|
||||||
typeRow = 0;
|
row = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lastCardType = cardType;
|
lastCardType = cardType;
|
||||||
qreal x = typeColumn * CARD_WIDTH;
|
qreal x = col * CARD_WIDTH;
|
||||||
qreal y = typeRow * CARD_HEIGHT / 3;
|
qreal y = row * CARD_HEIGHT / 3;
|
||||||
c->setPos(HORIZONTAL_PADDING + x, VERTICAL_PADDING + y);
|
c->setPos(HORIZONTAL_PADDING + x, VERTICAL_PADDING + y);
|
||||||
c->setRealZValue(i);
|
c->setRealZValue(i);
|
||||||
longestRow = qMax(typeRow, longestRow);
|
longestRow = qMax(row, longestRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return GridSize{longestRow, qMax(col + 1, 3)};
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
int cols = qMin(qFloor(qSqrt((double)cardCount / 2)), 7);
|
||||||
|
int rows = qMax(qCeil((double)cardCount / cols), 1);
|
||||||
|
if (minRows == 0) {
|
||||||
|
minRows = rows;
|
||||||
|
} else if (rows < minRows) {
|
||||||
|
rows = minRows;
|
||||||
|
cols = qCeil((double)cardCount / minRows);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cols < 2)
|
||||||
|
cols = 2;
|
||||||
|
|
||||||
|
qDebug() << "reorganizeCards: rows=" << rows << "cols=" << cols;
|
||||||
|
|
||||||
for (int i = 0; i < cardCount; i++) {
|
for (int i = 0; i < cardCount; i++) {
|
||||||
CardItem *c = cardsToDisplay.at(i);
|
CardItem *c = cards.at(i);
|
||||||
qreal x = (i / rows) * CARD_WIDTH;
|
qreal x = (i / rows) * CARD_WIDTH;
|
||||||
qreal y = (i % rows) * CARD_HEIGHT / 3;
|
qreal y = (i % rows) * CARD_HEIGHT / 3;
|
||||||
c->setPos(HORIZONTAL_PADDING + x, VERTICAL_PADDING + y);
|
c->setPos(HORIZONTAL_PADDING + x, VERTICAL_PADDING + y);
|
||||||
c->setRealZValue(i);
|
c->setRealZValue(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return GridSize{rows, qMax(cols, 1)};
|
||||||
}
|
}
|
||||||
|
|
||||||
int totalRows = (pileView && sortByType) ? longestRow : rows;
|
|
||||||
int totalColumns = (pileView && sortByType) ? qMax(typeColumn + 1, 3) : qMax(cols, 1);
|
|
||||||
|
|
||||||
qreal aleft = 0;
|
|
||||||
qreal atop = 0;
|
|
||||||
qreal awidth = totalColumns * CARD_WIDTH + (CARD_WIDTH / 2) + HORIZONTAL_PADDING;
|
|
||||||
qreal aheight = (totalRows * CARD_HEIGHT) / 3 + CARD_HEIGHT * 1.3;
|
|
||||||
optimumRect = QRectF(aleft, atop, awidth, aheight);
|
|
||||||
|
|
||||||
updateGeometry();
|
|
||||||
emit optimumRectChanged();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZoneViewZone::setSortByName(int _sortByName)
|
void ZoneViewZone::setSortByName(int _sortByName)
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,14 @@ private:
|
||||||
bool sortByName, sortByType;
|
bool sortByName, sortByType;
|
||||||
bool pileView;
|
bool pileView;
|
||||||
|
|
||||||
|
struct GridSize
|
||||||
|
{
|
||||||
|
int rows;
|
||||||
|
int cols;
|
||||||
|
};
|
||||||
|
|
||||||
|
GridSize positionCardsForDisplay(CardList &cards, bool groupByType = false);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ZoneViewZone(Player *_p,
|
ZoneViewZone(Player *_p,
|
||||||
CardZone *_origZone,
|
CardZone *_origZone,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue