aboutsummaryrefslogtreecommitdiff
path: root/libdino/src/ui/application.vala
blob: 0878e50df85e67ccb0b636f0af80b801f11cdfb0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using Gtk;

using Dino.Entities;

public class Dino.Ui.Application : Gtk.Application {

    private Database db;
    private StreamInteractor stream_interaction;

    private Notifications notifications;
    private UnifiedWindow? window;
    private ConversationSelector.View? filterable_conversation_list;
    private ConversationSelector.List? conversation_list;
    private ConversationSummary.View? conversation_frame;
    private ChatInput? chat_input;

    public Application() {
        this.db = new Database("store.sqlite3");
        this.stream_interaction = new StreamInteractor(db);

        AvatarManager.start(stream_interaction, db);
        MessageManager.start(stream_interaction, db);
        CounterpartInteractionManager.start(stream_interaction);
        PresenceManager.start(stream_interaction);
        MucManager.start(stream_interaction);
        PgpManager.start(stream_interaction, db);
        RosterManager.start(stream_interaction);
        ConversationManager.start(stream_interaction, db);
        ChatInteraction.start(stream_interaction);

        Notify.init("dino");
        notifications = new Notifications(stream_interaction);
        notifications.start();

        load_css();
    }

    public override void activate() {
        create_set_app_menu();
        create_window();
        window.show_all();
        restore();
    }

    private void create_window() {
        window = new UnifiedWindow(this, stream_interaction);

        filterable_conversation_list = window.filterable_conversation_list;
        conversation_list = window.filterable_conversation_list.conversation_list;
        conversation_frame = window.conversation_frame;
        chat_input = window.chat_input;
    }

    private void show_accounts_window() {
        ManageAccounts.Dialog dialog = new ManageAccounts.Dialog(stream_interaction, db);
        dialog.set_transient_for(window);
        dialog.account_enabled.connect(add_connection);
        dialog.account_disabled.connect(remove_connection);
        dialog.show();
    }

    private void show_settings_window() {
        SettingsDialog dialog = new SettingsDialog();
        dialog.set_transient_for(window);
        dialog.show();
    }

    private void create_set_app_menu() {
        SimpleAction accounts_action = new SimpleAction("accounts", null);
        accounts_action.activate.connect(show_accounts_window);
        add_action(accounts_action);

        SimpleAction settings_action = new SimpleAction("settings", null);
        settings_action.activate.connect(show_settings_window);
        add_action(settings_action);

        SimpleAction quit_action = new SimpleAction("quit", null);
        quit_action.activate.connect(quit);
        add_action(quit_action);
        add_accelerator("<Ctrl>Q", "app.quit", null);

        Builder builder = new Builder.from_resource("/org/dino-im/menu_app.ui");
        MenuModel menu = builder.get_object("menu_app") as MenuModel;

        set_app_menu(menu);
    }

    private void restore() {
        foreach (Account account in db.get_accounts()) {
            if (account.enabled) add_connection(account);
        }
    }

    private void add_connection(Account account) {
        stream_interaction.connect(account);
    }

    private void remove_connection(Account account) {
        stream_interaction.disconnect(account);
    }

    private void load_css() {
        var css_provider = new Gtk.CssProvider ();
        try {
            var file = File.new_for_uri("resource:///org/dino-im/style.css");
            css_provider.load_from_file (file);
        } catch (GLib.Error e) {
            warning ("loading css: %s", e.message);
        }
        Gtk.StyleContext.add_provider_for_screen (Gdk.Screen.get_default(), css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
    }
}