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.
digikam/digikam/utilities/imageeditor/editor/editorstackview.cpp

234 lines
4.9 KiB

/* ============================================================
*
* 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 <caulier dot gilles at gmail dot com>
*
* 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, TQT_SIGNAL(signalZoomChanged(double)),
this, TQT_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, TQT_SIGNAL(signalZoomFactorChanged(double)),
this, TQT_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<PreviewWidget*>(d->toolView);
if (preview) return preview;
ImagePanelWidget *panel = dynamic_cast<ImagePanelWidget*>(d->toolView);
if (panel) return (dynamic_cast<PreviewWidget*>(panel->previewWidget()));
return 0;
}
} // namespace Digikam