File: alignment.cpp

package info (click to toggle)
warzone2100 4.6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 660,348 kB
  • sloc: cpp: 675,711; ansic: 387,204; javascript: 75,107; python: 16,628; php: 4,294; sh: 3,941; makefile: 2,330; lisp: 1,492; cs: 489; xml: 404; perl: 224; ruby: 156; java: 89
file content (88 lines) | stat: -rw-r--r-- 2,654 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
	This file is part of Warzone 2100.
	Copyright (C) 2021  Warzone 2100 Project

	Warzone 2100 is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.

	Warzone 2100 is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with Warzone 2100; if not, write to the Free Software
	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "lib/ivis_opengl/bitimage.h"
#include "lib/ivis_opengl/pieblitfunc.h"
#include "widget.h"
#include "alignment.h"

std::shared_ptr<AlignmentWidget> Alignment::wrap(std::shared_ptr<WIDGET> widget)
{
	auto wrap = std::make_shared<AlignmentWidget>(*this);
	wrap->attach(widget);
	return wrap;
}

void AlignmentWidget::geometryChanged()
{
	if (children().empty())
	{
		return;
	}

	auto &child = children().front();
	int targetWidth = 0;
	int targetHeight = 0;
	if (alignment.resizing == Alignment::Resizing::Shrink)
	{
		targetWidth = std::min(width(), child->idealWidth());
		targetHeight = std::min(height(), child->idealHeight());
	}
	else if (alignment.resizing == Alignment::Resizing::Fit)
	{
		auto fitRatio = std::min(width() / (float)child->idealWidth(), height() / (float)child->idealHeight());
		targetWidth = static_cast<int>(child->idealWidth() * fitRatio);
		targetHeight = static_cast<int>(child->idealHeight() * fitRatio);
	}

	WzRect childRect(0, 0, 0, 0);
	if (alignment.horizontal == Alignment::Horizontal::Center)
	{
		childRect.setX(std::max(0, width() - targetWidth) / 2);
	}
	else if (alignment.horizontal == Alignment::Horizontal::Right)
	{
		childRect.setX(std::max(0, width() - targetWidth));
	}

	if (alignment.vertical == Alignment::Vertical::Center)
	{
		childRect.setY(std::max(0, height() - targetHeight) / 2);
	}
	else if (alignment.vertical == Alignment::Vertical::Bottom)
	{
		childRect.setY(std::max(0, height() - targetHeight));
	}

	// must set width/height **after** setX/setY
	childRect.setWidth(targetWidth);
	childRect.setHeight(targetHeight);

	child->setGeometry(childRect);
}

int32_t AlignmentWidget::idealWidth()
{
	return children().empty() ? WIDGET::idealWidth(): children().front()->idealWidth();
}

int32_t AlignmentWidget::idealHeight()
{
	return children().empty() ? WIDGET::idealHeight(): children().front()->idealHeight();
}