add 2 asset list fmts, user title rework, added show edit, bt tweak
[goodguy/history.git] / cinelerra-5.1 / cinelerra / awindowgui.C
index 54101d5a3625c63df9d99edeee0e5ef37a30c42f..e7f8e7bee9daf24980b67d1314079838394ab733 100644 (file)
@@ -171,7 +171,7 @@ int AssetVIcon::get_vx()
 int AssetVIcon::get_vy()
 {
        BC_ListBox *lbox = picon->gui->asset_list;
-       return lbox->get_item_y(picon) + lbox->get_title_h();
+       return lbox->get_item_y(picon);
 }
 
 void AssetVIcon::load_audio()
@@ -651,7 +651,6 @@ void AssetPicon::create_objects()
                                        open_render_engine(edl, 0);
                                        render_video(0, gui->temp_picon);
                                        close_render_engine();
-                                       gui->lock_window("AssetPicon::create_objects 0");
                                        icon_vframe = new VFrame(0,
                                                -1, pixmap_w, pixmap_h, BC_RGB888, -1);
                                        icon_vframe->transfer_from(gui->temp_picon);
@@ -661,6 +660,7 @@ void AssetPicon::create_objects()
                                        pixmap_w = icon_vframe->get_w();
                                        pixmap_h = icon_vframe->get_h();
                                }
+                               gui->lock_window("AssetPicon::create_objects 0");
                                icon = new BC_Pixmap(gui, pixmap_w, pixmap_h);
                                icon->draw_vframe(icon_vframe,
                                        0, 0, pixmap_w, pixmap_h, 0, 0);
@@ -847,6 +847,7 @@ AWindowGUI::AWindowGUI(MWindow *mwindow, AWindow *awindow)
        vicon_audio = 0;
        vicon_drawing = 1;
        displayed_folder = AW_NO_FOLDER;
+       folder_lock = new Mutex("AWindowGUI::folder_lock");
 }
 
 AWindowGUI::~AWindowGUI()
@@ -889,6 +890,7 @@ AWindowGUI::~AWindowGUI()
        delete vtransition_vframe;      delete vtransition_icon;
        delete aeffect_vframe;          delete aeffect_icon;
        delete veffect_vframe;          delete veffect_icon;
+       delete folder_lock;
 }
 
 bool AWindowGUI::protected_pixmap(BC_Pixmap *icon)
@@ -998,7 +1000,7 @@ void AWindowGUI::create_objects()
        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);
-
+       folder_lock->lock("AWindowGUI::create_objects");
 // Mandatory folders
        folders.append(new AssetPicon(mwindow, this, AW_AEFFECT_FOLDER, 1));
        folders.append(new AssetPicon(mwindow, this, AW_VEFFECT_FOLDER, 1));
@@ -1010,6 +1012,7 @@ void AWindowGUI::create_objects()
        folders.append(new AssetPicon(mwindow, this, AW_MEDIA_FOLDER, 1));
 
        create_label_folder();
+       folder_lock->unlock();
 
        mwindow->theme->get_awindow_sizes(this);
        load_defaults(mwindow->defaults);
@@ -1023,6 +1026,8 @@ void AWindowGUI::create_objects()
        add_subwindow(asset_list = new AWindowAssets(mwindow, this, x1, y1, w1, h1));
 
        vicon_thread = new VIconThread(asset_list);
+       int x0 = 0, y0 = asset_list->get_title_h();
+       vicon_thread->set_drawing_area(x0,y0, get_w(),get_h());
        vicon_thread->start();
        vicon_audio = new AssetVIconAudio(this);
 
@@ -1174,8 +1179,15 @@ void AWindowGUI::start_vicon_drawing()
 {
        if( !vicon_drawing ) return;
        if( mwindow->edl->session->awindow_folder != AW_MEDIA_FOLDER ) return;
-       if( mwindow->edl->session->assetlist_format != ASSETS_ICONS ) return;
-       vicon_thread->start_drawing();
+       switch( mwindow->edl->session->assetlist_format ) {
+       case ASSETS_ICONS:
+       case ASSETS_ICONS_PACKED:
+       case ASSETS_ICON_LIST:
+               vicon_thread->start_drawing();
+               break;
+       default:
+               break;
+       }
 }
 
 void AWindowGUI::stop_vicon_drawing()
@@ -1206,6 +1218,7 @@ AWindowRemovePluginGUI::
 
 void AWindowRemovePluginGUI::create_objects()
 {
+       lock_window("AWindowRemovePluginGUI::create_objects");
        BC_Button *ok_button = new BC_OKButton(this);
        add_subwindow(ok_button);
        BC_Button *cancel_button = new BC_CancelButton(this);
@@ -1219,6 +1232,7 @@ void AWindowRemovePluginGUI::create_objects()
                0, 0, 1, 0, 0, LISTBOX_SINGLE, ICON_LEFT, 0);
        add_subwindow(list);
        show_window();
+       unlock_window();
 }
 
 int AWindowRemovePlugin::remove_plugin(PluginServer *plugin, ArrayList<BC_ListBoxItem*> &folder)
