diff --git a/src/core/management_layer/content/project/project_manager.cpp b/src/core/management_layer/content/project/project_manager.cpp index 93a24a021..e5983c68b 100644 --- a/src/core/management_layer/content/project/project_manager.cpp +++ b/src/core/management_layer/content/project/project_manager.cpp @@ -1802,7 +1802,7 @@ ProjectManager::ProjectManager(QObject* _parent, QWidget* _parentWidget, continue; } - QString documentName = screenplay->informationModel()->name(); + auto documentName = screenplay->informationModel()->name(); if (const auto screenplayItem = d->projectStructureModel->itemForUuid(screenplay->document()->uuid()); screenplayItem->name() != tr("Screenplay")) { @@ -3495,9 +3495,23 @@ void ProjectManager::activateLink(const QUuid& _documentUuid, const QModelIndex& return; } - const auto sourceIndex = d->projectStructureModel->indexForItem(item); + auto sourceIndex = d->projectStructureModel->indexForItem(item); + constexpr int invalidVersionIndex = -1; + int versionIndex = invalidVersionIndex; if (!sourceIndex.isValid()) { - return; + const auto parent = item->parent(); + for (int childIndex = 0; childIndex < parent->childCount(); ++childIndex) { + const auto childItem = parent->childAt(childIndex); + if (childItem->versions().contains(item)) { + sourceIndex = d->projectStructureModel->indexForItem(childItem); + versionIndex = childItem->versions().indexOf(item) + 1; + break; + } + } + + if (!sourceIndex.isValid() || versionIndex == invalidVersionIndex) { + return; + } } const auto itemIndex = d->projectStructureProxyModel->mapFromSource(sourceIndex); @@ -3505,17 +3519,44 @@ void ProjectManager::activateLink(const QUuid& _documentUuid, const QModelIndex& return; } + // + // Откроем ссылку на элемент + // + const auto withActivation = false; + // + // ... если работаем в двухпанельном режиме, то открываем её во второй панели, при этом + // активируем вторую панель для установки в неё целевого документа без активации, чтобы это + // прошло незаметно для пользователя + // if (d->view.right->isVisible()) { - d->switchViews(false); + d->switchViews(withActivation); } d->navigator->setCurrentIndex(itemIndex); + // + // ... если нужно, активируем заданную версию + // + if (versionIndex != invalidVersionIndex) { + d->view.active->setCurrentVersion(versionIndex); + } + // + // ... если работаем с текущей версией, но редактор находится на другой, возвращаемся к текущей + // + else if (d->view.active->currentVersion() > 0) { + d->view.active->setCurrentVersion(0); + } + // + // ... фокусируем в представлении элемент с заданным индексом + // if (d->view.active == d->view.left) { d->pluginsBuilder.setViewCurrentIndex(_index, d->view.activeViewMimeType); } else { d->pluginsBuilder.setSecondaryViewCurrentIndex(_index, d->view.activeViewMimeType); } + // + // ... возвращаем активность на исходную панель + // if (d->view.right->isVisible()) { - d->switchViews(false); + d->switchViews(withActivation); } } diff --git a/src/core/management_layer/plugins/audioplay_text/audioplay_text_manager.cpp b/src/core/management_layer/plugins/audioplay_text/audioplay_text_manager.cpp index 4eca1fab0..9def4c71e 100644 --- a/src/core/management_layer/plugins/audioplay_text/audioplay_text_manager.cpp +++ b/src/core/management_layer/plugins/audioplay_text/audioplay_text_manager.cpp @@ -325,7 +325,11 @@ void AudioplayTextManager::resetModels() void AudioplayTextManager::reconfigure(const QStringList& _changedSettingsKeys) { - d->view->reconfigure(_changedSettingsKeys); + for (const auto& view : std::as_const(d->allViews)) { + if (!view.view.isNull()) { + view.view->reconfigure(_changedSettingsKeys); + } + } } void AudioplayTextManager::bind(IDocumentManager* _manager) diff --git a/src/core/management_layer/plugins/character_dialogues b/src/core/management_layer/plugins/character_dialogues index 1f5f2c115..c1ae5413f 160000 --- a/src/core/management_layer/plugins/character_dialogues +++ b/src/core/management_layer/plugins/character_dialogues @@ -1 +1 @@ -Subproject commit 1f5f2c1153ff0bc3f6662c2021074ec1a97f0742 +Subproject commit c1ae5413fa45e06245946da9cea97ec4b45e17f9 diff --git a/src/corelib/ui/widgets/tree/tree.cpp b/src/corelib/ui/widgets/tree/tree.cpp index c7892f91b..85b2b7bdb 100644 --- a/src/corelib/ui/widgets/tree/tree.cpp +++ b/src/corelib/ui/widgets/tree/tree.cpp @@ -196,6 +196,11 @@ QModelIndexList Tree::selectedIndexes() const return d->tree->selectionModel()->selectedIndexes(); } +void Tree::clearSelection() +{ + d->tree->clearSelection(); +} + void Tree::setExpandsOnDoubleClick(bool _expand) { d->tree->setExpandsOnDoubleClick(_expand); @@ -247,6 +252,11 @@ QHeaderView* Tree::headerView() const return d->tree->header(); } +QSize Tree::viewportSizeHint() const +{ + return d->tree->viewportSizeHint(); +} + void Tree::setEditTriggers(QAbstractItemView::EditTriggers _triggers) { d->tree->setEditTriggers(_triggers); diff --git a/src/corelib/ui/widgets/tree/tree.h b/src/corelib/ui/widgets/tree/tree.h index 1c0e6729b..6eb5b6d53 100644 --- a/src/corelib/ui/widgets/tree/tree.h +++ b/src/corelib/ui/widgets/tree/tree.h @@ -104,6 +104,11 @@ class CORE_LIBRARY_EXPORT Tree : public Widget */ QModelIndexList selectedIndexes() const; + /** + * @brief Очистить выделение + */ + void clearSelection(); + /** * @brief Задать возможность раскрывать узлы дерева двойным кликом */ @@ -141,6 +146,11 @@ class CORE_LIBRARY_EXPORT Tree : public Widget void setHeader(QHeaderView* _headerView); QHeaderView* headerView() const; + /** + * @brief Получить размер вьюпорта + */ + QSize viewportSizeHint() const; + /** * @brief Задать действия приводящие к редактированию элементов дерева */ diff --git a/src/corelib/ui/widgets/tree/tree_view.cpp b/src/corelib/ui/widgets/tree/tree_view.cpp index da23126ee..2b0230ff9 100644 --- a/src/corelib/ui/widgets/tree/tree_view.cpp +++ b/src/corelib/ui/widgets/tree/tree_view.cpp @@ -81,6 +81,11 @@ void TreeView::setAutoAdjustSize(bool _auto) d->adjustSizeAutomatically = _auto; } +QSize TreeView::viewportSizeHint() const +{ + return QTreeView::viewportSizeHint(); +} + void TreeView::restoreState(const QVariant& _state) { std::function readItem; diff --git a/src/corelib/ui/widgets/tree/tree_view.h b/src/corelib/ui/widgets/tree/tree_view.h index ef4dfe239..c04298cd9 100644 --- a/src/corelib/ui/widgets/tree/tree_view.h +++ b/src/corelib/ui/widgets/tree/tree_view.h @@ -21,6 +21,11 @@ class CORE_LIBRARY_EXPORT TreeView : public QTreeView */ void setAutoAdjustSize(bool _auto); + /** + * @brief Переопределяем метод, чтобы дать доступ к нему наружу + */ + QSize viewportSizeHint() const override; + /** * @brief Загрузить состояние дерева */