You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
318 lines
4.6 KiB
318 lines
4.6 KiB
#include "XojPage.h" |
|
|
|
#include "BackgroundImage.h" |
|
#include "Document.h" |
|
|
|
#include <Util.h> |
|
|
|
XojPage::XojPage(double width, double height) |
|
{ |
|
XOJ_INIT_TYPE(XojPage); |
|
|
|
this->pdfBackgroundPage = size_t_npos; |
|
this->backgroundColor = 0xffffff; |
|
this->bgType.format = "lined"; |
|
|
|
this->width = width; |
|
this->height = height; |
|
|
|
this->ref = 0; |
|
this->currentLayer = size_t_npos; |
|
|
|
this->backgroundVisible = true; |
|
} |
|
|
|
XojPage::~XojPage() |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
for (Layer* l : this->layer) |
|
{ |
|
delete l; |
|
} |
|
this->layer.clear(); |
|
|
|
XOJ_RELEASE_TYPE(XojPage); |
|
} |
|
|
|
void XojPage::reference() |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
this->ref++; |
|
} |
|
|
|
void XojPage::unreference() |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
this->ref--; |
|
if (ref < 1) |
|
{ |
|
delete this; |
|
} |
|
} |
|
|
|
XojPage* XojPage::clone() |
|
{ |
|
XojPage* page = new XojPage(this->width, this->height); |
|
|
|
page->backgroundImage = this->backgroundImage; |
|
for (Layer* l : this->layer) |
|
{ |
|
page->addLayer(l->clone()); |
|
} |
|
|
|
page->currentLayer = this->currentLayer; |
|
page->bgType = this->bgType; |
|
page->pdfBackgroundPage = this->pdfBackgroundPage; |
|
page->backgroundColor = this->backgroundColor; |
|
|
|
return page; |
|
} |
|
|
|
void XojPage::addLayer(Layer* layer) |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
this->layer.push_back(layer); |
|
this->currentLayer = size_t_npos; |
|
} |
|
|
|
void XojPage::insertLayer(Layer* layer, int index) |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
if (index >= (int)this->layer.size()) |
|
{ |
|
addLayer(layer); |
|
return; |
|
} |
|
|
|
this->layer.insert(this->layer.begin() + index, layer); |
|
this->currentLayer = index + 1; |
|
} |
|
|
|
void XojPage::removeLayer(Layer* layer) |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
for (unsigned int i = 0; i < this->layer.size(); i++) |
|
{ |
|
if (layer == this->layer[i]) |
|
{ |
|
this->layer.erase(this->layer.begin() + i); |
|
break; |
|
} |
|
} |
|
this->currentLayer = size_t_npos; |
|
} |
|
|
|
void XojPage::setSelectedLayerId(int id) |
|
{ |
|
this->currentLayer = id; |
|
} |
|
|
|
vector<Layer*>* XojPage::getLayers() |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
return &this->layer; |
|
} |
|
|
|
size_t XojPage::getLayerCount() |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
return this->layer.size(); |
|
} |
|
|
|
/** |
|
* Layer ID 0 = Background, Layer ID 1 = Layer 1 |
|
*/ |
|
int XojPage::getSelectedLayerId() |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
if (this->currentLayer == size_t_npos) |
|
{ |
|
this->currentLayer = this->layer.size(); |
|
} |
|
|
|
return this->currentLayer; |
|
} |
|
|
|
void XojPage::setLayerVisible(int layerId, bool visible) |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
if (layerId < 0) |
|
{ |
|
return; |
|
} |
|
|
|
if (layerId == 0) |
|
{ |
|
backgroundVisible = visible; |
|
return; |
|
} |
|
|
|
layerId--; |
|
if (layerId >= (int)this->layer.size()) |
|
{ |
|
return; |
|
} |
|
|
|
this->layer[layerId]->setVisible(visible); |
|
} |
|
|
|
bool XojPage::isLayerVisible(int layerId) |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
if (layerId < 0) |
|
{ |
|
return false; |
|
} |
|
|
|
if (layerId == 0) |
|
{ |
|
return backgroundVisible; |
|
} |
|
|
|
layerId--; |
|
if (layerId >= (int)this->layer.size()) |
|
{ |
|
return false; |
|
} |
|
|
|
return this->layer[layerId]->isVisible(); |
|
} |
|
|
|
bool XojPage::isLayerVisible(Layer* layer) |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
return layer->isVisible(); |
|
} |
|
|
|
void XojPage::setBackgroundPdfPageNr(size_t page) |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
this->pdfBackgroundPage = page; |
|
this->bgType.format = ":pdf"; |
|
this->bgType.config = ""; |
|
} |
|
|
|
void XojPage::setBackgroundColor(int color) |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
this->backgroundColor = color; |
|
} |
|
|
|
int XojPage::getBackgroundColor() |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
return this->backgroundColor; |
|
} |
|
|
|
void XojPage::setSize(double width, double height) |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
this->width = width; |
|
this->height = height; |
|
} |
|
|
|
double XojPage::getWidth() const |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
return this->width; |
|
} |
|
|
|
double XojPage::getHeight() const |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
return this->height; |
|
} |
|
|
|
size_t XojPage::getPdfPageNr() |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
return this->pdfBackgroundPage; |
|
} |
|
|
|
bool XojPage::isAnnotated() |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
for (Layer* l : this->layer) |
|
{ |
|
if (l->isAnnotated()) |
|
{ |
|
return true; |
|
} |
|
} |
|
return false; |
|
} |
|
|
|
void XojPage::setBackgroundType(PageType bgType) |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
this->bgType = bgType; |
|
|
|
if (!bgType.isPdfPage()) |
|
{ |
|
this->pdfBackgroundPage = size_t_npos; |
|
} |
|
if (!bgType.isImagePage()) |
|
{ |
|
this->backgroundImage.free(); |
|
} |
|
} |
|
|
|
PageType XojPage::getBackgroundType() |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
return this->bgType; |
|
} |
|
|
|
BackgroundImage& XojPage::getBackgroundImage() |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
return this->backgroundImage; |
|
} |
|
|
|
void XojPage::setBackgroundImage(BackgroundImage img) |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
this->backgroundImage = img; |
|
} |
|
|
|
Layer* XojPage::getSelectedLayer() |
|
{ |
|
XOJ_CHECK_TYPE(XojPage); |
|
|
|
if (this->layer.empty()) |
|
{ |
|
addLayer(new Layer()); |
|
} |
|
size_t layer = getSelectedLayerId(); |
|
|
|
if (layer > 0) |
|
{ |
|
layer--; |
|
} |
|
|
|
return this->layer[layer]; |
|
}
|
|
|