aboutsummaryrefslogtreecommitdiff
path: root/lib/gui/eservicegrid.cpp
blob: f80c6734c2e38853c37def9c90b4146e02269b44 (plain)
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
#include <lib/gui/eservicegrid.h>

eServiceGrid::eServiceGrid(eWidget *parent): eWidget(parent)
{
	para=0;
	grid=0;
	
	elemsize=eSize(16, 16);
}

void eServiceGrid::createGrid(eSize gs)
{
	gridsize=gs;
	if (grid)
		delete[] grid;
	if (!(gridsize.x() && gridsize.y()))
		return;
	grid=new (eService*)[gridsize.x()*gridsize.y()];
}

eService **eServiceGrid::allocateGrid(eSize size)
{
	for (int y=0; y<gridsize.height(); y++)
		for (int x=0; x<gridsize.width(); x++)
		{
			int ok=1;
			for (int cy=0; ok && cy<size.height(); cy++)
				for (int cx=0; ok && cx<size.width(); cx++)
					if (grid[gridsize.width()*(y+cy)+x+cx])
					{
						ok=0;
						break;
					}
			if (ok)
				return grid+gridsize.width()*(y+cy)+x+cx;
		}
	return 0;
}

void eServiceGrid::setGridSize(int gx, int gy)
{
	createGrid(eSize(gx, gy));
}

void eServiceGrid::addService(eService *service)
{
	eTextPara temp;
	temp.setFont(font);
	temp.renderText(service->service_name);
	eSize size=temp.getExtends();
	eSize gsize=eSize((size.width()+elemsize.width()-1)/elemsize.width(), (size.height()+elemsize.height()-1)/elemsize.height());
	eService **sp=allocateGrid(gsize);
	if (!sp)
		return;
	for (int cy=0; ok && cy<gsize.height(); cy++)
		for (int cx=0; ok && cx<gsize.width(); cx++)
			sp[cy*gridsize.width()+cx]=service;
}


void eServiceGrid::validate()
{
	eService **gp=grid;
	for (int y=0; y<gridsize.height(); y++)
		for (int x=0; x<gridsize.width(); x++)
		{
			if (*gp)
			{
				para->setCursor(x*elemsize.width(), y*elemsize.height());
				para->renderString((*gp)->service_name);
			}
			*gp++;
		}
}