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.
307 lines
7.7 KiB
307 lines
7.7 KiB
// Copyright (C) 2002 Dominique Devriese <devriese@kde.org>
|
|
|
|
// 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 "normal.h"
|
|
|
|
#include "../kig/kig_view.h"
|
|
#include "../kig/kig_part.h"
|
|
#include "../kig/kig_document.h"
|
|
#include "../kig/kig_commands.h"
|
|
#include "../objects/object_factory.h"
|
|
#include "../objects/object_imp.h"
|
|
#include "../objects/object_drawer.h"
|
|
#include "../misc/kigpainter.h"
|
|
#include "popup.h"
|
|
#include "moving.h"
|
|
#include "macro.h"
|
|
#include "dragrectmode.h"
|
|
#include "typesdialog.h"
|
|
|
|
#include <kcursor.h>
|
|
#include <kaction.h>
|
|
#include <kcommand.h>
|
|
#include <klocale.h>
|
|
|
|
#include <algorithm>
|
|
#include <functional>
|
|
|
|
using namespace std;
|
|
|
|
void NormalMode::enableActions()
|
|
{
|
|
KigMode::enableActions();
|
|
mdoc.enableConstructActions( true );
|
|
mdoc.aSelectAll->setEnabled( true );
|
|
mdoc.aDeselectAll->setEnabled( true );
|
|
mdoc.aInvertSelection->setEnabled( true );
|
|
mdoc.aDeleteObjects->setEnabled( true );
|
|
mdoc.aShowHidden->setEnabled( true );
|
|
mdoc.aNewMacro->setEnabled( true );
|
|
mdoc.aConfigureTypes->setEnabled( true );
|
|
mdoc.history()->updateActions();
|
|
}
|
|
|
|
void NormalMode::deleteObjects()
|
|
{
|
|
std::vector<ObjectHolder*> sel( sos.begin(), sos.end() );
|
|
mdoc.delObjects( sel );
|
|
sos.clear();
|
|
}
|
|
|
|
void NormalMode::selectObject( ObjectHolder* o )
|
|
{
|
|
sos.insert( o );
|
|
}
|
|
|
|
void NormalMode::selectObjects( const std::vector<ObjectHolder*>& os )
|
|
{
|
|
// hehe, don't you love this c++ stuff ;)
|
|
std::for_each( os.begin(), os.end(),
|
|
std::bind1st(
|
|
std::mem_fun( &NormalMode::selectObject ), this ) );
|
|
}
|
|
|
|
void NormalMode::unselectObject( ObjectHolder* o )
|
|
{
|
|
sos.erase( o );
|
|
}
|
|
|
|
void NormalMode::clearSelection()
|
|
{
|
|
sos.clear();
|
|
}
|
|
|
|
// KigDocumentPopup* NormalMode::popup( KigDocument* )
|
|
// {
|
|
// return 0;
|
|
// }
|
|
|
|
void NormalMode::showHidden()
|
|
{
|
|
mdoc.showObjects( mdoc.document().objects() );
|
|
}
|
|
|
|
void NormalMode::newMacro()
|
|
{
|
|
DefineMacroMode m( mdoc );
|
|
mdoc.runMode( &m );
|
|
}
|
|
|
|
void NormalMode::redrawScreen( KigWidget* w )
|
|
{
|
|
// unselect removed objects..
|
|
std::vector<ObjectHolder*> nsos;
|
|
const std::set<ObjectHolder*> docobjs = mdoc.document().objectsSet();
|
|
std::set_intersection( docobjs.begin(), docobjs.end(), sos.begin(), sos.end(),
|
|
std::back_inserter( nsos ) );
|
|
sos = std::set<ObjectHolder*>( nsos.begin(), nsos.end() );
|
|
w->redrawScreen( nsos, true );
|
|
w->updateScrollBars();
|
|
}
|
|
|
|
void NormalMode::editTypes()
|
|
{
|
|
TypesDialog d( mdoc.widget(), mdoc );
|
|
d.exec();
|
|
}
|
|
|
|
NormalMode::NormalMode( KigPart& d )
|
|
: BaseMode( d )
|
|
{
|
|
}
|
|
|
|
NormalMode::~NormalMode()
|
|
{
|
|
}
|
|
|
|
void NormalMode::dragRect( const QPoint& p, KigWidget& w )
|
|
{
|
|
DragRectMode d( p, mdoc, w );
|
|
mdoc.runMode( &d );
|
|
|
|
KigPainter pter( w.screenInfo(), &w.stillPix, mdoc.document() );
|
|
|
|
if ( ! d.cancelled() )
|
|
{
|
|
std::vector<ObjectHolder*> sel = d.ret();
|
|
|
|
if ( d.needClear() )
|
|
{
|
|
pter.drawObjects( sos.begin(), sos.end(), false );
|
|
clearSelection();
|
|
};
|
|
|
|
selectObjects( sel );
|
|
pter.drawObjects( sel, true );
|
|
};
|
|
|
|
w.updateCurPix( pter.overlay() );
|
|
w.updateWidget();
|
|
}
|
|
|
|
void NormalMode::dragObject( const std::vector<ObjectHolder*>& oco, const QPoint& pco,
|
|
KigWidget& w, bool ctrlOrShiftDown )
|
|
{
|
|
// first determine what to move...
|
|
if( sos.find( oco.front() ) == sos.end() )
|
|
{
|
|
// the user clicked on something that is currently not
|
|
// selected... --> we select it, taking the Ctrl- and
|
|
// Shift-buttons into account...
|
|
if ( !ctrlOrShiftDown ) clearSelection();
|
|
selectObject(oco.front());
|
|
}
|
|
|
|
std::vector<ObjectHolder*> sosv( sos.begin(), sos.end() );
|
|
MovingMode m( sosv, w.fromScreen( pco ), w, mdoc );
|
|
mdoc.runMode( &m );
|
|
}
|
|
|
|
void NormalMode::leftClickedObject( ObjectHolder* o, const QPoint&,
|
|
KigWidget& w, bool ctrlOrShiftDown )
|
|
{
|
|
KigPainter pter( w.screenInfo(), &w.stillPix, mdoc.document() );
|
|
|
|
if ( ! o )
|
|
{
|
|
pter.drawObjects( sos.begin(), sos.end(), false );
|
|
clearSelection();
|
|
}
|
|
else if( sos.find( o ) == sos.end() )
|
|
{
|
|
// clicked on an object that wasn't selected....
|
|
if (!ctrlOrShiftDown)
|
|
{
|
|
pter.drawObjects( sos.begin(), sos.end(), false );
|
|
clearSelection();
|
|
};
|
|
pter.drawObject( o, true );
|
|
selectObject( o );
|
|
}
|
|
else
|
|
{
|
|
// clicked on an object that was selected....
|
|
pter.drawObject( o, false );
|
|
unselectObject( o );
|
|
};
|
|
w.updateCurPix( pter.overlay() );
|
|
w.updateWidget();
|
|
}
|
|
|
|
void NormalMode::midClicked( const QPoint& p, KigWidget& w )
|
|
{
|
|
ObjectHolder* pto = ObjectFactory::instance()->sensiblePoint( w.fromScreen( p ), mdoc.document(), w );
|
|
pto->calc( mdoc.document() );
|
|
mdoc.addObject( pto );
|
|
|
|
// refresh the screen...
|
|
// not necessary, done by addObjects, which calls NormalMode::redrawScreen..
|
|
// w.redrawScreen();
|
|
// w.updateScrollBars();
|
|
}
|
|
|
|
void NormalMode::rightClicked( const std::vector<ObjectHolder*>& os,
|
|
const QPoint& plc,
|
|
KigWidget& w )
|
|
{
|
|
// saving the current cursor position
|
|
QPoint pt = QCursor::pos();
|
|
if( !os.empty() )
|
|
{
|
|
ObjectHolder* o = 0;
|
|
int id = ObjectChooserPopup::getObjectFromList( pt, &w, os );
|
|
if ( id >= 0 )
|
|
o = os[id];
|
|
else
|
|
return;
|
|
if( sos.find( o ) == sos.end() )
|
|
{
|
|
clearSelection();
|
|
selectObject( o );
|
|
};
|
|
// show a popup menu...
|
|
std::vector<ObjectHolder*> sosv( sos.begin(), sos.end() );
|
|
NormalModePopupObjects p( mdoc, w, *this, sosv, plc );
|
|
p.exec( pt );
|
|
}
|
|
else
|
|
{
|
|
NormalModePopupObjects p( mdoc, w, *this, std::vector<ObjectHolder*>(), plc );
|
|
p.exec( pt );
|
|
};
|
|
}
|
|
|
|
void NormalMode::mouseMoved( const std::vector<ObjectHolder*>& os,
|
|
const QPoint& plc,
|
|
KigWidget& w,
|
|
bool )
|
|
{
|
|
w.updateCurPix();
|
|
if( os.empty() )
|
|
{
|
|
w.setCursor( KCursor::arrowCursor() );
|
|
mdoc.emitStatusBarText( 0 );
|
|
w.updateWidget();
|
|
}
|
|
else
|
|
{
|
|
// the cursor is over an object, show object type next to cursor
|
|
// and set statusbar text
|
|
|
|
w.setCursor( KCursor::handCursor() );
|
|
|
|
int id = ObjectChooserPopup::getObjectFromList( plc, &w, os, false );
|
|
QString stat = id == 0 ? os.front()->selectStatement() : i18n( "Which object?" );
|
|
|
|
// statusbar text
|
|
mdoc.emitStatusBarText( stat );
|
|
KigPainter p( w.screenInfo(), &w.curPix, mdoc.document() );
|
|
|
|
// set the text next to the arrow cursor
|
|
QPoint point = plc;
|
|
point.setX(point.x()+15);
|
|
|
|
p.drawTextStd( point, stat );
|
|
w.updateWidget( p.overlay() );
|
|
};
|
|
}
|
|
|
|
void NormalMode::selectAll()
|
|
{
|
|
const std::vector<ObjectHolder*> os = mdoc.document().objects();
|
|
selectObjects( os );
|
|
mdoc.redrawScreen();
|
|
}
|
|
|
|
void NormalMode::deselectAll()
|
|
{
|
|
clearSelection();
|
|
mdoc.redrawScreen();
|
|
}
|
|
|
|
void NormalMode::invertSelection()
|
|
{
|
|
std::vector<ObjectHolder*> os = mdoc.document().objects();
|
|
std::set<ObjectHolder*> oldsel = sos;
|
|
clearSelection();
|
|
for ( std::vector<ObjectHolder*>::const_iterator i = os.begin();
|
|
i != os.end(); ++i )
|
|
if ( oldsel.find( *i ) == oldsel.end() )
|
|
sos.insert( *i );
|
|
mdoc.redrawScreen();
|
|
}
|