summaryrefslogtreecommitdiffstats
path: root/src/gui/Ephraim.vala
blob: fe9f4313fdfc9bdc5cd9348bbeb56229e1afd352 (plain)
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
public class Ephraim {
  public static int main(string[] args) {
    Gtk.init(ref args);
    
    Gtk.Builder builder = new Gtk.Builder();
    try {
      builder.add_objects_from_file("ephraim.glade", {"MainWindow"});
    } catch(Error e) {
      return 1;
    }
    
    Roster roster = new Roster();
    CoreConnector coreconn = new CoreConnector();
    
    coreconn.update_contact.connect(roster.update_contact);
    
    unowned Gtk.Window window = builder.get_object("MainWindow") as Gtk.Window;
    window.hide.connect(Gtk.main_quit);
    
    unowned Gtk.MenuItem quitItem = builder.get_object("MenuItemQuit") as Gtk.MenuItem;
    quitItem.activate.connect(() => window.visible = false);
    
    unowned Gtk.TreeView rosterView  = builder.get_object("Roster") as Gtk.TreeView;
    rosterView.set_model(roster);
    
    Gee.TreeMap<string, Conversation> conversations = new Gee.TreeMap<string, Conversation>();
    unowned Gtk.Notebook conversationNotebook = builder.get_object("Conversations") as Gtk.Notebook;
    
    // FIXME
    string me = "/me";
    
    coreconn.new_conversation.connect((jid) => {
        Contact contact = roster.get_contact(jid);
        
        if(contact != null) {
          conversations[jid] = new Conversation(conversationNotebook, me, jid, contact.display_string);
        }
        else {
          conversations[jid] = new Conversation(conversationNotebook, me, jid, null);
        }
        
        conversations[jid].send_message.connect((type, message) => coreconn.send_message(jid, type, message));
      });
    
    coreconn.receive_message.connect((jid, type, message) => {
        if(!(jid in conversations))
          return;
        
        conversations[jid].receive_message(type, message);
      });
    coreconn.sent_message.connect((jid, type, message) => {
        if(!(jid in conversations))
          return;
        
        conversations[jid].sent_message(type, message);
      });
    
    if(!coreconn.start())
      return 1;
    
    rosterView.query_tooltip.connect((x, y, keyboard_tip, tooltip) => {
        Gtk.TreeModel model;
        Gtk.TreeIter iter;
        
        if(!rosterView.get_tooltip_context(out x, out y, keyboard_tip, out model, null, out iter))
          return false;
        
        Value value;
        model.get_value(iter, 0, out value);
        
        Contact? c = value.get_object() as Contact;
        if(c == null)
          return false;
        
        Gee.Map.Entry<string, Contact.Resource>? r = c.get_resource_with_highest_priority();
        
        if(r == null)
          return false;
        
        tooltip.set_text("Resource: " + r.key + " (" + r.value.priority.to_string() + ")");
        
        return true;
      });
    rosterView.has_tooltip = true;
    
    rosterView.row_activated.connect((view, path, column) => {
        Gtk.TreeIter iter;
        roster.get_iter(out iter, path);
        
        Value value;
        roster.get_value(iter, 0, out value);
        
        Contact contact = value.get_object() as Contact;
        if(contact == null)
          return;
        
        Gee.Map.Entry<string, Contact.Resource> res = contact.get_resource_with_highest_priority();
        if(res == null)
          return; //FIXME
        
        coreconn.start_conversation(contact.jid + "/" + res.key);
      });
    
    Gtk.TreeViewColumn presenceColumn = new Gtk.TreeViewColumn.with_attributes(null, new CellRendererPresence(), "contact", 0, null);
    presenceColumn.min_width = 32;
    rosterView.append_column(presenceColumn);
    
    Gtk.TreeViewColumn contactColumn = new Gtk.TreeViewColumn();
    
    Gtk.CellRenderer cellRendererContact = new CellRendererContact();
    contactColumn.pack_start(cellRendererContact, true);
    contactColumn.set_attributes(cellRendererContact, "contact", 0, null);
    
    Gtk.CellRenderer cellRendererAvatar = new CellRendererAvatar();
    contactColumn.pack_end(cellRendererAvatar, false);
    contactColumn.set_attributes(cellRendererAvatar, "contact", 0, null);
    
    rosterView.append_column(contactColumn);
    
    window.visible = true;
    
    Gtk.main();
    
    coreconn.stop();
    
    return 0;
  }
}