summaryrefslogtreecommitdiff
path: root/src/client.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-09-16 19:15:13 +0100
committerMaxime Coste <frrrwww@gmail.com>2013-09-16 19:15:13 +0100
commit06e06d6ea67f10ececd7232471505e7d8f36d509 (patch)
tree478b39028f534bb6b89b16ffcffa54c83c61b3c2 /src/client.cc
parent49903523a7f28c18d324bf605876b9d18a97047b (diff)
remove print_status from UserInterface, pass status line to draw
Client store the current status line. This way calls to print status do not force the user interface to display directly.
Diffstat (limited to 'src/client.cc')
-rw-r--r--src/client.cc55
1 files changed, 49 insertions, 6 deletions
diff --git a/src/client.cc b/src/client.cc
index aabe52eb..08ae32c7 100644
--- a/src/client.cc
+++ b/src/client.cc
@@ -182,7 +182,7 @@ public:
if (key == Key(Key::Modifiers::Control, 'm'))
{
context().ui().menu_hide();
- context().ui().print_status(DisplayLine{});
+ context().print_status(DisplayLine{});
reset_normal_mode();
int selected = m_selected - m_choices.begin();
m_callback(selected, MenuEvent::Validate, context());
@@ -195,7 +195,7 @@ public:
m_edit_filter = false;
m_filter = boost::regex(".*");
m_filter_editor.reset("");
- context().ui().print_status(DisplayLine{});
+ context().print_status(DisplayLine{});
}
else
{
@@ -246,7 +246,7 @@ public:
{
auto display_line = m_filter_editor.build_display_line();
display_line.insert(display_line.begin(), { "filter:"_str, get_color("Prompt") });
- context().ui().print_status(display_line);
+ context().print_status(display_line);
}
}
@@ -320,7 +320,7 @@ public:
history.erase(it);
history.push_back(line);
}
- context().ui().print_status(DisplayLine{});
+ context().print_status(DisplayLine{});
context().ui().menu_hide();
reset_normal_mode();
// call callback after reset_normal_mode so that callback
@@ -330,7 +330,7 @@ public:
}
else if (key == Key::Escape or key == Key { Key::Modifiers::Control, 'c' })
{
- context().ui().print_status(DisplayLine{});
+ context().print_status(DisplayLine{});
context().ui().menu_hide();
reset_normal_mode();
m_callback(line, PromptEvent::Abort, context());
@@ -453,7 +453,7 @@ private:
{
auto display_line = m_line_editor.build_display_line();
display_line.insert(display_line.begin(), { m_prompt, m_prompt_colors });
- context().ui().print_status(display_line);
+ context().print_status(display_line);
}
PromptCallback m_callback;
@@ -1019,4 +1019,47 @@ void Client::stop_recording()
m_recording_reg = 0;
}
+void Client::print_status(DisplayLine status_line)
+{
+ m_status_line = std::move(status_line);
+ m_context.window().forget_timestamp();
+}
+
+static DisplayLine generate_mode_line(Client& client)
+{
+ auto& context = client.context();
+ auto pos = context.editor().main_selection().last();
+ auto col = context.buffer()[pos.line].char_count_to(pos.column);
+
+ std::ostringstream oss;
+ oss << context.buffer().display_name()
+ << " " << (int)pos.line+1 << ":" << (int)col+1;
+ if (context.buffer().is_modified())
+ oss << " [+]";
+ if (context.client().is_recording())
+ oss << " [recording]";
+ if (context.buffer().flags() & Buffer::Flags::New)
+ oss << " [new file]";
+ oss << " [" << context.editor().selections().size() << " sel]";
+ if (context.editor().is_editing())
+ oss << " [insert]";
+ oss << " - " << client.name();
+ return { oss.str(), get_color("StatusLine") };
+}
+
+void Client::redraw_ifn()
+{
+ if (m_context.window().timestamp() != m_context.buffer().timestamp())
+ {
+ DisplayCoord dimensions = m_context.ui().dimensions();
+ if (dimensions == DisplayCoord{0,0})
+ return;
+ m_context.window().set_dimensions(dimensions);
+ m_context.window().update_display_buffer();;
+
+ m_context.ui().draw(m_context.window().display_buffer(),
+ m_status_line, generate_mode_line(*this));
+ }
+}
+
}