mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
pop up a menu when inserting image or URL
This commit is contained in:
parent
f478ef70c6
commit
ee6fc69bb1
54
src/dialog/vselectdialog.cpp
Normal file
54
src/dialog/vselectdialog.cpp
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#include <QtWidgets>
|
||||||
|
#include "vselectdialog.h"
|
||||||
|
|
||||||
|
VSelectDialog::VSelectDialog(const QString &p_title, QWidget *p_parent)
|
||||||
|
: QDialog(p_parent), m_choice(-1)
|
||||||
|
{
|
||||||
|
setupUI(p_title);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VSelectDialog::setupUI(const QString &p_title)
|
||||||
|
{
|
||||||
|
m_mainLayout = new QVBoxLayout();
|
||||||
|
|
||||||
|
QPushButton *cancelBtn = new QPushButton(tr("Cancel"));
|
||||||
|
cancelBtn->setProperty("SelectionBtn", true);
|
||||||
|
connect(cancelBtn, &QPushButton::clicked,
|
||||||
|
this, &VSelectDialog::reject);
|
||||||
|
m_mainLayout->addWidget(cancelBtn);
|
||||||
|
|
||||||
|
setLayout(m_mainLayout);
|
||||||
|
m_mainLayout->setSizeConstraint(QLayout::SetFixedSize);
|
||||||
|
setWindowTitle(p_title);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VSelectDialog::addSelection(const QString &p_selectStr, int p_selectID)
|
||||||
|
{
|
||||||
|
Q_ASSERT(p_selectID >= 0);
|
||||||
|
|
||||||
|
QPushButton *btn = new QPushButton(p_selectStr);
|
||||||
|
btn->setProperty("SelectionBtn", true);
|
||||||
|
if (m_selections.isEmpty()) {
|
||||||
|
btn->setDefault(true);
|
||||||
|
btn->setAutoDefault(true);
|
||||||
|
}
|
||||||
|
connect(btn, &QPushButton::clicked,
|
||||||
|
this, &VSelectDialog::selectionChosen);
|
||||||
|
m_selections.insert(btn, p_selectID);
|
||||||
|
m_mainLayout->insertWidget(m_selections.size() - 1, btn);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VSelectDialog::selectionChosen()
|
||||||
|
{
|
||||||
|
QPushButton *btn = dynamic_cast<QPushButton *>(sender());
|
||||||
|
Q_ASSERT(btn);
|
||||||
|
auto it = m_selections.find(btn);
|
||||||
|
Q_ASSERT(it != m_selections.end());
|
||||||
|
m_choice = *it;
|
||||||
|
accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
int VSelectDialog::getSelection() const
|
||||||
|
{
|
||||||
|
return m_choice;
|
||||||
|
}
|
31
src/dialog/vselectdialog.h
Normal file
31
src/dialog/vselectdialog.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#ifndef VSELECTDIALOG_H
|
||||||
|
#define VSELECTDIALOG_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QMap>
|
||||||
|
|
||||||
|
class QPushButton;
|
||||||
|
class QVBoxLayout;
|
||||||
|
class QMouseEvent;
|
||||||
|
|
||||||
|
class VSelectDialog : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
VSelectDialog(const QString &p_title, QWidget *p_parent = 0);
|
||||||
|
|
||||||
|
void addSelection(const QString &p_selectStr, int p_selectID);
|
||||||
|
int getSelection() const;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void selectionChosen();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setupUI(const QString &p_title);
|
||||||
|
|
||||||
|
QVBoxLayout *m_mainLayout;
|
||||||
|
int m_choice;
|
||||||
|
QMap<QPushButton *, int> m_selections;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // VSELECTDIALOG_H
|
@ -13,6 +13,10 @@ QPushButton[CornerBtn="true"]::hover {
|
|||||||
background-color: @hover-color;
|
background-color: @hover-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPushButton[CornerBtn="true"]::focus {
|
||||||
|
background-color: @focus-color;
|
||||||
|
}
|
||||||
|
|
||||||
QPushButton[FlatBtn="true"] {
|
QPushButton[FlatBtn="true"] {
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -24,6 +28,26 @@ QPushButton[FlatBtn="true"]::hover {
|
|||||||
background-color: @hover-color;
|
background-color: @hover-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPushButton[FlatBtn="true"]::focus {
|
||||||
|
background-color: @focus-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton[SelectionBtn="true"] {
|
||||||
|
padding: 4px 10px 4px 10px;
|
||||||
|
border: none;
|
||||||
|
background-color: transparent;
|
||||||
|
font-size: 18px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton[SelectionBtn="true"]::hover {
|
||||||
|
background-color: @hover-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton[SelectionBtn="true"]::focus {
|
||||||
|
background-color: @focus-color;
|
||||||
|
}
|
||||||
|
|
||||||
QPushButton[TitleBtn="true"] {
|
QPushButton[TitleBtn="true"] {
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -35,6 +59,10 @@ QPushButton[TitleBtn="true"]::hover {
|
|||||||
background-color: @hover-color;
|
background-color: @hover-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPushButton[TitleBtn="true"]::focus {
|
||||||
|
background-color: @focus-color;
|
||||||
|
}
|
||||||
|
|
||||||
QToolBar {
|
QToolBar {
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,8 @@ SOURCES += main.cpp\
|
|||||||
vmdedit.cpp \
|
vmdedit.cpp \
|
||||||
dialog/vfindreplacedialog.cpp \
|
dialog/vfindreplacedialog.cpp \
|
||||||
dialog/vsettingsdialog.cpp \
|
dialog/vsettingsdialog.cpp \
|
||||||
dialog/vdeletenotebookdialog.cpp
|
dialog/vdeletenotebookdialog.cpp \
|
||||||
|
dialog/vselectdialog.cpp
|
||||||
|
|
||||||
HEADERS += vmainwindow.h \
|
HEADERS += vmainwindow.h \
|
||||||
vdirectorytree.h \
|
vdirectorytree.h \
|
||||||
@ -94,7 +95,8 @@ HEADERS += vmainwindow.h \
|
|||||||
vmdedit.h \
|
vmdedit.h \
|
||||||
dialog/vfindreplacedialog.h \
|
dialog/vfindreplacedialog.h \
|
||||||
dialog/vsettingsdialog.h \
|
dialog/vsettingsdialog.h \
|
||||||
dialog/vdeletenotebookdialog.h
|
dialog/vdeletenotebookdialog.h \
|
||||||
|
dialog/vselectdialog.h
|
||||||
|
|
||||||
RESOURCES += \
|
RESOURCES += \
|
||||||
vnote.qrc \
|
vnote.qrc \
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QImageReader>
|
||||||
|
|
||||||
const QVector<QPair<QString, QString>> VUtils::c_availableLanguages = {QPair<QString, QString>("en_US", "Englisth(US)"),
|
const QVector<QPair<QString, QString>> VUtils::c_availableLanguages = {QPair<QString, QString>("en_US", "Englisth(US)"),
|
||||||
QPair<QString, QString>("zh_CN", "Chinese")};
|
QPair<QString, QString>("zh_CN", "Chinese")};
|
||||||
@ -321,3 +323,20 @@ bool VUtils::isValidLanguage(const QString &p_lang)
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool VUtils::isImageURL(const QUrl &p_url)
|
||||||
|
{
|
||||||
|
QString urlStr;
|
||||||
|
if (p_url.isLocalFile()) {
|
||||||
|
urlStr = p_url.toLocalFile();
|
||||||
|
} else {
|
||||||
|
urlStr = p_url.toString();
|
||||||
|
}
|
||||||
|
return isImageURLText(urlStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VUtils::isImageURLText(const QString &p_url)
|
||||||
|
{
|
||||||
|
QFileInfo info(p_url);
|
||||||
|
return QImageReader::supportedImageFormats().contains(info.suffix().toLower().toLatin1());
|
||||||
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <QVector>
|
#include <QVector>
|
||||||
#include <QPair>
|
#include <QPair>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
#include <QUrl>
|
||||||
#include "vconfigmanager.h"
|
#include "vconfigmanager.h"
|
||||||
#include "vconstants.h"
|
#include "vconstants.h"
|
||||||
|
|
||||||
@ -37,6 +38,8 @@ public:
|
|||||||
QMessageBox::StandardButton p_defaultBtn, QWidget *p_parent);
|
QMessageBox::StandardButton p_defaultBtn, QWidget *p_parent);
|
||||||
static const QVector<QPair<QString, QString> > &getAvailableLanguages();
|
static const QVector<QPair<QString, QString> > &getAvailableLanguages();
|
||||||
static bool isValidLanguage(const QString &p_lang);
|
static bool isValidLanguage(const QString &p_lang);
|
||||||
|
static bool isImageURL(const QUrl &p_url);
|
||||||
|
static bool isImageURLText(const QString &p_url);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// <value, name>
|
// <value, name>
|
||||||
|
@ -20,8 +20,8 @@ public:
|
|||||||
VEditOperations(VEdit *p_editor, VFile *p_file);
|
VEditOperations(VEdit *p_editor, VFile *p_file);
|
||||||
virtual ~VEditOperations();
|
virtual ~VEditOperations();
|
||||||
virtual bool insertImageFromMimeData(const QMimeData *source) = 0;
|
virtual bool insertImageFromMimeData(const QMimeData *source) = 0;
|
||||||
virtual bool insertURLFromMimeData(const QMimeData *source) = 0;
|
|
||||||
virtual bool insertImage() = 0;
|
virtual bool insertImage() = 0;
|
||||||
|
virtual bool insertImageFromURL(const QUrl &p_imageUrl) = 0;
|
||||||
// Return true if @p_event has been handled and no need to be further
|
// Return true if @p_event has been handled and no need to be further
|
||||||
// processed.
|
// processed.
|
||||||
virtual bool handleKeyPressEvent(QKeyEvent *p_event) = 0;
|
virtual bool handleKeyPressEvent(QKeyEvent *p_event) = 0;
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "vconfigmanager.h"
|
#include "vconfigmanager.h"
|
||||||
#include "vtoc.h"
|
#include "vtoc.h"
|
||||||
#include "utils/vutils.h"
|
#include "utils/vutils.h"
|
||||||
|
#include "dialog/vselectdialog.h"
|
||||||
|
|
||||||
extern VConfigManager vconfig;
|
extern VConfigManager vconfig;
|
||||||
extern VNote *g_vnote;
|
extern VNote *g_vnote;
|
||||||
@ -106,18 +107,62 @@ bool VMdEdit::canInsertFromMimeData(const QMimeData *source) const
|
|||||||
|
|
||||||
void VMdEdit::insertFromMimeData(const QMimeData *source)
|
void VMdEdit::insertFromMimeData(const QMimeData *source)
|
||||||
{
|
{
|
||||||
|
VSelectDialog dialog(tr("Insert From Clipboard"), this);
|
||||||
|
dialog.addSelection(tr("Insert As Image"), 0);
|
||||||
|
dialog.addSelection(tr("Insert As Text"), 1);
|
||||||
|
|
||||||
if (source->hasImage()) {
|
if (source->hasImage()) {
|
||||||
// Image data in the clipboard
|
// Image data in the clipboard
|
||||||
bool ret = m_editOps->insertImageFromMimeData(source);
|
if (source->hasText()) {
|
||||||
if (ret) {
|
if (dialog.exec() == QDialog::Accepted) {
|
||||||
return;
|
if (dialog.getSelection() == 1) {
|
||||||
|
// Insert as text.
|
||||||
|
Q_ASSERT(source->hasText() && source->hasImage());
|
||||||
|
VEdit::insertFromMimeData(source);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
m_editOps->insertImageFromMimeData(source);
|
||||||
|
return;
|
||||||
} else if (source->hasUrls()) {
|
} else if (source->hasUrls()) {
|
||||||
// Paste an image file
|
QList<QUrl> urls = source->urls();
|
||||||
bool ret = m_editOps->insertURLFromMimeData(source);
|
if (urls.size() == 1 && VUtils::isImageURL(urls[0])) {
|
||||||
if (ret) {
|
if (dialog.exec() == QDialog::Accepted) {
|
||||||
return;
|
// FIXME: After calling dialog.exec(), source->hasUrl() returns false.
|
||||||
|
if (dialog.getSelection() == 0) {
|
||||||
|
// Insert as image.
|
||||||
|
m_editOps->insertImageFromURL(urls[0]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QMimeData newSource;
|
||||||
|
newSource.setUrls(urls);
|
||||||
|
VEdit::insertFromMimeData(&newSource);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else if (source->hasText()) {
|
||||||
|
QString text = source->text();
|
||||||
|
if (VUtils::isImageURLText(text)) {
|
||||||
|
// The text is a URL to an image.
|
||||||
|
if (dialog.exec() == QDialog::Accepted) {
|
||||||
|
if (dialog.getSelection() == 0) {
|
||||||
|
// Insert as image.
|
||||||
|
QUrl url(text);
|
||||||
|
if (url.isValid()) {
|
||||||
|
m_editOps->insertImageFromURL(QUrl(text));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Q_ASSERT(source->hasText());
|
||||||
}
|
}
|
||||||
VEdit::insertFromMimeData(source);
|
VEdit::insertFromMimeData(source);
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
#include "vmdeditoperations.h"
|
#include "vmdeditoperations.h"
|
||||||
#include "dialog/vinsertimagedialog.h"
|
#include "dialog/vinsertimagedialog.h"
|
||||||
|
#include "dialog/vselectdialog.h"
|
||||||
#include "utils/vutils.h"
|
#include "utils/vutils.h"
|
||||||
#include "vedit.h"
|
#include "vedit.h"
|
||||||
#include "vdownloader.h"
|
#include "vdownloader.h"
|
||||||
@ -143,29 +144,6 @@ bool VMdEditOperations::insertImageFromURL(const QUrl &imageUrl)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VMdEditOperations::insertURLFromMimeData(const QMimeData *source)
|
|
||||||
{
|
|
||||||
QList<QUrl> urls = source->urls();
|
|
||||||
if (urls.size() != 1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
QUrl url = urls.at(0);
|
|
||||||
QString urlStr;
|
|
||||||
if (url.isLocalFile()) {
|
|
||||||
urlStr = url.toLocalFile();
|
|
||||||
} else {
|
|
||||||
urlStr = url.toString();
|
|
||||||
}
|
|
||||||
QFileInfo info(urlStr);
|
|
||||||
if (QImageReader::supportedImageFormats().contains(info.suffix().toLower().toLatin1())) {
|
|
||||||
insertImageFromURL(url);
|
|
||||||
} else {
|
|
||||||
// urlStr will contain extra %0A. Let the base method handle.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool VMdEditOperations::insertImage()
|
bool VMdEditOperations::insertImage()
|
||||||
{
|
{
|
||||||
VInsertImageDialog dialog(tr("Insert Image From File"),
|
VInsertImageDialog dialog(tr("Insert Image From File"),
|
||||||
|
@ -16,15 +16,14 @@ class VMdEditOperations : public VEditOperations
|
|||||||
public:
|
public:
|
||||||
VMdEditOperations(VEdit *p_editor, VFile *p_file);
|
VMdEditOperations(VEdit *p_editor, VFile *p_file);
|
||||||
bool insertImageFromMimeData(const QMimeData *source) Q_DECL_OVERRIDE;
|
bool insertImageFromMimeData(const QMimeData *source) Q_DECL_OVERRIDE;
|
||||||
bool insertURLFromMimeData(const QMimeData *source) Q_DECL_OVERRIDE;
|
|
||||||
bool insertImage() Q_DECL_OVERRIDE;
|
bool insertImage() Q_DECL_OVERRIDE;
|
||||||
bool handleKeyPressEvent(QKeyEvent *p_event) Q_DECL_OVERRIDE;
|
bool handleKeyPressEvent(QKeyEvent *p_event) Q_DECL_OVERRIDE;
|
||||||
|
bool insertImageFromURL(const QUrl &p_imageUrl) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void pendingTimerTimeout();
|
void pendingTimerTimeout();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool insertImageFromURL(const QUrl &imageUrl);
|
|
||||||
void insertImageFromPath(const QString &title, const QString &path, const QString &oriImagePath);
|
void insertImageFromPath(const QString &title, const QString &path, const QString &oriImagePath);
|
||||||
void insertImageFromQImage(const QString &title, const QString &path, const QImage &image);
|
void insertImageFromQImage(const QString &title, const QString &path, const QImage &image);
|
||||||
void setKeyState(KeyState p_state);
|
void setKeyState(KeyState p_state);
|
||||||
|
@ -31,6 +31,10 @@ void VNote::initPalette(QPalette palette)
|
|||||||
palette.background().color().name()));
|
palette.background().color().name()));
|
||||||
m_palette.append(QPair<QString, QString>("hover-color", "#42A5F5"));
|
m_palette.append(QPair<QString, QString>("hover-color", "#42A5F5"));
|
||||||
m_palette.append(QPair<QString, QString>("base-color", "#BDBDBD"));
|
m_palette.append(QPair<QString, QString>("base-color", "#BDBDBD"));
|
||||||
|
m_palette.append(QPair<QString, QString>("focus-color", "#15AE67"));
|
||||||
|
m_palette.append(QPair<QString, QString>("logo-base", "#D6EACE"));
|
||||||
|
m_palette.append(QPair<QString, QString>("logo-max", "#15AE67"));
|
||||||
|
m_palette.append(QPair<QString, QString>("logo-min", "#75C5B5"));
|
||||||
|
|
||||||
// Material Design Colors
|
// Material Design Colors
|
||||||
m_palette.append(QPair<QString, QString>("Teal0", "#E0F2F1"));
|
m_palette.append(QPair<QString, QString>("Teal0", "#E0F2F1"));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user