blob: 879f6648f4b04d1afbc0b4a9b18d47e20d91b3ca [file] [log] [blame]
Austin Schuh812d0d12021-11-04 20:16:48 -07001// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5#include "glass/MainMenuBar.h"
6
7#include <cstdio>
8
Austin Schuh75263e32022-02-22 18:05:32 -08009#include <imgui.h>
Austin Schuh812d0d12021-11-04 20:16:48 -070010#include <wpigui.h>
11
Austin Schuh75263e32022-02-22 18:05:32 -080012#include "glass/Context.h"
13#include "glass/ContextInternal.h"
14
Austin Schuh812d0d12021-11-04 20:16:48 -070015using namespace glass;
16
17void MainMenuBar::AddMainMenu(std::function<void()> menu) {
18 if (menu) {
19 m_menus.emplace_back(std::move(menu));
20 }
21}
22
23void MainMenuBar::AddOptionMenu(std::function<void()> menu) {
24 if (menu) {
25 m_optionMenus.emplace_back(std::move(menu));
26 }
27}
28
29void MainMenuBar::Display() {
30 ImGui::BeginMainMenuBar();
31
Austin Schuh75263e32022-02-22 18:05:32 -080032 WorkspaceMenu();
33
Austin Schuh812d0d12021-11-04 20:16:48 -070034 if (!m_optionMenus.empty()) {
35 if (ImGui::BeginMenu("Options")) {
36 for (auto&& menu : m_optionMenus) {
37 if (menu) {
38 menu();
39 }
40 }
41 ImGui::EndMenu();
42 }
43 }
44
45 wpi::gui::EmitViewMenu();
46
47 for (auto&& menu : m_menus) {
48 if (menu) {
49 menu();
50 }
51 }
52
53#if 0
54 char str[64];
55 std::snprintf(str, sizeof(str), "%.3f ms/frame (%.1f FPS)",
56 1000.0f / ImGui::GetIO().Framerate,
57 ImGui::GetIO().Framerate);
58 ImGui::SameLine(ImGui::GetWindowWidth() - ImGui::CalcTextSize(str).x -
59 10);
60 ImGui::Text("%s", str);
61#endif
62 ImGui::EndMainMenuBar();
63}
Austin Schuh75263e32022-02-22 18:05:32 -080064
65void MainMenuBar::WorkspaceMenu() {
66 if (ImGui::BeginMenu("Workspace")) {
67 if (ImGui::MenuItem("Open...")) {
68 m_openFolder =
69 std::make_unique<pfd::select_folder>("Choose folder to open");
70 }
71 if (ImGui::MenuItem("Save As...")) {
72 m_saveFolder = std::make_unique<pfd::select_folder>("Choose save folder");
73 }
74 if (ImGui::MenuItem("Save As Global", nullptr, false,
75 !gContext->isPlatformSaveDir)) {
76 SetStorageDir(wpi::gui::GetPlatformSaveFileDir());
77 SaveStorage();
78 }
79 ImGui::Separator();
80 if (ImGui::MenuItem("Reset")) {
81 WorkspaceReset();
82 }
83 ImGui::Separator();
84 if (ImGui::MenuItem("Exit")) {
85 wpi::gui::Exit();
86 }
87 ImGui::EndMenu();
88 }
89
90 if (m_openFolder && m_openFolder->ready(0)) {
91 auto result = m_openFolder->result();
92 if (!result.empty()) {
93 LoadStorage(result);
94 }
95 m_openFolder.reset();
96 }
97
98 if (m_saveFolder && m_saveFolder->ready(0)) {
99 auto result = m_saveFolder->result();
100 if (!result.empty()) {
101 SetStorageDir(result);
102 SaveStorage(result);
103 }
104 m_saveFolder.reset();
105 }
106}