ui: change line_break meaning in write_string_to_grid

Change line_break parameter from bool flag (whether to break in the end
of a line or not) to an Option<usize>, where the value is the x_offset
of the left side of the area. Thus if line_break == Some(_) when a line
ends its value is set as x to continue in the next line properly.
jmap
Manos Pitsidianakis 2019-11-18 13:06:30 +02:00
parent fc2d9a684d
commit 995e70e009
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
15 changed files with 145 additions and 153 deletions

View File

@ -83,7 +83,7 @@ impl ContactManager {
Color::Default,
Attr::Default,
((0, 0), (width - 1, 0)),
false,
None,
);
let (x, y) = write_string_to_grid(
&self.card.last_edited(),
@ -92,7 +92,7 @@ impl ContactManager {
Color::Default,
Attr::Default,
((x, 0), (width - 1, 0)),
false,
None,
);
if self.card.external_resource() {
@ -106,7 +106,7 @@ impl ContactManager {
Color::Default,
Attr::Default,
((x, y), (width - 1, y)),
false,
None,
);
}

View File

@ -135,7 +135,7 @@ impl ContactList {
Color::White,
Attr::Bold,
((0, 0), (MAX_COLS - 1, self.length)),
false,
None,
);
write_string_to_grid(
"E-MAIL",
@ -144,7 +144,7 @@ impl ContactList {
Color::White,
Attr::Bold,
((0, 0), (MAX_COLS - 1, self.length)),
false,
None,
);
write_string_to_grid(
@ -154,7 +154,7 @@ impl ContactList {
Color::White,
Attr::Bold,
((0, 0), (MAX_COLS - 1, self.length)),
false,
None,
);
let account = &mut context.accounts[self.account_pos];
@ -169,7 +169,7 @@ impl ContactList {
Color::Default,
Attr::Default,
((0, idx + 1), (min_width.0, idx + 1)),
false,
None,
);
write_string_to_grid(
@ -179,7 +179,7 @@ impl ContactList {
Color::Default,
Attr::Default,
((0, idx + 1), (min_width.1, idx + 1)),
false,
None,
);
write_string_to_grid(
@ -189,7 +189,7 @@ impl ContactList {
Color::Default,
Attr::Default,
((0, idx + 1), (min_width.2, idx + 1)),
false,
None,
);
}
@ -208,7 +208,7 @@ impl ContactList {
Color::Default,
Attr::Default,
((0, 0), (MAX_COLS - 1, 0)),
false,
None,
);
return;
}
@ -273,7 +273,7 @@ impl ContactList {
if a.name.grapheme_len() + s.len() > width + 1 {
/* Print account name */
write_string_to_grid(&a.name, grid, fg_color, bg_color, Attr::Bold, area, false);
write_string_to_grid(&a.name, grid, fg_color, bg_color, Attr::Bold, area, None);
write_string_to_grid(
&s,
grid,
@ -287,7 +287,7 @@ impl ContactList {
),
bottom_right!(area),
),
false,
None,
);
write_string_to_grid(
"",
@ -302,12 +302,12 @@ impl ContactList {
),
bottom_right!(area),
),
false,
None,
);
} else {
/* Print account name */
write_string_to_grid(&a.name, grid, fg_color, bg_color, Attr::Bold, area, false);
write_string_to_grid(&a.name, grid, fg_color, bg_color, Attr::Bold, area, None);
write_string_to_grid(
&s,
grid,
@ -321,7 +321,7 @@ impl ContactList {
),
bottom_right!(area),
),
false,
None,
);
}
}

View File

