* src/client/components/main-window-info-bar.vala (MainWindowInfoBar):
New class and UI file for displaying an info bar in the main window, as
well as providing a way to show technical informartion if needed.
* src/client/components/main-window.vala (MainWindow): Add a Gtk.Frame
and container to hold inforbar instances. Show it when showing an
infobar, and hide it when there are none. Add show_infobar() method to
provide a cromulent way of adding info bars.
* src/client/application/geary-controller.vala (BaseObject): Rather than
bailing out on an account when an error occurs, display an info bar
instead.
* ui/geary.css: Style the info bar frame to only show a border between
main content and the info bars.
Bug 778033
* src/client/conversation-viewer/conversation-message.vala
(ConversationMessage::highlight_search_terms): Also check the subject
for matching items and highlight if found.
* src/client/conversation-viewer/conversation-list-box.vala
(ConversationListBox::EmailRow): Update matching row class to
disambiguate from matching headers.
* ui/geary.css: Ensure matching subject labels get highlighted.
* ui/conversation-viewer.ui,
src/client/conversation-viewer/conversation-viewer.vala: next-match and
previous-match signals are only available in GTK+ >= 3.16.
* ui/empty-placeholder.ui: Drop declared GTK+ requirement to 3.14.
* ui/geary.css: The :not() pseudeo class is only available in GTK+ >= 3.20.
* src/client/conversation-viewer/conversation-message.vala
(AddressFlowBoxChild::AddressFlowBoxChild): Check for enter and leave
events, update the prelight state of the flowbox child accordingly.
(ConversationMessage::on_address_box_child_activated): Update the
active state of the flowbox child appropriately when the popover
active.
* ui/geary.css: Style the active and hover states of the flowboxes.
Replace the dim-label hack with two distinct labels, themed using GTK CSS
classes.
Bug 765516.
* src/client/conversation-viewer/conversation-message.vala
(AddressFlowBoxChild::AddressFlowBoxChild): Construct a different
Gtk.Label for each address part, add CSS classes to enable them to be
styled. Pass an enum in to specify From addresses, rather than Pango
markup attr values. Fix call sites. Remove now obsolete
::format_address() method, update call sites.
* src/client/util/util-gtk.vala (pango_color_from_theme): Remove now
unsed method.
* ui/geary.css: Style the new address labels.
* src/client/conversation-viewer/conversation-listbox.vala: Add two
different listbox child row types, one for emails only and one for
composers only, with a common ConversationRow superclass. When a draft
composer is added, replace the draft email it is standing in for, and
replace it again when removed. Rename last_email_row to last_row and
make into a generic ConversationRow, only update it at the end of a
batch of changes.
* src/client/conversation-viewer/conversation-listbox.vala (EmailRow):
Add a grid to the row, then add the email view to that. Allow embedded
composers to also be added to the grid, hide the email view when the
composer is for a draft. Fix code making asumptions about EmailRow's
child.
(ConversationListBox::add_embedded_composer): Add draft param, pass it
through to the email row. Update call sites.
* src/client/conversation-viewer/conversation-email.vala
(ConversationEmail): Remove composer related prop and methods, since
its handled by EmailRow now.
* ui/geary.css: Update widget hierarchy.
The conversation viewer's ListBox is sufficiently complex to warrant its
own widget. Use empty placeholders for the list per the HIG, and
correctly fix mamagement of empty folder vs no conversations selected
this time.
* src/client/application/geary-controller.vala (GearyController):
Directly manage secondary parts of the conversation viewer, since the
controller since it has a better and more timely idea of when a
conversation change is due to folder loading status or from the user
selecting conversations, and so the viwer doesn't need to hook back
into the controller. Remove the now-unused conversations_selected
signal and its callers.
* src/client/conversation-viewer/conversation-listbox.vala: New widget
for displaying the list of emails for a conversation. Moved relevant
code from ConversationViewer here. Made adding emails async to get
better UI responsiveness. Don't implement anything to handle
conversation changes or emptying the list.
* src/client/conversation-viewer/conversation-viewer.vala: Replace user
messages - empty folder/search & no/multiple messages selected with new
EmptyPlaceholder. Remove a lot of the state manage code needed when
managing the email listbox. Add a new ConversationListBox for every new
conversation and just throw away.
* src/client/conversation-list/conversation-list-view.vala
(ConversationListView): Clean up firing the conversations_selected
signal - don't actually emit it when the model is clearing, and don't
bother delaying the check either.
* src/client/components/empty-placeholder.vala: New widget for displaying
empty list and grid placeholders per the HIG.
* src/client/conversation-viewer/conversation-email.vala
(ConversationEmail): Make manually read a property, since it
effectively is one.
* src/CMakeLists.txt: Include new source files.
* po/POTFILES.in: Include new source and UI files, and some missing ones.
* ui/CMakeLists.txt: Include new UI files.
* ui/conversation-viewer.ui: Replace user message and splash page with
placeholders for the new empty placeholders(!).
* ui/empty-placeholder.ui: UI def for new widget class.
* ui/geary.css: Chase widget name/class changes, style new
empty placeholder UI.
Scrolls to the first expanded row (first unread, or last email) in the
conversation list box to the top when the convo is fully loaded. To
implement this cleanly, ConversationViewer's handling of ListBoxRows was
cleaned up significantly by introducing a custom subclass and moving
related funtionality there.
* src/client/conversation-viewer/conversation-viewer.vala (EmailRow): New
class for managing expanded and last row state, events needed to ensure
we can robustly scroll to the row after its message has been loaded.
(ConversationViewer::scroll_to_top): New method for scrolling to a
specific row.
(ConversationViewer::update_last_row): New method for correctly
updating the last_email_row property and the row's flags. Replace
existing ad-hoc methods of determining the last row and ensure that the
last_email_row is used instead.
(ConversationViewer::select_conversation_async): Find the first
expanded row in the newly loaded conversation, and wire it up so that
it is scrolled to when the email body is eventually loaded, and the
resulting size reallocations have taken place.
* src/client/conversation-viewer/conversation-web-view.vala
(ConversationWebView::is_height_valid): Allows checking if the web
view's height is considered to have been correctly calculated.
This takes some inspiration from the GNOME Mail mockups.
* src/client/components/main-window.vala (MainWindow::set_styling): Work
around GtkFlowBoxChild padding issue.
* src/client/conversation-viewer/conversation-message.vala
(ConversationMessage): Updated to populate new header labels, add
addresses to GtkFlowBoxes.
* ui/conversation-message.ui: Make date always visible and
right-aligned. Remove label for sender address. Use GtkFlowBoxes for
sender/to/cc/bcc.
Geary currently displays RFC 822 attachments inline, below the email's
primary message body, using the same HTML chrome for the headers and
email body as for the primary body. Taking the same approach but using
GTK+ widgets meant splitting ConversationMessage up into a
ConversationEmail class that manages the UI for displaying an email in
its entirety, and a ConversationMessage to manage the only header widgets
and webview for displaying an individual RFC 822 message, usable for both
the primary body and any sub-messages. Thus, this is a big change.
One behavioural change is that each sub-message with remote images now
requires individual approval, rather than being dependant on the
containing message's sender and/or approval. This prevents some attacks
e.g. a trusted sender forwarding a spam/malware message, but does not
prevent it if the message is forwarded inline, obviosuly.
* src/client/conversation-viewer/conversation-email.vala (ConversationEmail):
New class for managing the UI for an overall email message. This
replaces the old ConversationMessage and contains much of it's code and
widgets - anything from that class which does not directly support
displaying headers or a message body.
* src/client/conversation-viewer/conversation-message.vala:
(ConversationMessage): Same class as before, but now with its scope
narrowed to only display message headers and body. The draft infobar
remains here rather than being put ConversationEmail where it belongs
since it's bit of a pain to insert in the right place and doesn't
really hurt.
(::email): Moved this property and any code that depends on it to
ConversationEmail.
(::always_load_remote_images): New property passed in via the ctor,
allowing one dependency on the old ::email property to be removed.
(::inlined_content_ids): Moved to ConversationEmail, since that is the
class that keeps track of attachments to display. Add the signal
attachment_displayed_inline to allow ConversationEmail to be notified
of inlined attachments instead.
(::flag_remote_images, ::remember_remote_images): New signals to notify
ConversationEmail that the user has flagged this message or the
message's sender for loading remote images. This is passed through
since in the former's case we may need to set flags on the email
itself, the latter because it is one less use of the contact_store
property, which should be removed from this class at some point.
* src/client/conversation-viewer/conversation-viewer.vala: Chase API
changes from the above. In general, replace use of the term "message"
with "email" since this class is now mostly dealing with
ConversationEmail instances, rather than ConversationMessage instances.
(ConversationViewer::check_mark_read): Only consider the
ConversationEmail's primary message body when checking for visibility
rather than that and any submessages to keep things simple.
(ConversationViewer::show_message, ::hide_message): Renamed to
expand_email/collapse_email respectively since we don't ever actually
hide it. Carry that change on to same methods on ConversationEmail.
* src/engine/rfc822/rfc822-message.vala (Geary.RFC822.Message): Add
get_primary_originator(), almost vermatim from Geary.Email, to support
determining the sender for remembering remote message loading for
senders of sub-emails.
* src/client/components/main-window.vala (MainWindow::set_styling): Fix
background transition for collapsed emails.
* src/client/application/geary-controller.vala: Chase API name changes.
* src/CMakeLists.txt: Include new ConversationEmail source file.
* ui/conversation-email.ui: New UI for ConversationEmail, move the email
action box, attachments box amd sub-messages box here from
conversation-message.ui.
* ui/CMakeLists.txt: Include new UI in compiled resources.
* po/POTFILES.in: Add new UI for transation.
* src/client/components/main-window.vala: Adjust theme CSS style to
account for new widget classes. Fix style for last row in the convo
listbox.
* src/client/conversation-viewer/conversation-message.vala: Decouple
updating message state and updating message flags. Prefix CSS classes
with "geary_" to prevent class name clashes.
* src/client/conversation-viewer/conversation-viewer.vala: Manually
maintain a CSS class on the last row of the convo listbox to work
around Bug 764710. Prefix CSS classes with "geary_" to prevent class
name clashes.
(ConversationViewer::on_update_flags): Renamed from update_flags since
it is only ever called as a signal handler. Remove most of the work -
it is now done by ConversationMessage.
* ui/conversation-message.ui: Split out preview labels from existing
header box and create a new preview box for them.
* src/client/components/main-window.vala (MainWindow::set_styling): Use
style-defined names to allow us to specify message row backgrounds better.
* src/client/conversation-viewer/conversation-message.vala
(ConversationMessage): Update GTK composite template children
properties and visible state when showing/hiding the body, set new
preview/header box label texts.
* src/client/conversation-viewer/conversation-viewer.vala
(ConversationViewer::do_embedded_composer,
ConversationViewer::add_message): Don't add 'frame' class to conversation
list rows, we're styling it explicitly now.
Use a GtkInfoBar to display to the user the message and related buttons
instead of the message-inline HTML approach. Still needs some additional
work to save per-message loading and displaying images from same sender
in convo when "Always Show" is chosen.
* src/client/conversation-viewer/conversation-message.vala: Reenable
remote image related code, remove HTML-based UI management code.
* src/client/components/main-window.vala (MainWindow::set_styling):
Add some theme CSS to style the remote images infobar.
* ui/conversation-message.ui: Add the remote images infobar.
The embedded composer is now added to the the conversation list
box. Still needs some work to fix focus and scrolling issues, also to
insert the composer in the right place in the list.
* src/client/components/main-window.vala (MainWindow::set_styling):
Adjust theme CSS to make padding around embedded coposer not so
terrible. Fix style for embedded headerbar.
* src/client/composer/composer-embed.vala: Don't attempt to up-manage
it's parent's state, since the parent has a much better idea of how
best to do that. Instead of passing in a ConversationViewer, just pass
in a Gtk.ScrolledWindow that needs to be adjusted as the embededded
editor and add some signals needed by the ConversationViewer. Reenabled
some code needed to get scroll event passthrough working.
* src/client/conversation-viewer/conversation-viewer.vala: Remove old
embedded composer code. Adjust conversation_listbox callbacks to handle
the embedded composer being present.
(ConversationViewer::get_selected_message): Fixed to actually return a
message.
(ConversationViewer::do_embedded_composer): New method to set up an
embedded composer.
* src/client/application/geary-controller.vala
(GearyController::create_compose_widget_async): Call new
ConversationViewer::do_embedded_composer to let it set up a new
embedded composer when needed.
* src/client/conversation-viewer/conversation-viewer.vala: Convert to a
GtkStack. Use a GTK template for constructing the UI. Remove WebView
and any DOM-related code. Replace the enum DisplayMode and hence the
HTML spinner and HTML user message with widgets in the stack. Remove
all menus since they're all message specific and will need to be
re-implemented for ConversationViewer. Comment out composer related
code for the moment.
* src/client/application/geary-controller.vala
(GearyController::conversations_selected): Make both conversations and
current_folder arguments non-nullable, since it doesn't make any sense
for there not to be any and simplifies handler impls.
(GearyController::on_conversations_selected): Don't fire when there
isn't a current folder.
* src/client/components/main-window.vala (MainWindow::set_styling): Add
CSS theme code for the the conversation message list.
(MainWindow::create_layout): Remove GtkFrame, just add the
ConversationViewer instance directly.
* ui/conversation-viewer.ui: New GtkBuilder template for
ConversationViewer, implemented as a GtkStack containing widgets for
displaying the loading spinner, conversation as a GtkListBox, and label
for user messages.
* ui/CMakeLists.txt, po/POTFILES.in: Added new UI files.