add resource wdw folder expanders, fix plugin close deadlock detect
[goodguy/history.git] / cinelerra-5.1 / guicast / bclistbox.C
index 54bab352a6f7a6b12db02067a4b21c36b5831db3..31bcb1412cf40ad43ef64322f422c2413d0b2eaf 100644 (file)
@@ -618,8 +618,7 @@ void BC_ListBox::calculate_last_coords_recursive(
                                *next_text_y = current_text_y;
 
 // Add sublist depth if it is expanded
                                *next_text_y = current_text_y;
 
 // Add sublist depth if it is expanded
-                       if( item->get_sublist() && item->get_columns() &&
-                           item->get_expand() ) {
+                       if( item->sublist_active() && item->get_columns() ) {
                                calculate_last_coords_recursive(item->get_sublist(),
                                        icon_x, next_icon_x, next_icon_y, next_text_y, 0);
                        }
                                calculate_last_coords_recursive(item->get_sublist(),
                                        icon_x, next_icon_x, next_icon_y, next_text_y, 0);
                        }
@@ -712,7 +711,7 @@ void BC_ListBox::calculate_item_coords_recursive(
                                if( dt > row_descent ) row_descent = dt;
 
 // printf("BC_ListBox::calculate_item_coords_recursive %p %d %d %d %d %s \n",
                                if( dt > row_descent ) row_descent = dt;
 
 // printf("BC_ListBox::calculate_item_coords_recursive %p %d %d %d %d %s \n",
-// item->get_sublist(), item->get_columns(), item->get_expand(),
+// item->sublist, item->get_columns(), item->get_expand(),
 // next_text_x, *next_text_y, item->get_text());
 // Increment position of next column
                                if( j < columns - 1 ) {
 // next_text_x, *next_text_y, item->get_text());
 // Increment position of next column
                                if( j < columns - 1 ) {
@@ -743,8 +742,7 @@ void BC_ListBox::calculate_item_coords_recursive(
 
 // Set up a sublist
                BC_ListBoxItem *item = data[master_column].values[i];
 
 // Set up a sublist
                BC_ListBoxItem *item = data[master_column].values[i];
-               if( item->get_sublist() && item->get_columns() &&
-                   item->get_expand() ) {
+               if( item->sublist_active() && item->get_columns() ) {
                        calculate_item_coords_recursive( item->get_sublist(),
                                icon_x, next_icon_x, next_icon_y, next_text_y, 0);
                }
                        calculate_item_coords_recursive( item->get_sublist(),
                                icon_x, next_icon_x, next_icon_y, next_text_y, 0);
                }
@@ -1010,11 +1008,8 @@ int BC_ListBox::get_items_height(ArrayList<BC_ListBoxItem*> *data, int columns,
                        get_text_mask(item, x, y, w, h);
                        *result += h;
 // Descend into sublist
                        get_text_mask(item, x, y, w, h);
                        *result += h;
 // Descend into sublist
-                       if( item->get_sublist() && item->get_expand() ) {
-                               get_items_height(item->get_sublist(),
-                                       item->get_columns(),
-                                       result);
-                       }
+                       if( item->sublist_active() )
+                               get_items_height(item->get_sublist(), item->get_columns(), result);
                        break;
                case LISTBOX_ICONS:
                case LISTBOX_ICONS_PACKED:
                        break;
                case LISTBOX_ICONS:
                case LISTBOX_ICONS_PACKED:
@@ -1076,7 +1071,7 @@ void BC_ListBox::collapse_recursive(ArrayList<BC_ListBoxItem*> *data,
 {
        for( int i=0; i<data[master_column].total; ++i ) {
                BC_ListBoxItem *item = data[master_column].values[i];
 {
        for( int i=0; i<data[master_column].total; ++i ) {
                BC_ListBoxItem *item = data[master_column].values[i];
-               if( item->get_sublist() && item->expand ) {
+               if( item->sublist_active() ) {
                        item->expand = 0;
                        collapse_recursive(item->get_sublist(), master_column);
                }
                        item->expand = 0;
                        collapse_recursive(item->get_sublist(), master_column);
                }
@@ -1094,7 +1089,7 @@ void BC_ListBox::set_autoplacement(ArrayList<BC_ListBoxItem*> *data,
                }
 
                BC_ListBoxItem *item = data[master_column].values[i];
                }
 
                BC_ListBoxItem *item = data[master_column].values[i];
-               if( item->get_sublist() ) {
+               if( item->sublist_active() ) {
                        set_autoplacement(item->get_sublist(), do_icons, do_text);
                }
        }
                        set_autoplacement(item->get_sublist(), do_icons, do_text);
                }
        }
@@ -1293,7 +1288,7 @@ BC_ListBoxItem* BC_ListBox::get_selection_recursive(ArrayList<BC_ListBoxItem*> *
                        }
                }
 
                        }
                }
 
-               if( item->get_sublist() ) {
+               if( item->sublist_active() ) {
                        BC_ListBoxItem *result = get_selection_recursive(item->get_sublist(),
                                column,
                                selection_number);
                        BC_ListBoxItem *result = get_selection_recursive(item->get_sublist(),
                                column,
                                selection_number);
@@ -1326,7 +1321,7 @@ int BC_ListBox::get_selection_number_recursive(ArrayList<BC_ListBoxItem*> *data,
                                return (*counter);
                        }
                }
                                return (*counter);
                        }
                }
-               if( item->get_sublist() ) {
+               if( item->sublist_active() ) {
                        int result = get_selection_number_recursive(item->get_sublist(),
                                column, selection_number, counter);
                        if( result >= 0 ) return result;
                        int result = get_selection_number_recursive(item->get_sublist(),
                                column, selection_number, counter);
                        if( result >= 0 ) return result;
@@ -1457,8 +1452,7 @@ int BC_ListBox::select_previous(int skip, BC_ListBoxItem *selected_item, int *co
        do {
                for( int i=data[master_column].total-1; i>=0; --i ) {
                        BC_ListBoxItem *current_item = data[master_column].values[i];
        do {
                for( int i=data[master_column].total-1; i>=0; --i ) {
                        BC_ListBoxItem *current_item = data[master_column].values[i];
-                       if( current_item->get_sublist() &&
-                           current_item->get_expand() ) {
+                       if( current_item->sublist_active() ) {
                                int result = select_previous(skip, selected_item, counter,
                                        current_item->get_sublist(), got_first, got_second);
                                if( *got_second )
                                int result = select_previous(skip, selected_item, counter,
                                        current_item->get_sublist(), got_first, got_second);
                                if( *got_second )
@@ -1549,8 +1543,7 @@ int BC_ListBox::select_next(int skip, BC_ListBoxItem *selected_item, int *counte
                        }
 
 // Descend into expanded level
                        }
 
 // Descend into expanded level
-                       if( current_item->get_sublist() &&
-                           current_item->get_expand() ) {
+                       if( current_item->sublist_active() ) {
                                int result = select_next(skip, selected_item, counter,
                                        current_item->get_sublist(), got_first, got_second);
                                if( *got_second ) {
                                int result = select_next(skip, selected_item, counter,
                                        current_item->get_sublist(), got_first, got_second);
                                if( *got_second ) {
@@ -1654,10 +1647,8 @@ int BC_ListBox::center_selection(int selection,
                }
 
 // Descend
                }
 
 // Descend
-               if( item->get_sublist() ) {
-                       int result = center_selection(selection,
-                               item->get_sublist(),
-                               counter);
+               if( item->sublist_active() ) {
+                       int result = center_selection(selection, item->get_sublist(), counter);
                        if( result ) return result;
                }
        }
                        if( result ) return result;
                }
        }
@@ -1943,10 +1934,10 @@ int BC_ListBox::select_rectangle(ArrayList<BC_ListBoxItem*> *data,
                }
 
                BC_ListBoxItem *item = data[master_column].values[i];
                }
 
                BC_ListBoxItem *item = data[master_column].values[i];
-               if( item->get_sublist() &&
-                   item->get_expand() )
+               if( item->sublist_active() ) {
                        result |= select_rectangle(item->get_sublist(),
                                x1, y1, x2, y2);
                        result |= select_rectangle(item->get_sublist(),
                                x1, y1, x2, y2);
+               }
        }
        return result;
 }
        }
        return result;
 }
@@ -1985,9 +1976,8 @@ void BC_ListBox::move_selection(ArrayList<BC_ListBoxItem*> *dst,
                        continue;
                }
 // Descend into sublist
                        continue;
                }
 // Descend into sublist
-               if( item->get_sublist() ) {
-                       move_selection(dst,
-                               item->get_sublist());
+               if( item->sublist_active() ) {
+                       move_selection(dst, item->get_sublist());
                }
                ++i;
        }
                }
                ++i;
        }
@@ -2020,11 +2010,8 @@ int BC_ListBox::put_selection(ArrayList<BC_ListBoxItem*> *data,
                }
 
                BC_ListBoxItem *item = data[master_column].values[i];
                }
 
                BC_ListBoxItem *item = data[master_column].values[i];
-               if( item->get_sublist() ) {
-                       if( put_selection(item->get_sublist(),
-                               src,
-                               destination,
-                               counter) )
+               if( item->sublist_active() ) {
+                       if( put_selection(item->get_sublist(), src, destination, counter) )
                                return 1;
                }
        }
                                return 1;
                }
        }
@@ -2050,10 +2037,8 @@ int BC_ListBox::item_to_index(ArrayList<BC_ListBoxItem*> *data,
                }
 
                BC_ListBoxItem *new_item = data[master_column].values[i];
                }
 
                BC_ListBoxItem *new_item = data[master_column].values[i];
-               if( new_item->get_sublist() ) {
-                       if( item_to_index(new_item->get_sublist(),
-                               item,
-                               counter) >= 0 )
+               if( new_item->sublist_active() ) {
+                       if( item_to_index(new_item->get_sublist(), item, counter) >= 0 )
                                return (*counter);
                }
        }
                                return (*counter);
                }
        }
