Major cleanup to dynamic menu code, fixed menu flickering/slowness and replaced old hack to use wxWidgets 2.8.3's fixed handling of bitmaps in menus, which means that all the _disable bitmaps are now obsolete.

Originally committed to SVN as r1025.
This commit is contained in:
Rodrigo Braz Monteiro 2007-04-08 02:19:21 +00:00
parent b1ce35f817
commit e49058f0cf
18 changed files with 62 additions and 177 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -289,8 +289,9 @@ void FrameMain::InitMenu() {
// Create Edit menu
editMenu = new wxMenu();
AppendBitmapMenuItem(editMenu,Menu_Edit_Undo, _("&Undo\t") + Hotkeys.GetText(_T("Undo")), _("Undoes last action"),wxBITMAP(undo_button));
AppendBitmapMenuItem(editMenu,Menu_Edit_Redo, _("&Redo\t") + Hotkeys.GetText(_T("Redo")), _("Redoes last action"),wxBITMAP(redo_button));
wxMenuItem *item;
item = AppendBitmapMenuItem(editMenu,Menu_Edit_Undo, _("-") + wxString(_T("\t")) + Hotkeys.GetText(_T("Undo")), _("Undoes last action"),wxBITMAP(undo_button));
item = AppendBitmapMenuItem(editMenu,Menu_Edit_Redo, _("-") + wxString(_T("\t")) + Hotkeys.GetText(_T("Redo")), _("Redoes last action"),wxBITMAP(redo_button));
editMenu->AppendSeparator();
AppendBitmapMenuItem(editMenu,Menu_Edit_Cut, _("Cut Lines\t") + Hotkeys.GetText(_T("Cut")), _("Cut subtitles"), wxBITMAP(cut_button));
AppendBitmapMenuItem(editMenu,Menu_Edit_Copy, _("Copy Lines\t") + Hotkeys.GetText(_T("Copy")), _("Copy subtitles"), wxBITMAP(copy_button));
@ -538,55 +539,6 @@ void FrameMain::UpdateToolbar() {
}
////////////////////////////
// Menu item enable/disable
void FrameMain::MenuItemEnable (int id, bool state,wxBitmap &bmp1,wxBitmap &bmp2) {
wxMenuItem *item = MenuBar->FindItem(id);
wxBitmap bmp = item->GetBitmap();
// No image
if (bmp.GetWidth() == 0) {
item->Enable(state);
}
// Has image
else {
RebuildMenuItem(item->GetMenu(),id,bmp1,bmp2,state);
}
}
/////////////////////////////////
// Helper to rebuild menu items
wxMenuItem *FrameMain::RebuildMenuItem(wxMenu *menu,int findId,wxBitmap bmp1,wxBitmap bmp2,bool state) {
// Find pos
wxMenuItemList &items = menu->GetMenuItems();
int pos = -1;
for (size_t i=0;i<items.GetCount();i++) {
if (items[i]->GetId() == findId) {
pos = (int)i;
break;
}
}
if (pos == -1) return NULL;
// Get ID and pointer
wxMenuItem *cur = items[pos];
int id = cur->GetId();
// Rebuild
wxMenuItem *newItem = new wxMenuItem(menu,id,cur->GetText(),cur->GetHelp(),cur->GetKind(),cur->GetSubMenu());
if (state) newItem->SetBitmap(bmp1);
else newItem->SetBitmap(bmp2);
// Swap them
menu->Destroy(id);
menu->Insert(pos,newItem);
menu->Enable(id,state);
return cur;
}
//////////////////
// Open subtitles
void FrameMain::LoadSubtitles (wxString filename,wxString charset) {

View File

@ -237,8 +237,7 @@ private:
bool SaveSubtitles(bool saveas=false,bool withCharset=false);
int TryToCloseSubs(bool enableCancel=true);
wxMenuItem *RebuildMenuItem(wxMenu *menu,int id,wxBitmap bmp1,wxBitmap bmp2,bool state);
void MenuItemEnable(int id,bool state,wxBitmap &bmp1,wxBitmap &bmp2);
void RebuildRecentList(wxString listName,wxMenu *menu,int startID);
void SynchronizeProject(bool FromSubs=false);
public:

View File

@ -227,34 +227,44 @@ void FrameMain::OnGridEvent (wxCommandEvent &event) {
}
///////////////////////
// Rebuild recent list
void FrameMain::RebuildRecentList(wxString listName,wxMenu *menu,int startID) {
// Wipe previous list
int count = (int)menu->GetMenuItemCount();
for (int i=count;--i>=0;) {
menu->Destroy(menu->FindItemByPosition(i));
}
// Rebuild
int added = 0;
wxString n;
wxArrayString entries = Options.GetRecentList(listName);
for (size_t i=0;i<entries.Count();i++) {
n = wxString::Format(_T("%i"),i+1);
if (i < 9) n = _T("&") + n;
wxFileName shortname(entries[i]);
wxString filename = shortname.GetFullName();
menu->Append(startID+i,n + _T(" ") + filename);
added++;
}
// Nothing added, add an empty placeholder
if (added == 0) menu->Append(startID,_("Empty"))->Enable(false);
}
////////////////////////
// Menu is being opened
void FrameMain::OnMenuOpen (wxMenuEvent &event) {
// Get menu
//Freeze();
MenuBar->Freeze();
wxMenu *curMenu = event.GetMenu();
// File menu
if (curMenu == fileMenu) {
// Wipe recent
int count = (int)RecentSubs->GetMenuItemCount();
for (int i=count;--i>=0;) {
RecentSubs->Destroy(RecentSubs->FindItemByPosition(i));
}
// Rebuild recent
int added = 0;
wxString n;
wxArrayString entries = Options.GetRecentList(_T("Recent sub"));
for (size_t i=0;i<entries.Count();i++) {
n = wxString::Format(_T("%i"),i+1);
if (i < 9) n = _T("&") + n;
wxFileName shortname(entries[i]);
wxString filename = shortname.GetFullName();
RecentSubs->Append(Menu_File_Recent+i,n + _T(" ") + filename);
added++;
}
if (added == 0) RecentSubs->Append(Menu_File_Recent,_T("Empty"))->Enable(false);
RebuildRecentList(_T("Recent sub"),RecentSubs,Menu_File_Recent);
}
// View menu
@ -279,12 +289,10 @@ void FrameMain::OnMenuOpen (wxMenuEvent &event) {
else if (curMenu == videoMenu) {
bool state = VideoContext::Get()->IsLoaded();
// Rebuild icons
RebuildMenuItem(videoMenu,Menu_Video_JumpTo,wxBITMAP(jumpto_button),wxBITMAP(jumpto_disable_button),state);
RebuildMenuItem(videoMenu,Menu_Subs_Snap_Video_To_Start,wxBITMAP(video_to_substart),wxBITMAP(video_to_substart_disable),state);
RebuildMenuItem(videoMenu,Menu_Subs_Snap_Video_To_End,wxBITMAP(video_to_subend),wxBITMAP(video_to_subend_disable),state);
// Set states
MenuBar->Enable(Menu_Video_JumpTo,state);
MenuBar->Enable(Menu_Subs_Snap_Video_To_Start,state);
MenuBar->Enable(Menu_Subs_Snap_Video_To_End,state);
MenuBar->Enable(Menu_View_Zoom,state);
MenuBar->Enable(Menu_View_Zoom_50,state);
MenuBar->Enable(Menu_View_Zoom_100,state);
@ -316,59 +324,10 @@ void FrameMain::OnMenuOpen (wxMenuEvent &event) {
case 4: MenuBar->Check(Menu_Video_AR_Custom,true); break;
}
// Wipe recent
int count = (int)RecentVids->GetMenuItemCount();
for (int i=count;--i>=0;) {
RecentVids->Destroy(RecentVids->FindItemByPosition(i));
}
count = (int)RecentTimecodes->GetMenuItemCount();
for (int i=count;--i>=0;) {
RecentTimecodes->Destroy(RecentTimecodes->FindItemByPosition(i));
}
count = (int)RecentKeyframes->GetMenuItemCount();
for (int i=count;--i>=0;) {
RecentKeyframes->Destroy(RecentKeyframes->FindItemByPosition(i));
}
// Rebuild recent videos
int added = 0;
wxString n;
wxArrayString entries = Options.GetRecentList(_T("Recent vid"));
for (size_t i=0;i<entries.Count();i++) {
n = wxString::Format(_T("%i"),i+1);
if (i < 9) n = _T("&") + n;
wxFileName shortname(entries[i]);
wxString filename = shortname.GetFullName();
RecentVids->Append(Menu_Video_Recent+i,n + _T(" ") + filename);
added++;
}
if (added == 0) RecentVids->Append(Menu_Video_Recent,_T("Empty"))->Enable(false);
// Rebuild recent timecodes
added = 0;
entries = Options.GetRecentList(_T("Recent timecodes"));
for (size_t i=0;i<entries.Count();i++) {
n = wxString::Format(_T("%i"),i+1);
if (i < 9) n = _T("&") + n;
wxFileName shortname(entries[i]);
wxString filename = shortname.GetFullName();
RecentTimecodes->Append(Menu_Timecodes_Recent+i,n + _T(" ") + filename);
added++;
}
if (added == 0) RecentTimecodes->Append(Menu_Timecodes_Recent,_T("Empty"))->Enable(false);
// Rebuild recent Keyframes
added = 0;
entries = Options.GetRecentList(_T("Recent Keyframes"));
for (size_t i=0;i<entries.Count();i++) {
n = wxString::Format(_T("%i"),i+1);
if (i < 9) n = _T("&") + n;
wxFileName shortname(entries[i]);
wxString filename = shortname.GetFullName();
RecentKeyframes->Append(Menu_Keyframes_Recent+i,n + _T(" ") + filename);
added++;
}
if (added == 0) RecentKeyframes->Append(Menu_Keyframes_Recent,_T("Empty"))->Enable(false);
// Rebuild recent lists
RebuildRecentList(_T("Recent vid"),RecentVids,Menu_Video_Recent);
RebuildRecentList(_T("Recent timecodes"),RecentTimecodes,Menu_Timecodes_Recent);
RebuildRecentList(_T("Recent Keyframes"),RecentKeyframes,Menu_Keyframes_Recent);
}
// Audio menu
@ -379,25 +338,8 @@ void FrameMain::OnMenuOpen (wxMenuEvent &event) {
MenuBar->Enable(Menu_Audio_Open_From_Video,vidstate);
MenuBar->Enable(Menu_Audio_Close,state);
// Wipe recent
int count = (int)RecentAuds->GetMenuItemCount();
for (int i=count;--i>=0;) {
RecentAuds->Destroy(RecentAuds->FindItemByPosition(i));
}
// Rebuild recent
int added = 0;
wxString n;
wxArrayString entries = Options.GetRecentList(_T("Recent aud"));
for (size_t i=0;i<entries.Count();i++) {
n = wxString::Format(_T("%i"),i+1);
if (i < 9) n = _T("&") + n;
wxFileName shortname(entries[i]);
wxString filename = shortname.GetFullName();
RecentAuds->Append(Menu_Audio_Recent+i,n + _T(" ") + filename);
added++;
}
if (added == 0) RecentAuds->Append(Menu_Audio_Recent,_T("Empty"))->Enable(false);
RebuildRecentList(_T("Recent aud"),RecentAuds,Menu_Audio_Recent);
}
// Subtitles menu
@ -413,7 +355,7 @@ void FrameMain::OnMenuOpen (wxMenuEvent &event) {
MenuBar->Enable(MENU_INSERT_BEFORE,state);
MenuBar->Enable(MENU_INSERT_AFTER,state);
MenuBar->Enable(MENU_SPLIT_BY_KARAOKE,state);
RebuildMenuItem(subtitlesMenu,MENU_DELETE,wxBITMAP(delete_button),wxBITMAP(delete_disable_button),state);
MenuBar->Enable(MENU_DELETE,state);
state2 = count > 0 && VideoContext::Get()->IsLoaded();
MenuBar->Enable(MENU_INSERT_BEFORE_VIDEO,state2);
MenuBar->Enable(MENU_INSERT_AFTER_VIDEO,state2);
@ -442,10 +384,10 @@ void FrameMain::OnMenuOpen (wxMenuEvent &event) {
// Video related
bool state = VideoContext::Get()->IsLoaded();
RebuildMenuItem(timingMenu,Menu_Subs_Snap_Start_To_Video,wxBITMAP(substart_to_video),wxBITMAP(substart_to_video_disable),state);
RebuildMenuItem(timingMenu,Menu_Subs_Snap_End_To_Video,wxBITMAP(subend_to_video),wxBITMAP(subend_to_video_disable),state);
RebuildMenuItem(timingMenu,Menu_Video_Snap_To_Scene,wxBITMAP(snap_subs_to_scene),wxBITMAP(snap_subs_to_scene_disable),state);
RebuildMenuItem(timingMenu,Menu_Video_Shift_To_Frame,wxBITMAP(shift_to_frame),wxBITMAP(shift_to_frame_disable),state);
MenuBar->Enable(Menu_Subs_Snap_Start_To_Video,state);
MenuBar->Enable(Menu_Subs_Snap_End_To_Video,state);
MenuBar->Enable(Menu_Video_Snap_To_Scene,state);
MenuBar->Enable(Menu_Video_Shift_To_Frame,state);
// Other
state = count >= 2 && continuous;
@ -456,18 +398,22 @@ void FrameMain::OnMenuOpen (wxMenuEvent &event) {
// Edit menu
else if (curMenu == editMenu) {
// Undo state
curMenu->FindItemByPosition(0)->SetText(_("Undo ")+AssFile::GetUndoDescription()+_T("\t")+Hotkeys.GetText(_T("Undo")));
curMenu->FindItemByPosition(1)->SetText(_("Redo ")+AssFile::GetRedoDescription()+_T("\t")+Hotkeys.GetText(_T("Redo")));
RebuildMenuItem(editMenu,Menu_Edit_Undo,wxBITMAP(undo_button),wxBITMAP(undo_disable_button),!AssFile::IsUndoStackEmpty());
RebuildMenuItem(editMenu,Menu_Edit_Redo,wxBITMAP(redo_button),wxBITMAP(redo_disable_button),!AssFile::IsRedoStackEmpty());
wxMenuItem *item;
item = MenuBar->FindItem(Menu_Edit_Undo);
item->SetText(_("&Undo")+wxString(_T(" "))+AssFile::GetUndoDescription()+_T("\t")+Hotkeys.GetText(_T("Undo")));
item->SetBitmap(wxBITMAP(undo_button));
item->Enable(!AssFile::IsUndoStackEmpty());
item = MenuBar->FindItem(Menu_Edit_Redo);
item->SetText(_("&Redo")+wxString(_T(" "))+AssFile::GetRedoDescription()+_T("\t")+Hotkeys.GetText(_T("Redo")));
item->SetBitmap(wxBITMAP(redo_button));
item->Enable(!AssFile::IsRedoStackEmpty());
// Copy/cut/paste
wxArrayInt sels = SubsBox->GetSelection();
bool state = (sels.Count() > 0);
RebuildMenuItem(editMenu,Menu_Edit_Cut,wxBITMAP(cut_button),wxBITMAP(cut_disable_button),state);
RebuildMenuItem(editMenu,Menu_Edit_Copy,wxBITMAP(copy_button),wxBITMAP(copy_disable_button),state);
RebuildMenuItem(editMenu,Menu_Edit_Paste,wxBITMAP(paste_button),wxBITMAP(paste_disable_button),state);
MenuBar->Enable(Menu_Edit_Cut,state);
MenuBar->Enable(Menu_Edit_Copy,state);
MenuBar->Enable(Menu_Edit_Paste,state);
MenuBar->Enable(Menu_Edit_Paste_Over,state);
}
@ -494,7 +440,7 @@ void FrameMain::OnMenuOpen (wxMenuEvent &event) {
}
}
//Thaw();
MenuBar->Thaw();
}

View File

@ -50,7 +50,6 @@ resample_toolbutton BITMAP "bitmaps/resample.bmp"
timing_processor_toolbutton BITMAP "bitmaps/timing_processor.bmp"
shift_times_toolbutton BITMAP "bitmaps/shift_times.bmp"
jumpto_button BITMAP "bitmaps/jumpto.bmp"
jumpto_disable_button BITMAP "bitmaps/jumpto_disable.bmp"
contents_button BITMAP "bitmaps/contents.bmp"
zoom_in_button BITMAP "bitmaps/zoom_in.bmp"
zoom_out_button BITMAP "bitmaps/zoom_out.bmp"
@ -62,34 +61,22 @@ substart_to_video BITMAP "bitmaps/substart_to_video.bmp"
subend_to_video BITMAP "bitmaps/subend_to_video.bmp"
video_to_substart BITMAP "bitmaps/video_to_substart.bmp"
video_to_subend BITMAP "bitmaps/video_to_subend.bmp"
substart_to_video_disable BITMAP "bitmaps/substart_to_video_disable.bmp"
subend_to_video_disable BITMAP "bitmaps/subend_to_video_disable.bmp"
video_to_substart_disable BITMAP "bitmaps/video_to_substart_disable.bmp"
video_to_subend_disable BITMAP "bitmaps/video_to_subend_disable.bmp"
snap_subs_to_scene BITMAP "bitmaps/snap_to_scene.bmp"
snap_subs_to_scene_disable BITMAP "bitmaps/snap_to_scene_disable.bmp"
copy_button BITMAP "bitmaps/copy.bmp"
paste_button BITMAP "bitmaps/paste.bmp"
paste_over_button BITMAP "bitmaps/paste_over.bmp"
cut_button BITMAP "bitmaps/cut.bmp"
undo_button BITMAP "bitmaps/undo.bmp"
redo_button BITMAP "bitmaps/redo.bmp"
copy_disable_button BITMAP "bitmaps/copy_disable.bmp"
paste_disable_button BITMAP "bitmaps/paste_disable.bmp"
cut_disable_button BITMAP "bitmaps/cut_disable.bmp"
undo_disable_button BITMAP "bitmaps/undo_disable.bmp"
redo_disable_button BITMAP "bitmaps/redo_disable.bmp"
irc_button BITMAP "bitmaps/irc.bmp"
find_button BITMAP "bitmaps/find.bmp"
find_next_button BITMAP "bitmaps/find_next.bmp"
replace_button BITMAP "bitmaps/replace.bmp"
delete_button BITMAP "bitmaps/delete.bmp"
delete_disable_button BITMAP "bitmaps/delete_disable.bmp"
null_button BITMAP "bitmaps/null_button.bmp"
select_visible_button BITMAP "bitmaps/select_visible.bmp"
toggle_tag_hiding BITMAP "bitmaps/toggle_tag_hiding.bmp"
shift_to_frame BITMAP "bitmaps/shift_to_frame.bmp"
shift_to_frame_disable BITMAP "bitmaps/shift_to_frame_disable.bmp"
bugtracker_button BITMAP "bitmaps/bugtracker.bmp"
website_button BITMAP "bitmaps/website.bmp"
forums_button BITMAP "bitmaps/forums.bmp"

View File

@ -190,10 +190,11 @@ wxString PrettySize(int bytes) {
//////////////////////////////////
// Append a menu item with bitmap
void AppendBitmapMenuItem (wxMenu* parentMenu,int id,wxString text,wxString help,wxBitmap bmp) {
wxMenuItem* AppendBitmapMenuItem (wxMenu* parentMenu,int id,wxString text,wxString help,wxBitmap bmp) {
wxMenuItem *cur = new wxMenuItem(parentMenu,id,text,help);
cur->SetBitmap(bmp);
parentMenu->Append(cur);
return cur;
}

View File

@ -53,7 +53,7 @@ wxString PrettyFloatD(double src);
wxString FloatToString(double value);
wxString IntegerToString(int value);
wxString PrettySize(int bytes);
void AppendBitmapMenuItem (wxMenu* parentMenu,int id,wxString text,wxString help,wxBitmap bmp);
wxMenuItem *AppendBitmapMenuItem (wxMenu* parentMenu,int id,wxString text,wxString help,wxBitmap bmp);
int SmallestPowerOf2(int x);