File indexing completed on 2024-05-05 03:50:44
0001 0002 // SPDX-License-Identifier: LGPL-2.1-or-later 0003 // 0004 // SPDX-FileCopyrightText: 2008 Patrick Spendrin <ps_ml@gmx.de> 0005 // 0006 0007 #include "FileViewFloatItem.h" 0008 0009 #include <QRect> 0010 #include <QPoint> 0011 #include <QApplication> 0012 #include <QFileDialog> 0013 #include <QListView> 0014 #include <QMenu> 0015 #include <QSlider> 0016 #include <QMouseEvent> 0017 0018 #include "MarbleDebug.h" 0019 #include "FileViewModel.h" 0020 #include "GeoPainter.h" 0021 #include "ViewportParams.h" 0022 #include "MarbleWidget.h" 0023 0024 0025 using namespace Marble; 0026 0027 FileViewFloatItem::FileViewFloatItem(const QPointF &point, 0028 const QSizeF &size) : 0029 AbstractFloatItem(point, size), m_marbleWidget(0), 0030 m_fileView(0), m_fileViewParent(0), 0031 m_repaintScheduled(true), m_persIndex(0) 0032 { 0033 // Plugin is not enabled by default 0034 setEnabled(false); 0035 } 0036 0037 FileViewFloatItem::~FileViewFloatItem() 0038 { 0039 delete m_fileViewParent; 0040 } 0041 0042 QStringList FileViewFloatItem::backendTypes() const 0043 { 0044 return QStringList(QStringLiteral("fileview")); 0045 } 0046 0047 QString FileViewFloatItem::name() const 0048 { 0049 return tr("File View"); 0050 } 0051 0052 QString FileViewFloatItem::guiString() const 0053 { 0054 return tr("&File View"); 0055 } 0056 0057 QString FileViewFloatItem::nameId() const 0058 { 0059 return QStringLiteral("fileview"); 0060 } 0061 0062 QString FileViewFloatItem::description() const 0063 { 0064 return tr("A list of currently opened files"); 0065 } 0066 0067 QIcon FileViewFloatItem::icon() const 0068 { 0069 return QIcon(); 0070 } 0071 0072 void FileViewFloatItem::initialize() 0073 { 0074 m_fileViewParent = new QWidget(0); 0075 m_fileViewParent->setFixedSize(size().toSize() - QSize(2 * padding(), 2 0076 * padding())); 0077 m_fileView = new QListView(m_fileViewParent); 0078 m_fileView->resize(100, 240); 0079 m_fileView->setResizeMode(QListView::Adjust); 0080 m_fileView->setContextMenuPolicy( Qt::CustomContextMenu ); 0081 connect(m_fileView, SIGNAL(customContextMenuRequested(QPoint)), 0082 this, SLOT(contextMenu(QPoint))); 0083 } 0084 0085 bool FileViewFloatItem::isInitialized() const 0086 { 0087 return m_fileViewParent != 0; 0088 } 0089 0090 QPainterPath FileViewFloatItem::backgroundShape() const 0091 { 0092 QPainterPath path; 0093 QSizeF paintedSize = paintedRect().size(); 0094 path.addRoundedRect( QRectF( 0.0, 0.0, paintedSize.width() - 1, paintedSize.height() - 1 ), 6, 6 ); 0095 return path; 0096 } 0097 0098 void FileViewFloatItem::changeViewport( ViewportParams *viewport ) 0099 { 0100 Q_UNUSED( viewport ); 0101 update(); 0102 } 0103 0104 void FileViewFloatItem::paintContent( GeoPainter *painter, ViewportParams *viewport, 0105 const QString& renderPos, GeoSceneLayer * layer) 0106 { 0107 Q_UNUSED( viewport ); 0108 Q_UNUSED( layer ); 0109 Q_UNUSED( renderPos ); 0110 0111 if( !m_fileView->model() ) { 0112 m_fileView->setModel(marbleModel()->fileViewModel()); 0113 } 0114 painter->end(); 0115 // Paint widget without a background 0116 m_fileViewParent->render( painter->device(), 0117 QPoint( padding(), padding() ), QRegion(),QWidget::RenderFlags(QWidget::DrawChildren)); 0118 0119 painter->begin( painter->device() ); 0120 m_fileView->update(); 0121 } 0122 0123 bool FileViewFloatItem::eventFilter(QObject *object, QEvent *e) 0124 { 0125 if ( !enabled() || !visible() ) { 0126 return false; 0127 } 0128 0129 MarbleWidget *widget = dynamic_cast<MarbleWidget*> (object); 0130 if ( !widget ) { 0131 return AbstractFloatItem::eventFilter(object, e); 0132 } 0133 0134 if ( m_marbleWidget != widget ) { 0135 // Delayed initialization 0136 m_marbleWidget = widget; 0137 } 0138 0139 Q_ASSERT( m_marbleWidget ); 0140 // Mouse events are forwarded to the underlying widget 0141 QMouseEvent *event = static_cast<QMouseEvent*> (e); 0142 QRectF floatItemRect = QRectF( positivePosition(), size() ); 0143 0144 QPoint shiftedPos = event->pos() - floatItemRect.topLeft().toPoint() 0145 - QPoint( padding(), padding() ); 0146 if( e->type() == QEvent::MouseMove ) { 0147 m_itemPosition = event->globalPos(); 0148 } 0149 0150 if( floatItemRect.contains( event->pos() ) ) { 0151 QWidget *child = m_fileViewParent->childAt( shiftedPos ); 0152 0153 if( child ) { 0154 m_marbleWidget->setCursor( Qt::ArrowCursor ); 0155 0156 // there needs to be some extra handling for the scrollbars 0157 // these need some special treatment due to them not forwarding 0158 // their mouseevents to their scrollbars. 0159 if( reinterpret_cast<QScrollBar*>( child ) == m_fileView->horizontalScrollBar() ) { 0160 shiftedPos -= QPoint( 0, m_fileView->viewport()->size().height() ); 0161 } else if( reinterpret_cast<QScrollBar*>( child ) == m_fileView->verticalScrollBar() ) { 0162 shiftedPos -= QPoint( m_fileView->viewport()->size().width(), 0 ); 0163 } 0164 QMouseEvent shiftedEvent( e->type(), shiftedPos, 0165 event->globalPos(), event->button(), event->buttons(), 0166 event->modifiers() ); 0167 if( QApplication::sendEvent(child, &shiftedEvent) ) { 0168 if( e->type() == QEvent::MouseButtonPress || 0169 e->type() == QEvent::MouseButtonRelease || 0170 e->type() == QEvent::MouseButtonDblClick || 0171 e->type() == QEvent::MouseMove ) 0172 updateFileView(); 0173 return true; 0174 } 0175 0176 } 0177 } 0178 0179 return AbstractFloatItem::eventFilter(object, e); 0180 } 0181 0182 void FileViewFloatItem::selectTheme(const QString& theme) 0183 { 0184 Q_UNUSED(theme); 0185 0186 if ( m_marbleWidget ) { 0187 } 0188 } 0189 0190 void FileViewFloatItem::updateFileView() 0191 { 0192 if (m_marbleWidget) 0193 { 0194 // Trigger a repaint of the float item. Otherwise button state updates 0195 // are delayed 0196 QRectF floatItemRect = QRectF(positivePosition(), size()).toRect(); 0197 QRegion dirtyRegion(floatItemRect.toRect()); 0198 0199 m_marbleWidget->update(dirtyRegion); 0200 } 0201 } 0202 0203 void FileViewFloatItem::contextMenu( const QPoint& pos ) 0204 { 0205 if( !m_marbleWidget ) 0206 return; 0207 0208 QPointer<QMenu> test = new QMenu( m_fileView ); 0209 // We need the global position to move the menu. 0210 // pos contains the relative position. 0211 test->move( m_itemPosition ); 0212 connect( test->addAction( tr( "Open file..." ) ), SIGNAL(triggered()), 0213 this, SLOT(addFile()) ); 0214 connect( test->addAction( tr( "Close this file" ) ), SIGNAL(triggered()), 0215 this, SLOT(removeFile()) ); 0216 m_persIndex = new QPersistentModelIndex( m_fileView->indexAt( pos ) ); 0217 test->exec(); 0218 delete test; 0219 } 0220 0221 void FileViewFloatItem::addFile() 0222 { 0223 QString fileName; 0224 fileName = QFileDialog::getOpenFileName(m_marbleWidget, tr("Open File"), 0225 QString(), 0226 tr("All Supported Files (*.gpx *.kml *.pnt);;GPS Data (*.gpx);;Google Earth KML (*.kml);PNT Data (*.pnt)")); 0227 0228 if ( ! fileName.isEmpty() ) { 0229 m_marbleWidget->model()->addGeoDataFile( fileName ); 0230 } 0231 } 0232 0233 void FileViewFloatItem::removeFile() 0234 { 0235 //reinterpret_cast<FileViewModel*>(m_fileView->model())->setSelectedIndex( *m_persIndex ); 0236 mDebug() << m_fileView->model()->data( *m_persIndex, Qt::DisplayRole ).toString(); 0237 // close selected file 0238 reinterpret_cast<FileViewModel*>(m_fileView->model())->closeFile(); 0239 } 0240 0241 #include "moc_FileViewFloatItem.cpp"