|  | @@ -1826,102 +1826,116 @@ bool VMdEditor::processUrlFromMimeData(const QMimeData *p_source)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      QList<QUrl> urls = p_source->urls();
 | 
	
		
			
				|  |  |      if (urls.size() == 1) {
 | 
	
		
			
				|  |  | -        if (VUtils::isImageURL(urls[0])) {
 | 
	
		
			
				|  |  | -            VSelectDialog dialog(tr("Insert From Clipboard"), this);
 | 
	
		
			
				|  |  | -            dialog.addSelection(tr("Insert As Image"), 0);
 | 
	
		
			
				|  |  | -            dialog.addSelection(tr("Insert As Text"), 1);
 | 
	
		
			
				|  |  | -            dialog.addSelection(tr("Insert As Image Link"), 2);
 | 
	
		
			
				|  |  | +        bool isImage = VUtils::isImageURL(urls[0]);
 | 
	
		
			
				|  |  | +        bool isLocalFile = urls[0].isLocalFile()
 | 
	
		
			
				|  |  | +                           && QFileInfo::exists(urls[0].toLocalFile());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        QString localTextFilePath;
 | 
	
		
			
				|  |  | +        if (!isImage && isLocalFile) {
 | 
	
		
			
				|  |  | +            localTextFilePath = urls[0].toLocalFile();
 | 
	
		
			
				|  |  | +            QMimeDatabase mimeDatabase;
 | 
	
		
			
				|  |  | +            const QMimeType mimeType = mimeDatabase.mimeTypeForFile(localTextFilePath);
 | 
	
		
			
				|  |  | +            if (mimeType.isValid() && !mimeType.inherits(QStringLiteral("text/plain"))) {
 | 
	
		
			
				|  |  | +                localTextFilePath.clear();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (dialog.exec() == QDialog::Accepted) {
 | 
	
		
			
				|  |  | -                // FIXME: After calling dialog.exec(), p_source->hasUrl() returns false.
 | 
	
		
			
				|  |  | -                int selection = dialog.getSelection();
 | 
	
		
			
				|  |  | -                if (selection == 0) {
 | 
	
		
			
				|  |  | -                    // Insert as image.
 | 
	
		
			
				|  |  | -                    m_editOps->insertImageFromURL(urls[0]);
 | 
	
		
			
				|  |  | -                    return true;
 | 
	
		
			
				|  |  | -                } else if (selection == 2) {
 | 
	
		
			
				|  |  | -                    // Insert as link.
 | 
	
		
			
				|  |  | -                    insertImageLink("", urls[0].toString(QUrl::FullyEncoded));
 | 
	
		
			
				|  |  | -                    return true;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +        VSelectDialog dialog(tr("Insert From Clipboard"), this);
 | 
	
		
			
				|  |  | +        if (isImage) {
 | 
	
		
			
				|  |  | +            dialog.addSelection(tr("Insert As Image"), 0);
 | 
	
		
			
				|  |  | +            dialog.addSelection(tr("Insert As Image Link"), 1);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                QMimeData newSource;
 | 
	
		
			
				|  |  | -                newSource.setUrls(urls);
 | 
	
		
			
				|  |  | -                VTextEdit::insertFromMimeData(&newSource);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +        dialog.addSelection(tr("Insert As Link"), 2);
 | 
	
		
			
				|  |  | +        if (isLocalFile) {
 | 
	
		
			
				|  |  | +            dialog.addSelection(tr("Insert As Relative Link"), 3);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        dialog.addSelection(tr("Insert As Text"), 4);
 | 
	
		
			
				|  |  | +        if (!localTextFilePath.isEmpty()) {
 | 
	
		
			
				|  |  | +            dialog.addSelection(tr("Insert File Content"), 5);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            return true;
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -            QString localTextFilePath;
 | 
	
		
			
				|  |  | -            if (urls[0].isLocalFile()) {
 | 
	
		
			
				|  |  | -                localTextFilePath = urls[0].toLocalFile();
 | 
	
		
			
				|  |  | -                if (!QFileInfo::exists(localTextFilePath)) {
 | 
	
		
			
				|  |  | -                    localTextFilePath.clear();
 | 
	
		
			
				|  |  | -                } else {
 | 
	
		
			
				|  |  | -                    QMimeDatabase mimeDatabase;
 | 
	
		
			
				|  |  | -                    const QMimeType mimeType = mimeDatabase.mimeTypeForFile(localTextFilePath);
 | 
	
		
			
				|  |  | -                    if (mimeType.isValid() && !mimeType.inherits(QStringLiteral("text/plain"))) {
 | 
	
		
			
				|  |  | -                        localTextFilePath.clear();
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +        // FIXME: After calling dialog.exec(), p_source->hasUrl() returns false.
 | 
	
		
			
				|  |  | +        if (dialog.exec() == QDialog::Accepted) {
 | 
	
		
			
				|  |  | +            bool relativeLink = false;
 | 
	
		
			
				|  |  | +            switch (dialog.getSelection()) {
 | 
	
		
			
				|  |  | +            case 0:
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                // Insert As Image.
 | 
	
		
			
				|  |  | +                m_editOps->insertImageFromURL(urls[0]);
 | 
	
		
			
				|  |  | +                return true;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            VSelectDialog dialog(tr("Insert From Clipboard"), this);
 | 
	
		
			
				|  |  | -            dialog.addSelection(tr("Insert As Link"), 0);
 | 
	
		
			
				|  |  | -            dialog.addSelection(tr("Insert As Text"), 1);
 | 
	
		
			
				|  |  | -            if (!localTextFilePath.isEmpty()) {
 | 
	
		
			
				|  |  | -                dialog.addSelection(tr("Insert File Content"), 2);
 | 
	
		
			
				|  |  | +            case 1:
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                // Insert As Image Link.
 | 
	
		
			
				|  |  | +                insertImageLink("", urls[0].isLocalFile() ? urls[0].toString(QUrl::EncodeSpaces)
 | 
	
		
			
				|  |  | +                                                          : urls[0].toString());
 | 
	
		
			
				|  |  | +                return true;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (dialog.exec() == QDialog::Accepted) {
 | 
	
		
			
				|  |  | -                switch (dialog.getSelection()) {
 | 
	
		
			
				|  |  | -                case 0:
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    QString ut = urls[0].isLocalFile() ? urls[0].toString(QUrl::EncodeSpaces)
 | 
	
		
			
				|  |  | -                                                       : urls[0].toString();
 | 
	
		
			
				|  |  | -                    VInsertLinkDialog ld(QObject::tr("Insert Link"),
 | 
	
		
			
				|  |  | -                                         "",
 | 
	
		
			
				|  |  | -                                         "",
 | 
	
		
			
				|  |  | -                                         "",
 | 
	
		
			
				|  |  | -                                         ut,
 | 
	
		
			
				|  |  | -                                         false,
 | 
	
		
			
				|  |  | -                                         this);
 | 
	
		
			
				|  |  | -                    if (ld.exec() == QDialog::Accepted) {
 | 
	
		
			
				|  |  | -                        QString linkText = ld.getLinkText();
 | 
	
		
			
				|  |  | -                        QString linkUrl = ld.getLinkUrl();
 | 
	
		
			
				|  |  | -                        Q_ASSERT(!linkText.isEmpty() && !linkUrl.isEmpty());
 | 
	
		
			
				|  |  | -                        m_editOps->insertLink(linkText, linkUrl);
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    break;
 | 
	
		
			
				|  |  | +            case 3:
 | 
	
		
			
				|  |  | +                // Insert As Relative link.
 | 
	
		
			
				|  |  | +                relativeLink = true;
 | 
	
		
			
				|  |  | +                V_FALLTHROUGH;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            case 2:
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                // Insert As Link.
 | 
	
		
			
				|  |  | +                QString ut;
 | 
	
		
			
				|  |  | +                if (relativeLink) {
 | 
	
		
			
				|  |  | +                    QDir dir(m_file->fetchBasePath());
 | 
	
		
			
				|  |  | +                    ut = dir.relativeFilePath(urls[0].toLocalFile());
 | 
	
		
			
				|  |  | +                    ut = QUrl(ut).toString(QUrl::EncodeSpaces);
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    ut = urls[0].isLocalFile() ? urls[0].toString(QUrl::EncodeSpaces)
 | 
	
		
			
				|  |  | +                                               : urls[0].toString();
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                case 1:
 | 
	
		
			
				|  |  | -                    if (p_source->hasText()) {
 | 
	
		
			
				|  |  | -                        m_editOps->insertText(p_source->text());
 | 
	
		
			
				|  |  | -                    } else {
 | 
	
		
			
				|  |  | -                        m_editOps->insertText(urls[0].toString());
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    break;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                case 2:
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Q_ASSERT(!localTextFilePath.isEmpty());
 | 
	
		
			
				|  |  | -                    m_editOps->insertText(VUtils::readFileFromDisk(localTextFilePath));
 | 
	
		
			
				|  |  | -                    break;
 | 
	
		
			
				|  |  | +                VInsertLinkDialog ld(QObject::tr("Insert Link"),
 | 
	
		
			
				|  |  | +                                     "",
 | 
	
		
			
				|  |  | +                                     "",
 | 
	
		
			
				|  |  | +                                     "",
 | 
	
		
			
				|  |  | +                                     ut,
 | 
	
		
			
				|  |  | +                                     false,
 | 
	
		
			
				|  |  | +                                     this);
 | 
	
		
			
				|  |  | +                if (ld.exec() == QDialog::Accepted) {
 | 
	
		
			
				|  |  | +                    QString linkText = ld.getLinkText();
 | 
	
		
			
				|  |  | +                    QString linkUrl = ld.getLinkUrl();
 | 
	
		
			
				|  |  | +                    Q_ASSERT(!linkText.isEmpty() && !linkUrl.isEmpty());
 | 
	
		
			
				|  |  | +                    m_editOps->insertLink(linkText, linkUrl);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                default:
 | 
	
		
			
				|  |  | -                    Q_ASSERT(false);
 | 
	
		
			
				|  |  | -                    break;
 | 
	
		
			
				|  |  | +                return true;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            case 4:
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                // Insert As Text.
 | 
	
		
			
				|  |  | +                if (p_source->hasText()) {
 | 
	
		
			
				|  |  | +                    m_editOps->insertText(p_source->text());
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    m_editOps->insertText(urls[0].toString());
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  return true;
 | 
	
		
			
				|  |  | -            } else {
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            case 5:
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                // Insert File Content.
 | 
	
		
			
				|  |  | +                Q_ASSERT(!localTextFilePath.isEmpty());
 | 
	
		
			
				|  |  | +                m_editOps->insertText(VUtils::readFileFromDisk(localTextFilePath));
 | 
	
		
			
				|  |  |                  return true;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            default:
 | 
	
		
			
				|  |  | +                Q_ASSERT(false);
 | 
	
		
			
				|  |  | +                break;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      return false;
 |