an experimental irc client

paste-protection: small improvements

+55 -3
+29 -3
src/App.zig
··· 7 const base64 = std.base64.standard.Encoder; 8 const mem = std.mem; 9 10 const irc = @import("irc.zig"); 11 const lua = @import("lua.zig"); 12 ··· 1922 // Draw a modal dialog for how to handle multi-line paste 1923 const multiline_paste_win = vaxis.widgets.alignment.center(win, win.width - 10, win.height - 10); 1924 const bordered = vaxis.widgets.border.all(multiline_paste_win, .{}); 1925 var segs = [_]vaxis.Segment{ 1926 - .{ .text = "WARNING: multiline paste detected\n\n" }, 1927 .{ .text = self.paste_buffer.items }, 1928 }; 1929 - bordered.clear(); 1930 - _ = try bordered.print(&segs, .{ .wrap = .word }); 1931 } 1932 1933 self.state.buffers.count = row;
··· 7 const base64 = std.base64.standard.Encoder; 8 const mem = std.mem; 9 10 + const Button = @import("Button.zig"); 11 const irc = @import("irc.zig"); 12 const lua = @import("lua.zig"); 13 ··· 1923 // Draw a modal dialog for how to handle multi-line paste 1924 const multiline_paste_win = vaxis.widgets.alignment.center(win, win.width - 10, win.height - 10); 1925 const bordered = vaxis.widgets.border.all(multiline_paste_win, .{}); 1926 + bordered.clear(); 1927 + const warning_width: usize = 37; 1928 + const title_win = multiline_paste_win.child(.{ 1929 + .height = .{ .limit = 2 }, 1930 + .y_off = 1, 1931 + .x_off = multiline_paste_win.width / 2 - warning_width / 2, 1932 + }); 1933 + const title_seg = [_]vaxis.Segment{ 1934 + .{ 1935 + .text = "/!\\ Warning: Multiline paste detected", 1936 + .style = .{ 1937 + .fg = .{ .index = 3 }, 1938 + .bold = true, 1939 + }, 1940 + }, 1941 + }; 1942 + _ = try title_win.print(&title_seg, .{ .wrap = .none }); 1943 var segs = [_]vaxis.Segment{ 1944 .{ .text = self.paste_buffer.items }, 1945 }; 1946 + _ = try bordered.print(&segs, .{ .wrap = .word, .row_offset = 2 }); 1947 + const button: Button = .{ 1948 + .label = "Accept", 1949 + .style = .{ .bg = .{ .index = 7 } }, 1950 + }; 1951 + try button.draw(bordered.child(.{ 1952 + .x_off = 3, 1953 + .y_off = bordered.height - 4, 1954 + .height = .{ .limit = 3 }, 1955 + .width = .{ .limit = 10 }, 1956 + })); 1957 } 1958 1959 self.state.buffers.count = row;
+26
src/Button.zig
···
··· 1 + const vaxis = @import("vaxis"); 2 + 3 + const Button = @This(); 4 + 5 + label: []const u8, 6 + style: vaxis.Style = .{}, 7 + 8 + pub fn draw(self: Button, win: vaxis.Window) !void { 9 + win.fill(.{ 10 + .char = .{ 11 + .grapheme = " ", 12 + .width = 1, 13 + }, 14 + .style = self.style, 15 + }); 16 + const label_width = win.gwidth(self.label); 17 + const label_win = vaxis.widgets.alignment.center(win, label_width, 1); 18 + _ = try label_win.print(&.{.{ .text = self.label, .style = self.style }}, .{}); 19 + } 20 + 21 + pub fn clicked(_: Button, win: vaxis.Window, mouse: ?vaxis.Mouse) bool { 22 + if (win.hasMouse(mouse)) |m| { 23 + return m.button == .left and m.type == .press; 24 + } 25 + return false; 26 + }