X-Git-Url: https://develop.uap-core.de/gitweb/uwplayer.git/blobdiff_plain/3c1675731caaac73d6c362075ffb82bc45d2f060..ac79c9d337cc83d38b530a8ba06fdca15ffe217e:/application/Sidebar.c diff --git a/application/Sidebar.c b/application/Sidebar.c index 4faff71..145bea6 100644 --- a/application/Sidebar.c +++ b/application/Sidebar.c @@ -31,6 +31,7 @@ #include "xdnd.h" #include "utils.h" #include "playlist.h" +#include static void sidebar_class_init(void); @@ -160,7 +161,7 @@ static void sidebar_init(Widget request, Widget neww, ArgList args, Cardinal *nu // initialize everything except XftDraw or other stuff that needs a Window - XftColor fg, bg; + XftColor fg, bg, sel2; fg.color.red = 0; fg.color.green = 0; fg.color.blue = 0; @@ -171,8 +172,16 @@ static void sidebar_init(Widget request, Widget neww, ArgList args, Cardinal *nu bg.color.blue = 0xFFFF; bg.color.alpha = 0xFFFF; + sel2.color.red = 0xFFFF; + sel2.color.green = 0xFFFF; + sel2.color.blue = 0; + sel2.color.alpha = 0xFFFF; + sb->sidebar.fg = fg; sb->sidebar.bg = bg; + sb->sidebar.select2_bg = sel2; + + sb->sidebar.select2 = -1; sb->sidebar.font = FontFromName(XtDisplay(neww), "Sans:size=11"); if(!sb->sidebar.font) { @@ -192,10 +201,36 @@ static void sidebar_destroy(Widget widget) { } +static int testresize = 1; static void sidebar_resize(Widget widget) { + if(testresize) { + XtWidgetGeometry geom; + geom.request_mode = CWWidth | CWHeight; + geom.width = 200; + geom.height = 2000; + XtWidgetGeometry result; + //XtMakeGeometryRequest(widget, &geom, &result); + testresize = 0; + } + printf("resize\n"); +} + + +static void remove_cb(Widget item, XtPointer index, XtPointer cd) { + Widget parent = XtParent(item); + Sidebar sb = NULL; + XtVaGetValues(parent, XmNuserData, &sb, NULL); + int currentTrack = sb->sidebar.window->playlist.current_track; + cxListRemove(sb->sidebar.window->playlist.tracks, sb->sidebar.select2); + if(sb->sidebar.select2 == currentTrack) { + PlayListPlayNext(sb->sidebar.window, true); + } + sb->sidebar.select2 = -1; + SidebarRepaint((Widget)sb); } + static int xdnd_initialized = 0; static void sidebar_realize(Widget widget, XtValueMask *mask, XSetWindowAttributes *attributes) { @@ -222,36 +257,66 @@ static void sidebar_realize(Widget widget, XtValueMask *mask, XSetWindowAttribut XtWindow(widget), visual, widget->core.colormap); + + Dimension w, h; + + Widget parent = XtParent(widget); + XtVaSetValues(parent, XmNbackground, WhitePixelOfScreen(XtScreen(parent)), NULL); + + XtMakeResizeRequest(widget, 200, 100, &w, &h); + + + XmString s1 = XmStringCreateSimple("Remove"); + sb->sidebar.popupMenu = XmVaCreateSimplePopupMenu( + widget, "popup", remove_cb, + XmVaPUSHBUTTON, s1, 'R', NULL, NULL, + NULL); + XtVaSetValues(sb->sidebar.popupMenu, XmNuserData, sb, NULL); + XmStringFree(s1); } static void sidebar_expose(Widget widget, XEvent *event, Region region) { //printf("expose\n"); Dimension w, h; - XtMakeResizeRequest(widget, 200, 200, &w, &h); + //XtMakeResizeRequest(widget, 200, 2000, &w, &h); - Sidebar s = (Sidebar)widget; - XftFont *xftFont = s->sidebar.font->fonts->font; + w = widget->core.width; + h = widget->core.height; + Widget parent = XtParent(widget); - XftDrawRect(s->sidebar.d, &s->sidebar.bg, 0, 0, s->core.width, s->core.height); + Sidebar s = (Sidebar)widget; + XftFont *xftFont = s->sidebar.font->fonts->font; + CxList *tracks = s->sidebar.window->playlist.tracks; + size_t numTracks = tracks->size; int fontheight = xftFont->ascent; int height = s->sidebar.elmHeight; + + int list_height = numTracks * height; + if((list_height > s->core.height) || (w < parent->core.width)) { + XtMakeResizeRequest(widget, parent->core.width, list_height + 5, &w, &h); + } + + + XftDrawRect(s->sidebar.d, &s->sidebar.bg, 0, 0, w, h); + + //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); + CxIterator i = cxListIterator(s->sidebar.window->playlist.tracks); + cx_foreach(const char *, elm, i) { + const char *name = util_resource_name(elm); 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); + if(i.index == s->sidebar.window->playlist.current_track) { + XftDrawRect(s->sidebar.d, &s->sidebar.fg, 0, i.index*height, s->core.width, height); cg = &s->sidebar.bg; + } else if(i.index == s->sidebar.select2) { + XftDrawRect(s->sidebar.d, &s->sidebar.select2_bg, 0, i.index*height, s->core.width, height); } - XftDrawString8(s->sidebar.d, cg, s->sidebar.font->fonts->font, 10, i*height + xftFont->ascent, (const FcChar8*)name, strlen(name)); - - i++; + XftDrawString8(s->sidebar.d, cg, s->sidebar.font->fonts->font, 10, i.index*height + xftFont->ascent, (const FcChar8*)name, strlen(name)); } } @@ -281,25 +346,34 @@ static void SelectElmAP(Widget w, XEvent *event, String *args, Cardinal *nArgs) int selected = e->y / s->sidebar.elmHeight; PlayListPlayTrack(s->sidebar.window, selected); + s->sidebar.select2 = -1; SidebarRepaint(w); } static void PopupAP(Widget w, XEvent *event, String *args, Cardinal *nArgs) { + XButtonEvent *e = &event->xbutton; + Sidebar s = (Sidebar)w; + + int selected = e->y / s->sidebar.elmHeight; + s->sidebar.select2 = selected; + SidebarRepaint(w); + //printf("btn3\n"); + //fflush(stdout); + + XmMenuPosition(s->sidebar.popupMenu, &event->xbutton); + XtManageChild(s->sidebar.popupMenu); } - -static void sidebar_xdnd_callback(Widget w, XtPointer udata, XtPointer cdata) { - printf("xdnd\n"); - fflush(stdout); - - Sidebar s = (Sidebar)cdata; - - char *urilist = udata; +static void open_uri(Sidebar s, cxstring uri) { + if(uri.length == 0) { + return; + } - size_t len = strlen(urilist); + const char *urilist = uri.ptr; + size_t len = uri.length; size_t start = 0; if(len > 7 && !memcmp(urilist, "file://", 7)) { @@ -349,6 +423,23 @@ static void sidebar_xdnd_callback(Widget w, XtPointer udata, XtPointer cdata) { free(path); } +static void sidebar_xdnd_callback(Widget w, XtPointer udata, XtPointer cdata) { + printf("xdnd\n"); + fflush(stdout); + + Sidebar s = (Sidebar)cdata; + + cxstring urllist = cx_str(udata); + + CxStrtokCtx tk = cx_strtok(urllist, cx_str("\r\n"), INT_MAX); + cxstring uri; + while(cx_strtok_next(&tk, &uri)) { + open_uri(s, uri); + } + + SidebarRepaint((Widget)s); +} + /* --------------------------- public --------------------------- */