1 // SPDX-FileCopyrightText: 2002 Dominique Devriese <devriese@kde.org>
2 
3 // SPDX-License-Identifier: GPL-2.0-or-later
4 
5 #include "base_mode.h"
6 
7 #include "popup/popup.h"
8 #include "popup/objectchooserpopup.h"
9 
10 #include "../kig/kig_view.h"
11 #include "../kig/kig_part.h"
12 #include "../kig/kig_document.h"
13 
14 #include <QEvent>
15 #include <KCursor>
16 #include <QMouseEvent>
17 
BaseMode(KigPart & d)18 BaseMode::BaseMode( KigPart& d )
19   : KigMode( d )
20 {
21 }
22 
~BaseMode()23 BaseMode::~BaseMode()
24 {
25 }
26 
leftClicked(QMouseEvent * e,KigWidget * v)27 void BaseMode::leftClicked( QMouseEvent* e, KigWidget* v )
28 {
29   // touch screens don't send a mouseMoved event before a click event,
30   // apparently, so we simulate it.
31   mouseMoved( e, v );
32 
33   // get rid of text still showing...
34   v->updateCurPix();
35   v->updateWidget();
36 
37   mplc = e->pos();
38   moco = mdoc.document().whatAmIOn( v->fromScreen( mplc ), *v );
39 
40   if( moco.empty() )
41   {
42     // clicked on an empty spot --> we show the rectangle for
43     // selecting stuff...
44     dragRect( mplc, *v );
45   }
46   else
47   {
48     // the user clicked on some object.. --> this could either mean
49     // that he/she wants to select the object or that he wants to
50     // start moving it.  We assume nothing here, we wait till he
51     // either moves some 4 pixels, or till he releases his mouse
52     // button in leftReleased() or mouseMoved()...
53   };
54 }
55 
leftMouseMoved(QMouseEvent * e,KigWidget * w)56 void BaseMode::leftMouseMoved( QMouseEvent* e, KigWidget* w )
57 {
58   if( !moco.empty() && ( mplc - e->pos() ).manhattanLength() > 3 )
59     dragObject( moco, mplc, *w,
60                 ( e->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier ) ) != 0
61       );
62 }
63 
leftReleased(QMouseEvent * e,KigWidget * v)64 void BaseMode::leftReleased( QMouseEvent* e, KigWidget* v )
65 {
66   if( (mplc - e->pos()).manhattanLength() > 4 ) return;
67 
68   ObjectHolder* o = 0;
69   bool keyCtrl = ( e->modifiers() & Qt::ControlModifier ) != 0;
70   bool keyShift = ( e->modifiers() & Qt::ShiftModifier ) != 0;
71   if ( ! moco.empty() )
72   {
73     if ( keyShift )
74     {
75       int id = ObjectChooserPopup::getObjectFromList( e->pos(), v, moco );
76       if ( id >= 0 )
77         o = moco[id];
78     }
79     else
80       o = moco.front();
81   }
82   leftClickedObject( o, e->pos(), *v, keyCtrl );
83 }
84 
midClicked(QMouseEvent * e,KigWidget * v)85 void BaseMode::midClicked( QMouseEvent* e, KigWidget* v )
86 {
87   // get rid of text still showing...
88   v->updateCurPix();
89   v->updateWidget();
90 
91   mplc = e->pos();
92   moco = mdoc.document().whatAmIOn( v->fromScreen( e->pos() ), *v );
93 }
94 
midReleased(QMouseEvent * e,KigWidget * v)95 void BaseMode::midReleased( QMouseEvent* e, KigWidget* v )
96 {
97   if( (e->pos() - mplc).manhattanLength() > 4 ) return;
98 
99   midClicked( mplc, *v );
100 }
101 
rightClicked(QMouseEvent * e,KigWidget * w)102 void BaseMode::rightClicked( QMouseEvent* e, KigWidget* w )
103 {
104   // get rid of text still showing...
105   w->updateCurPix();
106   w->updateWidget();
107   // set a normal cursor...
108   w->setCursor( Qt::ArrowCursor );
109 
110   mplc = e->pos();
111   moco = mdoc.document().whatAmIOn( w->fromScreen( mplc ), *w );
112 
113   rightClicked( moco, mplc, *w );
114 }
115 
mouseMoved(QMouseEvent * e,KigWidget * w)116 void BaseMode::mouseMoved( QMouseEvent* e, KigWidget* w )
117 {
118   std::vector<ObjectHolder*> os = mdoc.document().whatAmIOn( w->fromScreen( e->pos() ), *w );
119   mouseMoved( os, e->pos(), *w, e->modifiers() & Qt::ShiftModifier );
120 }
121 
dragRect(const QPoint &,KigWidget &)122 void BaseMode::dragRect( const QPoint&, KigWidget& )
123 {
124 }
125 
leftClickedObject(ObjectHolder *,const QPoint &,KigWidget &,bool)126 void BaseMode::leftClickedObject( ObjectHolder*, const QPoint&,
127                                   KigWidget&, bool )
128 {
129 }
130 
dragObject(const std::vector<ObjectHolder * > &,const QPoint &,KigWidget &,bool)131 void BaseMode::dragObject( const std::vector<ObjectHolder*>&, const QPoint&,
132                            KigWidget&, bool )
133 {
134 }
135 
enableActions()136 void BaseMode::enableActions()
137 {
138   KigMode::enableActions();
139 }
140 
oco()141 std::vector<ObjectHolder*> BaseMode::oco()
142 {
143   return moco;
144 }
145 
pointLocation()146 QPoint BaseMode::pointLocation()
147 {
148   return mplc;
149 }
150