X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbcpopupmenu.C;h=5a792af0aaa8803791d81548be33722f06820b69;hp=7ef71aec6d419ff487ace3979b0e4d7857e2fd84;hb=e8453fdab4d5ed7b384279a5b37c92010ac13295;hpb=a64e7d16c44bba0d137936227fc55871bb26c903 diff --git a/cinelerra-5.1/guicast/bcpopupmenu.C b/cinelerra-5.1/guicast/bcpopupmenu.C index 7ef71aec..5a792af0 100644 --- a/cinelerra-5.1/guicast/bcpopupmenu.C +++ b/cinelerra-5.1/guicast/bcpopupmenu.C @@ -41,13 +41,8 @@ #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; idata = 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; idata = 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; itext, text); - draw_title(1, color); + draw_title(1); } } 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,58 +195,61 @@ BC_MenuItem* BC_PopupMenu::get_item(int i) return menu_popup->menu_items.values[i]; } -int BC_PopupMenu::draw_title(int flush, int color) +int BC_PopupMenu::get_margin() { - if(!use_title) return 0; - BC_Resources *resources = get_resources(); + return margin; +} + +int BC_PopupMenu::draw_face(int dx) +{ + if( !use_title ) return 0; // Background draw_top_background(parent_window, 0, 0, w, h); draw_3segmenth(0, 0, w, images[status]); // Overlay text - if( color < 0 ) color = get_resources()->popup_title_text; - set_color(color); - int offset = 0; - if(status == BUTTON_DN) - offset = 1; - if(!icon) - { - set_font(MEDIUMFONT); + set_color(get_resources()->popup_title_text); + 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); 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; } @@ -298,23 +266,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, @@ -326,7 +291,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; } @@ -358,8 +323,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; } @@ -369,37 +333,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() + if( is_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; itotal_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]; @@ -408,8 +370,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; @@ -423,11 +384,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); } @@ -456,15 +415,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(); @@ -485,14 +443,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); } @@ -505,19 +461,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; @@ -531,25 +487,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; } - - - - - -