clean up bclistbox, listbox shift drag fix, plugin info
[goodguy/history.git] / cinelerra-5.1 / cinelerra / awindowgui.C
index 89080802a7868c054ff3ca4da49cbd74d7de3783..e64adff9cac1f23f555bf1ab3145b6f945b69321 100644 (file)
 #include "assetpopup.h"
 #include "assets.h"
 #include "awindowgui.h"
-#include "awindowgui.inc"
 #include "awindow.h"
-#include "awindowmenu.h"
 #include "bcsignals.h"
 #include "bchash.h"
 #include "cache.h"
 #include "bccmodels.h"
+#include "clippopup.h"
 #include "cursors.h"
 #include "cwindowgui.h"
 #include "cwindow.h"
 #include "edl.h"
 #include "edlsession.h"
+#include "effectlist.h"
 #include "file.h"
 #include "filesystem.h"
+#include "folderlistmenu.h"
 #include "indexable.h"
 #include "keys.h"
 #include "language.h"
 #include "labels.h"
-#include "labeledit.h"
+#include "labelpopup.h"
 #include "localsession.h"
 #include "mainmenu.h"
 #include "mainsession.h"
@@ -75,7 +76,7 @@ const char *AWindowGUI::folder_names[] =
        N_("Labels"),
        N_("Clips"),
        N_("Media"),
-       N_("User")
+       N_("Proxy"),
 };
 
 
@@ -135,9 +136,9 @@ int AssetVIcon::get_vy()
        return lbox->get_item_y(picon) + lbox->get_title_h();
 }
 
