diff --git a/app/bin/mytetra.qrc b/app/bin/mytetra.qrc
index 60c0e471c..c6c9841cf 100644
--- a/app/bin/mytetra.qrc
+++ b/app/bin/mytetra.qrc
@@ -125,5 +125,6 @@
resource/pic/move_right.svg
resource/pic/edit_zoom-in.svg
resource/pic/edit_zoom-out.svg
+ resource/pic/open_image.svg
diff --git a/app/bin/resource/pic/open_image.svg b/app/bin/resource/pic/open_image.svg
new file mode 100644
index 000000000..a76369da1
--- /dev/null
+++ b/app/bin/resource/pic/open_image.svg
@@ -0,0 +1,43 @@
+
+
+
+
diff --git a/app/bin/resource/translations/mytetra_fr.ts b/app/bin/resource/translations/mytetra_fr.ts
index ddaf58451..ba14928dc 100644
--- a/app/bin/resource/translations/mytetra_fr.ts
+++ b/app/bin/resource/translations/mytetra_fr.ts
@@ -2399,657 +2399,667 @@ MyTetra will try to create a blank entry to fix it.
ShortcutManager
-
+
Add a new note
-
+
Add a note before
-
+
Add a note before current selected note
-
+
Add a note after
-
+
Add a note after current selected note
-
+
Edit properties
-
+
Edit note properties (name, author, tags...)
-
+
Block/Unblock note
-
+
Block or unblock current selected note
-
+
Delete note(s)
-
+
Cut notes(s)
-
+
Cut notes(s) to clipboard
-
+
Copy note(s)
-
+
Copy note(s) to clipboard
-
+
Paste note(s)
-
+
Paste note(s) from clipboard
-
+
Move up
-
+
Move up current note
-
+
Move down
-
+
Move down current note
-
+
Previous note
-
+
Previous note has been viewing
-
+
Next note
-
+
Next note has been viewing
-
+
Expand all sub items
-
+
Collapse all sub items
-
+
Move item up
-
+
Move item down
-
+
Insert a new sub item
-
+
Insert a new sub item into selected
-
+
Insert a new sibling item
-
+
Insert a new sibling item after selected
-
+
Edit item name
-
+
Edit name of selected item
-
+
Delete item
-
+
Delete selected item and all sub items
-
+
Cut item
-
+
Cut item including sub items
-
+
Copy item
-
+
Copy item including sub items
-
+
Paste item
-
+
Paste sibling item after selected
-
+
Paste as sub item
-
+
Paste item as sub item for selected
-
+
Encrypt item
-
+
Encrypt item and all subitem
-
+
Decrypt item
-
+
Decrypt item and all subitem
-
+
Set icon
-
+
Set item icon
-
+
Select all
-
+
Copy
-
+
Paste
-
+
Paste plain text
-
+
Cut
-
+
Undo
-
+
Redo
-
+
Bold
-
+
Italic
-
+
Underline
-
+
Strike out
-
+
Superscript
-
+
Subscript
-
+
Monospace
-
+
Code
-
+
Select a whole paragraphs to format text as code
-
+
Lowercase
-
+
Uppercase
-
+
Clear format
-
+
When selected whole paragraph both text and paragraph format is reset to default or just text format in other case
-
+
Text only
-
+
Return type replace
-
+
Replace soft carriage return to standard carriage return
-
+
Numeric list
-
+
Marked list
-
+
Increase indent
-
+
Decrease indent
-
+
Align left
-
+
Align center
-
+
Align right
-
+
Align width
-
+
Text color
-
+
Background color
-
+
Select font
-
+
Select font size
-
+
Find text
-
+
Find text in current note
-
+
Editor settings
-
+
Edit reference URL
-
+
Edit HTML code
-
+
Show special chars
-
+
Create a new table
-
+
Remove row(s)
-
+
Remove column(s)
-
+
Add row(s)
-
+
Add column(s)
-
+
Merge cells
-
+
Split cell
-
+
Table properties
-
+
+ Open image
+
+
+
+
+ Open selected image in external viewer
+
+
+
+
Insert/edit image
-
+
Insert image from file or edit selected image properties
-
+
Insert horizontal line
-
+
Insert a horizontal line into the empty paragraph from cursor
-
+
Insert/edit math expression
-
+
Expand edit area
-
+
Expand tools
-
+
Forse save note
-
+
Show detached window
-
+
Attach files
-
+
Go to URL or reference
-
+
Copy selected rows
-
+
Attach file
-
+
Attach file from URL
-
+
Add link
-
+
Add link without file copying
-
+
Edit file name
-
+
Delete file
-
+
Preview file
-
+
Save as...
-
+
Attach info
-
+
Return to editor
-
+
Set focus to items tree
-
+
Set focus to notes table
-
+
Set focus to editor
-
+
Find in base
-
+
Synchronization
-
+
Run synchronization
-
+
Ok
-
+
Print
-
+
Export PDF
-
+
Quit
diff --git a/app/bin/resource/translations/mytetra_ru.ts b/app/bin/resource/translations/mytetra_ru.ts
index 2fb37aed5..67aec5255 100644
--- a/app/bin/resource/translations/mytetra_ru.ts
+++ b/app/bin/resource/translations/mytetra_ru.ts
@@ -1365,12 +1365,17 @@ enable «Decrypt to a temporary file» option in Settings.
Выбрать всё
-
+
+ Open image
+ Открыть изображение
+
+
+
Edit image properties
- Свойства картинки
+ Свойства изображения
-
+
Edit math expression
Редактировать формулу
@@ -3625,7 +3630,7 @@ MyTetra will try to create a blank entry to fix it.
ShortcutManager
-
+
Add a new note
Добавить новую запись
@@ -3634,502 +3639,512 @@ MyTetra will try to create a blank entry to fix it.
Нобавить новую запись
-
+
Add a note before
Добавить перед
-
+
Add a note before current selected note
Добавить новую запись перед выбранной записью
-
+
Add a note after
Добавить после
-
+
Add a note after current selected note
Добавить новую запись после выбранной записи
-
+
Edit properties
Редактировать свойства
-
+
Edit note properties (name, author, tags...)
Редактировать свойства записи (название, автор, текстовые метки...)
-
+
Block/Unblock note
Блокировать/Разблокировать запись
-
+
Block or unblock current selected note
Блокировать/Разблокировать возможность изменения записи
-
+
Delete note(s)
Удалить
-
+
Cut notes(s)
Вырезать
-
+
Cut notes(s) to clipboard
Вырезать запись (записи) в буфер обмена
-
+
Copy note(s)
Копировать
-
+
Copy note(s) to clipboard
Копировать запись (записи) в буфер обмена
-
+
Paste note(s)
Вставить
-
+
Paste note(s) from clipboard
Вставить запись (записи) из буфера обмена
-
+
Move up
Передвинуть вверх
-
+
Move up current note
Передвинуть вверх текущую запись
-
+
Move down
Передвинуть вниз
-
+
Move down current note
Передвинуть вниз текущую запись
-
+
Previous note
Предыдущая запись
-
+
Previous note has been viewing
Предыдущая запись, которая была просмотрена
-
+
Next note
Следующая запись
-
+
Next note has been viewing
Следующая запись, которая была просмотрена
-
+
Expand all sub items
Развернуть все подветки
-
+
Collapse all sub items
Свернуть все подветки
-
+
Move item up
Переместить ветку вверх
-
+
Move item down
Переместить ветку вниз
-
+
Insert a new sub item
Добавить подветку
-
+
Insert a new sub item into selected
Добавить подветку к выделенной ветке
-
+
Insert a new sibling item
Добавить ветку такого же уровня
-
+
Insert a new sibling item after selected
Добавить ветку такого же уровня вложения после выделенной ветки
-
+
Edit item name
Редактировать название ветки
-
+
Edit name of selected item
Редактировать название выделенной ветки
-
+
Delete item
Удалить ветку
-
+
Delete selected item and all sub items
Удалить выделенную ветку и все её подветки
-
+
Cut item
Вырезать ветку
-
+
Cut item including sub items
Вырезать выделенную ветку и все её подветки
-
+
Copy item
Копировать ветку
-
+
Copy item including sub items
Скопировать ветку и все её подветки в буфер обмена
-
+
Paste item
Вставить ветку
-
+
Paste sibling item after selected
Вставить ветку из буфера обмена после выделенной на том же уровне
-
+
Paste as sub item
Вставить ветку как подветку
-
+
Paste item as sub item for selected
Вставить ветку из буфера обмена как подветку для выбранной ветки
-
+
Encrypt item
Зашифровать ветку
-
+
Encrypt item and all subitem
Зашифровать ветку и все подветки
-
+
Decrypt item
Расшифровать ветку
-
+
Decrypt item and all subitem
Расшифровать ветку и все подветки
-
+
Set icon
Задать иконку
-
+
Set item icon
Задать иконку для ветки
-
+
Select all
Выбрать всё
-
+
Copy
Копировать
-
+
Paste
Вставить
-
+
Paste plain text
Вставить только текст
-
+
Cut
Вырезать
-
+
Undo
Отмена
-
+
Redo
Повтор
-
+
Bold
Жирный
-
+
Italic
Курсив
-
+
Underline
Подчёркнутый
-
+
Strike out
Зачеркнутый
-
+
Superscript
Верхний индекс
-
+
Subscript
Нижний индекс
-
+
Monospace
Моноширинный
-
+
Code
Код
-
+
Select a whole paragraphs to format text as code
Требуется целиком выделить абзац(ы) для полного форматирования в код
-
+
Lowercase
Нижний регистр
-
+
Uppercase
Верхний регистр
-
+
Clear format
Очистка форматирования
-
+
When selected whole paragraph both text and paragraph format is reset to default or just text format in other case
Сброс форматирования к стандартному. Если выбрана часть строки, очищается начертание. Если выбран абзац, очищается всё форматирование
-
+
Text only
Только текст
-
+
Return type replace
Замена символов перевода строк
-
+
Replace soft carriage return to standard carriage return
Заменить "мягкий" перевод строки на стандартный перевод строки
-
+
Numeric list
Нумерованный список
-
+
Marked list
Маркированный список
-
+
Increase indent
Увеличить отступ
-
+
Decrease indent
Уменьшить отступ
-
+
Align left
По левому краю
-
+
Align center
По центру
-
+
Align right
По правому краю
-
+
Align width
По ширине
-
+
Text color
Цвет текста
-
+
Background color
Цвет фона
-
+
Select font
Выбор шрифта
-
+
Select font size
Выбор размера шрифта
-
+
Find text
Поиск текста
-
+
Find text in current note
Поиск текста в текущей записи
-
+
Editor settings
Настройки редактора
-
+
Edit reference URL
Редактировать ссылку
-
+
Edit HTML code
Редактирование HTML кода
-
+
Show special chars
Показать символы форматирования
-
+
Create a new table
Создать новую таблицу
-
+
Remove row(s)
Удалить строку
-
+
Remove column(s)
Удалить столбец
-
+
Add row(s)
Добавить строки
-
+
Add column(s)
Добавить столбец
-
+
Merge cells
Объединить ячейки
-
+
Split cell
Разделить ячейку
-
+
Table properties
Свойства таблицы
-
+
+ Open image
+ Открыть изображение
+
+
+
+ Open selected image in external viewer
+ Открыть выбранное изображение в сторонней программе
+
+
+
Insert/edit image
Вставка изображения
-
+
Insert image from file or edit selected image properties
Вставка картинки из файла / Редактирование свойств картинки
@@ -4138,152 +4153,152 @@ MyTetra will try to create a blank entry to fix it.
Вставка картинки из файла / Редактирование свойств картинки
-
+
Insert horizontal line
Вставка горизонтальной линии
-
+
Insert a horizontal line into the empty paragraph from cursor
Вставка горизонтальной линии для разграничения параграфов
-
+
Insert/edit math expression
Вставить формулу / редактировать формулу
-
+
Expand edit area
Распахнуть область редактирования
-
+
Expand tools
Развернуть панель инструментов
-
+
Forse save note
Быстрое сохранение записи
-
+
Show detached window
Показать открепляемое окно
-
+
Attach files
Прикрепить файл
-
+
Go to URL or reference
Перейти по URL или по ссылке
-
+
Copy selected rows
Копировать выделенные строки
-
+
Attach file
Прикрепить файл
-
+
Attach file from URL
Прикрепить файл по URL
-
+
Add link
Добавить линк
-
+
Add link without file copying
Добавить линк на файл без копирования самого файла
-
+
Edit file name
Изменить имя файла
-
+
Delete file
Удалить файл
-
+
Preview file
Предпросмотр файла
-
+
Save as...
Сохранить как...
-
+
Attach info
Информация о прикрепленном файле
-
+
Return to editor
Вернуться в редактор
-
+
Set focus to items tree
Устновить фокус на дереве
-
+
Set focus to notes table
Устновить фокус на списке записей
-
+
Set focus to editor
Устновить фокус на редакторе
-
+
Find in base
Найти в базе
-
+
Synchronization
Синхронизация
-
+
Run synchronization
Запуск синхронизации
-
+
Ok
ОК
-
+
Print
Печать
-
+
Export PDF
Экспорт в PDF
-
+
Quit
Выход
diff --git a/app/src/libraries/ShortcutManager.cpp b/app/src/libraries/ShortcutManager.cpp
index 7351df10c..e2d45e6cb 100644
--- a/app/src/libraries/ShortcutManager.cpp
+++ b/app/src/libraries/ShortcutManager.cpp
@@ -145,6 +145,7 @@ void ShortcutManager::initDefaultKeyTable()
defaultKeyTable.insert("editor-tableMergeCells", Data{ QKeySequence(""), tr("Merge cells"), tr("") });
defaultKeyTable.insert("editor-tableSplitCell", Data{ QKeySequence(""), tr("Split cell"), tr("") });
defaultKeyTable.insert("editor-tableProperties", Data{ QKeySequence(""), tr("Table properties"), tr("") });
+ defaultKeyTable.insert("editor-openImage", Data{ QKeySequence("Ctrl+Shift+Y"), tr("Open image"), tr("Open selected image in external viewer") });
defaultKeyTable.insert("editor-insertImageFromFile", Data{ QKeySequence("Ctrl+Shift+I"), tr("Insert/edit image"), tr("Insert image from file or edit selected image properties") });
defaultKeyTable.insert("editor-insertHorizontalLine",Data{ QKeySequence("Ctrl+H"), tr("Insert horizontal line"), tr("Insert a horizontal line into the empty paragraph from cursor") });
defaultKeyTable.insert("editor-mathExpression", Data{ QKeySequence("Ctrl+Shift+M"), tr("Insert/edit math expression"), tr("") });
diff --git a/app/src/libraries/wyedit/Editor.cpp b/app/src/libraries/wyedit/Editor.cpp
index 723cf996c..88d4437b7 100644
--- a/app/src/libraries/wyedit/Editor.cpp
+++ b/app/src/libraries/wyedit/Editor.cpp
@@ -367,6 +367,11 @@ void Editor::setupSignals(void)
referenceFormatter, &ReferenceFormatter::onClickedGotoReference,
Qt::DirectConnection);
+ // Клик по картинке, для ImageFormatter
+ connect(textArea, &EditorTextArea::clickOnImage,
+ imageFormatter, &ImageFormatter::onClickOnImage,
+ Qt::DirectConnection);
+
// Двойной клик по картинке, для ImageFormatter
connect(textArea, &EditorTextArea::doubleClickOnImage,
imageFormatter, &ImageFormatter::onDoubleClickOnImage,
@@ -422,6 +427,9 @@ void Editor::setupSignals(void)
connect(editorContextMenu, &EditorContextMenu::selectAll,
this, &Editor::onSelectAll,
Qt::DirectConnection);
+ connect(editorContextMenu, &EditorContextMenu::contextMenuOpenImage,
+ imageFormatter, &ImageFormatter::onContextMenuOpenImage,
+ Qt::DirectConnection);
connect(editorContextMenu, &EditorContextMenu::contextMenuEditImageProperties,
imageFormatter, &ImageFormatter::onContextMenuEditImageProperties,
Qt::DirectConnection);
@@ -581,6 +589,9 @@ void Editor::setupToolsSignals(void)
// Прочие кнопки
+ connect(editorToolBarAssistant->openImage, &QAction::triggered,
+ imageFormatter, &ImageFormatter::openImage);
+
connect(editorToolBarAssistant->insertImageFromFile, &QAction::triggered,
imageFormatter, &ImageFormatter::onInsertImageFromFileClicked);
diff --git a/app/src/libraries/wyedit/EditorContextMenu.cpp b/app/src/libraries/wyedit/EditorContextMenu.cpp
index 1bf22e4b5..b2f062428 100644
--- a/app/src/libraries/wyedit/EditorContextMenu.cpp
+++ b/app/src/libraries/wyedit/EditorContextMenu.cpp
@@ -41,6 +41,7 @@ void EditorContextMenu::setupActions(void)
actionPasteAsPlainText=new QAction(this);
actionSelectAll=new QAction(this);
+ actionOpenImage=new QAction(this);
actionEditImageProperties=new QAction(this);
actionEditMathExpression=new QAction(this);
actionGotoReference=new QAction(this);
@@ -62,6 +63,10 @@ void EditorContextMenu::setupShortcuts(void)
shortcutManager.initAction("editor-pasteAsPlainText", actionPasteAsPlainText );
shortcutManager.initAction("editor-selectAll", actionSelectAll );
+ // "Умное" действие Открыть изображение
+ shortcutManager.initAction("editor-openImage", actionOpenImage);
+ actionOpenImage->setText(tr("Open image"));
+
// "Умное" действие Вставить изображение / Редактировать свойства изображения
shortcutManager.initAction("editor-insertImageFromFile", actionEditImageProperties );
actionEditImageProperties->setText(tr("Edit image properties")); // В контекстном меню это редактирование свойств изображения
@@ -146,6 +151,9 @@ void EditorContextMenu::setImageProperties(bool flag)
{
qDebug() << "In EditorContextMenu::setImageProperties() " << flag;
+ actionOpenImage->setVisible(flag);
+ actionOpenImage->setEnabled(flag);
+
actionEditImageProperties->setVisible(flag);
actionEditImageProperties->setEnabled(flag);
}
@@ -204,6 +212,7 @@ void EditorContextMenu::setupSignals(void)
connect(actionPasteAsPlainText,&QAction::triggered, this, &EditorContextMenu::onActionPasteAsPlainText);
connect(actionSelectAll, &QAction::triggered, this, &EditorContextMenu::onActionSelectAll);
+ connect(actionOpenImage, &QAction::triggered, this, &EditorContextMenu::onActionContextMenuOpenImage);
connect(actionEditImageProperties,&QAction::triggered, this, &EditorContextMenu::onActionContextMenuEditImageProperties);
connect(actionEditMathExpression, &QAction::triggered, this, &EditorContextMenu::onActionContextMenuEditMathExpression);
connect(actionGotoReference, &QAction::triggered, this, &EditorContextMenu::onActionContextMenuGotoReference);
@@ -236,6 +245,7 @@ void EditorContextMenu::setupMenu(void)
this->addSeparator();
this->addAction(actionSelectAll);
+ this->addAction(actionOpenImage);
this->addAction(actionEditImageProperties);
this->addAction(actionEditMathExpression);
this->addAction(actionGotoReference);
@@ -298,6 +308,15 @@ void EditorContextMenu::onActionSelectAll()
}
}
+void EditorContextMenu::onActionContextMenuOpenImage()
+{
+ update();
+ if(actionOpenImage->isEnabled())
+ {
+ emit contextMenuOpenImage();
+ }
+}
+
void EditorContextMenu::onActionContextMenuEditImageProperties()
{
update();
diff --git a/app/src/libraries/wyedit/EditorContextMenu.h b/app/src/libraries/wyedit/EditorContextMenu.h
index 6710c6942..069f96754 100644
--- a/app/src/libraries/wyedit/EditorContextMenu.h
+++ b/app/src/libraries/wyedit/EditorContextMenu.h
@@ -15,7 +15,7 @@ class EditorContextMenu : public QMenu
QList getActionsList(void);
- void setImageProperties(bool flag); // Активирование добавочного пункта меню "Свойства картинки")
+ void setImageProperties(bool flag); // Активирование добавочного пункта меню "Свойства изображения")
void setEditMathExpression(bool flag); // Активирование добавочного пункта меню "Редактирование формулы")
void setGotoReference(bool flag); // Активирование добавочного пункта меню "Перейти по ссылке")
void setPasteAsPlainText(bool flag);
@@ -34,6 +34,7 @@ class EditorContextMenu : public QMenu
void paste(void);
void pasteAsPlainText(void);
void selectAll(void);
+ void contextMenuOpenImage(void);
void contextMenuEditImageProperties(void);
void contextMenuEditMathExpression(void);
void contextMenuGotoReference(void);
@@ -56,6 +57,7 @@ protected slots:
QAction *actionLowercase; // строчный
QAction *actionUppercase; // ПРОПИСНЫЕ
+ QAction *actionOpenImage;
QAction *actionEditImageProperties;
QAction *actionEditMathExpression;
QAction *actionGotoReference;
@@ -73,6 +75,7 @@ protected slots:
void onActionPaste(void);
void onActionPasteAsPlainText(void);
void onActionSelectAll(void);
+ void onActionContextMenuOpenImage();
void onActionContextMenuEditImageProperties(void);
void onActionContextMenuEditMathExpression(void);
void onActionContextMenuGotoReference(void);
diff --git a/app/src/libraries/wyedit/EditorTextArea.cpp b/app/src/libraries/wyedit/EditorTextArea.cpp
index f46cb675d..203c4bad5 100644
--- a/app/src/libraries/wyedit/EditorTextArea.cpp
+++ b/app/src/libraries/wyedit/EditorTextArea.cpp
@@ -163,11 +163,24 @@ void EditorTextArea::switchReferenceClickMode(bool flag)
globalParameters.getStatusBar()->showMessage(href);
qDebug() << "Cursor href in key event: " << href;
}
+ else
+ {
+ // Сразу нужно проверить, не наведен ли курсор на изображение, и если наведен, то поменять его вид
+ QString imageName = imageAt(currentMousePosition);
+
+ if(!imageName.isEmpty())
+ {
+ qApp->setOverrideCursor(QCursor(Qt::PointingHandCursor)); // Меняется форма курсора на указатель клика по ссылке
+ mouseCursorOverriden = true;
+ globalParameters.getStatusBar()->showMessage(imageName); // Имя изображения отображается в строке статуса
+ qDebug() << "Cursor image in mouse event: " << imageName;
+ }
+ }
}
else
{
// Вид курсора сбрасывается на основной. Нужно для того, чтобы курсор поменялся,
- // если мышка в момент отжатия клавиши была наведена на ссылку и курсор был с указательным пальцем
+ // если мышка в момент отжатия клавиши была наведена на ссылку или изображение и курсор был с указательным пальцем
qApp->restoreOverrideCursor();
mouseCursorOverriden = false;
@@ -201,11 +214,26 @@ void EditorTextArea::mouseMoveEvent(QMouseEvent *event)
}
else
{
- if(mouseCursorOverriden)
+ QString imageName = imageAt(currentMousePosition);
+
+ if(!imageName.isEmpty())
+ {
+ if(!mouseCursorOverriden)
+ {
+ qApp->setOverrideCursor(QCursor(Qt::PointingHandCursor)); // Меняется форма курсора на указатель клика по ссылке
+ mouseCursorOverriden = true;
+ globalParameters.getStatusBar()->showMessage(imageName); // Имя изображения отображается в строке статуса
+ qDebug() << "Cursor image in mouse event: " << imageName;
+ }
+ }
+ else
{
- qApp->restoreOverrideCursor(); // Воостанавливается обычный курсор
- mouseCursorOverriden = false;
- globalParameters.getStatusBar()->showMessage("");
+ if(mouseCursorOverriden)
+ {
+ qApp->restoreOverrideCursor(); // Воостанавливается обычный курсор
+ mouseCursorOverriden = false;
+ globalParameters.getStatusBar()->showMessage("");
+ }
}
}
}
@@ -222,7 +250,22 @@ void EditorTextArea::mousePressEvent(QMouseEvent *event)
if( event->type()==QEvent::MouseButtonPress && (QApplication::keyboardModifiers() & Qt::ControlModifier) ) {
QString href = this->anchorAt(event->pos());
if(!href.isEmpty())
+ {
emit clickedOnReference(href);
+ }
+ else
+ {
+ QString imageName = imageAt(currentMousePosition);
+
+ if(!imageName.isEmpty())
+ {
+ // Устанавливаем курсор на изображение, по которому кликнули
+ setTextCursorFromPoint(currentMousePosition);
+
+ // Открываем изображение
+ emit clickOnImage();
+ }
+ }
} else {
qApp->restoreOverrideCursor();
}
@@ -676,3 +719,31 @@ void EditorTextArea::onChangeFontPointSize(int n)
setFontPointSize(n);
}
+QString EditorTextArea::imageAt(const QPoint& point)
+{
+ int scrollY = verticalScrollBar()->value();
+ int scrollX = horizontalScrollBar()->value();
+ QPoint mousePositionWithScroll = QPoint(point.x()+scrollX, point.y()+scrollY);
+ return document()->documentLayout()->imageAt(mousePositionWithScroll);
+}
+
+int EditorTextArea::hitTest(const QPointF &point, Qt::HitTestAccuracy accuracy)
+{
+ int scrollY = verticalScrollBar()->value();
+ int scrollX = horizontalScrollBar()->value();
+ QPoint mousePositionWithScroll = QPoint(point.x()+scrollX, point.y()+scrollY);
+ return document()->documentLayout()->hitTest(mousePositionWithScroll, accuracy);
+}
+
+void EditorTextArea::setTextCursorFromPoint(const QPointF &point)
+{
+ int pos = hitTest(point, Qt::ExactHit);
+ if (pos < 0)
+ return;
+ QTextCursor cursor(textCursor());
+ if (!cursor.atEnd())
+ pos+=1;
+ cursor.setPosition(pos);
+ setTextCursor(cursor);
+}
+
diff --git a/app/src/libraries/wyedit/EditorTextArea.h b/app/src/libraries/wyedit/EditorTextArea.h
index 438189983..bb3e7441d 100644
--- a/app/src/libraries/wyedit/EditorTextArea.h
+++ b/app/src/libraries/wyedit/EditorTextArea.h
@@ -43,6 +43,7 @@ class EditorTextArea : public QTextEdit
void downloadImages(const QString href);
+ void clickOnImage();
void doubleClickOnImage();
public slots:
@@ -90,6 +91,9 @@ class EditorTextArea : public QTextEdit
void mouseDoubleClickEvent(QMouseEvent *event);
void switchReferenceClickMode(bool flag);
+ QString imageAt(const QPoint& point);
+ int hitTest(const QPointF &point, Qt::HitTestAccuracy accuracy);
+ void setTextCursorFromPoint(const QPointF &point);
};
#endif // _EDITORTEXTAREA_H_
diff --git a/app/src/libraries/wyedit/EditorToolBar.cpp b/app/src/libraries/wyedit/EditorToolBar.cpp
index bb55d30d5..96481891e 100644
--- a/app/src/libraries/wyedit/EditorToolBar.cpp
+++ b/app/src/libraries/wyedit/EditorToolBar.cpp
@@ -293,6 +293,12 @@ void EditorToolBar::setupToolBarTools(void)
tableProperties->setIcon(QIcon(":/resource/pic/edit_table_properties.svg"));
tableProperties->setObjectName("editor_tb_tableProperties");
+ // Кнопка открытия изображения
+ openImage=new QAction(this);
+ openImage->setIcon(QIcon(":/resource/pic/open_image.svg"));
+ openImage->setObjectName("editor_tb_openImage");
+
+ // Кнопка вставки / редактирования свойств изображения
insertImageFromFile=new QAction(this);
insertImageFromFile->setIcon(QIcon(":/resource/pic/edit_insert_image_from_file.svg"));
insertImageFromFile->setObjectName("editor_tb_insertImageFromFile");
@@ -378,7 +384,7 @@ void EditorToolBar::setupShortcuts(void)
shortcutManager.initAction("editor-backgroundColor", backgroundColor);
// Настраиваются скрытые кнопки действия, а надписи настраиваются для самого виджета
- // Скрытые кнопки нужны чтобы работал выбор виджета по грячим кнопкам
+ // Скрытые кнопки нужны чтобы работал выбор виджета по горячим кнопкам
shortcutManager.initAction("editor-fontSelect", fontSelect->toolFocus.getSelectAction() );
fontSelect->setStatusTip( shortcutManager.getFullDescription("editor-fontSelect") );
fontSelect->setToolTip( shortcutManager.getDescriptionWithShortcut("editor-fontSelect") );
@@ -400,6 +406,7 @@ void EditorToolBar::setupShortcuts(void)
shortcutManager.initAction("editor-tableMergeCells", tableMergeCells);
shortcutManager.initAction("editor-tableSplitCell", tableSplitCell);
shortcutManager.initAction("editor-tableProperties", tableProperties);
+ shortcutManager.initAction("editor-openImage", openImage);
shortcutManager.initAction("editor-insertImageFromFile", insertImageFromFile);
shortcutManager.initAction("editor-insertHorizontalLine", insertHorizontalLine);
shortcutManager.initAction("editor-mathExpression", mathExpression);
diff --git a/app/src/libraries/wyedit/EditorToolBar.h b/app/src/libraries/wyedit/EditorToolBar.h
index b6865459b..dbd23f48b 100644
--- a/app/src/libraries/wyedit/EditorToolBar.h
+++ b/app/src/libraries/wyedit/EditorToolBar.h
@@ -82,6 +82,7 @@ class EditorToolBar : public QWidget
QAction *tableSplitCell;
QAction *tableProperties;
+ QAction *openImage;
QAction *insertImageFromFile;
QAction *insertHorizontalLine;
QAction *mathExpression;
diff --git a/app/src/libraries/wyedit/formatters/ImageFormatter.cpp b/app/src/libraries/wyedit/formatters/ImageFormatter.cpp
index 3c268a40f..b2f483c5a 100644
--- a/app/src/libraries/wyedit/formatters/ImageFormatter.cpp
+++ b/app/src/libraries/wyedit/formatters/ImageFormatter.cpp
@@ -1,6 +1,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -19,6 +20,7 @@
#include "main.h"
#include "libraries//Downloader.h"
#include "libraries/helpers/UniqueIdHelper.h"
+#include "libraries/helpers/MessageHelper.h"
ImageFormatter::ImageFormatter()
@@ -55,6 +57,35 @@ QTextImageFormat ImageFormatter::imageFormatOnCursor(void)
}
+void ImageFormatter::openImage()
+{
+ // Данные обрабатываемой картинки
+ QTextImageFormat imageFormat;
+
+ // Если выбрано изображение
+ if(editor->cursorPositionDetector->isImageSelect()) {
+ imageFormat=imageFormatOnSelect();
+ }
+ else if(editor->cursorPositionDetector->isCursorOnImage()) {
+ // Если изображение не выбрано, но курсор находится в позиции изображения
+ imageFormat=imageFormatOnCursor();
+ }
+
+ // Имя картинки в ресурсах документа
+ QString imageName=imageFormat.name();
+
+ // Выясняется путь к файлу
+ QString fullDir = editor->getWorkDirectory();
+ QString fullFileName = fullDir+"/"+imageName;
+
+ qDebug() << "Open image file: "+fullFileName;
+
+ // Открытие файла средствами операционной системы
+ QUrl urlFileName("file:"+fullFileName);
+ QDesktopServices::openUrl(urlFileName);
+}
+
+
void ImageFormatter::editImageProperties(void)
{
// Для картинки с формулой свойства изображения редактироваться не должны
@@ -259,6 +290,26 @@ void ImageFormatter::onInsertImageFromFileClicked(void)
}
+// Вызов открытия изображения
+void ImageFormatter::onContextMenuOpenImage()
+{
+ // Для картинки с формулой свойства изображения редактироваться не должны
+ if(editor->cursorPositionDetector->isMathExpressionSelect() ||
+ editor->cursorPositionDetector->isCursorOnMathExpression()) {
+ return;
+ }
+
+ // Если выделена картинка
+ if(editor->cursorPositionDetector->isImageSelect() ||
+ editor->cursorPositionDetector->isCursorOnImage())
+ {
+ qDebug() << "Open image selected";
+
+ openImage();
+ }
+}
+
+
// Вызов окна настройки свойств изображения
void ImageFormatter::onContextMenuEditImageProperties()
{
@@ -272,13 +323,19 @@ void ImageFormatter::onContextMenuEditImageProperties()
if(editor->cursorPositionDetector->isImageSelect() ||
editor->cursorPositionDetector->isCursorOnImage())
{
- qDebug() << "Image selected";
+ qDebug() << "Edit image selected";
editImageProperties();
}
}
+void ImageFormatter::onClickOnImage(void)
+{
+ openImage();
+}
+
+
void ImageFormatter::onDoubleClickOnImage(void)
{
onContextMenuEditImageProperties();
diff --git a/app/src/libraries/wyedit/formatters/ImageFormatter.h b/app/src/libraries/wyedit/formatters/ImageFormatter.h
index b60f52d84..5435bf4f3 100644
--- a/app/src/libraries/wyedit/formatters/ImageFormatter.h
+++ b/app/src/libraries/wyedit/formatters/ImageFormatter.h
@@ -20,6 +20,7 @@ class ImageFormatter : public Formatter
QTextImageFormat imageFormatOnSelect(void);
QTextImageFormat imageFormatOnCursor(void);
+ void openImage();
void editImageProperties(void);
signals:
@@ -31,10 +32,12 @@ class ImageFormatter : public Formatter
public slots:
void onInsertImageFromFileClicked(void);
+ void onContextMenuOpenImage();
void onContextMenuEditImageProperties(void);
void onDownloadImages(const QString html);
+ void onClickOnImage();
void onDoubleClickOnImage(void);
};