File indexing completed on 2024-04-28 05:52:37

0001 /*
0002     This file is part of the Okteta Gui library, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2008-2009 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "mousepaster.hpp"
0010 
0011 // lib
0012 #include <bytearraycolumnview.hpp>
0013 #include <bytearraytableranges.hpp>
0014 #include <bytearraytablecursor.hpp>
0015 #include <bytearraytablelayout.hpp>
0016 // Qt
0017 #include <QMouseEvent>
0018 
0019 namespace Okteta {
0020 
0021 MousePaster::MousePaster(AbstractByteArrayView* view, AbstractMouseController* parent)
0022     : AbstractMouseController(view, parent)
0023 {
0024 }
0025 
0026 MousePaster::~MousePaster() = default;
0027 
0028 bool MousePaster::handleMousePressEvent(QMouseEvent* mouseEvent)
0029 {
0030     bool eventUsed = false;
0031 
0032     if (mouseEvent->button() == Qt::MiddleButton && !mView->isReadOnly()) {
0033         mView->pauseCursor();
0034         mView->finishByteEdit();
0035 
0036         ByteArrayTableRanges* tableRanges = mView->tableRanges();
0037         tableRanges->removeSelection();
0038 
0039         if (tableRanges->isModified()) {
0040             mView->updateChanged();
0041             mView->viewport()->setCursor(mView->isReadOnly() ? Qt::ArrowCursor : Qt::IBeamCursor);
0042         }
0043         mView->unpauseCursor();
0044 
0045         eventUsed = true;
0046     }
0047 
0048     return eventUsed ? true : AbstractMouseController::handleMousePressEvent(mouseEvent);
0049 }
0050 
0051 bool MousePaster::handleMouseReleaseEvent(QMouseEvent* mouseEvent)
0052 {
0053     bool eventUsed = false;
0054     // middle mouse button paste?
0055     if (mouseEvent->button() == Qt::MiddleButton && !mView->isReadOnly()) {
0056         const QPoint releasePoint = mView->viewportToColumns(mouseEvent->pos());
0057 
0058         mView->pauseCursor();
0059         mView->finishByteEdit();
0060 
0061         mView->placeCursor(releasePoint);
0062 
0063         ByteArrayTableRanges* tableRanges = mView->tableRanges();
0064         ByteArrayTableCursor* tableCursor = mView->tableCursor();
0065         // replace no selection?
0066         if (tableRanges->hasSelection() && !tableRanges->selectionIncludes(tableCursor->index())) {
0067             tableRanges->removeSelection();
0068         }
0069 
0070         mView->pasteFromClipboard(QClipboard::Selection);
0071 
0072         mView->ensureCursorVisible();
0073 
0074         if (tableRanges->selectionJustStarted()) {
0075             tableRanges->removeSelection();
0076         }
0077 
0078         // ensure selection changes to be drawn TODO: create a insert/pasteAtCursor that leaves out drawing
0079         mView->updateChanged();
0080         mView->unpauseCursor();
0081         mView->emitSelectionSignals();
0082 
0083         eventUsed = true;
0084     }
0085 
0086     return eventUsed ? true : AbstractMouseController::handleMouseReleaseEvent(mouseEvent);
0087 }
0088 
0089 }