#include "bdcreate.h"
#include "cache.h"
#include "channelinfo.h"
+#include "convert.h"
#include "cplayback.h"
#include "cropvideo.h"
#include "cwindow.h"
#include "dvdcreate.h"
#include "edl.h"
#include "edlsession.h"
+#include "exportedl.h"
#include "file.h"
#include "filesystem.h"
#include "filexml.h"
#include "transportque.h"
#include "viewmenu.h"
#include "zoombar.h"
-#include "exportedl.h"
+#include "zwindow.h"
+#include "zwindowgui.h"
#include <string.h>
{
this->gui = gui;
this->mwindow = mwindow;
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Program Window");
}
MainMenu::~MainMenu()
{
BC_Menu *viewmenu, *windowmenu, *settingsmenu, *trackmenu;
PreferencesMenuitem *preferences;
- total_loads = 0;
add_menu(filemenu = new BC_Menu(_("File")));
filemenu->add_item(new_project = new NewProject(mwindow));
// file loaders
filemenu->add_item(load_file = new Load(mwindow, this));
load_file->create_objects();
+ filemenu->add_item(load_recent = new LoadRecent(mwindow, this));
+ load_recent->create_objects();
// new and load can be undone so no need to prompt save
Save *save; // affected by saveas
filemenu->add_item(saveas = new SaveAs(mwindow));
save->create_objects(saveas);
saveas->set_mainmenu(this);
- SaveProject *save_project;
- filemenu->add_item(save_project = new SaveProject(mwindow));
+ filemenu->add_item(new SaveProject(mwindow));
+ filemenu->add_item(new SaveSession(mwindow));
filemenu->add_item(record_menu_item = new RecordMenuItem(mwindow));
#ifdef HAVE_DVB
keyframemenu->add_item(new CopyKeyframes(mwindow));
keyframemenu->add_item(new PasteKeyframes(mwindow));
keyframemenu->add_item(new ClearKeyframes(mwindow));
- keyframemenu->add_item(new StraightenKeyframes(mwindow));
- keyframemenu->add_item(new BendKeyframes(mwindow));
+ keyframemenu->add_item(set_auto_curves = new SetAutomationCurveMode(mwindow));
+ set_auto_curves->create_objects();
keyframemenu->add_item(keyframe_curve_type = new KeyframeCurveType(mwindow));
keyframe_curve_type->create_objects();
keyframe_curve_type->update(mwindow->edl->local_session->floatauto_type);
+ keyframemenu->add_item(keyframe_create = new KeyframeCreate(mwindow));
+ keyframe_create->create_objects();
keyframemenu->add_item(new BC_MenuItem("-"));
keyframemenu->add_item(new CopyDefaultKeyframe(mwindow));
keyframemenu->add_item(new PasteDefaultKeyframe(mwindow));
add_menu(trackmenu = new BC_Menu(_("Tracks")));
trackmenu->add_item(new MoveTracksUp(mwindow));
trackmenu->add_item(new MoveTracksDown(mwindow));
+ trackmenu->add_item(new RollTracksUp(mwindow));
+ trackmenu->add_item(new RollTracksDown(mwindow));
trackmenu->add_item(new DeleteTracks(mwindow));
trackmenu->add_item(new DeleteFirstTrack(mwindow));
trackmenu->add_item(new DeleteLastTrack(mwindow));
trackmenu->add_item(new ConcatenateTracks(mwindow));
+ trackmenu->add_item(new AlignTimecodes(mwindow));
AppendTracks *append_tracks;
trackmenu->add_item(append_tracks = new AppendTracks(mwindow));
append_tracks->create_objects();
settingsmenu->add_item(new SetFormat(mwindow));
settingsmenu->add_item(preferences = new PreferencesMenuitem(mwindow));
- ProxyMenuItem *proxy;
settingsmenu->add_item(proxy = new ProxyMenuItem(mwindow));
proxy->create_objects();
+ ConvertMenuItem *convert;
+ settingsmenu->add_item(convert = new ConvertMenuItem(mwindow));
+ convert->create_objects();
mwindow->preferences_thread = preferences->thread;
settingsmenu->add_item(cursor_on_frames = new CursorOnFrames(mwindow));
settingsmenu->add_item(labels_follow_edits = new LabelsFollowEdits(mwindow));
void MainMenu::init_loads(BC_Hash *defaults)
{
- total_loads = defaults->get((char*)"TOTAL_LOADS", 0);
- if( !total_loads ) return;
- filemenu->add_item(new BC_MenuItem("-"));
+// total_loads for legacy xml
+ int total_loads = defaults->get((char*)"TOTAL_LOADS", 0);
+ int loads_total = defaults->get((char*)"LOADS_TOTAL", 0);
+ if( loads_total < total_loads ) loads_total = total_loads;
- char string[BCTEXTLEN], path[BCTEXTLEN], filename[BCTEXTLEN];
+ char string[BCTEXTLEN], path[BCTEXTLEN];
FileSystem dir;
//printf("MainMenu::init_loads 2\n");
- for(int i = 0; i < total_loads; i++) {
+ for( int i=0; i<loads_total; ++i ) {
sprintf(string, "LOADPREVIOUS%d", i);
//printf("MainMenu::init_loads 3\n");
defaults->get(string, path);
- filemenu->add_item(load[i] = new LoadPrevious(mwindow, load_file));
- dir.extract_name(filename, path, 0);
- load[i]->set_text(filename);
- load[i]->set_path(path);
+ if( load.size() < TOTAL_LOADS )
+ load.append(new LoadRecentItem(path));
}
}
int MainMenu::save_loads(BC_Hash *defaults)
{
+// legacy to prevent segv, older code cant tolerate total_loads>10
+ int loads_total = load.size();
+ int total_loads = MIN(10, loads_total);
+ defaults->update((char*)"LOADS_TOTAL", loads_total);
defaults->update((char*)"TOTAL_LOADS", total_loads);
char string[BCTEXTLEN];
- for(int i = 0; i < total_loads; i++)
- {
+ for( int i=0; i<loads_total; ++i ) {
sprintf(string, "LOADPREVIOUS%d", i);
defaults->update(string, load[i]->path);
}
int MainMenu::add_load(char *path)
{
- if(total_loads == 0)
-{
- filemenu->add_item(new BC_MenuItem("-"));
- }
-
-// test for existing copy
- FileSystem fs;
- char text[BCTEXTLEN], new_path[BCTEXTLEN]; // get text and path
- fs.extract_name(text, path);
- strcpy(new_path, path);
-
- for(int i = 0; i < total_loads; i++)
- {
- if(!strcmp(load[i]->get_text(), text)) // already exists
- { // swap for top load
- for(int j = i; j > 0; j--) // move preceeding loads down
- {
- load[j]->set_text(load[j - 1]->get_text());
- load[j]->set_path(load[j - 1]->path);
- }
- load[0]->set_text(text);
- load[0]->set_path(new_path);
-
- return 1;
- }
- }
-
-// add another load
- if(total_loads < TOTAL_LOADS)
- {
- filemenu->add_item(load[total_loads] = new LoadPrevious(mwindow, load_file));
- total_loads++;
- }
-
-// cycle loads down
- for(int i = total_loads - 1; i > 0; i--)
- {
- // set menu item text
- load[i]->set_text(load[i - 1]->get_text());
- // set filename
- load[i]->set_path(load[i - 1]->path);
- }
-
-// set up the new load
- load[0]->set_text(text);
- load[0]->set_path(new_path);
- return 0;
+ return load.add_load(path);
}
-
-
-
-
-
// ================================== menu items
MainDumpsSubMenu::MainDumpsSubMenu(BC_MenuItem *menu_item)
// ================================================= edit
-Undo::Undo(MWindow *mwindow) : BC_MenuItem(_("Undo"), "z", 'z')
+Undo::Undo(MWindow *mwindow) : BC_MenuItem(_("Undo"), "z or Ctrl-z", 'z')
{
this->mwindow = mwindow;
}
}
-
-StraightenKeyframes::StraightenKeyframes(MWindow *mwindow)
- : BC_MenuItem(_("Change to linear"))
+SetAutomationCurveItem::SetAutomationCurveItem(SetAutomationCurveMode *set_curve_mode, int id)
+ : BC_MenuItem(FloatAuto::curve_name(id))
{
- this->mwindow = mwindow;
+ this->set_curve_mode = set_curve_mode;
+ this->id = id;
}
-int StraightenKeyframes::handle_event()
+int SetAutomationCurveItem::handle_event()
{
- mwindow->set_automation_mode(FloatAuto::LINEAR);
+ set_curve_mode->mwindow->set_automation_mode((FloatAuto::t_mode)id);
return 1;
}
+SetAutoCurveModeMenu::SetAutoCurveModeMenu(SetAutomationCurveMode *curve_mode)
+: BC_SubMenu()
+{
+ this->curve_mode = curve_mode;
+}
-
-
-BendKeyframes::BendKeyframes(MWindow *mwindow)
- : BC_MenuItem(_("Change to smooth"))
+SetAutomationCurveMode::SetAutomationCurveMode(MWindow *mwindow)
+ : BC_MenuItem(_("Set curve modes..."))
{
this->mwindow = mwindow;
+ curve_mode_menu = 0;
}
-int BendKeyframes::handle_event()
+void SetAutomationCurveMode::create_objects()
{
- mwindow->set_automation_mode(FloatAuto::SMOOTH);
- return 1;
+ add_submenu(curve_mode_menu = new SetAutoCurveModeMenu(this));
+ for( int id=FloatAuto::SMOOTH; id<=FloatAuto::BUMP; ++id )
+ curve_mode_menu->add_item(new SetAutomationCurveItem(this, id));
}
-
KeyframeCurveType::KeyframeCurveType(MWindow *mwindow)
: BC_MenuItem(_("Create curve type..."))
{
void KeyframeCurveType::create_objects()
{
add_submenu(curve_menu = new KeyframeCurveTypeMenu(this));
- for( int i=FloatAuto::SMOOTH; i<=FloatAuto::FREE; ++i ) {
+ for( int i=FloatAuto::SMOOTH; i<=FloatAuto::BUMP; ++i ) {
KeyframeCurveTypeItem *curve_type_item = new KeyframeCurveTypeItem(i, this);
curve_menu->add_submenuitem(curve_type_item);
}
}
+KeyframeCreateItem::KeyframeCreateItem(KeyframeCreate *keyframe_create,
+ const char *text, int mask)
+ : BC_MenuItem(text)
+{
+ this->keyframe_create = keyframe_create;
+ this->mask = mask;
+}
+
+int KeyframeCreateItem::handle_event()
+{
+ MWindow *mwindow = keyframe_create->mwindow;
+ int mode = mwindow->edl->local_session->floatauto_type;
+ int mask = this->mask;
+ if( !mask ) { // visible
+ int *autos = mwindow->edl->session->auto_conf->autos;
+ int modes = (1<<AUTOMATION_FADE) + (1<<AUTOMATION_SPEED) +
+ (7<<AUTOMATION_CAMERA_X) + (7<<AUTOMATION_PROJECTOR_X);
+ for( int i=0; i<AUTOMATION_TOTAL; modes>>=1, ++i ) {
+ if( !(modes & 1) ) continue;
+ if( autos[i] ) mask |= (1<<i);
+ }
+ }
+ mwindow->create_keyframes(mask, mode);
+ return 1;
+}
+
+KeyframeCreateMenu::KeyframeCreateMenu(KeyframeCreate *keyframe_create)
+: BC_SubMenu()
+{
+ this->keyframe_create = keyframe_create;
+}
+
+KeyframeCreate::KeyframeCreate(MWindow *mwindow)
+ : BC_MenuItem(_("Create keyframes..."))
+{
+ this->mwindow = mwindow;
+ keyframe_create_menu = 0;
+}
+
+void KeyframeCreate::create_objects()
+{
+ add_submenu(keyframe_create_menu = new KeyframeCreateMenu(this));
+ keyframe_create_menu->add_item(new KeyframeCreateItem(this, _("Visible"), 0));
+ keyframe_create_menu->add_item(new KeyframeCreateItem(this, _("Fade"),
+ (1<<AUTOMATION_FADE)));
+ keyframe_create_menu->add_item(new KeyframeCreateItem(this, _("Speed"),
+ (1<<AUTOMATION_SPEED)));
+ keyframe_create_menu->add_item(new KeyframeCreateItem(this, _("Camera XYZ"),
+ (7<<AUTOMATION_CAMERA_X)));
+ keyframe_create_menu->add_item(new KeyframeCreateItem(this, _("Projector XYZ"),
+ (7<<AUTOMATION_PROJECTOR_X)));
+ keyframe_create_menu->add_item(new KeyframeCreateItem(this, _("Fade+Speed+XYZ"),
+ (1<<AUTOMATION_FADE) + (1<<AUTOMATION_SPEED) +
+ (7<<AUTOMATION_CAMERA_X) + (7<<AUTOMATION_PROJECTOR_X)));
+}
+
+
CutDefaultKeyframe::CutDefaultKeyframe(MWindow *mwindow)
: BC_MenuItem(_("Cut default keyframe"), _("Alt-x"), 'x')
{
int Clear::handle_event()
{
if( mwindow->session->current_operation == NO_OPERATION ) {
- mwindow->cwindow->gui->lock_window("Clear::handle_event");
mwindow->clear_entry();
- mwindow->cwindow->gui->unlock_window();
}
return 1;
}
int AddVideoTrack::handle_event()
{
if( mwindow->session->current_operation == NO_OPERATION )
- mwindow->add_video_track_entry();
+ mwindow->add_video_track_entry(1, 0);
return 1;
}
}
DeleteLastTrack::DeleteLastTrack(MWindow *mwindow)
- : BC_MenuItem(_("Delete last track"), "d", 'd')
+ : BC_MenuItem(_("Delete last track"), "Ctrl-d", 'd')
{
+ set_ctrl(1);
this->mwindow = mwindow;
}
MoveTracksDown::MoveTracksDown(MWindow *mwindow)
: BC_MenuItem(_("Move tracks down"), _("Shift-Down"), DOWN)
{
- set_shift(); this->mwindow = mwindow;
+ this->mwindow = mwindow;
+ set_shift();
}
int MoveTracksDown::handle_event()
}
+RollTracksUp::RollTracksUp(MWindow *mwindow)
+ : BC_MenuItem(_("Roll tracks up"), _("Ctrl-Shift-Up"), UP)
+{
+ this->mwindow = mwindow;
+ set_ctrl();
+ set_shift();
+}
+
+int RollTracksUp::handle_event()
+{
+ if( mwindow->session->current_operation == NO_OPERATION )
+ mwindow->roll_tracks_up();
+ return 1;
+}
+
+RollTracksDown::RollTracksDown(MWindow *mwindow)
+ : BC_MenuItem(_("Roll tracks down"), _("Ctrl-Shift-Down"), DOWN)
+{
+ this->mwindow = mwindow;
+ set_ctrl();
+ set_shift();
+}
+
+int RollTracksDown::handle_event()
+{
+ if( mwindow->session->current_operation == NO_OPERATION )
+ mwindow->roll_tracks_down();
+ return 1;
+}
+
+
ConcatenateTracks::ConcatenateTracks(MWindow *mwindow)
int AddSubttlTrack::handle_event()
{
if( mwindow->session->current_operation == NO_OPERATION )
- mwindow->add_subttl_track_entry();
+ mwindow->add_subttl_track_entry(1, 0);
return 1;
}
}
SaveSettingsNow::SaveSettingsNow(MWindow *mwindow)
- : BC_MenuItem(_("Save settings now"),_("Ctrl-s"),'s')
+ : BC_MenuItem(_("Save settings now"),_("Ctrl-Shift-S"),'S')
{
this->mwindow = mwindow;
set_ctrl(1);
+ set_shift(1);
}
int SaveSettingsNow::handle_event()
}
int ShowVWindow::handle_event()
{
- mwindow->show_vwindow();
+ if( mwindow->session->current_operation == NO_OPERATION ) {
+ mwindow->gui->unlock_window();
+ if( !mwindow->session->show_vwindow )
+ mwindow->show_vwindow(1);
+ else
+ mwindow->hide_vwindow(1);
+ mwindow->gui->lock_window("ShowVWindow::handle_event");
+ set_checked(mwindow->session->show_vwindow);
+ }
return 1;
}
}
int ShowAWindow::handle_event()
{
- mwindow->show_awindow();
+ if( mwindow->session->current_operation == NO_OPERATION ) {
+ mwindow->gui->unlock_window();
+ if( !mwindow->session->show_awindow )
+ mwindow->show_awindow();
+ else
+ mwindow->hide_awindow();
+ mwindow->gui->lock_window("ShowAWindow::handle_event");
+ set_checked(mwindow->session->show_awindow);
+
+ }
return 1;
}
}
int ShowCWindow::handle_event()
{
- mwindow->show_cwindow();
+ if( mwindow->session->current_operation == NO_OPERATION ) {
+ mwindow->gui->unlock_window();
+ if( !mwindow->session->show_cwindow )
+ mwindow->show_cwindow();
+ else
+ mwindow->hide_cwindow();
+ mwindow->gui->lock_window("ShowCWindow::handle_event");
+ set_checked(mwindow->session->show_cwindow);
+ }
return 1;
}
int ShowGWindow::handle_event()
{
if( mwindow->session->current_operation == NO_OPERATION ) {
+ mwindow->gui->unlock_window();
if( !mwindow->session->show_gwindow )
mwindow->show_gwindow();
else
mwindow->hide_gwindow();
+ mwindow->gui->lock_window("ShowGWindow::handle_event");
set_checked(mwindow->session->show_gwindow);
}
return 1;
}
int ShowLWindow::handle_event()
{
- mwindow->show_lwindow();
+ if( mwindow->session->current_operation == NO_OPERATION ) {
+
+ mwindow->gui->unlock_window();
+ if( !mwindow->session->show_lwindow )
+ mwindow->show_lwindow();
+ else
+ mwindow->hide_lwindow();
+ mwindow->gui->lock_window("ShowLWindow::handle_event");
+ set_checked(mwindow->session->show_lwindow);
+ }
return 1;
}
{
BC_SubMenu *mixer_submenu = new BC_SubMenu();
add_submenu(mixer_submenu);
- mixer_submenu->add_submenuitem(new MixerViewer(mwindow));
- mixer_submenu->add_submenuitem(new TileMixers(mwindow));
- mixer_submenu->add_submenuitem(new AlignMixers(mwindow));
+ mixer_submenu->add_submenuitem(new MixerViewer(this));
+ mixer_submenu->add_submenuitem(new DragTileMixers(this));
+ mixer_submenu->add_submenuitem(new AlignMixers(this));
+ mixer_submenu->add_submenuitem(new MixMasters(this));
}
-MixerViewer::MixerViewer(MWindow *mwindow)
- : BC_MenuItem(_("Mixer Viewer"), _("Shift-M"), 'M')
+int MixerItems::activate_submenu()
+{
+ BC_SubMenu *mixer_submenu = (BC_SubMenu *)get_submenu();
+ int k = mixer_submenu->total_items();
+ while( --k >= 0 ) {
+ MixerItem *mixer_item = (MixerItem *)mixer_submenu->get_item(k);
+ if( mixer_item->idx < 0 ) continue;
+ mixer_submenu->del_item(mixer_item);
+ }
+ int n = mwindow->edl->mixers.size();
+ for( int i=0; i<n; ++i ) {
+ Mixer *mixer = mwindow->edl->mixers[i];
+ if( !mixer ) continue;
+ MixerItem *mixer_item = new MixerItem(this, mixer->title, mixer->idx);
+ mixer_submenu->add_submenuitem(mixer_item);
+ }
+ return BC_MenuItem::activate_submenu();
+}
+
+MixerItem::MixerItem(MixerItems *mixer_items, const char *text, int idx)
+ : BC_MenuItem(text)
+{
+ this->mixer_items = mixer_items;
+ this->idx = idx;
+}
+
+MixerItem::MixerItem(MixerItems *mixer_items, const char *text, const char *hotkey_text, int hotkey)
+ : BC_MenuItem(text, hotkey_text, hotkey)
+{
+ this->mixer_items = mixer_items;
+ this->idx = -1;
+}
+
+int MixerItem::handle_event()
+{
+ if( idx < 0 ) return 0;
+ MWindow *mwindow = mixer_items->mwindow;
+ Mixer *mixer = mwindow->edl->mixers.get_mixer(idx);
+ if( !mixer ) return 0;
+ ZWindow *zwindow = mwindow->get_mixer(idx);
+ if( !zwindow )
+ zwindow = mwindow->get_mixer(mixer);
+ if( !zwindow->zgui ) {
+ zwindow->set_title(mixer->title);
+ zwindow->start();
+ }
+ zwindow->zgui->lock_window("MixerItem::handle_event");
+ zwindow->zgui->raise_window();
+ zwindow->zgui->unlock_window();
+ mwindow->refresh_mixers();
+ return 1;
+}
+
+MixerViewer::MixerViewer(MixerItems *mixer_items)
+ : MixerItem(mixer_items, _("Mixer Viewer"), _("Shift-M"), 'M')
{
- this->mwindow = mwindow;
set_shift(1);
}
int MixerViewer::handle_event()
{
+ MWindow *mwindow = mixer_items->mwindow;
mwindow->start_mixer();
return 1;
}
-TileMixers::TileMixers(MWindow *mwindow)
- : BC_MenuItem(_("Tile mixers"), "Alt-t", 't')
+DragTileMixers::DragTileMixers(MixerItems *mixer_items)
+ : MixerItem(mixer_items, _("Drag Tile mixers"), "Alt-t", 't')
{
- this->mwindow = mwindow;
set_alt();
+ drag_box = 0;
}
-int TileMixers::handle_event()
+DragTileMixers::~DragTileMixers()
{
- mwindow->tile_mixers();
+ delete drag_box;
+}
+
+int DragTileMixers::handle_event()
+{
+ if( !drag_box ) {
+ MWindow *mwindow = mixer_items->mwindow;
+ drag_box = new TileMixersDragBox(mwindow->gui);
+ }
+ if( !drag_box->running() )
+ drag_box->start(this);
return 1;
}
-AlignMixers::AlignMixers(MWindow *mwindow)
- : BC_MenuItem(_("Align mixers"))
+TileMixersDragBox::TileMixersDragBox(MWindowGUI *gui)
+ : BC_DragBox(gui)
+{
+ tile_mixers = 0;
+}
+
+void TileMixersDragBox::start(DragTileMixers *tile_mixers)
+{
+ this->tile_mixers = tile_mixers;
+ start_drag();
+}
+
+int TileMixersDragBox::handle_done_event(int x0, int y0, int x1, int y1)
+{
+ MWindow *mwindow = tile_mixers->mixer_items->mwindow;
+ if( x0 >= x1 || y0 >= y1 ) x0 = x1 = y0 = y1 = 0;
+ mwindow->session->tile_mixers_x = x0;
+ mwindow->session->tile_mixers_y = y0;
+ mwindow->session->tile_mixers_w = x1 - x0;
+ mwindow->session->tile_mixers_h = y1 - y0;
+ mwindow->tile_mixers(x0, y0, x1, y1);
+ tile_mixers = 0;
+ return 1;
+}
+
+AlignMixers::AlignMixers(MixerItems *mixer_items)
+ : MixerItem(mixer_items, _("Align mixers"), "", 0)
{
- this->mwindow = mwindow;
}
int AlignMixers::handle_event()
{
+ MWindow *mwindow = mixer_items->mwindow;
int wx, wy;
mwindow->gui->get_abs_cursor(wx, wy);
mwindow->mixers_align->start_dialog(wx, wy);
return 1;
}
+MixMasters::MixMasters(MixerItems *mixer_items)
+ : MixerItem(mixer_items, _("Mix masters"), "", 0)
+{
+}
+
+int MixMasters::handle_event()
+{
+ MWindow *mwindow = mixer_items->mwindow;
+ mwindow->mix_masters();
+ return 1;
+}
+
+
+AlignTimecodes::AlignTimecodes(MWindow *mwindow)
+ : BC_MenuItem(_("Align Timecodes"))
+{
+ this->mwindow = mwindow;
+}
+
+int AlignTimecodes::handle_event()
+{
+ mwindow->align_timecodes();
+ return 1;
+}
+
LoadLayoutItem::LoadLayoutItem(LoadLayout *load_layout, const char *text, int idx, int hotkey)
: BC_MenuItem(text, "", hotkey)
}
LoadLayoutConfirm::LoadLayoutConfirm(LoadLayoutDialog *layout_dialog, int x, int y)
- : BC_Window(_(PROGRAM_NAME ": Layout"), x, y, 300,140, 300,140, 0)
+ : BC_Window(_(PROGRAM_NAME ": Layout"), x, y, xS(300),yS(140), xS(300),yS(140), 0)
{
this->layout_dialog = layout_dialog;
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Window Layouts");
}
LoadLayoutConfirm::~LoadLayoutConfirm()
void LoadLayoutConfirm::create_objects()
{
+ int xs10 = xS(10), xs20 = xS(20);
+ int ys10 = yS(10);
lock_window("LoadLayoutConfirm::create_objects");
- int x = 10, y = 10, pad = 10;
+ int x = xs10, y = ys10;
BC_SubMenu *layout_submenu = layout_dialog->load_layout->get_submenu();
LoadLayoutItem *item = (LoadLayoutItem *)
layout_submenu->get_item(layout_dialog->idx);
BC_Title *title;
add_subwindow(title = new BC_Title(x, y, _("Layout Name:")));
- int x1 = x + title->get_w() + 10;
+ int x1 = x + title->get_w() + xs10;
add_subwindow(title = new BC_Title(x1, y, item->get_text()));
- y += title->get_h() + pad;
+ y += title->get_h() + ys10;
add_subwindow(name_text = new LoadLayoutNameText(this,
- x, y, get_w()-x-20, item->layout_text));
+ x, y, get_w()-x-xs20, item->layout_text));
y += name_text->get_h();
- x1 = x + 80;
+ x1 = x + xS(80);
char legend[BCTEXTLEN];
sprintf(legend, _("a-z,A-Z,0-9_ only, %dch max"), LAYOUT_NAME_LEN);
add_subwindow(title = new BC_Title(x1, y, legend));
unlock_window();
}
+
+LoadRecentItem::LoadRecentItem(const char *path)
+{
+ this->path = cstrdup(path);
+}
+
+LoadRecentItem::~LoadRecentItem()
+{
+ delete [] path;
+}
+
+int LoadRecentItems::add_load(char *path)
+{
+// test for existing copy
+ FileSystem fs;
+ char name[BCTEXTLEN], text[BCTEXTLEN];
+ fs.extract_name(name, path);
+ int loads_total = size();
+ int ret = 0, k = loads_total;
+ LoadRecentItem *load_item = 0;
+
+ for( int i=0; !ret && i<loads_total; ++i ) {
+ load_item = get(i);
+ fs.extract_name(text, load_item->path);
+ if( strcmp(name, text) ) continue;
+ k = i; ret = 1; // already exists, move to top
+ }
+ if( !ret ) { // adding a new one
+ while( loads_total >= TOTAL_LOADS )
+ remove_object_number(--loads_total);
+ insert(new LoadRecentItem(path), 0);
+ }
+ else if( k > 0 ) { // cycle loads
+ while( --k >= 0 ) set(k+1, get(k));
+ set(0, load_item);
+ }
+ return ret;
+}
+
+LoadRecentItems::LoadRecentItems()
+{
+}
+
+LoadRecentItems::~LoadRecentItems()
+{
+ remove_all_objects();
+}
+
+LoadRecent::LoadRecent(MWindow *mwindow, MainMenu *main_menu)
+ : BC_MenuItem(_("Load Recent..."))
+{
+ this->mwindow = mwindow;
+ this->main_menu = main_menu;
+ total_items = 0;
+}
+LoadRecent::~LoadRecent()
+{
+}
+
+void LoadRecent::create_objects()
+{
+ add_submenu(submenu = new LoadRecentSubMenu(this));
+}
+
+LoadPrevious *LoadRecent::get_next_item()
+{
+ int k = total_items++;
+ if( k < submenu->total_items() )
+ return (LoadPrevious *)submenu->get_item(k);
+ LoadPrevious *load_prev = new LoadPrevious(mwindow, main_menu->load_file);
+ submenu->add_item(load_prev);
+ return load_prev;
+}
+
+int LoadRecent::activate_submenu()
+{
+ total_items = 0;
+ scan_items(1);
+ if( total_items > 0 ) {
+ LoadPrevious *load_prev = get_next_item();
+ load_prev->set_text("-");
+ load_prev->set_path("");
+ }
+ scan_items(0);
+ while( total_items < submenu->total_items() )
+ submenu->del_item(0);
+ return BC_MenuItem::activate_submenu();
+}
+
+void LoadRecent::scan_items(int use_xml)
+{
+ FileSystem fs;
+ int loads_total = main_menu->load.size();
+ for( int i=0; i<loads_total; ++i ) {
+ LoadRecentItem *recent = main_menu->load[i];
+ char name[BCTEXTLEN];
+ fs.extract_name(name, recent->path);
+ const char *cp = strrchr(name, '.');
+ if( !cp || strcasecmp(cp+1,"xml") ? use_xml : !use_xml ) continue;
+ LoadPrevious *load_prev = get_next_item();
+ load_prev->set_text(name);
+ load_prev->set_path(recent->path);
+ }
+}
+
+LoadRecentSubMenu::LoadRecentSubMenu(LoadRecent *load_recent)
+ : BC_SubMenu()
+{
+ this->load_recent = load_recent;
+}
+
+LoadRecentSubMenu::~LoadRecentSubMenu()
+{
+}
+