1 /***************************************************************************
2  *                                                                         *
3  *   copyright : (C) 2008 The University of Toronto                        *
4  *                   netterfield@astro.utoronto.ca                         *
5  *                                                                         *
6  *   This program is free software; you can redistribute it and/or modify  *
7  *   it under the terms of the GNU General Public License as published by  *
8  *   the Free Software Foundation; either version 2 of the License, or     *
9  *   (at your option) any later version.                                   *
10  *                                                                         *
11  ***************************************************************************/
12 
13 #include "circleitemdialog.h"
14 
15 #include "circledimensionstab.h"
16 #include "circleitem.h"
17 #include "dialogpage.h"
18 #include "application.h"
19 #include "objectstore.h"
20 #include "mainwindow.h"
21 #include "document.h"
22 
23 namespace Kst {
24 
CircleItemDialog(CircleItem * item,QWidget * parent)25 CircleItemDialog::CircleItemDialog(CircleItem *item, QWidget *parent)
26   : ViewItemDialog(item, parent), _viewItem(item) {
27 
28   _circleDimensionsTab = new CircleDimensionsTab(item, this);
29 
30   DialogPage *circleDimensionsPage = new DialogPage(this);
31   circleDimensionsPage->setPageTitle(tr("Size/Position"));
32   circleDimensionsPage->addDialogTab(_circleDimensionsTab);
33   addDialogPage(circleDimensionsPage);
34   selectDialogPage(circleDimensionsPage);
35 
36   connect(_circleDimensionsTab, SIGNAL(apply()), this, SLOT(dimensionsChanged()));
37 
38   setupDimensions();
39 
40   connect(_circleDimensionsTab, SIGNAL(tabModified()), this, SLOT(modified()));
41 
42 }
43 
44 
setupDimensions()45 void CircleItemDialog::setupDimensions() {
46   _circleDimensionsTab->enableSingleEditOptions(true);
47   _circleDimensionsTab->setupDimensions();
48 }
49 
saveDimensions(ViewItem * item)50 void CircleItemDialog::saveDimensions(ViewItem *item) {
51   Q_ASSERT(item);
52 
53   if (editMode() == Multiple) { // saving dimensions not supported for edit multiple mode
54     return;
55   }
56 
57   if (_circleDimensionsTab->lockPosToData() && item->dataPosLockable()) {
58     QRectF dr;
59     dr.setWidth(2*_circleDimensionsTab->radius());
60     dr.setHeight(2*_circleDimensionsTab->radius());
61     dr.moveCenter(QPointF(_circleDimensionsTab->x(), _circleDimensionsTab->y()));
62 
63     item->setDataRelativeRect(dr);
64     bool lockPosToData = _circleDimensionsTab->lockPosToDataDirty() ? _circleDimensionsTab->lockPosToData() : item->lockPosToData();
65     item->setLockPosToData(lockPosToData);
66 
67     item->applyDataLockedDimensions();
68   } else {
69 
70     QRectF parentRect = item->parentRect();
71     qreal parentWidth = parentRect.width();
72     qreal parentHeight = parentRect.height();
73     qreal parentX = parentRect.x();
74     qreal parentY = parentRect.y();
75 
76     qreal relativeRadius = _circleDimensionsTab->radiusDirty() ? _circleDimensionsTab->radius() :item->relativeWidth()*0.5;
77     bool lockPosToData = _circleDimensionsTab->lockPosToDataDirty() ? _circleDimensionsTab->lockPosToData() : item->lockPosToData();
78 
79     qreal radius = relativeRadius * parentWidth;
80     item->setLockPosToData(lockPosToData);
81 
82     item->setPos(parentX + _circleDimensionsTab->x()*parentWidth, parentY + _circleDimensionsTab->y()*parentHeight);
83     item->setViewRect(-radius, -radius, radius*2.0, radius*2.0);
84 
85     QTransform transform;
86 
87     item->setTransform(transform);
88     item->updateRelativeSize();
89   }
90 }
91 }
92