diff --git a/tools/texturev/texturev.cpp b/tools/texturev/texturev.cpp index e41acc67a..09769717e 100644 --- a/tools/texturev/texturev.cpp +++ b/tools/texturev/texturev.cpp @@ -24,8 +24,9 @@ #include #include -#include namespace stl = tinystl; +#include +#include #include @@ -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 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