View Issue Details

IDProjectCategoryView StatusLast Update
0002890WishesPlugins API.Panelpublic2014-12-17 18:11
ReporterMaximus Assigned To 
PrioritynormalSeverityminorReproducibilityhave not tried
Status newResolutionopen 
Product Version3.0 
Summary0002890: Загружать ContentData (C0) только для видимых на панели файлах
DescriptionПри входе в папку с большим количеством файлов (system32) можно уснуть пока Far закончит считывание ContentData для всех ее файлов.
Плагинов может быть много, их действия могут быть затратными, отображение ContentData для НЕ видимых файлов в большинстве случаев смысла не имеет.
TagsNo tags attached.
Build

Activities

shmuel

2014-12-17 09:04

developer   bugnote:0013337

Логично. Но когда (и если) будем делать сортировку по этим колонкам, всё равно придётся считывать для всех файлов.

Maximus

2014-12-17 09:11

reporter  

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-column-optimization.patch (12,897 bytes)   

shmuel

2014-12-17 10:03

developer   bugnote:0013338

Предлагаемый патч добавляет в диалог режима панели опцию "Загружать данные в колонку C0 для всех файлов".

Что это за колонка C0, с учётом того, что чейнжлог билда 4214 говорит "колонки C0 больше нет, есть контент-колонки плагинов в любом количестве" ?

Maximus

2014-12-17 10:10

reporter   bugnote:0013339

Переименовать по вкусу - патч старый.

Хотя я вообще не уверен в необходимости опции - на кой может понадобиться старое поведение?

shmuel

2014-12-17 10:15

developer   bugnote:0013340

> Переименовать по вкусу - патч старый.
Меня не вкус интересует, а суть. Речь идёт об одной контент-колонке или обо всех? Если обо всех, то название опции просто вводит в заблуждение.

JohnDoe

2014-12-17 12:11

updater   bugnote:0013341

Что если воспользоваться опытом TC?
Данные, которые плагин может получить быстро, он возвращает сразу.
Остальное опрашивается в фоне.

Под "быстро" (если я правильно понял) они имеют ввиду "не обращаясь к содержимому файла". Например diz.

Maximus

2014-12-17 12:30

reporter   bugnote:0013342

Суть опции - "опрашивать content плагины". Патч при необходимости показа элемента делает ровно то же что фар делает сейчас.

На счет "быстро". В каталоге 30K файлов. На кой считывать даже "быстрые" данные которые юзер все равно не увидит? Память, время, ... Оно надо?

Maximus

2014-12-17 12:45

reporter  

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

Maximus

2014-12-17 12:45

reporter   bugnote:0013343

Патч без настройки добавил.

JohnDoe

2014-12-17 12:57

updater   bugnote:0013344

>В каталоге 30K файлов
Тут и раскраска будет тормозить, и жрать память.

>Оно надо?
Смотря для чего.

Исхожу из того, что в TC за всё время наверняка много граблей опробовано.

shmuel

2014-12-17 17:02

developer   bugnote:0013345

Вопрос по 1-му патчу: с какой целью производится коррекция текущей директории на время считывания контент-колонок?

Maximus

2014-12-17 17:28

reporter   bugnote:0013346

Иначе у плагина вообще нет возможности узнать текущую папку панели. Допускать, что папка панели соответствует части пути файла не кажется правильным - случаи разные могут быть.

Но вообще, есть предложение на счет "хэндла" (на форуме), тогда все будет красивше.

DrKnS

2014-12-17 17:36

administrator   bugnote:0013347

Я как-то в опции не вижу смысла.
Подобное поведение надо, в идеале, распространить и на встроенные колонки.


> //BUGBUG: Same as FileList::ReadFileNames
> //BUGBUG: Same as FileList::ReadFileNames

Новый код с новой копипастой?

shmuel

2014-12-17 17:52

developer   bugnote:0013348

> Иначе у плагина вообще нет возможности узнать текущую папку панели.
FCTL_GETPANELDIRECTORY ?

> Допускать, что папка панели соответствует части пути файла не кажется
> правильным - случаи разные могут быть.
На данный момент плагин получает полное имя файла, и это, по идее, всё, что ему требуется. Или я чего-то не догоняю?

И дело даже не столько в том, нужно ли производить временную коррекцию директории, а в том, что это изменение никак не связано с целью данного тикета.

Maximus

2014-12-17 18:01

reporter   bugnote:0013349

> FCTL_GETPANELDIRECTORY

Для какой панели? Hint: их две.

> а в том, что это изменение никак не связано с целью данного тикета

При первичном опросе (и ранее) папка устанавливалась. После предлагаемой оптимизации это сломано быть не должно.
Хотя с ходу я не могу придумать или вспомнить в каких случаях текущая папка может быть важна.
Возможно, это как раз потому что фиг различишь панели в текущем апи.

shmuel

2014-12-17 18:06

developer   bugnote:0013350

> Хотя с ходу я не могу придумать или вспомнить в каких случаях текущая папка может быть важна.
Вот поэтому предпочтительно, IMHO, не вставлять ничего лишнего. Когда появится реальный юз-кейс, будем думать. И, возможно, более элегантно было бы передавать это параметром при вызове плагина.

Maximus

2014-12-17 18:11

reporter   bugnote:0013351

Я не просто так про хендл говлрил на форуме. Копипаста:
-----
Еще мне кажется, что работа с плагином должна быть не "файло-ориентированной", а "панеле-ориентированной".
То есть Фар запрашивает у плагина хэндл для обработки панели (другая панель или другая директория -> другой хэндл), который уже должен использоваться при запросе собственно данных.
Тогда плагин будет знать, нужно ли мониторить изменение content-данных, или юзер уже давно ушел из этой папки.
-----

Но это уже точно другой тикет...

Issue History

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