File Browser basic functionality working
parent
18ce0d4375
commit
9e6a15d08f
@ -0,0 +1,273 @@
|
||||
/******************************************************************************
|
||||
* File - fileBrowser.cpp
|
||||
* Author - Joey Pollack
|
||||
* Date - 2021/11/04 (y/m/d)
|
||||
* Mod Date - 2021/11/04 (y/m/d)
|
||||
* Description - File browser dialog window. Can be used for opening
|
||||
* and saving files.
|
||||
******************************************************************************/
|
||||
|
||||
#include "fileBrowser.h"
|
||||
|
||||
#include <core/core.h>
|
||||
#include <assets/types/image.h>
|
||||
#include <graphics/igraphics.h>
|
||||
#include <utils/stb/stb_image.h>
|
||||
#include <dearimgui/imgui.h>
|
||||
|
||||
namespace lunarium
|
||||
{
|
||||
FileBrowser::FileBrowser()
|
||||
: mIsOpen(false), mSelectionMode(SelectionMode::FILES_ONLY), mWarnOnExisting(false), mpFolderIcon(nullptr), mResult(Result::CANCEL),
|
||||
mpNewFolderIcon(nullptr), mpUpFolderIcon(nullptr)
|
||||
{
|
||||
int x,y,n;
|
||||
unsigned char* pData = stbi_load("dir_icon.png", &x, &y, &n, 0);
|
||||
mpFolderIcon = new Image(pData, x, y, ImageFormat::RGBA);
|
||||
Core::Graphics().RegisterImage(*mpFolderIcon);
|
||||
mpFolderIcon->FreeRawData();
|
||||
|
||||
pData = stbi_load("new_dir_icon.png", &x, &y, &n, 0);
|
||||
mpNewFolderIcon = new Image(pData, x, y, ImageFormat::RGBA);
|
||||
Core::Graphics().RegisterImage(*mpNewFolderIcon);
|
||||
mpNewFolderIcon->FreeRawData();
|
||||
|
||||
pData = stbi_load("up_arrow_icon.png", &x, &y, &n, 0);
|
||||
mpUpFolderIcon = new Image(pData, x, y, ImageFormat::RGBA);
|
||||
Core::Graphics().RegisterImage(*mpUpFolderIcon);
|
||||
mpUpFolderIcon->FreeRawData();
|
||||
}
|
||||
|
||||
/// If the given path does not exist this will default to the
|
||||
/// current working directory
|
||||
bool FileBrowser::OpenInDirectory(std::filesystem::path path)
|
||||
{
|
||||
if (mIsOpen)
|
||||
return false;
|
||||
|
||||
if (!std::filesystem::exists(path))
|
||||
path = std::filesystem::current_path();
|
||||
|
||||
if (!std::filesystem::is_directory(path))
|
||||
return false;
|
||||
|
||||
mCurrentDirectory = path;
|
||||
|
||||
// Get list of items in the current directory
|
||||
ReloadItems();
|
||||
|
||||
mIsOpen = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FileBrowser::DoFrame()
|
||||
{
|
||||
if (!mIsOpen)
|
||||
return false;
|
||||
|
||||
ImGui::SetNextWindowSize(ImVec2(600, 400), ImGuiCond_Appearing);
|
||||
if (!ImGui::Begin("File Browser", &mIsOpen, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoDocking))
|
||||
{
|
||||
ImGui::End();
|
||||
return false;
|
||||
}
|
||||
|
||||
ImVec2 iconSize(mpNewFolderIcon->GetWidth(), mpNewFolderIcon->GetHeight());
|
||||
if (ImGui::ImageButton((ImTextureID) mpNewFolderIcon->GetGLTextureID(), iconSize))
|
||||
{
|
||||
ImGui::OpenPopup("New Folder Name");
|
||||
memset(mInputBuffer, 0, mBufferSize);
|
||||
}
|
||||
|
||||
if (ImGui::BeginPopup("New Folder Name"))
|
||||
{
|
||||
if (ImGui::InputText("Folder Name", mInputBuffer, mBufferSize, ImGuiInputTextFlags_EnterReturnsTrue))
|
||||
{
|
||||
std::filesystem::create_directory(mInputBuffer);
|
||||
ImGui::CloseCurrentPopup();
|
||||
ReloadItems();
|
||||
}
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
|
||||
ImGui::SameLine();
|
||||
iconSize = ImVec2(mpUpFolderIcon->GetWidth(), mpUpFolderIcon->GetHeight());
|
||||
if (ImGui::ImageButton((ImTextureID) mpUpFolderIcon->GetGLTextureID(), iconSize))
|
||||
{
|
||||
mCurrentDirectory = mCurrentDirectory.parent_path();
|
||||
ReloadItems();
|
||||
}
|
||||
|
||||
ImGui::SameLine();
|
||||
ImGui::TextUnformatted(mCurrentDirectory.string().c_str());
|
||||
|
||||
DoListBox();
|
||||
|
||||
ImGui::Separator();
|
||||
if (mpSelectedItem)
|
||||
{
|
||||
ImGui::Text("Selected: %s", mpSelectedItem->filename().string().c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
ImGui::Text("Selected: ");
|
||||
}
|
||||
|
||||
ImGui::Separator();
|
||||
|
||||
bool res = DoButtons();
|
||||
|
||||
ImGui::End();
|
||||
return res;
|
||||
}
|
||||
|
||||
void FileBrowser::AddExtensionFilter(std::string ext)
|
||||
{
|
||||
mExtensionsFilter.push_back(ext);
|
||||
}
|
||||
|
||||
void FileBrowser::SetSelectionMode(SelectionMode mode)
|
||||
{
|
||||
mSelectionMode = mode;
|
||||
}
|
||||
|
||||
void FileBrowser::WarnOnExistingFileSelection(bool warn)
|
||||
{
|
||||
mWarnOnExisting = warn;
|
||||
}
|
||||
|
||||
|
||||
/// returns nullptr if the dialog has not been opened yet
|
||||
const std::filesystem::path* FileBrowser::GetSelectedItem() const
|
||||
{
|
||||
return mpSelectedItem;
|
||||
}
|
||||
|
||||
FileBrowser::Result FileBrowser::GetResult() const
|
||||
{
|
||||
return mResult;
|
||||
}
|
||||
|
||||
bool FileBrowser::IsOpen() const
|
||||
{
|
||||
return mIsOpen;
|
||||
}
|
||||
|
||||
void FileBrowser::ReloadItems()
|
||||
{
|
||||
mpSelectedItem = nullptr;
|
||||
mItemsInDir.clear();
|
||||
for(auto const& dir_entry: std::filesystem::directory_iterator{mCurrentDirectory})
|
||||
{
|
||||
mItemsInDir.push_back(dir_entry.path());
|
||||
}
|
||||
|
||||
// Sort by type and then by name
|
||||
std::sort(mItemsInDir.begin(), mItemsInDir.end(), [](std::filesystem::path& lhs, std::filesystem::path& rhs)
|
||||
{
|
||||
if (std::filesystem::is_directory(lhs) && std::filesystem::is_directory(rhs))
|
||||
{
|
||||
return strcmpi(lhs.filename().string().c_str(), rhs.filename().string().c_str()) < 0;
|
||||
}
|
||||
|
||||
if (std::filesystem::is_directory(lhs) && !std::filesystem::is_directory(rhs))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// RENDER HELPER METHODS
|
||||
////////////////////////////////////////////////////////////
|
||||
void FileBrowser::DoListBox()
|
||||
{
|
||||
if (ImGui::BeginListBox("", ImVec2(ImGui::GetWindowWidth(), ImGui::GetWindowHeight() * .65f)))
|
||||
{
|
||||
for (int i = 0; i < mItemsInDir.size(); i++)
|
||||
{
|
||||
if (std::filesystem::is_directory(mItemsInDir[i]))
|
||||
{
|
||||
ImVec2 size(mpFolderIcon->GetWidth(), mpFolderIcon->GetHeight());
|
||||
ImTextureID id = (ImTextureID) mpFolderIcon->GetGLTextureID();
|
||||
ImGui::Image(id, size);
|
||||
ImGui::SameLine();
|
||||
}
|
||||
if (ImGui::Selectable(mItemsInDir[i].filename().string().c_str()))
|
||||
{
|
||||
if (std::filesystem::is_directory(mItemsInDir[i]))
|
||||
{
|
||||
mCurrentDirectory /= mItemsInDir[i];
|
||||
ReloadItems();
|
||||
|
||||
if (mSelectionMode == SelectionMode::DIRECTORIES_ONLY || mSelectionMode == SelectionMode::ANY)
|
||||
{
|
||||
mpSelectedItem = &mCurrentDirectory;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mSelectionMode == SelectionMode::FILES_ONLY || mSelectionMode == SelectionMode::ANY)
|
||||
{
|
||||
mpSelectedItem = &mItemsInDir[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ImGui::EndListBox();
|
||||
}
|
||||
}
|
||||
|
||||
bool FileBrowser::DoButtons()
|
||||
{
|
||||
ImGui::SetCursorPosX(ImGui::GetWindowSize().x - 100.0f);
|
||||
if (ImGui::Button("OK"))
|
||||
{
|
||||
if (std::filesystem::exists(*mpSelectedItem) && mWarnOnExisting)
|
||||
{
|
||||
ImGui::OpenPopup("Warn");
|
||||
}
|
||||
else
|
||||
{
|
||||
mResult = Result::OK;
|
||||
mIsOpen = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (ImGui::BeginPopup("Warn"))
|
||||
{
|
||||
ImGui::Text("This file already exists. Are you sure you want to overwrite it?");
|
||||
if (ImGui::Button("Yes"))
|
||||
{
|
||||
mResult = Result::OK;
|
||||
mIsOpen = false;
|
||||
ImGui::EndPopup();
|
||||
return false;
|
||||
}
|
||||
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("No"))
|
||||
{
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
|
||||
ImGui::SameLine();
|
||||
|
||||
if (ImGui::Button("Cancel"))
|
||||
{
|
||||
mResult = Result::CANCEL;
|
||||
mIsOpen = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,81 @@
|
||||
/******************************************************************************
|
||||
* File - fileBrowser.h
|
||||
* Author - Joey Pollack
|
||||
* Date - 2021/11/04 (y/m/d)
|
||||
* Mod Date - 2021/11/04 (y/m/d)
|
||||
* Description - File browser dialog window. Can be used for opening
|
||||
* and saving files.
|
||||
******************************************************************************/
|
||||
|
||||
// Some useful links:
|
||||
// https://en.cppreference.com/w/cpp/filesystem/is_directory
|
||||
// https://en.cppreference.com/w/cpp/filesystem/path
|
||||
|
||||
#ifndef FILE_SELECT_H_
|
||||
#define FILE_SELECT_H_
|
||||
|
||||
#include <utils/opRes.h>
|
||||
|
||||
#include <vector>
|
||||
#include <filesystem>
|
||||
|
||||
namespace lunarium
|
||||
{
|
||||
class Image;
|
||||
class FileBrowser
|
||||
{
|
||||
public:
|
||||
enum Result
|
||||
{
|
||||
OK,
|
||||
CANCEL
|
||||
};
|
||||
|
||||
enum SelectionMode
|
||||
{
|
||||
FILES_ONLY,
|
||||
DIRECTORIES_ONLY,
|
||||
ANY,
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
FileBrowser();
|
||||
bool OpenInDirectory(std::filesystem::path path);
|
||||
bool DoFrame();
|
||||
bool IsOpen() const;
|
||||
|
||||
void AddExtensionFilter(std::string ext);
|
||||
void SetSelectionMode(SelectionMode mode);
|
||||
void WarnOnExistingFileSelection(bool warn);
|
||||
|
||||
// returns nullptr if the dialog has not been opened yet
|
||||
const std::filesystem::path* GetSelectedItem() const;
|
||||
Result GetResult() const;
|
||||
|
||||
private:
|
||||
|
||||
bool mIsOpen;
|
||||
SelectionMode mSelectionMode;
|
||||
bool mWarnOnExisting;
|
||||
Result mResult;
|
||||
std::filesystem::path mCurrentDirectory;
|
||||
std::vector<std::filesystem::path> mItemsInDir;
|
||||
std::vector<std::string> mExtensionsFilter; // Show only these extensions. If empty show all files.
|
||||
std::filesystem::path* mpSelectedItem;
|
||||
|
||||
Image* mpFolderIcon;
|
||||
Image* mpNewFolderIcon;
|
||||
Image* mpUpFolderIcon;
|
||||
static const int mBufferSize = 256;
|
||||
char mInputBuffer[mBufferSize];
|
||||
|
||||
private:
|
||||
void ReloadItems();
|
||||
void DoListBox();
|
||||
bool DoButtons();
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif // FILE_SELECT_H_
|
||||
@ -0,0 +1,14 @@
|
||||
/******************************************************************************
|
||||
* File - sceneTree.cpp
|
||||
* Author - Joey Pollack
|
||||
* Date - 2021/11/04 (y/m/d)
|
||||
* Mod Date - 2021/11/04 (y/m/d)
|
||||
* Description - The tree view listing all objects in the scene
|
||||
******************************************************************************/
|
||||
|
||||
#include "sceneTree.h"
|
||||
|
||||
namespace lunarium
|
||||
{
|
||||
|
||||
}
|
||||
@ -0,0 +1,22 @@
|
||||
/******************************************************************************
|
||||
* File - sceneTree.h
|
||||
* Author - Joey Pollack
|
||||
* Date - 2021/11/04 (y/m/d)
|
||||
* Mod Date - 2021/11/04 (y/m/d)
|
||||
* Description - The tree view listing all objects in the scene
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef SCENE_TREE_H_
|
||||
#define SCENE_TREE_H_
|
||||
|
||||
#include "iPanel.h"
|
||||
|
||||
namespace lunarium
|
||||
{
|
||||
class SceneTree : public Panel
|
||||
{
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
#endif // SCENE_TREE_H_
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 698 B |
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
Binary file not shown.
Loading…
Reference in New Issue