ソースを参照

texturev: Fixed file dialog scrolling.

Бранимир Караџић 1 年間 前
コミット
e5fb94d142
1 ファイル変更22 行追加27 行削除
  1. 22 27
      tools/texturev/texturev.cpp

+ 22 - 27
tools/texturev/texturev.cpp

@@ -253,15 +253,6 @@ struct RendererTypeRemap
 	bgfx::RendererType::Enum type;
 	bgfx::RendererType::Enum type;
 };
 };
 
 
-static RendererTypeRemap s_rendererTypeRemap[] =
-{
-	{ "gl",    bgfx::RendererType::OpenGL     },
-	{ "d3d11", bgfx::RendererType::Direct3D11 },
-	{ "d3d11", bgfx::RendererType::Direct3D12 },
-	{ "vk",    bgfx::RendererType::Vulkan     },
-	{ "mtl",   bgfx::RendererType::Metal      },
-};
-
 struct View
 struct View
 {
 {
 	View()
 	View()
@@ -1483,11 +1474,7 @@ int _main_(int _argc, char** _argv)
 
 
 	const char* filePath = _argc < 2 ? "" : _argv[1];
 	const char* filePath = _argc < 2 ? "" : _argv[1];
 
 
-	std::string path = filePath;
-	{
-		bx::FilePath fp(filePath);
-		view.updateFileList(fp);
-	}
+	view.updateFileList(filePath);
 
 
 	int exitcode = bx::kExitSuccess;
 	int exitcode = bx::kExitSuccess;
 	bgfx::TextureHandle texture = BGFX_INVALID_HANDLE;
 	bgfx::TextureHandle texture = BGFX_INVALID_HANDLE;
@@ -1880,11 +1867,15 @@ int _main_(int _argc, char** _argv)
 
 
 			if (view.m_files)
 			if (view.m_files)
 			{
 			{
+				ImGui::PushFont(ImGui::Font::Mono);
+				const float itemHeight = ImGui::GetTextLineHeightWithSpacing();
+				ImGui::PopFont();
+
 				char temp[bx::kMaxFilePath];
 				char temp[bx::kMaxFilePath];
 				bx::snprintf(temp, BX_COUNTOF(temp), "%s##File", view.m_path.getCPtr() );
 				bx::snprintf(temp, BX_COUNTOF(temp), "%s##File", view.m_path.getCPtr() );
 
 
 				ImGui::SetNextWindowSize(
 				ImGui::SetNextWindowSize(
-					  ImVec2(400.0f, 400.0f)
+					  ImVec2(400.0f, 20*itemHeight)
 					, ImGuiCond_FirstUseEver
 					, ImGuiCond_FirstUseEver
 					);
 					);
 
 
@@ -1907,26 +1898,23 @@ int _main_(int _argc, char** _argv)
 							ImGuiListClipper clipper;
 							ImGuiListClipper clipper;
 							clipper.Begin(itemCount, itemHeight);
 							clipper.Begin(itemCount, itemHeight);
 
 
-							int32_t start = clipper.DisplayStart;
-							int32_t end   = clipper.DisplayEnd;
+							const  int32_t index = int32_t(view.m_fileIndex);
+							static int32_t oldIndex  = index;
+							const  int32_t direction = bx::clamp(index - oldIndex, -1, 1);
+							oldIndex = index;
 
 
-							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);
-							}
+							bool currentVisible = false;
 
 
 							while (clipper.Step() )
 							while (clipper.Step() )
 							{
 							{
+								currentVisible |= index > clipper.DisplayStart && index < clipper.DisplayEnd;
+
 								for (int32_t pos = clipper.DisplayStart; pos < clipper.DisplayEnd; ++pos)
 								for (int32_t pos = clipper.DisplayStart; pos < clipper.DisplayEnd; ++pos)
 								{
 								{
 									ImGui::PushID(pos);
 									ImGui::PushID(pos);
 
 
-									bool isSelected = uint32_t(pos) == view.m_fileIndex;
+									bool isSelected = pos == index;
+
 									if (ImGui::Selectable(view.m_fileList[pos].c_str(), &isSelected) )
 									if (ImGui::Selectable(view.m_fileList[pos].c_str(), &isSelected) )
 									{
 									{
 										view.m_fileIndex = pos;
 										view.m_fileIndex = pos;
@@ -1936,6 +1924,13 @@ int _main_(int _argc, char** _argv)
 								}
 								}
 							}
 							}
 
 
+							if (0 != direction && !currentVisible)
+							{
+								const int32_t num  = int32_t(listHeight / itemHeight);
+								const int32_t posY = index + (1 == direction ? 1-num : 0);
+								ImGui::SetScrollY(posY*itemHeight);
+							}
+
 							clipper.End();
 							clipper.End();
 
 
 							ImGui::EndListBox();
 							ImGui::EndListBox();