, много раз нажимая ShiftF7 (next search) и в конце строки - переход на короткую строку, но экран не оцентровался, остался на уровне "слепой зоны" (со сильным смещением куда-то вправо) с микроскопическим куском найденного текста, и не понятно, про что это и в какой части программы. Дезориентирует. Приходилось лишний раз нажимать "home", чтобы вручную оцентровать экран и понять местонахождения, нахожусь ли в той же функции или уже вышел за порогом к другой функции.
Viewer:
в Viewer.cpp не завезли "центровку".
Решение:
1) видимый экран смещать в начальное положение, если найденный фрагмент в пределах ширины экрана
2) видимый экран центровать в середину, если найденный фрагмент находится за экраном вправо.
Проблема 2:
Editor:
Изучая editor.cpp, понятно, что есть отступ с фиксированной величины 8 знаков (без/с Scrollbar). Это норм для "дефолтных 80х25". Но довольно тесно для широких 120х35.
Viewer:
в Viewer.cpp не завезли "отступ 8 знаков".
Например, при поиске, найденный *. может скрываться за Far'>' и скроллбаром
Решение:
1) Динамический отступ, где для 80х25 - остается 8 знаков (для сохранения аутентичности), для 120х35 - отступ 12 знаков (по формуле "ширина/10") - так немного комфортнее. Пробовал сильнее "задвинуть", но появляется неприятные побочки, например, задний поиск AltF7 - "центровка" экрана лишний раз норовит задвинутся, когда этого не требовалось. Поэтому формула "ширина/10" скорее всего оптимальнее.
Правка:
в функцию Editor::Search(bool Next) добавить новый блок:
for ([[maybe_unused]] const auto i: std::views::iota(0, FromTop))
{
if (TmpPtr != Lines.begin())
--TmpPtr;
else
break;
}
m_it_TopScreen=TmpPtr;
const auto TabCurPos = CurPtr->GetTabCurPos();
// if (TabCurPos + SearchLength + 8 > CurPtr->GetLeftPos() + ObjWidth())
// CurPtr->SetLeftPos(TabCurPos + SearchLength + 8 - ObjWidth());
//=========== new center screen ========================
const int ComfortWidth = ObjWidth() - std::max(8, ObjWidth() / 10); // 72 for 80x25 (margin 8 letters)
if (TabCurPos + SearchLength <= ComfortWidth) // фрагмент в пределах ширины экрана (до 72 знака)
{
CurPtr->SetLeftPos(0);
}
else // фрагмент за экраном -> центруем
{
CurPtr->SetLeftPos(std::max<long long>(TabCurPos + SearchLength / 2 - ObjWidth() / 2, 0LL));
}
//========== end center screen ========================
const auto CurLineCopy = m_it_CurLine;
в конце функции Viewer::ShowPage(int nMode)
вставить новый блок:
if (SelectSize >= 0 && i.bSelection)
{
long long SelX1;
if (LeftPos > i.nSelStart)
SelX1 = m_Where.left;
else
SelX1 = i.nSelStart - LeftPos;
//=========== new center screen ========================
if (!m_Wrap && AdjustSelPosition)
{
const int ComfortWidth = ObjWidth() - std::max(8, ObjWidth()/10); // 72 for 80x25 (margin 8 letters)
if (i.nSelStart + SelectSize <= ComfortWidth) // фрагмент в пределах ширины экрана (до 72 знака)
{
LeftPos = 0;
}
else // фрагмент за экраном -> центруем
{
LeftPos = std::max<long long>(i.nSelStart + SelectSize/2 - ObjWidth()/2, 0LL);
}
AdjustSelPosition = false;
Show();
return;
}
//========== end center screen ========================
if (!m_Wrap && (i.nSelEnd < LeftPos || i.nSelStart >= LeftPos + ScrollbarAdjustedWidth))
{
if (AdjustSelPosition)
{
LeftPos = std::max(i.nSelStart - 1, 0LL);
AdjustSelPosition = false;
Show();
return;
}
}
else
{
SetColor(COL_VIEWERSELECTEDTEXT);
GotoXY(static_cast<int>(m_Where.left + SelX1), Y);
long long Length = i.nSelEnd - i.nSelStart;
if (LeftPos > i.nSelStart)
Length = i.nSelEnd - LeftPos;
if (LeftPos > i.nSelEnd)
Length = 0;
Text(cut_right(i.Data.substr(SelX1 + LeftPos), Length));
}
}
почему-то здесь табуляция нарушена, хотя копипастил без изменения.
данный блок может работать для v5700 и v6680
Если нет возражении, то возможно на след.недели сделаю аккаунт на github->pullrequest (хотя не знаю что там нужно делать)
Last edited by Ultrabyte on Wed 03 Jun, 2026 05:12, edited 5 times in total.