Context needs to know when an account gets online in order to get the
mailbox hashes and launch the watcher threads for this account. Instead
of assuming all accounts are online when launching meli, move the
initialisation logic to an is_online() method on Context to do it on
demand.
The is_online() method is then called by ui::components::mail::Listing
everytime it's drawn to check for status changes.
Some events are invalid when there are no messages shown in the listing.
Instead of checking for self.length > 0 in each of these events, put
them together in an if block.
Errors were not shown properly because the data_columns grids were being
overwritten by redraw_list(). Call redraw_list() only if filtering was
succesful.
The backend object stores the state of the backend associated with an
account.
Hide the backend object between a mutex, in order to be able to share it
with threads in the next commit.
The operation() method on the MailBackend trait returns a trait object
that can read or modify an Envelope directly from the backend. This is
used to get eg the envelope's text, or set flags. It has two arguments,
envelope hash and folder hash.
Only the Maildir backend needed the latter argument, and it can be replaced with a dictionary to match envelope hashes to folder hashes within the Maildir backend.
Envelope can now only be accessed from within a RwLock. Two new structs
are introduced: EnvelopeRef and EnvelopeRefMut. These hold a reference
to an Envelope and the mutex guard that keeps them alive.
This change allows sharing of the envelopes hash map amongst threads.
Add configuration option to embed editor in the composing tab instead of
executing and waiting for it.
Set embed = true in Composing section of your configuration to activate.
Emulate a terminal within meli. In the next commit it will be used to
embed an editor in the composing tab.
This is a non-complete xterm emulation that has some bugs.
Add a boolean field to accounts that states if the account can be
accessed. Local backends (Maildir/mbox) return true every time, but
remote backends (IMAP) may not. Accounts start as offline and then get
initialised when their status goes to online. Right now if an IMAP
account startup but later get offline, there are crashes. With this
change the account can be switched back to offline when that happens.
If the user gives a configuration value in an `[account]` sections that
isn't hard-coded, it gets filed up under the
`extra: HashMap<String, String>` field of `FileAccount`. If the setting
is something that isn't a string like key = true, the parsing will fail
since it expects string values. We want to accept key = true as well as
key = "true".
std::convert::From<&std::string::String> for String was introduced in
1.36.0 and version below that version fail. Use `to_string()` instead to
make it build again.