mirror of
https://projects.vdr-developer.org/git/vdr-plugin-skindesigner.git
synced 2023-10-19 17:58:31 +02:00
189 lines
4.7 KiB
C
189 lines
4.7 KiB
C
|
#include "viewgrid.h"
|
||
|
#include "../extensions/helpers.h"
|
||
|
|
||
|
cViewGrid::cViewGrid(void) {
|
||
|
id = -1;
|
||
|
plugId = -1;
|
||
|
viewId = -1;
|
||
|
globals = NULL;
|
||
|
attribs = new cViewElementAttribs((int)eViewElementAttribs::count);
|
||
|
gridTpl = NULL;
|
||
|
gridsize = GRIDSIZE;
|
||
|
grid = new cGridElement*[gridsize];
|
||
|
for (int i=0; i < gridsize; i++) {
|
||
|
grid[i] = NULL;
|
||
|
}
|
||
|
gridMin = 0;
|
||
|
gridMax = -1;
|
||
|
}
|
||
|
|
||
|
cViewGrid::~cViewGrid(void) {
|
||
|
delete attribs;
|
||
|
delete gridTpl;
|
||
|
}
|
||
|
|
||
|
void cViewGrid::SetGlobals(cGlobals *globals) {
|
||
|
this->globals = globals;
|
||
|
}
|
||
|
|
||
|
void cViewGrid::SetContainer(int x, int y, int width, int height) {
|
||
|
container.SetX(x);
|
||
|
container.SetY(y);
|
||
|
container.SetWidth(width);
|
||
|
container.SetHeight(height);
|
||
|
}
|
||
|
|
||
|
void cViewGrid::SetAttributes(vector<stringpair> &attributes) {
|
||
|
attribs->Set(attributes);
|
||
|
}
|
||
|
|
||
|
void cViewGrid::AddGridElement(cGridElement *gridElement) {
|
||
|
gridTpl = gridElement;
|
||
|
}
|
||
|
|
||
|
const char *cViewGrid::Name(void) {
|
||
|
return attribs->Name();
|
||
|
}
|
||
|
|
||
|
void cViewGrid::SetTokenContainer(void) {
|
||
|
if (!gridTpl)
|
||
|
return;
|
||
|
gridTpl->SetId(id);
|
||
|
gridTpl->SetPluginId(plugId);
|
||
|
gridTpl->SetViewId(viewId);
|
||
|
gridTpl->SetTokenContainer();
|
||
|
}
|
||
|
|
||
|
void cViewGrid::PreCache(void) {
|
||
|
attribs->SetContainer(container.X(), container.Y(), container.Width(), container.Height());
|
||
|
attribs->SetGlobals(globals);
|
||
|
attribs->Cache();
|
||
|
gridTpl->SetGlobals(globals);
|
||
|
gridTpl->SetContainer(attribs->X(), attribs->Y(), attribs->Width(), attribs->Height());
|
||
|
gridTpl->Cache();
|
||
|
|
||
|
}
|
||
|
|
||
|
void cViewGrid::CheckSize(int id) {
|
||
|
if (id < gridsize)
|
||
|
return;
|
||
|
int newgridsize = gridsize + GRIDSIZE;
|
||
|
while (newgridsize < id)
|
||
|
newgridsize += gridsize;
|
||
|
cGridElement **gridNew = new cGridElement*[newgridsize];
|
||
|
int i=0;
|
||
|
bool foundFirst = false;
|
||
|
for (; i < gridsize; i++) {
|
||
|
if (!foundFirst && grid[i]) {
|
||
|
foundFirst = true;
|
||
|
gridMin = i;
|
||
|
}
|
||
|
gridNew[i] = grid[i];
|
||
|
}
|
||
|
gridsize = newgridsize;
|
||
|
for (; i < gridsize; i++) {
|
||
|
gridNew[i] = NULL;
|
||
|
}
|
||
|
delete[] grid;
|
||
|
grid = gridNew;
|
||
|
}
|
||
|
|
||
|
void cViewGrid::SetTokens(int gId, skindesignerapi::cTokenContainer *tk) {
|
||
|
if (!grid[gId]) {
|
||
|
return;
|
||
|
}
|
||
|
grid[gId]->Set(tk);
|
||
|
}
|
||
|
|
||
|
void cViewGrid::PositionGrid(int gId, double x, double y, double width, double height) {
|
||
|
int gridX = attribs->X() + x * attribs->Width();
|
||
|
int gridY = attribs->Y() + y * attribs->Height();
|
||
|
int gridWidth = width * attribs->Width();
|
||
|
int gridHeight = height * attribs->Height();
|
||
|
if (!grid[gId]) {
|
||
|
if (gId >= gridMax)
|
||
|
gridMax = gId+1;
|
||
|
grid[gId] = CreateGrid(gridX, gridY, gridWidth, gridHeight);
|
||
|
} else {
|
||
|
if (grid[gId]->Width() == gridWidth && grid[gId]->Height() == gridHeight) {
|
||
|
grid[gId]->SetPosition(gridX, gridY, gridWidth, gridHeight);
|
||
|
} else {
|
||
|
cGridElement *ge = CreateGrid(gridX, gridY, gridWidth, gridHeight);
|
||
|
ge->Set(grid[gId]->GetTokenContainer());
|
||
|
grid[gId]->Close();
|
||
|
delete grid[gId];
|
||
|
grid[gId] = ge;
|
||
|
}
|
||
|
grid[gId]->SetDirty();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cViewGrid::SetCurrentGrid(int gId, bool current) {
|
||
|
if (gId >= 0 && grid[gId]) {
|
||
|
grid[gId]->SetCurrent(current);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cViewGrid::DeleteGrid(int gId) {
|
||
|
if (!grid[gId])
|
||
|
return;
|
||
|
grid[gId]->Close();
|
||
|
delete grid[gId];
|
||
|
grid[gId] = NULL;
|
||
|
}
|
||
|
|
||
|
void cViewGrid::ClearGrids(void) {
|
||
|
for (int i = 0; i < gridsize; i++) {
|
||
|
if (!grid[i])
|
||
|
continue;
|
||
|
grid[i]->Close();
|
||
|
delete grid[i];
|
||
|
grid[i] = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cViewGrid::Render(void) {
|
||
|
for (int i = gridMin; i < gridMax; i++) {
|
||
|
if (grid[i] && grid[i]->Parse()) {
|
||
|
grid[i]->Render();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cGridElement *cViewGrid::CreateGrid(int x, int y, int width, int height) {
|
||
|
cGridElement *ge = new cGridElement(*gridTpl);
|
||
|
ge->SetAreaX(x);
|
||
|
ge->SetAreaY(y);
|
||
|
ge->SetAreaWidth(width);
|
||
|
ge->SetAreaHeight(height);
|
||
|
return ge;
|
||
|
}
|
||
|
|
||
|
void cViewGrid::Close(void) {
|
||
|
ClearGrids();
|
||
|
gridsize = GRIDSIZE;
|
||
|
delete[] grid;
|
||
|
grid = new cGridElement*[gridsize];
|
||
|
for (int i=0; i < gridsize; i++) {
|
||
|
grid[i] = NULL;
|
||
|
}
|
||
|
gridMin = 0;
|
||
|
gridMax = -1;
|
||
|
}
|
||
|
|
||
|
void cViewGrid::Hide(void) {
|
||
|
for (int i = 0; i < gridsize; i++) {
|
||
|
if (grid[i]) {
|
||
|
grid[i]->Hide();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cViewGrid::Show(void) {
|
||
|
for (int i = 0; i < gridsize; i++) {
|
||
|
if (grid[i]) {
|
||
|
grid[i]->Show();
|
||
|
}
|
||
|
}
|
||
|
}
|