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"