summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Suhr Christensen <jsc@umbraculum.org>2013-05-15 16:35:01 +0200
committerJonas Suhr Christensen <jsc@umbraculum.org>2013-05-15 16:35:01 +0200
commitb61c55a43c21a95234d79f6afd9a64964f5fffec (patch)
tree08407cd296dd650312f7e8036cb777483343bae2
parentcb4c17f35f597b6670bc761ad93e5a2d54b0808a (diff)
Improved filebrowser functionality:
* Directories listed first * Directories identified by "/" * Filtering out none drumkit files
-rw-r--r--plugingui/directory.cc63
-rw-r--r--plugingui/listboxbasic.cc3
2 files changed, 62 insertions, 4 deletions
diff --git a/plugingui/directory.cc b/plugingui/directory.cc
index eefbd93..1069856 100644
--- a/plugingui/directory.cc
+++ b/plugingui/directory.cc
@@ -1,4 +1,4 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* -*- M(de: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/***************************************************************************
* directory.cc
*
@@ -30,6 +30,8 @@
#include <stdio.h>
#include <string>
#include <algorithm>
+#include <vector>
+#include <string.h>
#ifdef WIN32
#include <direct.h>
@@ -38,6 +40,8 @@
#include <hugin.hpp>
+#define DRUMKIT_SUFFIX ".xml"
+
// http://en.wikipedia.org/wiki/Path_(computing)
#ifdef WIN32
#define SEP "\\"
@@ -94,8 +98,7 @@ bool Directory::cdUp()
std::string Directory::path()
{
- setPath(cleanPath(_path));
- return _path;
+ return cleanPath(_path);
}
Directory::EntryList Directory::entryList()
@@ -131,22 +134,74 @@ Directory::EntryList Directory::listFiles(std::string path)
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;
+
+ std::string entrypath = path;
+ entrypath += SEP;
+ entrypath += entry->d_name;
+ if(Directory::isDir(entrypath)) {
+ if(name == "..") directories.push_back(entry->d_name);
+ else directories.push_back(std::string("/") + entry->d_name);
+ }
+ else {
+ int drumkit_suffix_length = strlen(DRUMKIT_SUFFIX);
+ if(name.substr(name.length() - drumkit_suffix_length,
+ drumkit_suffix_length) != DRUMKIT_SUFFIX) {
+ continue;
+ }
- entries.push_back(entry->d_name);
+ 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("..");
#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;
}
diff --git a/plugingui/listboxbasic.cc b/plugingui/listboxbasic.cc
index 9153907..f0699c7 100644
--- a/plugingui/listboxbasic.cc
+++ b/plugingui/listboxbasic.cc
@@ -92,6 +92,7 @@ void GUI::ListBoxBasic::addItems(std::vector<GUI::ListBoxBasic::Item> &is)
i++;
}
+/*
// sort
for(int x = 0; x < (int)items.size(); x++) {
for(int y = 0; y < (int)items.size(); y++) {
@@ -105,8 +106,10 @@ void GUI::ListBoxBasic::addItems(std::vector<GUI::ListBoxBasic::Item> &is)
}
}
}
+*/
if(selected == -1) setSelection((int)items.size() - 1);
+ setSelection(0);
int numitems = height() / (font.textHeight() + padding);
scroll.setRange(numitems);