diff options
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/msgviewer.go | 52 | ||||
-rw-r--r-- | widgets/msgviewer_test.go | 68 |
2 files changed, 19 insertions, 101 deletions
diff --git a/widgets/msgviewer.go b/widgets/msgviewer.go index c94d57a3..41cb639e 100644 --- a/widgets/msgviewer.go +++ b/widgets/msgviewer.go @@ -422,18 +422,32 @@ func (ps *PartSwitcher) Draw(ctx *ui.Context) { ps.parts[ps.selected].Draw(ctx) return } + + var styleSwitcher, styleFile, styleMime tcell.Style + // TODO: cap height and add scrolling for messages with many parts ps.height = ctx.Height() y := ctx.Height() - height for i, part := range ps.parts { - style := ps.mv.uiConfig.GetStyle(config.STYLE_DEFAULT) if ps.selected == i { - style = ps.mv.uiConfig.GetStyleSelected(config.STYLE_DEFAULT) + styleSwitcher = ps.mv.uiConfig.GetStyleSelected(config.STYLE_PART_SWITCHER) + styleFile = ps.mv.uiConfig.GetStyleSelected(config.STYLE_PART_FILENAME) + styleMime = ps.mv.uiConfig.GetStyleSelected(config.STYLE_PART_MIMETYPE) + } else { + styleSwitcher = ps.mv.uiConfig.GetStyle(config.STYLE_PART_SWITCHER) + styleFile = ps.mv.uiConfig.GetStyle(config.STYLE_PART_FILENAME) + styleMime = ps.mv.uiConfig.GetStyle(config.STYLE_PART_MIMETYPE) } - ctx.Fill(0, y+i, ctx.Width(), 1, ' ', style) + ctx.Fill(0, y+i, ctx.Width(), 1, ' ', styleSwitcher) left := len(part.index) * 2 - name := formatMessagePart(part.part.FullMIMEType(), part.part.FileName(), ctx.Width()-left) - ctx.Printf(left, y+i, style, "%s", name) + if part.part.FileName() != "" { + name := runewidth.Truncate(part.part.FileName(), + ctx.Width()-left-1, "…") + left += ctx.Printf(left, y+i, styleFile, "%s ", name) + } + t := "(" + part.part.FullMIMEType() + ")" + t = runewidth.Truncate(t, ctx.Width()-left, "…") + ctx.Printf(left, y+i, styleMime, "%s", t) } ps.parts[ps.selected].Draw(ctx.Subcontext( 0, 0, ctx.Width(), ctx.Height()-height)) @@ -500,34 +514,6 @@ func (ps *PartSwitcher) Cleanup() { } } -func formatMessagePart(mime, filename string, width int) string { - lname := runewidth.StringWidth(filename) - lmime := runewidth.StringWidth(mime) - - switch { - case width <= 0: - return "" - - case filename == "": - return runewidth.Truncate(mime, width, "…") - - case lname+lmime+3 <= width: - // simple scenario - everything fits - return fmt.Sprintf("%s (%s)", - runewidth.FillRight(filename, width-lmime-3), mime) - - case lname+3 < width: - // file name fits + we have space for parentheses and at least - // one symbol of mime - return fmt.Sprintf("%s (%s)", filename, - runewidth.Truncate(mime, width-lname-3, "…")) - - default: - // ok, we don't have space even for the file name - return runewidth.Truncate(filename, width, "…") - } -} - func (mv *MessageViewer) Event(event tcell.Event) bool { return mv.switcher.Event(event) } diff --git a/widgets/msgviewer_test.go b/widgets/msgviewer_test.go deleted file mode 100644 index f6d01edb..00000000 --- a/widgets/msgviewer_test.go +++ /dev/null @@ -1,68 +0,0 @@ -package widgets - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestFormatMessageNoFilename(t *testing.T) { - assert.Equal(t, "mime/type", formatMessagePart("mime/type", "", 24)) - assert.Equal(t, "m/type", formatMessagePart("m/type", "", 24)) - assert.Equal(t, "2", formatMessagePart("2", "", 24)) - assert.Equal(t, "2", formatMessagePart("2", "", 20)) -} - -func TestFormatMessageNoFilenameNotEnoguhSpace(t *testing.T) { - assert.Equal(t, "mime/type", formatMessagePart("mime/type", "", 24)) - assert.Equal(t, "mime/type", formatMessagePart("mime/type", "", 9)) - assert.Equal(t, "mime/ty…", formatMessagePart("mime/type", "", 8)) - assert.Equal(t, "mime/…", formatMessagePart("mime/type", "", 6)) - assert.Equal(t, "m…", formatMessagePart("mime/type", "", 2)) - assert.Equal(t, "…", formatMessagePart("mime/type", "", 1)) - - assert.Equal(t, "", formatMessagePart("mime/type", "", 0)) - assert.Equal(t, "", formatMessagePart("mime/type", "", -1)) - assert.Equal(t, "", formatMessagePart("mime/type", "", -10)) -} - -func TestFormatMessagePartSimpleCases(t *testing.T) { - assert.Equal(t, "filename.doc (mime/type)", formatMessagePart("mime/type", "filename.doc", 24)) - assert.Equal(t, "имяфайла.док (mime/type)", formatMessagePart("mime/type", "имяфайла.док", 24)) - assert.Equal(t, "file.doc (m/type)", formatMessagePart("m/type", "file.doc", 24)) - assert.Equal(t, "1 (2)", formatMessagePart("2", "1", 24)) - assert.Equal(t, "1 (2)", formatMessagePart("2", "1", 20)) - assert.Equal(t, "1 (2)", formatMessagePart("2", "1", 5)) -} - -func TestFormatMessagePartNotEnoughSpaceForMime(t *testing.T) { - assert.Equal(t, "filename.doc (mime/type)", formatMessagePart("mime/type", "filename.doc", 30)) - assert.Equal(t, "filename.doc (mime/type)", formatMessagePart("mime/type", "filename.doc", 25)) - assert.Equal(t, "filename.doc (mime/type)", formatMessagePart("mime/type", "filename.doc", 24)) - assert.Equal(t, "filename.doc (mime/ty…)", formatMessagePart("mime/type", "filename.doc", 23)) - assert.Equal(t, "имяфайла.док (mime/ty…)", formatMessagePart("mime/type", "имяфайла.док", 23)) - assert.Equal(t, "filename.doc (m…)", formatMessagePart("mime/type", "filename.doc", 17)) - assert.Equal(t, "filename.doc (…)", formatMessagePart("mime/type", "filename.doc", 16)) - assert.Equal(t, "имяфайла.док (…)", formatMessagePart("mime/type", "имяфайла.док", 16)) - assert.Equal(t, "filename.doc", formatMessagePart("mime/type", "filename.doc", 15)) - assert.Equal(t, "filename.doc", formatMessagePart("mime/type", "filename.doc", 14)) - assert.Equal(t, "filename.doc", formatMessagePart("mime/type", "filename.doc", 13)) - assert.Equal(t, "filename.doc", formatMessagePart("mime/type", "filename.doc", 12)) - assert.Equal(t, "имяфайла.док", formatMessagePart("mime/type", "имяфайла.док", 12)) -} - -func TestFormatMessagePartNotEnoughSpaceForFilename(t *testing.T) { - assert.Equal(t, "filename.d…", formatMessagePart("mime/type", "filename.doc", 11)) - assert.Equal(t, "filename…", formatMessagePart("mime/type", "filename.doc", 9)) - assert.Equal(t, "f…", formatMessagePart("mime/type", "filename.doc", 2)) - assert.Equal(t, "…", formatMessagePart("mime/type", "filename.doc", 1)) - - assert.Equal(t, "", formatMessagePart("mime/type", "filename.doc", 0)) - assert.Equal(t, "", formatMessagePart("mime/type", "filename.doc", -1)) - assert.Equal(t, "", formatMessagePart("mime/type", "filename.doc", -10)) - - assert.Equal(t, "имяфайла.д…", formatMessagePart("mime/type", "имяфайла.док", 11)) - assert.Equal(t, "имяфайла…", formatMessagePart("mime/type", "имяфайла.док", 9)) - assert.Equal(t, "и…", formatMessagePart("mime/type", "имяфайла.док", 2)) - assert.Equal(t, "…", formatMessagePart("mime/type", "имяфайла.док", 1)) -} |