yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
status_bar.cc
Go to the documentation of this file.
2
3#include "absl/strings/str_format.h"
7#include "rom/rom.h"
8#include "imgui/imgui.h"
9
10namespace yaze {
11namespace editor {
12
14 context_ = context;
15 if (context_) {
17 [this](const StatusUpdateEvent& e) { HandleStatusUpdate(e); });
18 }
19}
20
22 switch (event.type) {
24 SetCursorPosition(event.x, event.y, event.text.empty() ? nullptr : event.text.c_str());
25 break;
27 SetSelection(event.count, event.width, event.height);
28 break;
30 SetZoom(event.zoom);
31 break;
33 SetEditorMode(event.text);
34 break;
37 break;
38 default:
39 break;
40 }
41}
42
43void StatusBar::SetSessionInfo(size_t session_id, size_t total_sessions) {
44 session_id_ = session_id;
45 total_sessions_ = total_sessions;
46}
47
48void StatusBar::SetCursorPosition(int x, int y, const char* label) {
49 has_cursor_ = true;
50 cursor_x_ = x;
51 cursor_y_ = y;
52 cursor_label_ = label ? label : "Pos";
53}
54
58
59void StatusBar::SetSelection(int count, int width, int height) {
60 has_selection_ = true;
61 selection_count_ = count;
62 selection_width_ = width;
63 selection_height_ = height;
64}
65
69
70void StatusBar::SetZoom(float level) {
71 has_zoom_ = true;
72 zoom_level_ = level;
73}
74
76 has_zoom_ = false;
77}
78
79void StatusBar::SetEditorMode(const std::string& mode) {
80 has_mode_ = true;
81 editor_mode_ = mode;
82}
83
85 has_mode_ = false;
86 editor_mode_.clear();
87}
88
89void StatusBar::SetCustomSegment(const std::string& key,
90 const std::string& value) {
91 custom_segments_[key] = value;
92}
93
94void StatusBar::ClearCustomSegment(const std::string& key) {
95 custom_segments_.erase(key);
96}
97
105
107 if (!enabled_) {
108 return;
109 }
110
111 const auto& theme = gui::ThemeManager::Get().GetCurrentTheme();
112 const ImGuiViewport* viewport = ImGui::GetMainViewport();
113
114 // Position at very bottom of viewport, outside the dockspace
115 // The dockspace is already reduced by GetBottomLayoutOffset() in controller.cc
116 const float bar_height = kStatusBarHeight;
117 const float bar_y = viewport->WorkPos.y + viewport->WorkSize.y - bar_height;
118
119 // Use full viewport width (status bar spans under sidebars for visual continuity)
120 ImGui::SetNextWindowPos(ImVec2(viewport->WorkPos.x, bar_y));
121 ImGui::SetNextWindowSize(ImVec2(viewport->WorkSize.x, bar_height));
122
123 ImGuiWindowFlags flags =
124 ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize |
125 ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse |
126 ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoScrollbar |
127 ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoFocusOnAppearing |
128 ImGuiWindowFlags_NoNavFocus | ImGuiWindowFlags_NoBringToFrontOnFocus;
129
130 // Status bar background - slightly elevated surface
131 ImVec4 bar_bg = gui::GetSurfaceContainerVec4();
132 ImVec4 bar_border = gui::GetOutlineVec4();
133
134 ImGui::PushStyleColor(ImGuiCol_WindowBg, bar_bg);
135 ImGui::PushStyleColor(ImGuiCol_Border, bar_border);
136 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(8.0f, 4.0f));
137 ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 1.0f);
138 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(8.0f, 0.0f));
139
140 if (ImGui::Begin("##StatusBar", nullptr, flags)) {
141 // Left section: ROM info, Session, Dirty status
143
144 if (total_sessions_ > 1) {
147 }
148
149 // Middle section: Editor context (cursor, selection)
150 if (has_cursor_) {
153 }
154
155 if (has_selection_) {
158 }
159
160 // Custom segments
162
163 // Right section: Zoom, Mode (right-aligned)
164 float right_section_width = 0.0f;
165 if (has_zoom_) {
166 right_section_width += ImGui::CalcTextSize("100%").x + 20.0f;
167 }
168 if (has_mode_) {
169 right_section_width += ImGui::CalcTextSize(editor_mode_.c_str()).x + 30.0f;
170 }
171
172 if (right_section_width > 0.0f) {
173 float available = ImGui::GetContentRegionAvail().x;
174 if (available > right_section_width + 20.0f) {
175 ImGui::SameLine(ImGui::GetWindowWidth() - right_section_width - 16.0f);
176
177 if (has_zoom_) {
179 if (has_mode_) {
181 }
182 }
183
184 if (has_mode_) {
186 }
187 }
188 }
189 }
190 ImGui::End();
191
192 ImGui::PopStyleVar(3);
193 ImGui::PopStyleColor(2);
194}
195
197 const auto& theme = gui::ThemeManager::Get().GetCurrentTheme();
198
199 if (rom_ && rom_->is_loaded()) {
200 // ROM name
201 ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetStyleColorVec4(ImGuiCol_Text));
202 ImGui::Text("%s %s", ICON_MD_DESCRIPTION, rom_->short_name().c_str());
203 ImGui::PopStyleColor();
204
205 // Dirty indicator
206 if (rom_->dirty()) {
207 ImGui::SameLine();
208 ImGui::PushStyleColor(ImGuiCol_Text, gui::ConvertColorToImVec4(theme.warning));
209 ImGui::Text(ICON_MD_FIBER_MANUAL_RECORD);
210 ImGui::PopStyleColor();
211
212 if (ImGui::IsItemHovered()) {
213 ImGui::SetTooltip("Unsaved changes");
214 }
215 }
216 } else {
217 ImGui::PushStyleColor(ImGuiCol_Text, gui::GetTextSecondaryVec4());
218 ImGui::Text("%s No ROM loaded", ICON_MD_DESCRIPTION);
219 ImGui::PopStyleColor();
220 }
221}
222
224 ImGui::PushStyleColor(ImGuiCol_Text, gui::GetTextSecondaryVec4());
225 ImGui::Text("%s S%zu/%zu", ICON_MD_LAYERS, session_id_ + 1, total_sessions_);
226 ImGui::PopStyleColor();
227
228 if (ImGui::IsItemHovered()) {
229 ImGui::SetTooltip("Session %zu of %zu", session_id_ + 1, total_sessions_);
230 }
231}
232
234 ImGui::PushStyleColor(ImGuiCol_Text, gui::GetTextSecondaryVec4());
235 ImGui::Text("%s: %d, %d", cursor_label_.c_str(), cursor_x_, cursor_y_);
236 ImGui::PopStyleColor();
237}
238
240 ImGui::PushStyleColor(ImGuiCol_Text, gui::GetTextSecondaryVec4());
241
242 if (selection_width_ > 0 && selection_height_ > 0) {
243 ImGui::Text("%s %d (%dx%d)", ICON_MD_SELECT_ALL, selection_count_,
245 } else if (selection_count_ > 0) {
246 ImGui::Text("%s %d selected", ICON_MD_SELECT_ALL, selection_count_);
247 }
248
249 ImGui::PopStyleColor();
250}
251
253 ImGui::PushStyleColor(ImGuiCol_Text, gui::GetTextSecondaryVec4());
254
255 int zoom_percent = static_cast<int>(zoom_level_ * 100.0f);
256 ImGui::Text("%s %d%%", ICON_MD_ZOOM_IN, zoom_percent);
257
258 ImGui::PopStyleColor();
259
260 if (ImGui::IsItemHovered()) {
261 ImGui::SetTooltip("Zoom: %d%%", zoom_percent);
262 }
263}
264
266 ImGui::PushStyleColor(ImGuiCol_Text, gui::GetTextSecondaryVec4());
267 ImGui::Text("%s", editor_mode_.c_str());
268 ImGui::PopStyleColor();
269}
270
272 for (const auto& [key, value] : custom_segments_) {
274 ImGui::PushStyleColor(ImGuiCol_Text, gui::GetTextSecondaryVec4());
275 ImGui::Text("%s: %s", key.c_str(), value.c_str());
276 ImGui::PopStyleColor();
277 }
278}
279
281 ImGui::SameLine();
282 ImGui::PushStyleColor(ImGuiCol_Text, gui::GetOutlineVec4());
283 ImGui::Text("|");
284 ImGui::PopStyleColor();
285 ImGui::SameLine();
286}
287
288} // namespace editor
289} // namespace yaze
290
HandlerId Subscribe(std::function< void(const T &)> handler)
Definition event_bus.h:22
bool dirty() const
Definition rom.h:129
auto short_name() const
Definition rom.h:143
bool is_loaded() const
Definition rom.h:128
static constexpr float kStatusBarHeight
Definition status_bar.h:154
void HandleStatusUpdate(const StatusUpdateEvent &event)
Definition status_bar.cc:21
GlobalEditorContext * context_
Definition status_bar.h:168
void SetSessionInfo(size_t session_id, size_t total_sessions)
Set session information.
Definition status_bar.cc:43
void ClearCursorPosition()
Clear cursor position (no cursor in editor)
Definition status_bar.cc:55
void SetSelection(int count, int width=0, int height=0)
Set selection information.
Definition status_bar.cc:59
void ClearZoom()
Clear zoom display.
Definition status_bar.cc:75
void SetCustomSegment(const std::string &key, const std::string &value)
Set a custom segment with key-value pair.
Definition status_bar.cc:89
void SetZoom(float level)
Set current zoom level.
Definition status_bar.cc:70
std::string cursor_label_
Definition status_bar.h:180
std::unordered_map< std::string, std::string > custom_segments_
Definition status_bar.h:197
void ClearSelection()
Clear selection info.
Definition status_bar.cc:66
void ClearEditorMode()
Clear editor mode display.
Definition status_bar.cc:84
void Initialize(GlobalEditorContext *context)
Definition status_bar.cc:13
void SetCursorPosition(int x, int y, const char *label="Pos")
Set cursor/mouse position in editor coordinates.
Definition status_bar.cc:48
void SetEditorMode(const std::string &mode)
Set the current editor mode or tool.
Definition status_bar.cc:79
void Draw()
Draw the status bar.
void ClearAllContext()
Clear all context (cursor, selection, zoom, mode, custom)
Definition status_bar.cc:98
void ClearCustomSegment(const std::string &key)
Remove a custom segment.
Definition status_bar.cc:94
const Theme & GetCurrentTheme() const
static ThemeManager & Get()
#define ICON_MD_LAYERS
Definition icons.h:1068
#define ICON_MD_DESCRIPTION
Definition icons.h:539
#define ICON_MD_ZOOM_IN
Definition icons.h:2194
#define ICON_MD_SELECT_ALL
Definition icons.h:1680
#define ICON_MD_FIBER_MANUAL_RECORD
Definition icons.h:739
ImVec4 ConvertColorToImVec4(const Color &color)
Definition color.h:23
ImVec4 GetTextSecondaryVec4()
ImVec4 GetOutlineVec4()
ImVec4 GetSurfaceContainerVec4()