Skip to content

Commit

Permalink
Improve review mode toolbar positioning
Browse files Browse the repository at this point in the history
  • Loading branch information
dimkanovikov committed Jan 13, 2025
1 parent 4ce9379 commit 3b57064
Show file tree
Hide file tree
Showing 12 changed files with 190 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,7 @@ void AudioplayTextView::Implementation::updateCommentsToolbar(bool _force)
commentsToolbar->setMode(CommentsToolbar::Mode::AddReview);
}


//
// Настроим доступность действий добавления редакторских заметок
//
Expand All @@ -438,6 +439,23 @@ void AudioplayTextView::Implementation::updateCommentsToolbar(bool _force)
const auto globalCursorCenter = textEdit->mapToGlobal(cursorRect.center());
const auto localCursorCenter
= commentsToolbar->parentWidget()->mapFromGlobal(globalCursorCenter);
//
// ... если курсор не виден на экране, то тулбар нужно скрыть
//
const bool isToolbarVisible = localCursorCenter.y() >= 0
&& localCursorCenter.y()
< scalableWrapper->height() - audioplayTextScrollbarManager->scrollBarHeight();

//
// Определеим положение тулбара, с учётом края экрана
//
auto toolbarYPos = localCursorCenter.y() - commentsToolbar->width();
if (toolbarYPos + commentsToolbar->height()
> scalableWrapper->height() - audioplayTextScrollbarManager->scrollBarHeight()) {
toolbarYPos = scalableWrapper->height() - commentsToolbar->height()
- audioplayTextScrollbarManager->scrollBarHeight();
}

//
// Если вьюпорт вмещается аккурат в видимую область, или не влезает,
//
Expand All @@ -451,7 +469,7 @@ void AudioplayTextView::Implementation::updateCommentsToolbar(bool _force)
QPoint(q->isLeftToRight() ? (scalableWrapper->width() - commentsToolbar->width()
+ DesignSystem::layout().px(3))
: (sidebarWidget->width() - DesignSystem::layout().px(3)),
localCursorCenter.y() - commentsToolbar->width()),
toolbarYPos),
_force);
}
//
Expand Down Expand Up @@ -481,14 +499,17 @@ void AudioplayTextView::Implementation::updateCommentsToolbar(bool _force)
//
// ... и смещаем панель рецензирования к этой точке
//
commentsToolbar->moveToolbar(QPoint(pos, localCursorCenter.y() - commentsToolbar->width()),
_force);
commentsToolbar->moveToolbar(QPoint(pos, toolbarYPos), _force);
}

//
// Если панель ещё не была показана, отобразим её
//
commentsToolbar->showToolbar();
if (isToolbarVisible) {
commentsToolbar->showToolbar();
} else {
commentsToolbar->hideToolbar();
}
}

void AudioplayTextView::Implementation::updateSideBarVisibility(QWidget* _container)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,11 @@ void AudioplayTextScrollBarManager::setScrollBarVisible(bool _visible, bool _ani
}
}

int AudioplayTextScrollBarManager::scrollBarHeight() const
{
return d->timeline->height();
}

