mirror of
https://github.com/bulletphysics/bullet3
synced 2025-01-10 17:30:12 +00:00
28e580c203
fixed several warnings, thanks to sparkprime added comments patch for linear math, thanks to Tully Foote
166 lines
3.9 KiB
C++
166 lines
3.9 KiB
C++
/****************************************************************************
|
|
|
|
GLUI User Interface Toolkit
|
|
---------------------------
|
|
|
|
glui_filebrowser.cpp - GLUI_FileBrowser control class
|
|
|
|
|
|
--------------------------------------------------
|
|
|
|
Copyright (c) 1998 Paul Rademacher
|
|
|
|
This program is freely distributable without licensing fees and is
|
|
provided without guarantee or warrantee expressed or implied. This
|
|
program is -not- in the public domain.
|
|
|
|
*****************************************************************************/
|
|
|
|
#include "GL/glui.h"
|
|
#include "glui_internal.h"
|
|
#include <sys/types.h>
|
|
|
|
#ifdef __GNUC__
|
|
#include <dirent.h>
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
#include <sys/stat.h>
|
|
|
|
GLUI_FileBrowser::GLUI_FileBrowser( GLUI_Node *parent,
|
|
const char *name,
|
|
int type,
|
|
int id,
|
|
GLUI_CB cb)
|
|
{
|
|
common_init();
|
|
|
|
set_name( name );
|
|
user_id = id;
|
|
int_val = type;
|
|
callback = cb;
|
|
|
|
parent->add_control( this );
|
|
list = new GLUI_List(this, true, 1);
|
|
list->set_object_callback( GLUI_FileBrowser::dir_list_callback, this );
|
|
list->set_click_type(GLUI_DOUBLE_CLICK);
|
|
this->fbreaddir(this->current_dir.c_str());
|
|
}
|
|
|
|
/****************************** GLUI_FileBrowser::draw() **********/
|
|
|
|
void GLUI_FileBrowser::dir_list_callback(GLUI_Control *glui_object) {
|
|
GLUI_List *list = glui_object->dynamicCastGLUI_List();
|
|
if (!list)
|
|
return;
|
|
GLUI_FileBrowser* me = list->associated_object->dynamicCastGLUI_FileBrowser();
|
|
if (!me)
|
|
return;
|
|
int this_item;
|
|
const char *selected;
|
|
this_item = list->get_current_item();
|
|
if (this_item > 0) { /* file or directory selected */
|
|
selected = list->get_item_ptr( this_item )->text.c_str();
|
|
if (selected[0] == '/' || selected[0] == '\\') {
|
|
if (me->allow_change_dir) {
|
|
#ifdef __GNUC__
|
|
chdir(selected+1);
|
|
#endif
|
|
#ifdef _WIN32
|
|
SetCurrentDirectory(selected+1);
|
|
#endif
|
|
me->fbreaddir(".");
|
|
}
|
|
} else {
|
|
me->file = selected;
|
|
me->execute_callback();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void GLUI_FileBrowser::fbreaddir(const char *d) {
|
|
GLUI_String item;
|
|
int i = 0;
|
|
|
|
if (!d)
|
|
return;
|
|
|
|
#ifdef _WIN32
|
|
|
|
WIN32_FIND_DATA FN;
|
|
HANDLE hFind;
|
|
//char search_arg[MAX_PATH], new_file_path[MAX_PATH];
|
|
//sprintf(search_arg, "%s\\*.*", path_name);
|
|
|
|
hFind = FindFirstFile("*.*", &FN);
|
|
if (list) {
|
|
list->delete_all();
|
|
if (hFind != INVALID_HANDLE_VALUE) {
|
|
do {
|
|
int len = int(strlen(FN.cFileName));
|
|
if (FN.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
|
item = '\\';
|
|
item += FN.cFileName;
|
|
} else {
|
|
item = FN.cFileName;
|
|
}
|
|
list->add_item(i,item.c_str());
|
|
i++;
|
|
} while (FindNextFile(hFind, &FN) != 0);
|
|
|
|
if (GetLastError() == ERROR_NO_MORE_FILES)
|
|
FindClose(&FN);
|
|
else
|
|
perror("fbreaddir");
|
|
}
|
|
}
|
|
|
|
#elif defined(__GNUC__)
|
|
|
|
DIR *dir;
|
|
struct dirent *dirp;
|
|
struct stat dr;
|
|
|
|
if (list) {
|
|
list->delete_all();
|
|
if ((dir = opendir(d)) == NULL)
|
|
perror("fbreaddir:");
|
|
else {
|
|
while ((dirp = readdir(dir)) != NULL) /* open directory */
|
|
{
|
|
if (!lstat(dirp->d_name,&dr) && S_ISDIR(dr.st_mode)) /* dir is directory */
|
|
item = dirp->d_name + GLUI_String("/");
|
|
else
|
|
item = dirp->d_name;
|
|
|
|
list->add_item(i,item.c_str());
|
|
i++;
|
|
}
|
|
closedir(dir);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void ProcessFiles(const char *path_name)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
void GLUI_FileBrowser::set_w(int w)
|
|
{
|
|
if (list) list->set_w(w);
|
|
}
|
|
|
|
void GLUI_FileBrowser::set_h(int h)
|
|
{
|
|
if (list) list->set_h(h);
|
|
}
|