Commit be21b8fe authored by Niels De Graef's avatar Niels De Graef

Avatar: don't use a button.

Leave all the button logic out of it and just be a simple DrawingArea.

NOTE: we temporarily lose our border because of this, but with the new
avatars, this should no longer be a problem.
parent 86abe207
......@@ -52,9 +52,8 @@ row.contact-data-row {
border-top-left-radius: 0;
}
/* Draw a border around the avatar */
.contacts-avatar border {
border-radius: 5px;
/* An avatar */
.contacts-avatar {
}
/* Give the avatar in the ContactSheet some margin,
......@@ -85,10 +84,6 @@ ContactsWindow .primary-toolbar.toolbar {
border-width: 1px;
}
.button.contacts-square {
padding: 0px;
}
/* The style for the background "watermark" image and text.
* (copied from dim-label) */
.contacts-watermark {
......
......@@ -162,41 +162,44 @@ public class Contacts.AvatarDialog : Dialog {
return pixbuf.scale_simple (w, h, Gdk.InterpType.HYPER);
}
private Avatar create_frame (Gdk.Pixbuf source_pixbuf) {
var avatar = new Avatar (ICONS_SIZE, true);
private Button create_thumbnail (Gdk.Pixbuf source_pixbuf) {
var avatar = new Avatar (ICONS_SIZE);
var pixbuf = source_pixbuf.scale_simple (ICONS_SIZE, ICONS_SIZE, Gdk.InterpType.HYPER);
avatar.set_pixbuf (pixbuf);
var avatar_pixbuf = scale_pixbuf_for_avatar_use (source_pixbuf);
avatar.clicked.connect ( () => {
selected_pixbuf (avatar_pixbuf);
var button = new Button ();
button.get_style_context ().add_class ("flat");
button.image = avatar;
button.clicked.connect ( () => {
selected_pixbuf (scale_pixbuf_for_avatar_use (source_pixbuf));
});
return avatar;
return button;
}
private Avatar? frame_for_persona (Persona persona) {
private Button? thumbnail_for_persona (Persona persona) {
var details = persona as AvatarDetails;
if (details == null || details.avatar == null)
return null;
try {
var stream = details.avatar.load (128, null);
var pixbuf = new Gdk.Pixbuf.from_stream (stream);
return create_frame (pixbuf);
}
catch {
return create_thumbnail (new Gdk.Pixbuf.from_stream (stream));
} catch {
debug ("Couldn't create frame for persona \"%s\".", persona.display_id);
}
return null;
}
private Avatar? frame_for_filename (string filename) {
Avatar? avatar = null;
private Button? thumbnail_for_filename (string filename) {
try {
var pixbuf = new Gdk.Pixbuf.from_file (filename);
return create_frame (pixbuf);
return create_thumbnail (new Gdk.Pixbuf.from_file (filename));
} catch {
debug ("Couldn't create frame for file \"%s\".", filename);
}
return avatar;
return null;
}
private void selected_pixbuf (Gdk.Pixbuf pixbuf) {
......@@ -210,18 +213,18 @@ public class Contacts.AvatarDialog : Dialog {
private void update_thumbnail_grids () {
if (this.contact != null) {
foreach (var p in contact.individual.personas) {
Avatar? frame = frame_for_persona (p);
if (frame != null)
this.personas_thumbnail_grid.add (frame);
var button = thumbnail_for_persona (p);
if (button != null)
this.personas_thumbnail_grid.add (button);
}
}
this.personas_thumbnail_grid.show_all ();
var stock_files = Utils.get_stock_avatars ();
foreach (var file_name in stock_files) {
Avatar? frame = frame_for_filename (file_name);
if (frame != null)
this.stock_thumbnail_grid.add (frame);
var button = thumbnail_for_filename (file_name);
if (button != null)
this.stock_thumbnail_grid.add (button);
}
this.stock_thumbnail_grid.show_all ();
}
......
......@@ -23,42 +23,18 @@ using Gee;
* The Avatar of a Contact is responsible for showing an {@link Individual}'s
* avatar, or a fallback if it's not available.
*/
public class Contacts.Avatar : Frame {
public class Contacts.Avatar : DrawingArea {
private int size;
private Gdk.Pixbuf? pixbuf;
private Pango.Layout? layout;
public signal void clicked ();
public Avatar (int size, bool with_button = false) {
public Avatar (int size) {
this.size = size;
set_size_request (size, size);
get_style_context ().add_class ("contacts-avatar");
var image = new Image ();
image.set_size_request (size, size);
if (with_button) {
var button = new Button ();
button.get_accessible ().set_name (_("Change avatar"));
button.get_style_context ().add_class ("contacts-square");
button.set_relief (ReliefStyle.NONE);
button.set_focus_on_click (false);
button.add (image);
button.clicked.connect ( () => {
this.clicked ();
});
this.add (button);
this.shadow_type = ShadowType.NONE;
} else {
this.add (image);
}
image.show ();
image.draw.connect (draw_image);
show ();
}
public void set_pixbuf (Gdk.Pixbuf a_pixbuf) {
......@@ -84,7 +60,7 @@ public class Contacts.Avatar : Frame {
set_pixbuf (a_pixbuf);
}
public bool draw_image (Cairo.Context cr) {
public override bool draw (Cairo.Context cr) {
cr.save ();
if (pixbuf != null) {
......
......@@ -942,11 +942,12 @@ public class Contacts.ContactEditor : Grid {
// Creates the contact's current avatar in a big button on top of the Editor
private void create_avatar_button () {
this.avatar = new Avatar (PROFILE_SIZE, true);
this.avatar.vexpand = false;
this.avatar.valign = Align.START;
(this.avatar.get_child () as Button).relief = ReliefStyle.NORMAL;
this.avatar.clicked.connect (on_avatar_frame_clicked);
this.avatar = new Avatar (PROFILE_SIZE);
var button = new Button ();
button.get_accessible ().set_name (_("Change avatar"));
button.image = this.avatar;
button.clicked.connect (on_avatar_button_clicked);
if (this.contact != null) {
this.contact.keep_widget_uptodate (this.avatar, (w) => {
......@@ -956,11 +957,11 @@ public class Contacts.ContactEditor : Grid {
this.avatar.set_image (null, null);
}
this.container_grid.attach (this.avatar, 0, 0, 1, 3);
this.container_grid.attach (button, 0, 0, 1, 3);
}
// Show the avatar dialog when the avatar is clicked
private void on_avatar_frame_clicked () {
private void on_avatar_button_clicked (Button avatar_button) {
var dialog = new AvatarDialog ((Window) get_toplevel (), this.contact);
dialog.set_avatar.connect ( (icon) => {
this.avatar.set_data ("value", icon);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment