diff --git a/src/control/jobs/PreviewJob.cpp b/src/control/jobs/PreviewJob.cpp index 6d0a8598..049a786c 100644 --- a/src/control/jobs/PreviewJob.cpp +++ b/src/control/jobs/PreviewJob.cpp @@ -80,8 +80,10 @@ void PreviewJob::drawPage() { case RENDER_TYPE_PAGE_LAYER: if (layer != -1) { break; // out - } // else fall through for layer == -1 + } + [[fallthrough]]; + case RENDER_TYPE_PAGE_LAYERSTACK: case RENDER_TYPE_PAGE_PREVIEW: if (page->getBackgroundType().isPdfPage()) { drawBackgroundPdf(doc); @@ -111,6 +113,17 @@ void PreviewJob::drawPage() { view.finializeDrawing(); break; + case RENDER_TYPE_PAGE_LAYERSTACK: + // render all layers up to layer + view.initDrawing(page, cr2, true); + view.drawBackground(); + for (int i = 0; i <= layer; i++) { + Layer* drawLayer = (*page->getLayers())[i]; + view.drawLayer(cr2, drawLayer); + } + view.finializeDrawing(); + break; + default: // unknown type break; diff --git a/src/gui/sidebar/Sidebar.cpp b/src/gui/sidebar/Sidebar.cpp index 32bfdf9a..f16306fa 100644 --- a/src/gui/sidebar/Sidebar.cpp +++ b/src/gui/sidebar/Sidebar.cpp @@ -25,7 +25,8 @@ Sidebar::Sidebar(GladeGui* gui, Control* control): toolbar(this, gui), control(c void Sidebar::initPages(GtkWidget* sidebarContents, GladeGui* gui) { addPage(new SidebarIndexPage(this->control, &this->toolbar)); addPage(new SidebarPreviewPages(this->control, this->gui, &this->toolbar)); - addPage(new SidebarPreviewLayers(this->control, this->gui, &this->toolbar)); + addPage(new SidebarPreviewLayers(this->control, this->gui, &this->toolbar, false)); + addPage(new SidebarPreviewLayers(this->control, this->gui, &this->toolbar, true)); // Init toolbar with icons diff --git a/src/gui/sidebar/previews/base/SidebarPreviewBaseEntry.h b/src/gui/sidebar/previews/base/SidebarPreviewBaseEntry.h index 15061f19..d5856292 100644 --- a/src/gui/sidebar/previews/base/SidebarPreviewBaseEntry.h +++ b/src/gui/sidebar/previews/base/SidebarPreviewBaseEntry.h @@ -32,7 +32,12 @@ typedef enum { /** * Render only a layer */ - RENDER_TYPE_PAGE_LAYER + RENDER_TYPE_PAGE_LAYER, + + /** + * Render the stack up to a layer + */ + RENDER_TYPE_PAGE_LAYERSTACK } PreviewRenderType; diff --git a/src/gui/sidebar/previews/layer/SidebarPreviewLayerEntry.cpp b/src/gui/sidebar/previews/layer/SidebarPreviewLayerEntry.cpp index 31e99ece..faf88178 100644 --- a/src/gui/sidebar/previews/layer/SidebarPreviewLayerEntry.cpp +++ b/src/gui/sidebar/previews/layer/SidebarPreviewLayerEntry.cpp @@ -7,10 +7,11 @@ SidebarPreviewLayerEntry::SidebarPreviewLayerEntry(SidebarPreviewBase* sidebar, const PageRef& page, int layer, - const string& layerName, size_t index): + const string& layerName, size_t index, bool stacked): SidebarPreviewBaseEntry(sidebar, page), index(index), layer(layer), + stacked(stacked), box(gtk_box_new(GTK_ORIENTATION_VERTICAL, 2)) { GtkWidget* toolbar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); @@ -56,7 +57,9 @@ void SidebarPreviewLayerEntry::mouseButtonPressCallback() { (dynamic_cast(sidebar))->layerSelected(index); } -auto SidebarPreviewLayerEntry::getRenderType() -> PreviewRenderType { return RENDER_TYPE_PAGE_LAYER; } +auto SidebarPreviewLayerEntry::getRenderType() -> PreviewRenderType { + return stacked ? RENDER_TYPE_PAGE_LAYERSTACK : RENDER_TYPE_PAGE_LAYER; +} auto SidebarPreviewLayerEntry::getHeight() -> int { return getWidgetHeight() + toolbarHeight; } diff --git a/src/gui/sidebar/previews/layer/SidebarPreviewLayerEntry.h b/src/gui/sidebar/previews/layer/SidebarPreviewLayerEntry.h index 7d9e4dfa..7e5e3c9d 100644 --- a/src/gui/sidebar/previews/layer/SidebarPreviewLayerEntry.h +++ b/src/gui/sidebar/previews/layer/SidebarPreviewLayerEntry.h @@ -19,7 +19,7 @@ class SidebarPreviewBase; class SidebarPreviewLayerEntry: public SidebarPreviewBaseEntry { public: SidebarPreviewLayerEntry(SidebarPreviewBase* sidebar, const PageRef& page, int layer, const string& layerName, - size_t index); + size_t index, bool stacked); virtual ~SidebarPreviewLayerEntry(); public: @@ -78,5 +78,10 @@ private: */ bool inUpdate = false; + /** + * render as stacked + */ + bool stacked = false; + friend class PreviewJob; }; diff --git a/src/gui/sidebar/previews/layer/SidebarPreviewLayers.cpp b/src/gui/sidebar/previews/layer/SidebarPreviewLayers.cpp index 0cdc401f..46e59970 100644 --- a/src/gui/sidebar/previews/layer/SidebarPreviewLayers.cpp +++ b/src/gui/sidebar/previews/layer/SidebarPreviewLayers.cpp @@ -7,8 +7,8 @@ #include "SidebarPreviewLayerEntry.h" #include "i18n.h" -SidebarPreviewLayers::SidebarPreviewLayers(Control* control, GladeGui* gui, SidebarToolbar* toolbar): - SidebarPreviewBase(control, gui, toolbar), lc(control->getLayerController()) { +SidebarPreviewLayers::SidebarPreviewLayers(Control* control, GladeGui* gui, SidebarToolbar* toolbar, bool stacked): + SidebarPreviewBase(control, gui, toolbar), lc(control->getLayerController()), stacked(stacked) { LayerCtrlListener::registerListener(lc); this->toolbar->setButtonEnabled(SIDEBAR_ACTION_NONE); @@ -56,9 +56,9 @@ void SidebarPreviewLayers::enableSidebar() { rebuildLayerMenu(); } -auto SidebarPreviewLayers::getName() -> string { return _("Layer Preview"); } +auto SidebarPreviewLayers::getName() -> string { return stacked ? _("Layerstack Preview") : _("Layer Preview"); } -auto SidebarPreviewLayers::getIconName() -> string { return "layer"; } +auto SidebarPreviewLayers::getIconName() -> string { return stacked ? "sidebar-layerstack" : "layer"; } void SidebarPreviewLayers::pageSizeChanged(size_t page) { if (page != this->lc->getCurrentPageId() || !enabled) { @@ -101,7 +101,7 @@ void SidebarPreviewLayers::updatePreviews() { size_t index = 0; for (int i = layerCount; i >= 0; i--) { std::string name = lc->getLayerNameById(i); - SidebarPreviewBaseEntry* p = new SidebarPreviewLayerEntry(this, page, i - 1, name, index++); + SidebarPreviewBaseEntry* p = new SidebarPreviewLayerEntry(this, page, i - 1, name, index++, this->stacked); this->previews.push_back(p); gtk_layout_put(GTK_LAYOUT(this->iconViewPreview), p->getWidget(), 0, 0); } diff --git a/src/gui/sidebar/previews/layer/SidebarPreviewLayers.h b/src/gui/sidebar/previews/layer/SidebarPreviewLayers.h index 3606f576..ecbb9d5d 100644 --- a/src/gui/sidebar/previews/layer/SidebarPreviewLayers.h +++ b/src/gui/sidebar/previews/layer/SidebarPreviewLayers.h @@ -21,7 +21,7 @@ class SidebarPreviewLayers: public SidebarPreviewBase, public LayerCtrlListener { public: - SidebarPreviewLayers(Control* control, GladeGui* gui, SidebarToolbar* toolbar); + SidebarPreviewLayers(Control* control, GladeGui* gui, SidebarToolbar* toolbar, bool stacked); virtual ~SidebarPreviewLayers(); public: @@ -75,4 +75,9 @@ private: * Layer Controller */ LayerController* lc; + + /** + * render as stacked + */ + bool stacked; }; diff --git a/ui/icons/hicolor/scalable/actions/sidebar-layerstack.svg b/ui/icons/hicolor/scalable/actions/sidebar-layerstack.svg new file mode 100644 index 00000000..152874d3 --- /dev/null +++ b/ui/icons/hicolor/scalable/actions/sidebar-layerstack.svg @@ -0,0 +1,345 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + +