root/middleware-offline/trunk/_src/eidmw/eidgui/FreeSelectionDialog.cpp @ 271

Revision 271, 7.4 KB (checked in by vsilva, 6 years ago)

First official release

Line 
1/*********************************************************************
2**
3** Graphical Widget with draggable rectangle
4** for selection of an area within an A4-sized page
5**
6**********************************************************************/
7
8#include <QtGui>
9#include <QPainter>
10#include <QStyleOption>
11#include <QPen>
12#include <QCursor>
13#include <QGraphicsScene>
14#include <QGraphicsItem>
15#include <QDialog>
16
17#include "FreeSelectionDialog.h"
18
19
20double g_scene_height;
21double g_scene_width;
22
23class MyGraphicsScene : public QGraphicsScene
24{
25       
26public: 
27        MyGraphicsScene(QString background_string): QGraphicsScene()
28        {
29                background = background_string;
30        }
31        void itemMoved(QPointF newPos);
32        void setParent(FreeSelectionDialog *my_parent)
33        {
34                parent = my_parent;
35        }
36        //override to draw the text in background
37        void drawBackground (QPainter * painter, const QRectF & rect );
38       
39
40private:
41
42        FreeSelectionDialog *parent;
43        QString background;
44
45
46};
47
48void MyGraphicsScene::itemMoved(QPointF newPos)
49{
50        if (parent)
51                parent->setPosition(newPos);
52
53}
54
55void MyGraphicsScene::drawBackground(QPainter * painter, const QRectF & rect )
56{
57
58        QFont sansSerifFont("Arial", 26, QFont::Bold);
59        painter->setPen(Qt::lightGray);
60        painter->setFont(sansSerifFont);
61
62        painter->drawText(rect, Qt::AlignCenter, this->background);
63
64}
65
66
67class Rectangle : public QGraphicsItem
68{
69        public:
70                Rectangle(MyGraphicsScene *parent, double rect_h, double rect_w): my_scene(parent), m_rect_w(rect_w), m_rect_h(rect_h)
71        {
72                setFlag(QGraphicsItem::ItemIsMovable);
73                //setFlag(QGraphicsItem::ItemSendsGeometryChanges);
74                setFlag(QGraphicsItem::ItemIsSelectable);
75                setAcceptHoverEvents(true);
76
77        };
78
79                void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
80                void mouseReleaseEvent (QGraphicsSceneMouseEvent * event);
81                void mousePressEvent (QGraphicsSceneMouseEvent * event);
82                void hoverEnterEvent(QGraphicsSceneHoverEvent * event);
83                void hoverLeaveEvent(QGraphicsSceneHoverEvent * event);
84
85                QRectF boundingRect() const;
86
87        private:
88                MyGraphicsScene * my_scene;
89                double m_rect_h, m_rect_w;
90
91};
92const int margin = 10;
93
94void Rectangle::paint(QPainter *painter,
95                const QStyleOptionGraphicsItem *, QWidget *)
96{
97        painter->setPen(Qt::black);
98        painter->setBrush(Qt::lightGray);
99        painter->drawRect(0, 0, m_rect_w, m_rect_h);
100}
101
102QRectF Rectangle::boundingRect() const
103{
104        return QRectF(0, 0, m_rect_w+1, m_rect_h+1);
105}
106
107
108/* Change mouse cursor to indicate draggable rectangle
109 */
110void Rectangle::hoverEnterEvent(QGraphicsSceneHoverEvent * event)
111{
112        //setCursor(Qt::OpenHandCursor);
113        QApplication::setOverrideCursor(QCursor(Qt::OpenHandCursor));
114        update();
115}
116
117void Rectangle::hoverLeaveEvent(QGraphicsSceneHoverEvent * event)
118{
119        QApplication::setOverrideCursor(QCursor(Qt::ArrowCursor));
120        update();
121}
122
123void Rectangle::mousePressEvent (QGraphicsSceneMouseEvent * event)
124{
125
126        QApplication::setOverrideCursor(QCursor(Qt::ClosedHandCursor));
127
128}
129
130void Rectangle::mouseReleaseEvent(QGraphicsSceneMouseEvent * event)
131{
132
133        QPointF tmp = scenePos();
134       
135        /* Detect out of boundaries mouseEvent
136        and correct them to the nearest valid position **/
137        if (tmp.rx() < margin)
138                tmp.setX(margin);
139        if (tmp.ry() < margin)
140                tmp.setY(margin);
141        if (tmp.rx() >= g_scene_width+margin - m_rect_w) 
142                tmp.setX(g_scene_width+margin-m_rect_w);
143        if (tmp.ry() >= g_scene_height+margin - m_rect_h)
144                tmp.setY(g_scene_height+margin - m_rect_h);
145
146        QApplication::setOverrideCursor(QCursor(Qt::OpenHandCursor));
147        setPos(tmp);
148        //Send message to parent
149        my_scene->itemMoved(tmp);
150        QGraphicsItem::mouseReleaseEvent(event);
151}
152
153double FreeSelectionDialog::convertX()
154{
155        double full_width = m_landscape_mode ? 297.0576 : 209.916;
156        return this->rx/g_scene_width * full_width;
157}
158
159double FreeSelectionDialog::convertY()
160{
161        double full_height = m_landscape_mode ? 209.916 : 297.0576;
162        return this->ry/g_scene_height * full_height;
163}
164
165/* Coordinate conversion */
166void FreeSelectionDialog::setPosition(QPointF new_pos)
167{
168        this->rx = new_pos.rx()-margin;
169        this->ry = new_pos.ry()-margin;
170
171        ui.label_x->setText(tr("Horizontal position: %1")
172                .arg(QString::number(convertX(), 'f', 1)));
173       
174        ui.label_y->setText(tr("Vertical Position: %2")
175                .arg(QString::number(convertY(), 'f', 1)));
176
177}
178
179void FreeSelectionDialog::on_pushButton_reset_clicked()
180{
181
182        ui.label_x->setText(tr("Horizontal position: 0.0"));
183        ui.label_y->setText(tr("Vertical position: 0.0"));
184        resetRectanglePos();
185
186}
187
188void FreeSelectionDialog::on_pushButton_ok_clicked()
189{
190        this->done(QDialog::Accepted);
191
192}
193
194void FreeSelectionDialog::getValues(double *x, double *y)
195{
196       *x = convertX();
197       *y = convertY();
198}
199
200void FreeSelectionDialog::resetRectanglePos()
201{
202
203        QList<QGraphicsItem *> scene_items = my_scene->items();
204
205        QPointF pos;
206        pos.setY(0.0);
207        pos.setX(0.0);
208
209        int i = 0;
210        while (i!= scene_items.size())
211        {
212                //Find the rectangle object
213                if (scene_items.at(i)->type() == QGraphicsItem::UserType)
214                {
215                        scene_items.at(i)->setPos(pos);
216                        break;
217                }
218                i++;
219        }
220
221}
222
223void FreeSelectionDialog::drawBackgroundGrid(QGraphicsScene *scene)
224{
225
226    QPen dashed_pen(Qt::DashLine);
227
228    int v_lines = m_landscape_mode ? 6 : 3;
229    int h_lines = m_landscape_mode ? 3 : 6;
230       
231    //Draw the background dashed grid representing the 18 page sectors
232    for (int i=0; i<= h_lines; i++)
233                scene->addLine(margin, i*g_scene_height/h_lines +margin, g_scene_width+margin, i*g_scene_height/h_lines +margin, 
234                            dashed_pen);
235
236    for (int i=0; i<= v_lines; i++)
237                scene->addLine(i*g_scene_width/v_lines +margin, margin, i*g_scene_width/v_lines +margin, g_scene_height+ margin,
238                            dashed_pen);
239}
240
241FreeSelectionDialog::FreeSelectionDialog(QWidget *parent, bool landscape_mode): QDialog(parent)
242{
243        g_scene_height = 421;
244        g_scene_width = 297;
245    double rect_h = g_scene_height *0.106888361045; //Proportional to current signature height
246        double rect_w = g_scene_width / 3.0;
247    ui.setupUi(this);
248
249    MyGraphicsScene *scene = new MyGraphicsScene(tr("A4 Page"));
250    m_landscape_mode = landscape_mode;
251
252    if (landscape_mode)
253    {
254        double tmp = ui.widget->height();
255        g_scene_width = ui.widget->height()-20;
256        g_scene_height = ui.widget->width()-70;
257
258        // fprintf(stderr, "H: %d W: %d\n", ui.widget->height(), ui.widget->width());
259        ui.widget->setFixedSize(ui.widget->height(), ui.widget->width()-20);
260
261        rect_w = g_scene_width / 6.0;
262        rect_h = g_scene_height * 0.15;
263        //ui.widget->setMinimumWidth(tmp);
264    }
265
266    double real_scene_width = g_scene_width + 18;
267    double real_scene_height = g_scene_height + 24;
268    this->rx = 0;
269    this->ry = 0;
270
271    scene->setSceneRect(0, 0, real_scene_width, real_scene_height);
272    scene->setItemIndexMethod(QGraphicsScene::NoIndex);
273
274    // if (landscape_mode)
275    //  scene->addItem(new Rectangle(scene, rect_w, rect_h));
276    // else
277    scene->addItem(new Rectangle(scene, rect_h, rect_w));
278
279    drawBackgroundGrid(scene);
280
281    my_scene = scene;
282    QGraphicsView *view = new QGraphicsView(ui.widget);
283    view->setScene(scene);
284    view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
285   
286    scene->setParent(this);
287    // fprintf(stderr, "FreeSelectionDialog Width: %d, Height: %d\n", ui.widget->width(), ui.widget->height());
288
289    //Add room for margins, the textboxes and buttons below the widget
290    // this->setFixedSize(ui.widget->width() + 50, ui.widget->height() + 70);
291    int items = ui.horizontalLayout->count();
292        for (int i = 0; i!= items; i++)
293        {
294                ui.horizontalLayout->itemAt(i)->setAlignment(Qt::AlignRight);
295        }
296
297    this->layout()->setSizeConstraint(QLayout::SetFixedSize);
298}
299
Note: See TracBrowser for help on using the browser.