bool AudioplayTextScrollBarManager::eventFilter(QObject* _watched, QEvent* _event)
{
//
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ class AudioplayTextScrollBarManager : public QObject
*/
void setScrollBarVisible(bool _visible, bool _animate = true);

/**
* @brief Высота скролбара
*/
int scrollBarHeight() const;

/**
* @brief Ловим события об изменении размера родивиджета,
* для коррктировки положения и размера таймлайна
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,20 @@ void ComicBookTextView::Implementation::updateCommentsToolbar(bool _force)
const auto globalCursorCenter = textEdit->mapToGlobal(cursorRect.center());
const auto localCursorCenter
= commentsToolbar->parentWidget()->mapFromGlobal(globalCursorCenter);
//
// ... если курсор не виден на экране, то тулбар нужно скрыть
//
const bool isToolbarVisible
= localCursorCenter.y() >= 0 && localCursorCenter.y() < scalableWrapper->height();

//
// Определеим положение тулбара, с учётом края экрана
//
auto toolbarYPos = localCursorCenter.y() - commentsToolbar->width();
if (toolbarYPos + commentsToolbar->height() > scalableWrapper->height()) {
toolbarYPos = scalableWrapper->height() - commentsToolbar->height();
}

//
// Если вьюпорт вмещается аккурат в видимую область, или не влезает,
//
Expand All @@ -443,7 +457,7 @@ void ComicBookTextView::Implementation::updateCommentsToolbar(bool _force)
QPoint(q->isLeftToRight() ? (scalableWrapper->width() - commentsToolbar->width()
+ DesignSystem::layout().px(3))
: (sidebarWidget->width() - DesignSystem::layout().px(3)),
localCursorCenter.y() - commentsToolbar->width()),
toolbarYPos),
_force);
}
//
Expand Down Expand Up @@ -473,14 +487,17 @@ void ComicBookTextView::Implementation::updateCommentsToolbar(bool _force)
//
// ... и смещаем панель рецензирования к этой точке
//
commentsToolbar->moveToolbar(QPoint(pos, localCursorCenter.y() - commentsToolbar->width()),
_force);
commentsToolbar->moveToolbar(QPoint(pos, toolbarYPos), _force);
}

//
// Если панель ещё не была показана, отобразим её
//
commentsToolbar->showToolbar();
if (isToolbarVisible) {
commentsToolbar->showToolbar();
} else {
commentsToolbar->hideToolbar();
}
}

void ComicBookTextView::Implementation::updateSideBarVisibility(QWidget* _container)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,20 @@ void NovelOutlineView::Implementation::updateCommentsToolbar(bool _force)
const auto globalCursorCenter = textEdit->mapToGlobal(cursorRect.center());
const auto localCursorCenter
= commentsToolbar->parentWidget()->mapFromGlobal(globalCursorCenter);
//
// ... если курсор не виден на экране, то тулбар нужно скрыть
//
const bool isToolbarVisible
= localCursorCenter.y() >= 0 && localCursorCenter.y() < scalableWrapper->height();

//
// Определеим положение тулбара, с учётом края экрана
//
auto toolbarYPos = localCursorCenter.y() - commentsToolbar->width();
if (toolbarYPos + commentsToolbar->height() > scalableWrapper->height()) {
toolbarYPos = scalableWrapper->height() - commentsToolbar->height();
}

//
// Если вьюпорт вмещается аккурат в видимую область, или не влезает,
//
Expand All @@ -475,7 +489,7 @@ void NovelOutlineView::Implementation::updateCommentsToolbar(bool _force)
QPoint(q->isLeftToRight() ? (scalableWrapper->width() - commentsToolbar->width()
+ DesignSystem::layout().px(3))
: (sidebarWidget->width() - DesignSystem::layout().px(3)),
localCursorCenter.y() - commentsToolbar->width()),
toolbarYPos),
_force);
}
//
Expand Down Expand Up @@ -505,14 +519,17 @@ void NovelOutlineView::Implementation::updateCommentsToolbar(bool _force)
//
// ... и смещаем панель рецензирования к этой точке
//
commentsToolbar->moveToolbar(QPoint(pos, localCursorCenter.y() - commentsToolbar->width()),
_force);
commentsToolbar->moveToolbar(QPoint(pos, toolbarYPos), _force);
}

//
// Если панель ещё не была показана, отобразим её
//
commentsToolbar->showToolbar();
if (isToolbarVisible) {
commentsToolbar->showToolbar();
} else {
commentsToolbar->hideToolbar();
}
}

void NovelOutlineView::Implementation::updateSideBarVisibility(QWidget* _container)
Expand Down
25 changes: 21 additions & 4 deletions src/core/management_layer/plugins/novel_text/novel_text_view.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,20 @@ void NovelTextView::Implementation::updateCommentsToolbar(bool _force)
const auto globalCursorCenter = textEdit->mapToGlobal(cursorRect.center());
const auto localCursorCenter
= commentsToolbar->parentWidget()->mapFromGlobal(globalCursorCenter);
//
// ... если курсор не виден на экране, то тулбар нужно скрыть
//
const bool isToolbarVisible
= localCursorCenter.y() >= 0 && localCursorCenter.y() < scalableWrapper->height();

//
// Определеим положение тулбара, с учётом края экрана
//
auto toolbarYPos = localCursorCenter.y() - commentsToolbar->width();
if (toolbarYPos + commentsToolbar->height() > scalableWrapper->height()) {
toolbarYPos = scalableWrapper->height() - commentsToolbar->height();
}

//
// Если вьюпорт вмещается аккурат в видимую область, или не влезает,
//
Expand All @@ -493,7 +507,7 @@ void NovelTextView::Implementation::updateCommentsToolbar(bool _force)
QPoint(q->isLeftToRight() ? (scalableWrapper->width() - commentsToolbar->width()
+ DesignSystem::layout().px(3))
: (sidebarWidget->width() - DesignSystem::layout().px(3)),
localCursorCenter.y() - commentsToolbar->width()),
toolbarYPos),
_force);
}
//
Expand Down Expand Up @@ -523,14 +537,17 @@ void NovelTextView::Implementation::updateCommentsToolbar(bool _force)
//
// ... и смещаем панель рецензирования к этой точке
//
commentsToolbar->moveToolbar(QPoint(pos, localCursorCenter.y() - commentsToolbar->width()),
_force);
commentsToolbar->moveToolbar(QPoint(pos, toolbarYPos), _force);
}

//
// Если панель ещё не была показана, отобразим её
//
commentsToolbar->showToolbar();
if (isToolbarVisible) {
commentsToolbar->showToolbar();
} else {
commentsToolbar->hideToolbar();
}
}

void NovelTextView::Implementation::updateSideBarVisibility(QWidget* _container)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,23 @@ void ScreenplayTextView::Implementation::updateCommentsToolbar(bool _force)
const auto globalCursorCenter = textEdit->mapToGlobal(cursorRect.center());
const auto localCursorCenter
= commentsToolbar->parentWidget()->mapFromGlobal(globalCursorCenter);
//
// ... если курсор не виден на экране, то тулбар нужно скрыть
//
const bool isToolbarVisible = localCursorCenter.y() >= 0
&& localCursorCenter.y()
< scalableWrapper->height() - screenplayTextScrollbarManager->scrollBarHeight();

//
// Определеим положение тулбара, с учётом края экрана
//
auto toolbarYPos = localCursorCenter.y() - commentsToolbar->width();
if (toolbarYPos + commentsToolbar->height()
> scalableWrapper->height() - screenplayTextScrollbarManager->scrollBarHeight()) {
toolbarYPos = scalableWrapper->height() - commentsToolbar->height()
- screenplayTextScrollbarManager->scrollBarHeight();
}

//
// Если вьюпорт вмещается аккурат в видимую область, или не влезает,
//
Expand All @@ -546,7 +563,7 @@ void ScreenplayTextView::Implementation::updateCommentsToolbar(bool _force)
QPoint(q->isLeftToRight() ? (scalableWrapper->width() - commentsToolbar->width()
+ DesignSystem::layout().px(3))
: (sidebarWidget->width() - DesignSystem::layout().px(3)),
localCursorCenter.y() - commentsToolbar->width()),
toolbarYPos),
_force);
}
//
Expand Down Expand Up @@ -576,14 +593,17 @@ void ScreenplayTextView::Implementation::updateCommentsToolbar(bool _force)
//
// ... и смещаем панель рецензирования к этой точке
//
commentsToolbar->moveToolbar(QPoint(pos, localCursorCenter.y() - commentsToolbar->width()),
_force);
commentsToolbar->moveToolbar(QPoint(pos, toolbarYPos), _force);
}

//
// Если панель ещё не была показана, отобразим её
//
commentsToolbar->showToolbar();
if (isToolbarVisible) {
commentsToolbar->showToolbar();
} else {
commentsToolbar->hideToolbar();
}
}

void ScreenplayTextView::Implementation::updateSideBarVisibility(QWidget* _container)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,10 +211,7 @@ void ScreenplayTextScrollBarManager::setScrollBarVisible(bool _visible, bool _an
}
}

int ScreenplayTextScrollBarManager::scrollBarWidth() const
{
return d->timeline->width();
}


bool ScreenplayTextScrollBarManager::eventFilter(QObject* _watched, QEvent* _event)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ class ScreenplayTextModel;
namespace Ui {

/**
* @brief Управляющий скролбаром сценария
* @brief Управляющий таймлайном сценария
* @note Тут хитрая тема, т.к. по-сути скролбар не может иметь фиксированного размера ползунка,
* являя собой процентное представление возможности прокрутки документа, будем использовать
* ухищрение в виде невидимого скролбара, который устанавливается непосредственно в виджет
* и видимого таймлайна, который будет прилипать к правой стороне виджета и действовать
* синхронно с невидимым скролбаром для управления самим виджетом
* синхронно со скролбаром для управления самим виджетом
*/
class ScreenplayTextScrollBarManager : public QObject
{
Expand All @@ -44,9 +44,9 @@ class ScreenplayTextScrollBarManager : public QObject
void setScrollBarVisible(bool _visible, bool _animate = true);

/**
* @brief Ширина скролбара
* @brief Высота скролбара
*/
int scrollBarWidth() const;
int scrollBarHeight() const;

/**
* @brief Ловим события об изменении размера родивиджета,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,20 @@ void ScreenplayTreatmentView::Implementation::updateCommentsToolbar(bool _force)
const auto globalCursorCenter = textEdit->mapToGlobal(cursorRect.center());
const auto localCursorCenter
= commentsToolbar->parentWidget()->mapFromGlobal(globalCursorCenter);
//
// ... если курсор не виден на экране, то тулбар нужно скрыть
//
const bool isToolbarVisible
= localCursorCenter.y() >= 0 && localCursorCenter.y() < scalableWrapper->height();

//
// Определеим положение тулбара, с учётом края экрана
//
auto toolbarYPos = localCursorCenter.y() - commentsToolbar->width();
if (toolbarYPos + commentsToolbar->height() > scalableWrapper->height()) {
toolbarYPos = scalableWrapper->height() - commentsToolbar->height();
}

//
// Если вьюпорт вмещается аккурат в видимую область, или не влезает,
//
Expand All @@ -505,7 +519,7 @@ void ScreenplayTreatmentView::Implementation::updateCommentsToolbar(bool _force)
QPoint(q->isLeftToRight() ? (scalableWrapper->width() - commentsToolbar->width()
+ DesignSystem::layout().px(3))
: (sidebarWidget->width() - DesignSystem::layout().px(3)),
localCursorCenter.y() - commentsToolbar->width()),
toolbarYPos),
_force);
}
//
Expand Down Expand Up @@ -535,14 +549,17 @@ void ScreenplayTreatmentView::Implementation::updateCommentsToolbar(bool _force)
//
// ... и смещаем панель рецензирования к этой точке
//
commentsToolbar->moveToolbar(QPoint(pos, localCursorCenter.y() - commentsToolbar->width()),
_force);
commentsToolbar->moveToolbar(QPoint(pos, toolbarYPos), _force);
}

//
// Если панель ещё не была показана, отобразим её
//
commentsToolbar->showToolbar();
if (isToolbarVisible) {
commentsToolbar->showToolbar();
} else {
commentsToolbar->hideToolbar();
}
}

void ScreenplayTreatmentView::Implementation::updateSideBarVisibility(QWidget* _container)
Expand Down
Loading

0 comments on commit 3b57064

Please sign in to comment.