@@ -2072,7 +2057,7 @@ BC_ListBoxItem* BC_ListBox::index_to_item(ArrayList<BC_ListBoxItem*> *data,
                        return data[column].values[i];
                }
                BC_ListBoxItem *item = data[master_column].values[i];
                        return data[column].values[i];
                }
                BC_ListBoxItem *item = data[master_column].values[i];
-               if( item->get_sublist() ) {
+               if( item->sublist_active() ) {
                        BC_ListBoxItem *result = index_to_item(item->get_sublist(),
                                number, column, counter);
                        if( result ) return result;
                        BC_ListBoxItem *result = index_to_item(item->get_sublist(),
                                number, column, counter);
                        if( result ) return result;
@@ -2136,7 +2121,7 @@ int BC_ListBox::get_cursor_item(ArrayList<BC_ListBoxItem*> *data, int cursor_x,
                                }
 
 // Descend into sublist
                                }
 
 // Descend into sublist
-                               if( item->get_sublist() ) {
+                               if( item->sublist_active() ) {
                                        if( get_cursor_item(item->get_sublist(),
                                              cursor_x, cursor_y, item_return, counter,
                                              item->get_expand()) >= 0 )
                                        if( get_cursor_item(item->get_sublist(),
                                              cursor_x, cursor_y, item_return, counter,
                                              item->get_expand()) >= 0 )
@@ -2260,7 +2245,7 @@ int BC_ListBox::get_first_selection(ArrayList<BC_ListBoxItem*> *data, int *resul
                BC_ListBoxItem *item = data[master_column].values[i];
                (*result)++;
                if( item->selected ) return (*result);
                BC_ListBoxItem *item = data[master_column].values[i];
                (*result)++;
                if( item->selected ) return (*result);
-               if( item->get_sublist() ) {
+               if( item->sublist_active() ) {
                        if( get_first_selection(item->get_sublist(), result) >= 0 )
                                return (*result);
                }
                        if( get_first_selection(item->get_sublist(), result) >= 0 )
                                return (*result);
                }
@@ -2277,7 +2262,7 @@ int BC_ListBox::get_total_items(ArrayList<BC_ListBoxItem*> *data,
 
        for( int i=0; i<data[master_column].total; ++i ) {
                (*result)++;
 
        for( int i=0; i<data[master_column].total; ++i ) {
                (*result)++;
-               if( data[master_column].values[i]->get_sublist() )
+               if( data[master_column].values[i]->sublist_active() )
                        get_total_items(data[master_column].values[i]->get_sublist(),
                                result,
                                master_column);
                        get_total_items(data[master_column].values[i]->get_sublist(),
                                result,
                                master_column);
@@ -2307,7 +2292,7 @@ int BC_ListBox::get_last_selection(ArrayList<BC_ListBoxItem*> *data,
                                return (*result);
                }
 
                                return (*result);
                }
 
-               if( item->get_sublist() ) {
+               if( item->sublist_active() ) {
                        if( get_last_selection(item->get_sublist(), result) >= 0 ) {
                                if( top_level )
                                        return get_total_items(data, 0, master_column) - (*result) /* - 1 */;
                        if( get_last_selection(item->get_sublist(), result) >= 0 ) {
                                if( top_level )
                                        return get_total_items(data, 0, master_column) - (*result) /* - 1 */;
@@ -2332,7 +2317,7 @@ void BC_ListBox::select_range(ArrayList<BC_ListBoxItem*> *data,
                                data[j].values[i]->selected = 1;
                }
                BC_ListBoxItem *item = data[master_column].values[i];
                                data[j].values[i]->selected = 1;
                }
                BC_ListBoxItem *item = data[master_column].values[i];
-               if( item->get_sublist() )
+               if( item->sublist_active() )
                        select_range(item->get_sublist(), start, end, current);
        }
 }
                        select_range(item->get_sublist(), start, end, current);
        }
 }
@@ -2384,7 +2369,7 @@ int BC_ListBox::toggle_item_selection(ArrayList<BC_ListBoxItem*> *data,
                }
 
 // Descend into sublist
                }
 
 // Descend into sublist
-               if( item->get_sublist() ) {
+               if( item->sublist_active() ) {
                        if( toggle_item_selection(item->get_sublist(),
                              selection_number, counter) )
                                return 1;
                        if( toggle_item_selection(item->get_sublist(),
                              selection_number, counter) )
                                return 1;
@@ -2425,7 +2410,7 @@ void BC_ListBox::set_selected(ArrayList<BC_ListBoxItem*> *data,
                }
 
                BC_ListBoxItem *item = data[master_column].values[i];
                }
 
                BC_ListBoxItem *item = data[master_column].values[i];
-               if( item->get_sublist() ) {
+               if( item->sublist_active() ) {
                        set_selected(item->get_sublist(), item_number, value, counter);
                }
        }
                        set_selected(item->get_sublist(), item_number, value, counter);
                }
        }
@@ -2452,7 +2437,7 @@ int BC_ListBox::update_selection(ArrayList<BC_ListBoxItem*> *data,
                        for( int j=0; j<columns; ++j )
                                data[j].values[i]->selected = 0;
                }
                        for( int j=0; j<columns; ++j )
                                data[j].values[i]->selected = 0;
                }
-               if( item->get_sublist() )
+               if( item->sublist_active() )
                        result |= update_selection(item->get_sublist(),
                                selection_number,
                                counter);
                        result |= update_selection(item->get_sublist(),
                                selection_number,
                                counter);
@@ -2469,7 +2454,7 @@ void BC_ListBox::promote_selections(ArrayList<BC_ListBoxItem*> *data,
                        if( item->selected == old_value ) item->selected = new_value;
                }
                BC_ListBoxItem *item = data[master_column].values[i];
                        if( item->selected == old_value ) item->selected = new_value;
                }
                BC_ListBoxItem *item = data[master_column].values[i];
-               if( item->get_sublist() )
+               if( item->sublist_active() )
                        promote_selections(item->get_sublist(), old_value, new_value);
        }
 }
                        promote_selections(item->get_sublist(), old_value, new_value);
        }
 }