@ -317,7 +317,7 @@ impl Composer {
Color::Default,
Attr::Default,
(pos_inc(upper_left!(area), (0, 1)), bottom_right!(area)),
false,
None,
);
} else {
write_string_to_grid(
@ -327,7 +327,7 @@ impl Composer {
Color::Default,
Attr::Default,
(pos_inc(upper_left!(area), (0, 1)), bottom_right!(area)),
false,
None,
);
}
if attachments_no == 0 {
@ -338,7 +338,7 @@ impl Composer {
Color::Default,
Attr::Default,
(pos_inc(upper_left!(area), (0, 2)), bottom_right!(area)),
false,
None,
);
} else {
write_string_to_grid(
@ -348,7 +348,7 @@ impl Composer {
Color::Default,
Attr::Default,
(pos_inc(upper_left!(area), (0, 2)), bottom_right!(area)),
false,
None,
);
for (i, a) in self.draft.attachments().iter().enumerate() {
if let Some(name) = a.content_type().name() {
@ -365,7 +365,7 @@ impl Composer {
Color::Default,
Attr::Default,
(pos_inc(upper_left!(area), (0, 3 + i)), bottom_right!(area)),
false,
None,
);
} else {
write_string_to_grid(
@ -375,7 +375,7 @@ impl Composer {
Color::Default,
Attr::Default,
(pos_inc(upper_left!(area), (0, 3 + i)), bottom_right!(area)),
false,
None,
);
}
}
@ -510,7 +510,7 @@ impl Component for Composer {
pos_dec(upper_left!(header_area), (0, 1)),
bottom_right!(header_area),
),
false,
None,
);
clear_area(grid, ((x, y), (set_y(bottom_right, y))));
change_colors(
@ -580,7 +580,7 @@ impl Component for Composer {
Color::Default,
Attr::Default,
body_area,
false,
None,
);
context.dirty_areas.push_back(body_area);
self.dirty = false;

View File

@ -234,7 +234,7 @@ impl Component for Listing {
Color::Default,
Attr::Default,
area,
false,
None,
);
context.dirty_areas.push_back(area);
return;
@ -258,7 +258,7 @@ impl Component for Listing {
Color::Default,
Attr::Default,
(set_x(upper_left, mid + 1), bottom_right),
false,
None,
);
context.dirty_areas.push_back(area);
return;
@ -892,7 +892,7 @@ impl Listing {
Color::Default,
Attr::Bold,
area,
false,
None,
);
if lines.is_empty() {
@ -903,7 +903,7 @@ impl Listing {
Color::Default,
Attr::Default,
(pos_inc(upper_left, (0, 1)), bottom_right),
false,
None,
);
return 0;
}
@ -950,7 +950,7 @@ impl Listing {
bg_color,
Attr::Default,
(set_y(upper_left, y), bottom_right),
false,
None,
);
let (x, _) = write_string_to_grid(
&" ".repeat(depth + 1),
@ -959,7 +959,7 @@ impl Listing {
bg_color,
Attr::Default,
((x, y), bottom_right),
false,
None,
);
let (x, _) = write_string_to_grid(
entries[&folder_idx].name(),
@ -968,7 +968,7 @@ impl Listing {
bg_color,
Attr::Default,
((x, y), bottom_right),
false,
None,
);
/* Unread message count */
@ -1000,7 +1000,7 @@ impl Listing {
),
bottom_right,
),
false,
None,
);
change_colors(grid, ((x, y), set_y(bottom_right, y)), fg_color, bg_color);
idx += 1;

View File

@ -442,7 +442,7 @@ impl ListingTrait for CompactListing {
Color::Default,
Attr::Default,
((0, 0), (message.len() - 1, 0)),
false,
None,
);
}
}
@ -562,7 +562,7 @@ impl CompactListing {
Color::Default,
Attr::Default,
((0, 0), (MAX_COLS - 1, 0)),
false,
None,
);
return;
}
@ -717,7 +717,7 @@ impl CompactListing {
bg_color,
Attr::Default,
((0, idx), (min_width.0, idx)),
false,
None,
);
for x in x..min_width.0 {
self.data_columns.columns[0][(x, idx)].set_bg(bg_color);
@ -729,7 +729,7 @@ impl CompactListing {
bg_color,
Attr::Default,
((0, idx), (min_width.1, idx)),
false,
None,
);
for x in x..min_width.1 {
self.data_columns.columns[1][(x, idx)].set_bg(bg_color);
@ -741,7 +741,7 @@ impl CompactListing {
bg_color,
Attr::Default,
((0, idx), (min_width.2, idx)),
false,
None,
);
for x in x..min_width.2 {
self.data_columns.columns[2][(x, idx)].set_bg(bg_color);
@ -753,7 +753,7 @@ impl CompactListing {
bg_color,
Attr::Default,
((0, idx), (min_width.3, idx)),
false,
None,
);
for x in x..min_width.3 {
self.data_columns.columns[3][(x, idx)].set_bg(bg_color);
@ -765,7 +765,7 @@ impl CompactListing {
bg_color,
Attr::Default,
((0, idx), (min_width.4, idx)),
false,
None,
);
for x in x..min_width.4 {
self.data_columns.columns[4][(x, idx)].set_bg(bg_color);
@ -806,7 +806,7 @@ impl CompactListing {
Color::Default,
Attr::Default,
((0, 0), (MAX_COLS - 1, 0)),
false,
None,
);
}
}
@ -961,6 +961,7 @@ impl Component for CompactListing {
}
let mut area = area;
if !self.filter_term.is_empty() {
let (upper_left, bottom_right) = area;
let (x, y) = write_string_to_grid(
&format!(
"{} results for `{}` (Press ESC to exit)",
@ -972,9 +973,8 @@ impl Component for CompactListing {
Color::Default,
Attr::Default,
area,
true,
Some(get_x(upper_left)),
);
let (upper_left, bottom_right) = area;
clear_area(grid, ((x, y), set_y(bottom_right, y)));
context
.dirty_areas

View File

@ -417,7 +417,7 @@ impl ListingTrait for ConversationsListing {
Color::Default,
Attr::Default,
((0, 0), (message.len() - 1, 0)),
false,
None,
);
}
}
@ -538,7 +538,7 @@ impl ConversationsListing {
Color::Default,
Attr::Default,
((0, 0), (message.len() - 1, 0)),
false,
None,
);
return;
}
@ -703,7 +703,7 @@ impl ConversationsListing {
bg_color,
Attr::Default,
((0, 3 * idx), (width - 1, 3 * idx)),
false,
None,
);
for x in x..(x + 3) {
self.content[(x, 3 * idx)].set_bg(bg_color);
@ -716,7 +716,7 @@ impl ConversationsListing {
bg_color,
Attr::Bold,
((x, 3 * idx), (width - 1, 3 * idx)),
false,
None,
);
for x in x..width {
self.content[(x, 3 * idx)].set_bg(bg_color);
@ -729,7 +729,7 @@ impl ConversationsListing {
bg_color,
Attr::Default,
((0, 3 * idx + 1), (width - 1, 3 * idx + 1)),
false,
None,
);
for x in x..(x + 4) {
self.content[(x, 3 * idx + 1)].set_ch('▁');
@ -743,7 +743,7 @@ impl ConversationsListing {
bg_color,
Attr::Default,
((x + 4, 3 * idx + 1), (width - 1, 3 * idx + 1)),
false,
None,
);
for x in x..width {
@ -768,7 +768,7 @@ impl ConversationsListing {
Color::Default,
Attr::Default,
((0, 0), (message.len() - 1, 0)),
false,
None,
);
}
}
@ -916,7 +916,7 @@ impl Component for ConversationsListing {
Color::Default,
Attr::Default,
area,
true,
Some(get_x(upper_left)),
);
clear_area(grid, ((x, y), set_y(bottom_right, y)));
context

View File

@ -417,7 +417,7 @@ impl ListingTrait for PlainListing {
Color::Default,
Attr::Default,
((0, 0), (message.len() - 1, 0)),
false,
None,
);
}
}
@ -517,7 +517,7 @@ impl PlainListing {
Color::Default,
Attr::Default,
((0, 0), (MAX_COLS - 1, 0)),
false,
None,
);
return;
}
@ -683,7 +683,7 @@ impl PlainListing {
bg_color,
Attr::Default,
((0, idx), (min_width.0, idx)),
false,
None,
);
for x in x..min_width.0 {
self.data_columns.columns[0][(x, idx)].set_bg(bg_color);
@ -695,7 +695,7 @@ impl PlainListing {
bg_color,
Attr::Default,
((0, idx), (min_width.1, idx)),
false,
None,
);
for x in x..min_width.1 {
self.data_columns.columns[1][(x, idx)].set_bg(bg_color);
@ -707,7 +707,7 @@ impl PlainListing {
bg_color,
Attr::Default,
((0, idx), (min_width.2, idx)),
false,
None,
);
for x in x..min_width.2 {
self.data_columns.columns[2][(x, idx)].set_bg(bg_color);
@ -719,7 +719,7 @@ impl PlainListing {
bg_color,
Attr::Default,
((0, idx), (min_width.3, idx)),
false,
None,
);
for x in x..min_width.3 {
self.data_columns.columns[3][(x, idx)].set_bg(bg_color);
@ -731,7 +731,7 @@ impl PlainListing {
bg_color,
Attr::Default,
((0, idx), (min_width.4, idx)),
false,
None,
);
for x in x..min_width.4 {
self.data_columns.columns[4][(x, idx)].set_bg(bg_color);
@ -760,7 +760,7 @@ impl PlainListing {
Color::Default,
Attr::Default,
((0, 0), (MAX_COLS - 1, 0)),
false,
None,
);
}
}
@ -827,6 +827,7 @@ impl Component for PlainListing {
}
let mut area = area;
if !self.filter_term.is_empty() {
let (upper_left, bottom_right) = area;
let (x, y) = write_string_to_grid(
&format!(
"{} results for `{}` (Press ESC to exit)",
@ -838,9 +839,8 @@ impl Component for PlainListing {
Color::Default,
Attr::Default,
area,
true,
Some(get_x(upper_left)),
);
let (upper_left, bottom_right) = area;
clear_area(grid, ((x, y), set_y(bottom_right, y)));
context
.dirty_areas

View File

@ -277,7 +277,7 @@ impl ThreadListing {
Color::Default,
Attr::Default,
((0, 0), (MAX_COLS - 1, 0)),
false,
None,
);
return;
}
@ -287,20 +287,22 @@ impl ThreadListing {
let threads = &account.collection.threads[&mailbox.folder.hash()];
self.length = threads.len();
self.content = CellBuffer::new(MAX_COLS, self.length + 1, Cell::with_char(' '));
self.locations.clear();
if self.length == 0 {
let message = format!("Folder `{}` is empty.", mailbox.folder.name());
self.content = CellBuffer::new(message.len(), 1, Cell::with_char(' '));
write_string_to_grid(
&format!("Folder `{}` is empty.", mailbox.folder.name()),
&message,
&mut self.content,
Color::Default,
Color::Default,
Attr::Default,
((0, 0), (MAX_COLS - 1, 0)),
true,
((0, 0), (message.len() - 1, 0)),
None,
);
return;
}
self.content = CellBuffer::new(MAX_COLS, self.length + 1, Cell::with_char(' '));
let mut indentations: Vec<bool> = Vec::with_capacity(6);
let mut thread_idx = 0; // needed for alternate thread colors
@ -347,7 +349,7 @@ impl ThreadListing {
bg_color,
Attr::Default,
((0, idx), (MAX_COLS - 1, idx)),
false,
None,
);
for x in x..MAX_COLS {

View File

@ -54,7 +54,7 @@ impl Component for StatusPanel {
Color::Default,
Attr::Bold,
((1, 1), (width - 1, height - 1)),
true,
Some(1),
);
let mut y = y + 1;
let work_controller = context.work_controller().threads.lock().unwrap();
@ -77,7 +77,7 @@ impl Component for StatusPanel {
Color::Default,
Attr::Default,
((1, y), (width - 1, height - 1)),
true,
Some(1),
);
for x in x..(width - 1) {
self.content[(x, y)].set_ch(' ');
@ -92,7 +92,7 @@ impl Component for StatusPanel {
Color::Default,
Attr::Bold,
((1, y + 1), (width - 1, height - 1)),
true,
Some(1),
);
y += 2;
@ -117,7 +117,7 @@ impl Component for StatusPanel {
Color::Default,
Attr::Default,
((1, y), (width - 1, height - 1)),
true,
Some(1),
);
for x in x..(width - 1) {
self.content[(x, y)].set_ch(' ');
@ -247,7 +247,7 @@ impl StatusPanel {
Color::Default,
Attr::Default,
((2, 10), (120 - 1, 10)),
true,
Some(2),
);
for (i, a) in context.accounts.iter().enumerate() {
@ -262,7 +262,7 @@ impl StatusPanel {
Color::Default,
Attr::Bold,
((3, 12 + i * 10), (120 - 2, 12 + i * 10)),
true,
Some(3),
);
write_string_to_grid(
" ▒██▒ ",
@ -271,7 +271,7 @@ impl StatusPanel {
Color::Default,
Attr::Default,
((x, y), (120 - 2, 12 + i * 10)),
true,
None,
);
write_string_to_grid(
&a.runtime_settings.account().identity,
@ -280,7 +280,7 @@ impl StatusPanel {
Color::Default,
Attr::Default,
((4, y + 2), (120 - 2, y + 2)),
true,
None,
);
if i == self.account_cursor {
for h in 1..8 {
@ -308,7 +308,7 @@ impl StatusPanel {
Color::Default,
Attr::Default,
((5, y + 3), (120 - 2, y + 3)),
true,
None,
);
column_width = std::cmp::max(
column_width,
@ -319,7 +319,7 @@ impl StatusPanel {
Color::Default,
Attr::Default,
((5, y + 4), (120 - 2, y + 4)),
true,
None,
)
.0,
);
@ -332,7 +332,7 @@ impl StatusPanel {
Color::Default,
Attr::Default,
((5, y + 5), (120 - 2, y + 5)),
true,
None,
)
.0,
);
@ -354,7 +354,7 @@ impl StatusPanel {
Color::Default,
Attr::Default,
((5 + column_width, y + 2), (120 - 2, y + 2)),
true,
None,
);
}
}
@ -380,7 +380,7 @@ impl Component for AccountStatus {
Color::Default,
Attr::Default,
((1, 1), (width - 1, height - 1)),
true,
None,
);
let mut capabilities = imap_backend.capabilities();
let max_name_width = std::cmp::max(
@ -394,7 +394,7 @@ impl Component for AccountStatus {
Color::Default,
Attr::Default,
((max_name_width + 6, 1), (width - 1, height - 1)),
true,
None,
);
capabilities.sort();
for (i, cap) in capabilities.into_iter().enumerate() {
@ -406,7 +406,7 @@ impl Component for AccountStatus {
Color::Default,
Attr::Default,
((1, 2 + i), (width - 1, height - 1)),
true,
None,
);
let (width, height) = self.content.size();
@ -418,7 +418,7 @@ impl Component for AccountStatus {
Color::Default,
Attr::Default,
((max_name_width + 6, 2 + i), (width - 1, height - 1)),
true,
None,
);
} else {
write_string_to_grid(
@ -428,7 +428,7 @@ impl Component for AccountStatus {
Color::Default,
Attr::Default,
((max_name_width + 6, 2 + i), (width - 1, height - 1)),
true,
None,
);
}
}

View File

@ -352,7 +352,7 @@ impl Component for MailView {
Color::Default,
Attr::Default,
area,
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, y)].set_ch(' ');
@ -366,7 +366,7 @@ impl Component for MailView {
Color::Default,
Attr::Default,
(set_y(upper_left, y + 1), bottom_right),
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, y)].set_ch(' ');
@ -380,7 +380,7 @@ impl Component for MailView {
Color::Default,
Attr::Default,
(set_y(upper_left, y + 1), bottom_right),
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, y)].set_ch(' ');
@ -394,7 +394,7 @@ impl Component for MailView {
Color::Default,
Attr::Default,
(set_y(upper_left, y + 1), bottom_right),
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, y)].set_ch(' ');
@ -408,7 +408,7 @@ impl Component for MailView {
Color::Default,
Attr::Default,
(set_y(upper_left, y + 1), bottom_right),
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, y)].set_ch(' ');
@ -423,7 +423,7 @@ impl Component for MailView {
Color::Default,
Attr::Default,
(set_y(upper_left, y + 1), bottom_right),
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, _y)].set_ch(' ');
@ -445,7 +445,7 @@ impl Component for MailView {
Color::Default,
Attr::Default,
(set_y(upper_left, _y + 1), bottom_right),
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, _y)].set_ch(' ');
@ -471,7 +471,7 @@ impl Component for MailView {
Color::Default,
Attr::Default,
(set_y(upper_left, y), bottom_right),
false,
None,
);
let (_x, _y) = write_string_to_grid(
id,
@ -480,7 +480,7 @@ impl Component for MailView {
Color::Default,
Attr::Default,
((_x, y), bottom_right),
false,
None,
);
x = _x;
if _y != y {
@ -496,13 +496,9 @@ impl Component for MailView {
Color::Default,
Attr::Default,
((x, y), bottom_right),
true,
Some(get_x(upper_left)),
);
x = _x;
if _y != y {
x = get_x(upper_left);
}
y = _y;
}
if archive.is_some() {
@ -513,12 +509,9 @@ impl Component for MailView {
Color::Default,
Attr::Default,
((x, y), bottom_right),
true,
Some(get_x(upper_left)),
);
x = _x;
if _y != y {
x = get_x(upper_left);
}
y = _y;
}
if post.is_some() {
@ -529,12 +522,9 @@ impl Component for MailView {
Color::Default,
Attr::Default,
((x, y), bottom_right),
true,
Some(get_x(upper_left)),
);
x = _x;
if _y != y {
x = get_x(upper_left);
}
y = _y;
}
if unsubscribe.is_some() {
@ -545,12 +535,9 @@ impl Component for MailView {
Color::Default,
Attr::Default,
((x, y), bottom_right),
true,
Some(get_x(upper_left)),
);
x = _x;
if _y != y {
x = get_x(upper_left);
}
y = _y;
}
if archive.is_some() || post.is_some() || unsubscribe.is_some() {

View File

@ -243,7 +243,7 @@ impl Component for EnvelopeView {
Color::Default,
Attr::Default,
area,
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, y)].set_ch(' ');
@ -257,7 +257,7 @@ impl Component for EnvelopeView {
Color::Default,
Attr::Default,
(set_y(upper_left, y + 1), bottom_right),
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, y)].set_ch(' ');
@ -271,7 +271,7 @@ impl Component for EnvelopeView {
Color::Default,
Attr::Default,
(set_y(upper_left, y + 1), bottom_right),
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, y)].set_ch(' ');
@ -285,7 +285,7 @@ impl Component for EnvelopeView {
Color::Default,
Attr::Default,
(set_y(upper_left, y + 1), bottom_right),
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, y)].set_ch(' ');
@ -299,7 +299,7 @@ impl Component for EnvelopeView {
Color::Default,
Attr::Default,
(set_y(upper_left, y + 1), bottom_right),
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, y)].set_ch(' ');

View File

@ -264,7 +264,7 @@ impl ThreadView {
(e.index.0 * 4 + 1, 2 * y),
(e.index.0 * 4 + e.heading.grapheme_width() + 1, height - 1),
),
true,
None,
);
{
let envelope: EnvelopeRef = context.accounts[self.coordinates.0]
@ -342,7 +342,7 @@ impl ThreadView {
(e.index.0 * 4 + 1, 2 * y),
(e.index.0 * 4 + e.heading.grapheme_width() + 1, height - 1),
),
false,
None,
);
{
let envelope: EnvelopeRef = context.accounts[self.coordinates.0]
@ -650,7 +650,7 @@ impl ThreadView {
Color::Default,
Attr::Default,
area,
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, y)].set_ch(' ');
@ -736,7 +736,7 @@ impl ThreadView {
Color::Default,
Attr::Default,
area,
true,
Some(get_x(upper_left)),
);
for x in x..=get_x(bottom_right) {
grid[(x, y)].set_ch(' ');

View File

@ -435,7 +435,7 @@ impl Pager {
Color::Default,
Attr::Default,
((0, i), (width.saturating_sub(1), i)),
true,
None,
);
}
}
@ -678,7 +678,7 @@ impl StatusBar {
Color::Byte(26),
Attr::Default,
area,
false,
None,
);
let offset = self.status.find('|').unwrap_or_else(|| self.status.len());
for x in get_x(upper_left!(area))..get_x(upper_left!(area)) + offset {
@ -697,7 +697,7 @@ impl StatusBar {
(std::cmp::max(x, width!(area).saturating_sub(n.len())), y),
bottom_right!(area),
),
false,
None,
);
} else {
self.cur_notification = None;
@ -715,7 +715,7 @@ impl StatusBar {
(std::cmp::max(x, width!(area).saturating_sub(n.len())), y),
bottom_right!(area),
),
false,
None,
);
self.cur_notification = Some((std::time::Instant::now(), n));
}
@ -742,7 +742,7 @@ impl StatusBar {
Color::Byte(88),
Attr::Default,
area,
false,
None,
);
grid[(x, y)].set_attrs(Attr::Underline);
change_colors(grid, area, Color::Byte(219), Color::Byte(88));
@ -927,7 +927,7 @@ impl Component for StatusBar {
),
bottom_right!(hist_area),
),
true,
Some(get_x(upper_left!(hist_area))),
);
write_string_to_grid(
&s.description,
@ -936,7 +936,7 @@ impl Component for StatusBar {
Color::Byte(174),
Attr::Default,
((x + 2, y), bottom_right!(hist_area)),
false,
None,
);
if y_offset + offset == self.auto_complete.cursor() {
change_colors(
@ -962,13 +962,13 @@ impl Component for StatusBar {
Attr::Default,
(
(
get_y(upper_left)
get_x(upper_left)
+ self.ex_buffer.as_str().split_graphemes().len(),
get_y(bottom_right) - height + 1,
),
set_y(bottom_right, get_y(bottom_right) - height + 1),
),
true,
None,
);
}
}
@ -1262,7 +1262,7 @@ impl Tabbed {
bg,
Attr::Default,
(set_x(upper_left, x), bottom_right!(area)),
false,
None,
);
x = x_ + 1;
if idx == self.pinned.saturating_sub(1) {
@ -1429,7 +1429,7 @@ impl Component for Tabbed {
Color::Default,
Attr::Default,
((2, 0), (max_width.saturating_sub(2), max_length - 1)),
false,
None,
);
}
let mut idx = 0;
@ -1441,7 +1441,7 @@ impl Component for Tabbed {
Color::Default,
Attr::Default,
((2, 2 + idx), (max_width.saturating_sub(2), max_length - 1)),
false,
None,
);
idx += 2;
let mut shortcuts = shortcuts.iter().collect::<Vec<_>>();
@ -1455,7 +1455,7 @@ impl Component for Tabbed {
Color::Default,
Attr::Default,
((2, 2 + idx), (max_width.saturating_sub(2), max_length - 1)),
false,
None,
);
write_string_to_grid(
&format!("{}", v),
@ -1464,7 +1464,7 @@ impl Component for Tabbed {
Color::Default,
Attr::Default,
((x + 2, y), (max_width.saturating_sub(2), max_length - 1)),
false,
None,
);
idx += 1;
}
@ -1720,7 +1720,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Component for Selector<T> {
Color::Default,
Attr::Default,
((3, c + 2), (width - 2, c + 2)),
false,
None,
);
} else {
write_string_to_grid(
@ -1730,7 +1730,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Component for Selector<T> {
Color::Default,
Attr::Default,
((3, c + 2), (width - 2, c + 2)),
false,
None,
);
}
self.dirty = true;
@ -1967,7 +1967,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Selector<T> {
Color::Default,
Attr::Default,
((0, 0), (width - 1, 0)),
false,
None,
);
let (x, _) = write_string_to_grid(
title,
@ -1976,7 +1976,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Selector<T> {
Color::Default,
Attr::Default,
((2, 0), (width - 1, 0)),
false,
None,
);
for i in 1..(width - title.len() - 1) {
write_string_to_grid(
@ -1986,7 +1986,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Selector<T> {
Color::Default,
Attr::Default,
((x + i, 0), (width - 1, 0)),
false,
None,
);
}
write_string_to_grid(
@ -1996,7 +1996,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Selector<T> {
Color::Default,
Attr::Default,
((width - 1, 0), (width - 1, 0)),
false,
None,
);
write_string_to_grid(
if ascii_drawing { "+" } else { "" },
@ -2005,7 +2005,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Selector<T> {
Color::Default,
Attr::Default,
((0, height - 1), (width - 1, height - 1)),
false,
None,
);
write_string_to_grid(
&if ascii_drawing {
@ -2018,7 +2018,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Selector<T> {
Color::Default,
Attr::Default,
((1, height - 1), (width - 2, height - 1)),
false,
None,
);
write_string_to_grid(
if ascii_drawing { "+" } else { "" },
@ -2027,7 +2027,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Selector<T> {
Color::Default,
Attr::Default,
((width - 1, height - 1), (width - 1, height - 1)),
false,
None,
);
for i in 1..height - 1 {
write_string_to_grid(
@ -2037,7 +2037,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Selector<T> {
Color::Default,
Attr::Default,
((0, i), (width - 1, i)),
false,
None,
);
write_string_to_grid(
if ascii_drawing { "|" } else { "" },
@ -2046,7 +2046,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Selector<T> {
Color::Default,
Attr::Default,
((width - 1, i), (width - 1, i)),
false,
None,
);
}
if single_only {
@ -2062,7 +2062,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Selector<T> {
},
Attr::Default,
((2, i + 2), (width - 1, i + 2)),
false,
None,
);
}
} else {
@ -2074,7 +2074,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Selector<T> {
Color::Default,
Attr::Default,
((2, i + 2), (width - 1, i + 2)),
false,
None,
);
if i == 0 {
content[(2, i + 2)].set_bg(Color::Byte(8));
@ -2092,7 +2092,7 @@ impl<T: PartialEq + Debug + Clone + Sync + Send> Selector<T> {
((width - "OK Cancel".len()) / 2, height - 3),
(width - 1, height - 3),
),
false,
None,
);
}
let mut identifiers: Vec<(T, bool)> =

View File

@ -120,7 +120,7 @@ impl Component for Field {
Color::Default,
Attr::Default,
area,
true,
None,
);
}
fn process_event(&mut self, event: &mut UIEvent, _context: &mut Context) -> bool {
@ -351,7 +351,7 @@ impl Component for FormWidget {
pos_inc(upper_left, (1, i)),
set_y(bottom_right, i + get_y(upper_left)),
),
false,
None,
);
/* draw field */
v.draw(
@ -595,7 +595,7 @@ where
pos_inc(upper_left, (len, 0)),
pos_inc(upper_left, (cur_len + len, 0)),
),
false,
None,
);
len += cur_len + 3;
}
@ -778,7 +778,7 @@ impl AutoComplete {
Color::Byte(7),
Attr::Default,
((0, i), (width - 1, i)),
false,
None,
);
write_string_to_grid(
&e.description,
@ -787,7 +787,7 @@ impl AutoComplete {
Color::Byte(7),
Attr::Default,
((x + 2, i), (width - 1, i)),
false,
None,
);
write_string_to_grid(
"",
@ -796,7 +796,7 @@ impl AutoComplete {
Color::Byte(7),
Attr::Default,
((width - 1, i), (width - 1, i)),
false,
None,
);
}
self.content = content;

View File

@ -770,8 +770,10 @@ macro_rules! inspect_bounds {
} else {
$x = get_x(upper_left);
$y += 1;
if !$line_break {
if $line_break.is_none() {
break;
} else {
$x = $line_break.unwrap();
}
}
}
@ -793,7 +795,8 @@ pub fn write_string_to_grid(
bg_color: Color,
attrs: Attr,
area: Area,
line_break: bool,
// The left-most x coordinate.
line_break: Option<usize>,
) -> Pos {
let bounds = grid.size();
let upper_left = upper_left!(area);