/* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2008-08-20 * Description : A widget stack to embed editor view. * * Copyright (C) 2008 by Gilles Caulier * * This program 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, or (at your option) * any later version. * * This program 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. * * ============================================================ */ // Local includes. #include "previewwidget.h" #include "imageregionwidget.h" #include "imagepanelwidget.h" #include "canvas.h" #include "editorstackview.h" #include "editorstackview.moc" namespace Digikam { class EditorStackViewPriv { public: EditorStackViewPriv() { canvas = 0; toolView = 0; } TQWidget *toolView; Canvas *canvas; }; EditorStackView::EditorStackView(TQWidget *parent) : TQWidgetStack(parent, 0, TQt::WDestructiveClose) { d = new EditorStackViewPriv; } EditorStackView::~EditorStackView() { delete d; } void EditorStackView::setCanvas(Canvas* canvas) { if (d->canvas) return; d->canvas = canvas; addWidget(d->canvas, CanvasMode); connect(d->canvas, TQ_SIGNAL(signalZoomChanged(double)), this, TQ_SLOT(slotZoomChanged(double))); } Canvas* EditorStackView::canvas() const { return d->canvas; } void EditorStackView::setToolView(TQWidget* view) { if (d->toolView) removeWidget(d->toolView); d->toolView = view; if (d->toolView) addWidget(d->toolView, ToolViewMode); PreviewWidget *preview = previewWidget(); if (preview) { connect(preview, TQ_SIGNAL(signalZoomFactorChanged(double)), this, TQ_SLOT(slotZoomChanged(double))); } } TQWidget* EditorStackView::toolView() const { return d->toolView; } int EditorStackView::viewMode() { return id(visibleWidget()); } void EditorStackView::setViewMode(int mode) { if (mode != CanvasMode && mode != ToolViewMode) return; raiseWidget(mode); } void EditorStackView::increaseZoom() { if (viewMode() == CanvasMode) { d->canvas->slotIncreaseZoom(); } else { PreviewWidget *preview = previewWidget(); if (preview) preview->slotIncreaseZoom(); } } void EditorStackView::decreaseZoom() { if (viewMode() == CanvasMode) { d->canvas->slotDecreaseZoom(); } else { PreviewWidget *preview = previewWidget(); if (preview) preview->slotDecreaseZoom(); } } void EditorStackView::toggleFitToWindow() { if (viewMode() == CanvasMode) { d->canvas->toggleFitToWindow(); } else { PreviewWidget *preview = previewWidget(); if (preview) preview->toggleFitToWindow(); } } void EditorStackView::fitToSelect() { if (viewMode() == CanvasMode) { d->canvas->fitToSelect(); } } void EditorStackView::zoomTo100Percents() { if (viewMode() == CanvasMode) { if (d->canvas->zoomFactor() == 1.0) d->canvas->toggleFitToWindow(); else d->canvas->setZoomFactor(1.0); } else { PreviewWidget *preview = previewWidget(); if (preview) { if (preview->zoomFactor() == 1.0) preview->toggleFitToWindow(); else preview->setZoomFactor(1.0); } } } void EditorStackView::setZoomFactor(double zoom) { if (viewMode() == CanvasMode) { d->canvas->setZoomFactor(zoom); } else { PreviewWidget *preview = previewWidget(); if (preview) preview->setZoomFactor(zoom); } } void EditorStackView::slotZoomChanged(double zoom) { bool max, min; if (viewMode() == CanvasMode) { max = d->canvas->maxZoom(); min = d->canvas->minZoom(); emit signalZoomChanged(max, min, zoom); } else { PreviewWidget *preview = previewWidget(); if (preview) { max = preview->maxZoom(); min = preview->minZoom(); emit signalZoomChanged(max, min, zoom); } } } PreviewWidget* EditorStackView::previewWidget() const { PreviewWidget *preview = dynamic_cast(d->toolView); if (preview) return preview; ImagePanelWidget *panel = dynamic_cast(d->toolView); if (panel) return (dynamic_cast(panel->previewWidget())); return 0; } } // namespace Digikam