Kaynağa Gözat

texturev: Added file list.

Branimir Karadžić 8 yıl önce
ebeveyn
işleme
f76d3bd33e
1 değiştirilmiş dosya ile 107 ekleme ve 34 silme
  1. 107 34
      tools/texturev/texturev.cpp

+ 107 - 34
tools/texturev/texturev.cpp

@@ -24,8 +24,9 @@
 
 #include <tinystl/allocator.h>
 #include <tinystl/vector.h>
-#include <string>
 namespace stl = tinystl;
+#include <string>
+#include <algorithm>
 
 #include <bimg/decode.h>
 
@@ -156,6 +157,8 @@ static const InputBinding s_bindingView[] =
 
 	{ entry::Key::KeyH,      entry::Modifier::None,       1, NULL, "view help"               },
 
+	{ entry::Key::Return,    entry::Modifier::None,       1, NULL, "view files"              },
+
 	{ entry::Key::KeyS,      entry::Modifier::None,       1, NULL, "view sdf"                },
 
 	{ entry::Key::Space,     entry::Modifier::None,       1, NULL, "view geo\n"
@@ -206,6 +209,7 @@ struct View
 		, m_fit(true)
 		, m_alpha(false)
 		, m_help(false)
+		, m_files(false)
 		, m_sdf(false)
 	{
 	}
@@ -486,23 +490,34 @@ struct View
 			{
 				m_help ^= true;
 			}
+			else if (0 == bx::strCmp(_argv[1], "files") )
+			{
+				m_files ^= true;
+			}
 		}
 
 		return 0;
 	}
 
-	void updateFileList(const char* _path, const bx::StringView& _fileName)
+	static bool sortNameAscending(const std::string& _lhs, const std::string& _rhs)
 	{
-		std::string path = _path;
+		return 0 > bx::strCmpV(_lhs.c_str(), _rhs.c_str() );
+	}
 
-		DIR* dir = opendir(_path);
+	void updateFileList(const bx::FilePath& _filePath)
+	{
+		DIR* dir = opendir(_filePath.get() );
 
 		if (NULL == dir)
 		{
-			path = ".";
+			m_path = _filePath.getPath();
+			dir = opendir(m_path.get() );
+		}
+		else
+		{
+			m_path = _filePath;
 		}
 
-		dir = opendir(path.c_str() );
 		if (NULL != dir)
 		{
 			for (dirent* item = readdir(dir); NULL != item; item = readdir(dir) )
@@ -525,25 +540,30 @@ struct View
 
 						if (supported)
 						{
-							if (0 == bx::strCmp(item->d_name, _fileName) )
-							{
-								m_fileIndex = uint32_t(m_fileList.size() );
-							}
-
-							std::string name = path;
-							char ch = name[name.size()-1];
-							name += '/' == ch || '\\' == ch ? "" : "/";
-							name += item->d_name;
-							m_fileList.push_back(name);
+							m_fileList.push_back(item->d_name);
 						}
 					}
 				}
 			}
 
+			std::sort(m_fileList.begin(), m_fileList.end(), sortNameAscending);
+
+			uint32_t idx = 0;
+			for (FileList::const_iterator it = m_fileList.begin(); it != m_fileList.end(); ++it, ++idx)
+			{
+				if (0 == bx::strCmp(it->c_str(), _filePath.getFileName() ) )
+				{
+					break;
+				}
+			}
+			m_fileIndex = idx == m_fileList.size() ? 0 : idx;
+
 			closedir(dir);
 		}
 	}
 
+	bx::FilePath m_path;
+
 	typedef stl::vector<std::string> FileList;
 	FileList m_fileList;
 
@@ -564,6 +584,7 @@ struct View
 	bool     m_fit;
 	bool     m_alpha;
 	bool     m_help;
+	bool     m_files;
 	bool     m_sdf;
 };
 
@@ -1063,22 +1084,11 @@ int _main_(int _argc, char** _argv)
 	InterpolatorAngle angy(0.0f);
 
 	const char* filePath = _argc < 2 ? "" : _argv[1];
-	bool directory = false;
-
-	bx::FileInfo fi;
-	bx::stat(filePath, fi);
-	directory = bx::FileInfo::Directory == fi.m_type;
 
 	std::string path = filePath;
-	if (!directory)
 	{
 		bx::FilePath fp(filePath);
-		path.assign(fp.getPath().getPtr(), fp.getPath().getTerm() );
-		view.updateFileList(path.c_str(), fp.getFileName() );
-	}
-	else
-	{
-		view.updateFileList(path.c_str(), "");
+		view.updateFileList(fp);
 	}
 
 	int exitcode = bx::kExitSuccess;
