~ubuntu-branches/ubuntu/karmic/kst/karmic

« back to all changes in this revision

Viewing changes to kst/kst/kstviewwidget.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Daniel T Chen
  • Date: 2006-06-30 19:11:30 UTC
  • mfrom: (1.2.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20060630191130-acumuar75bz4puty
Tags: 1.2.1-1ubuntu1
Merge from debian unstable.

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
#include <kmultipledrag.h>
22
22
 
23
23
#include "kst.h"
24
 
#include "kstplotimagedrag.h"
 
24
#include "kstviewobjectimagedrag.h"
25
25
#include "ksttimers.h"
26
26
#include "kstviewwidget.h"
27
27
#include "kstviewwindow.h"
28
28
#include "plotmimesource.h"
29
29
 
30
30
KstViewWidget::KstViewWidget(KstTopLevelViewPtr view, QWidget *parent, const char *name, WFlags w)
31
 
: QWidget(parent, name, WStyle_Customize | w), _view(view), _menu(0L) {
32
 
  _nextUpdate = P_PAINT;
 
31
: QWidget(parent, name, WStyle_Customize | WRepaintNoErase | w), _view(view) {
33
32
  setDragEnabled(true);
34
33
  setDropEnabled(true);
35
34
  setMouseTracking(true);
37
36
  setBackgroundMode(Qt::NoBackground);
38
37
  setMinimumSize(40, 25);
39
38
  _vo_datamode = 0L;
 
39
  _lastViewMode = KstTopLevelView::LayoutMode;
40
40
}
41
41
 
42
42
 
46
46
 
47
47
QDragObject *KstViewWidget::dragObject() {
48
48
  KMultipleDrag *drag = new KMultipleDrag(this);
49
 
  QString window;
 
49
#if 1
50
50
  QStringList plots;
51
51
  KstViewObjectList vol;
52
 
  
53
 
#if 1
54
 
  window = static_cast<KstViewWindow*>(parent())->caption();
55
 
  
 
52
  QString window = static_cast<KstViewWindow*>(parent())->caption();
 
53
 
56
54
  if (_view->selectionList().isEmpty()) {
57
55
    if (_view->pressTarget()) {
58
56
      plots.append(_view->pressTarget()->tagName());
71
69
  }
72
70
 
73
71
  drag->addDragObject(new PlotMimeSource(window, plots, 0L));
74
 
  KstPlotImageDrag *imd = new KstPlotImageDrag(0L);
75
 
  imd->setPlots(vol);
 
72
  KstViewObjectImageDrag *imd = new KstViewObjectImageDrag(this);
 
73
  imd->setObjects(vol);
76
74
  drag->addDragObject(imd);
77
75
#else
78
76
  drag->addDragObject(new KstPlotDrag(...));
94
92
}
95
93
 
96
94
 
 
95
void KstViewWidget::focusOutEvent(QFocusEvent *e) {
 
96
  if (_view->viewMode() == KstTopLevelView::LayoutMode && _lastViewMode != KstTopLevelView::LayoutMode) {
 
97
    _view->setViewMode(_lastViewMode);
 
98
    _lastViewMode = KstTopLevelView::LayoutMode;
 
99
  }
 
100
  QWidget::focusOutEvent(e);
 
101
}
 
102
 
 
103
 
97
104
void KstViewWidget::leaveEvent(QEvent *e) {
98
 
  //kdDebug() << "Leave event" << endl;
 
105
  //kstdDebug() << "Leave event" << endl;
99
106
  QWidget::leaveEvent(e);
100
107
  if (_view->viewMode() != KstTopLevelView::DisplayMode) {
101
108
    if (_menu) {
102
109
      return;
103
110
    }
104
111
    if (!_view->tracking()) {
105
 
      //kdDebug() << "Not tracking" << endl;
 
112
      //kstdDebug() << "Not tracking" << endl;
106
113
      _view->clearFocus();
107
114
    } else {
108
 
      //kdDebug() << "Tracking" << endl;
 
115
      //kstdDebug() << "Tracking" << endl;
109
116
      if (_view->trackingIsMove() && _dragEnabled) {
110
117
        QDragObject *d = dragObject();
111
118
        if (d) {
112
119
          // First cancel any operations
113
120
          _view->cancelMouseOperations();
114
 
          _view->paint(P_PAINT);
 
121
          _view->paint(KstPainter::P_PAINT);
115
122
          d->drag();
116
123
        }
117
124
      }
120
127
}
121
128
 
122
129
 
123
 
// FIXME: this is probably wrong in that we probably want the inner-most child
124
 
//        that handles mouse events on this position, not the outer-most.
125
 
//        However, this is not a problem right now since we only have working
126
 
//        objects at one level deep.
127
130
KstViewObjectPtr KstViewWidget::findChildFor(const QPoint& pos) {
128
131
  KstViewObjectPtr rc, search = _view.data();
129
132
 
130
 
  while (!rc.data()) {
131
 
    rc = search->findChild(pos);
132
 
    if (rc) {
133
 
      if (!rc->mouseHandler()) {
134
 
        search = rc;
135
 
        rc = 0L;
136
 
      }
137
 
    } else {
138
 
      break;
 
133
  while (search) {
 
134
    search = search->findChild(pos);
 
135
    if (search && search->mouseHandler()) {
 
136
      rc = search;
139
137
    }
140
138
  }
141
139
  return rc;
168
166
    } else {
169
167
      setCursor(QCursor(Qt::ArrowCursor));
170
168
    }
171
 
  } else { // layout mode
 
169
  } else {
172
170
    if ((e->state() & Qt::MouseButtonMask) == 0) {
 
171
      switch (_view->viewMode()) {
 
172
        case KstTopLevelView::LabelMode:
 
173
          setCursor(QCursor(Qt::IbeamCursor));
 
174
          break;
 
175
        case KstTopLevelView::CreateMode:
 
176
          setCursor(QCursor(Qt::ArrowCursor));
 
177
          break;
 
178
        default:
 
179
          break;
 
180
      }
173
181
      _view->updateFocus(e->pos());
174
182
      e->accept();
175
183
    } else if (e->state() & Qt::LeftButton) {
 
184
      //setCursor(QCursor(Qt::ArrowCursor));
176
185
      _view->pressMove(e->pos(), e->state() & Qt::ShiftButton);
177
186
      e->accept();
178
187
    }
183
192
void KstViewWidget::mousePressEvent(QMouseEvent *e) {
184
193
  //kstdDebug() << "Press event. button=" << e->button() << " state=" << e->state() << endl;
185
194
 
 
195
  if (_menu) {
 
196
    QWidget::mousePressEvent(e);
 
197
    return;
 
198
  }
 
199
 
186
200
  if (_view->viewMode() == KstTopLevelView::DisplayMode) {
187
201
    KstViewObjectPtr vo;
188
202
    if (_view->mouseGrabbed()) {
197
211
    return;
198
212
  }
199
213
 
200
 
  // Layout mode
 
214
  // Layout/graphics mode
201
215
  if (e->button() & Qt::LeftButton) {
 
216
    setCursor(QCursor(Qt::ArrowCursor));
 
217
    //kstdDebug() << "    -> left button" << endl;
202
218
    if (_view->handlePress(e->pos(), e->state() & Qt::ShiftButton)) {
203
 
      //kdDebug() << "   -> Accepting" << endl;
 
219
      //kstdDebug() << "   -> Accepting" << endl;
204
220
      e->accept();
205
221
      return;
 
222
    } else if (_view->tracking()) {
 
223
      //kstdDebug() << "   -> Swallowing" << endl;
 
224
      e->accept(); // swallow
 
225
      return;
206
226
    }
207
227
  }
208
 
  if (e->state() & Qt::LeftButton && _view->tracking()) {
209
 
    //kdDebug() << "   -> Swallowing" << endl;
210
 
    e->accept(); // swallow
211
 
    return;
212
 
  }
213
 
  //kdDebug() << "   -> Passing up" << endl;
 
228
  //kstdDebug() << "   -> Passing up" << endl;
214
229
  QWidget::mousePressEvent(e);
215
230
}
216
231
 
217
232
 
218
233
void KstViewWidget::mouseDoubleClickEvent(QMouseEvent *e) {
219
 
  //kdDebug() << "DoubleClick event. button=" << e->button() << " state=" << e->state() << endl;
220
 
 
 
234
  //kstdDebug() << "DoubleClick event. button=" << e->button() << " state=" << e->state() << endl;
221
235
  if (_view->viewMode() == KstTopLevelView::DisplayMode) {
222
236
    KstViewObjectPtr vo;
223
237
    if (_view->mouseGrabbed()) {
232
246
    return;
233
247
  }
234
248
 
 
249
  // layout/graphics mode
 
250
  if (e->button() & Qt::LeftButton) {
 
251
    // let the toplevel view handle it
 
252
    if (_view->handleDoubleClick(e->pos(), e->state() & Qt::ShiftButton)) {
 
253
      e->accept();
 
254
      return;
 
255
    }
 
256
  }
 
257
 
235
258
  //kstdDebug() << "   -> Passing up" << endl;
236
259
  QWidget::mouseDoubleClickEvent(e);
237
260
}
238
261
 
239
 
 
 
262
 
240
263
void KstViewWidget::wheelEvent(QWheelEvent *e) {
241
264
  if (_view->viewMode() == KstTopLevelView::DisplayMode) {
242
265
    KstViewObjectPtr vo;
296
319
  if (_view->mouseGrabber()) {
297
320
    _view->releaseMouse(_view->mouseGrabber());
298
321
  }
 
322
  assert(!_menu);
299
323
  _menu = new KPopupMenu(this);
300
324
  //kstdDebug() << "Querying for the popup" << endl;
301
325
  bool rc = _view->popupMenu(_menu, e->pos());
312
336
  } else {
313
337
    delete _menu;
314
338
  }
315
 
  _menu = 0L;
316
339
  e->accept();
317
340
}
318
341
 
319
342
 
 
343
void KstViewWidget::paint(const QRegion& region) {
 
344
  QPaintEvent e(region);
 
345
  paintEvent(&e);
 
346
}
 
347
 
 
348
 
320
349
void KstViewWidget::paint() {
321
350
  paintEvent(0L);
322
351
}
329
358
  t.start();
330
359
#endif
331
360
  if (e) {  // Resize/expose/etc triggered by X11
332
 
    _view->paint(_nextUpdate);
333
 
    _nextUpdate = P_PAINT;
 
361
    QRegion r = e->region();
 
362
    if (r.isEmpty()) {
 
363
      //kstdDebug() << "Paint event with NO region" << endl;
 
364
      _view->paint(KstPainter::P_PAINT);
 
365
    } else {
 
366
      //kstdDebug() << "Paint event with region " << e->region() << endl;
 
367
      _view->paint(KstPainter::P_PAINT, e->region());
 
368
    }
334
369
#ifdef BENCHMARK
335
370
    int x = t.elapsed();
336
371
    kstdDebug() << "Paint event: X11 triggered - " << x << "ms" << endl;
337
372
#endif
338
373
  } else { // explicitly forced paint in the code
339
 
    _view->paint(P_ZOOM);
 
374
    _view->paint(KstPainter::P_ZOOM);
340
375
#ifdef BENCHMARK
341
376
    int x = t.elapsed();
342
377
    kstdDebug() << "Paint event: Forced (zoom) - " << x << "ms" << endl;
392
427
    // FIXME: support both copy and move
393
428
    KstApp::inst()->paste(e, viewObject());
394
429
    e->acceptAction(true);
395
 
    _view->paint(P_PAINT);
 
430
    _view->paint(KstPainter::P_PAINT);
396
431
  } else if (_view->viewMode() != KstTopLevelView::LayoutMode) {
397
432
    KstViewObjectPtr vo = findChildFor(e->pos());
398
433
    if (vo) {
428
463
    if (e->key() == Qt::Key_Escape) {
429
464
      _view->cancelMouseOperations();
430
465
      return;
431
 
    } else if (e->key() == Qt::Key_A && s & Qt::ControlButton) {
 
466
    } else if (e->key() == Qt::Key_A && (s & Qt::ControlButton) && _view->viewMode() == KstTopLevelView::LayoutMode) {
432
467
      if (s & Qt::ShiftButton) {
433
468
        _view->unselectAll();
434
469
      } else {
436
471
      }
437
472
      paint();
438
473
      return;
 
474
    } else if (e->key() == Qt::Key_Delete) {
 
475
      _view->deleteSelectedObjects();
 
476
      return;
 
477
    } else if (e->key() == Qt::Key_Control && (_view->viewMode() != KstTopLevelView::LayoutMode)) {
 
478
      _lastViewMode = _view->viewMode();
 
479
      _view->setViewMode(KstTopLevelView::LayoutMode);
 
480
      return;
439
481
    }
440
482
  }
441
483
 
456
498
      vo->keyReleaseEvent(this, e);
457
499
    }
458
500
    return;
 
501
  } else if (e->key() == Qt::Key_Control && _view->viewMode() == KstTopLevelView::LayoutMode) {
 
502
    _view->setViewMode(_lastViewMode);
 
503
    _lastViewMode = KstTopLevelView::LayoutMode;
459
504
  }
460
505
 
461
506
  QWidget::keyReleaseEvent(e);
478
523
}
479
524
 
480
525
 
481
 
void KstViewWidget::nextUpdateDo(KstPaintType updateType) {
482
 
  _nextUpdate = updateType;
483
 
}
484
 
 
485
526
#include "kstviewwidget.moc"
486
527
// vim: ts=2 sw=2 et