summary refs log tree commit diff stats
path: root/compiler/msgs.nim
Commit message (Expand)AuthorAgeFilesLines
* rename gc to mm (#19971)flywind2022-07-051-1/+1
* move assertions out of system (#19599)flywind2022-03-231-0/+4
* [wip]better hint message for JS (#18704)flywind2021-08-181-10/+21
* added missing .inline for toCCharAraq2021-07-261-1/+1
* followup #18252: show special flags -d:danger, -d:release when given (#18451)Timothee Cour2021-07-081-0/+4
* refs #18278: do not gag fatal msgs (#18290)Timothee Cour2021-06-181-4/+11
* merge BuildMode into SuccessX, remove code duplication w drnim, add useful in...Timothee Cour2021-06-141-4/+39
* fixes #18058 (#18162)Andreas Rumpf2021-06-031-8/+4
* add astmsgs; add `declared in` msg for usage lint errors (#17961)Timothee Cour2021-05-081-2/+2
* fix #17853 (ascii message separator broke json nim dump) (#17887)Timothee Cour2021-04-291-0/+1
* add `--processing:dots|filenames|off` to customize `hintProcessing` (#17817)Timothee Cour2021-04-231-1/+1
* Revert localErrorNode param order changes (#17809)Clyybber2021-04-211-3/+0
* `--filenames:abs|canonical|legacyRelProj` for filenames in compiler msgs (rep...Timothee Cour2021-04-211-15/+9
* fix `hintMsgOrigin` regression + simplify msgs code (#17805)Timothee Cour2021-04-211-4/+1
* unit separator (#17730)Andreas Rumpf2021-04-201-26/+35
* IC navigator: added support for include files (#17784)Andreas Rumpf2021-04-191-0/+3
* -d:nimDebug: calls doAssert false instead of quit (#17739)Timothee Cour2021-04-171-1/+2
* IC: first steps towards 'nim check --def --ic:on' (#17714)Andreas Rumpf2021-04-141-1/+3
* nnkArglist => nnkArgList + special case stylecheck:error (#17529)Timothee Cour2021-03-271-3/+3
* IC: green tests (#17311)Andreas Rumpf2021-03-191-0/+26
* `--nilseqs` is now a deprecated noop (#17211)Timothee Cour2021-03-011-0/+3
* IC: next steps (#16729)Andreas Rumpf2021-01-231-1/+1
* `--hintAsError` (#16763)Timothee Cour2021-01-201-2/+6
* fix `hintProcessing` dots interference with `static:echo` and `hintCC`; add t...Timothee Cour2020-12-301-5/+7
* fix `nim secret` dots interfering with prompt (#16491)Timothee Cour2020-12-281-2/+2
* fix #16334 (#16335)RSDuck2020-12-141-5/+9
* fix #16265; fix #13999 (HCR on OSX); cgen now does not line wrap string litte...Timothee Cour2020-12-141-3/+5
* remove unused and misleading FilenameOption.foShort (#15982)Timothee Cour2020-11-161-2/+0
* Correct all eggs (#15906)Miran2020-11-101-4/+4
* new: `nim -e:cmd` to run a command directly; also fixes #15731 (#15687)Timothee Cour2020-11-091-0/+1
* Use modern enums in compiler (#15775)cooldome2020-11-021-3/+3
* Big compiler Cleanup (#14777)Clyybber2020-08-281-6/+3
* `hintMsgOrigin` now works in VM code (#14678)Timothee Cour2020-06-161-3/+3
* misc cleanups in compiler msgs: use toHumanStr, etc (#14677)Timothee Cour2020-06-151-3/+4
* fix #14545 windows CI docs (#14590)Timothee Cour2020-06-101-3/+15
* bug fixes with sfMainModule, hints, mainPackageNotes, mainPackageId, hintSucc...Timothee Cour2020-06-041-0/+2
* Change severity of template instantiation message [backport] (#14526)Danil Yarantsev2020-06-011-1/+1
* fixes --warningAsError implementation (#14538)Andreas Rumpf2020-06-011-1/+5
* fix #8871 runnableExamples now preserves source code comments, litterals, and...Timothee Cour2020-05-281-8/+15
* make it easier to figure out how to debug issues (#14477)Timothee Cour2020-05-281-3/+4
* fix #6583, fix #14376, index+search now generated for all projects, many bug ...Timothee Cour2020-05-251-1/+9
* no more code duplication bw liMessage and rawMessage + several bug fixes (#14...Timothee Cour2020-05-221-145/+79
* change the [Processing] messages into dots (#14418)Andreas Rumpf2020-05-211-6/+34
* no more guessing where compiler msgs came from (#14317)Timothee Cour2020-05-131-16/+32
* fix js stacktraces, unify all file,line,col formatting into a single function...Timothee Cour2020-05-051-29/+36
* fix https://github.com/timotheecour/Nim/issues/152: avoid writing spurious `^...Timothee Cour2020-05-041-4/+3
* new feature: ability to turn specific warnings to errorsAndreas Rumpf2020-04-041-3/+4
* properly handle note override logic/verbosity/config/cmdline using modifiedyN...Timothee Cour2020-02-271-4/+1
* remove isCmdLine; use passCmd1Timothee Cour2020-02-271-1/+1
* correctly honor cmdline --hint:conf:on/off ; correctly show Conf hints in orderTimothee Cour2020-02-271-1/+4
n>nmsgs int spinner *Spinner store *lib.MessageStore isInitalizing bool aerc *Aerc } func NewMessageList(conf *config.AercConfig, logger *log.Logger, aerc *Aerc) *MessageList { ml := &MessageList{ conf: conf, logger: logger, spinner: NewSpinner(&conf.Ui), isInitalizing: true, aerc: aerc, } ml.spinner.OnInvalidate(func(_ ui.Drawable) { ml.Invalidate() }) // TODO: stop spinner, probably ml.spinner.Start() return ml } func (ml *MessageList) Invalidate() { ml.DoInvalidate(ml) } func (ml *MessageList) Draw(ctx *ui.Context) { ml.height = ctx.Height() ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', ml.aerc.SelectedAccount().UiConfig().GetStyle(config.STYLE_MSGLIST_DEFAULT)) store := ml.Store() if store == nil { if ml.isInitalizing { ml.spinner.Draw(ctx) return } else { ml.spinner.Stop() ml.drawEmptyMessage(ctx) return } } ml.ensureScroll() needScrollbar := true percentVisible := float64(ctx.Height()) / float64(len(store.Uids())) if percentVisible >= 1.0 { needScrollbar = false } textWidth := ctx.Width() if needScrollbar { textWidth -= 1 } if textWidth < 0 { textWidth = 0 } var ( needsHeaders []uint32 row int = 0 ) uids := store.Uids() for i := len(uids) - 1 - ml.scroll; i >= 0; i-- { uid := uids[i] msg := store.Messages[uid] if row >= ctx.Height() { break } if msg == nil { needsHeaders = append(needsHeaders, uid) ml.spinner.Draw(ctx.Subcontext(0, row, textWidth, 1)) row += 1 continue } confParams := map[config.ContextType]string{ config.UI_CONTEXT_ACCOUNT: ml.aerc.SelectedAccount().AccountConfig().Name, config.UI_CONTEXT_FOLDER: ml.aerc.SelectedAccount().Directories().Selected(), } if msg.Envelope != nil { confParams[config.UI_CONTEXT_SUBJECT] = msg.Envelope.Subject } uiConfig := ml.conf.GetUiConfig(confParams) msg_styles := []config.StyleObject{} // 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 { msg_styles = append(msg_styles, config.STYLE_MSGLIST_READ) } else { msg_styles = append(msg_styles, config.STYLE_MSGLIST_UNREAD) } if flagged { msg_styles = append(msg_styles, config.STYLE_MSGLIST_FLAGGED) } // deleted message if _, ok := store.Deleted[msg.Uid]; ok { msg_styles = append(msg_styles, config.STYLE_MSGLIST_DELETED) } // marked message if store.IsMarked(msg.Uid) { msg_styles = append(msg_styles, config.STYLE_MSGLIST_MARKED) } var style tcell.Style // current row if row == ml.store.SelectedIndex()-ml.scroll { style = uiConfig.GetComposedStyleSelected(config.STYLE_MSGLIST_DEFAULT, msg_styles) } else { style = uiConfig.GetComposedStyle(config.STYLE_MSGLIST_DEFAULT, msg_styles) } ctx.Fill(0, row, ctx.Width(), 1, ' ', style) fmtStr, args, err := format.ParseMessageFormat( uiConfig.IndexFormat, uiConfig.TimestampFormat, uiConfig.ThisDayTimeFormat, uiConfig.ThisWeekTimeFormat, uiConfig.ThisYearTimeFormat, format.Ctx{ FromAddress: ml.aerc.SelectedAccount().acct.From, AccountName: ml.aerc.SelectedAccount().Name(), MsgInfo: msg, MsgNum: i, MsgIsMarked: 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) }