1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-05 16:43:52 +01:00

Bug 1119 - Mac: Window menu's list of open windows not available

This commit is contained in:
Leland Lucius
2020-04-18 01:49:17 -05:00
parent 7ecaed079c
commit 18cbc2e574
5 changed files with 138 additions and 4 deletions

View File

@@ -109,6 +109,10 @@ It handles initialization and termination by subclassing wxApp.
#include "tracks/ui/Scrubbing.h"
#include "widgets/FileHistory.h"
#if defined(__WXMAC__)
#include "menus/WindowMenus.h"
#endif
#ifdef EXPERIMENTAL_EASY_CHANGE_KEY_BINDINGS
#include "prefs/KeyConfigPrefs.h"
#endif
@@ -885,6 +889,11 @@ BEGIN_EVENT_TABLE(AudacityApp, wxApp)
EVT_MENU_RANGE(FileHistory::ID_RECENT_FIRST, FileHistory::ID_RECENT_LAST,
AudacityApp::OnMRUFile)
#if defined(__WXMAC__)
// Window menu event handlers.
EVT_MENU_RANGE(WindowActions::ID_BASE, WindowActions::ID_LAST, AudacityApp::OnWindow)
#endif
// Handle AppCommandEvents (usually from a script)
EVT_APP_COMMAND(wxID_ANY, AudacityApp::OnReceiveCommand)
@@ -978,6 +987,35 @@ void AudacityApp::OnMRUFile(wxCommandEvent& event) {
history.RemoveFileFromHistory(n);
}
#if defined(__WXMAC__)
// Handles switching projects when an item in the Window menu is selected
void AudacityApp::OnWindow(wxCommandEvent& event)
{
// Get the project's number
int projectNumber = event.GetId() - WindowActions::ID_BASE;
// Search for it
for (auto project : AllProjects{})
{
if (project->GetProjectNumber() == projectNumber)
{
// Make it the active project
SetActiveProject(project.get());
// And ensure it's visible
wxFrame *frame = project->GetFrame();
if (frame->IsIconized())
{
frame->Restore();
}
frame->Raise();
break;
}
}
}
#endif
void AudacityApp::OnTimer(wxTimerEvent& WXUNUSED(event))
{
// Filenames are queued when Audacity receives a few of the

View File

@@ -69,6 +69,10 @@ class AudacityApp final : public wxApp {
// A wrapper of the above that does not throw
bool SafeMRUOpen(const wxString &fileName);
#if defined(__WXMAC__)
void OnWindow(wxCommandEvent &event);
#endif
void OnReceiveCommand(AppCommandEvent &event);
void OnKeyDown(wxKeyEvent &event);

View File

@@ -15,6 +15,10 @@
#include "KeyboardCapture.h"
#include "ondemand/ODTaskThread.h"
#if defined(__WXMAC__)
#include "menus/WindowMenus.h"
#endif
#include <wx/display.h>
#include <wx/frame.h>
@@ -113,6 +117,11 @@ void SetActiveProject(AudacityProject * project)
KeyboardCapture::Capture( nullptr );
}
wxTheApp->SetTopWindow( FindProjectFrame( project ) );
#if defined(__WXMAC__)
// Refresh the Window menu
WindowActions::Refresh();
#endif
}
AudacityProject::AudacityProject()

View File

@@ -24,6 +24,10 @@ Paul Licameli split from AudacityProject.cpp
#include "widgets/AudacityMessageBox.h"
#include "widgets/NumericTextCtrl.h"
#if defined(__WXMAC__)
#include "menus/WindowMenus.h"
#endif
static void RefreshAllTitles(bool bShowProjectNumbers )
{
for ( auto pProject : AllProjects{} ) {
@@ -132,6 +136,11 @@ void ProjectFileIO::SetProjectTitle( int number)
window.SetTitle( name );
window.SetName(name); // to make the nvda screen reader read the correct title
#if defined(__WXMAC__)
// Refresh the Window menu
WindowActions::Refresh();
#endif
}
// Most of this string was duplicated 3 places. Made the warning consistent in this global.

View File

@@ -7,12 +7,16 @@
#ifdef __WXMAC__
#include "WindowMenus.h"
#include "../CommonCommandFlags.h"
#include "../Menus.h"
#include "../Project.h"
#include "../commands/CommandContext.h"
#include <wx/frame.h>
#include <wx/menu.h>
#include <wx/menuitem.h>
#undef USE_COCOA
@@ -57,7 +61,68 @@ void DoMacMinimize(AudacityProject *project)
namespace WindowActions {
// exported helper functions
// none
// Refreshes the Window menu in all projects
void Refresh()
{
// Must do it in all projects
for (auto thisProject : AllProjects{})
{
// Need the projects frame, but this should always be successful
wxFrame *frame = thisProject->GetFrame();
wxASSERT(frame != NULL);
if (!frame)
{
continue;
}
// This can happen if we are called before the menubar is set in the frame
wxMenuBar *bar = frame->GetMenuBar();
if (!bar)
{
continue;
}
// Should always find the Window menu
int pos = bar->FindMenu(wxT("Window"));
wxASSERT(pos != wxNOT_FOUND);
if (pos == wxNOT_FOUND)
{
continue;
}
// We can not get the menu proper
wxMenu *menu = bar->GetMenu(pos);
// Remove all existing window items
for (auto item : menu->GetMenuItems())
{
if (item->GetId() >= WindowActions::ID_BASE)
{
menu->Destroy(item);
}
}
// Add all projects to this project's Window menu
for (auto project : AllProjects{})
{
int itemId = WindowActions::ID_BASE + project->GetProjectNumber();
wxString itemName = project->GetFrame()->GetTitle();
bool isActive = (GetActiveProject() == project.get());
// This should never really happen, but a menu item must have a name
if (itemName.empty())
{
itemName = _("<untitled>");
}
// Add it to the menu and check it if it's the active project
wxMenuItem *item = menu->Append(itemId, itemName);
item->SetCheckable(true);
item->Check(isActive);
}
}
}
// Menu handler functions
@@ -122,9 +187,9 @@ namespace {
using namespace MenuTable;
BaseItemSharedPtr WindowMenu()
{
//////////////////////////////////////////////////////////////////////////
// poor imitation of the Mac Windows Menu
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// poor imitation of the Mac Windows Menu
//////////////////////////////////////////////////////////////////////////
static BaseItemSharedPtr menu{
( FinderScope{ findCommandHandler },
Menu( wxT("Window"), XO("&Window"),
@@ -144,7 +209,16 @@ BaseItemSharedPtr WindowMenu()
* windows un-hidden */
Command( wxT("MacBringAllToFront"), XXO("&Bring All to Front"),
FN(OnMacBringAllToFront), AlwaysEnabledFlag )
),
Section( "",
Special( wxT("PopulateWindowsStep"),
[](AudacityProject &, wxMenu &theMenu)
{
// Should something be done here???
} )
)
) ) };
return menu;
}