diff options
Diffstat (limited to 'plugingui')
| -rw-r--r-- | plugingui/directory.cc | 669 | ||||
| -rw-r--r-- | plugingui/directory.h | 102 | ||||
| -rw-r--r-- | plugingui/filebrowser.cc | 8 | 
3 files changed, 452 insertions, 327 deletions
| diff --git a/plugingui/directory.cc b/plugingui/directory.cc index 1465c86..8249a82 100644 --- a/plugingui/directory.cc +++ b/plugingui/directory.cc @@ -28,7 +28,7 @@  #include <dirent.h>  #include <stdio.h> -#include <string>  +#include <string>  #include <algorithm>  #include <vector>  #include <string.h> @@ -44,14 +44,16 @@  // http://en.wikipedia.org/wiki/Path_(computing)  #ifdef WIN32 -  #define SEP "\\" +#define SEP "\\"  #else -  #define SEP "/" +#define SEP "/"  #endif +namespace GUI { +  Directory::Directory(std::string path)  { -  setPath(path); +	setPath(path);  }  Directory::~Directory() @@ -60,384 +62,507 @@ Directory::~Directory()  std::string Directory::seperator()  { -  return SEP; +	return SEP;  }  void Directory::setPath(std::string path)  { -  DEBUG(directory, "Setting path to '%s'\n", path.c_str()); -  this->_path = cleanPath(path); -  refresh(); +	//DEBUG(directory, "Setting path to '%s'\n", path.c_str()); +	this->_path = cleanPath(path); +	refresh();  }  size_t Directory::count()  { -  return _files.size(); +	return _files.size();  }  void Directory::refresh()  { -  _files = listFiles(_path, DIRECTORY_HIDDEN); -//  _files = listFiles(_path); +	_files = listFiles(_path, DIRECTORY_HIDDEN); +	//_files = listFiles(_path);  }  bool Directory::cd(std::string dir)  { -  //TODO: Should this return true or false? -  if(dir.empty() || dir == ".") return true; - -  DEBUG(directory, "Changing to '%s'\n", dir.c_str()); -  if(exists(_path + SEP + dir)) { -    std::string path = _path + SEP + dir; -    setPath(path); -    refresh(); -    return true; -  } else { -    return false; -  } +	//TODO: Should this return true or false? +	if(dir.empty() || dir == ".") +	{ +		return true; +	} + +	//DEBUG(directory, "Changing to '%s'\n", dir.c_str()); +	if(exists(_path + SEP + dir)) +	{ +		std::string path = _path + SEP + dir; +		setPath(path); +		refresh(); +		return true; +	} +	else +	{ +		return false; +	}  }  bool Directory::cdUp()  { -  return this->cd(".."); +	return this->cd("..");  }  std::string Directory::path()  { -  return cleanPath(_path); +	return cleanPath(_path);  }  Directory::EntryList Directory::entryList()  { -  return _files; +	return _files;  }  #define MAX_FILE_LENGTH 1024 -std::string Directory::cwd() { -  char path[MAX_FILE_LENGTH]; -  char* c = getcwd(path, MAX_FILE_LENGTH); - -  if(c) return c; -  else return ""; +std::string Directory::cwd() +{ +	char path[MAX_FILE_LENGTH]; +	char* c = getcwd(path, MAX_FILE_LENGTH); + +	if(c) +	{ +		return c; +	} +	else +	{ +		return ""; +	}  }  std::string Directory::cleanPath(std::string path)  { -  DEBUG(directory, "Cleaning path '%s'\n", path.c_str()); - -  Directory::Path pathlst = parsePath(path); -  return Directory::pathToStr(pathlst);   +	//DEBUG(directory, "Cleaning path '%s'\n", path.c_str()); +	Directory::Path pathlst = parsePath(path); +	return Directory::pathToStr(pathlst);  }  Directory::EntryList Directory::listFiles(std::string path, unsigned char filter)  { -  DEBUG(directory, "Listing files in '%s'\n", path.c_str()); - -  Directory::EntryList entries; -  DIR *dir = opendir(path.c_str()); -  if(!dir) { -    DEBUG(directory, "Couldn't open directory '%s\n", path.c_str());  -    return entries; -  } - -  std::vector<std::string> directories; -  std::vector<std::string> files; - -  struct dirent *entry; -  while((entry = readdir(dir)) != NULL) { -    std::string name = entry->d_name; -    if(name == ".") continue; - -    if(Directory::isRoot(path) && name == "..") continue; -     -    unsigned char entryinfo = 0; -    if(isHidden(path + SEP + name)) { -      entryinfo |= DIRECTORY_HIDDEN; -    } - -    std::string entrypath = path; -    entrypath += SEP; -    entrypath += entry->d_name; -    if(Directory::isDir(entrypath)) { -      if(!(entryinfo && filter)) { -        if(name == "..") directories.push_back(entry->d_name); -        else directories.push_back(std::string(SEP) + entry->d_name); -      } -    } -    else { -      int drumkit_suffix_length = strlen(DRUMKIT_SUFFIX); -      if((int)name.size() < drumkit_suffix_length) continue; -      if(name.substr(name.length() - drumkit_suffix_length,  -          drumkit_suffix_length) != DRUMKIT_SUFFIX) { -        continue; -      } - - -//      if(!(entryinfo && filter)) { -        files.push_back(entry->d_name); -//      } -    } -  } - +	DEBUG(directory, "Listing files in '%s'\n", path.c_str()); + +	Directory::EntryList entries; +	DIR *dir = opendir(path.c_str()); +	if(!dir) +	{ +		//DEBUG(directory, "Couldn't open directory '%s\n", path.c_str()); +		return entries; +	} + +	std::vector<std::string> directories; +	std::vector<std::string> files; + +	struct dirent *entry; +	while((entry = readdir(dir)) != NULL) +	{ +		std::string name = entry->d_name; +		if(name == ".") +		{ +			continue; +		} + +		if(Directory::isRoot(path) && name == "..") +		{ +			continue; +		} + +		unsigned char entryinfo = 0; +		if(isHidden(path + SEP + name)) +		{ +			entryinfo |= DIRECTORY_HIDDEN; +		} + +		std::string entrypath = path; +		entrypath += SEP; +		entrypath += entry->d_name; +		if(Directory::isDir(entrypath)) +		{ +			if(!(entryinfo && filter)) +			{ +				if(name == "..") +				{ +					directories.push_back(entry->d_name); +				} +				else +				{ +					directories.push_back(std::string(SEP) + entry->d_name); +				} +			} +		} +		else +		{ +			int drumkit_suffix_length = strlen(DRUMKIT_SUFFIX); +			if((int)name.size() < drumkit_suffix_length) +			{ +				continue; +			} + +			if(name.substr(name.length() - drumkit_suffix_length, +			               drumkit_suffix_length) != DRUMKIT_SUFFIX) +			{ +				continue; +			} + + +			//if(!(entryinfo && filter)) { +			files.push_back(entry->d_name); +			//} +		} +	}  #ifdef WIN32 -	DEBUG(directory, "Root is %s\n", Directory::root(path).c_str());  -	DEBUG(directory, "Current path %s is root? %d", path.c_str(), Directory::isRoot(path));  -if(Directory::isRoot(path)) entries.push_back("..");  +	//DEBUG(directory, "Root is %s\n", Directory::root(path).c_str()); +	//DEBUG(directory, "Current path %s is root? %d", path.c_str(), +	//      Directory::isRoot(path)); +	if(Directory::isRoot(path)) +	{ +		entries.push_back(".."); +	}  #endif -  // sort -  for(int x = 0; x < (int)directories.size(); x++) { -    for(int y = 0; y < (int)directories.size(); y++) { -      if(directories[x] < directories[y]) { -         -        std::string tmp = directories[x]; -        directories[x] = directories[y]; -        directories[y] = tmp; -      } -    } -  } - -  for(int x = 0; x < (int)files.size(); x++) { -    for(int y = 0; y < (int)files.size(); y++) { -      if(files[x] < files[y]) { -         -        std::string tmp = files[x]; -        files[x] = files[y]; -        files[y] = tmp; -      } -    } -  } - - -  for(std::vector<std::string>::iterator it = directories.begin(); it != directories.end(); it++) { -    entries.push_back(*it); -  } - -  for(std::vector<std::string>::iterator it = files.begin(); it != files.end(); it++) { -    entries.push_back(*it); -  } - - -  return entries; +	// sort +	for(int x = 0; x < (int)directories.size(); x++) +	{ +		for(int y = 0; y < (int)directories.size(); y++) +		{ +			if(directories[x] < directories[y]) +			{ +				std::string tmp = directories[x]; +				directories[x] = directories[y]; +				directories[y] = tmp; +			} +		} +	} + +	for(int x = 0; x < (int)files.size(); x++) +	{ +		for(int y = 0; y < (int)files.size(); y++) +		{ +			if(files[x] < files[y]) +			{ +				std::string tmp = files[x]; +				files[x] = files[y]; +				files[y] = tmp; +			} +		} +	} + + +	for(auto it = directories.begin(); it != directories.end(); ++it) +	{ +		entries.push_back(*it); +	} + +	for(auto it = files.begin(); it != files.end(); ++it) +	{ +		entries.push_back(*it); +	} + + +	return entries;  }  bool Directory::isRoot(std::string path)  {  #ifdef WIN32 -  std::transform(path.begin(), path.end(), path.begin(), ::tolower); -  std::string root_str = Directory::root(path);  -  std::transform(root_str.begin(), root_str.end(), root_str.begin(), ::tolower); -  // TODO: This is not a correct root calculation, but works with partitions -  if(path.size() == 2) { -    if(path == root_str) return true; -    else return false; -  } else if (path.size() == 3) { -    if(path == root_str + SEP) return true; -    return false; -  } else { -    return false; -  } +	std::transform(path.begin(), path.end(), path.begin(), ::tolower); +	std::string root_str = Directory::root(path); +	std::transform(root_str.begin(), root_str.end(), root_str.begin(), ::tolower); + +	// TODO: This is not a correct root calculation, but works with partitions +	if(path.size() == 2) +	{ +		if(path == root_str) +		{ +			return true; +		} +		else +		{ +			return false; +		} +	} +	else +	{ +		if (path.size() == 3) +		{ +			if(path == root_str + SEP) +			{ +				return true; +			} +			return false; +		} +		else +		{ +			return false; +		} +	}  #else -  if(path == SEP) return true; -  else return false; +	if(path == SEP) +	{ +		return true; +	} +	else +	{ +		return false; +	}  #endif  }  std::string Directory::root()  { -  return root(cwd()); +	return root(cwd());  }  std::string Directory::root(std::string path)  {  #ifdef WIN32 -  if(path.size() < 2) { -    return "c:"; // just something default when input is bad -  } else { -    return path.substr(0, 2); -  } +	if(path.size() < 2) +	{ +		return "c:"; // just something default when input is bad +	} +	else +	{ +		return path.substr(0, 2); +	}  #else -  return SEP; +	return SEP;  #endif  }  Directory::DriveList Directory::drives()  { -  Directory::DriveList drives; +	Directory::DriveList drives;  #ifdef WIN32 -  unsigned int d = GetLogicalDrives(); -  for(int i = 0; i < 32; i++) { -    if(d & (1 << i)) { -      drive_t drive; -      char name[] = "x:"; -      name[0] = i + 'a'; - -      drive.name = name; -      drive.number = i; -      drives.push_back(drive); -    } -  } +	unsigned int d = GetLogicalDrives(); +	for(int i = 0; i < 32; ++i) +	{ +		if(d & (1 << i)) +		{ +			drive_t drive; +			char name[] = "x:"; +			name[0] = i + 'a'; + +			drive.name = name; +			drive.number = i; +			drives.push_back(drive); +		} +	}  #endif -  return drives; +	return drives;  }  bool Directory::isDir()  { -  return isDir(_path); +	return isDir(_path);  }  bool Directory::isDir(std::string path)  { -  DEBUG(directory, "Is '%s' a directory?\n", path.c_str()); -  struct stat st; -  if(stat(path.c_str(), &st) == 0) { -    if((st.st_mode & S_IFDIR) != 0) { -      DEBUG(directory, "\t...yes!\n"); -      return true; -    } -  } -  DEBUG(directory, "\t...no!\n"); -  return false; +	//DEBUG(directory, "Is '%s' a directory?\n", path.c_str()); +	struct stat st; +	if(stat(path.c_str(), &st) == 0) +	{ +		if((st.st_mode & S_IFDIR) != 0) +		{ +			//DEBUG(directory, "\t...yes!\n"); +			return true; +		} +	} +	//DEBUG(directory, "\t...no!\n"); +	return false;  }  bool Directory::fileExists(std::string filename)  { -  return !isDir(_path + SEP + filename); +	return !isDir(_path + SEP + filename);  }  bool Directory::exists(std::string path)  { -  struct stat st; -  if(stat(path.c_str(), &st) == 0) { -    return true; -  } else { -    return false; -  } +	struct stat st; +	if(stat(path.c_str(), &st) == 0) +	{ +		return true; +	} +	else +	{ +		return false; +	}  } -bool Directory::isHidden(std::string path)  +bool Directory::isHidden(std::string path)  { -  DEBUG(directory, "Is '%s' hidden?\n", path.c_str()); +	//DEBUG(directory, "Is '%s' hidden?\n", path.c_str());  #ifdef WIN32 -  // We dont want to filter out '..' pointing to root of a partition -  unsigned pos = path.find_last_of("/\\"); -  std::string entry = path.substr(pos+1); -  if(entry == "..") { -    return false; -  } - -  DWORD fattribs = GetFileAttributes(path.c_str()); -  if(fattribs & FILE_ATTRIBUTE_HIDDEN) { -    DEBUG(directory, "\t...yes!\n"); -    return true; -  } -  else if(fattribs & FILE_ATTRIBUTE_SYSTEM) { -    DEBUG(directory, "\t...yes!\n"); -    return true; -  } -  else { -    DEBUG(directory, "\t...no!\n"); -    return false; -  } +	// We dont want to filter out '..' pointing to root of a partition +	unsigned pos = path.find_last_of("/\\"); +	std::string entry = path.substr(pos+1); +	if(entry == "..") +	{ +		return false; +	} + +	DWORD fattribs = GetFileAttributes(path.c_str()); +	if(fattribs & FILE_ATTRIBUTE_HIDDEN) +	{ +		//DEBUG(directory, "\t...yes!\n"); +		return true; +	} +	else +	{ +		if(fattribs & FILE_ATTRIBUTE_SYSTEM) +		{ +			//DEBUG(directory, "\t...yes!\n"); +			return true; +		} +		else +		{ +			//DEBUG(directory, "\t...no!\n"); +			return false; +		} +	}  #else -  unsigned pos = path.find_last_of("/\\"); -  std::string entry = path.substr(pos+1); -  if(entry.size() > 1 && -     entry.at(0) == '.' && -     entry.at(1) != '.') { -    DEBUG(directory, "\t...yes!\n"); -    return true; -  } -  else { -    DEBUG(directory, "\t...no!\n"); -    return false; -  } +	unsigned pos = path.find_last_of("/\\"); +	std::string entry = path.substr(pos+1); +	if(entry.size() > 1 && +	   entry.at(0) == '.' && +	   entry.at(1) != '.') +	{ +		//DEBUG(directory, "\t...yes!\n"); +		return true; +	} +	else +	{ +		//DEBUG(directory, "\t...no!\n"); +		return false; +	}  #endif  }  Directory::Path Directory::parsePath(std::string path_str)  { -  //TODO: Handle "." input and propably other special cases - -  DEBUG(directory, "Parsing path '%s'", path_str.c_str()); -  Directory::Path path; -   -  std::string current_char; -  std::string prev_char; -  std::string dir; -  for(size_t c = 0; c < path_str.size(); c++) { -    current_char = path_str.at(c); - -    if(current_char == SEP) { -      if(prev_char == SEP) { -        dir.clear(); -        prev_char = current_char; -        continue; -      } else if(prev_char == ".") { -        prev_char = current_char; -        continue; -      } -       -      if(!dir.empty()) path.push_back(dir); -      dir.clear(); -      continue; -    } else if(current_char == ".") { -      if(prev_char == ".") { -        dir.clear(); -        if(!path.empty()) path.pop_back(); -        continue; -      } -    } -     -    dir += current_char; -    prev_char = current_char; -  } - -  if(!dir.empty()) path.push_back(dir); - -  return path; +	//TODO: Handle "." input and propably other special cases + +	//DEBUG(directory, "Parsing path '%s'", path_str.c_str()); +	Directory::Path path; + +	std::string current_char; +	std::string prev_char; +	std::string dir; +	for(size_t c = 0; c < path_str.size(); ++c) +	{ +		current_char = path_str.at(c); + +		if(current_char == SEP) +		{ +			if(prev_char == SEP) +			{ +				dir.clear(); +				prev_char = current_char; +				continue; +			} +			else +			{ +				if(prev_char == ".") +				{ +					prev_char = current_char; +					continue; +				} +			} +			if(!dir.empty()) +			{ +				path.push_back(dir); +			} +			dir.clear(); +			continue; +		} +		else +		{ +			if(current_char == ".") +			{ +				if(prev_char == ".") +				{ +					dir.clear(); +					if(!path.empty()) +					{ +						path.pop_back(); +					} +					continue; +				} +			} +		} +		dir += current_char; +		prev_char = current_char; +	} + +	if(!dir.empty()) +	{ +		path.push_back(dir); +	} + +	return path;  }  std::string Directory::pathToStr(Directory::Path& path)  { -  std::string cleaned_path; -  DEBUG(directory, "Number of directories in path is %d\n", (int)path.size()); +	std::string cleaned_path; +	//DEBUG(directory, "Number of directories in path is %d\n", (int)path.size()); -  for(Directory::Path::iterator it = path.begin(); -      it != path.end(); it++) { -    std::string dir = *it; -    DEBUG(directory, "\tDir '%s'\n", dir.c_str()); +	for(auto it = path.begin(); it != path.end(); ++it) +	{ +		std::string dir = *it; +		//DEBUG(directory, "\tDir '%s'\n", dir.c_str());  #ifdef WIN32 -    if(it != path.begin()) cleaned_path += SEP; -    cleaned_path += dir; +		if(it != path.begin()) +		{ +			cleaned_path += SEP; +		} +		cleaned_path += dir;  #else -    cleaned_path += SEP + dir; +		cleaned_path += SEP + dir;  #endif -  } +	} -  DEBUG(directory, "Cleaned path '%s'\n", cleaned_path.c_str()); +	//DEBUG(directory, "Cleaned path '%s'\n", cleaned_path.c_str()); -  if(cleaned_path.empty()) {  -    cleaned_path = Directory::root(); +	if(cleaned_path.empty()) +	{ +		cleaned_path = Directory::root();  #ifdef WIN32 -    cleaned_path += SEP; -#endif   -  } +		cleaned_path += SEP; +#endif +	}  #ifdef WIN32 -  if(cleaned_path.size() == 2) cleaned_path += SEP; +	if(cleaned_path.size() == 2) +	{ +		cleaned_path += SEP; +	}  #endif -  return cleaned_path;  +	return cleaned_path;  }  std::string Directory::pathDirectory(std::string filepath)  { -  if(Directory::isDir(filepath)) return filepath; - -  Directory::Path path = parsePath(filepath); -  if(path.size() > 0) path.pop_back(); - -  return Directory::pathToStr(path); +	if(Directory::isDir(filepath)) +	{ +		return filepath; +	} + +	Directory::Path path = parsePath(filepath); +	if(path.size() > 0) +	{ +		path.pop_back(); +	} + +	return Directory::pathToStr(path);  } + +} // GUI:: diff --git a/plugingui/directory.h b/plugingui/directory.h index 04ed3e7..a3f0059 100644 --- a/plugingui/directory.h +++ b/plugingui/directory.h @@ -24,8 +24,7 @@   *  along with DrumGizmo; if not, write to the Free Software   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.   */ -#ifndef __DRUMGIZMO_DIRECTORY_H__ -#define __DRUMGIZMO_DIRECTORY_H__ +#pragma once  #include <string>  #include <list> @@ -38,56 +37,57 @@  #define DIRECTORY_HIDDEN 1 +namespace GUI { +  class Directory { +public: +	typedef struct drive { +		int number; +		std::string name; +	} drive_t; + +	typedef std::list<std::string> EntryList; +	typedef std::list<drive> DriveList; + +	Directory(std::string path); +	~Directory(); + +	std::string seperator(); + +	size_t count(); +	void refresh(); +	std::string path(); +	bool cdUp(); +	bool cd(std::string dir); +	bool isDir(); +	void setPath(std::string path); +	bool fileExists(std::string file); + +	// Add filter, ie. directories or files only +	EntryList entryList(); + +	//void setSorting(); + +	static std::string cwd(); +	static std::string root(); +	static std::string root(std::string path); +	static std::string cleanPath(std::string path); +	static Directory::EntryList listFiles(std::string path, unsigned char filter = 0); +	static bool isRoot(std::string path); +	static Directory::DriveList drives(); +	static bool isDir(std::string path); +	static bool isHidden(std::string entry); +	static bool exists(std::string path); +	static std::string pathDirectory(std::string filepath); + +private: +	std::string _path; +	EntryList _files; +	DriveList _drives; -  public: -    typedef struct drive { -      int number; -      std::string name; -    } drive_t; - -    typedef std::list<std::string> EntryList; -    typedef std::list<drive> DriveList; -     -    Directory(std::string path); -    ~Directory(); - -    std::string seperator(); - -    size_t count(); -    void refresh(); -    std::string path(); -    bool cdUp(); -    bool cd(std::string dir); -    bool isDir(); -    void setPath(std::string path); -    bool fileExists(std::string file); - -    // Add filter, ie. directories or files only -    EntryList entryList(); - -    //void setSorting(); - -    static std::string cwd(); -    static std::string root(); -    static std::string root(std::string path);  -    static std::string cleanPath(std::string path); -    static Directory::EntryList listFiles(std::string path, unsigned char filter = 0); -    static bool isRoot(std::string path); -    static Directory::DriveList drives(); -    static bool isDir(std::string path); -    static bool isHidden(std::string entry); -    static bool exists(std::string path); -    static std::string pathDirectory(std::string filepath); -      -  private: -    std::string _path; -    EntryList _files; -    DriveList _drives; - -    typedef std::list<std::string> Path; -    static Path parsePath(std::string path); -    static std::string pathToStr(Path &path); +	typedef std::list<std::string> Path; +	static Path parsePath(std::string path); +	static std::string pathToStr(Path &path);  }; -#endif/*__DRUMGIZMO_DIRECTORY_H__*/ +} // GUI:: diff --git a/plugingui/filebrowser.cc b/plugingui/filebrowser.cc index 5846ffe..790a4d3 100644 --- a/plugingui/filebrowser.cc +++ b/plugingui/filebrowser.cc @@ -71,7 +71,7 @@ static void changeDir(void *ptr)    GUI::ListBox *lb = prv->listbox;    GUI::LineEdit *le = prv->lineedit;    std::string value = lb->selectedValue();  -  Directory* dir = prv->dir; +  GUI::Directory* dir = prv->dir;  //  if(!Directory::isDir(dir->path() + dir->seperator())) {  //    return; @@ -90,7 +90,7 @@ static void changeDir(void *ptr)    }  #endif -  if(value.empty() && !dir->isDir() && Directory::exists(dir->path())) { +  if(value.empty() && !dir->isDir() && GUI::Directory::exists(dir->path())) {      DEBUG(filebrowser, "Selecting file '%s'\n", dir->path().c_str());      if(prv->filesel_handler) prv->filesel_handler(prv->ptr, dir->path().c_str());      return; @@ -127,7 +127,7 @@ static void changeDir(void *ptr)        return;      } -    Directory::EntryList entries = dir->entryList(); +    GUI::Directory::EntryList entries = dir->entryList();      if(entries.empty()) {        dir->cdUp(); @@ -138,7 +138,7 @@ static void changeDir(void *ptr)            dir->path().c_str());       le->setText(dir->path()); -    for(Directory::EntryList::iterator it = entries.begin(); +    for(GUI::Directory::EntryList::iterator it = entries.begin();          it != entries.end(); it++) {         GUI::ListBoxBasic::Item item;        std::string name = *it; | 
