• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kig

  • sources
  • kde-4.12
  • kdeedu
  • kig
  • modes
moving.cc
Go to the documentation of this file.
1 // Copyright (C) 2002 Dominique Devriese <devriese@kde.org>
2 
3 // This program is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU General Public License
5 // as published by the Free Software Foundation; either version 2
6 // of the License, or (at your option) any later version.
7 
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 // 02110-1301, USA.
17 
18 #include "moving.h"
19 
20 #include "normal.h"
21 
22 #include "../objects/object_imp.h"
23 #include "../objects/object_factory.h"
24 #include "../kig/kig_document.h"
25 #include "../kig/kig_part.h"
26 #include "../kig/kig_view.h"
27 #include "../kig/kig_commands.h"
28 #include "../misc/kigpainter.h"
29 #include "../misc/calcpaths.h"
30 #include "../misc/coordinate_system.h"
31 
32 #include <qevent.h>
33 
34 #include <functional>
35 #include <algorithm>
36 #include <map>
37 #include <iterator>
38 
39 void MovingModeBase::initScreen( const std::vector<ObjectCalcer*>& in )
40 {
41  mcalcable = in;
42  std::set<ObjectCalcer*> calcableset( mcalcable.begin(), mcalcable.end() );
43 
44  // don't try to move objects that have been deleted from the
45  // document or internal objects that the user is not aware of..
46  std::vector<ObjectHolder*> docobjs = mdoc.document().objects();
47  for ( std::vector<ObjectHolder*>::iterator i = docobjs.begin();
48  i != docobjs.end(); ++i )
49  if ( calcableset.find( ( *i )->calcer() ) != calcableset.end() )
50  mdrawable.push_back( *i );
51 
52  std::set<ObjectHolder*> docobjsset( docobjs.begin(), docobjs.end() );
53  std::set<ObjectHolder*> drawableset( mdrawable.begin(), mdrawable.end() );
54  std::set<ObjectHolder*> notmovingobjs;
55  std::set_difference( docobjsset.begin(), docobjsset.end(), drawableset.begin(), drawableset.end(),
56  std::inserter( notmovingobjs, notmovingobjs.begin() ) );
57 
58  mview.clearStillPix();
59  KigPainter p( mview.screenInfo(), &mview.stillPix, mdoc.document() );
60  p.drawGrid( mdoc.document().coordinateSystem(), mdoc.document().grid(),
61  mdoc.document().axes() );
62  p.drawObjects( notmovingobjs.begin(), notmovingobjs.end(), false );
63  mview.updateCurPix();
64 
65  KigPainter p2( mview.screenInfo(), &mview.curPix, mdoc.document() );
66  p2.drawObjects( drawableset.begin(), drawableset.end(), true );
67 }
68 
69 void MovingModeBase::leftReleased( QMouseEvent*, KigWidget* v )
70 {
71  // clean up after ourselves:
72  for ( std::vector<ObjectCalcer*>::iterator i = mcalcable.begin();
73  i != mcalcable.end(); ++i )
74  ( *i )->calc( mdoc.document() );
75  stopMove();
76  mdoc.setModified( true );
77 
78  // refresh the screen:
79  v->redrawScreen( std::vector<ObjectHolder*>() );
80  v->updateScrollBars();
81 
82  mdoc.doneMode( this );
83 }
84 
85 void MovingModeBase::mouseMoved( QMouseEvent* e, KigWidget* v )
86 {
87  v->updateCurPix();
88  Coordinate c = v->fromScreen( e->pos() );
89 
90  bool snaptogrid = e->modifiers() & Qt::ShiftModifier;
91  moveTo( c, snaptogrid );
92  for ( std::vector<ObjectCalcer*>::iterator i = mcalcable.begin();
93  i != mcalcable.end(); ++i )
94  ( *i )->calc( mdoc.document() );
95  KigPainter p( v->screenInfo(), &v->curPix, mdoc.document() );
96  // TODO: only draw the explicitly moving objects as selected, the
97  // other ones as deselected.. Needs some support from the
98  // subclasses..
99  p.drawObjects( mdrawable, true );
100  v->updateWidget( p.overlay() );
101  v->updateScrollBars();
102 }
103 
104 class MovingMode::Private
105 {
106 public:
107  // explicitly moving objects: these are the objects that the user
108  // requested to move...
109  std::vector<ObjectCalcer*> emo;
110  // point where we started moving..
111  Coordinate pwwsm;
112  MonitorDataObjects* mon;
113  // we keep a map from the emo objects to their reference location.
114  // This is the location that they claim to be at before moving
115  // starts, and we use it as a reference point to determine where
116  // they should move next..
117  std::map<const ObjectCalcer*, Coordinate> refmap;
118 };
119 
120 MovingMode::MovingMode( const std::vector<ObjectHolder*>& os, const Coordinate& c,
121  KigWidget& v, KigPart& doc )
122  : MovingModeBase( doc, v ), d( new Private )
123 {
124  d->pwwsm = c;
125  std::vector<ObjectCalcer*> emo;
126  std::set<ObjectCalcer*> objs;
127  for ( std::vector<ObjectHolder*>::const_iterator i = os.begin(); i != os.end(); ++i )
128  if ( (*i)->canMove() )
129  {
130  emo.push_back( ( *i )->calcer() );
131  d->refmap[( *i )->calcer()] = (*i)->moveReferencePoint();
132  objs.insert( ( *i )->calcer() );
133  std::vector<ObjectCalcer*> parents = ( *i )->calcer()->movableParents();
134  objs.insert( parents.begin(), parents.end() );
135  };
136 
137  emo = calcPath( emo );
138  for ( std::vector<ObjectCalcer*>::const_iterator i = emo.begin(); i != emo.end(); ++i )
139  if ( !isChild( *i, d->emo ) )
140  d->emo.push_back( *i );
141 
142  d->mon = new MonitorDataObjects( std::vector<ObjectCalcer*>( objs.begin(),objs.end() ) );
143 
144  std::set<ObjectCalcer*> tmp = objs;
145  for ( std::set<ObjectCalcer*>::const_iterator i = tmp.begin(); i != tmp.end(); ++i )
146  {
147  std::set<ObjectCalcer*> children = getAllChildren(*i);
148  objs.insert( children.begin(), children.end() );
149  }
150 
151  initScreen( calcPath( std::vector<ObjectCalcer*>( objs.begin(), objs.end() ) ) );
152 }
153 
154 void MovingMode::stopMove()
155 {
156  QString text = d->emo.size() == 1 ?
157  d->emo[0]->imp()->type()->moveAStatement() :
158  i18np( "Move %1 Object", "Move %1 Objects", d->emo.size() );
159  KigCommand* mc = new KigCommand( mdoc, text );
160  d->mon->finish( mc );
161  mdoc.history()->push( mc );
162 }
163 
164 void MovingMode::moveTo( const Coordinate& o, bool snaptogrid )
165 {
166  for( std::vector<ObjectCalcer*>::iterator i = d->emo.begin(); i != d->emo.end(); ++i )
167  {
168  assert( d->refmap.find( *i ) != d->refmap.end() );
169  Coordinate nc = d->refmap[*i] + ( o - d->pwwsm );
170  if ( snaptogrid ) nc = mdoc.document().coordinateSystem().snapToGrid( nc, mview );
171  (*i)->move( nc, mdoc.document() );
172  };
173 }
174 
175 PointRedefineMode::PointRedefineMode( ObjectHolder* p, KigPart& d, KigWidget& v )
176  : MovingModeBase( d, v ), mp( p ), mmon( 0 )
177 {
178  assert( dynamic_cast<ObjectTypeCalcer*>( p->calcer() ) );
179  moldtype = static_cast<ObjectTypeCalcer*>( p->calcer() )->type();
180  std::vector<ObjectCalcer*> oldparents = p->calcer()->parents();
181  std::copy( oldparents.begin(), oldparents.end(), std::back_inserter( moldparents ) );
182 
183  std::vector<ObjectCalcer*> parents = getAllParents( mp->calcer() );
184  mmon = new MonitorDataObjects( parents );
185  std::vector<ObjectCalcer*> moving = parents;
186  std::set<ObjectCalcer*> children = getAllChildren( mp->calcer() );
187  std::copy( children.begin(), children.end(), std::back_inserter( moving ) );
188  initScreen( moving );
189 }
190 
191 void PointRedefineMode::moveTo( const Coordinate& o, bool snaptogrid )
192 {
193  Coordinate realo =
194  snaptogrid ? mdoc.document().coordinateSystem().snapToGrid( o, mview ) : o;
195  ObjectFactory::instance()->redefinePoint(
196  static_cast<ObjectTypeCalcer*>( mp->calcer() ), realo, mdoc.document(), mview );
197 }
198 
199 PointRedefineMode::~PointRedefineMode()
200 {
201 }
202 
203 MovingModeBase::MovingModeBase( KigPart& doc, KigWidget& v )
204  : KigMode( doc ), mview( v )
205 {
206 }
207 
208 MovingModeBase::~MovingModeBase()
209 {
210 }
211 
212 void MovingModeBase::leftMouseMoved( QMouseEvent* e, KigWidget* v )
213 {
214  mouseMoved( e, v );
215 }
216 
217 MovingMode::~MovingMode()
218 {
219  delete d->mon;
220  delete d;
221 }
222 
223 void PointRedefineMode::stopMove()
224 {
225  assert( dynamic_cast<ObjectTypeCalcer*>( mp->calcer() ) );
226  ObjectTypeCalcer* mpcalc = static_cast<ObjectTypeCalcer*>( mp->calcer() );
227 
228  std::vector<ObjectCalcer*> newparents = mpcalc->parents();
229  std::vector<ObjectCalcer::shared_ptr> newparentsref(
230  newparents.begin(), newparents.end() );
231  const ObjectType* newtype = mpcalc->type();
232 
233  std::vector<ObjectCalcer*> oldparents;
234  for( std::vector<ObjectCalcer::shared_ptr>::iterator i = moldparents.begin();
235  i != moldparents.end(); ++i )
236  oldparents.push_back( i->get() );
237  mpcalc->setType( moldtype );
238  mpcalc->setParents( oldparents );
239  mp->calc( mdoc.document() );
240 
241  KigCommand* command = new KigCommand( mdoc, i18n( "Redefine Point" ) );
242  command->addTask(
243  new ChangeParentsAndTypeTask( mpcalc, newparents, newtype ) );
244  mmon->finish( command );
245  mdoc.history()->push( command );
246 }
ObjectFactory::instance
static const ObjectFactory * instance()
Definition: object_factory.cc:90
MovingModeBase::leftReleased
void leftReleased(QMouseEvent *, KigWidget *)
Definition: moving.cc:69
MovingModeBase::leftMouseMoved
void leftMouseMoved(QMouseEvent *, KigWidget *)
this means: mouse moved with left mouse button down (in case that wasn't clear...) ...
Definition: moving.cc:212
KigCommand
a KigCommand represents almost every action performed in Kig.
Definition: kig_commands.h:44
CoordinateSystem::snapToGrid
virtual Coordinate snapToGrid(const Coordinate &c, const KigWidget &w) const =0
ObjectTypeCalcer::setParents
void setParents(const std::vector< ObjectCalcer * > np)
Set the parents of this ObjectTypeCalcer to np.
Definition: object_calcer.cc:246
KigDocument::grid
bool grid() const
Definition: kig_document.cc:186
KigCommand::addTask
void addTask(KigCommandTask *)
Definition: kig_commands.cpp:74
KigPart::document
const KigDocument & document() const
Definition: kig_part.cpp:989
MovingMode::~MovingMode
~MovingMode()
Definition: moving.cc:217
ObjectTypeCalcer::setType
void setType(const ObjectType *t)
Definition: object_calcer.cc:255
KigPart::history
QUndoStack * history()
Definition: kig_part.cpp:633
MovingModeBase::stopMove
virtual void stopMove()=0
ObjectTypeCalcer
This is an ObjectCalcer that uses one of the various ObjectType's to calculate its ObjectImp...
Definition: object_calcer.h:183
KigMode::mdoc
KigPart & mdoc
Definition: mode.h:94
MovingModeBase::initScreen
void initScreen(const std::vector< ObjectCalcer * > &amo)
Subclasses should call this in their constructor, when they know which objects will be moving around...
Definition: moving.cc:39
KigMode
this is an ABC of a class containing the current "Mode" of the Kig document...
Definition: mode.h:37
Coordinate
The Coordinate class is the basic class representing a 2D location by its x and y components...
Definition: coordinate.h:33
ObjectHolder::calc
void calc(const KigDocument &)
Make our ObjectCalcer recalculate its ObjectImp.
Definition: object_holder.cc:73
KigWidget::updateScrollBars
void updateScrollBars()
Definition: kig_view.cpp:298
MovingModeBase::mview
KigWidget & mview
Definition: moving.h:43
MovingModeBase::~MovingModeBase
~MovingModeBase()
Definition: moving.cc:208
KigWidget::screenInfo
const ScreenInfo & screenInfo() const
the part of the document we're currently showing i.e.
Definition: kig_view.cpp:272
getAllParents
std::vector< ObjectCalcer * > getAllParents(const std::vector< ObjectCalcer * > &objs)
This function returns all objects above the given in the dependency graph.
Definition: calcpaths.cc:229
calcPath
std::vector< ObjectCalcer * > calcPath(const std::vector< ObjectCalcer * > &os)
This function sorts os such that they're in the right order for calc()-ing.
Definition: calcpaths.cc:48
MovingModeBase::mouseMoved
void mouseMoved(QMouseEvent *, KigWidget *)
mouse moved without any buttons down...
Definition: moving.cc:85
ObjectFactory::redefinePoint
void redefinePoint(ObjectTypeCalcer *point, const Coordinate &c, KigDocument &d, const KigWidget &w) const
set point to what sensiblePoint would have returned.
Definition: object_factory.cc:497
KigPainter
KigPainter is an extended QPainter.
Definition: kigpainter.h:51
ObjectHolder
An ObjectHolder represents an object as it is known to the document.
Definition: object_holder.h:40
KigWidget::fromScreen
const Coordinate fromScreen(const QPoint &p)
Definition: kig_view.cpp:282
MonitorDataObjects
this class monitors a set of DataObjects for changes and returns an appropriate ChangeObjectImpsComma...
Definition: kig_commands.h:153
KigWidget
This class is the real widget showing the document.
Definition: kig_view.h:50
KigPart::doneMode
void doneMode(KigMode *)
Definition: kig_part.cpp:749
KigDocument::objects
const std::vector< ObjectHolder * > objects() const
Get a hold of the objects of this KigDocument.
Definition: kig_document.cc:46
KigWidget::updateCurPix
void updateCurPix(const std::vector< QRect > &=std::vector< QRect >())
update curPix (bitBlt stillPix onto curPix..)
Definition: kig_view.cpp:187
KigPainter::drawGrid
void drawGrid(const CoordinateSystem &c, bool showGrid=true, bool showAxes=true)
Definition: kigpainter.cpp:507
isChild
bool isChild(const ObjectCalcer *o, ObjectCalcer *op)
Definition: calcpaths.cc:256
MonitorDataObjects::finish
void finish(KigCommand *comm)
add the generated KigCommandTasks to the command comm .
Definition: kig_commands.cpp:227
MovingModeBase::moveTo
virtual void moveTo(const Coordinate &o, bool snaptogrid)=0
moving.h
ObjectType
The ObjectType class is a thing that represents the "behaviour" for a certain type.
Definition: object_type.h:32
ObjectHolder::calcer
const ObjectCalcer * calcer() const
Definition: object_holder.cc:53
MovingMode::MovingMode
MovingMode(const std::vector< ObjectHolder * > &objects, const Coordinate &c, KigWidget &, KigPart &)
Definition: moving.cc:120
ObjectTypeCalcer::type
const ObjectType * type() const
Definition: object_calcer.cc:132
MovingModeBase::MovingModeBase
MovingModeBase(KigPart &doc, KigWidget &v)
Definition: moving.cc:203
KigWidget::curPix
QPixmap curPix
temporary, gets bitBlt'd (copied) onto the widget (to avoid flickering)
Definition: kig_view.h:84
KigWidget::clearStillPix
void clearStillPix()
The following are functions used by KigMode's to tell us to draw stuff...
Definition: kig_view.cpp:245
PointRedefineMode::~PointRedefineMode
~PointRedefineMode()
Definition: moving.cc:199
KigWidget::updateWidget
void updateWidget(const std::vector< QRect > &=std::vector< QRect >())
this means bitBlting curPix on the actual widget...
Definition: kig_view.cpp:115
ChangeParentsAndTypeTask
Definition: kig_commands.h:196
ObjectTypeCalcer::parents
std::vector< ObjectCalcer * > parents() const
Returns the parent ObjectCalcer's of this ObjectCalcer.
Definition: object_calcer.cc:105
PointRedefineMode::PointRedefineMode
PointRedefineMode(ObjectHolder *p, KigPart &d, KigWidget &v)
Definition: moving.cc:175
normal.h
KigPart
This is a "Part".
Definition: kig_part.h:68
KigDocument::axes
bool axes() const
Definition: kig_document.cc:206
ObjectCalcer::parents
virtual std::vector< ObjectCalcer * > parents() const =0
Returns the parent ObjectCalcer's of this ObjectCalcer.
KigDocument::coordinateSystem
const CoordinateSystem & coordinateSystem() const
Definition: kig_document.cc:40
getAllChildren
std::set< ObjectCalcer * > getAllChildren(ObjectCalcer *obj)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: calcpaths.cc:281
KigPainter::drawObjects
void drawObjects(const std::vector< ObjectHolder * > &os, bool sel)
Definition: kigpainter.cpp:518
KigWidget::redrawScreen
void redrawScreen(const std::vector< ObjectHolder * > &selection, bool paintOnWidget=true)
Definition: kig_view.cpp:252
KigWidget::stillPix
QPixmap stillPix
what do the still objects look like wondering if this is appropriate, maybe it should be part of Movi...
Definition: kig_view.h:79
MovingModeBase
"Template method" pattern ( see the Design patterns book ): This is a base class for two modes: norma...
Definition: moving.h:39
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:35:39 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kig

Skip menu "kig"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal