NCurses: refactor status line handling, and disambiguate status line from mode line
This commit is contained in:
parent
6f2c69a0eb
commit
254d43856d
|
@ -146,7 +146,7 @@ void NCursesUI::update_dimensions()
|
||||||
}
|
}
|
||||||
|
|
||||||
void NCursesUI::draw(const DisplayBuffer& display_buffer,
|
void NCursesUI::draw(const DisplayBuffer& display_buffer,
|
||||||
const String& status_line)
|
const String& mode_line)
|
||||||
{
|
{
|
||||||
LineCount line_index = 0;
|
LineCount line_index = 0;
|
||||||
for (const DisplayLine& line : display_buffer.lines())
|
for (const DisplayLine& line : display_buffer.lines())
|
||||||
|
@ -195,13 +195,15 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
|
||||||
}
|
}
|
||||||
|
|
||||||
set_color(Color::Cyan, Color::Black);
|
set_color(Color::Cyan, Color::Black);
|
||||||
static int last_status_length = 0;
|
draw_status();
|
||||||
move((int)m_dimensions.line, (int)(m_dimensions.column - last_status_length));
|
CharCount status_len = mode_line.char_length();
|
||||||
clrtoeol();
|
// only draw mode_line if it does not overlap one status line
|
||||||
move((int)m_dimensions.line, (int)(m_dimensions.column - status_line.char_length()));
|
if (m_dimensions.column - m_status_line.char_length() > status_len + 1)
|
||||||
addstr(status_line.c_str());
|
{
|
||||||
last_status_length = (int)status_line.length();
|
move((int)m_dimensions.line, (int)(m_dimensions.column - status_len));
|
||||||
|
addutf8str(Utf8Iterator(mode_line.begin()),
|
||||||
|
Utf8Iterator(mode_line.end()));
|
||||||
|
}
|
||||||
redraw(m_menu_win);
|
redraw(m_menu_win);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,25 +261,31 @@ Key NCursesUI::get_key()
|
||||||
return Key::Invalid;
|
return Key::Invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NCursesUI::print_status(const String& status, CharCount cursor_pos)
|
void NCursesUI::draw_status()
|
||||||
{
|
{
|
||||||
int x,y;
|
move((int)m_dimensions.line, 0);
|
||||||
getmaxyx(stdscr, y, x);
|
|
||||||
move(y-1, 0);
|
|
||||||
clrtoeol();
|
clrtoeol();
|
||||||
if (cursor_pos == -1)
|
if (m_status_cursor == -1)
|
||||||
addutf8str(status.begin(), status.end());
|
addutf8str(m_status_line.begin(), m_status_line.end());
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto cursor_it = utf8::advance(status.begin(), status.end(), (int)cursor_pos);
|
auto cursor_it = utf8::advance(m_status_line.begin(), m_status_line.end(),
|
||||||
auto end = status.end();
|
(int)m_status_cursor);
|
||||||
addutf8str(status.begin(), cursor_it);
|
auto end = m_status_line.end();
|
||||||
|
addutf8str(m_status_line.begin(), cursor_it);
|
||||||
set_attribute(A_REVERSE, 1);
|
set_attribute(A_REVERSE, 1);
|
||||||
addch((cursor_it == end) ? ' ' : utf8::codepoint<Utf8Policy>(cursor_it));
|
addch((cursor_it == end) ? ' ' : utf8::codepoint<Utf8Policy>(cursor_it));
|
||||||
set_attribute(A_REVERSE, 0);
|
set_attribute(A_REVERSE, 0);
|
||||||
if (cursor_it != end)
|
if (cursor_it != end)
|
||||||
addutf8str(utf8::next(cursor_it), end);
|
addutf8str(utf8::next(cursor_it), end);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void NCursesUI::print_status(const String& status, CharCount cursor_pos)
|
||||||
|
{
|
||||||
|
m_status_line = status;
|
||||||
|
m_status_cursor = cursor_pos;
|
||||||
|
draw_status();
|
||||||
redraw(m_menu_win);
|
redraw(m_menu_win);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ public:
|
||||||
NCursesUI& operator=(const NCursesUI&) = delete;
|
NCursesUI& operator=(const NCursesUI&) = delete;
|
||||||
|
|
||||||
void draw(const DisplayBuffer& display_buffer,
|
void draw(const DisplayBuffer& display_buffer,
|
||||||
const String& status_line) override;
|
const String& mode_line) override;
|
||||||
void print_status(const String& status, CharCount cursor_pos) override;
|
void print_status(const String& status, CharCount cursor_pos) override;
|
||||||
|
|
||||||
bool is_key_available() override;
|
bool is_key_available() override;
|
||||||
|
@ -38,6 +38,10 @@ private:
|
||||||
DisplayCoord m_dimensions;
|
DisplayCoord m_dimensions;
|
||||||
void update_dimensions();
|
void update_dimensions();
|
||||||
|
|
||||||
|
String m_status_line;
|
||||||
|
CharCount m_status_cursor = -1;
|
||||||
|
void draw_status();
|
||||||
|
|
||||||
MENU* m_menu = nullptr;
|
MENU* m_menu = nullptr;
|
||||||
WINDOW* m_menu_win = nullptr;
|
WINDOW* m_menu_win = nullptr;
|
||||||
std::vector<ITEM*> m_items;
|
std::vector<ITEM*> m_items;
|
||||||
|
@ -46,7 +50,6 @@ private:
|
||||||
DisplayCoord m_menu_pos;
|
DisplayCoord m_menu_pos;
|
||||||
DisplayCoord m_menu_size;
|
DisplayCoord m_menu_size;
|
||||||
|
|
||||||
|
|
||||||
int m_menu_fg;
|
int m_menu_fg;
|
||||||
int m_menu_bg;
|
int m_menu_bg;
|
||||||
};
|
};
|
||||||
|
|
|
@ -183,12 +183,12 @@ void RemoteUI::menu_hide()
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoteUI::draw(const DisplayBuffer& display_buffer,
|
void RemoteUI::draw(const DisplayBuffer& display_buffer,
|
||||||
const String& status_line)
|
const String& mode_line)
|
||||||
{
|
{
|
||||||
Message msg(m_socket);
|
Message msg(m_socket);
|
||||||
write(msg, RemoteUIMsg::Draw);
|
write(msg, RemoteUIMsg::Draw);
|
||||||
write(msg, display_buffer);
|
write(msg, display_buffer);
|
||||||
write(msg, status_line);
|
write(msg, mode_line);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const Key::Modifiers resize_modifier = (Key::Modifiers)0x80;
|
static const Key::Modifiers resize_modifier = (Key::Modifiers)0x80;
|
||||||
|
@ -260,8 +260,8 @@ void RemoteClient::process_next_message()
|
||||||
case RemoteUIMsg::Draw:
|
case RemoteUIMsg::Draw:
|
||||||
{
|
{
|
||||||
DisplayBuffer display_buffer = read<DisplayBuffer>(m_socket);
|
DisplayBuffer display_buffer = read<DisplayBuffer>(m_socket);
|
||||||
String status_line = read<String>(m_socket);
|
String mode_line = read<String>(m_socket);
|
||||||
m_ui->draw(display_buffer, status_line);
|
m_ui->draw(display_buffer, mode_line);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ public:
|
||||||
void menu_select(int selected) override;
|
void menu_select(int selected) override;
|
||||||
void menu_hide() override;
|
void menu_hide() override;
|
||||||
void draw(const DisplayBuffer& display_buffer,
|
void draw(const DisplayBuffer& display_buffer,
|
||||||
const String& status_line) override;
|
const String& mode_line) override;
|
||||||
|
|
||||||
bool is_key_available() override;
|
bool is_key_available() override;
|
||||||
Key get_key() override;
|
Key get_key() override;
|
||||||
|
|
|
@ -29,7 +29,7 @@ public:
|
||||||
virtual void menu_select(int selected) = 0;
|
virtual void menu_select(int selected) = 0;
|
||||||
virtual void menu_hide() = 0;
|
virtual void menu_hide() = 0;
|
||||||
virtual void draw(const DisplayBuffer& display_buffer,
|
virtual void draw(const DisplayBuffer& display_buffer,
|
||||||
const String& status_line) = 0;
|
const String& mode_line) = 0;
|
||||||
virtual DisplayCoord dimensions() = 0;
|
virtual DisplayCoord dimensions() = 0;
|
||||||
virtual bool is_key_available() = 0;
|
virtual bool is_key_available() = 0;
|
||||||
virtual Key get_key() = 0;
|
virtual Key get_key() = 0;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user