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.
365 lines
11 KiB
365 lines
11 KiB
/*
|
|
* Kivio - Visual Modelling and Flowcharting
|
|
* Copyright (C) 2000-2003 theKompany.com & Dave Marotti,
|
|
* Peter Simonsson
|
|
*
|
|
* 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
|
|
* of the License, 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.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
#include "tool_zoom.h"
|
|
#include "kivio_view.h"
|
|
#include "kivio_page.h"
|
|
#include "kivio_canvas.h"
|
|
#include "kivio_factory.h"
|
|
|
|
#include <kaction.h>
|
|
#include <kiconloader.h>
|
|
#include <klocale.h>
|
|
#include <kpopupmenu.h>
|
|
#include <ktoolbar.h>
|
|
#include <KoMainWindow.h>
|
|
#include <kdebug.h>
|
|
#include <KoZoomHandler.h>
|
|
#include <KoPoint.h>
|
|
#include <kstdaction.h>
|
|
#include <KoZoomAction.h>
|
|
|
|
#include <tqapplication.h>
|
|
#include <tqcursor.h>
|
|
|
|
ZoomTool::ZoomTool(KivioView* parent) : Kivio::MouseTool(parent, "Zoom Mouse Tool")
|
|
{
|
|
m_zoomAction = new TDERadioAction(i18n("&Zoom"), "viewmag", CTRL + ALT + Key_Z, actionCollection(), "zoom");
|
|
m_zoomAction->setWhatsThis(i18n("By pressing this button you can zoom in on a specific area."));
|
|
m_panAction = new TDERadioAction(i18n("&Pan Document"), "kivio_zoom_hand", CTRL + ALT + Key_H, actionCollection(), "pan");
|
|
m_panAction->setWhatsThis(i18n("You can drag the document by using the mouse."));
|
|
m_zoomAction->setExclusiveGroup("zoomAction");
|
|
m_panAction->setExclusiveGroup("zoomAction");
|
|
connect(m_zoomAction,TQT_SIGNAL(activated()),TQT_SLOT(zoomActivated()));
|
|
connect(m_panAction,TQT_SIGNAL(activated()),TQT_SLOT(handActivated()));
|
|
connect(m_zoomAction, TQT_SIGNAL(toggled(bool)), this, TQT_SLOT(setActivated(bool)));
|
|
connect(m_panAction, TQT_SIGNAL(toggled(bool)), this, TQT_SLOT(setActivated(bool)));
|
|
|
|
KoZoomAction* viewZoom = new KoZoomAction(i18n("Zoom &Level"), "viewmag", 0, actionCollection(), "viewZoom" );
|
|
viewZoom->setWhatsThis(i18n("This allows you to zoom in or out of a document. You can either choose one of the predefined zoomfactors or enter a new zoomfactor (in percent)."));
|
|
connect(viewZoom, TQT_SIGNAL(zoomChanged(const TQString&)), parent, TQT_SLOT(viewZoom(const TQString&)));
|
|
connect(parent, TQT_SIGNAL(zoomChanged(int)), viewZoom, TQT_SLOT(setZoom(int)));
|
|
|
|
m_pPlus = KStdAction::zoomIn(this, TQT_SLOT(zoomPlus()), actionCollection(), "zoomPlus");
|
|
m_pPlus->setWhatsThis(i18n("You can zoom in on the document by pressing this button."));
|
|
|
|
m_pMinus = KStdAction::zoomOut(this, TQT_SLOT(zoomMinus()), actionCollection(), "zoomMinus");
|
|
m_pMinus->setWhatsThis(i18n("By pressing this button you can zoom out of the document."));
|
|
|
|
m_pZoomWidth = new TDEAction( i18n("Zoom Width"), "kivio_zoom_width", SHIFT+Key_F4, actionCollection(), "zoomWidth" );
|
|
m_pZoomWidth->setWhatsThis(i18n("You can zoom the document that it fits into the window width."));
|
|
connect(m_pZoomWidth,TQT_SIGNAL(activated()),TQT_SLOT(zoomWidth()));
|
|
|
|
m_pZoomHeight = new TDEAction( i18n("Zoom Height"), "kivio_zoom_height", SHIFT+Key_F5, actionCollection(), "zoomHeight" );
|
|
m_pZoomHeight->setWhatsThis(i18n("You can zoom the document that it fits into the window height."));
|
|
connect(m_pZoomHeight,TQT_SIGNAL(activated()),TQT_SLOT(zoomHeight()));
|
|
|
|
m_pZoomPage = new TDEAction( i18n("Zoom Page"), "kivio_zoom_page", SHIFT+Key_F6, actionCollection(), "zoomPage" );
|
|
m_pZoomPage->setWhatsThis(i18n("The Zoom Page button shows the entire page."));
|
|
connect(m_pZoomPage,TQT_SIGNAL(activated()),TQT_SLOT(zoomPage()));
|
|
|
|
m_pZoomSelected = new TDEAction( i18n("Zoom Selected"), "kivio_zoom_selected", CTRL+Key_Y, actionCollection(), "zoomSelected" );
|
|
m_pZoomSelected->setWhatsThis(i18n("By pressing this button you zoom in on the document, so that all <b>selected</b> objects are visible."));
|
|
connect(m_pZoomSelected,TQT_SIGNAL(activated()),TQT_SLOT(zoomSelected()));
|
|
|
|
m_pZoomAllObjects = new TDEAction( i18n("Zoom All Objects"), "kivio_zoom_allobject", 0, actionCollection(), "zoomAllObjects" );
|
|
m_pZoomAllObjects->setWhatsThis(i18n("You are able to zoom in on the document, so that all objects are visible by pressing this button."));
|
|
connect(m_pZoomAllObjects,TQT_SIGNAL(activated()),TQT_SLOT(zoomAllobjects()));
|
|
|
|
TQPixmap pix;
|
|
|
|
pix = BarIcon("kivio_zoom_plus",KivioFactory::global());
|
|
m_pPlusCursor = new TQCursor(pix,pix.width()/2,pix.height()/2);
|
|
|
|
pix = BarIcon("kivio_zoom_minus",KivioFactory::global());
|
|
m_pMinusCursor = new TQCursor(pix,pix.width()/2,pix.height()/2);
|
|
|
|
pix = BarIcon("kivio_zoom_hand",KivioFactory::global());
|
|
m_handCursor = new TQCursor(pix,pix.width()/2,pix.height()/2);
|
|
|
|
m_pMenu = 0;
|
|
}
|
|
|
|
ZoomTool::~ZoomTool()
|
|
{
|
|
delete m_pPlusCursor;
|
|
delete m_pMinusCursor;
|
|
delete m_handCursor;
|
|
}
|
|
|
|
bool ZoomTool::processEvent(TQEvent* e)
|
|
{
|
|
KivioCanvas* canvas = view()->canvasWidget();
|
|
|
|
if(!m_bHandMode) {
|
|
switch(e->type()) {
|
|
case TQEvent::KeyPress:
|
|
if (!m_bLockKeyboard && (TQT_TQKEYEVENT(e)->key() == Key_Shift)) {
|
|
m_pCurrent = m_pMinus;
|
|
canvas->setCursor(*m_pMinusCursor);
|
|
return true;
|
|
}
|
|
break;
|
|
case TQEvent::KeyRelease:
|
|
if (!m_bLockKeyboard && (TQT_TQKEYEVENT(e)->key() == Key_Shift)) {
|
|
m_pCurrent = m_pPlus;
|
|
canvas->setCursor(*m_pPlusCursor);
|
|
return true;
|
|
}
|
|
break;
|
|
case TQEvent::MouseButtonPress:
|
|
{
|
|
TQMouseEvent* me = TQT_TQMOUSEEVENT(e);
|
|
|
|
if(me->button() == Qt::LeftButton) {
|
|
if(m_pCurrent == m_pMinus) {
|
|
m_pCurrent->activate();
|
|
} else {
|
|
m_bLockKeyboard = true;
|
|
m_bDrawRubber = true;
|
|
canvas->startRectDraw(me->pos(), KivioCanvas::Rubber);
|
|
}
|
|
} else {
|
|
showPopupMenu(me->globalPos());
|
|
}
|
|
|
|
return true;
|
|
break;
|
|
}
|
|
case TQEvent::MouseButtonRelease:
|
|
if(m_pCurrent == m_pPlus && m_bDrawRubber) {
|
|
canvas->endRectDraw();
|
|
m_bDrawRubber = false;
|
|
m_bLockKeyboard = false;
|
|
zoomRect(canvas->rect());
|
|
return true;
|
|
}
|
|
break;
|
|
case TQEvent::MouseMove:
|
|
if (m_bDrawRubber) {
|
|
canvas->continueRectDraw(TQT_TQMOUSEEVENT(e)->pos(), KivioCanvas::Rubber);
|
|
return true;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
} else {
|
|
switch(e->type()) {
|
|
case TQEvent::MouseButtonPress:
|
|
isHandMousePressed = true;
|
|
mousePos = TQT_TQMOUSEEVENT(e)->pos();
|
|
return true;
|
|
break;
|
|
case TQEvent::MouseButtonRelease:
|
|
isHandMousePressed = false;
|
|
return true;
|
|
break;
|
|
case TQEvent::MouseMove:
|
|
if (isHandMousePressed) {
|
|
canvas->setUpdatesEnabled(false);
|
|
TQPoint newPos = TQT_TQMOUSEEVENT(e)->pos();
|
|
mousePos -= newPos;
|
|
canvas->scrollDx(-mousePos.x());
|
|
canvas->scrollDy(-mousePos.y());
|
|
mousePos = newPos;
|
|
canvas->setUpdatesEnabled(true);
|
|
return true;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void ZoomTool::setActivated(bool a)
|
|
{
|
|
if(a) {
|
|
m_pCurrent = m_pPlus;
|
|
emit activated(this);
|
|
} else {
|
|
kdDebug(43000) << "ZoomTool DeActivate" << endl;
|
|
|
|
m_pCurrent = 0L;
|
|
|
|
m_zoomAction->setChecked(false);
|
|
m_panAction->setChecked(false);
|
|
view()->setStatusBarInfo("");
|
|
|
|
if (!view()->canvasWidget()->isUpdatesEnabled()) {
|
|
view()->canvasWidget()->setUpdatesEnabled(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ZoomTool::zoomActivated()
|
|
{
|
|
view()->canvasWidget()->setCursor(*m_pPlusCursor);
|
|
m_bHandMode = false;
|
|
m_bDrawRubber = false;
|
|
m_bLockKeyboard = false;
|
|
m_zoomAction->setChecked(true);
|
|
m_panAction->setChecked(false);
|
|
view()->setStatusBarInfo(i18n("Hold Shift to zoom out."));
|
|
}
|
|
|
|
void ZoomTool::handActivated()
|
|
{
|
|
view()->canvasWidget()->setCursor(*m_handCursor);
|
|
m_bHandMode = true;
|
|
isHandMousePressed = false;
|
|
m_zoomAction->setChecked(false);
|
|
m_panAction->setChecked(true);
|
|
}
|
|
|
|
void ZoomTool::zoomPlus()
|
|
{
|
|
KivioCanvas* canvas = view()->canvasWidget();
|
|
canvas->zoomIn(TQPoint(canvas->width()/2, canvas->height()/2));
|
|
if(view()->zoomHandler()->zoom() >= 2000)
|
|
{
|
|
m_pPlus->setEnabled(false);
|
|
m_pMinus->setEnabled(true);
|
|
}
|
|
else
|
|
{
|
|
m_pPlus->setEnabled(true);
|
|
m_pMinus->setEnabled(true);
|
|
}
|
|
}
|
|
|
|
void ZoomTool::zoomMinus()
|
|
{
|
|
KivioCanvas* canvas = view()->canvasWidget();
|
|
canvas->zoomOut(TQPoint(canvas->width()/2, canvas->height()/2));
|
|
if(view()->zoomHandler()->zoom() <= 25)
|
|
{
|
|
m_pMinus->setEnabled(false);
|
|
m_pPlus->setEnabled(true);
|
|
}
|
|
else
|
|
{
|
|
m_pMinus->setEnabled(true);
|
|
m_pPlus->setEnabled(true);
|
|
}
|
|
}
|
|
|
|
void ZoomTool::zoomWidth()
|
|
{
|
|
KivioCanvas* canvas = view()->canvasWidget();
|
|
KoZoomHandler zoom;
|
|
zoom.setZoomAndResolution(100, KoGlobal::dpiX(),
|
|
KoGlobal::dpiY());
|
|
int cw = TQMAX(10,canvas->width()-20);
|
|
KoPageLayout pl = canvas->activePage()->paperLayout();
|
|
float w = zoom.zoomItX(pl.ptWidth);
|
|
float z = cw/w;
|
|
|
|
canvas->setUpdatesEnabled(false);
|
|
view()->viewZoom(tqRound(z * 100));
|
|
canvas->setUpdatesEnabled(true);
|
|
}
|
|
|
|
void ZoomTool::zoomHeight()
|
|
{
|
|
KivioCanvas* canvas = view()->canvasWidget();
|
|
KoZoomHandler zoom;
|
|
zoom.setZoomAndResolution(100, KoGlobal::dpiX(),
|
|
KoGlobal::dpiY());
|
|
int ch = TQMAX(10,canvas->height()-20);
|
|
KoPageLayout pl = canvas->activePage()->paperLayout();
|
|
float h = zoom.zoomItY(pl.ptHeight);
|
|
float zh = ch/h;
|
|
|
|
canvas->setUpdatesEnabled(false);
|
|
view()->viewZoom(tqRound(zh * 100));
|
|
canvas->setUpdatesEnabled(true);
|
|
}
|
|
|
|
void ZoomTool::zoomPage()
|
|
{
|
|
KivioCanvas* canvas = view()->canvasWidget();
|
|
KoZoomHandler zoom;
|
|
zoom.setZoomAndResolution(100, KoGlobal::dpiX(),
|
|
KoGlobal::dpiY());
|
|
int cw = TQMAX(10,canvas->width()-20);
|
|
int ch = TQMAX(10,canvas->height()-20);
|
|
|
|
KoPageLayout pl = canvas->activePage()->paperLayout();
|
|
float w = zoom.zoomItX(pl.ptWidth);
|
|
float h = zoom.zoomItY(pl.ptHeight);
|
|
|
|
float z = TQMIN(cw/w,ch/h);
|
|
|
|
canvas->setUpdatesEnabled(false);
|
|
view()->viewZoom(tqRound(z * 100));
|
|
canvas->setUpdatesEnabled(true);
|
|
}
|
|
|
|
void ZoomTool::showPopupMenu(const TQPoint& p )
|
|
{
|
|
if(!m_pMenu) {
|
|
m_pMenu = static_cast<TDEPopupMenu*>(factory()->container("ZoomPopup", this));
|
|
}
|
|
|
|
if(m_pMenu) {
|
|
m_pMenu->popup(p);
|
|
} else {
|
|
kdDebug(43000) << "What no popup! *ARGH*!" << endl;
|
|
}
|
|
}
|
|
|
|
void ZoomTool::zoomSelected()
|
|
{
|
|
KivioCanvas* canvas = view()->canvasWidget();
|
|
KoRect r = canvas->activePage()->getRectForAllSelectedStencils();
|
|
|
|
if (!r.isNull() && r.isValid()) {
|
|
canvas->setVisibleArea(r);
|
|
}
|
|
}
|
|
|
|
void ZoomTool::zoomAllobjects()
|
|
{
|
|
KivioCanvas* canvas = view()->canvasWidget();
|
|
KoRect r = canvas->activePage()->getRectForAllStencils();
|
|
|
|
if (!r.isNull() && r.isValid()) {
|
|
canvas->setVisibleArea(r);
|
|
}
|
|
}
|
|
|
|
void ZoomTool::zoomRect(TQRect r)
|
|
{
|
|
KivioCanvas* canvas = view()->canvasWidget();
|
|
|
|
if (r.isEmpty()) {
|
|
canvas->zoomIn(r.topLeft());
|
|
return;
|
|
}
|
|
|
|
KoPoint p0 = canvas->mapFromScreen(r.topLeft());
|
|
canvas->setVisibleArea(KoRect(p0.x(), p0.y(), view()->zoomHandler()
|
|
->unzoomItX(r.width()), view()->zoomHandler()->unzoomItY(r.height())));
|
|
}
|
|
#include "tool_zoom.moc"
|