Move HeaderBar to separate class

This commit is contained in:
bleakgrey 2018-04-20 14:51:18 +03:00
parent bc5cef17ac
commit ed5d79d6ea
8 changed files with 105 additions and 91 deletions

View File

@ -29,6 +29,7 @@ executable(
'src/API/StatusVisibility.vala', 'src/API/StatusVisibility.vala',
'src/API/Notification.vala', 'src/API/Notification.vala',
'src/API/NotificationType.vala', 'src/API/NotificationType.vala',
'src/Widgets/HeaderBar.vala',
'src/Widgets/AlignedLabel.vala', 'src/Widgets/AlignedLabel.vala',
'src/Widgets/AccountsButton.vala', 'src/Widgets/AccountsButton.vala',
'src/Widgets/StatusWidget.vala', 'src/Widgets/StatusWidget.vala',

View File

@ -2,7 +2,7 @@ using GLib;
public class Tootle.AccountManager : Object{ public class Tootle.AccountManager : Object{
public abstract signal void changed_current(Account? account); public abstract signal void switched(Account? account);
public abstract signal void added(Account account); public abstract signal void added(Account account);
public abstract signal void removed(Account account); public abstract signal void removed(Account account);
@ -105,7 +105,7 @@ public class Tootle.AccountManager : Object{
try{ try{
var root = NetManager.parse (mess); var root = NetManager.parse (mess);
current = Account.parse(root); current = Account.parse(root);
changed_current (current); switched (current);
} }
catch (GLib.Error e) { catch (GLib.Error e) {
warning ("Can't get current user"); warning ("Can't get current user");
@ -117,7 +117,7 @@ public class Tootle.AccountManager : Object{
public void logout (){ public void logout (){
current = null; current = null;
changed_current (null); switched (null);
} }
} }

View File

@ -35,7 +35,7 @@ namespace Tootle{
if(has_token) if(has_token)
AccountManager.instance.update_current (); AccountManager.instance.update_current ();
else else
AccountManager.instance.changed_current (null); AccountManager.instance.switched (null);
} }
} }

View File

@ -2,32 +2,15 @@ using Gtk;
public class Tootle.MainWindow: Gtk.Window { public class Tootle.MainWindow: Gtk.Window {
HeaderBar header; Tootle.HeaderBar header;
Stack primary_stack; public Stack primary_stack;
Stack secondary_stack; public Stack secondary_stack;
AccountsButton button_accounts;
Granite.Widgets.ModeButton button_mode;
Spinner spinner;
Button button_toot;
Button button_back;
public HomeView home = new HomeView (); public HomeView home = new HomeView ();
public LocalView feed_local = new LocalView (); public LocalView feed_local = new LocalView ();
public FederatedView feed_federated = new FederatedView (); public FederatedView feed_federated = new FederatedView ();
public NotificationsView notifications = new NotificationsView (); public NotificationsView notifications = new NotificationsView ();
public MainWindow (Gtk.Application application) {
Object (application: application,
icon_name: "com.github.bleakgrey.tootle",
title: "Tootle",
resizable: true
);
set_titlebar (header);
window_position = WindowPosition.CENTER;
AccountManager.instance.changed_current.connect(on_account_changed);
}
construct { construct {
var provider = new Gtk.CssProvider (); var provider = new Gtk.CssProvider ();
provider.load_from_resource ("/com/github/bleakgrey/tootle/Application.css"); provider.load_from_resource ("/com/github/bleakgrey/tootle/Application.css");
@ -41,54 +24,26 @@ public class Tootle.MainWindow: Gtk.Window {
primary_stack.transition_type = Gtk.StackTransitionType.SLIDE_LEFT_RIGHT; primary_stack.transition_type = Gtk.StackTransitionType.SLIDE_LEFT_RIGHT;
primary_stack.show (); primary_stack.show ();
primary_stack.add_named (secondary_stack, "modes"); primary_stack.add_named (secondary_stack, "modes");
spinner = new Spinner ();
spinner.active = true;
button_accounts = new AccountsButton ();
button_back = new Button ();
button_back.label = _("Back");
button_back.get_style_context ().add_class (Granite.STYLE_CLASS_BACK_BUTTON);
button_back.clicked.connect (() => {
primary_stack.set_visible_child_name ("modes");
var child = primary_stack.get_child_by_name ("details");
child.destroy ();
update_header (true);
});
button_toot = new Button ();
button_toot.tooltip_text = "Toot";
button_toot.image = new Gtk.Image.from_icon_name ("edit-symbolic", Gtk.IconSize.LARGE_TOOLBAR);
button_toot.clicked.connect (() => {
PostDialog.open (this);
});
button_mode = new Granite.Widgets.ModeButton ();
button_mode.get_style_context ().add_class ("mode");
button_mode.mode_changed.connect(widget => {
secondary_stack.set_visible_child_name(widget.tooltip_text);
});
button_mode.show ();
header = new HeaderBar (); header = new Tootle.HeaderBar ();
header.custom_title = button_mode;
header.show_close_button = true;
header.pack_start (button_back);
header.pack_start (button_toot);
header.pack_end (button_accounts);
header.pack_end (spinner);
button_mode.valign = Gtk.Align.FILL;
header.show ();
add (primary_stack); add (primary_stack);
show_all (); show_all ();
NetManager.instance.started.connect (() => spinner.show ());
NetManager.instance.finished.connect (() => spinner.hide ());
} }
private void on_account_changed(Account? account){ public MainWindow (Gtk.Application application) {
Object (application: application,
icon_name: "com.github.bleakgrey.tootle",
title: "Tootle",
resizable: true
);
set_titlebar (header);
window_position = WindowPosition.CENTER;
AccountManager.instance.switched.connect(on_account_switched);
}
private void on_account_switched(Account? account){
secondary_stack.forall (widget => secondary_stack.remove (widget)); secondary_stack.forall (widget => secondary_stack.remove (widget));
if(account == null) if(account == null)
@ -97,43 +52,27 @@ public class Tootle.MainWindow: Gtk.Window {
show_main_views (); show_main_views ();
} }
private void update_header (bool primary_mode, bool hide_all = false){
if (hide_all){
button_mode.opacity = 0;
button_mode.sensitive = false;
button_toot.hide ();
button_back.hide ();
button_accounts.hide ();
return;
}
button_mode.opacity = primary_mode ? 1 : 0;
button_mode.sensitive = primary_mode ? true : false;
button_toot.set_visible (primary_mode);
button_back.set_visible (!primary_mode);
button_accounts.set_visible (true);
}
private void show_setup_views (){ private void show_setup_views (){
var add_account = new AddAccountView (); var add_account = new AddAccountView ();
secondary_stack.add_named (add_account, add_account.get_name ()); secondary_stack.add_named (add_account, add_account.get_name ());
update_header (false, true); header.update (false, true);
} }
private void show_main_views (){ private void show_main_views (){
button_mode.clear_children (); header.button_mode.clear_children ();
add_view (home); add_view (home);
add_view (notifications); add_view (notifications);
add_view (feed_local); add_view (feed_local);
add_view (feed_federated); add_view (feed_federated);
button_mode.set_active (0); header.button_mode.set_active (0);
update_header (true); header.update (true);
} }
private void add_view (AbstractView view) { private void add_view (AbstractView view) {
if (view.show_in_header){ if (view.show_in_header){
var img = new Gtk.Image.from_icon_name(view.get_icon (), Gtk.IconSize.LARGE_TOOLBAR); var img = new Gtk.Image.from_icon_name(view.get_icon (), Gtk.IconSize.LARGE_TOOLBAR);
img.tooltip_text = view.get_name (); img.tooltip_text = view.get_name ();
button_mode.append (img); header.button_mode.append (img);
view.image = img; view.image = img;
secondary_stack.add_named(view, view.get_name ()); secondary_stack.add_named(view, view.get_name ());
} }
@ -143,7 +82,7 @@ public class Tootle.MainWindow: Gtk.Window {
widget.show (); widget.show ();
primary_stack.add_named (widget, "details"); primary_stack.add_named (widget, "details");
primary_stack.set_visible_child_name ("details"); primary_stack.set_visible_child_name ("details");
update_header (false); header.update (false);
} }
} }

View File

@ -29,7 +29,7 @@ public class Tootle.HomeView : Tootle.AbstractView {
show_all(); show_all();
view.remove.connect (on_remove); view.remove.connect (on_remove);
AccountManager.instance.changed_current.connect(on_account_changed); AccountManager.instance.switched.connect(on_account_changed);
// var s = new Status(1); // var s = new Status(1);
// s.content = "Test content, wow!"; // s.content = "Test content, wow!";

View File

@ -24,7 +24,7 @@ public class Tootle.NotificationsView : Tootle.AbstractView {
show_all(); show_all();
view.remove.connect (on_remove); view.remove.connect (on_remove);
AccountManager.instance.changed_current.connect(on_account_changed); AccountManager.instance.switched.connect(on_account_changed);
} }
public override string get_icon () { public override string get_icon () {

View File

@ -68,7 +68,7 @@ public class Tootle.AccountsButton : Gtk.MenuButton{
add(avatar); add(avatar);
show_all (); show_all ();
AccountManager.instance.changed_current.connect (account => { AccountManager.instance.switched.connect (account => {
if (account != null){ if (account != null){
CacheManager.instance.load_avatar (account.avatar, avatar, 24); CacheManager.instance.load_avatar (account.avatar, avatar, 24);
default_account.display_name.label = "<b>"+account.display_name+"</b>"; default_account.display_name.label = "<b>"+account.display_name+"</b>";

View File

@ -0,0 +1,74 @@
using Gtk;
public class Tootle.HeaderBar : Gtk.HeaderBar{
public Granite.Widgets.ModeButton button_mode;
AccountsButton button_accounts;
Spinner spinner;
Button button_toot;
Button button_back;
construct {
spinner = new Spinner ();
spinner.active = true;
button_accounts = new AccountsButton ();
button_back = new Button ();
button_back.label = _("Back");
button_back.get_style_context ().add_class (Granite.STYLE_CLASS_BACK_BUTTON);
button_back.clicked.connect (() => {
var primary_stack = Tootle.window.primary_stack;
primary_stack.set_visible_child_name ("modes");
var child = primary_stack.get_child_by_name ("details");
child.destroy ();
update (true);
});
button_toot = new Button ();
button_toot.tooltip_text = "Toot";
button_toot.image = new Gtk.Image.from_icon_name ("edit-symbolic", Gtk.IconSize.LARGE_TOOLBAR);
button_toot.clicked.connect (() => {
PostDialog.open (Tootle.window);
});
button_mode = new Granite.Widgets.ModeButton ();
button_mode.get_style_context ().add_class ("mode");
button_mode.mode_changed.connect(widget => {
Tootle.window.secondary_stack.set_visible_child_name(widget.tooltip_text);
});
button_mode.show ();
NetManager.instance.started.connect (() => spinner.show ());
NetManager.instance.finished.connect (() => spinner.hide ());
pack_start (button_back);
pack_start (button_toot);
pack_end (button_accounts);
pack_end (spinner);
}
public HeaderBar () {
custom_title = button_mode;
show_close_button = true;
show ();
button_mode.valign = Gtk.Align.FILL;
}
public void update (bool primary_mode, bool hide_all = false){
if (hide_all){
button_mode.opacity = 0;
button_mode.sensitive = false;
button_toot.hide ();
button_back.hide ();
button_accounts.hide ();
return;
}
button_mode.opacity = primary_mode ? 1 : 0;
button_mode.sensitive = primary_mode ? true : false;
button_toot.set_visible (primary_mode);
button_back.set_visible (!primary_mode);
button_accounts.set_visible (true);
}
}