summary refs log tree commit diff stats
path: root/tests
ModeNameSize
d---------actiontable44log stats plain
d---------alias38log stats plain
d---------align128log stats plain
d---------ambsym318log stats plain
d---------arc2453log stats plain
d---------arithm76log stats plain
d---------array397log stats plain
d---------assert244log stats plain
d---------assign177log stats plain
-rw-r--r--ast_pattern_matching.nim18808log stats plain blame
d---------astoverload45log stats plain
d---------astspec40log stats plain
d---------async2648log stats plain
d---------bind259log stats plain
d---------borrow85log stats plain
d---------casestmt417log stats plain
d---------ccgbugs3691log stats plain
d---------ccgbugs256log stats plain
d---------clearmsg199log stats plain
d---------closure807log stats plain
d---------cnstseq40log stats plain
d---------collections260log stats plain
d---------compilepragma70log stats plain
d---------compiler581log stats plain
d---------compilerapi162log stats plain
d---------compilerfeatures44log stats plain
d---------compiles185log stats plain
d---------concat39log stats plain
d---------concepts1501log stats plain
-rw-r--r--config.nims624log stats plain blame
d---------constr199log stats plain
d---------constraints44log stats plain
d---------constructors131log stats plain
d---------controlflow123log stats plain
d---------converter606log stats plain
d---------coroutines330log stats plain
d---------cpp1519log stats plain
d---------defaultprocparam98log stats plain
d---------deprecated202log stats plain
d---------deps148log stats plain
d---------destructor3202log stats plain
d---------dir with space76log stats plain
d---------discard232log stats plain
d---------distinct162log stats plain
d---------distros47log stats plain
d---------dll1075log stats plain
-rw-r--r--dummy.txt27log stats plain blame
d---------effects930log stats plain
d---------enum404log stats plain
d---------errmsgs2984log stats plain
d---------exception1046log stats plain
d---------exprs266log stats plain
d---------fields85log stats plain
d---------flags42log stats plain
d---------float483log stats plain
d---------fragmentation127log stats plain
d---------friends80log stats plain
d---------gc862log stats plain
d---------generics2653log stats plain
d---------gensym85log stats plain
d---------global204log stats plain
d---------ic79log stats plain
d---------implicit41log stats uiConfig := ml.conf.GetUiConfig(map[config.ContextType]string{ config.UI_CONTEXT_ACCOUNT: ml.aerc.SelectedAccount().AccountConfig().Name, config.UI_CONTEXT_FOLDER: ml.aerc.SelectedAccount().Directories().Selected(), config.UI_CONTEXT_SUBJECT: msg.Envelope.Subject, }) so := config.STYLE_MSGLIST_DEFAULT // deleted message if _, ok := store.Deleted[msg.Uid]; ok { so = config.STYLE_MSGLIST_DELETED } // unread message seen := false flagged := false for _, flag := range msg.Flags { switch flag { case models.SeenFlag: seen = true case models.FlaggedFlag: flagged = true } } if !seen { so = config.STYLE_MSGLIST_UNREAD } if flagged { so = config.STYLE_MSGLIST_FLAGGED } // marked message if store.IsMarked(msg.Uid) { so = config.STYLE_MSGLIST_MARKED } style := uiConfig.GetStyle(so) // current row if row == ml.store.SelectedIndex()-ml.scroll { style = uiConfig.GetStyleSelected(so) } ctx.Fill(0, row, ctx.Width(), 1, ' ', style) fmtStr, args, err := format.ParseMessageFormat( ml.aerc.SelectedAccount().acct.From, uiConfig.IndexFormat, uiConfig.TimestampFormat, "", i, msg, store.IsMarked(uid)) if err != nil { ctx.Printf(0, row, style, "%v", err) } else { line := fmt.Sprintf(fmtStr, args...) line = runewidth.Truncate(line, textWidth, "…") ctx.Printf(0, row, style, "%s", line) } row += 1 } if needScrollbar { scrollbarCtx := ctx.Subcontext(ctx.Width()-1, 0, 1, ctx.Height()) ml.drawScrollbar(scrollbarCtx, percentVisible) } if len(uids) == 0 { if store.Sorting { ml.spinner.Start() ml.spinner.Draw(ctx) return } else { ml.drawEmptyMessage(ctx) } } if len(needsHeaders) != 0 { store.FetchHeaders(needsHeaders, nil) ml.spinner.Start() } else { ml.spinner.Stop() } } func (ml *MessageList) drawScrollbar(ctx *ui.Context, percentVisible float64) { gutterStyle := tcell.StyleDefault pillStyle := tcell.StyleDefault.Reverse(true) // gutter ctx.Fill(0, 0, 1, ctx.Height(), ' ', gutterStyle) // pill pillSize := int(math.Ceil(float64(ctx.Height()) * percentVisible)) percentScrolled := float64(ml.scroll) / float64(len(ml.Store().Uids())) pillOffset := int(math.Floor(float64(ctx.Height()) * percentScrolled)) ctx.Fill(0, pillOffset, 1, pillSize, ' ', pillStyle) } func (ml *MessageList) MouseEvent(localX int, localY int, event tcell.Event) { switch event := event.(type) { case *tcell.EventMouse: switch event.Buttons() { case tcell.Button1: if ml.aerc == nil { return } selectedMsg, ok := ml.Clicked(localX, localY) if ok { ml.Select(selectedMsg) acct := ml.aerc.SelectedAccount() if acct.Messages().Empty() { return } store := acct.Messages().Store() msg := acct.Messages().Selected() if msg == nil { return } lib.NewMessageStoreView(msg, store, ml.aerc.DecryptKeys, func(view lib.MessageView, err error) { if err != nil { ml.aerc.PushError(err.Error()) return } viewer := NewMessageViewer(acct, ml.aerc.Config(), view) ml.aerc.NewTab(viewer, msg.Envelope.Subject) }) } case tcell.WheelDown: if ml.store != nil { ml.store.Next() } ml.Invalidate() case tcell.WheelUp: if ml.store != nil { ml.store.Prev() } ml.Invalidate() } } } func (ml *MessageList) Clicked(x, y int) (int, bool) { store := ml.Store() if store == nil || ml.nmsgs == 0 || y >= ml.nmsgs { return 0, false } return y + ml.scroll, true } func (ml *MessageList) Height() int { return ml.height } func (ml *MessageList) storeUpdate(store *lib.MessageStore) { if ml.Store() != store { return } uids := store.Uids() if len(uids) > 0 { // When new messages come in, advance the cursor accordingly // Note that this assumes new messages are appended to the top, which // isn't necessarily true once we implement SORT... ideally we'd look // for the previously selected UID. if len(uids) > ml.nmsgs && ml.nmsgs != 0 { for i := 0; i < len(uids)-ml.nmsgs; i++ { ml.Store().Next() } } if len(uids) < ml.nmsgs && ml.nmsgs != 0 { for i := 0; i < ml.nmsgs-len(uids); i++ { ml.Store().Prev() } } ml.nmsgs = len(uids) } ml.Invalidate() } func (ml *MessageList) SetStore(store *lib.MessageStore) { if ml.Store() != store { ml.scroll = 0 } ml.store = store if store != nil { ml.spinner.Stop() ml.nmsgs = len(store.Uids()) store.OnUpdate(ml.storeUpdate) } else { ml.spinner.Start() } ml.Invalidate() } func (ml *MessageList) SetInitDone() { ml.isInitalizing = false } func (ml *MessageList) Store() *lib.MessageStore { return ml.store } func (ml *MessageList) Empty() bool { store := ml.Store() return store == nil || len(store.Uids()) == 0 } func (ml *MessageList) Selected() *models.MessageInfo { store := ml.Store() uids := store.Uids() return store.Messages[uids[len(uids)-ml.store.SelectedIndex()-1]] } func (ml *MessageList) Select(index int) { store := ml.Store() store.Select(index) ml.Invalidate() } func (ml *MessageList) ensureScroll() { store := ml.Store() if store == nil || len(store.Uids()) == 0 { return } h := ml.Height() maxScroll := len(store.Uids()) - h if maxScroll < 0 { maxScroll = 0 } selectedIndex := store.SelectedIndex() if selectedIndex >= ml.scroll && selectedIndex < ml.scroll+h { if ml.scroll > maxScroll { ml.scroll = maxScroll } return } if selectedIndex >= ml.scroll+h { ml.scroll = selectedIndex - h + 1 } else if selectedIndex < ml.scroll { ml.scroll = selectedIndex } if ml.scroll > maxScroll { ml.scroll = maxScroll } } func (ml *MessageList) drawEmptyMessage(ctx *ui.Context) { uiConfig := ml.aerc.SelectedAccount().UiConfig() msg := uiConfig.EmptyMessage ctx.Printf((ctx.Width()/2)-(len(msg)/2), 0, uiConfig.GetStyle(config.STYLE_MSGLIST_DEFAULT), "%s", msg) }