@@ -1111,8 +1121,8 @@ int _main_(int _argc, char** _argv)
 				| (mouseState.m_buttons[entry::MouseButton::Right ] ? IMGUI_MBUT_RIGHT  : 0)
 				| (mouseState.m_buttons[entry::MouseButton::Middle] ? IMGUI_MBUT_MIDDLE : 0)
 				,  mouseState.m_mz
-				, uint16_t(width)
-				, uint16_t(height)
+				,  uint16_t(width)
+				,  uint16_t(height)
 				);
 
 			static bool help = false;
@@ -1162,8 +1172,9 @@ int _main_(int _argc, char** _argv)
 
 			if (ImGui::BeginPopupContextVoid("Menu") )
 			{
-//				if (ImGui::MenuItem("Open") )
+				if (ImGui::MenuItem("Files", NULL, view.m_files) )
 				{
+					cmdExec("view files");
 				}
 
 //				if (ImGui::MenuItem("Save As") )
@@ -1263,6 +1274,67 @@ int _main_(int _argc, char** _argv)
 				help = view.m_help;
 			}
 
+			if (view.m_files)
+			{
+				char temp[bx::kMaxFilePath];
+				bx::snprintf(temp, BX_COUNTOF(temp), "%s##File", view.m_path.get() );
+				if (ImGui::Begin(temp, NULL, ImVec2(400.0f, 400.0f) ) )
+				{
+					if (ImGui::BeginChild("##file_list", ImVec2(0.0f, 0.0f) ) )
+					{
+						ImGui::PushFont(ImGui::Font::Mono);
+						const float itemHeight = ImGui::GetTextLineHeightWithSpacing();
+						const float listHeight =
+							std::max(1.0f, bx::ffloor(ImGui::GetWindowHeight()/itemHeight) )
+							* itemHeight
+							;
+
+						ImGui::PushItemWidth(-1);
+						if (ImGui::ListBoxHeader("##empty", ImVec2(0.0f, listHeight) ) )
+						{
+							const int32_t itemCount  = int32_t(view.m_fileList.size() );
+
+							int32_t start, end;
+							ImGui::CalcListClipping(itemCount, itemHeight, &start, &end);
+
+							const int32_t index = int32_t(view.m_fileIndex);
+							if (index <= start)
+							{
+								ImGui::SetScrollY(ImGui::GetScrollY() - (start-index+1)*itemHeight);
+							}
+							else if (index >= end)
+							{
+								ImGui::SetScrollY(ImGui::GetScrollY() + (index-end+1)*itemHeight);
+							}
+
+							ImGuiListClipper clipper(itemCount, itemHeight);
+
+							for (int32_t pos = clipper.DisplayStart; pos < clipper.DisplayEnd; ++pos)
+							{
+								ImGui::PushID(pos);
+
+								bool isSelected = uint32_t(pos) == view.m_fileIndex;
+								if (ImGui::Selectable(view.m_fileList[pos].c_str(), &isSelected) )
+								{
+									view.m_fileIndex = pos;
+								}
+
+								ImGui::PopID();
+							}
+
+							clipper.End();
+
+							ImGui::ListBoxFooter();
+						}
+
+						ImGui::PopFont();
+						ImGui::EndChild();
+					}
+
+					ImGui::End();
+				}
+			}
+
 			if (ImGui::BeginPopupModal("Help", NULL, ImGuiWindowFlags_AlwaysAutoResize) )
 			{
 				ImGui::SetWindowFontScale(1.0f);
@@ -1340,9 +1412,10 @@ int _main_(int _argc, char** _argv)
 
 				fileIndex = view.m_fileIndex;
 
-				filePath = view.m_fileList[view.m_fileIndex].c_str();
+				bx::FilePath fp = view.m_path;
+				fp.join(view.m_fileList[view.m_fileIndex].c_str() );
 
-				texture = loadTexture(filePath
+				texture = loadTexture(fp.get()
 					, 0
 					| BGFX_TEXTURE_U_CLAMP
 					| BGFX_TEXTURE_V_CLAMP
@@ -1370,7 +1443,7 @@ int _main_(int _argc, char** _argv)
 					}
 
 					bx::stringPrintf(title, "%s (%d x %d%s, mips: %d, layers %d, %s)"
-						, filePath
+						, fp.get()
 						, view.m_info.width
 						, view.m_info.height
 						, name