2018-04-14 14:09:06 +02:00
|
|
|
using Gtk;
|
|
|
|
|
|
|
|
public class Tootle.MainWindow: Gtk.Window {
|
|
|
|
|
2018-05-18 23:14:12 +02:00
|
|
|
private weak SettingsManager settings;
|
|
|
|
|
|
|
|
private Gtk.Overlay overlay;
|
|
|
|
private Granite.Widgets.Toast toast;
|
|
|
|
private Gtk.Grid grid;
|
2018-04-30 19:56:02 +02:00
|
|
|
public Tootle.HeaderBar header;
|
2018-04-20 13:51:18 +02:00
|
|
|
public Stack primary_stack;
|
|
|
|
public Stack secondary_stack;
|
2018-04-14 14:09:06 +02:00
|
|
|
|
|
|
|
construct {
|
2018-05-10 16:28:40 +02:00
|
|
|
settings = Tootle.settings;
|
|
|
|
|
2018-04-14 14:09:06 +02:00
|
|
|
var provider = new Gtk.CssProvider ();
|
2018-05-20 23:37:33 +02:00
|
|
|
provider.load_from_resource ("/com/github/bleakgrey/tootle/app.css");
|
2018-04-14 14:09:06 +02:00
|
|
|
StyleContext.add_provider_for_screen (Gdk.Screen.get_default (), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
|
2018-05-20 23:37:33 +02:00
|
|
|
|
|
|
|
settings.changed.connect (update_theme);
|
|
|
|
update_theme ();
|
2018-04-14 14:09:06 +02:00
|
|
|
|
2018-04-29 18:04:26 +02:00
|
|
|
toast = new Granite.Widgets.Toast ("");
|
2018-04-29 18:25:42 +02:00
|
|
|
overlay = new Gtk.Overlay ();
|
|
|
|
overlay.add_overlay (toast);
|
2018-04-19 20:38:30 +02:00
|
|
|
secondary_stack = new Stack();
|
|
|
|
secondary_stack.transition_type = Gtk.StackTransitionType.SLIDE_LEFT_RIGHT;
|
|
|
|
secondary_stack.show ();
|
|
|
|
primary_stack = new Stack();
|
|
|
|
primary_stack.transition_type = Gtk.StackTransitionType.SLIDE_LEFT_RIGHT;
|
|
|
|
primary_stack.show ();
|
2018-04-25 15:16:57 +02:00
|
|
|
primary_stack.add_named (secondary_stack, "0");
|
2018-04-29 18:25:42 +02:00
|
|
|
primary_stack.hexpand = true;
|
|
|
|
primary_stack.vexpand = true;
|
2018-04-20 13:51:18 +02:00
|
|
|
header = new Tootle.HeaderBar ();
|
2018-04-29 18:04:26 +02:00
|
|
|
|
2018-05-18 23:14:12 +02:00
|
|
|
grid = new Gtk.Grid ();
|
2018-04-29 18:25:42 +02:00
|
|
|
grid.set_size_request (400, 500);
|
|
|
|
grid.attach (primary_stack, 0, 0, 1, 1);
|
|
|
|
grid.attach (overlay, 0, 0, 1, 1);
|
|
|
|
|
|
|
|
add (grid);
|
2018-04-14 14:09:06 +02:00
|
|
|
show_all ();
|
2018-04-20 13:51:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2018-04-14 14:09:06 +02:00
|
|
|
|
2018-04-27 20:50:08 +02:00
|
|
|
Tootle.accounts.switched.connect(on_account_switched);
|
2018-04-29 18:04:26 +02:00
|
|
|
Tootle.app.toast.connect (on_toast);
|
2018-04-14 14:09:06 +02:00
|
|
|
}
|
|
|
|
|
2018-05-05 17:38:01 +02:00
|
|
|
private void reset () {
|
|
|
|
header.button_mode.clear_children ();
|
|
|
|
secondary_stack.forall (widget => widget.destroy ());
|
|
|
|
}
|
2018-04-14 14:09:06 +02:00
|
|
|
|
2018-05-27 18:25:16 +02:00
|
|
|
private void on_account_switched(Account? account){
|
|
|
|
header.button_mode.clear_children ();
|
|
|
|
secondary_stack.forall (widget => widget.destroy ());
|
|
|
|
|
|
|
|
if (account == null)
|
|
|
|
return;
|
|
|
|
build_main_view ();
|
2018-04-14 14:09:06 +02:00
|
|
|
}
|
|
|
|
|
2018-05-05 17:38:01 +02:00
|
|
|
private void build_main_view (){
|
2018-05-19 14:21:03 +02:00
|
|
|
add_header_view (new TimelineView ("home"));
|
2018-05-05 17:38:01 +02:00
|
|
|
add_header_view (new NotificationsView ());
|
|
|
|
add_header_view (new LocalView ());
|
|
|
|
add_header_view (new FederatedView ());
|
2018-04-20 13:51:18 +02:00
|
|
|
header.update (true);
|
2018-04-14 14:09:06 +02:00
|
|
|
}
|
|
|
|
|
2018-05-05 17:38:01 +02:00
|
|
|
private void add_header_view (AbstractView view) {
|
|
|
|
var img = new Gtk.Image.from_icon_name(view.get_icon (), Gtk.IconSize.LARGE_TOOLBAR);
|
|
|
|
img.tooltip_text = view.get_name ();
|
|
|
|
header.button_mode.append (img);
|
|
|
|
view.image = img;
|
|
|
|
secondary_stack.add_named(view, view.get_name ());
|
|
|
|
|
|
|
|
if (view is NotificationsView)
|
|
|
|
img.pixel_size = 20; // For some reason Notifications icon is too small without this
|
2018-04-14 14:09:06 +02:00
|
|
|
}
|
2018-04-19 21:03:28 +02:00
|
|
|
|
2018-05-29 12:05:04 +02:00
|
|
|
public int get_visible_id () {
|
|
|
|
return int.parse (primary_stack.get_visible_child_name ());
|
|
|
|
}
|
|
|
|
|
|
|
|
public void open_view (AbstractView widget) {
|
|
|
|
var i = get_visible_id ();
|
2018-04-25 15:16:57 +02:00
|
|
|
i++;
|
2018-05-29 12:05:04 +02:00
|
|
|
widget.stack_pos = i;
|
|
|
|
widget.show ();
|
2018-04-25 15:16:57 +02:00
|
|
|
primary_stack.add_named (widget, i.to_string ());
|
|
|
|
primary_stack.set_visible_child_name (i.to_string ());
|
2018-04-20 13:51:18 +02:00
|
|
|
header.update (false);
|
2018-04-19 21:03:28 +02:00
|
|
|
}
|
2018-04-29 18:04:26 +02:00
|
|
|
|
2018-05-29 12:05:04 +02:00
|
|
|
public void back () {
|
|
|
|
var i = get_visible_id ();
|
|
|
|
primary_stack.set_visible_child_name ((i-1).to_string ());
|
|
|
|
|
|
|
|
var child = primary_stack.get_child_by_name (i.to_string ());
|
|
|
|
child.destroy ();
|
|
|
|
|
|
|
|
var is_root = primary_stack.get_visible_child_name () == "0";
|
|
|
|
header.update (is_root);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void reopen_view (int view_id) {
|
|
|
|
var i = get_visible_id ();
|
|
|
|
while (i != view_id && view_id != 0) {
|
|
|
|
back ();
|
|
|
|
i = get_visible_id ();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-29 18:04:26 +02:00
|
|
|
private void on_toast (string msg){
|
|
|
|
toast.title = msg;
|
|
|
|
toast.send_notification ();
|
|
|
|
}
|
|
|
|
|
2018-05-03 10:56:04 +02:00
|
|
|
public override bool delete_event (Gdk.EventAny event) {
|
2018-05-08 18:09:38 +02:00
|
|
|
this.destroy.connect (() => {
|
2018-05-27 18:25:16 +02:00
|
|
|
if (!Tootle.settings.always_online || Tootle.accounts.is_empty ())
|
2018-05-08 18:09:38 +02:00
|
|
|
Tootle.app.remove_window (Tootle.window_dummy);
|
|
|
|
Tootle.window = null;
|
|
|
|
});
|
|
|
|
return false;
|
2018-05-03 10:56:04 +02:00
|
|
|
}
|
2018-05-20 23:37:33 +02:00
|
|
|
|
|
|
|
private void update_theme () {
|
|
|
|
var provider = new Gtk.CssProvider ();
|
|
|
|
var is_dark = settings.dark_theme;
|
|
|
|
var theme = is_dark ? "dark" : "light";
|
|
|
|
provider.load_from_resource ("/com/github/bleakgrey/tootle/%s.css".printf (theme));
|
|
|
|
StyleContext.add_provider_for_screen (Gdk.Screen.get_default (), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
|
|
|
|
|
|
|
|
Gtk.Settings.get_default ().gtk_application_prefer_dark_theme = is_dark;
|
|
|
|
}
|
2018-04-14 14:09:06 +02:00
|
|
|
|
|
|
|
}
|