+
 AssetPicon::AssetPicon(MWindow *mwindow,
-       AWindowGUI *gui,
-       Indexable *indexable)
+       AWindowGUI *gui, Indexable *indexable)
  : BC_ListBoxItem()
 {
        reset();
@@ -149,8 +150,7 @@ AssetPicon::AssetPicon(MWindow *mwindow,
 }
 
 AssetPicon::AssetPicon(MWindow *mwindow,
-       AWindowGUI *gui,
-       EDL *edl)
+       AWindowGUI *gui, EDL *edl)
  : BC_ListBoxItem()
 {
        reset();
@@ -162,28 +162,20 @@ AssetPicon::AssetPicon(MWindow *mwindow,
 }
 
 AssetPicon::AssetPicon(MWindow *mwindow,
-       AWindowGUI *gui, int folder)
- : BC_ListBoxItem(_(AWindowGUI::folder_names[folder]), gui->folder_icon)
+       AWindowGUI *gui, int folder, int persist)
+ : BC_ListBoxItem(_(AWindowGUI::folder_names[folder]),
+       folder>=0 && folder<AWINDOW_FOLDERS ?
+               gui->folder_icons[folder]: gui->folder_icon)
 {
        reset();
        foldernum = folder;
        this->mwindow = mwindow;
        this->gui = gui;
+       persistent = persist;
 }
 
 AssetPicon::AssetPicon(MWindow *mwindow,
-       AWindowGUI *gui, const char *folder_name, int folder_num)
- : BC_ListBoxItem(folder_name, gui->folder_icon)
-{
-       reset();
-       foldernum = folder_num;
-       this->mwindow = mwindow;
-       this->gui = gui;
-}
-
-AssetPicon::AssetPicon(MWindow *mwindow,
-       AWindowGUI *gui,
-       PluginServer *plugin)
+       AWindowGUI *gui, PluginServer *plugin)
  : BC_ListBoxItem()
 {
        reset();
@@ -192,10 +184,8 @@ AssetPicon::AssetPicon(MWindow *mwindow,
        this->plugin = plugin;
 }
 
-
 AssetPicon::AssetPicon(MWindow *mwindow,
-       AWindowGUI *gui,
-       Label *label)
+       AWindowGUI *gui, Label *label)
  : BC_ListBoxItem()
 {
        reset();
@@ -211,8 +201,8 @@ AssetPicon::~AssetPicon()
 {
        if( vicon )
                gui->vicon_thread->del_vicon(vicon);
-       if(indexable) indexable->remove_user();
-       if(edl) edl->remove_user();
+       if( indexable ) indexable->remove_user();
+       if( edl ) edl->remove_user();
        if( icon && !gui->protected_pixmap(icon) ) {
                delete icon;
                if( !plugin ) delete icon_vframe;
@@ -225,6 +215,7 @@ void AssetPicon::reset()
        label = 0;
        indexable = 0;
        edl = 0;
+       foldernum = AW_NO_FOLDER;
        icon = 0;
        icon_vframe = 0;
        vicon = 0;
@@ -238,120 +229,102 @@ void AssetPicon::create_objects()
        FileSystem fs;
        char name[BCTEXTLEN];
        int pixmap_w, pixmap_h;
-       const int debug = 0;
 
        pixmap_h = 50 * BC_WindowBase::get_resources()->icon_scale;
 
-       if(debug) printf("AssetPicon::create_objects %d\n", __LINE__);
-       if(indexable)
-       {
+       if( indexable ) {
                fs.extract_name(name, indexable->path);
                set_text(name);
        }
 
-       if(indexable && indexable->is_asset)
-       {
-               if(debug) printf("AssetPicon::create_objects %d\n", __LINE__);
+       if( indexable && indexable->is_asset ) {
                Asset *asset = (Asset*)indexable;
-               if(asset->video_data)
-               {
-                       if(mwindow->preferences->use_thumbnails)
-                       {
+               if( asset->video_data ) {
+                       if( mwindow->preferences->use_thumbnails ) {
                                gui->unlock_window();
-                               if(debug) printf("AssetPicon::create_objects %d\n", __LINE__);
                                File *file = mwindow->video_cache->check_out(asset,
                                        mwindow->edl,
                                        1);
-                               if(debug) printf("AssetPicon::create_objects %d\n", __LINE__);
 
-                               if(file)
-                               {
+                               if( file ) {
                                        int height = asset->height > 0 ? asset->height : 1;
                                        pixmap_w = pixmap_h * asset->width / height;
 
                                        file->set_layer(0);
                                        file->set_video_position(0, 0);
 
-                                       if(gui->temp_picon &&
+                                       if( gui->temp_picon &&
                                                (gui->temp_picon->get_w() != asset->width ||
-                                               gui->temp_picon->get_h() != asset->height))
-                                       {
+                                               gui->temp_picon->get_h() != asset->height) ) {
                                                delete gui->temp_picon;
                                                gui->temp_picon = 0;
                                        }
 
-                                       if(!gui->temp_picon)
-                                       {
+                                       if( !gui->temp_picon ) {
                                                gui->temp_picon = new VFrame(0, -1,
                                                        asset->width, asset->height,
                                                        BC_RGB888, -1);
                                        }
-
+                                       { char string[BCTEXTLEN];
+                                       sprintf(string, _("Reading %s"), name);
+                                       mwindow->gui->lock_window("AssetPicon::create_objects");
+                                       mwindow->gui->show_message(string);
+                                       mwindow->gui->unlock_window(); }
                                        file->read_frame(gui->temp_picon);
-                                       if(debug) printf("AssetPicon::create_objects %d\n", __LINE__);
                                        mwindow->video_cache->check_in(asset);
 
                                        gui->lock_window("AssetPicon::create_objects 1");
                                        icon = new BC_Pixmap(gui, pixmap_w, pixmap_h);
                                        icon->draw_vframe(gui->temp_picon,
                                                0, 0, pixmap_w, pixmap_h, 0, 0);
-//printf("%d %d\n", gui->temp_picon->get_w(), gui->temp_picon->get_h());
                                        icon_vframe = new VFrame(0,
                                                -1, pixmap_w, pixmap_h, BC_RGB888, -1);
                                        icon_vframe->transfer_from(gui->temp_picon);
+                                       if( asset->awindow_folder == AW_MEDIA_FOLDER ) {
 // vicon images
-                                       double framerate = asset->get_frame_rate();
-                                       if( !framerate ) framerate = VICON_RATE;
-                                       int64_t frames = asset->get_video_frames();
-                                       double secs = frames / framerate;
-                                       if( secs > 5 ) secs = 5;
-                                       int64_t length = secs * gui->vicon_thread->refresh_rate;
-                                       vicon = new AssetVIcon(this, pixmap_w, pixmap_h, framerate, length);
-                                       gui->vicon_thread->add_vicon(vicon);
-                                       if(debug) printf("AssetPicon::create_objects %d\n", __LINE__);
+                                               double framerate = asset->get_frame_rate();
+                                               if( !framerate ) framerate = VICON_RATE;
+                                               int64_t frames = asset->get_video_frames();
+                                               double secs = frames / framerate;
+                                               if( secs > 5 ) secs = 5;
+                                               int64_t length = secs * gui->vicon_thread->refresh_rate;
+                                               vicon = new AssetVIcon(this, pixmap_w, pixmap_h, framerate, length);
+                                               gui->vicon_thread->add_vicon(vicon);
+                                       }
 
                                }
-                               else
-                               {
+                               else {
                                        gui->lock_window("AssetPicon::create_objects 2");
                                        icon = gui->video_icon;
                                        icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_FILM];
                                }
                        }
-                       else
-                       {
+                       else {
                                icon = gui->video_icon;
                                icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_FILM];
                        }
                }
                else
-               if(asset->audio_data)
-               {
+               if( asset->audio_data ) {
                        icon = gui->audio_icon;
                        icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_SOUND];
                }
-//printf("AssetPicon::create_objects 2\n");
 
-               if(debug) printf("AssetPicon::create_objects %d\n", __LINE__);
        }
        else
-       if(indexable && !indexable->is_asset)
-       {
+       if( indexable && !indexable->is_asset ) {
                icon = gui->video_icon;
                icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_FILM];
        }
        else
-       if(edl)
-       {
-//printf("AssetPicon::create_objects 4 %s\n", edl->local_session->clip_title);
+       if( edl ) {
                set_text(strcpy(name, edl->local_session->clip_title));
                icon = gui->clip_icon;
                icon_vframe = mwindow->theme->get_image("clip_icon");
        }
        else
-       if(plugin)
-       {
-               strcpy(name, _(plugin->title));
+       if( plugin ) {
+               strcpy(name,  plugin->title);
                set_text(name);
                icon_vframe = plugin->get_picon();
                if( icon_vframe )
@@ -390,7 +363,7 @@ void AssetPicon::create_objects()
                }
        }
        else
-       if(label) {
+       if( label ) {
                Units::totext(name,
                              label->position,
                              mwindow->edl->session->time_format,
@@ -398,8 +371,8 @@ void AssetPicon::create_objects()
                              mwindow->edl->session->frame_rate,
                              mwindow->edl->session->frames_per_foot);
                set_text(name);
-               icon = gui->file_icon;
-               icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_UNKNOWN];
+               icon = gui->label_icon;
+               icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_LABEL];
                set_icon(icon);
                set_icon_vframe(icon_vframe);
        }
@@ -409,50 +382,64 @@ void AssetPicon::create_objects()
        }
        set_icon(icon);
        set_icon_vframe(icon_vframe);
-
-       if(debug) printf("AssetPicon::create_objects %d\n", __LINE__);
 }
 
-
-
-
-
-
 AWindowGUI::AWindowGUI(MWindow *mwindow, AWindow *awindow)
  : BC_Window(_(PROGRAM_NAME ": Resources"),
        mwindow->session->awindow_x, mwindow->session->awindow_y,
        mwindow->session->awindow_w, mwindow->session->awindow_h,
        100, 100, 1, 1, 1)
 {
-// printf("AWindowGUI::AWindowGUI %d %d %d %d\n",
-// mwindow->session->awindow_x,
-// mwindow->session->awindow_y,
-// mwindow->session->awindow_w,
-// mwindow->session->awindow_h);
        this->mwindow = mwindow;
        this->awindow = awindow;
-       file_icon = 0;
-       audio_icon = 0;
-       video_icon = 0;
-       folder_icon = 0;
-       clip_icon = 0;
-       atransition_icon = 0;  atransition_vframe = 0;
-       vtransition_icon = 0;  vtransition_vframe = 0;
-       aeffect_icon = 0;      aeffect_vframe = 0;
-       ladspa_icon = 0;       ladspa_vframe = 0;
-       veffect_icon = 0;      veffect_vframe = 0;
-       ff_aud_icon = 0;       ff_aud_vframe = 0;
-       ff_vid_icon = 0;       ff_vid_vframe = 0;
+
+       file_vframe = 0;                file_icon = 0;
+       folder_vframe = 0;              folder_icon = 0;
+       audio_vframe = 0;               audio_icon = 0;
+       video_vframe = 0;               video_icon = 0;
+       label_vframe = 0;               label_icon = 0;
+
+       atransition_vframe = 0;         atransition_icon = 0;
+       vtransition_vframe = 0;         vtransition_icon = 0;
+       aeffect_vframe = 0;             aeffect_icon = 0;
+       ladspa_vframe = 0;              ladspa_icon = 0;
+       veffect_vframe = 0;             veffect_icon = 0;
+       ff_aud_vframe = 0;              ff_aud_icon = 0;
+       ff_vid_vframe = 0;              ff_vid_icon = 0;
+
+       aeffect_folder_vframe = 0;      aeffect_folder_icon = 0;
+       atransition_folder_vframe = 0;  atransition_folder_icon = 0;
+       clip_folder_vframe = 0;         clip_folder_icon = 0;
+       label_folder_vframe = 0;        label_folder_icon = 0;
+       media_folder_vframe = 0;        media_folder_icon = 0;
+       proxy_folder_vframe = 0;        proxy_folder_icon = 0;
+       veffect_folder_vframe = 0;      veffect_folder_icon = 0;
+       vtransition_folder_vframe = 0;  vtransition_folder_icon = 0;
+
+       ladspa_vframe = 0;              ladspa_icon = 0;
+       ff_aud_vframe = 0;              ff_aud_icon = 0;
+       ff_vid_vframe = 0;              ff_vid_icon = 0;
+
+       clip_vframe = 0;                clip_icon = 0;
+       atransition_vframe = 0;         atransition_icon = 0;
+       vtransition_vframe = 0;         vtransition_icon = 0;
+       aeffect_vframe = 0;             aeffect_icon = 0;
+       veffect_vframe = 0;             veffect_icon = 0;
+
        plugin_visibility = ((uint64_t)1<<(8*sizeof(uint64_t)-1))-1;
        newfolder_thread = 0;
        asset_menu = 0;
+       effectlist_menu = 0;
        assetlist_menu = 0;
+       cliplist_menu = 0;
+       labellist_menu = 0;
        folderlist_menu = 0;
        temp_picon = 0;
        allow_iconlisting = 1;
        remove_plugin = 0;
        vicon_thread = 0;
        vicon_drawing = 1;
+       displayed_folder = AW_NO_FOLDER;
 }
 
 AWindowGUI::~AWindowGUI()
@@ -467,28 +454,40 @@ AWindowGUI::~AWindowGUI()
        displayed_assets[1].remove_all_objects();
 
        delete vicon_thread;
-       delete file_icon;
-       delete audio_icon;
-       delete video_icon;
-       delete folder_icon;
-       delete clip_icon;
-       delete atransition_icon;
-       delete vtransition_icon;
-       delete aeffect_icon;
-       delete ladspa_icon;
-       delete ladspa_vframe;
-       delete ff_aud_icon;
-       delete ff_aud_vframe;
-       delete ff_vid_icon;
-       delete ff_vid_vframe;
-       delete veffect_icon;
        delete newfolder_thread;
+
        delete asset_menu;
+       delete clip_menu;
        delete label_menu;
+       delete effectlist_menu;
        delete assetlist_menu;
+       delete cliplist_menu;
+       delete labellist_menu;
        delete folderlist_menu;
-       if(temp_picon) delete temp_picon;
+       delete temp_picon;
        delete remove_plugin;
+
+       delete file_vframe;             delete file_icon;
+       delete folder_vframe;           delete folder_icon;
+       delete audio_vframe;            delete audio_icon;
+       delete video_vframe;            delete video_icon;
+       delete label_vframe;            delete label_icon;
+       delete clip_vframe;             delete clip_icon;
+       delete aeffect_folder_vframe;   delete aeffect_folder_icon;
+       delete atransition_folder_vframe; delete atransition_folder_icon;
+       delete veffect_folder_vframe;   delete veffect_folder_icon;
+       delete vtransition_folder_vframe; delete vtransition_folder_icon;
+       delete clip_folder_vframe;      delete clip_folder_icon;
+       delete label_folder_vframe;     delete label_folder_icon;
+       delete media_folder_vframe;     delete media_folder_icon;
+       delete proxy_folder_vframe;     delete proxy_folder_icon;
+       delete ladspa_vframe;           delete ladspa_icon;
+       delete ff_aud_vframe;           delete ff_aud_icon;
+       delete ff_vid_vframe;           delete ff_vid_icon;
+       delete atransition_vframe;      delete atransition_icon;
+       delete vtransition_vframe;      delete vtransition_icon;
+       delete aeffect_vframe;          delete aeffect_icon;
+       delete veffect_vframe;          delete veffect_icon;
 }
 
 bool AWindowGUI::protected_pixmap(BC_Pixmap *icon)
@@ -498,110 +497,129 @@ bool AWindowGUI::protected_pixmap(BC_Pixmap *icon)
                icon == audio_icon ||
                icon == video_icon ||
                icon == clip_icon ||
+               icon == label_icon ||
                icon == vtransition_icon ||
                icon == atransition_icon ||
                icon == veffect_icon ||
                icon == aeffect_icon ||
                icon == ladspa_icon ||
                icon == ff_aud_icon ||
-               icon == ff_vid_icon;
+               icon == ff_vid_icon ||
+               icon == aeffect_folder_icon ||
+               icon == veffect_folder_icon ||
+               icon == atransition_folder_icon ||
+               icon == vtransition_folder_icon ||
+               icon == label_folder_icon ||
+               icon == clip_folder_icon ||
+               icon == media_folder_icon ||
+               icon == proxy_folder_icon;
 }
 
-void AWindowGUI::create_objects()
+VFrame *AWindowGUI::get_picon(const char *name, const char *plugin_icons)
+{
+       char png_path[BCTEXTLEN];
+       char *pp = png_path, *ep = pp + sizeof(png_path)-1;
+       snprintf(pp, ep-pp, "%s/picon_%s/%s.png",
+               File::get_plugin_path(), plugin_icons, name);
+       return VFramePng::vframe_png(png_path,0,0);
+}
+
+VFrame *AWindowGUI::get_picon(const char *name)
+{
+       VFrame *vframe = get_picon(name, mwindow->preferences->plugin_icons);
+       if( !vframe ) vframe = get_picon(name, DEFAULT_PICON);
+       return vframe;
+}
+
+void AWindowGUI::resource_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn, int idx)
+{
+       vfrm = get_picon(fn);
+       if( !vfrm ) vfrm = BC_WindowBase::get_resources()->type_to_icon[idx];
+       icon = new BC_Pixmap(this, vfrm, PIXMAP_ALPHA);
+}
+void AWindowGUI::theme_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn)
+{
+       vfrm = get_picon(fn);
+       if( !vfrm ) vfrm = mwindow->theme->get_image(fn);
+       icon = new BC_Pixmap(this, vfrm, PIXMAP_ALPHA);
+}
+void AWindowGUI::plugin_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn, unsigned char *png)
 {
-       AssetPicon *picon;
+       vfrm = get_picon(fn);
+       if( !vfrm ) vfrm = new VFramePng(png);
+       icon = new BC_Pixmap(this, vfrm, PIXMAP_ALPHA);
+}
 
+void AWindowGUI::create_objects()
+{
        lock_window("AWindowGUI::create_objects");
-SET_TRACE
-//printf("AWindowGUI::create_objects 1\n");
        asset_titles[0] = _("Title");
        asset_titles[1] = _("Comments");
 
-SET_TRACE
-
        set_icon(mwindow->theme->get_image("awindow_icon"));
-       file_icon = new BC_Pixmap(this,
-               BC_WindowBase::get_resources()->type_to_icon[ICON_UNKNOWN],
-               PIXMAP_ALPHA);
-
-       folder_icon = new BC_Pixmap(this,
-               BC_WindowBase::get_resources()->type_to_icon[ICON_FOLDER],
-               PIXMAP_ALPHA);
-
-       audio_icon = new BC_Pixmap(this,
-               BC_WindowBase::get_resources()->type_to_icon[ICON_SOUND],
-               PIXMAP_ALPHA);
-
-       video_icon = new BC_Pixmap(this,
-               BC_WindowBase::get_resources()->type_to_icon[ICON_FILM],
-               PIXMAP_ALPHA);
-
-SET_TRACE
-
-       clip_vframe = mwindow->theme->get_image("clip_icon");
-       clip_icon = new BC_Pixmap(this, clip_vframe, PIXMAP_ALPHA);
-       atransition_vframe = mwindow->theme->get_image("atransition_icon");
-       atransition_icon = new BC_Pixmap(this, atransition_vframe, PIXMAP_ALPHA);
-       vtransition_vframe = mwindow->theme->get_image("vtransition_icon");
-       vtransition_icon = new BC_Pixmap(this, vtransition_vframe, PIXMAP_ALPHA);
-       aeffect_vframe = mwindow->theme->get_image("aeffect_icon");
-       aeffect_icon = new BC_Pixmap(this, aeffect_vframe, PIXMAP_ALPHA);
-       ladspa_vframe = new VFramePng(lad_picon_png);
-       ladspa_icon = new BC_Pixmap(this, ladspa_vframe, PIXMAP_ALPHA);
-       ff_aud_vframe = new VFramePng(ff_audio_png);
-       ff_aud_icon = new BC_Pixmap(this, ff_aud_vframe, PIXMAP_ALPHA);
-       ff_vid_vframe = new VFramePng(ff_video_png);
-       ff_vid_icon = new BC_Pixmap(this, ff_vid_vframe, PIXMAP_ALPHA);
-       veffect_vframe = mwindow->theme->get_image("veffect_icon");
-       veffect_icon = new BC_Pixmap(this, veffect_vframe, PIXMAP_ALPHA);
-
-SET_TRACE
+
+       resource_icon(file_vframe,   file_icon,   "film_icon",   ICON_UNKNOWN);
+       resource_icon(folder_vframe, folder_icon, "folder_icon", ICON_FOLDER);
+       resource_icon(audio_vframe,  audio_icon,  "audio_icon",  ICON_SOUND);
+       resource_icon(video_vframe,  video_icon,  "video_icon",  ICON_FILM);
+       resource_icon(label_vframe,  label_icon,  "label_icon",  ICON_LABEL);
+
+       theme_icon(aeffect_folder_vframe,      aeffect_folder_icon,     "aeffect_folder");
+       theme_icon(atransition_folder_vframe,  atransition_folder_icon, "atransition_folder");
+       theme_icon(clip_folder_vframe,         clip_folder_icon,        "clip_folder");
+       theme_icon(label_folder_vframe,        label_folder_icon,       "label_folder");
+       theme_icon(media_folder_vframe,        media_folder_icon,       "media_folder");
+       theme_icon(proxy_folder_vframe,        proxy_folder_icon,       "proxy_folder");
+       theme_icon(veffect_folder_vframe,      veffect_folder_icon,     "veffect_folder");
+       theme_icon(vtransition_folder_vframe,  vtransition_folder_icon, "vtransition_folder");
+
+       folder_icons[AW_AEFFECT_FOLDER] = aeffect_folder_icon;
+       folder_icons[AW_VEFFECT_FOLDER] = veffect_folder_icon;
+       folder_icons[AW_ATRANSITION_FOLDER] = atransition_folder_icon;
+       folder_icons[AW_VTRANSITION_FOLDER] = vtransition_folder_icon;
+       folder_icons[AW_LABEL_FOLDER] = label_folder_icon;
+       folder_icons[AW_CLIP_FOLDER] = clip_folder_icon;
+       folder_icons[AW_MEDIA_FOLDER] = media_folder_icon;
+       folder_icons[AW_PROXY_FOLDER] = proxy_folder_icon;
+
+       theme_icon(clip_vframe,        clip_icon,        "clip_icon");
+       theme_icon(atransition_vframe, atransition_icon, "atransition_icon");
+       theme_icon(vtransition_vframe, vtransition_icon, "vtransition_icon");
+       theme_icon(aeffect_vframe,     aeffect_icon,     "aeffect_icon");
+       theme_icon(veffect_vframe,     veffect_icon,     "veffect_icon");
+
+       plugin_icon(ladspa_vframe, ladspa_icon, "lad_picon", lad_picon_png);
+       plugin_icon(ff_aud_vframe, ff_aud_icon, "ff_audio",  ff_audio_png);
+       plugin_icon(ff_vid_vframe, ff_vid_icon, "ff_video",  ff_video_png);
 
 // Mandatory folders
-       folders.append(picon = new AssetPicon(mwindow, this, AW_AEFFECT_FOLDER));
-       picon->persistent = 1;
-       folders.append(picon = new AssetPicon(mwindow, this, AW_VEFFECT_FOLDER));
-       picon->persistent = 1;
-       folders.append(picon = new AssetPicon(mwindow, this, AW_ATRANSITION_FOLDER));
-       picon->persistent = 1;
-       folders.append(picon = new AssetPicon(mwindow, this, AW_VTRANSITION_FOLDER));
-       picon->persistent = 1;
-       folders.append(picon = new AssetPicon(mwindow, this, AW_LABEL_FOLDER));
-       picon->persistent = 1;
-       folders.append(picon = new AssetPicon(mwindow, this, AW_CLIP_FOLDER));
-       picon->persistent = 1;
-       folders.append(picon = new AssetPicon(mwindow, this, AW_MEDIA_FOLDER));
-       picon->persistent = 1;
+       folders.append(new AssetPicon(mwindow, this, AW_AEFFECT_FOLDER, 1));
+       folders.append(new AssetPicon(mwindow, this, AW_VEFFECT_FOLDER, 1));
+       folders.append(new AssetPicon(mwindow, this, AW_ATRANSITION_FOLDER, 1));
+       folders.append(new AssetPicon(mwindow, this, AW_VTRANSITION_FOLDER, 1));
+       folders.append(new AssetPicon(mwindow, this, AW_LABEL_FOLDER, 1));
+       folders.append(new AssetPicon(mwindow, this, AW_CLIP_FOLDER, 1));
+       folders.append(new AssetPicon(mwindow, this, AW_PROXY_FOLDER, 1));
+       folders.append(new AssetPicon(mwindow, this, AW_MEDIA_FOLDER, 1));
 
        create_label_folder();
-SET_TRACE
 
        mwindow->theme->get_awindow_sizes(this);
        load_defaults(mwindow->defaults);
 
-SET_TRACE
-       add_subwindow(asset_list = new AWindowAssets(mwindow,
-               this,
-               mwindow->theme->alist_x,
-               mwindow->theme->alist_y,
-               mwindow->theme->alist_w,
-               mwindow->theme->alist_h));
+       add_subwindow(asset_list = new AWindowAssets(mwindow, this,
+               mwindow->theme->alist_x, mwindow->theme->alist_y,
+               mwindow->theme->alist_w, mwindow->theme->alist_h));
 
        vicon_thread = new VIconThread(asset_list);
        vicon_thread->start();
 
-SET_TRACE
-       add_subwindow(divider = new AWindowDivider(mwindow,
-               this,
-               mwindow->theme->adivider_x,
-               mwindow->theme->adivider_y,
-               mwindow->theme->adivider_w,
-               mwindow->theme->adivider_h));
+       add_subwindow(divider = new AWindowDivider(mwindow, this,
+               mwindow->theme->adivider_x, mwindow->theme->adivider_y,
+               mwindow->theme->adivider_w, mwindow->theme->adivider_h));
 
-SET_TRACE
        divider->set_cursor(HSEPARATE_CURSOR, 0, 0);
 
-SET_TRACE
        int fx = mwindow->theme->afolders_x, fy = mwindow->theme->afolders_y;
        int fw = mwindow->theme->afolders_w, fh = mwindow->theme->afolders_h;
        VFrame **images = mwindow->theme->get_image_set("playpatch_data");
@@ -610,40 +628,35 @@ SET_TRACE
        add_subwindow(add_tools = new AddTools(mwindow, this, fx, fy, _("Visibility")));
        add_tools->create_objects();
        fy += add_tools->get_h();  fh -= add_tools->get_h();
-SET_TRACE
        add_subwindow(folder_list = new AWindowFolders(mwindow,
                this, fx, fy, fw, fh));
-SET_TRACE
        update_effects();
-SET_TRACE
 
        //int x = mwindow->theme->abuttons_x;
        //int y = mwindow->theme->abuttons_y;
 
-SET_TRACE
 
        newfolder_thread = new NewFolderThread(mwindow, this);
 
        add_subwindow(asset_menu = new AssetPopup(mwindow, this));
        asset_menu->create_objects();
-
+       add_subwindow(clip_menu = new ClipPopup(mwindow, this));
+       clip_menu->create_objects();
        add_subwindow(label_menu = new LabelPopup(mwindow, this));
        label_menu->create_objects();
 
-SET_TRACE
-
+       add_subwindow(effectlist_menu = new EffectListMenu(mwindow, this));
+       effectlist_menu->create_objects();
        add_subwindow(assetlist_menu = new AssetListMenu(mwindow, this));
-
-SET_TRACE
        assetlist_menu->create_objects();
-
-SET_TRACE
+       add_subwindow(cliplist_menu = new ClipListMenu(mwindow, this));
+       cliplist_menu->create_objects();
+       add_subwindow(labellist_menu = new LabelListMenu(mwindow, this));
+       labellist_menu->create_objects();
 
        add_subwindow(folderlist_menu = new FolderListMenu(mwindow, this));
        folderlist_menu->create_objects();
-//printf("AWindowGUI::create_objects 2\n");
 
-SET_TRACE
        create_custom_xatoms();
        unlock_window();
 }
@@ -783,8 +796,8 @@ void AWindowRemovePluginGUI::create_objects()
        add_subwindow(title);
        y += title->get_h() + 5;
        list = new BC_ListBox(x, y,
-                get_w() - 20, ok_button->get_y() - y - 5, LISTBOX_TEXT, &plugin_list,
-                0, 0, 1, 0, 0, LISTBOX_SINGLE, ICON_LEFT, 0);
+               get_w() - 20, ok_button->get_y() - y - 5, LISTBOX_TEXT, &plugin_list,
+               0, 0, 1, 0, 0, LISTBOX_SINGLE, ICON_LEFT, 0);
        add_subwindow(list);
        show_window();
 }