@@ -3200,6 +3185,7 @@ int BC_ListBox::drag_start_event()
 {
        switch( current_operation ) {
        case SELECT:
 {
        switch( current_operation ) {
        case SELECT:
+               if( expander_active() ) break;
                if( gui && gui->is_event_win() && allow_drag ) {
                        BC_ListBoxItem *item_return = 0;
                        selection_number = get_cursor_item(data,
                if( gui && gui->is_event_win() && allow_drag ) {
                        BC_ListBoxItem *item_return = 0;
                        selection_number = get_cursor_item(data,
@@ -3473,6 +3459,14 @@ int BC_ListBox::is_active()
        return active;
 }
 
        return active;
 }
 
+int BC_ListBox::expander_active()
+{
+       for( int i=0; i<expanders.total; ++i ) {
+               if( expanders.values[i]->value ) return 1;
+       }
+       return 0 ;
+}
+
 int BC_ListBox::keypress_event()
 {
        if( !active ) return 0;
 int BC_ListBox::keypress_event()
 {
        if( !active ) return 0;
@@ -3889,7 +3883,7 @@ void BC_ListBox::draw_text_recursive(ArrayList<BC_ListBoxItem*> *data,
                        item->set_in_view(0);
 
 // Descend into sublist
                        item->set_in_view(0);
 
 // Descend into sublist
-               if( first_item->get_expand() ) {
+               if( first_item->sublist_active() ) {
                        draw_text_recursive(first_item->get_sublist(),
                                column,
                                indent + LISTBOX_INDENT,
                        draw_text_recursive(first_item->get_sublist(),
                                column,
                                indent + LISTBOX_INDENT,