render playlist
[uwplayer.git] / application / Sidebar.c
index a3dd20a..d6b3ff4 100644 (file)
@@ -29,6 +29,8 @@
 #include <errno.h>
 
 #include "xdnd.h"
+#include "utils.h"
+#include "playlist.h"
 
 
 static void sidebar_class_init(void);
@@ -152,7 +154,27 @@ static void sidebar_class_part_init (WidgetClass wc) {
 
 
 static void sidebar_init(Widget request, Widget neww, ArgList args, Cardinal *num_args) {
+    Sidebar sb = (Sidebar)neww;
     
+    XftColor fg, bg;
+    fg.color.red = 0;
+    fg.color.green = 0;
+    fg.color.blue = 0;
+    fg.color.alpha = 0xFFFF;
+    
+    bg.color.red = 0xFFFF;
+    bg.color.green = 0xFFFF;
+    bg.color.blue = 0xFFFF;
+    bg.color.alpha = 0xFFFF;
+    
+    sb->sidebar.fg = fg;
+    sb->sidebar.bg = bg;
+    
+    sb->sidebar.font = FontFromName(XtDisplay(neww), "Sans:size=11");
+    if(!sb->sidebar.font) {
+        fprintf(stderr, "Cannot open font.\nAbort.\n");
+        exit(-1);
+    }
 }
 
 
@@ -174,12 +196,51 @@ static void sidebar_realize(Widget widget, XtValueMask *mask, XSetWindowAttribut
         XdndInit(XtDisplay(widget), XtWidgetToApplicationContext(widget), sidebar_xdnd_callback, widget);
     }
     XdndEnable(widget);
+    
+    Screen *screen = widget->core.screen;
+    Visual *visual = screen->root_visual;
+    for(int i=0;i<screen->ndepths;i++) {
+        Depth d = screen->depths[i];
+        if(d.depth == widget->core.depth) {
+            visual = d.visuals;
+            break;
+        }
+    }
+    
+    Sidebar sb = (Sidebar)widget;
+    sb->sidebar.d = XftDrawCreate(
+            XtDisplay(widget),
+            XtWindow(widget),
+            visual,
+            widget->core.colormap);
 }
 
 static void sidebar_expose(Widget widget, XEvent *event, Region        region) {
     printf("expose\n");
     Dimension w, h;
     XtMakeResizeRequest(widget, 200, 200, &w, &h);
+    
+    Sidebar s = (Sidebar)widget;
+    
+    XftDrawRect(s->sidebar.d, &s->sidebar.bg, 0, 0, s->core.width, s->core.height);
+    
+    int height = 20;
+    
+    printf("current track: %d\n", s->sidebar.window->playlist.current_track);
+    
+    int i = 0;
+    UCX_FOREACH(elm, s->sidebar.window->playlist.tracks) {
+        char *name = util_resource_name(elm->data);
+        XftColor *cg = &s->sidebar.fg;
+        if(i == s->sidebar.window->playlist.current_track) {
+            XftDrawRect(s->sidebar.d, &s->sidebar.fg, 0, i*height, s->core.width, height);
+            cg = &s->sidebar.bg;
+        }
+        
+        XftDrawString8(s->sidebar.d, cg, s->sidebar.font->fonts->font, 10, i*height + 15, (const FcChar8*)name, strlen(name));
+        
+        i++;
+    }
 }
 
 static Boolean sidebar_set_values(Widget old, Widget request, Widget neww, ArgList args, Cardinal *num_args) {
@@ -214,6 +275,8 @@ static void sidebar_xdnd_callback(Widget w, XtPointer udata, XtPointer cdata) {
     printf("xdnd\n");
     fflush(stdout);
     
+    Sidebar s = (Sidebar)cdata;
+    
     char *urilist = udata;
     
     size_t len = strlen(urilist);
@@ -261,8 +324,7 @@ static void sidebar_xdnd_callback(Widget w, XtPointer udata, XtPointer cdata) {
     }
     path[k] = '\0';
     
-    // add file
-    // TODO
+    PlayListAddFile(s->sidebar.window, path);
     
     free(path);
 }
@@ -278,3 +340,8 @@ Widget CreateSidebar(
 {
     return XtCreateWidget(name, xnSidebarWidgetClass, parent, arglist, argcount);
 }
+
+void SidebarSetWindow(Widget widget, MainWindow *win) {
+    Sidebar sb = (Sidebar)widget;
+    sb->sidebar.window = win;
+}