@@ -823,13 +836,21 @@ void AWindowRemovePlugin::handle_close_event(int result)
                mwindow->plugindb->remove(plugin);
                remove(plugin_path);
                char index_path[BCTEXTLEN];
-               sprintf(index_path, "%s/%s", mwindow->preferences->plugin_dir, PLUGIN_FILE);
+               snprintf(index_path, sizeof(index_path), "%s/%s",
+                       mwindow->preferences->plugin_dir, PLUGIN_FILE);
                remove(index_path);
-               char png_path[BCTEXTLEN];
-               if( plugin->get_theme_png_path(png_path, mwindow->preferences->theme) )
-                       remove(png_path);
-               if( plugin->get_theme_png_path(png_path, "picon") )
-                       remove(png_path);
+               FileSystem fs;
+               fs.update(File::get_plugin_path());
+               for( int i=0; i<fs.dir_list.total; ++i ) {
+                       char *fs_path = fs.dir_list[i]->path;
+                       if( !fs.is_dir(fs_path) ) continue;
+                       char *cp = strrchr(fs_path,'/');
+                       cp = !cp ? fs_path : cp+1;
+                       if( strncmp("picon_", cp, 6) ) continue;
+                       char png_path[BCTEXTLEN];
+                       if( !plugin->get_plugin_png_path(png_path, cp+6) )
+                               remove(png_path);
+               }
                delete plugin;  plugin = 0;
                awindow->gui->async_update_assets();
        }
