1 /***************************************************************************
2 * Copyright (C) 2003-2005, 2006 by Carsten Niehaus *
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. *
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. *
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"
24 #include "kalziumutils.h"
25 #include "kalziumdataobject.h"
26 #include "kalziumpainter.h"
27 #include "kalziumtabletype.h"
32 #include <QApplication>
36 #include <QMouseEvent>
40 #include <QSvgGenerator>
42 PeriodicTableView::PeriodicTableView( QWidget
*parent
)
48 setMouseTracking( true );
50 //eliminates flicker on redraw
51 setAttribute( Qt::WA_OpaquePaintEvent
, true );
54 table2
= new QPixmap();
56 //Start with a full draw
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() );
73 PeriodicTableView::~PeriodicTableView()
81 void PeriodicTableView::activateColorScheme( const int nr
)
83 m_painter
->setScheme( nr
);
85 emit
SchemeChanged( m_painter
->scheme() );
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
);
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();
122 void PeriodicTableView::paintEvent( QPaintEvent
* e
)
127 table
= new QPixmap( size() );
129 m_painter
->begin( table
);
130 m_painter
->drawAll();
138 if ( m_currentElement
> 0 )
140 m_painter
->begin( table2
);
141 m_painter
->drawElementSelector( m_currentElement
);
146 p
.drawPixmap( e
->rect().topLeft(), *table2
, e
->rect() );
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
);
182 drag
->setPixmap( pix
);
184 drag
->start( Qt::CopyAction
| Qt::MoveAction
);
186 m_startDrag
= QPoint();
190 if ( m_hoverTimer
.isActive() )
192 m_hoverTimer
.start( 200 );
196 void PeriodicTableView::mouseReleaseEvent( QMouseEvent
*mouse
)
198 int elem
= m_painter
->currentTableType()->elementAtCoords( mouse
->pos() );
201 emit
ElementClicked( elem
);
202 selectElement( elem
);
208 void PeriodicTableView::unSelect()
210 m_currentElement
= 0;
214 void PeriodicTableView::selectPoint( const QPoint
& point
)
216 m_painter
->currentTableType()->elementAtCoords( point
);
219 void PeriodicTableView::selectElement( int num
)
221 m_currentElement
= num
;
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() );
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
);
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() );
290 void PeriodicTableView::setTemperature( int temp
)
292 m_painter
->setTemperature( temp
);
297 void PeriodicTableView::setTime( int time
)
299 m_painter
->setTime( time
);
304 void PeriodicTableView::setFullDraw()
309 #include "periodictableview.moc"