Support hotkey for context help window.

Улучшена поддержка клавиши для навигации в контекстной справке.
Краткий список:
PAGEDOWN,PAGEUP,UP,DOWN,HOME,END - скроллинг окна.
+ - увеличить размер окна.
S - screenshot контекстной справки.
C - копирование в html формате.
This commit is contained in:
lsv 2026-04-13 15:03:25 +05:00
parent a0ff59ae98
commit d47a0fb61c
3 changed files with 130 additions and 130 deletions

View file

@ -685,12 +685,12 @@ void ctlSQLBox::OnFuncHelp(wxCommandEvent& ev) {
if (bigtext) {
rr.x=(int) sizeScreen.x*0.8;rr.y=sizeScreen.y*0.7;
}
m_PopupHelp = new popuphelp(this->GetParent(), key, fh,p,rr);
m_PopupHelp = new popuphelp(this, key, fh,p,rr);
if (m_PopupHelp && m_PopupHelp->IsValid() && rr != m_PopupHelp->GetSizePopup() && !bigtext) {
// recreate with new size
rr = m_PopupHelp->GetSizePopup();
delete m_PopupHelp;
m_PopupHelp = new popuphelp(this->GetParent(), key, fh, p, rr);
m_PopupHelp = new popuphelp(this, key, fh, p, rr);
}
if (m_PopupHelp && m_PopupHelp->IsValid()) {

View file

@ -991,7 +991,7 @@ void ctlSQLGrid::OnShowPopup(wxThreadEvent& event) {
// recreate with new size
rr = m_Popup->GetSizePopup();
delete m_Popup;
m_Popup = new popuphelp((wxWindow*)winMain, key, &fh, p, rr);
m_Popup = new popuphelp(this, key, &fh, p, rr);
}
if (m_Popup && m_Popup->IsValid()) {

View file

@ -37,7 +37,99 @@ public:
sizew = sz;
}
wxSize GetSizePopup() { return sizew; }
popuphelp(wxWindow* parent,wxString keyword, FunctionPGHelper *hhelper,wxPoint &posit,wxSize &newSz) : wxPopupTransientWindow(parent) {
void keyProcessing(wxKeyEvent& event) {
if (event.GetKeyCode() == WXK_ESCAPE) {
Hide();
event.Skip();
return;
}
if (event.GetKeyCode() == WXK_NUMPAD_ADD) {
wxSize sz = this->GetSize();
wxSize szh = htmlWindow->GetSize();
int xx, yy;
htmlWindow->GetVirtualSize(&xx, &yy);
wxPoint p = GetScreenPosition();
wxSize sizeScreen = getScreenSizeForPoint(p);
if (yy > szh.y) {
if (p.y + sz.y + 50 < sizeScreen.y)
sz.y += 50;
else
if (p.y > 50) { p.y = p.y - 50; sz.y += 50; }
}
if (p.x + sz.x + 50 < sizeScreen.x)
sz.x += 50;
else
if (p.x > 50) { p.x = p.x - 50; sz.x += 50; }
SetSize(p.x, p.y, sz.x, sz.y, wxSIZE_USE_EXISTING);
Layout();
wxSize newsz = GetSize();
//std::cout << sz.GetWidth() << "," << sz.GetHeight() << " new: " << newsz.GetWidth() << "," << newsz.GetHeight() << std::endl;
}
if (event.GetKeyCode() == WXK_PAGEDOWN) htmlWindow->ScrollPages(1);
if (event.GetKeyCode() == WXK_PAGEUP) htmlWindow->ScrollPages(-1);
if (event.GetKeyCode() == WXK_DOWN) htmlWindow->ScrollLines(1);
if (event.GetKeyCode() == WXK_UP) htmlWindow->ScrollLines(-1);
if (event.GetKeyCode() == WXK_HOME) htmlWindow->ScrollPages(-1000);
if (event.GetKeyCode() == WXK_END) htmlWindow->ScrollPages(1000);
//std::cout << "key code " << event.GetKeyCode() << " " << std::endl;
if (event.GetKeyCode() == 'C' && hist.size() > 0) {
if (wxTheClipboard->Open())
{
wxString h = hist[hist.size() - 1];
// Добавляем данные (можно добавить несколько форматов, если нужно)
wxDataObjectComposite* dataobj = new wxDataObjectComposite();
dataobj->Add(new wxHTMLDataObject(h));
wxTheClipboard->SetData(dataobj);
// fix for linux app crush
wxSafeYield();
wxTheClipboard->Close(); // crush app without wxSafeYield();
}
else
{
wxLogError("No open clipboard.");
}
}
if (event.GetKeyCode() == 'S') {
wxSize clientSize = this->GetClientSize();
// Создаём битмап того же размера
wxBitmap bitmap(clientSize.x, clientSize.y, -1); // -1 — лучший формат для экрана
// Создаём DC для рисования в битмап
wxMemoryDC memDC;
memDC.SelectObject(bitmap);
// Очищаем фон (опционально, если окно не полностью перерисовано)
memDC.SetBackground(*wxWHITE_BRUSH);
memDC.Clear();
// Используем wxClientDC для чтения содержимого окна
wxClientDC clientDC(this);
// Переносим данные с clientDC в memDC (копируем прямоугольник)
// Важно: координаты — относительно окна!
memDC.Blit(0, 0, clientSize.x, clientSize.y, &clientDC, 0, 0);
// Освобождаем DC
memDC.SelectObject(wxNullBitmap);
// Открываем буфер обмена
if (wxTheClipboard->Open())
{
// Добавляем данные (можно добавить несколько форматов, если нужно)
wxTheClipboard->SetData(new wxBitmapDataObject(bitmap));
wxTheClipboard->Close();
}
else
{
wxLogError("No open clipboard.");
}
}
};
popuphelp(wxWindow* parent,wxString keyword, FunctionPGHelper *hhelper,wxPoint &posit,wxSize &newSz) : wxPopupTransientWindow(parent, wxPU_CONTAINS_CONTROLS| wxBORDER_NONE) {
wxSize top_sz(newSz);
sizew = top_sz;
//SetSize(top_sz);
@ -158,99 +250,7 @@ public:
//ctext=htmlWindow->SelectionToText();
//wxString s = wxString::Format("cell = %s",ctext.c_str());
});
htmlWindow->Bind(wxEVT_KEY_DOWN, [&](wxKeyEvent& event) {
if (event.GetKeyCode() == WXK_ESCAPE) {
Hide();
event.Skip();
return;
}
if (event.GetKeyCode() == WXK_NUMPAD_ADD) {
wxSize sz=this->GetSize();
wxSize szh=htmlWindow->GetSize();
int xx, yy;
htmlWindow->GetVirtualSize(&xx, &yy);
wxPoint p=GetScreenPosition();
wxSize sizeScreen=getScreenSizeForPoint(p);
if (yy>szh.y) {
if (p.y+sz.y +50 <sizeScreen.y)
sz.y+=50;
else
if (p.y>50) {p.y=p.y-50; sz.y+=50;}
}
if (p.x+sz.x +50 <sizeScreen.x)
sz.x+=50;
else
if (p.x>50) {p.x=p.x-50; sz.x+=50;}
SetSize(p.x,p.y,sz.x,sz.y,wxSIZE_USE_EXISTING);
Layout();
wxSize newsz=GetSize();
//std::cout << sz.GetWidth() << "," << sz.GetHeight() << " new: " << newsz.GetWidth() << "," << newsz.GetHeight() << std::endl;
}
if (event.GetKeyCode() == WXK_PAGEDOWN) htmlWindow->ScrollPages(1);
if (event.GetKeyCode() == WXK_PAGEUP) htmlWindow->ScrollPages(-1);
if (event.GetKeyCode() == WXK_DOWN) htmlWindow->ScrollLines(1);
if (event.GetKeyCode() == WXK_UP) htmlWindow->ScrollLines(-1);
if (event.GetKeyCode() == WXK_HOME) htmlWindow->ScrollPages(-1000);
if (event.GetKeyCode() == WXK_END) htmlWindow->ScrollPages(1000);
//std::cout << "key code " << event.GetKeyCode() << " " << std::endl;
if (event.GetKeyCode() == 'C' && hist.size()>0) {
if (wxTheClipboard->Open())
{
wxString h=hist[hist.size()-1];
// Добавляем данные (можно добавить несколько форматов, если нужно)
wxDataObjectComposite* dataobj = new wxDataObjectComposite();
dataobj->Add(new wxHTMLDataObject(h));
wxTheClipboard->SetData(dataobj);
// fix for linux app crush
wxSafeYield();
wxTheClipboard->Close(); // crush app without wxSafeYield();
}
else
{
wxLogError("No open clipboard.");
}
}
if (event.GetKeyCode() == 'S') {
wxSize clientSize = this->GetClientSize();
// Создаём битмап того же размера
wxBitmap bitmap(clientSize.x, clientSize.y, -1); // -1 — лучший формат для экрана
// Создаём DC для рисования в битмап
wxMemoryDC memDC;
memDC.SelectObject(bitmap);
// Очищаем фон (опционально, если окно не полностью перерисовано)
memDC.SetBackground(*wxWHITE_BRUSH);
memDC.Clear();
// Используем wxClientDC для чтения содержимого окна
wxClientDC clientDC(this);
// Переносим данные с clientDC в memDC (копируем прямоугольник)
// Важно: координаты — относительно окна!
memDC.Blit(0, 0, clientSize.x, clientSize.y, &clientDC, 0, 0);
// Освобождаем DC
memDC.SelectObject(wxNullBitmap);
// Открываем буфер обмена
if (wxTheClipboard->Open())
{
// Добавляем данные (можно добавить несколько форматов, если нужно)
wxDataObjectComposite* dataobj = new wxDataObjectComposite();
dataobj->Add(new wxBitmapDataObject(bitmap));
wxTheClipboard->SetData(dataobj);
wxTheClipboard->Close();
}
else
{
wxLogError("No open clipboard.");
}
}
});
Bind(wxEVT_CHAR_HOOK, &popuphelp::keyProcessing,this);
htmlWindow->Bind(wxEVT_RIGHT_UP, [&](wxMouseEvent& event) {
wxString name;
wxLongLong e = wxGetLocalTimeMillis();