@@ -1553,6 +1567,7 @@ void AWindowGUI::update_picon(Indexable *indexable)
 
 void AWindowGUI::sort_assets(int use_mtime)
 {
+       folder_lock->lock("AWindowGUI::sort_assets");
        switch( mwindow->edl->session->awindow_folder ) {
        case AW_AEFFECT_FOLDER:
                sort_picons(&aeffects);
@@ -1571,16 +1586,20 @@ void AWindowGUI::sort_assets(int use_mtime)
                break;
        default:
                sort_picons(&assets, use_mtime);
+               break;
        }
 // reset xyposition
        asset_list->update_format(asset_list->get_format(), 0);
+       folder_lock->unlock();
        update_assets();
 }
 
 void AWindowGUI::sort_folders()
 {
+       folder_lock->lock("AWindowGUI::update_assets");
        sort_picons(&folders);
        folder_list->update_format(folder_list->get_format(), 0);
+       folder_lock->unlock();
        update_assets();
 }
 
@@ -1666,7 +1685,7 @@ void AWindowGUI::copy_picons(ArrayList<BC_ListBoxItem*> *dst,
                        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 )
                                dst[1].append(item2 = new BC_ListBoxItem(picon->label->textstr));
                        else if( picon->mtime ) {
                                char date_time[BCSTRLEN];
@@ -1753,6 +1772,7 @@ void AWindowGUI::filter_displayed_assets()
 void AWindowGUI::update_assets()
 {
        stop_vicon_drawing();
+       folder_lock->lock("AWindowGUI::update_assets");
        update_folder_list();
        update_asset_list();
        labellist.remove_all_objects();
@@ -1761,6 +1781,7 @@ void AWindowGUI::update_assets()
        if( displayed_folder != mwindow->edl->session->awindow_folder )
                search_text->clear();
        filter_displayed_assets();
+       folder_lock->unlock();
 
        if( mwindow->edl->session->folderlist_format != folder_list->get_format() ) {
                folder_list->update_format(mwindow->edl->session->folderlist_format, 0);
@@ -1771,6 +1792,11 @@ void AWindowGUI::update_assets()
 
        if( mwindow->edl->session->assetlist_format != asset_list->get_format() ) {
                asset_list->update_format(mwindow->edl->session->assetlist_format, 0);
+               int x0 = 0;
+               int x1 = asset_list->get_w();
+               int y0 = asset_list->get_title_h();
+               int y1 = asset_list->get_h();
+               vicon_thread->set_drawing_area(x0,y0, x1,y1);
        }
        int asset_xposition = asset_list->get_xposition();
        int asset_yposition = asset_list->get_yposition();
@@ -1898,7 +1924,7 @@ 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,
-               mwindow->edl->session->folderlist_format == ASSETS_ICONS ?
+               mwindow->edl->session->folderlist_format == FOLDERS_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
@@ -1964,9 +1990,11 @@ 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,
-               (mwindow->edl->session->assetlist_format == ASSETS_ICONS && gui->allow_iconlisting ) ?
-                       LISTBOX_ICONS : LISTBOX_TEXT,
+ : BC_ListBox(x, y, w, h, !gui->allow_iconlisting ? LISTBOX_TEXT :
+               mwindow->edl->session->assetlist_format == ASSETS_ICONS ? LISTBOX_ICONS :
+               mwindow->edl->session->assetlist_format == ASSETS_ICONS_PACKED ? LISTBOX_ICONS_PACKED :
+               mwindow->edl->session->assetlist_format == ASSETS_ICON_LIST ? LISTBOX_ICON_LIST :
+                       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
@@ -2588,28 +2616,55 @@ 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;
+       if( mwindow->awindow->gui->allow_iconlisting ) {
+               switch( session->assetlist_format ) {
+               case ASSETS_TEXT:
+                       session->assetlist_format = ASSETS_ICONS;
+                       break;
+               case ASSETS_ICONS:
+                       session->assetlist_format = ASSETS_ICONS_PACKED;
+                       break;
+               case ASSETS_ICONS_PACKED:
+                       session->assetlist_format = ASSETS_ICON_LIST;
+                       break;
+               case ASSETS_ICON_LIST:
+                       session->assetlist_format = ASSETS_TEXT;
+                       break;
+               }
        }
-
-       gui->asset_list->update_format(session->assetlist_format, 1);
-       if( !mwindow->awindow->gui->allow_iconlisting ) {
+       else
                mwindow->edl->session->assetlist_format = ASSETS_TEXT;
-       }
+       gui->asset_list->update_format(session->assetlist_format, 0);
+       int x0 = 0;
+       int x1 = gui->asset_list->get_w();
+       int y0 = gui->asset_list->get_title_h();
+       int y1 = gui->asset_list->get_h();
+       gui->vicon_thread->set_drawing_area(x0,y0, x1,y1);
 
+       gui->async_update_assets();
        gui->start_vicon_drawing();
        return 1;
 }
 
 void AWindowListFormat::update()
 {
-       set_text(mwindow->edl->session->assetlist_format == ASSETS_TEXT ?
-               (char*)_("Display icons") : (char*)_("Display text"));
+       EDLSession *session = mwindow->edl->session;
+       const char *text = 0;
+       switch( session->assetlist_format ) {
+       case ASSETS_TEXT:
+               text = _("Display icons");
+               break;
+       case ASSETS_ICONS:
+               text = _("Display icons packed");
+               break;
+       case ASSETS_ICONS_PACKED:
+               text = _("Display icon list");
+               break;
+       case ASSETS_ICON_LIST:
+               text = _("Display text");
+               break;
+       }
+       set_text(text);
 }
 
 AWindowListSort::AWindowListSort(MWindow *mwindow, AWindowGUI *gui)