Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27c397e375 | ||
|
|
186621eb3c | ||
|
|
d3a0b83692 |
No files matched your search
@@ -2,6 +2,12 @@
|
||||
|
||||
Far Manager є зразком для оформлення файлового менеджера. Основне вікно використовує системний заголовок Windows. Панелі, меню й діалоги операцій використовують моноширинний шрифт менеджера та оформлення в стилі Far.
|
||||
|
||||
## Панелі
|
||||
|
||||
- Бірюзовий курсор поточного рядка видно лише в активній панелі. Кожна панель зберігає свою позицію курсора.
|
||||
|
||||
- Поточний шлях відображається по центру верхньої подвійної лінії панелі. Лінію видно з обох боків напису. Бірюзове тло активної панелі охоплює лише напис шляху з невеликими відступами. Довгий шлях скорочується в межах панелі.
|
||||
|
||||
## Спільні елементи діалогів
|
||||
|
||||
- Enter активує кнопку у фокусі. Для кнопок із власним малюванням використовуй спільний обробник `dialogButtonEnter`. У підтвердженні скасування початковий фокус стоїть на No.
|
||||
|
||||
+68
-8
@@ -1775,8 +1775,14 @@ LRESULT CALLBACK panelKeys(HWND window, UINT message, WPARAM wp, LPARAM lp, UINT
|
||||
return scrollList(window, message, wp == VK_LEFT ? VK_HOME : VK_END, lp);
|
||||
if (message == WM_SETFOCUS)
|
||||
{
|
||||
const auto previous=active;
|
||||
active = static_cast<int>(index);
|
||||
for (int i = 0; i < 2; ++i) InvalidateRect(panels[i].path, nullptr, TRUE);
|
||||
if(previous!=active)
|
||||
for(auto &panel:panels)
|
||||
{
|
||||
InvalidateRect(panel.path,nullptr,FALSE);
|
||||
InvalidateRect(panel.list,nullptr,FALSE);
|
||||
}
|
||||
showFileDetails(panels[index]);
|
||||
}
|
||||
if (message == WM_KEYDOWN)
|
||||
@@ -1979,8 +1985,8 @@ LRESULT CALLBACK filesWindow(HWND window, UINT message, WPARAM wp, LPARAM lp)
|
||||
for (int i = 0; i < 2; ++i)
|
||||
{
|
||||
auto &panel = panels[i];
|
||||
panel.path = CreateWindowW(L"STATIC", L"", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_PATHELLIPSIS,
|
||||
0, 0, 0, 0, window, nullptr, instance, nullptr);
|
||||
panel.path = CreateWindowW(L"STATIC", L"", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_OWNERDRAW,
|
||||
0, 0, 0, 0, window, reinterpret_cast<HMENU>(142 + static_cast<INT_PTR>(i)), instance, nullptr);
|
||||
panel.list = CreateWindowExW(0, L"LISTBOX", L"",
|
||||
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | LBS_NOTIFY | LBS_NOINTEGRALHEIGHT | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS,
|
||||
0, 0, 0, 0, window, reinterpret_cast<HMENU>(102 + static_cast<INT_PTR>(i)), instance, nullptr);
|
||||
@@ -2079,12 +2085,23 @@ LRESULT CALLBACK filesWindow(HWND window, UINT message, WPARAM wp, LPARAM lp)
|
||||
RECT box{};
|
||||
GetWindowRect(panel.list,&box);
|
||||
MapWindowPoints(nullptr,window,reinterpret_cast<POINT*>(&box),2);
|
||||
const LONG columnX=std::max(box.left,box.right-(sizeWidth+2)*static_cast<LONG>(cellWidth));
|
||||
box.right+=5;
|
||||
InflateRect(&box,2,2);
|
||||
RECT pathBounds{};
|
||||
GetWindowRect(panel.path,&pathBounds);
|
||||
MapWindowPoints(nullptr,window,reinterpret_cast<POINT*>(&pathBounds),2);
|
||||
box.top=pathBounds.top+(pathBounds.bottom-pathBounds.top)/2-2;
|
||||
FrameRect(dc,&box,border);
|
||||
paintScrollPosition(window,dc,panel.list,colors[PanelBlue]);
|
||||
InflateRect(&box,-1,-1);
|
||||
++box.top;
|
||||
FrameRect(dc,&box,border);
|
||||
if(panel.wide)
|
||||
{
|
||||
RECT column{columnX,box.top+1,columnX+1,pathBounds.bottom+6};
|
||||
FillRect(dc,&column,border);
|
||||
}
|
||||
}
|
||||
DeleteObject(border);
|
||||
EndPaint(window,&paint);
|
||||
@@ -2093,16 +2110,56 @@ LRESULT CALLBACK filesWindow(HWND window, UINT message, WPARAM wp, LPARAM lp)
|
||||
case WM_CTLCOLORSTATIC:
|
||||
{
|
||||
auto dc=reinterpret_cast<HDC>(wp);
|
||||
bool highlighted=reinterpret_cast<HWND>(lp)==panels[active].path;
|
||||
SetTextColor(dc,colors[highlighted?Text:Frame]);
|
||||
SetBkColor(dc,colors[highlighted?Dialog:PanelBlue]);
|
||||
return reinterpret_cast<LRESULT>(highlighted?teal:blue);
|
||||
SetTextColor(dc,colors[Frame]);
|
||||
SetBkColor(dc,colors[PanelBlue]);
|
||||
return reinterpret_cast<LRESULT>(blue);
|
||||
}
|
||||
case WM_CTLCOLORLISTBOX:
|
||||
return reinterpret_cast<LRESULT>(reinterpret_cast<HWND>(lp)==picker?teal:blue);
|
||||
case WM_DRAWITEM:
|
||||
{
|
||||
const auto &item=*reinterpret_cast<const DRAWITEMSTRUCT *>(lp);
|
||||
if(item.CtlID==142 || item.CtlID==143)
|
||||
{
|
||||
auto bounds=item.rcItem;
|
||||
FillRect(item.hDC,&bounds,blue);
|
||||
const auto &path=panels[item.CtlID-142].directory.native();
|
||||
const auto middle=bounds.top+(bounds.bottom-bounds.top)/2;
|
||||
SetDCBrushColor(item.hDC,colors[Frame]);
|
||||
const auto lineBrush=static_cast<HBRUSH>(GetStockObject(DC_BRUSH));
|
||||
RECT upper{bounds.left,middle-2,bounds.right,middle-1};
|
||||
RECT lower{bounds.left,middle,bounds.right,middle+1};
|
||||
FillRect(item.hDC,&upper,lineBrush);
|
||||
FillRect(item.hDC,&lower,lineBrush);
|
||||
if(panels[item.CtlID-142].wide)
|
||||
{
|
||||
const auto index=item.CtlID-142;
|
||||
RECT list{};
|
||||
GetWindowRect(panels[index].list,&list);
|
||||
MapWindowPoints(nullptr,item.hwndItem,reinterpret_cast<POINT*>(&list),2);
|
||||
const auto x=std::max(list.left,list.right-(sizeWidth+2)*static_cast<LONG>(cellWidth));
|
||||
RECT column{x,middle,x+1,bounds.bottom};
|
||||
FillRect(item.hDC,&column,lineBrush);
|
||||
}
|
||||
if(path.empty()) return TRUE;
|
||||
const int saved=SaveDC(item.hDC);
|
||||
SelectObject(item.hDC,mono);
|
||||
SIZE text{};
|
||||
GetTextExtentPoint32W(item.hDC,path.c_str(),static_cast<int>(path.size()),&text);
|
||||
const auto width=std::min(bounds.right-bounds.left,text.cx+2L*cellWidth);
|
||||
bounds.left+=(bounds.right-bounds.left-width)/2;
|
||||
bounds.right=bounds.left+width;
|
||||
const bool highlighted=static_cast<int>(item.CtlID)-142==active;
|
||||
FillRect(item.hDC,&bounds,highlighted?teal:blue);
|
||||
const auto padding=std::min(static_cast<LONG>(cellWidth),width/4);
|
||||
InflateRect(&bounds,-padding,0);
|
||||
SetTextColor(item.hDC,colors[highlighted?Text:Frame]);
|
||||
SetBkMode(item.hDC,TRANSPARENT);
|
||||
DrawTextW(item.hDC,path.c_str(),-1,&bounds,
|
||||
DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_PATH_ELLIPSIS|DT_NOPREFIX);
|
||||
if(saved) RestoreDC(item.hDC,saved);
|
||||
return TRUE;
|
||||
}
|
||||
if(item.CtlID==140 || item.CtlID==141)
|
||||
{
|
||||
auto name=item.rcItem, size=item.rcItem;
|
||||
@@ -2154,7 +2211,10 @@ LRESULT CALLBACK filesWindow(HWND window, UINT message, WPARAM wp, LPARAM lp)
|
||||
if(item.CtlID>=130 && item.CtlID<=134 && static_cast<int>(item.CtlID)-130==menuIndex)
|
||||
background=Selection;
|
||||
if(item.itemState&(ODS_SELECTED|ODS_FOCUS))
|
||||
background=item.CtlType==ODT_LISTBOX && item.hwndItem!=picker?PanelCursor:Selection;
|
||||
{
|
||||
if(item.hwndItem==panels[active].list) background=PanelCursor;
|
||||
else if(item.hwndItem!=panels[1-active].list) background=Selection;
|
||||
}
|
||||
if(item.CtlID==102 || item.CtlID==103)
|
||||
{
|
||||
const auto &panel=panels[item.CtlID-102];
|
||||
|
||||
Reference in new issue
Block a user