00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00031 #include "stdinc.h"
00032
00033 #include "config.h"
00034 #include "gui.h"
00035 #include "gui_internal.h"
00036 #include "gui_vfslist.h"
00037 #include "playq.h"
00038 #include "vfs.h"
00039
00043 static WINDOW *win_dirname;
00047 static struct vfsref *vr_curdir = NULL;
00052 static struct vfslist vl_flist = VFSLIST_INITIALIZER;
00056 static struct gui_vfslist *win_browser;
00060 static char *locatestr = NULL;
00061
00066 static void
00067 gui_browser_dirname_refresh(void)
00068 {
00069 const char *percent;
00070 int plen;
00071
00072 gui_lock();
00073
00074 werase(win_dirname);
00075 if (vr_curdir != NULL) {
00076 mvwaddstr(win_dirname, 0, 1, vfs_filename(vr_curdir));
00077 if (locatestr != NULL) {
00078 waddstr(win_dirname, " (");
00079 waddstr(win_dirname, _("filter"));
00080 waddstr(win_dirname, ": ");
00081 waddstr(win_dirname, locatestr);
00082 waddstr(win_dirname, ")");
00083 }
00084 }
00085
00086 percent = gui_vfslist_getpercentage(win_browser);
00087 plen = strlen(percent);
00088 mvwaddstr(win_dirname, 0, COLS - plen, percent);
00089 wnoutrefresh(win_dirname);
00090
00091 gui_unlock();
00092 }
00093
00097 static void
00098 gui_browser_cleanup_flist(void)
00099 {
00100 struct vfsref *vr;
00101
00102
00103 while ((vr = vfs_list_first(&vl_flist)) != NULL) {
00104 vfs_list_remove(&vl_flist, vr);
00105 vfs_close(vr);
00106 }
00107
00108 g_free(locatestr);
00109 locatestr = NULL;
00110 }
00111
00112 void
00113 gui_browser_init(void)
00114 {
00115 const char *defdir;
00116 char *cwd;
00117
00118 win_dirname = newwin(1, 0, GUI_SIZE_BROWSER_DIRNAME_TOP, 0);
00119 clearok(win_dirname, TRUE);
00120 if (gui_draw_colors)
00121 wbkgdset(win_dirname, COLOR_PAIR(GUI_COLOR_BAR));
00122 else
00123 wbkgdset(win_dirname, A_REVERSE);
00124
00125 win_browser = gui_vfslist_new(0);
00126 gui_vfslist_setfocus(win_browser, 1);
00127 gui_vfslist_setcallback(win_browser, gui_browser_dirname_refresh);
00128 gui_browser_dirname_refresh();
00129
00130 defdir = config_getopt("gui.browser.defaultpath");
00131 if (defdir[0] != '\0') {
00132
00133 vr_curdir = vfs_lookup(defdir, NULL, NULL, 0);
00134 } else {
00135
00136 cwd = g_get_current_dir();
00137 vr_curdir = vfs_lookup(cwd, NULL, NULL, 1);
00138 g_free(cwd);
00139 }
00140
00141 if (vr_curdir != NULL) {
00142 vfs_populate(vr_curdir);
00143 gui_vfslist_setlist(win_browser, vfs_population(vr_curdir));
00144 } else {
00145 gui_msgbar_warn(_("Unable to open initial directory."));
00146 }
00147 gui_vfslist_move(win_browser, 0, GUI_SIZE_BROWSER_TOP,
00148 COLS, GUI_SIZE_BROWSER_HEIGHT);
00149 }
00150
00151 void
00152 gui_browser_destroy(void)
00153 {
00154 delwin(win_dirname);
00155 gui_vfslist_destroy(win_browser);
00156
00157
00158 gui_browser_cleanup_flist();
00159 if (vr_curdir != NULL)
00160 vfs_close(vr_curdir);
00161 }
00162
00163 void
00164 gui_browser_resize(void)
00165 {
00166 gui_lock();
00167 wresize(win_dirname, 1, COLS);
00168 mvwin(win_dirname, GUI_SIZE_BROWSER_DIRNAME_TOP, 0);
00169 clearok(win_dirname, TRUE);
00170 gui_unlock();
00171
00172 gui_vfslist_move(win_browser, 0, GUI_SIZE_BROWSER_TOP,
00173 COLS, GUI_SIZE_BROWSER_HEIGHT);
00174 }
00175
00176
00177
00178
00179
00180 void
00181 gui_browser_cursor_up(void)
00182 {
00183 gui_vfslist_cursor_up(win_browser);
00184 }
00185
00186 void
00187 gui_browser_cursor_down(void)
00188 {
00189 gui_vfslist_cursor_down(win_browser, 0);
00190 }
00191
00192 void
00193 gui_browser_cursor_pageup(void)
00194 {
00195 gui_vfslist_cursor_pageup(win_browser);
00196 }
00197
00198 void
00199 gui_browser_cursor_pagedown(void)
00200 {
00201 gui_vfslist_cursor_pagedown(win_browser);
00202 }
00203
00204 void
00205 gui_browser_cursor_head(void)
00206 {
00207 gui_vfslist_cursor_head(win_browser);
00208 }
00209
00210 void
00211 gui_browser_cursor_tail(void)
00212 {
00213 gui_vfslist_cursor_tail(win_browser);
00214 }
00215
00216
00217
00218
00219
00220 void
00221 gui_browser_gotofile(struct vfsref *vr)
00222 {
00223 struct vfsref *vrp, *vrn;
00224 unsigned int idx;
00225
00226 if ((vrp = vfs_lookup("..", NULL, vfs_filename(vr), 1)) == NULL)
00227 goto bad;
00228 if (vfs_populate(vrp) != 0) {
00229
00230 vfs_close(vrp);
00231 goto bad;
00232 }
00233
00234 for (vrn = vfs_list_first(vfs_population(vrp)), idx = 1;
00235 vrn != NULL; vrn = vfs_list_next(vrn), idx++) {
00236
00237 if (strcmp(vfs_name(vr), vfs_name(vrn)) == 0)
00238 break;
00239 }
00240
00241
00242 gui_browser_cleanup_flist();
00243 vfs_close(vr_curdir);
00244 vr_curdir = vrp;
00245 gui_vfslist_setlist(win_browser, vfs_population(vr_curdir));
00246
00247 if (vrn != NULL)
00248 gui_vfslist_setselected(win_browser, vrn, idx);
00249
00250 return;
00251 bad:
00252 gui_msgbar_warn(_("Unable to enter the parent directory."));
00253 }
00254
00255 void
00256 gui_browser_dir_parent(void)
00257 {
00258
00259 if (vr_curdir == NULL)
00260 return;
00261
00262 if (locatestr != NULL) {
00263
00264 gui_browser_cleanup_flist();
00265 gui_vfslist_setlist(win_browser, vfs_population(vr_curdir));
00266 return;
00267 }
00268
00269 gui_browser_gotofile(vr_curdir);
00270 }
00271
00272 void
00273 gui_browser_dir_enter(void)
00274 {
00275 struct vfsref *vr;
00276
00277 if (gui_vfslist_warn_isempty(win_browser))
00278 return;
00279
00280 vr = vfs_dup(gui_vfslist_getselected(win_browser));
00281 if (vfs_populate(vr) != 0) {
00282 if (vfs_populatable(vr)) {
00283
00284 gui_msgbar_warn(_("Unable to enter the "
00285 "selected directory."));
00286 }
00287 vfs_close(vr);
00288 return;
00289 }
00290
00291
00292 gui_browser_cleanup_flist();
00293 vfs_close(vr_curdir);
00294 vr_curdir = vr;
00295 gui_vfslist_setlist(win_browser, vfs_population(vr_curdir));
00296 }
00297
00298
00299
00300
00301
00302 void
00303 gui_browser_playq_add_tail(void)
00304 {
00305 struct vfsref *vr;
00306
00307 if (gui_vfslist_warn_isempty(win_browser))
00308 return;
00309
00310 vr = gui_vfslist_getselected(win_browser);
00311 playq_song_add_tail(vr);
00312 gui_vfslist_cursor_down(win_browser, 1);
00313 }
00314
00315 void
00316 gui_browser_playq_add_head(void)
00317 {
00318 struct vfsref *vr;
00319
00320 if (gui_vfslist_warn_isempty(win_browser))
00321 return;
00322
00323 vr = gui_vfslist_getselected(win_browser);
00324 playq_song_add_head(vr);
00325 gui_vfslist_cursor_down(win_browser, 1);
00326 }
00327
00328 void
00329 gui_browser_playq_add_after(void)
00330 {
00331 struct vfsref *vr;
00332
00333 if (gui_vfslist_warn_isempty(win_browser))
00334 return;
00335
00336 vr = gui_vfslist_getselected(win_browser);
00337 gui_playq_song_add_after(vr);
00338 gui_vfslist_cursor_down(win_browser, 1);
00339 }
00340
00341 void
00342 gui_browser_playq_add_before(void)
00343 {
00344 struct vfsref *vr;
00345
00346 if (gui_vfslist_warn_isempty(win_browser))
00347 return;
00348
00349 vr = gui_vfslist_getselected(win_browser);
00350 gui_playq_song_add_before(vr);
00351 gui_vfslist_cursor_down(win_browser, 1);
00352 }
00353
00354 int
00355 gui_browser_searchnext(const struct vfsmatch *vm)
00356 {
00357 return gui_vfslist_searchnext(win_browser, vm);
00358 }
00359
00363 static void
00364 gui_browser_do_chdir(const char *path)
00365 {
00366 int dir = 0;
00367 struct vfsref *vr;
00368
00369 if (vr_curdir != NULL) {
00370
00371 vr = vfs_lookup(path, NULL, vfs_filename(vr_curdir), 0);
00372 } else {
00373
00374 vr = vfs_lookup(path, NULL, NULL, 0);
00375 }
00376
00377 if (vr != NULL) {
00378 if (vfs_populate(vr) == 0)
00379 dir = 1;
00380 else if (!vfs_playable(vr))
00381 goto bad;
00382
00383
00384 gui_browser_cleanup_flist();
00385 if (vr_curdir != NULL)
00386 vfs_close(vr_curdir);
00387 vr_curdir = vr;
00388
00389 if (dir) {
00390
00391 gui_vfslist_setlist(win_browser,
00392 vfs_population(vr));
00393 } else {
00394
00395 vfs_list_insert_tail(&vl_flist, vfs_dup(vr));
00396 gui_vfslist_setlist(win_browser, &vl_flist);
00397 }
00398
00399 return;
00400 }
00401
00402 bad: gui_msgbar_warn(_("Unable to display the file or directory."));
00403 if (vr != NULL)
00404 vfs_close(vr);
00405 }
00406
00407 void
00408 gui_browser_chdir(void)
00409 {
00410 char *path;
00411 const char *curwd = NULL;
00412
00413 if (vr_curdir != NULL)
00414 curwd = vfs_filename(vr_curdir);
00415
00416 path = gui_input_askstring(_("Change directory"), curwd, NULL);
00417 if (path == NULL)
00418 return;
00419
00420 gui_browser_do_chdir(path);
00421 g_free(path);
00422 }
00423
00424 void
00425 gui_browser_setfocus(int focus)
00426 {
00427 gui_vfslist_setfocus(win_browser, focus);
00428 }
00429
00430 void
00431 gui_browser_write_playlist(void)
00432 {
00433 char *fn;
00434 struct vfsref *vr;
00435
00436 fn = gui_input_askstring(_("Write playlist to file"), NULL, NULL);
00437 if (fn == NULL)
00438 return;
00439 playq_lock();
00440 vr = vfs_write_playlist(&playq_list, vr_curdir, fn);
00441 playq_unlock();
00442 g_free(fn);
00443
00444 if (vr == NULL) {
00445 gui_msgbar_warn(_("Unable to write playlist."));
00446 return;
00447 }
00448 vfs_populate(vr);
00449
00450
00451 gui_browser_cleanup_flist();
00452 if (vr_curdir != NULL)
00453 vfs_close(vr_curdir);
00454 vr_curdir = vr;
00455
00456
00457 gui_vfslist_setlist(win_browser, vfs_population(vr));
00458 }
00459
00460 void
00461 gui_browser_fullpath(void)
00462 {
00463 gui_vfslist_fullpath(win_browser);
00464 }
00465
00466 int
00467 gui_browser_locate(const struct vfsmatch *vm)
00468 {
00469 struct vfslist vl = VFSLIST_INITIALIZER;
00470
00471 if (vr_curdir == NULL)
00472 return (-1);
00473
00474
00475 vfs_locate(&vl, vr_curdir, vm);
00476 if (vfs_list_empty(&vl))
00477 return (-1);
00478
00479 gui_browser_cleanup_flist();
00480 locatestr = g_strdup(vfs_match_value(vm));
00481 vfs_list_move(&vl_flist, &vl);
00482 gui_vfslist_setlist(win_browser, &vl_flist);
00483
00484 return (0);
00485 }
00486
00487 void
00488 gui_browser_gotofolder(void)
00489 {
00490
00491 if (gui_vfslist_warn_isempty(win_browser))
00492 return;
00493
00494 gui_browser_gotofile(gui_vfslist_getselected(win_browser));
00495 }
00496
00497 void
00498 gui_browser_gotohome(void)
00499 {
00500 const char *defdir;
00501
00502 defdir = config_getopt("gui.browser.defaultpath");
00503 if (defdir[0] == '\0')
00504 return;
00505 gui_browser_do_chdir(defdir);
00506 }