rework resource wdw preview mode
[goodguy/cinelerra.git] / cinelerra-5.1 / guicast / bcpopupmenu.C
index 2fb69d1cb2ecd8010a8b634a07691e8f6d0409d5..13cc6816c3824bef2f8dc643133298db4ff08cd2 100644 (file)
 #define TRIANGLE_H 10
 
 
-BC_PopupMenu::BC_PopupMenu(int x,
-               int y,
-               int w,
-               const char *text,
-               int use_title,
-               VFrame **data,
-               int margin)
+BC_PopupMenu::BC_PopupMenu(int x, int y, int w, const char *text,
+               int use_title, VFrame **data, int margin)
  : BC_SubWindow(x, y, 0, 0, -1)
 {
        highlighted = popup_down = 0;
@@ -57,21 +52,15 @@ BC_PopupMenu::BC_PopupMenu(int x,
                BC_WindowBase::get_resources()->popupmenu_margin;
        this->use_title = use_title;
        strcpy(this->text, text);
-       for(int i = 0; i < TOTAL_IMAGES; i++)
-       {
-               images[i] = 0;
-       }
+       for( int i=0; i<TOTAL_IMAGES; ++i ) images[i] = 0;
        this->data = data;
        this->w_argument = w;
        status = BUTTON_UP;
        pending = 0;
 }
 
-BC_PopupMenu::BC_PopupMenu(int x,
-               int y,
-               const char *text,
-               int use_title,
-               VFrame **data)
+BC_PopupMenu::BC_PopupMenu(int x, int y, const char *text,
+               int use_title, VFrame **data)
  : BC_SubWindow(x, y, 0, -1, -1)
 {
        highlighted = popup_down = 0;
@@ -80,10 +69,7 @@ BC_PopupMenu::BC_PopupMenu(int x,
        this->margin = BC_WindowBase::get_resources()->popupmenu_margin;
        this->use_title = use_title;
        strcpy(this->text, text);
-       for(int i = 0; i < TOTAL_IMAGES; i++)
-       {
-               images[i] = 0;
-       }
+       for( int i=0; i<TOTAL_IMAGES; ++i ) images[i] = 0;
        this->data = data;
        this->w_argument = -1;
        status = BUTTON_UP;
@@ -95,10 +81,7 @@ BC_PopupMenu::~BC_PopupMenu()
        use_title = 0;
        deactivate();
        delete menu_popup;
-       for(int i = 0; i < TOTAL_IMAGES; i++)
-       {
-               if(images[i]) delete images[i];
-       }
+       for( int i=0; i<TOTAL_IMAGES; ++i ) delete images[i];
 }
 
 char* BC_PopupMenu::get_text()
@@ -108,8 +91,7 @@ char* BC_PopupMenu::get_text()
 
 void BC_PopupMenu::set_text(const char *text)
 {
-       if(use_title)
-       {
+       if( use_title ) {
                strcpy(this->text, text);
                draw_title(1);
        }
@@ -117,87 +99,70 @@ void BC_PopupMenu::set_text(const char *text)
 
 void BC_PopupMenu::set_icon(BC_Pixmap *icon)
 {
-       if(use_title)
-       {
+       if( use_title ) {
                this->icon = icon;
-               if(menu_popup) draw_title(1);
+               if( menu_popup ) draw_title(1);
        }
 }
 
 int BC_PopupMenu::initialize()
 {
-       if(use_title)
-       {
-               if(data)
+       if( use_title ) {
+               if( data )
                        set_images(data);
                else
-               if(BC_WindowBase::get_resources()->popupmenu_images)
+               if( BC_WindowBase::get_resources()->popupmenu_images )
                        set_images(BC_WindowBase::get_resources()->popupmenu_images);
                else
                        set_images(BC_WindowBase::get_resources()->generic_button_images);
        }
-       else
+       else {
 // Move outside window if no title
-       {
-               x = -10;
-               y = -10;
-               w = 10;
-               h = 10;
+               x = -10;  y = -10;
+               w = 10;   h = 10;
        }
 
        BC_SubWindow::initialize();
 
        menu_popup = new BC_MenuPopup;
-       menu_popup->initialize(top_level,
-               0,
-               0,
-               0,
-               this);
+       menu_popup->initialize(top_level, 0, 0, 0, this);
 
-       if(use_title) draw_title(0);
+       if( use_title ) draw_title(0);
 
        return 0;
 }
 
 int BC_PopupMenu::set_images(VFrame **data)
 {
-       BC_Resources *resources = get_resources();
-       for(int i = 0; i < 3; i++)
-       {
-               if(images[i]) delete images[i];
+       for( int i=0; i<3; ++i ) {
+               delete images[i];
                images[i] = new BC_Pixmap(parent_window, data[i], PIXMAP_ALPHA);
        }
 
-       if(w_argument >= 0)
-               w = w_argument +
-                       margin +
-                       resources->popupmenu_triangle_margin;
-       else
-               w = get_text_width(MEDIUMFONT, text) +
-                       margin +
-                       resources->popupmenu_triangle_margin;
-
+       w = w_argument > 0 ? w_argument :
+               calculate_w(margin, get_text_width(MEDIUMFONT, text), use_title);
        h = images[BUTTON_UP]->get_h();
        return 0;
 }
 
-int BC_PopupMenu::calculate_w(int w_argument)
+int BC_PopupMenu::calculate_w(int margin, int text_width, int use_title)
 {
-       return w_argument +
-               BC_WindowBase::get_resources()->popupmenu_margin +
-               BC_WindowBase::get_resources()->popupmenu_triangle_margin;
+       BC_Resources *resources = get_resources();
+       int l = margin >= 0 ? margin : resources->popupmenu_margin;
+       int r = use_title < 0 ? l : resources->popupmenu_triangle_margin;
+       return l + text_width + r;
 }
 
-int BC_PopupMenu::calculate_h(VFrame **data)
+int BC_PopupMenu::calculate_w(int text_width)
 {
-       if(data)
-               ;
-       else
-       if(BC_WindowBase::get_resources()->popupmenu_images)
-               data = BC_WindowBase::get_resources()->popupmenu_images;
-       else
-               data = BC_WindowBase::get_resources()->generic_button_images;
+       return calculate_w(-1, text_width, 0);
+}
 
+int BC_PopupMenu::calculate_h(VFrame **data)
+{
+       if( !data ) data = BC_WindowBase::get_resources()->popupmenu_images ?
+               BC_WindowBase::get_resources()->popupmenu_images :
+               BC_WindowBase::get_resources()->generic_button_images ;
 
        return data[BUTTON_UP]->get_h();
 }
@@ -230,57 +195,63 @@ BC_MenuItem* BC_PopupMenu::get_item(int i)
        return menu_popup->menu_items.values[i];
 }
 
-int BC_PopupMenu::draw_title(int flush)
+int BC_PopupMenu::get_margin()
 {
-       if(!use_title) return 0;
-       BC_Resources *resources = get_resources();
+       return margin;
+}
+
+int BC_PopupMenu::draw_face(int dx, int color)
+{
+       if( !use_title ) return 0;
 
 // Background
        draw_top_background(parent_window, 0, 0, w, h);
        draw_3segmenth(0, 0, w, images[status]);
 
 // Overlay text
-       set_color(get_resources()->popup_title_text);
-       int offset = 0;
-       if(status == BUTTON_DN)
-               offset = 1;
-       if(!icon)
-       {
-               set_font(MEDIUMFONT);
+       if( color < 0 ) color = get_resources()->popup_title_text;
+       set_color(color);
+
+       int offset = status == BUTTON_DN ? 1 : 0;
+       int available_w = get_w() - calculate_w(margin, 0, use_title);
+
+       if( !icon ) {
                char truncated[BCTEXTLEN];
-               int available_w = get_w() - margin * 2 - resources->popupmenu_triangle_margin;
                truncate_text(truncated, text, available_w);
-
+               set_font(MEDIUMFONT);
                BC_WindowBase::draw_center_text(
-                       available_w / 2 + margin + offset,
-                       (int)((float)get_h() / 2 + get_text_ascent(MEDIUMFONT) / 2 - 2) + offset,
+                       dx + available_w/2 + margin + offset,
+                       (int)((float)get_h()/2 + get_text_ascent(MEDIUMFONT)/2 - 2) + offset,
                        truncated);
        }
 
-       if(icon)
-       {
+       if( icon ) {
                draw_pixmap(icon,
-                       (get_w() - margin * 2 - resources->popupmenu_triangle_margin) / 2 + margin + offset - icon->get_w() / 2 ,
-                       get_h() / 2 - icon->get_h() / 2 + offset);
+                       available_w/ 2 + margin + offset - icon->get_w()/2 ,
+                       get_h()/2 - icon->get_h()/2 + offset);
        }
 
        if( use_title >= 0 )
-               draw_triangle_down_flat(get_w() - margin - resources->popupmenu_triangle_margin,
-                       get_h() / 2 - TRIANGLE_H / 2, TRIANGLE_W, TRIANGLE_H);
+               draw_triangle_down_flat(available_w + margin,
+                       get_h()/2 - TRIANGLE_H/2, TRIANGLE_W, TRIANGLE_H);
+       return 1;
+}
 
+int BC_PopupMenu::draw_title(int flush)
+{
+       draw_face(0, -1);
        flash(flush);
        return 0;
 }
 
 int BC_PopupMenu::deactivate()
 {
-       if(popup_down)
-       {
+       if( popup_down ) {
                top_level->active_popup_menu = 0;
                popup_down = 0;
                menu_popup->deactivate_menu();
 
-               if(use_title) draw_title(1);    // draw the title
+               if( use_title ) draw_title(1);    // draw the title
        }
        return 0;
 }
@@ -297,23 +268,20 @@ int BC_PopupMenu::activate_menu()
 int BC_PopupMenu::menu_activate()
 {
        pending = 0;
-       if( !popup_down )
-       {
+       if( !popup_down ) {
                int x = this->x;
                int y = this->y;
 
                top_level->deactivate();
                top_level->active_popup_menu = this;
-               if(!use_title)
-               {
+               if( !use_title ) {
                        x = top_level->get_abs_cursor_x(0) - get_w();
                        y = top_level->get_abs_cursor_y(0) - get_h();
                        button_press_x = top_level->cursor_x;
                        button_press_y = top_level->cursor_y;
                }
 
-               if(use_title)
-               {
+               if( use_title ) {
                        Window tempwin;
                        int new_x, new_y;
                        XTranslateCoordinates(top_level->display,
@@ -325,7 +293,7 @@ int BC_PopupMenu::menu_activate()
                else
                        menu_popup->activate_menu(x+3, y+3, w, h, 0, 1);
                popup_down = 1;
-               if(use_title) draw_title(1);
+               if( use_title ) draw_title(1);
        }
        return 1;
 }
@@ -357,8 +325,7 @@ int BC_PopupMenu::repeat_event(int64_t duration)
 {
        if( status == BUTTON_HI &&
                tooltip_text && tooltip_text[0] != 0 &&
-               duration == top_level->get_resources()->tooltip_delay )
-       {
+               duration == top_level->get_resources()->tooltip_delay ) {
                show_tooltip();
                return 1;
        }
@@ -368,37 +335,35 @@ int BC_PopupMenu::repeat_event(int64_t duration)
 int BC_PopupMenu::button_press_event()
 {
        int result = 0;
-       if(get_buttonpress() == 1 &&
+       if( get_buttonpress() == 1 &&
                is_event_win() &&
-               use_title)
-       {
+               use_title ) {
                top_level->hide_tooltip();
-               if(status == BUTTON_HI || status == BUTTON_UP) status = BUTTON_DN;
+               if( status == BUTTON_HI || status == BUTTON_UP ) status = BUTTON_DN;
                activate_menu();
                draw_title(1);
                return 1;
        }
 
        // Scrolling section
-       if (is_event_win()
+       ifis_event_win()
                && (get_buttonpress() == 4 || get_buttonpress() == 5)
-               && menu_popup->total_items() > 1 )
-       {
+               && menu_popup->total_items() > 1  ) {
                int theval = -1;
-               for (int i = 0; i < menu_popup->total_items(); i++) {
-                       if (!strcmp(menu_popup->menu_items.values[i]->get_text(),get_text())) {
-                               theval=i;
+               for( int i=0; i<menu_popup->total_items(); ++i ) {
+                       if( !strcmp(menu_popup->menu_items.values[i]->get_text(),get_text()) ) {
+                               theval = i;
                                break;
                        }
                }
 
-               if (theval == -1)                  theval=0;
-               else if (get_buttonpress() == 4)   theval--;
-               else if (get_buttonpress() == 5)   theval++;
+               if( theval == -1 ) theval = 0;
+               else if( get_buttonpress() == 4 ) --theval;
+               else if( get_buttonpress() == 5 ) ++theval;
 
-               if (theval < 0)
-                       theval=0;
-               if (theval >= menu_popup->total_items())
+               if( theval < 0 )
+                       theval = 0;
+               else if( theval >= menu_popup->total_items() )
                        theval = menu_popup->total_items() - 1;
 
                BC_MenuItem *tmp = menu_popup->menu_items.values[theval];
@@ -407,8 +372,7 @@ int BC_PopupMenu::button_press_event()
                if( !result )
                        result = this->handle_event();
        }
-       if(popup_down)
-       {
+       if( popup_down ) {
 // Menu is down so dispatch to popup.
                menu_popup->dispatch_button_press();
                result = 1;
@@ -422,11 +386,9 @@ int BC_PopupMenu::button_release_event()
 // try the title
        int result = 0;
 
-       if(is_event_win() && use_title)
-       {
+       if( is_event_win() && use_title ) {
                hide_tooltip();
-               if(status == BUTTON_DN)
-               {
+               if( status == BUTTON_DN ) {
                        status = BUTTON_HI;
                        draw_title(1);
                }
@@ -455,15 +417,14 @@ int BC_PopupMenu::button_release_event()
 int BC_PopupMenu::translation_event()
 {
 //printf("BC_PopupMenu::translation_event 1\n");
-       if(popup_down) menu_popup->dispatch_translation_event();
+       if( popup_down ) menu_popup->dispatch_translation_event();
        return 0;
 }
 
 int BC_PopupMenu::cursor_leave_event()
 {
 
-       if(status == BUTTON_HI && use_title)
-       {
+       if( status == BUTTON_HI && use_title ) {
                status = BUTTON_UP;
                draw_title(1);
                hide_tooltip();
@@ -484,14 +445,12 @@ int BC_PopupMenu::cursor_leave_event()
 
 int BC_PopupMenu::cursor_enter_event()
 {
-       if(is_event_win() && use_title)
-       {
-               if(top_level->button_down)
-               {
+       if( is_event_win() && use_title ) {
+               if( top_level->button_down ) {
                        status = BUTTON_DN;
                }
                else
-               if(status == BUTTON_UP)
+               if( status == BUTTON_UP )
                        status = BUTTON_HI;
                draw_title(1);
        }
@@ -504,19 +463,19 @@ int BC_PopupMenu::cursor_motion_event()
        int result = 0;
 
 // This menu is down.
-       if(popup_down) {
+       if( popup_down ) {
                result = menu_popup->dispatch_motion_event();
        }
 
-       if(!result && use_title && is_event_win()) {
-               if(highlighted) {
-                       if(!cursor_inside()) {
+       if( !result && use_title && is_event_win() ) {
+               if( highlighted ) {
+                       if( !cursor_inside() ) {
                                highlighted = 0;
                                draw_title(1);
                        }
                }
                else {
-                       if(cursor_inside()) {
+                       if( cursor_inside() ) {
                                highlighted = 1;
                                draw_title(1);
                                result = 1;
@@ -530,25 +489,19 @@ int BC_PopupMenu::cursor_motion_event()
 int BC_PopupMenu::drag_start_event()
 {
 //printf("BC_PopupMenu::drag_start_event %d\n", popup_down);
-       if(popup_down) return 1;
+       if( popup_down ) return 1;
        return 0;
 }
 
 int BC_PopupMenu::drag_stop_event()
 {
-       if(popup_down) return 1;
+       if( popup_down ) return 1;
        return 0;
 }
 
 int BC_PopupMenu::drag_motion_event()
 {
-       if(popup_down) return 1;
+       if( popup_down ) return 1;
        return 0;
 }
 
-
-
-
-
-
-