@@ -860,15 +881,15 @@ BC_Window* AWindowRemovePlugin::new_gui()
 
 int AWindowGUI::keypress_event()
 {
-       switch(get_keypress()) {
+       switch( get_keypress() ) {
        case 'w': case 'W':
-               if(ctrl_down()) {
+               if( ctrl_down() ) {
                        close_event();
                        return 1;
                }
                break;
        case DELETE:
-               if(shift_down()) {
+               if( shift_down() ) {
                        PluginServer* plugin = selected_plugin();
                        if( !plugin ) break;
                        remove_plugin = new AWindowRemovePlugin(awindow, plugin);
@@ -904,68 +925,47 @@ void AWindowGUI::async_update_assets()
 }
 
 
-
-
-
-
-
 void AWindowGUI::update_folder_list()
 {
        stop_vicon_drawing();
-//printf("AWindowGUI::update_folder_list 1\n");
-       for(int i = 0; i < folders.total; i++)
-       {
+       for( int i = 0; i < folders.total; i++ ) {
                AssetPicon *picon = (AssetPicon*)folders.values[i];
-               picon->in_use--;
+               picon->in_use = 0;
        }
-//printf("AWindowGUI::update_folder_list 1\n");
 
 // Search assets for folders
-       for(int i = 0; i < mwindow->edl->folders.total; i++)
-       {
+       for( int i = 0; i < mwindow->edl->folders.total; i++ ) {
                const char *folder = mwindow->edl->folders.values[i];
                int exists = 0;
-//printf("AWindowGUI::update_folder_list 1.1\n");
 
-               for(int j = 0; j < folders.total; j++)
-               {
+               for( int j = 0; j < folders.total; j++ ) {
                        AssetPicon *picon = (AssetPicon*)folders.values[j];
-                       if(!strcasecmp(picon->get_text(), folder))
-                       {
+                       if( !strcasecmp(picon->get_text(), folder) ) {
                                exists = 1;
                                picon->in_use = 1;
                                break;
                        }
                }
 
-               if(!exists)
-               {
+               if( !exists ) {
                        int aw_folder = folder_number(folder);
-                       AssetPicon *picon = aw_folder >= 0 ?
-                               new AssetPicon(mwindow, this, aw_folder) :
-                               new AssetPicon(mwindow, this, folder, AW_USER_FOLDER);
-                       picon->create_objects();
-                       folders.append(picon);
+                       if( aw_folder >= 0 ) {
+                               AssetPicon *picon = new AssetPicon(mwindow, this, aw_folder, 1);
+                               picon->create_objects();
+                               folders.append(picon);
+                       }
                }
-//printf("AWindowGUI::update_folder_list 1.3\n");
        }
-//printf("AWindowGUI::update_folder_list 1\n");
-//for(int i = 0; i < folders.total; i++)
-//     printf("AWindowGUI::update_folder_list %s\n", folders.values[i]->get_text());
 
-// Delete excess
-       for(int i = folders.total - 1; i >= 0; i--)
-       {
+// Delete unused non-persistent folders
+       for( int i=folders.total; --i>=0; ) {
                AssetPicon *picon = (AssetPicon*)folders.values[i];
-               if(!picon->in_use && !picon->persistent)
-               {
+               if( !picon->in_use && !picon->persistent ) {
                        delete picon;
                        folders.remove_number(i);
                }
        }
-//for(int i = 0; i < folders.total; i++)
-//     printf("AWindowGUI::update_folder_list %s\n", folders.values[i]->get_text());
-//printf("AWindowGUI::update_folder_list 2\n");
+
        start_vicon_drawing();
 }
 
@@ -977,10 +977,10 @@ void AWindowGUI::create_persistent_folder(ArrayList<BC_ListBoxItem*> *output,
        mwindow->search_plugindb(do_audio, do_video, is_realtime, is_transition,
                        0, plugin_list);
 
-       for(int i = 0; i < plugin_list.total; i++) {
+       for( int i = 0; i < plugin_list.total; i++ ) {
                PluginServer *server = plugin_list.values[i];
                int visible = plugin_visibility & (1<<server->dir_idx);
-               if(!visible) continue;
+               if( !visible ) continue;
 // Create new listitem
                AssetPicon *picon = new AssetPicon(mwindow, this, server);
                picon->create_objects();
@@ -991,7 +991,7 @@ void AWindowGUI::create_persistent_folder(ArrayList<BC_ListBoxItem*> *output,
 void AWindowGUI::create_label_folder()
 {
        Label *current;
-       for(current = mwindow->edl->labels->first; current; current = NEXT) {
+       for( current = mwindow->edl->labels->first; current; current = NEXT ) {
                AssetPicon *picon = new AssetPicon(mwindow, this, current);
                picon->create_objects();
                labellist.append(picon);
@@ -1001,32 +1001,20 @@ void AWindowGUI::create_label_folder()
 
 void AWindowGUI::update_asset_list()
 {
-//printf("AWindowGUI::update_asset_list 1\n");
-       for(int i = 0; i < assets.total; i++)
-       {
+       for( int i = 0; i < assets.total; i++ ) {
                AssetPicon *picon = (AssetPicon*)assets.values[i];
-               picon->in_use--;
+               picon->in_use = 0;
        }
 
-
-
-
-
-//printf("AWindowGUI::update_asset_list 2\n");
-
-
 // Synchronize EDL clips
-       for(int i = 0; i < mwindow->edl->clips.total; i++)
-       {
+       for( int i = 0; i < mwindow->edl->clips.total; i++ ) {
                int exists = 0;
 
 // Look for clip in existing listitems
-               for(int j = 0; j < assets.total && !exists; j++)
-               {
+               for( int j = 0; j < assets.total && !exists; j++ ) {
                        AssetPicon *picon = (AssetPicon*)assets.values[j];
 
-                       if(picon->id == mwindow->edl->clips.values[i]->id)
-                       {
+                       if( picon->id == mwindow->edl->clips.values[i]->id ) {
                                picon->edl = mwindow->edl->clips.values[i];
                                picon->set_text(mwindow->edl->clips.values[i]->local_session->clip_title);
                                exists = 1;
@@ -1035,37 +1023,25 @@ void AWindowGUI::update_asset_list()
                }
 
 // Create new listitem
-               if(!exists)
-               {
+               if( !exists ) {
                        AssetPicon *picon = new AssetPicon(mwindow,
-                               this,
-                               mwindow->edl->clips.values[i]);
+                               this, mwindow->edl->clips.values[i]);
                        picon->create_objects();
                        assets.append(picon);
                }
        }
 
-
-
-
-
-//printf("AWindowGUI::update_asset_list %d\n", __LINE__);
-
-
 // Synchronize EDL assets
-       for(Asset *current = mwindow->edl->assets->first;
+       for( Asset *current = mwindow->edl->assets->first;
                current;
-               current = NEXT)
-       {
+               current = NEXT ) {
                int exists = 0;
 
 // Look for asset in existing listitems
-               for(int j = 0; j < assets.total && !exists; j++)
-               {
+               for( int j = 0; j < assets.total && !exists; j++ ) {
                        AssetPicon *picon = (AssetPicon*)assets.values[j];
 
-                       if(picon->id == current->id)
-                       {
+                       if( picon->id == current->id ) {
                                picon->indexable = current;
                                exists = 1;
                                picon->in_use = 1;
@@ -1074,35 +1050,28 @@ void AWindowGUI::update_asset_list()
                }
 
 // Create new listitem
-               if(!exists)
-               {
-//printf("AWindowGUI::update_asset_list %d\n", __LINE__);
-                       AssetPicon *picon = new AssetPicon(mwindow, this, current);
-//printf("AWindowGUI::update_asset_list %d\n", __LINE__);
+               if( !exists ) {
+                       AssetPicon *picon = new AssetPicon(mwindow,
+                               this, current);
                        picon->create_objects();
-//printf("AWindowGUI::update_asset_list %d\n", __LINE__);
                        assets.append(picon);
                }
        }
 
-
-
-//printf("AWindowGUI::update_asset_list %d\n", __LINE__);
-
+       mwindow->gui->lock_window("AWindowGUI::update_asset_list");
+       mwindow->gui->default_message();
+       mwindow->gui->unlock_window();
 
 // Synchronize nested EDLs
-       for(int i = 0; i < mwindow->edl->nested_edls->size(); i++)
-       {
+       for( int i = 0; i < mwindow->edl->nested_edls->size(); i++ ) {
                int exists = 0;
                Indexable *indexable = mwindow->edl->nested_edls->get(i);
 
 // Look for asset in existing listitems
-               for(int j = 0; j < assets.total && !exists; j++)
-               {
+               for( int j = 0; j < assets.total && !exists; j++ ) {
                        AssetPicon *picon = (AssetPicon*)assets.values[j];
 
-                       if(picon->id == indexable->id)
-                       {
+                       if( picon->id == indexable->id ) {
                                picon->indexable = indexable;
                                exists = 1;
                                picon->in_use = 1;
@@ -1111,43 +1080,27 @@ void AWindowGUI::update_asset_list()
                }
 
 // Create new listitem
-               if(!exists)
-               {
+               if( !exists ) {
                        AssetPicon *picon = new AssetPicon(mwindow,
-                               this,
-                               indexable);
+                               this, indexable);
                        picon->create_objects();
                        assets.append(picon);
                }
        }
 
-
-
-
-
-
-
-
-
-//printf("AWindowGUI::update_asset_list %d\n", __LINE__);
-       for(int i = assets.size() - 1; i >= 0; i--)
-       {
+       for( int i = assets.size() - 1; i >= 0; i-- ) {
                AssetPicon *picon = (AssetPicon*)assets.get(i);
-//printf("AWindowGUI::update_asset_list %s %d\n", picon->asset->path, picon->in_use);
-               if(!picon->in_use)
-               {
+               if( !picon->in_use ) {
                        delete picon;
                        assets.remove_number(i);
                }
        }
-//printf("AWindowGUI::update_asset_list 7 %d\n", assets.total);
 }
 
 void AWindowGUI::update_picon(Indexable *indexable)
 {
-//printf("AWindowGUI::update_asset_list 1\n");
        VIcon *vicon = 0;
-       for(int i = 0; i < assets.total; i++) {
+       for( int i = 0; i < assets.total; i++ ) {
                AssetPicon *picon = (AssetPicon*)assets.values[i];
                if( picon->indexable == indexable ||
                    picon->edl == (EDL *)indexable ) {
@@ -1169,7 +1122,6 @@ void AWindowGUI::update_picon(Indexable *indexable)
 
 void AWindowGUI::sort_assets()
 {
-//printf("AWindowGUI::sort_assets 1 %s\n", mwindow->edl->session->current_folder);
        switch( mwindow->edl->session->awindow_folder ) {
        case AW_AEFFECT_FOLDER:
                sort_picons(&aeffects);
@@ -1184,12 +1136,20 @@ void AWindowGUI::sort_assets()
                sort_picons(&vtransitions);
                break;
        case AW_LABEL_FOLDER:
-               // Labels should ALWAYS be sorted by time
+               sort_picons(&labellist);
                break;
        default:
                sort_picons(&assets);
        }
+// reset xyposition
+       asset_list->update_format(asset_list->get_format(), 0);
+       update_assets();
+}
 
+void AWindowGUI::sort_folders()
+{
+       sort_picons(&folders);
+       folder_list->update_format(folder_list->get_format(), 0);
        update_assets();
 }
 
@@ -1201,10 +1161,10 @@ void AWindowGUI::collect_assets()
        while(1)
        {
                AssetPicon *result = (AssetPicon*)asset_list->get_selection(0, i++);
-               if(!result) break;
+               if( !result ) break;
 
-               if(result->indexable) mwindow->session->drag_assets->append(result->indexable);
-               if(result->edl) mwindow->session->drag_clips->append(result->edl);
+               if( result->indexable ) mwindow->session->drag_assets->append(result->indexable);
+               if( result->edl ) mwindow->session->drag_clips->append(result->edl);
        }
 }
 
@@ -1216,47 +1176,40 @@ void AWindowGUI::copy_picons(ArrayList<BC_ListBoxItem*> *dst,
        dst[1].remove_all_objects();
 
 // Create new pointers
-//if(folder) printf("AWindowGUI::copy_picons 1 %s\n", folder);
-       for(int i = 0; i < src->total; i++)
-       {
+       for( int i = 0; i < src->total; i++ ) {
                AssetPicon *picon = (AssetPicon*)src->values[i];
-//printf("AWindowGUI::copy_picons 2 %s\n", picon->asset->folder);
                if( folder < 0 ||
                    (picon->indexable && picon->indexable->awindow_folder == folder) ||
                    (picon->edl && picon->edl->local_session->awindow_folder == folder) ) {
                        BC_ListBoxItem *item2, *item1;
                        dst[0].append(item1 = picon);
-                       if(picon->edl)
+                       if( picon->edl )
                                dst[1].append(item2 = new BC_ListBoxItem(picon->edl->local_session->clip_notes));
                        else
-                       if(picon->label && picon->label->textstr)
+                       if( picon->label && picon->label->textstr )
                                dst[1].append(item2 = new BC_ListBoxItem(picon->label->textstr));
                        else
                                dst[1].append(item2 = new BC_ListBoxItem(""));
                        item1->set_autoplace_text(1);
                        item2->set_autoplace_text(1);
-//printf("AWindowGUI::copy_picons 3 %s\n", picon->get_text());
                }
        }
 }
 
 void AWindowGUI::sort_picons(ArrayList<BC_ListBoxItem*> *src)
 {
-//printf("AWindowGUI::sort_picons 1\n")
        int done = 0;
        while(!done)
        {
                done = 1;
-               for(int i = 0; i < src->total - 1; i++)
-               {
+               for( int i = 0; i < src->total - 1; i++ ) {
                        BC_ListBoxItem *item1 = src->values[i];
                        BC_ListBoxItem *item2 = src->values[i + 1];
                        item1->set_autoplace_icon(1);
                        item2->set_autoplace_icon(1);
                        item1->set_autoplace_text(1);
                        item2->set_autoplace_text(1);
-                       if(strcmp(item1->get_text(), item2->get_text()) > 0)
-                       {
+                       if( strcmp(item1->get_text(), item2->get_text()) > 0 ) {
                                src->values[i + 1] = item1;
                                src->values[i] = item2;
                                done = 0;
@@ -1268,7 +1221,7 @@ void AWindowGUI::sort_picons(ArrayList<BC_ListBoxItem*> *src)
 
 void AWindowGUI::filter_displayed_assets()
 {
-       allow_iconlisting = 1;
+       //allow_iconlisting = 1;
        asset_titles[0] = _("Title");
        asset_titles[1] = _("Comments");
 
@@ -1289,7 +1242,7 @@ void AWindowGUI::filter_displayed_assets()
                copy_picons(displayed_assets, &labellist, AW_NO_FOLDER);
                asset_titles[0] = _("Time Stamps");
                asset_titles[1] = _("Title");
-               allow_iconlisting = 0;
+               //allow_iconlisting = 0;
                break;
        default:
                copy_picons(displayed_assets, &assets, mwindow->edl->session->awindow_folder);
@@ -1297,56 +1250,45 @@ void AWindowGUI::filter_displayed_assets()
        }
 
        // Ensure the current folder icon is highlighted
-       for(int i = 0; i < folders.total; i++)
-               folders.values[i]->set_selected(0);
-
-       folders.values[mwindow->edl->session->awindow_folder]->set_selected(1);
+       int selected_folder = mwindow->edl->session->awindow_folder;
+       for( int i = 0; i < folders.total; i++ ) {
+               AssetPicon *folder_item = (AssetPicon *)folders.values[i];
+               int selected = folder_item->foldernum == selected_folder ? 1 : 0;
+               folder_item->set_selected(selected);
+       }
 }
 
 
 void AWindowGUI::update_assets()
 {
-//printf("AWindowGUI::update_assets 1\n");
        update_folder_list();
-//printf("AWindowGUI::update_assets 2\n");
        update_asset_list();
        labellist.remove_all_objects();
        create_label_folder();
-//printf("AWindowGUI::update_assets 3\n");
        filter_displayed_assets();
 
-//for(int i = 0; i < folders.total; i++)
-//printf("AWindowGUI::update_assets 4\n");
-//     printf("AWindowGUI::update_assets %s\n", folders.values[i]->get_text());
-       if(mwindow->edl->session->folderlist_format != folder_list->get_format())
+       if( mwindow->edl->session->folderlist_format != folder_list->get_format() ) {
                folder_list->update_format(mwindow->edl->session->folderlist_format, 0);
-       folder_list->update(&folders,
-               0,
-               0,
-               1,
-               folder_list->get_xposition(),
-               folder_list->get_yposition(),
-               -1);
-//printf("AWindowGUI::update_assets 5\n");
-
-       if(mwindow->edl->session->assetlist_format != asset_list->get_format())
-               asset_list->update_format(mwindow->edl->session->assetlist_format, 0);
-
+       }
+       int folder_xposition = folder_list->get_xposition();
+       int folder_yposition = folder_list->get_yposition();
+       folder_list->update(&folders, 0, 0, 1, folder_xposition, folder_yposition, -1);
 
-//printf("AWindowGUI::update_assets 6 %d\n", displayed_assets[0].total);
-       asset_list->update(displayed_assets,
-               asset_titles,
-               mwindow->edl->session->asset_columns,
-               ASSET_COLUMNS,
-               asset_list->get_xposition(),
-               asset_list->get_yposition(),
-               -1,
-               0);
+       if( mwindow->edl->session->assetlist_format != asset_list->get_format() ) {
+               asset_list->update_format(mwindow->edl->session->assetlist_format, 0);
+       }
+       int asset_xposition = asset_list->get_xposition();
+       int asset_yposition = asset_list->get_yposition();
+       if( displayed_folder != mwindow->edl->session->awindow_folder ) {
+               displayed_folder = mwindow->edl->session->awindow_folder;
+               asset_xposition = asset_yposition = 0;
+       }
+       asset_list->update(displayed_assets, asset_titles,
+               mwindow->edl->session->asset_columns, ASSET_COLUMNS,
+               asset_xposition, asset_yposition, -1, 0);
        asset_list->center_selection();
-//printf("AWindowGUI::update_assets 7\n");
 
        flush();
-//printf("AWindowGUI::update_assets 8\n");
        return;
 }
 
@@ -1364,7 +1306,7 @@ void AWindowGUI::update_effects()
 
 int AWindowGUI::folder_number(const char *name)
 {
-       for(int i = 0; i < AWINDOW_FOLDERS; i++) {
+       for( int i = 0; i < AWINDOW_FOLDERS; i++ ) {
                if( !strcasecmp(name, folder_names[i]) ) return i;
        }
        return AW_NO_FOLDER;
@@ -1372,7 +1314,7 @@ int AWindowGUI::folder_number(const char *name)
 
 int AWindowGUI::drag_motion()
 {
-       if(get_hidden()) return 0;
+       if( get_hidden() ) return 0;
 
        int result = 0;
        return result;
@@ -1380,7 +1322,7 @@ int AWindowGUI::drag_motion()
 
 int AWindowGUI::drag_stop()
 {
-       if(get_hidden()) return 0;
+       if( get_hidden() ) return 0;
 
        return 0;
 }
@@ -1422,8 +1364,7 @@ AWindowDivider::~AWindowDivider()
 
 int AWindowDivider::button_press_event()
 {
-       if(is_event_win() && cursor_inside())
-       {
+       if( is_event_win() && cursor_inside() ) {
                mwindow->session->current_operation = DRAG_PARTITION;
                return 1;
        }
@@ -1432,8 +1373,7 @@ int AWindowDivider::button_press_event()
 
 int AWindowDivider::cursor_motion_event()
 {
-       if(mwindow->session->current_operation == DRAG_PARTITION)
-       {
+       if( mwindow->session->current_operation == DRAG_PARTITION ) {
                int wmin = 25;
                int wmax = mwindow->session->awindow_w - mwindow->theme->adivider_w - wmin;
                int fw = gui->get_relative_cursor_x();
@@ -1449,8 +1389,7 @@ int AWindowDivider::cursor_motion_event()
 
 int AWindowDivider::button_release_event()
 {
-       if(mwindow->session->current_operation == DRAG_PARTITION)
-       {
+       if( mwindow->session->current_operation == DRAG_PARTITION ) {
                mwindow->session->current_operation = NO_OPERATION;
                return 1;
        }
@@ -1463,21 +1402,18 @@ int AWindowDivider::button_release_event()
 
 
 AWindowFolders::AWindowFolders(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h)
- : BC_ListBox(x,
-               y,
-               w,
-               h,
+ : BC_ListBox(x, y, w, h,
                mwindow->edl->session->folderlist_format == ASSETS_ICONS ?
                        LISTBOX_ICONS : LISTBOX_TEXT,
-               &gui->folders, // Each column has an ArrayList of BC_ListBoxItems.
-               0,             // Titles for columns.  Set to 0 for no titles
+               &gui->folders,    // Each column has an ArrayList of BC_ListBoxItems.
+               0,                // Titles for columns.  Set to 0 for no titles
                0,                // width of each column
-               1,                      // Total columns.
-               0,                    // Pixel of top of window.
-               0,                        // If this listbox is a popup window
-               LISTBOX_SINGLE,  // Select one item or multiple items
-               ICON_TOP,        // Position of icon relative to text of each item
-               1)               // Allow drags
+               1,                // Total columns.
+               0,                // Pixel of top of window.
+               0,                // If this listbox is a popup window
+               LISTBOX_SINGLE,   // Select one item or multiple items
+               ICON_TOP,         // Position of icon relative to text of each item
+               1)                // Allow drags
 {
        this->mwindow = mwindow;
        this->gui = gui;
@@ -1491,18 +1427,15 @@ AWindowFolders::~AWindowFolders()
 int AWindowFolders::selection_changed()
 {
        AssetPicon *picon = (AssetPicon*)get_selection(0, 0);
-       if(picon)
-       {
+       if( picon ) {
                gui->stop_vicon_drawing();
 
-               if(get_button_down() && get_buttonpress() == 3)
-               {
+               if( get_button_down() && get_buttonpress() == 3 ) {
                        gui->folderlist_menu->update_titles();
                        gui->folderlist_menu->activate_menu();
                }
 
-               mwindow->edl->session->awindow_folder =  picon->foldernum;
-//printf("AWindowFolders::selection_changed 1\n");
+               mwindow->edl->session->awindow_folder = picon->foldernum;
                gui->asset_list->draw_background();
                gui->async_update_assets();
 
@@ -1517,10 +1450,8 @@ int AWindowFolders::button_press_event()
 
        result = BC_ListBox::button_press_event();
 
-       if(!result)
-       {
-               if(get_buttonpress() == 3 && is_event_win() && cursor_inside())
-               {
+       if( !result ) {
+               if( get_buttonpress() == 3 && is_event_win() && cursor_inside() ) {
                        gui->folderlist_menu->update_titles();
                        gui->folderlist_menu->activate_menu();
                        result = 1;
@@ -1538,25 +1469,23 @@ int AWindowFolders::button_press_event()
 
 
 AWindowAssets::AWindowAssets(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h)
- : BC_ListBox(x,
-               y,
-               w,
-               h,
+ : BC_ListBox(x, y, w, h,
                (mwindow->edl->session->assetlist_format == ASSETS_ICONS && gui->allow_iconlisting ) ?
                        LISTBOX_ICONS : LISTBOX_TEXT,
                &gui->assets,     // Each column has an ArrayList of BC_ListBoxItems.
-               gui->asset_titles,             // Titles for columns.  Set to 0 for no titles
-               mwindow->edl->session->asset_columns,                // width of each column
-               1,                      // Total columns.
-               0,                    // Pixel of top of window.
-               0,                        // If this listbox is a popup window
-               LISTBOX_MULTIPLE,  // Select one item or multiple items
-               ICON_TOP,        // Position of icon relative to text of each item
-               1)               // Allow drag
+               gui->asset_titles,// Titles for columns.  Set to 0 for no titles
+               mwindow->edl->session->asset_columns, // width of each column
+               1,                // Total columns.
+               0,                // Pixel of top of window.
+               0,                // If this listbox is a popup window
+               LISTBOX_MULTIPLE, // Select one item or multiple items
+               ICON_TOP,         // Position of icon relative to text of each item
+               -1)               // Allow drags, require shift for scrolling
 {
        this->mwindow = mwindow;
        this->gui = gui;
        set_drag_scroll(0);
+       set_scroll_stretch(1, 1);
 }
 
 AWindowAssets::~AWindowAssets()
@@ -1569,22 +1498,40 @@ int AWindowAssets::button_press_event()
 
        result = BC_ListBox::button_press_event();
 
-       if(!result && get_buttonpress() == 3 && is_event_win() && cursor_inside())
-       {
+       if( !result && get_buttonpress() == 3 && is_event_win() && cursor_inside() ) {
                BC_ListBox::deactivate_selection();
-               gui->assetlist_menu->update_titles();
-               gui->assetlist_menu->activate_menu();
+               int folder = mwindow->edl->session->awindow_folder;
+               switch( folder ) {
+               case AW_AEFFECT_FOLDER:
+               case AW_VEFFECT_FOLDER:
+               case AW_ATRANSITION_FOLDER:
+               case AW_VTRANSITION_FOLDER:
+                       gui->effectlist_menu->update();
+                       gui->effectlist_menu->activate_menu();
+                       break;
+               case AW_LABEL_FOLDER:
+                       gui->labellist_menu->update();
+                       gui->labellist_menu->activate_menu();
+                       break;
+               case AW_CLIP_FOLDER:
+                       gui->cliplist_menu->update();
+                       gui->cliplist_menu->activate_menu();
+                       break;
+               case AW_MEDIA_FOLDER:
+               case AW_PROXY_FOLDER:
+                       gui->assetlist_menu->update_titles();
+                       gui->assetlist_menu->activate_menu();
+                       break;
+               }
                result = 1;
        }
 
-
        return result;
 }
 
 
 int AWindowAssets::handle_event()
 {
-//printf("AWindowAssets::handle_event 1 %d %d\n", get_buttonpress(), get_selection(0, 0));
        AssetPicon *asset_picon = (AssetPicon *)get_selection(0, 0);
        if( !asset_picon ) return 0;
        switch( mwindow->edl->session->awindow_folder ) {
@@ -1596,7 +1543,6 @@ int AWindowAssets::handle_event()
        VWindow *vwindow = mwindow->vwindows.size() > DEFAULT_VWINDOW ?
                mwindow->vwindows.get(DEFAULT_VWINDOW) : 0;
        if( !vwindow || !vwindow->is_running() ) return 1;
-//printf("AWindowAssets::handle_event 2 %d %d\n", get_buttonpress(), get_selection(0, 0));
 
        vwindow->gui->lock_window("AWindowAssets::handle_event");
        if( asset_picon->indexable )
@@ -1610,37 +1556,42 @@ int AWindowAssets::handle_event()
 int AWindowAssets::selection_changed()
 {
 // Show popup window
-       if( get_button_down() && get_buttonpress() == 3 && get_selection(0, 0) ) {
-               switch( mwindow->edl->session->awindow_folder ) {
+       AssetPicon *item;
+       if( get_button_down() && get_buttonpress() == 3 &&
+           (item = (AssetPicon*)get_selection(0, 0)) ) {
+               int folder = mwindow->edl->session->awindow_folder;
+               switch( folder ) {
                case AW_AEFFECT_FOLDER:
                case AW_VEFFECT_FOLDER:
                case AW_ATRANSITION_FOLDER:
                case AW_VTRANSITION_FOLDER:
-                       gui->assetlist_menu->update_titles();
-                       gui->assetlist_menu->activate_menu();
+                       gui->effectlist_menu->update();
+                       gui->effectlist_menu->activate_menu();
                        break;
                case AW_LABEL_FOLDER:
-                       if(((AssetPicon*)get_selection(0, 0))->label)
-                               gui->label_menu->activate_menu();
+                       if( !item->label ) break;
+                       gui->label_menu->activate_menu();
+                       break;
+               case AW_CLIP_FOLDER:
+                       if( !item->indexable && !item->edl ) break;
+                       gui->clip_menu->update();
+                       gui->clip_menu->activate_menu();
                        break;
                default:
-                       if(((AssetPicon*)get_selection(0, 0))->indexable)
-                               gui->asset_menu->update();
-                       else
-                       if(((AssetPicon*)get_selection(0, 0))->edl)
-                               gui->asset_menu->update();
-
+                       if( !item->indexable && !item->edl ) break;
+                       gui->asset_menu->update();
                        gui->asset_menu->activate_menu();
+                       break;
                }
 
                BC_ListBox::deactivate_selection();
                return 1;
        }
-       else if( get_button_down() && get_buttonpress() == 1 && get_selection(0, 0) ) {
+       else if( get_button_down() && get_buttonpress() == 1 &&
+                (item = (AssetPicon*)get_selection(0, 0)) ) {
                VIcon *vicon = 0;
                if( !gui->vicon_thread->viewing ) {
-                       AssetPicon *picon = (AssetPicon*)get_selection(0, 0);
-                       vicon = picon->vicon;
+                       vicon = item->vicon;
                }
                gui->vicon_thread->set_view_popup(vicon);
 
@@ -1692,21 +1643,19 @@ int AWindowAssets::drag_start_event()
                        break;
                }
 
-               if(collect_pluginservers)
-               {
+               if( collect_pluginservers ) {
                        int i = 0;
                        mwindow->session->drag_pluginservers->remove_all();
                        while(1)
                        {
                                AssetPicon *result = (AssetPicon*)get_selection(0, i++);
-                               if(!result) break;
+                               if( !result ) break;
 
                                mwindow->session->drag_pluginservers->append(result->plugin);
                        }
                }
 
-               if(collect_assets)
-               {
+               if( collect_assets ) {
                        gui->collect_assets();
                }
 
@@ -1724,8 +1673,7 @@ int AWindowAssets::drag_motion_event()
        mwindow->gui->drag_motion();
        mwindow->gui->unlock_window();
 
-       for(int i = 0; i < mwindow->vwindows.size(); i++)
-       {
+       for( int i = 0; i < mwindow->vwindows.size(); i++ ) {
                VWindow *vwindow = mwindow->vwindows.get(i);
                if( !vwindow->is_running() ) continue;
                vwindow->gui->lock_window("AWindowAssets::drag_motion_event");
@@ -1749,17 +1697,14 @@ int AWindowAssets::drag_stop_event()
 
        unlock_window();
 
-       if(!result)
-       {
+       if( !result ) {
                mwindow->gui->lock_window("AWindowAssets::drag_stop_event");
                result = mwindow->gui->drag_stop();
                mwindow->gui->unlock_window();
        }
 
-       if(!result)
-       {
-               for(int i = 0; !result && i < mwindow->vwindows.size(); i++)
-               {
+       if( !result ) {
+               for( int i = 0; !result && i < mwindow->vwindows.size(); i++ ) {
                        VWindow *vwindow = mwindow->vwindows.get(i);
                        if( !vwindow ) continue;
                        if( !vwindow->is_running() ) continue;
@@ -1773,8 +1718,7 @@ int AWindowAssets::drag_stop_event()
                }
        }
 
-       if(!result)
-       {
+       if( !result ) {
                mwindow->cwindow->gui->lock_window("AWindowAssets::drag_stop_event");
                result = mwindow->cwindow->gui->drag_stop();
                mwindow->cwindow->gui->unlock_window();
@@ -1782,7 +1726,7 @@ int AWindowAssets::drag_stop_event()
 
        lock_window("AWindowAssets::drag_stop_event");
 
-       if(result) get_drag_popup()->set_animation(0);
+       if( result ) get_drag_popup()->set_animation(0);
 
        BC_ListBox::drag_stop_event();
        mwindow->session->current_operation = ::NO_OPERATION; // since NO_OPERATION is also defined in listbox, we have to reach for global scope...
@@ -1843,8 +1787,7 @@ AWindowDeleteFolder::AWindowDeleteFolder(MWindow *mwindow, AWindowGUI *gui, int
 
 int AWindowDeleteFolder::handle_event()
 {
-       if(gui->folder_list->get_selection(0, 0))
-       {
+       if( gui->folder_list->get_selection(0, 0) ) {
                BC_ListBoxItem *folder = gui->folder_list->get_selection(0, 0);
                mwindow->delete_folder(folder->get_text());
        }
@@ -1890,19 +1833,21 @@ int AWindowDeleteProject::handle_event()
        return 1;
 }
 
-AWindowInfo::AWindowInfo(MWindow *mwindow, AWindowGUI *gui, int x, int y)
- : BC_Button(x, y, mwindow->theme->infoasset_data)
-{
-       this->mwindow = mwindow;
-       this->gui = gui;
-       set_tooltip(_("Edit information on asset"));
-}
-
-int AWindowInfo::handle_event()
-{
-       gui->awindow->asset_edit->edit_asset(gui->selected_asset());
-       return 1;
-}
+// AWindowInfo::AWindowInfo(MWindow *mwindow, AWindowGUI *gui, int x, int y)
+//  : BC_Button(x, y, mwindow->theme->infoasset_data)
+// {
+//     this->mwindow = mwindow;
+//     this->gui = gui;
+//     set_tooltip(_("Edit information on asset"));
+// }
+// 
+// int AWindowInfo::handle_event()
+// {
+//     int cur_x, cur_y;
+//     gui->get_abs_cursor(cur_x, cur_y, 0);
+//     gui->awindow->asset_edit->edit_asset(gui->selected_asset(), cur_x, cur_y);
+//     return 1;
+// }
 
 AWindowRedrawIndex::AWindowRedrawIndex(MWindow *mwindow, AWindowGUI *gui, int x, int y)
  : BC_Button(x, y, mwindow->theme->redrawindex_data)
@@ -1956,63 +1901,6 @@ int AWindowView::handle_event()
        return 1;
 }
 
-
-LabelPopup::LabelPopup(MWindow *mwindow, AWindowGUI *gui)
- : BC_PopupMenu(0,
-               0,
-               0,
-               "",
-               0)
-{
-       this->mwindow = mwindow;
-       this->gui = gui;
-}
-
-LabelPopup::~LabelPopup()
-{
-}
-
-void LabelPopup::create_objects()
-{
-       add_item(editlabel = new LabelPopupEdit(mwindow, this));
-}
-
-int LabelPopup::update()
-{
-       gui->collect_assets();
-       return 0;
-}
-
-
-
-LabelPopupEdit::LabelPopupEdit(MWindow *mwindow, LabelPopup *popup)
- : BC_MenuItem(_("Edit..."))
-{
-       this->mwindow = mwindow;
-       this->popup = popup;
-}
-
-LabelPopupEdit::~LabelPopupEdit()
-{
-}
-
-int LabelPopupEdit::handle_event()
-{
-       int i = 0;
-       while(1)
-       {
-               AssetPicon *result = (AssetPicon*)mwindow->awindow->gui->asset_list->get_selection(0, i++);
-               if(!result) break;
-
-               if(result->label) {
-                       mwindow->awindow->gui->awindow->label_edit->edit_label(result->label);
-                       break;
-               }
-       }
-
-       return 1;
-}
-
 AddTools::AddTools(MWindow *mwindow, AWindowGUI *gui, int x, int y, const char *title)
  : BC_PopupMenu(x, y, BC_Title::calculate_w(gui, title, MEDIUMFONT)+8, title, -1, 0, 4)
 {
@@ -2065,13 +1953,13 @@ AddPluginItem::AddPluginItem(AddTools *menu, char const *text, int idx)
        this->idx = idx;
        uint64_t msk = (uint64_t)1 << idx, vis = menu->gui->plugin_visibility;
        int chk = (msk & vis) ? 1 : 0;
-        set_checked(chk);
+       set_checked(chk);
 }
 
 int AddPluginItem::handle_event()
 {
-        int chk = get_checked() ^ 1;
-        set_checked(chk);
+       int chk = get_checked() ^ 1;
+       set_checked(chk);
        uint64_t msk = (uint64_t)1 << idx, vis = menu->gui->plugin_visibility;
        menu->gui->plugin_visibility = chk ? vis | msk : vis & ~msk;
        menu->gui->update_effects();
@@ -2110,3 +1998,53 @@ int AVIconDrawing::handle_event()
        return 1;
 }
 
+
+AWindowListFormat::AWindowListFormat(MWindow *mwindow, AWindowGUI *gui)
+ : BC_MenuItem("")
+{
+       this->mwindow = mwindow;
+       this->gui = gui;
+}
+
+int AWindowListFormat::handle_event()
+{
+       gui->stop_vicon_drawing();
+
+       EDLSession *session = mwindow->edl->session;
+       switch( session->assetlist_format ) {
+       case ASSETS_TEXT:
+               session->assetlist_format = ASSETS_ICONS;
+               break;
+       case ASSETS_ICONS:
+               session->assetlist_format = ASSETS_TEXT;
+               break;
+       }
+
+       gui->asset_list->update_format(session->assetlist_format, 1);
+       if( !mwindow->awindow->gui->allow_iconlisting ) {
+               mwindow->edl->session->assetlist_format = ASSETS_TEXT;
+       }
+
+       gui->start_vicon_drawing();
+       return 1;
+}
+
+void AWindowListFormat::update()
+{
+       set_text(mwindow->edl->session->assetlist_format == ASSETS_TEXT ?
+               (char*)_("Display icons") : (char*)_("Display text"));
+}
+
+AWindowListSort::AWindowListSort(MWindow *mwindow, AWindowGUI *gui)
+ : BC_MenuItem(_("Sort items"))
+{
+       this->mwindow = mwindow;
+       this->gui = gui;
+}
+
+int AWindowListSort::handle_event()
+{
+       gui->sort_assets();
+       return 1;
+}
+