Test change - can I push OK?
[kdeedu-porting.git] / kalzium / src / periodictableview.cpp
blobf697e1dc524014901cc5e8b81b59e2b0c2ad92cc
1 /***************************************************************************
2 * Copyright (C) 2003-2005, 2006 by Carsten Niehaus *
3 * cniehaus@kde.org *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
19 ***************************************************************************/
21 #include "periodictableview.h"
22 #include "prefs.h"
23 #include "element.h"
24 #include "kalziumutils.h"
25 #include "kalziumdataobject.h"
26 #include "kalziumpainter.h"
27 #include "kalziumtabletype.h"
29 #include <klocale.h>
30 #include <kdebug.h>
32 #include <QApplication>
33 #include <QPixmap>
34 #include <QPoint>
35 #include <QCursor>
36 #include <QMouseEvent>
37 #include <QPainter>
38 #include <QRect>
39 #include <QDrag>
40 #include <QSvgGenerator>
42 PeriodicTableView::PeriodicTableView( QWidget *parent )
43 : QWidget( parent )
45 // No selection
46 m_currentElement = 0;
48 setMouseTracking( true );
50 //eliminates flicker on redraw
51 setAttribute( Qt::WA_OpaquePaintEvent, true );
53 table = 0;
54 table2 = new QPixmap();
56 //Start with a full draw
57 doFullDraw = true;
59 m_startDrag = QPoint();
61 m_hoverTimer.setSingleShot( true );
62 connect( &m_hoverTimer, SIGNAL( timeout() ), this, SLOT( slotMouseover() ) );
63 m_prevHoverElement = 0;
65 KalziumTableType *tt = KalziumTableTypeFactory::instance()->build( "Short" );
66 m_painter = new KalziumPainter( tt );
68 setMinimumSize( tt->size() );
70 update();
73 PeriodicTableView::~PeriodicTableView()
75 delete table;
76 delete table2;
78 delete m_painter;
81 void PeriodicTableView::activateColorScheme( const int nr )
83 m_painter->setScheme( nr );
85 emit SchemeChanged( m_painter->scheme() );
87 setFullDraw();
88 update();
91 KalziumSchemeType* PeriodicTableView::scheme() const
93 return m_painter->scheme();
96 void PeriodicTableView::setMode( KalziumPainter::MODE m )
98 m_painter->setMode( m );
100 emit ModeChanged( m );
102 setFullDraw();
103 update();
106 KalziumPainter::MODE PeriodicTableView::mode() const
108 return m_painter->mode();
111 void PeriodicTableView::generateSvg(const QString& filename)
113 QSvgGenerator *svgGen = new QSvgGenerator();
115 svgGen->setFileName( filename );
117 m_painter->begin( svgGen );
118 m_painter->drawAll();
119 m_painter->end();
122 void PeriodicTableView::paintEvent( QPaintEvent * e )
124 if ( doFullDraw )
126 delete table;
127 table = new QPixmap( size() );
129 m_painter->begin( table );
130 m_painter->drawAll();
131 m_painter->end();
133 doFullDraw = false;
136 *table2 = *table;
138 if ( m_currentElement > 0 )
140 m_painter->begin( table2 );
141 m_painter->drawElementSelector( m_currentElement );
142 m_painter->end();
145 QPainter p( this );
146 p.drawPixmap( e->rect().topLeft(), *table2, e->rect() );
147 p.end();
150 void PeriodicTableView::mousePressEvent( QMouseEvent * event )
152 int elementnumber = m_painter->currentTableType()->elementAtCoords( event->pos() );
154 if ( ( elementnumber > 0 ) && ( event->button() == Qt::LeftButton ) )
156 m_startDrag = event->pos();
160 void PeriodicTableView::mouseMoveEvent( QMouseEvent *event )
162 int num = m_painter->currentTableType()->elementAtCoords( m_startDrag );
164 if ( ( QApplication::mouseButtons() & Qt::LeftButton ) && ( ( event->pos() - m_startDrag ).manhattanLength() > QApplication::startDragDistance() ) && ( num > 0 ) )
166 Element* pointedElement = KalziumDataObject::instance()->element( num );
168 QDrag *drag = new QDrag( this );
169 QMimeData *mimeData = new QMimeData;
171 mimeData->setText( pointedElement->dataAsString( ChemicalDataObject::name ) );
172 drag->setMimeData( mimeData );
174 QRect elrect = m_painter->currentTableType()->elementRect( num );
175 elrect.translate( -elrect.topLeft() );
176 QPixmap pix( elrect.size() + QSize( 1, 1 ) );
177 pix.fill( palette().color( QPalette::Window ) );
178 m_painter->begin( &pix );
179 m_painter->drawElement( num, elrect );
180 m_painter->end();
182 drag->setPixmap( pix );
184 drag->start( Qt::CopyAction | Qt::MoveAction );
186 m_startDrag = QPoint();
188 else
190 if ( m_hoverTimer.isActive() )
191 m_hoverTimer.stop();
192 m_hoverTimer.start( 200 );
196 void PeriodicTableView::mouseReleaseEvent( QMouseEvent *mouse )
198 int elem = m_painter->currentTableType()->elementAtCoords( mouse->pos() );
199 if ( elem > 0 )
201 emit ElementClicked( elem );
202 selectElement( elem );
204 else
205 unSelect();
208 void PeriodicTableView::unSelect()
210 m_currentElement = 0;
211 update();
214 void PeriodicTableView::selectPoint( const QPoint& point )
216 m_painter->currentTableType()->elementAtCoords( point );
219 void PeriodicTableView::selectElement( int num )
221 m_currentElement = num;
222 update();
225 void PeriodicTableView::setValueLimit( int value, ChemicalDataObject::BlueObelisk type )
227 //remove the value of the type if possible
228 m_sliderValueList.remove( type );
230 //now add the new type/value
231 m_sliderValueList.insert( type, value );
234 int PeriodicTableView::sliderValue( ChemicalDataObject::BlueObelisk type )
236 return m_sliderValueList.contains( type ) ? m_sliderValueList.value( type ) : 0;
239 QBrush PeriodicTableView::brushForElement( int element ) const
241 return m_painter->brushForElement( element );
244 KalziumTableType* PeriodicTableView::tableType() const
246 return m_painter->currentTableType();
249 void PeriodicTableView::slotChangeTable(int table)
251 KalziumTableType *tt = KalziumTableTypeFactory::instance()->build( table );
252 m_painter->setTableType(tt);
254 emit TableTypeChanged( tt );
256 setMinimumSize( tt->size() );
257 setFullDraw();
258 update();
261 void PeriodicTableView::slotMouseover()
263 int num = m_painter->currentTableType()->elementAtCoords( mapFromGlobal( QCursor::pos() ) );
264 if ( ( num > 0 ) && ( num != m_prevHoverElement ) )
265 emit MouseOver( num );
266 m_prevHoverElement = num;
269 void PeriodicTableView::setNumeration( int which )
271 m_painter->setNumeration( which );
272 setFullDraw();
273 update();
276 KalziumGradientType* PeriodicTableView::gradient() const
278 return m_painter->gradient();
281 void PeriodicTableView::setGradient( int which )
283 m_painter->setGradient( which );
285 emit GradientTypeChanged( m_painter->gradient() );
286 setFullDraw();
287 update();
290 void PeriodicTableView::setTemperature( int temp )
292 m_painter->setTemperature( temp );
293 setFullDraw();
294 update();
297 void PeriodicTableView::setTime( int time )
299 m_painter->setTime( time );
300 setFullDraw();
301 update();
304 void PeriodicTableView::setFullDraw()
306 doFullDraw = true;
309 #include "periodictableview.moc"