View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001788 | Wishes | _Common | public | 2011-06-01 21:10 | 2013-02-03 00:34 |
Reporter | Maximus | Assigned To | vskirdin | ||
Priority | normal | Severity | feature | Reproducibility | have not tried |
Status | closed | Resolution | fixed | ||
Product Version | 3.0 | ||||
Summary | 0001788: Сделать удобным использование быстрого фильтра в списках (CtrlAltF) | ||||
Description | Надоело, в общем, патч. Если при увеличении строки фильтра выделенная строка оказывается скрытой прыгаем на первую видимую строку рядом с предыдущей (сверху или снизу - зависит от предыдущего положения выделенной строки - в верхней или нижней части списка). В фильтрации не участвует текст разделителей. Если группа оказывается скрытой - разделитель перед ней тоже скрывается. Автоматическое увеличение высоты списка при увеличении количества видимых строк (сброс фильтра или уменьшение строки фильтра). Сценарий (в панелях): ShiftF4 Tab CtrlDown CtrlAltF "650" Esc CtrlDown CtrlAltF Ранее, несмотря на то что фильтра уже нет, высота списка оставалась всего 2 строки. В довесок: При нажатии Home в истории папок (например) первая дата (разделитель) оставалась невидимой. | ||||
Tags | No tags attached. | ||||
Build | 0 | ||||
|
vmenu.110601.diff (5,633 bytes)
Index: vmenu.cpp =================================================================== --- vmenu.cpp (revision 6305) +++ vmenu.cpp (working copy) @@ -69,6 +69,7 @@ strTitle(Title), SelectPos(-1), TopPos(0), + WasAutoHeight(false), MaxLength(0), BoxType(DOUBLE_BOX), ParentDialog(ParentDialog), @@ -649,47 +650,147 @@ ItemHiddenCount=0; + FilterUpdateHeight(); + if (SelectPos < 0) SetSelectPos(0,1); } void VMenu::FilterStringUpdated(bool bLonger) { + int PrevSeparator = -1; + int UpperVisible = -1, LowerVisible = -2; + bool bBottomMode = false; + if (SelectPos > 0) + { + // ���������, � ������ ��� ������ ����� ���������� ������ + int TopVisible = GetVisualPos(TopPos); + int SelectedVisible = GetVisualPos(SelectPos); + int BottomVisible = (TopVisible+MaxHeight > GetShowItemCount()) ? (TopVisible+MaxHeight-1) : (GetShowItemCount()-1); + if (SelectedVisible >= ((TopVisible+BottomVisible)>>1)) + bBottomMode = true; + } + if (bLonger) { //������ ������ ��������� for (int i=0; i < ItemCount; i++) { - if (ItemIsVisible(Item[i]->Flags) && !StrStrI(Item[i]->strName, strFilter)) + // ��� ����� ��������� ����� �� ����������� + if (ItemIsVisible(Item[i]->Flags)) { - Item[i]->Flags |= LIF_HIDDEN; - ItemHiddenCount++; - if (SelectPos == i) + if (Item[i]->Flags & LIF_SEPARATOR) { - Item[i]->Flags &= ~LIF_SELECTED; - SelectPos = -1; + // � �������� ������ ��� ������� ����, ���������� ����� ������� - �� ����� + if (PrevSeparator != -1) + { + Item[PrevSeparator]->Flags |= LIF_HIDDEN; + ItemHiddenCount++; + } + PrevSeparator = i; } + else if (!StrStrI(Item[i]->strName, strFilter)) + { + Item[i]->Flags |= LIF_HIDDEN; + ItemHiddenCount++; + if (SelectPos == i) + { + Item[i]->Flags &= ~LIF_SELECTED; + SelectPos = -1; + LowerVisible = -1; + } + } + else + { + if (LowerVisible == -2) + { + if (ItemCanHaveFocus(Item[i]->Flags)) + UpperVisible = i; + } + else if (LowerVisible == -1) + { + if (ItemCanHaveFocus(Item[i]->Flags)) + LowerVisible = i; + } + // ���� ���������� - ������� ������ + if (PrevSeparator != -1) + PrevSeparator = -1; + } } } + // � �������� ������ ��� ������� ����, ���������� ����� ������� - �� ����� + if (PrevSeparator != -1) + { + Item[PrevSeparator]->Flags |= LIF_HIDDEN; + ItemHiddenCount++; + } } else { //������ ������ ���������� for (int i=0; i < ItemCount; i++) { - if (!ItemIsVisible(Item[i]->Flags) && StrStrI(Item[i]->strName, strFilter)) + if (!ItemIsVisible(Item[i]->Flags)) { - Item[i]->Flags &= ~LIF_HIDDEN; - ItemHiddenCount--; + if (Item[i]->Flags & LIF_SEPARATOR) + { + PrevSeparator = i; + } + else if (StrStrI(Item[i]->strName, strFilter)) + { + Item[i]->Flags &= ~LIF_HIDDEN; + ItemHiddenCount--; + if (PrevSeparator != -1) + { + // ���������� ����� ����� ������ ������� �� ���� + Item[PrevSeparator]->Flags &= ~LIF_HIDDEN; + ItemHiddenCount--; + PrevSeparator = -1; + } + } } + else if ((PrevSeparator != -1) && (Item[i]->Flags & LIF_SEPARATOR)) + { + PrevSeparator = -1; + } } + + FilterUpdateHeight(); } - if (SelectPos<0) - SetSelectPos(0,1); + if (GetShowItemCount()>0) + { + // ��������, � �� � ������ ����� ������ ����� �������� ��� ���� ����� + FarListPos pos={SelectPos,-1}; + if (SelectPos<0) + { + pos.SelectPos = bBottomMode ? ((LowerVisible>0) ? LowerVisible : UpperVisible) : UpperVisible; + if (pos.SelectPos == -1) + pos.SelectPos = bBottomMode ? VisualPosToReal(GetShowItemCount()-1) : 0; + } + SetSelectPos(&pos); + } } +void VMenu::FilterUpdateHeight() +{ + if (WasAutoHeight) + { + int NewY2; + if (MaxHeight && MaxHeight<GetShowItemCount()) + NewY2 = Y1 + MaxHeight + 1; + else + NewY2 = Y1 + GetShowItemCount() + 1; + if (NewY2 > ScrY) + NewY2 = ScrY; + if (NewY2 > Y2) + { + SetPosition(X1,Y1,X2,NewY2); + } + } +} + bool VMenu::IsFilterEditKey(int Key) { return (Key>=(int)KEY_SPACE && Key<0xffff) || Key==KEY_BS; @@ -1027,7 +1128,8 @@ case KEY_CTRLHOME: case KEY_CTRLNUMPAD7: case KEY_CTRLPGUP: case KEY_CTRLNUMPAD9: { - SetSelectPos(0,1); + FarListPos pos={0,-1}; + SetSelectPos(&pos); ShowMenu(true); break; } @@ -1601,12 +1703,18 @@ } } + WasAutoHeight = false; if (Y2 <= 0) { if (MaxHeight && MaxHeight<GetShowItemCount()) + { Y2 = Y1 + MaxHeight + 1; + } else + { Y2 = Y1 + GetShowItemCount() + 1; + WasAutoHeight = true; + } } if (Y2 > ScrY) Index: vmenu.hpp =================================================================== --- vmenu.hpp (revision 6305) +++ vmenu.hpp (working copy) @@ -210,6 +210,7 @@ int SelectPos; int TopPos; int MaxHeight; + bool WasAutoHeight; int MaxLength; int BoxType; bool PrevCursorVisible; @@ -324,6 +325,7 @@ int FindItem(int StartIndex,const wchar_t *Pattern,UINT64 Flags=0); void RestoreFilteredItems(); void FilterStringUpdated(bool bLonger); + void FilterUpdateHeight(); void SetFilterEnabled(bool bEnabled) { bFilterEnabled=bEnabled; }; void SetFilterLocked(bool bLocked) { bFilterEnabled=bLocked; }; bool AddToFilter(const wchar_t *str); |
|
Обновленный патч выложен здесь: http://bugs.farmanager.com/view.php?id=1789 |
|
если в 0001789 ЭТО сделано, то разумнее этот Инц закрыть. не? |
|
закрывай |
|
закрыт в пользу 0001789 |
Date Modified | Username | Field | Change |
---|---|---|---|
2011-06-01 21:10 | Maximus | New Issue | |
2011-06-01 21:10 | Maximus | File Added: vmenu.110601.diff | |
2011-06-05 19:33 | alexy | Relationship added | related to 0001586 |
2011-06-05 20:33 | Maximus | Note Added: 0007151 | |
2011-06-10 08:15 | vskirdin | Note Added: 0007182 | |
2011-06-10 08:31 | Maximus | Note Added: 0007183 | |
2011-06-10 09:10 | vskirdin | Build | => 0 |
2011-06-10 09:10 | vskirdin | Note Added: 0007186 | |
2011-06-10 09:10 | vskirdin | Status | new => closed |
2011-06-10 09:10 | vskirdin | Assigned To | => vskirdin |
2011-06-10 09:10 | vskirdin | Resolution | open => fixed |
2013-02-03 00:34 | alexy | Severity | minor => feature |