glui_filebrowser.cpp
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:4k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /****************************************************************************
  2.   
  3.   GLUI User Interface Toolkit
  4.   ---------------------------
  5.      glui_filebrowser.cpp - GLUI_FileBrowser control class
  6.           --------------------------------------------------
  7.   Copyright (c) 1998 Paul Rademacher
  8.   This program is freely distributable without licensing fees and is
  9.   provided without guarantee or warrantee expressed or implied. This
  10.   program is -not- in the public domain.
  11. *****************************************************************************/
  12. #include "GL/glui.h"
  13. #include "glui_internal.h"
  14. #include <sys/types.h>
  15. #ifdef __GNUC__
  16. #include <dirent.h>
  17. #include <unistd.h>
  18. #endif
  19. #ifdef _WIN32
  20. #include <windows.h>
  21. #endif
  22. #include <sys/stat.h>
  23. GLUI_FileBrowser::GLUI_FileBrowser( GLUI_Node *parent, 
  24.                                     const char *name,
  25.                                     int type,
  26.                                     int id,
  27.                                     GLUI_CB cb)
  28. {
  29.   common_init();
  30.   set_name( name );
  31.   user_id    = id;
  32.   int_val    = type;
  33.   callback   = cb;
  34.   parent->add_control( this );
  35.   list = new GLUI_List(this, true, 1);
  36.   list->set_object_callback( GLUI_FileBrowser::dir_list_callback, this );
  37.   list->set_click_type(GLUI_DOUBLE_CLICK);
  38.   this->fbreaddir(this->current_dir.c_str());
  39. }
  40. /****************************** GLUI_FileBrowser::draw() **********/
  41. void GLUI_FileBrowser::dir_list_callback(GLUI_Control *glui_object) {
  42.   GLUI_List *list = dynamic_cast<GLUI_List*>(glui_object);
  43.   if (!list) 
  44.     return;
  45.   GLUI_FileBrowser* me = dynamic_cast<GLUI_FileBrowser*>(list->associated_object);
  46.   if (!me)
  47.     return;
  48.   int this_item;
  49.   const char *selected;
  50.   this_item = list->get_current_item();
  51.   if (this_item > 0) { /* file or directory selected */
  52.     selected = list->get_item_ptr( this_item )->text.c_str();
  53.     if (selected[0] == '/' || selected[0] == '\') {
  54.       if (me->allow_change_dir) {
  55. #ifdef __GNUC__
  56.         chdir(selected+1);
  57. #endif
  58. #ifdef _WIN32
  59.         SetCurrentDirectory(selected+1);
  60. #endif
  61.         me->fbreaddir(".");
  62.       }
  63.     } else {
  64.       me->file = selected;
  65.       me->execute_callback();
  66.     }
  67.   }
  68. }
  69. void GLUI_FileBrowser::fbreaddir(const char *d) {
  70.   GLUI_String item;
  71.   int i = 0;
  72. if (!d)
  73.     return;
  74. #ifdef _WIN32
  75.   WIN32_FIND_DATA FN;
  76.   HANDLE hFind;
  77.   //char search_arg[MAX_PATH], new_file_path[MAX_PATH];
  78.   //sprintf(search_arg, "%s\*.*", path_name);
  79.   
  80.   hFind = FindFirstFile("*.*", &FN);
  81.   if (list) {
  82.     list->delete_all();
  83.     if (hFind != INVALID_HANDLE_VALUE) {
  84.       do {
  85.         int len = strlen(FN.cFileName);
  86.         if (FN.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
  87.           item = '\';
  88.           item += FN.cFileName;
  89.         } else {
  90.           item = FN.cFileName;
  91.         }
  92.         list->add_item(i,item.c_str());
  93.         i++;
  94.       } while (FindNextFile(hFind, &FN) != 0);
  95.       
  96.       if (GetLastError() == ERROR_NO_MORE_FILES)
  97.         FindClose(&FN);
  98.       else
  99.         perror("fbreaddir");
  100.     }
  101.   }
  102. #elif defined(__GNUC__)
  103.   DIR *dir;
  104.   struct dirent *dirp;
  105.   struct stat dr;
  106.   if (list) {
  107.     list->delete_all();
  108.     if ((dir = opendir(d)) == NULL)
  109.       perror("fbreaddir:");
  110.     else {
  111.       while ((dirp = readdir(dir)) != NULL)   /* open directory     */
  112.       { 
  113.         if (!lstat(dirp->d_name,&dr) && S_ISDIR(dr.st_mode)) /* dir is directory   */
  114.           item = dirp->d_name + GLUI_String("/");
  115.         else
  116.           item = dirp->d_name;
  117.         list->add_item(i,item.c_str());
  118.         i++;
  119.       }
  120.       closedir(dir);
  121.     }
  122.   }
  123. #endif
  124. }
  125. void ProcessFiles(const char *path_name)
  126. {
  127. }
  128. void GLUI_FileBrowser::set_w(int w) 
  129.   if (list) list->set_w(w);
  130. }
  131. void GLUI_FileBrowser::set_h(int h) 
  132. {
  133.   if (list) list->set_h(h);
  134. }