|
|
@@ -738,6 +738,20 @@ void EditorCore::set_message(std::string msg, MessageSeverity severity) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ // Add to message history (except empty messages)
|
|
|
+ if (!msg.empty()) {
|
|
|
+ // Avoid adding duplicate consecutive messages
|
|
|
+ if (message_history_.empty() || message_history_.back() != msg) {
|
|
|
+ message_history_.push_back(msg);
|
|
|
+ // Keep history bounded
|
|
|
+ if (message_history_.size() > MAX_MESSAGE_HISTORY) {
|
|
|
+ message_history_.erase(message_history_.begin());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Reset history browsing when new message arrives
|
|
|
+ message_history_index_.reset();
|
|
|
+ }
|
|
|
+
|
|
|
last_message_ = std::move(msg);
|
|
|
last_message_severity_ = severity;
|
|
|
|
|
|
@@ -762,6 +776,10 @@ void EditorCore::set_message(std::string msg, MessageSeverity severity) {
|
|
|
}
|
|
|
|
|
|
void EditorCore::check_and_clear_message() {
|
|
|
+ // Don't auto-clear when browsing message history
|
|
|
+ if (message_history_index_.has_value()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
if (message_clear_time_.has_value() && std::chrono::steady_clock::now() > message_clear_time_.value()) {
|
|
|
last_message_.clear();
|
|
|
message_clear_time_.reset();
|
|
|
@@ -769,6 +787,78 @@ void EditorCore::check_and_clear_message() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void EditorCore::previous_message() {
|
|
|
+ if (message_history_.empty()) {
|
|
|
+ set_message("No message history");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!message_history_index_.has_value()) {
|
|
|
+ // Start browsing from the most recent message
|
|
|
+ message_history_index_ = message_history_.size() - 1;
|
|
|
+ } else if (*message_history_index_ > 0) {
|
|
|
+ // Move to older message
|
|
|
+ (*message_history_index_)--;
|
|
|
+ } else {
|
|
|
+ // Already at oldest message
|
|
|
+ set_message("Beginning of message history");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Display the message from history
|
|
|
+ last_message_ = message_history_[*message_history_index_];
|
|
|
+ last_message_severity_ = MessageSeverity::Info;
|
|
|
+ // Don't auto-clear when browsing history
|
|
|
+ message_clear_time_.reset();
|
|
|
+
|
|
|
+ // Add position indicator
|
|
|
+ std::string indicator = " [" + std::to_string(*message_history_index_ + 1) + "/" +
|
|
|
+ std::to_string(message_history_.size()) + ", M-n/M-p]";
|
|
|
+ last_message_ += indicator;
|
|
|
+
|
|
|
+ emit_event(EditorEvent::Message);
|
|
|
+}
|
|
|
+
|
|
|
+void EditorCore::next_message() {
|
|
|
+ if (message_history_.empty()) {
|
|
|
+ set_message("No message history");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!message_history_index_.has_value()) {
|
|
|
+ // Not browsing history, show most recent
|
|
|
+ message_history_index_ = message_history_.size() - 1;
|
|
|
+ } else if (*message_history_index_ < message_history_.size() - 1) {
|
|
|
+ // Move to newer message
|
|
|
+ (*message_history_index_)++;
|
|
|
+ } else {
|
|
|
+ // At most recent, exit history mode
|
|
|
+ exit_message_history();
|
|
|
+ set_message("End of message history");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Display the message from history
|
|
|
+ last_message_ = message_history_[*message_history_index_];
|
|
|
+ last_message_severity_ = MessageSeverity::Info;
|
|
|
+ // Don't auto-clear when browsing history
|
|
|
+ message_clear_time_.reset();
|
|
|
+
|
|
|
+ // Add position indicator
|
|
|
+ std::string indicator = " [" + std::to_string(*message_history_index_ + 1) + "/" +
|
|
|
+ std::to_string(message_history_.size()) + ", M-n/M-p]";
|
|
|
+ last_message_ += indicator;
|
|
|
+
|
|
|
+ emit_event(EditorEvent::Message);
|
|
|
+}
|
|
|
+
|
|
|
+void EditorCore::exit_message_history() {
|
|
|
+ message_history_index_.reset();
|
|
|
+ last_message_.clear();
|
|
|
+ message_clear_time_.reset();
|
|
|
+ emit_event(EditorEvent::TransientMessageCleared);
|
|
|
+}
|
|
|
+
|
|
|
void EditorCore::request_quit() {
|
|
|
emit_event(EditorEvent::Quit);
|
|
|
}
|