X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbcmenubar.C;fp=cinelerra-5.1%2Fguicast%2Fbcmenubar.C;h=ac4dbdc64e0d437d98b2412de21831b7a9706afb;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hp=0000000000000000000000000000000000000000;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/bcmenubar.C b/cinelerra-5.1/guicast/bcmenubar.C new file mode 100644 index 00000000..ac4dbdc6 --- /dev/null +++ b/cinelerra-5.1/guicast/bcmenubar.C @@ -0,0 +1,303 @@ + +/* + * CINELERRA + * Copyright (C) 2008-2015 Adam Williams + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "bcmenu.h" +#include "bcmenubar.h" +#include "bcmenupopup.h" +#include "bcpixmap.h" +#include "bcpopup.h" +#include "bcpopupmenu.h" +#include "bcresources.h" +#include "bcsignals.h" +#include "colors.h" +#include "fonts.h" +#include "keys.h" +#include +#include +#include "vframe.h" + + +// ================================== Menu bar ================================== + +BC_MenuBar::BC_MenuBar(int x, int y, int w) + : BC_SubWindow(x, y, w, 0, -1) +{ +// Height is really determined by the font in create_tool_objects. + button_releases = 0; + active = 0; + menu_bar_bg = 0; + for(int i = 0; i < 3; i++) + menu_title_bg[i] = 0; +} + + +BC_MenuBar::~BC_MenuBar() +{ +// Delete all titles. + for(int i = 0; i < menu_titles.total; i++) delete menu_titles.values[i]; + menu_titles.remove_all(); + delete menu_bar_bg; + for(int i = 0; i < 3; i++) + delete menu_title_bg[i]; +} + +int BC_MenuBar::initialize() +{ + BC_Resources *resources = get_resources(); +// Initialize dimensions + h = calculate_height(this); + bg_color = resources->menu_up; + + if(resources->menu_bar_bg) menu_bar_bg = new BC_Pixmap(this, + resources->menu_bar_bg); + + if(resources->menu_title_bg) + { + for(int i = 0; i < 3; i++) + menu_title_bg[i] = new BC_Pixmap(this, + resources->menu_title_bg[i]); + } + +// Create the subwindow + BC_SubWindow::initialize(); + + if(resources->menu_bg) + set_background(resources->menu_bg); + draw_face(0, 0); + show_window(0); + return 0; +} + +int BC_MenuBar::calculate_height(BC_WindowBase *window) +{ + if(get_resources()->menu_bar_bg) + return get_resources()->menu_bar_bg->get_h(); + else + return window->get_text_height(MEDIUMFONT) + 8; +} + +void BC_MenuBar::draw_items() +{ + for(int i = 0; i < menu_titles.total; i++) + menu_titles.values[i]->draw_items(); + flush(); +} + +int BC_MenuBar::add_menu(BC_Menu* menu) +{ + int x, w; + +// Get dimensions + if(menu_titles.total == 0) + x = 2; + else + x = menu_titles.values[menu_titles.total - 1]->x + + menu_titles.values[menu_titles.total - 1]->w; + + w = get_text_width(MEDIUMFONT, menu->text) + 20; +// get pointer + menu_titles.append(menu); +// initialize and draw + menu->initialize(top_level, this, x, 2, w, get_h() - 4); + return 0; +} + +int BC_MenuBar::focus_out_event() +{ + for(int i = 0; i < menu_titles.total; i++) { + if( menu_titles.values[i]->active ) + return 0; + } + deactivate(); + return 0; +} + +int BC_MenuBar::button_press_event() +{ + int result = 0; + + for(int i = 0; i < menu_titles.total && !result; i++) + { + result = menu_titles.values[i]->dispatch_button_press(); + } + + return result; +} + +int BC_MenuBar::button_release_event() +{ + int result = 0; + + button_down = 0; + button_releases++; + for(int i = 0; i < menu_titles.total; i++) + { + result += menu_titles.values[i]->dispatch_button_release(); + } + +// Button was released outside any menu. + if(!result) + { + deactivate(); + } +//printf("BC_MenuBar::button_release_event %d\n", result); + + return result; +} + +int BC_MenuBar::resize_event(int w, int h) +{ + resize_window(w, get_h()); + draw_face(0, 0); + for(int i = 0; i < menu_titles.total; i++) + { + menu_titles.values[i]->draw_title(0, 0); + } + flash(0); + return 0; +} + +int BC_MenuBar::keypress_event() +{ + int result = 0; + switch( get_keypress() ) { + case ESC: + deactivate(); + return 1; + } + if(!top_level->active_subwindow || !top_level->active_subwindow->uses_text()) + { + for(int i = 0; i < menu_titles.total && !result; i++) + { + result = menu_titles.values[i]->dispatch_keypress(); + } + } + return result; +} + +int BC_MenuBar::cursor_motion_event() +{ + int result = 0; + for(int i = 0; i < menu_titles.total && !result; i++) + { + result = menu_titles.values[i]->dispatch_motion_event(); + } + return result; +} + +int BC_MenuBar::cursor_leave_event() +{ + for(int i = 0; i < menu_titles.total; i++) + { + menu_titles.values[i]->dispatch_cursor_leave(); + } + return 0; +} + +int BC_MenuBar::cursor_enter_event() +{ + if(active) return 1; + return 0; +} + +int BC_MenuBar::translation_event() +{ + if(active) + { + for(int i = 0; i < menu_titles.total; i++) + { + menu_titles.values[i]->dispatch_translation_event(); + } + } + return 0; +} + +int BC_MenuBar::activate() +{ + top_level->deactivate(); + top_level->active_menubar = this; + active = 1; + return 0; +} + +int BC_MenuBar::deactivate() +{ + for(int i = 0; i < menu_titles.total; i++) + { + menu_titles.values[i]->deactivate_menu(); + } + top_level->active_menubar = 0; + active = 0; + return 0; +} + +int BC_MenuBar::unhighlight() +{ + for(int i = 0; i < menu_titles.total; i++) + { + menu_titles.values[i]->unhighlight(); + } + return 0; +} + +int BC_MenuBar::draw_face(int flash, int flush) +{ + if(menu_bar_bg) + { + draw_3segmenth(0, + 0, + get_w(), + menu_bar_bg); +// 9 segment doesn't draw properly +// draw_9segment(0, 0, get_w(), get_h(), menu_bar_bg); + } + else + { + int lx,ly,ux,uy; + int h, w; + h = get_h(); + w = get_w(); + h--; + w--; + + lx = 1; ly = 1; + ux = w - 1; uy = h - 1; + + set_color(top_level->get_resources()->menu_light); + draw_line(0, 0, 0, uy); + draw_line(0, 0, ux, 0); + + set_color(top_level->get_resources()->menu_shadow); + draw_line(ux, ly, ux, uy); + draw_line(lx, uy, ux, uy); + set_color(BLACK); + draw_line(w, 0, w, h); + draw_line(0, h, w, h); + } + + if(flash) this->flash(flush); + return 0; +} + + + + +