View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002890 | Wishes | Plugins API.Panel | public | 2014-12-17 09:01 | 2014-12-17 18:11 |
Reporter | Maximus | Assigned To | |||
Priority | normal | Severity | minor | Reproducibility | have not tried |
Status | new | Resolution | open | ||
Product Version | 3.0 | ||||
Summary | 0002890: Загружать ContentData (C0) только для видимых на панели файлах | ||||
Description | При входе в папку с большим количеством файлов (system32) можно уснуть пока Far закончит считывание ContentData для всех ее файлов. Плагинов может быть много, их действия могут быть затратными, отображение ContentData для НЕ видимых файлов в большинстве случаев смысла не имеет. | ||||
Tags | No tags attached. | ||||
Build | |||||
|
Логично. Но когда (и если) будем делать сортировку по этим колонкам, всё равно придётся считывать для всех файлов. |
|
C0-column-optimization.patch (12,897 bytes)
From 50e9078086a4fa2ca25f5544bede31c7eedb1ac1 Mon Sep 17 00:00:00 2001 From: Maximus5 <ConEmu.Maximus5@gmail.com> Date: Wed, 4 Dec 2013 20:05:42 +0400 Subject: [PATCH] Far3bis. C0 column optimization --- unicode_far/config.cpp | 17 +++++--- unicode_far/farlang.templ.m4 | 11 +++++ unicode_far/filelist.cpp | 95 +++++++++++++++++++++++++++++++++++++++++++- unicode_far/filelist.hpp | 9 ++++- unicode_far/panel.hpp | 3 +- unicode_far/plugins.hpp | 1 + 6 files changed, 126 insertions(+), 10 deletions(-) diff --git a/unicode_far/config.cpp b/unicode_far/config.cpp index f72d1bc..d69ef4e 100644 --- a/unicode_far/config.cpp +++ b/unicode_far/config.cpp @@ -1120,6 +1120,7 @@ void Options::SetFilePanelModes() MD_CHECKBOX_FOLDERUPPERCASE, MD_CHECKBOX_FILESLOWERCASE, MD_CHECKBOX_UPPERTOLOWERCASE, + MD_CHECKBOX_PRELOADC0DATA, MD_SEPARATOR2, MD_BUTTON_OK, MD_BUTTON_RESET, @@ -1127,7 +1128,7 @@ void Options::SetFilePanelModes() } ; FarDialogItem ModeDlgData[]= { - {DI_DOUBLEBOX, 3, 1,72,17,0,nullptr,nullptr,0,AddNewMode? nullptr : ModeListMenu[CurMode].Name}, + {DI_DOUBLEBOX, 3, 1,72,18,0,nullptr,nullptr,0,AddNewMode? nullptr : ModeListMenu[CurMode].Name}, {DI_TEXT, 5, 2, 0, 2,0,nullptr,nullptr,0,MSG(MEditPanelModeName)}, {DI_EDIT, 5, 3,70, 3,0,nullptr,nullptr,DIF_FOCUS,L""}, {DI_TEXT, 5, 4, 0, 4,0,nullptr,nullptr,0,MSG(MEditPanelModeTypes)}, @@ -1145,10 +1146,11 @@ void Options::SetFilePanelModes() {DI_CHECKBOX, 5,12, 0,12,0,nullptr,nullptr,0,MSG(MEditPanelModeFoldersUpperCase)}, {DI_CHECKBOX, 5,13, 0,13,0,nullptr,nullptr,0,MSG(MEditPanelModeFilesLowerCase)}, {DI_CHECKBOX, 5,14, 0,14,0,nullptr,nullptr,0,MSG(MEditPanelModeUpperToLowerCase)}, - {DI_TEXT, -1,15, 0,15,0,nullptr,nullptr,DIF_SEPARATOR,L""}, - {DI_BUTTON, 0,16, 0,16,0,nullptr,nullptr,DIF_DEFAULTBUTTON|DIF_CENTERGROUP,MSG(MOk)}, - {DI_BUTTON, 0,16, 0,16,0,nullptr,nullptr,DIF_CENTERGROUP|(ModeNumber < (int)predefined_panel_modes_count? 0 : DIF_DISABLE),MSG(MReset)}, - {DI_BUTTON, 0,16, 0,16,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MCancel)}, + {DI_CHECKBOX, 5,15, 0,13,0,nullptr,nullptr,0,MSG(MEditPanelModePreloadC0Data)}, + {DI_TEXT, -1,16, 0,15,0,nullptr,nullptr,DIF_SEPARATOR,L""}, + {DI_BUTTON, 0,17, 0,16,0,nullptr,nullptr,DIF_DEFAULTBUTTON|DIF_CENTERGROUP,MSG(MOk)}, + {DI_BUTTON, 0,17, 0,16,0,nullptr,nullptr,DIF_CENTERGROUP|(ModeNumber < (int)predefined_panel_modes_count? 0 : DIF_DISABLE),MSG(MReset)}, + {DI_BUTTON, 0,17, 0,16,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MCancel)}, }; auto ModeDlg = MakeDialogItemsEx(ModeDlgData); int ExitCode; @@ -1164,6 +1166,7 @@ void Options::SetFilePanelModes() ModeDlg[MD_CHECKBOX_FOLDERUPPERCASE].Selected = (CurrentSettings.Flags & PVS_FOLDERUPPERCASE) != 0; ModeDlg[MD_CHECKBOX_FILESLOWERCASE].Selected = (CurrentSettings.Flags & PVS_FILELOWERCASE) != 0; ModeDlg[MD_CHECKBOX_UPPERTOLOWERCASE].Selected = (CurrentSettings.Flags & PVS_FILEUPPERTOLOWERCASE) != 0; + ModeDlg[MD_CHECKBOX_PRELOADC0DATA].Selected=(CurrentSettings.Flags & PVS_PRELOADC0DATA)?1:0; ModeDlg[MD_EDITNAME].strData = CurrentSettings.Name; ViewSettingsToText(CurrentSettings.PanelColumns, ModeDlg[MD_EDITTYPES].strData, ModeDlg[MD_EDITWIDTHS].strData); ViewSettingsToText(CurrentSettings.StatusColumns, ModeDlg[MD_EDITSTATUSTYPES].strData, ModeDlg[MD_EDITSTATUSWIDTHS].strData); @@ -1171,7 +1174,7 @@ void Options::SetFilePanelModes() { auto Dlg = Dialog::create(ModeDlg); - Dlg->SetPosition(-1,-1,76,19); + Dlg->SetPosition(-1,-1,76,20); Dlg->SetHelp(L"PanelViewModes"); Dlg->SetId(PanelViewModesEditId); Dlg->Process(); @@ -1196,6 +1199,8 @@ void Options::SetFilePanelModes() NewSettings.Flags|=PVS_FILELOWERCASE; if (ModeDlg[MD_CHECKBOX_UPPERTOLOWERCASE].Selected) NewSettings.Flags|=PVS_FILEUPPERTOLOWERCASE; + if (ModeDlg[MD_CHECKBOX_PRELOADC0DATA].Selected) + NewSettings.Flags|=PVS_PRELOADC0DATA; NewSettings.Name = ModeDlg[MD_EDITNAME].strData; TextToViewSettings(ModeDlg[MD_EDITTYPES].strData, ModeDlg[MD_EDITWIDTHS].strData, NewSettings.PanelColumns); TextToViewSettings(ModeDlg[MD_EDITSTATUSTYPES].strData, ModeDlg[MD_EDITSTATUSWIDTHS].strData, NewSettings.StatusColumns); diff --git a/unicode_far/farlang.templ.m4 b/unicode_far/farlang.templ.m4 index 95db616..3d1175d 100644 --- a/unicode_far/farlang.templ.m4 +++ b/unicode_far/farlang.templ.m4 @@ -19657,6 +19657,17 @@ MEditPanelModeUpperToLowerCase "Zobraziť veľké znaky v názvoch súborov ako &malé písmená" "Mostra Nomi Files MAIUSCOLO In minuscol&o" +MEditPanelModePreloadC0Data +"Загружать данные в колонку C&0 для всех файлов" +"Preload C&0 data for all files" +upd:"Preload C&0 data for all files" +upd:"Preload C&0 data for all files" +upd:"Preload C&0 data for all files" +upd:"Preload C&0 data for all files" +upd:"Preload C&0 data for all files" +upd:"Preload C&0 data for all files" +upd:"Preload C&0 data for all files" + MEditPanelReadHelp " Нажмите F1, чтобы получить информацию по настройке " " Read online help for instructions " diff --git a/unicode_far/filelist.cpp b/unicode_far/filelist.cpp index e68945c..41ffb20 100644 --- a/unicode_far/filelist.cpp +++ b/unicode_far/filelist.cpp @@ -645,6 +645,53 @@ void FileList::SortFileList(int KeepPosition) hSortPlugin=(m_PanelMode==PLUGIN_PANEL && m_hPlugin && m_hPlugin->pPlugin->HasCompare()) ? m_hPlugin:nullptr; + // �� ������ ������� � ������ ���������� �� C0 ����� �������, ��� ����� �������� + if (m_PanelMode!=PLUGIN_PANEL && m_SortMode==BY_CUSTOMDATA) + { + //BUGBUG: Same as FileList::ReadFileNames + std::vector<const wchar_t*> ContentNames, ContentValues; + std::vector<Plugin*> ContentPlugins; + { + std::unordered_set<string> ColumnsSet; + const std::vector<column>* ColumnsContainers[] = { &m_ViewSettings.PanelColumns, &m_ViewSettings.StatusColumns }; + + FOR(const auto& Columns, ColumnsContainers) + { + FOR(const auto& Column, *Columns) + { + if ((Column.type & 0xff) == CUSTOM_COLUMN0) + { + if (ColumnsSet.emplace(Column.title).second) + ContentNames.emplace_back(Column.title.data()); + } + } + } + + if (!ContentNames.empty()) + Global->CtrlObject->Plugins->GetContentPlugins(ContentNames, ContentPlugins); + + ContentValues.resize(ContentNames.size()); + } + + if (!ContentPlugins.empty()) + { + string strSaveDir; + api::GetCurrentDirectory(strSaveDir); + api::SetCurrentDirectory(m_CurDir); + + std::for_each(RANGE(m_ListData, i) + { + if (!i.CustomDataLoaded) + { + Global->CtrlObject->Plugins->GetContentData(ContentPlugins, i.strName, ContentNames, ContentValues, i.ContentData); + i.CustomDataLoaded = true; + } + }); + + api::SetCurrentDirectory(strSaveDir); + } + } + // ��� ���� ����� ����� ��� ���������� ����������� Far Manager // ��� �������� ���������� @@ -6695,6 +6742,8 @@ void FileList::ReadFileNames(int KeepSelection, int UpdateEvenIfPanelInvisible, ContentValues.resize(ContentNames.size()); } + bool ReadContentData=(!ContentPlugins.empty() && (m_ViewSettings.Flags&PVS_PRELOADC0DATA)) || (m_SortMode==BY_CUSTOMDATA); + DWORD StartTime = GetTickCount(); std::all_of(CONST_RANGE(Find, fdata) -> bool @@ -6755,8 +6804,11 @@ void FileList::ReadFileNames(int KeepSelection, int UpdateEvenIfPanelInvisible, EnumStreams(TestParentFolderName(fdata.strFileName)? m_CurDir : fdata.strFileName, NewItem.StreamsSize, NewItem.NumberOfStreams); } - if (!ContentPlugins.empty()) + if (ReadContentData) + { Global->CtrlObject->Plugins->GetContentData(ContentPlugins, NewItem.strName, ContentNames, ContentValues, NewItem.ContentData); + NewItem.CustomDataLoaded = true; + } if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) TotalFileCount++; @@ -8238,6 +8290,34 @@ void FileList::ShowList(int ShowStatus,int StartColumn) size_t ColumnCount=ShowStatus ? m_ViewSettings.StatusColumns.size() : m_ViewSettings.PanelColumns.size(); const auto& Columns = ShowStatus ? m_ViewSettings.StatusColumns : m_ViewSettings.PanelColumns; + bool dirWasChanged = false; + string strSaveDir; + api::GetCurrentDirectory(strSaveDir); + //BUGBUG: Same as FileList::ReadFileNames + std::vector<const wchar_t*> ContentNames, ContentValues; + std::vector<Plugin*> ContentPlugins; + { + std::unordered_set<string> ColumnsSet; + const std::vector<column>* ColumnsContainers[] = { &m_ViewSettings.PanelColumns, &m_ViewSettings.StatusColumns }; + + FOR(const auto& Columns, ColumnsContainers) + { + FOR(const auto& Column, *Columns) + { + if ((Column.type & 0xff) == CUSTOM_COLUMN0) + { + if (ColumnsSet.emplace(Column.title).second) + ContentNames.emplace_back(Column.title.data()); + } + } + } + + if (!ContentNames.empty()) + Global->CtrlObject->Plugins->GetContentPlugins(ContentNames, ContentPlugins); + + ContentValues.resize(ContentNames.size()); + } + for (int I=m_Y1+1+Global->Opt->ShowColumnTitles,J=m_CurTopFile; I<m_Y2-2*Global->Opt->ShowPanelStatus; I++,J++) { int CurColumn=StartColumn; @@ -8312,6 +8392,16 @@ void FileList::ShowList(int ShowStatus,int StartColumn) if (!ColumnData) { + auto& item = m_ListData[ListPos]; + if (m_PanelMode!=PLUGIN_PANEL && !item.CustomDataLoaded && !ContentPlugins.empty()) + { + // �������� ��������� ������ ����� �� ������ (��� ����� �� �������� �����) + // ���, ����� �� ������� ��� � ������� ����� ���� �� ���������? + if (!dirWasChanged && api::SetCurrentDirectory(m_CurDir)) + dirWasChanged = true; + Global->CtrlObject->Plugins->GetContentData(ContentPlugins, item.strName, ContentNames, ContentValues, item.ContentData); + item.CustomDataLoaded = true; + } ColumnData = m_ListData[ListPos].ContentData[Columns[K].title].data(); } @@ -8694,6 +8784,9 @@ void FileList::ShowList(int ShowStatus,int StartColumn) } } + if (dirWasChanged) + api::SetCurrentDirectory(strSaveDir); + if (!ShowStatus && !StatusShown && Global->Opt->ShowPanelStatus) { SetScreen(m_X1+1,m_Y2-1,m_X2-1,m_Y2-1,L' ',ColorIndexToColor(COL_PANELTEXT)); diff --git a/unicode_far/filelist.hpp b/unicode_far/filelist.hpp index 7631b13..eb7a2ba 100644 --- a/unicode_far/filelist.hpp +++ b/unicode_far/filelist.hpp @@ -81,6 +81,8 @@ struct FileListItem: NonCopyable std::unordered_map<string,string> ContentData; + bool CustomDataLoaded; + FileListItem(): Selected(), PrevSelected(), @@ -107,7 +109,8 @@ struct FileListItem: NonCopyable FileSize(), AllocationSize(), StreamsSize(), - ReparseTag() + ReparseTag(), + CustomDataLoaded() { } @@ -137,7 +140,8 @@ struct FileListItem: NonCopyable FileSize(), AllocationSize(), StreamsSize(), - ReparseTag() + ReparseTag(), + CustomDataLoaded() { *this = std::move(rhs); } @@ -179,6 +183,7 @@ struct FileListItem: NonCopyable strShortName.swap(rhs.strShortName); swap(ReparseTag, rhs.ReparseTag); ContentData.swap(rhs.ContentData); + std::swap(CustomDataLoaded, rhs.CustomDataLoaded); } FREE_SWAP(FileListItem); diff --git a/unicode_far/panel.hpp b/unicode_far/panel.hpp index 6287b0e..e527657 100644 --- a/unicode_far/panel.hpp +++ b/unicode_far/panel.hpp @@ -108,6 +108,7 @@ enum PVS_FOLDERUPPERCASE = 0x00000008, PVS_FILELOWERCASE = 0x00000010, PVS_FILEUPPERTOLOWERCASE = 0x00000020, + PVS_PRELOADC0DATA = 0x00000040, }; enum @@ -423,4 +424,4 @@ public: private: virtual void Update(int Mode) override {}; virtual void UpdateKeyBar() override {} -}; \ No newline at end of file +}; diff --git a/unicode_far/plugins.hpp b/unicode_far/plugins.hpp index f24e5bf..19f6878 100644 --- a/unicode_far/plugins.hpp +++ b/unicode_far/plugins.hpp @@ -118,6 +118,7 @@ public: int ProcessConsoleInput(ProcessConsoleInputInfo *Info) const; void GetContentPlugins(const std::vector<const wchar_t*>& ColNames, std::vector<Plugin*>& Plugins) const; void GetContentData(const std::vector<Plugin*>& Plugins, const string& FilePath, const std::vector<const wchar_t*>& Names, std::vector<const wchar_t*>& Values, std::unordered_map<string,string>& ContentData) const; + int UnloadPlugin(Plugin *pPlugin, int From); Plugin* LoadPluginExternal(const string& lpwszModuleName, bool LoadToMem); int UnloadPluginExternal(Plugin* hPlugin); -- 1.9.4.msysgit.2 |
|
Предлагаемый патч добавляет в диалог режима панели опцию "Загружать данные в колонку C0 для всех файлов". Что это за колонка C0, с учётом того, что чейнжлог билда 4214 говорит "колонки C0 больше нет, есть контент-колонки плагинов в любом количестве" ? |
|
Переименовать по вкусу - патч старый. Хотя я вообще не уверен в необходимости опции - на кой может понадобиться старое поведение? |
|
> Переименовать по вкусу - патч старый. Меня не вкус интересует, а суть. Речь идёт об одной контент-колонке или обо всех? Если обо всех, то название опции просто вводит в заблуждение. |
|
Что если воспользоваться опытом TC? Данные, которые плагин может получить быстро, он возвращает сразу. Остальное опрашивается в фоне. Под "быстро" (если я правильно понял) они имеют ввиду "не обращаясь к содержимому файла". Например diz. |
|
Суть опции - "опрашивать content плагины". Патч при необходимости показа элемента делает ровно то же что фар делает сейчас. На счет "быстро". В каталоге 30K файлов. На кой считывать даже "быстрые" данные которые юзер все равно не увидит? Память, время, ... Оно надо? |
|
Content-data-loading-optimization.patch (6,662 bytes)
From 8a9df84fd8d8553b7894122b422235e35cb569e9 Mon Sep 17 00:00:00 2001 From: Maximus5 <ConEmu.Maximus5@gmail.com> Date: Wed, 17 Dec 2014 20:09:57 +0300 Subject: [PATCH] Content data loading optimization --- unicode_far/filelist.cpp | 95 +++++++++++++++++++++++++++++++++++++++++++++++- unicode_far/filelist.hpp | 9 ++++- 2 files changed, 101 insertions(+), 3 deletions(-) diff --git a/unicode_far/filelist.cpp b/unicode_far/filelist.cpp index e68945c..e55bf14 100644 --- a/unicode_far/filelist.cpp +++ b/unicode_far/filelist.cpp @@ -645,6 +645,53 @@ void FileList::SortFileList(int KeepPosition) hSortPlugin=(m_PanelMode==PLUGIN_PANEL && m_hPlugin && m_hPlugin->pPlugin->HasCompare()) ? m_hPlugin:nullptr; + // �� ������ ������� � ������ ���������� �� C0 ����� �������, ��� ����� �������� + if (m_PanelMode!=PLUGIN_PANEL && m_SortMode==BY_CUSTOMDATA) + { + //BUGBUG: Same as FileList::ReadFileNames + std::vector<const wchar_t*> ContentNames, ContentValues; + std::vector<Plugin*> ContentPlugins; + { + std::unordered_set<string> ColumnsSet; + const std::vector<column>* ColumnsContainers[] = { &m_ViewSettings.PanelColumns, &m_ViewSettings.StatusColumns }; + + FOR(const auto& Columns, ColumnsContainers) + { + FOR(const auto& Column, *Columns) + { + if ((Column.type & 0xff) == CUSTOM_COLUMN0) + { + if (ColumnsSet.emplace(Column.title).second) + ContentNames.emplace_back(Column.title.data()); + } + } + } + + if (!ContentNames.empty()) + Global->CtrlObject->Plugins->GetContentPlugins(ContentNames, ContentPlugins); + + ContentValues.resize(ContentNames.size()); + } + + if (!ContentPlugins.empty()) + { + string strSaveDir; + api::GetCurrentDirectory(strSaveDir); + api::SetCurrentDirectory(m_CurDir); + + std::for_each(RANGE(m_ListData, i) + { + if (!i.ContentDataLoaded) + { + Global->CtrlObject->Plugins->GetContentData(ContentPlugins, i.strName, ContentNames, ContentValues, i.ContentData); + i.ContentDataLoaded = true; + } + }); + + api::SetCurrentDirectory(strSaveDir); + } + } + // ��� ���� ����� ����� ��� ���������� ����������� Far Manager // ��� �������� ���������� @@ -6695,6 +6742,8 @@ void FileList::ReadFileNames(int KeepSelection, int UpdateEvenIfPanelInvisible, ContentValues.resize(ContentNames.size()); } + bool ReadContentData = !ContentPlugins.empty() && (m_SortMode==BY_CUSTOMDATA); + DWORD StartTime = GetTickCount(); std::all_of(CONST_RANGE(Find, fdata) -> bool @@ -6755,8 +6804,11 @@ void FileList::ReadFileNames(int KeepSelection, int UpdateEvenIfPanelInvisible, EnumStreams(TestParentFolderName(fdata.strFileName)? m_CurDir : fdata.strFileName, NewItem.StreamsSize, NewItem.NumberOfStreams); } - if (!ContentPlugins.empty()) + if (ReadContentData) + { Global->CtrlObject->Plugins->GetContentData(ContentPlugins, NewItem.strName, ContentNames, ContentValues, NewItem.ContentData); + NewItem.ContentDataLoaded = true; + } if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) TotalFileCount++; @@ -8238,6 +8290,34 @@ void FileList::ShowList(int ShowStatus,int StartColumn) size_t ColumnCount=ShowStatus ? m_ViewSettings.StatusColumns.size() : m_ViewSettings.PanelColumns.size(); const auto& Columns = ShowStatus ? m_ViewSettings.StatusColumns : m_ViewSettings.PanelColumns; + bool dirWasChanged = false; + string strSaveDir; + api::GetCurrentDirectory(strSaveDir); + //BUGBUG: Same as FileList::ReadFileNames + std::vector<const wchar_t*> ContentNames, ContentValues; + std::vector<Plugin*> ContentPlugins; + { + std::unordered_set<string> ColumnsSet; + const std::vector<column>* ColumnsContainers[] = { &m_ViewSettings.PanelColumns, &m_ViewSettings.StatusColumns }; + + FOR(const auto& Columns, ColumnsContainers) + { + FOR(const auto& Column, *Columns) + { + if ((Column.type & 0xff) == CUSTOM_COLUMN0) + { + if (ColumnsSet.emplace(Column.title).second) + ContentNames.emplace_back(Column.title.data()); + } + } + } + + if (!ContentNames.empty()) + Global->CtrlObject->Plugins->GetContentPlugins(ContentNames, ContentPlugins); + + ContentValues.resize(ContentNames.size()); + } + for (int I=m_Y1+1+Global->Opt->ShowColumnTitles,J=m_CurTopFile; I<m_Y2-2*Global->Opt->ShowPanelStatus; I++,J++) { int CurColumn=StartColumn; @@ -8312,6 +8392,16 @@ void FileList::ShowList(int ShowStatus,int StartColumn) if (!ColumnData) { + auto& item = m_ListData[ListPos]; + if (m_PanelMode!=PLUGIN_PANEL && !item.ContentDataLoaded && !ContentPlugins.empty()) + { + // �������� ��������� ������ ����� �� ������ (��� ����� �� �������� �����) + // ���, ����� �� ������� ��� � ������� ����� ���� �� ���������? + if (!dirWasChanged && api::SetCurrentDirectory(m_CurDir)) + dirWasChanged = true; + Global->CtrlObject->Plugins->GetContentData(ContentPlugins, item.strName, ContentNames, ContentValues, item.ContentData); + item.ContentDataLoaded = true; + } ColumnData = m_ListData[ListPos].ContentData[Columns[K].title].data(); } @@ -8694,6 +8784,9 @@ void FileList::ShowList(int ShowStatus,int StartColumn) } } + if (dirWasChanged) + api::SetCurrentDirectory(strSaveDir); + if (!ShowStatus && !StatusShown && Global->Opt->ShowPanelStatus) { SetScreen(m_X1+1,m_Y2-1,m_X2-1,m_Y2-1,L' ',ColorIndexToColor(COL_PANELTEXT)); diff --git a/unicode_far/filelist.hpp b/unicode_far/filelist.hpp index 7631b13..c92f367 100644 --- a/unicode_far/filelist.hpp +++ b/unicode_far/filelist.hpp @@ -81,6 +81,8 @@ struct FileListItem: NonCopyable std::unordered_map<string,string> ContentData; + bool ContentDataLoaded; + FileListItem(): Selected(), PrevSelected(), @@ -107,7 +109,8 @@ struct FileListItem: NonCopyable FileSize(), AllocationSize(), StreamsSize(), - ReparseTag() + ReparseTag(), + ContentDataLoaded() { } @@ -137,7 +140,8 @@ struct FileListItem: NonCopyable FileSize(), AllocationSize(), StreamsSize(), - ReparseTag() + ReparseTag(), + ContentDataLoaded() { *this = std::move(rhs); } @@ -179,6 +183,7 @@ struct FileListItem: NonCopyable strShortName.swap(rhs.strShortName); swap(ReparseTag, rhs.ReparseTag); ContentData.swap(rhs.ContentData); + std::swap(ContentDataLoaded, rhs.ContentDataLoaded); } FREE_SWAP(FileListItem); -- 1.9.4.msysgit.2 |
|
Патч без настройки добавил. |
|
>В каталоге 30K файлов Тут и раскраска будет тормозить, и жрать память. >Оно надо? Смотря для чего. Исхожу из того, что в TC за всё время наверняка много граблей опробовано. |
|
Вопрос по 1-му патчу: с какой целью производится коррекция текущей директории на время считывания контент-колонок? |
|
Иначе у плагина вообще нет возможности узнать текущую папку панели. Допускать, что папка панели соответствует части пути файла не кажется правильным - случаи разные могут быть. Но вообще, есть предложение на счет "хэндла" (на форуме), тогда все будет красивше. |
|
Я как-то в опции не вижу смысла. Подобное поведение надо, в идеале, распространить и на встроенные колонки. > //BUGBUG: Same as FileList::ReadFileNames > //BUGBUG: Same as FileList::ReadFileNames Новый код с новой копипастой? |
|
> Иначе у плагина вообще нет возможности узнать текущую папку панели. FCTL_GETPANELDIRECTORY ? > Допускать, что папка панели соответствует части пути файла не кажется > правильным - случаи разные могут быть. На данный момент плагин получает полное имя файла, и это, по идее, всё, что ему требуется. Или я чего-то не догоняю? И дело даже не столько в том, нужно ли производить временную коррекцию директории, а в том, что это изменение никак не связано с целью данного тикета. |
|
> FCTL_GETPANELDIRECTORY Для какой панели? Hint: их две. > а в том, что это изменение никак не связано с целью данного тикета При первичном опросе (и ранее) папка устанавливалась. После предлагаемой оптимизации это сломано быть не должно. Хотя с ходу я не могу придумать или вспомнить в каких случаях текущая папка может быть важна. Возможно, это как раз потому что фиг различишь панели в текущем апи. |
|
> Хотя с ходу я не могу придумать или вспомнить в каких случаях текущая папка может быть важна. Вот поэтому предпочтительно, IMHO, не вставлять ничего лишнего. Когда появится реальный юз-кейс, будем думать. И, возможно, более элегантно было бы передавать это параметром при вызове плагина. |
|
Я не просто так про хендл говлрил на форуме. Копипаста: ----- Еще мне кажется, что работа с плагином должна быть не "файло-ориентированной", а "панеле-ориентированной". То есть Фар запрашивает у плагина хэндл для обработки панели (другая панель или другая директория -> другой хэндл), который уже должен использоваться при запросе собственно данных. Тогда плагин будет знать, нужно ли мониторить изменение content-данных, или юзер уже давно ушел из этой папки. ----- Но это уже точно другой тикет... |
Date Modified | Username | Field | Change |
---|---|---|---|
2014-12-17 09:01 | Maximus | New Issue | |
2014-12-17 09:04 | shmuel | Note Added: 0013337 | |
2014-12-17 09:11 | Maximus | File Added: C0-column-optimization.patch | |
2014-12-17 10:03 | shmuel | Note Added: 0013338 | |
2014-12-17 10:10 | Maximus | Note Added: 0013339 | |
2014-12-17 10:15 | shmuel | Note Added: 0013340 | |
2014-12-17 12:11 | JohnDoe | Note Added: 0013341 | |
2014-12-17 12:30 | Maximus | Note Added: 0013342 | |
2014-12-17 12:45 | Maximus | File Added: Content-data-loading-optimization.patch | |
2014-12-17 12:45 | Maximus | Note Added: 0013343 | |
2014-12-17 12:57 | JohnDoe | Note Added: 0013344 | |
2014-12-17 17:02 | shmuel | Note Added: 0013345 | |
2014-12-17 17:28 | Maximus | Note Added: 0013346 | |
2014-12-17 17:36 | DrKnS | Note Added: 0013347 | |
2014-12-17 17:52 | shmuel | Note Added: 0013348 | |
2014-12-17 18:01 | Maximus | Note Added: 0013349 | |
2014-12-17 18:06 | shmuel | Note Added: 0013350 | |
2014-12-17 18:11 | Maximus | Note Added: 0013351 |