mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-11-11 18:32:20 +08:00
488dff0f90
Converted all references of global atom to NylasEnv Temporary rename atom.io find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.io/temporaryAtomIoReplacement/g' atom.config to NylasEnv.config find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.config/NylasEnv.config/g' atom.packages -> NylasEnv.packages atom.commands -> NylasEnv.commands atom.getLoadSettings find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.commands/NylasEnv.commands/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.getLoadSettings/NylasEnv.getLoadSettings/g' More common atom methods find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.styles/NylasEnv.styles/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.emitError/NylasEnv.emitError/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.inSpecMode/NylasEnv.inSpecMode/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.inDevMode/NylasEnv.inDevMode/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.getWindowType/NylasEnv.getWindowType/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.displayWindow/NylasEnv.displayWindow/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.quit/NylasEnv.quit/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.close/NylasEnv.close/g' More atom method changes find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.keymaps/NylasEnv.keymaps/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.hide/NylasEnv.hide/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.getCurrentWindow/NylasEnv.getCurrentWindow/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.menu/NylasEnv.menu/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.getConfigDirPath/NylasEnv.getConfigDirPath/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.isMainWindow/NylasEnv.isMainWindow/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.finishUnload/NylasEnv.finishUnload/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.isWorkWindow/NylasEnv.isWorkWindow/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.showSaveDialog/NylasEnv.showSaveDialog/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.append/NylasEnv.append/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.confirm/NylasEnv.confirm/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.clipboard/NylasEnv.clipboard/g' find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed -i "" 's/atom.getVersion/NylasEnv.getVersion/g' More atom renaming Rename atom methods More atom methods Fix grunt config variable Change atom.cmd to N1.cmd Rename atom.coffee and atom.js to nylas-env.coffee nylas-env.js Fix atom global reference in specs manually Fix atom requires Change engine from atom to nylas got rid of global/nylas-env rename to nylas-win-bootup Fix onWindowPropsChanged to onWindowPropsReceived fix nylas-workspace atom-text-editor to nylas-theme-wrap atom-text-editor -> nylas-theme-wrap Replacing atom keyword AtomWindow -> NylasWindow Replace Atom -> N1 Rename atom items nylas.asar -> atom.asar Remove more atom references Remove 6to5 references Remove license exception for atom
155 lines
4.8 KiB
CoffeeScript
155 lines
4.8 KiB
CoffeeScript
_ = require 'underscore'
|
|
NylasStore = require 'nylas-store'
|
|
|
|
{Thread,
|
|
Message,
|
|
Actions,
|
|
SearchView,
|
|
DatabaseView,
|
|
DatabaseStore,
|
|
AccountStore,
|
|
WorkspaceStore,
|
|
FocusedContentStore,
|
|
TaskQueueStatusStore,
|
|
FocusedMailViewStore} = require 'nylas-exports'
|
|
|
|
# Public: A mutable text container with undo/redo support and the ability
|
|
# to annotate logical regions in the text.
|
|
class ThreadListStore extends NylasStore
|
|
constructor: ->
|
|
@_resetInstanceVars()
|
|
|
|
@listenTo DatabaseStore, @_onDataChanged
|
|
@listenTo AccountStore, @_onAccountChanged
|
|
@listenTo FocusedMailViewStore, @_onMailViewChanged
|
|
|
|
NylasEnv.commands.add "body",
|
|
'thread-list:select-read' : @_onSelectRead
|
|
'thread-list:select-unread' : @_onSelectUnread
|
|
'thread-list:select-starred' : @_onSelectStarred
|
|
'thread-list:select-unstarred': @_onSelectUnstarred
|
|
|
|
# We can't create a @view on construction because the CategoryStore
|
|
# has hot yet been populated from the database with the list of
|
|
# categories and their corresponding ids. Once that is ready, the
|
|
# CategoryStore will trigger, which will update the
|
|
# FocusedMailViewStore, which will cause us to create a new
|
|
# @view.
|
|
|
|
_resetInstanceVars: ->
|
|
@_lastQuery = null
|
|
|
|
view: ->
|
|
@_view
|
|
|
|
setView: (view) ->
|
|
@_viewUnlisten() if @_viewUnlisten
|
|
@_view = view
|
|
|
|
@_viewUnlisten = view.listen ->
|
|
@trigger(@)
|
|
,@
|
|
|
|
@trigger(@)
|
|
|
|
createView: ->
|
|
mailViewFilter = FocusedMailViewStore.mailView()
|
|
account = AccountStore.current()
|
|
return unless account and mailViewFilter
|
|
|
|
if mailViewFilter.searchQuery
|
|
@setView(new SearchView(mailViewFilter.searchQuery, account.id))
|
|
else
|
|
matchers = []
|
|
matchers.push Thread.attributes.accountId.equal(account.id)
|
|
matchers = matchers.concat(mailViewFilter.matchers())
|
|
|
|
view = new DatabaseView Thread, {matchers}, (ids) =>
|
|
DatabaseStore.findAll(Message)
|
|
.where(Message.attributes.threadId.in(ids))
|
|
.where(Message.attributes.accountId.equal(account.id))
|
|
.then (messages) ->
|
|
messagesByThread = {}
|
|
for id in ids
|
|
messagesByThread[id] = []
|
|
for message in messages
|
|
messagesByThread[message.threadId].push message
|
|
messagesByThread
|
|
|
|
if WorkspaceStore.layoutMode() is 'split'
|
|
# Set up a one-time listener to focus an item in the new view
|
|
unlisten = view.listen ->
|
|
if view.loaded()
|
|
Actions.setFocus(collection: 'thread', item: view.get(0))
|
|
unlisten()
|
|
|
|
@setView(view)
|
|
|
|
Actions.setFocus(collection: 'thread', item: null)
|
|
|
|
_onSelectRead: =>
|
|
items = @_view.itemsCurrentlyInViewMatching (item) -> not item.unread
|
|
@_view.selection.set(items)
|
|
|
|
_onSelectUnread: =>
|
|
items = @_view.itemsCurrentlyInViewMatching (item) -> item.unread
|
|
@_view.selection.set(items)
|
|
|
|
_onSelectStarred: =>
|
|
items = @_view.itemsCurrentlyInViewMatching (item) -> item.starred
|
|
@_view.selection.set(items)
|
|
|
|
_onSelectUnstarred: =>
|
|
items = @_view.itemsCurrentlyInViewMatching (item) -> not item.starred
|
|
@_view.selection.set(items)
|
|
|
|
# Inbound Events
|
|
|
|
_onMailViewChanged: ->
|
|
@createView()
|
|
|
|
_onAccountChanged: ->
|
|
accountId = AccountStore.current()?.id
|
|
accountMatcher = (m) ->
|
|
m.attribute() is Thread.attributes.accountId and m.value() is accountId
|
|
|
|
return if @_view and _.find(@_view.matchers, accountMatcher)
|
|
@createView()
|
|
|
|
_onDataChanged: (change) ->
|
|
return unless @_view
|
|
|
|
if change.objectClass is Thread.name
|
|
focusedId = FocusedContentStore.focusedId('thread')
|
|
keyboardId = FocusedContentStore.keyboardCursorId('thread')
|
|
viewModeAutofocuses = WorkspaceStore.layoutMode() is 'split' or WorkspaceStore.topSheet().root is true
|
|
|
|
focusedIndex = @_view.indexOfId(focusedId)
|
|
keyboardIndex = @_view.indexOfId(keyboardId)
|
|
|
|
shiftIndex = (i) =>
|
|
if i > 0 and (@_view.get(i - 1)?.unread or i >= @_view.count())
|
|
return i - 1
|
|
else
|
|
return i
|
|
|
|
@_view.invalidate({change: change, shallow: true})
|
|
|
|
focusedLost = focusedIndex >= 0 and @_view.indexOfId(focusedId) is -1
|
|
keyboardLost = keyboardIndex >= 0 and @_view.indexOfId(keyboardId) is -1
|
|
|
|
if viewModeAutofocuses and focusedLost
|
|
Actions.setFocus(collection: 'thread', item: @_view.get(shiftIndex(focusedIndex)))
|
|
|
|
if keyboardLost
|
|
Actions.setCursorPosition(collection: 'thread', item: @_view.get(shiftIndex(keyboardIndex)))
|
|
|
|
if change.objectClass is Message.name
|
|
# Important: Until we optimize this so that it detects the set change
|
|
# and avoids a query, this should be defered since it's very unimportant
|
|
_.defer =>
|
|
threadIds = _.uniq _.map change.objects, (m) -> m.threadId
|
|
@_view.invalidateMetadataFor(threadIds)
|
|
|
|
|
|
module.exports = new ThreadListStore()
|