110 auto isHeadless = commandLine.contains(
"--headless");
116 signal(SIGPIPE, SIG_IGN);
122 m_toolTipWindowInstance = std::make_unique<TooltipWindow>();
124 m_taskbarComponent = std::make_unique<MemaTaskbarComponent>([=](juce::Point<int> mousePosition) {
showUiAsCalloutBox(mousePosition); });
128 Mema::Mema::getInstance();
133 m_macMainMenu = std::make_unique<MemaMacMainMenuMenuBarModel>();
134 auto optionsPopupMenu = juce::PopupMenu();
135 optionsPopupMenu.addItem(
"Show as standalone window",
true,
false, [=]() {
136 if (
auto currentProcEditor = Mema::Mema::getInstance()->getMemaProcessorEditor())
137 if (
auto callout = currentProcEditor->findParentComponentOfClass<juce::CallOutBox>())
138 callout->exitModalState(0);
141 optionsPopupMenu.addSeparator();
142 optionsPopupMenu.addItem(
"Load config...",
true,
false, [=]() {
143 Mema::Mema::getInstance()->triggerPromptLoadConfig();
145 optionsPopupMenu.addItem(
"Save config...",
true,
false, [=]() {
146 Mema::Mema::getInstance()->triggerPromptSaveConfig();
148 m_macMainMenu->addMenu(0,
"Options", optionsPopupMenu);
150 juce::MenuBarModel::setMacMainMenu(m_macMainMenu.get());
167 if (!Mema::Mema::getInstanceWithoutCreating())
170 auto memaUIComponent = std::make_unique<Mema::MemaUIComponent>().release();
171 Mema::Mema::getInstance()->onEditorSizeChangeRequested = [memaUIComponent,
this](juce::Rectangle<int> requestedSize) {
172 m_lastRequestedEditorSize = requestedSize;
173 jassert(memaUIComponent);
174 if (memaUIComponent) memaUIComponent->handleEditorSizeChangeRequest(requestedSize);
176 Mema::Mema::getInstance()->onCpuUsageUpdate = [=](
int loadPercent) {
177 jassert(memaUIComponent);
178 if (memaUIComponent) memaUIComponent->updateCpuUsageBar(loadPercent);
180 Mema::Mema::getInstance()->onNetworkUsageUpdate = [=](std::map<int, std::pair<double, bool>> netLoads) {
181 jassert(memaUIComponent);
182 if (memaUIComponent) memaUIComponent->updateNetworkUsage(netLoads);
184 Mema::Mema::getInstance()->onServiceDiscoveryTopologyUpdate = [=](
const JUCEAppBasics::SessionServiceTopology& sessionServiceTopology) {
185 jassert(memaUIComponent);
186 if (memaUIComponent) memaUIComponent->updateSessionServiceTopology(sessionServiceTopology);
188 memaUIComponent->setEditorComponent(Mema::Mema::getInstance()->getMemaProcessorEditor());
189 memaUIComponent->setVisible(m_isMainComponentVisible);
190 memaUIComponent->addToDesktop(juce::ComponentPeer::windowHasDropShadow);
191 memaUIComponent->setTopLeftPosition(m_taskbarComponent->getX(), 50);
192 memaUIComponent->setName(ProjectInfo::projectName);
193 memaUIComponent->onToggleStandaloneWindow = [=](
bool standalone) {
196 if (
auto callout = memaUIComponent->findParentComponentOfClass<juce::CallOutBox>())
197 callout->exitModalState(0);
202 if (m_memaUIComponent)
203 m_memaUIComponent->setStandaloneWindow(
false);
207 memaUIComponent->onLookAndFeelChanged = [=]() {
208 if (Mema::Mema::getInstanceWithoutCreating()) Mema::Mema::getInstance()->propagateLookAndFeelChanged();
210 memaUIComponent->onAudioSetupMenuClicked = [=]() {
211 if (Mema::Mema::getInstanceWithoutCreating())
213 juce::PopupMenu setupMenu;
214 setupMenu.addCustomItem(1, std::make_unique<CustomAboutItem>(Mema::Mema::getInstance()->getDeviceSetupComponent(), juce::Rectangle<int>(300, 350)),
nullptr,
"Audio Device Setup");
215 setupMenu.showMenuAsync(juce::PopupMenu::Options());
218 memaUIComponent->onDeleted = [
this]() {
219 if (Mema::Mema::getInstanceWithoutCreating())
221 Mema::Mema::getInstance()->clearUICallbacks();
224 m_memaUIComponent.release();
225 m_memaUIComponent =
nullptr;
227 memaUIComponent->onSettingsChanged = [=]() {
228 jassert(memaUIComponent);
229 if (memaUIComponent && Mema::Mema::getInstanceWithoutCreating())
231 Mema::Mema::getInstance()->setUIConfigState(memaUIComponent->createStateXml());
232 JUCEAppBasics::AppConfigurationBase::getInstance()->triggerConfigurationDump();
235 memaUIComponent->onPaletteStyleChange = [=](
const JUCEAppBasics::CustomLookAndFeel::PaletteStyle& paletteStyle) {
236 m_lookAndFeel = std::make_unique<JUCEAppBasics::CustomLookAndFeel>(paletteStyle);
237 juce::Desktop::getInstance().setDefaultLookAndFeel(m_lookAndFeel.get());
239 memaUIComponent->onLoadConfig = [=]() {
240 Mema::Mema::getInstance()->triggerPromptLoadConfig();
242 memaUIComponent->onSaveConfig = [=]() {
243 Mema::Mema::getInstance()->triggerPromptSaveConfig();
246 memaUIComponent->handleEditorSizeChangeRequest(m_lastRequestedEditorSize);
247 memaUIComponent->lookAndFeelChanged();
248 memaUIComponent->setStateXml(Mema::Mema::getInstance()->getUIConfigState().get());
249 memaUIComponent->resized();
250 memaUIComponent->grabKeyboardFocus();
252 return std::unique_ptr<Mema::MemaUIComponent>(memaUIComponent);
287 m_memaUIComponent.reset();
289 jassert(m_memaUIComponent);
290 m_memaUIComponent->setStandaloneWindow(
true);
292 auto showPosition = juce::Desktop::getInstance().getMousePosition();
293 auto const display = juce::Desktop::getInstance().getDisplays().getPrimaryDisplay();
294 if (
nullptr != display &&
nullptr != m_memaUIComponent)
296 if (display->userArea.getHeight() < showPosition.getY() + m_memaUIComponent->getHeight())
297 showPosition.setY(showPosition.getY() - m_memaUIComponent->getHeight() - 30);
298 if (display->userArea.getWidth() < showPosition.getX() + m_memaUIComponent->getWidth())
299 showPosition.setX(showPosition.getX() - m_memaUIComponent->getWidth() - 30);
301 m_memaUIComponent->setTopLeftPosition(showPosition);