better icon placement
authorJohn Tsiombikas <nuclear@mutantstargoat.com>
Mon, 1 Aug 2016 23:44:00 +0000 (02:44 +0300)
committerJohn Tsiombikas <nuclear@mutantstargoat.com>
Mon, 1 Aug 2016 23:44:00 +0000 (02:44 +0300)
src/app.cc
src/fs.cc
src/fs.h

index 617e6a1..9b83c21 100644 (file)
@@ -147,7 +147,7 @@ void app_reshape(int x, int y)
        glViewport(0, 0, x, y);
 
        Mat4 mat;
-       mat.perspective(deg_to_rad(50), win_aspect, 0.5, 500.0);
+       mat.perspective(deg_to_rad(60), win_aspect, 0.5, 500.0);
 
        glMatrixMode(GL_PROJECTION);
        glLoadMatrixf(mat[0]);
index b8f7420..0da07e5 100644 (file)
--- a/src/fs.cc
+++ b/src/fs.cc
@@ -4,6 +4,7 @@
 #include <errno.h>
 #include <string>
 #include <map>
+#include <algorithm>
 #include <unistd.h>
 #include <dirent.h>
 #include <sys/stat.h>
@@ -61,11 +62,22 @@ static Vec3 icon_pos(int row, int col, int ncols, float row_spacing, float radiu
        return Vec3(x, y, z);
 }
 
+static float icon_angle(int col, int ncols, float max_angle = 0.0f)
+{
+       if(max_angle > 0) {
+               return max_angle * ((float)col / (float)(ncols - 1) - 0.5);
+       }
+       return 2.0 * M_PI * (float)col / (float)ncols;
+}
+
 void draw_fs()
 {
-       static const int ncols = 8;
        static const float row_spacing = 2.0;
        static const float radius = 5;
+       static const float umax = 0.42;
+       static const float max_icon_angle = M_PI * 2.0 * umax;
+
+       int max_ncols = std::max<int>(1, umax * 16);
 
        Mat4 base_xform;
        base_xform.rotate(time_sec, 0, 0);
@@ -75,8 +87,10 @@ void draw_fs()
        glUseProgram(0);
        glDisable(GL_TEXTURE_2D);
 
-       int first = start_child % ncols;
        int nchildren = (int)cur_node->children.size();
+       int ncols = std::min(cur_node->nfiles, max_ncols);
+
+       int first = start_child % ncols;
        int col = 0, row = 0;
 
        for(int i=0; i<nchildren; i++) {
@@ -87,7 +101,7 @@ void draw_fs()
                        continue;
                }
 
-               float angle = -2.0 * M_PI * (float)col / (float)ncols;
+               float angle = icon_angle(col, ncols, max_icon_angle);
 
                Mat4 xform = base_xform;
                xform.translate(0, row * row_spacing, -radius);
@@ -179,6 +193,7 @@ FSNode::FSNode()
        type = FSTYPE_UNKNOWN;
        size = 0;
        parent = 0;
+       nfiles = ndirs = 0;
 }
 
 bool FSNode::expand()
@@ -203,6 +218,15 @@ bool FSNode::expand()
                if(!node) continue;
 
                children.push_back(node);
+               switch(node->type) {
+               case FSTYPE_FILE:
+                       ++nfiles;
+                       break;
+               case FSTYPE_DIR:
+                       ++ndirs;
+               default:
+                       break;
+               }
        }
        printf("expanded %d children\n", (int)children.size());
 
index 6c7b406..0eb72ed 100644 (file)
--- a/src/fs.h
+++ b/src/fs.h
@@ -20,6 +20,7 @@ public:
 
        FSNode *parent;
        std::vector<FSNode*> children;
+       int nfiles, ndirs;
 
        FSNode();