summaryrefslogtreecommitdiffstats
path: root/ui.cpp
blob: d0fc58bbe0ef900aef57e4ef5905c912d67953ab (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
#include "ui.h"
#include "draw.h"
#include "window.h"
#include <gtk/gtk.h>
#include <string.h>


static const gchar *uiData =
"<ui>"
  "<menubar>"
    "<menu action=\"fileMenu\">"
      "<menuitem action=\"new\"/>"
      "<menuitem action=\"open\"/>"
      "<menuitem action=\"save\"/>"
      "<menuitem action=\"saveAs\"/>"
      "<separator/>"
      "<menuitem action=\"quit\"/>"
    "</menu>"
  "</menubar>"
  "<toolbar action=\"toolbar1\">"
    "<separator/>"
      "<toolitem action=\"zoomIn\"/>"
      "<toolitem action=\"zoomOut\"/>"
    "<separator/>"
  "</toolbar>"
"</ui>";


static void handleAction(GtkAction *action, gpointer user_data) {
  const gchar* name = gtk_action_get_name(action);
  
  if(!strcmp(name, "zoomIn"))
    zoomInCentered(1.2);
  else if(!strcmp(name, "zoomOut"))
    zoomOutCentered(1.2);
}

static GtkActionGroup *createActions() {
  GtkActionGroup *actionGroup = gtk_action_group_new("actions");
  GtkAction *action;
  
  action = gtk_action_new("fileMenu", "_File", NULL, NULL);
  gtk_action_group_add_action(actionGroup, action);
  
  action = gtk_action_new("toolbar1", "Toolbar", NULL, NULL);
  gtk_action_group_add_action(actionGroup, action);
  
  action = gtk_action_new("new", "_New", NULL, GTK_STOCK_NEW);
  gtk_action_group_add_action_with_accel(actionGroup, action, NULL);
  
  action = gtk_action_new("open", "_Open", NULL, GTK_STOCK_OPEN);
  gtk_action_group_add_action_with_accel(actionGroup, action, NULL);
  
  action = gtk_action_new("save", "_Save", NULL, GTK_STOCK_SAVE);
  gtk_action_group_add_action_with_accel(actionGroup, action, NULL);
  
  action = gtk_action_new("saveAs", "Save _As", NULL, NULL);
  gtk_action_group_add_action(actionGroup, action);
  
  action = gtk_action_new("zoomIn", "Zoom _in", NULL, GTK_STOCK_ZOOM_IN);
  g_signal_connect(G_OBJECT(action), "activate", G_CALLBACK(handleAction), NULL);
  gtk_action_group_add_action_with_accel(actionGroup, action, NULL);
  
  action = gtk_action_new("zoomOut", "Zoom _out", NULL, GTK_STOCK_ZOOM_OUT);
  g_signal_connect(G_OBJECT(action), "activate", G_CALLBACK(handleAction), NULL);
  gtk_action_group_add_action_with_accel(actionGroup, action, NULL);
  
  action = gtk_action_new("quit", "_Quit", NULL, GTK_STOCK_QUIT);
  g_signal_connect(G_OBJECT(action), "activate", G_CALLBACK(gtk_main_quit), NULL);
  gtk_action_group_add_action_with_accel(actionGroup, action, NULL);
  
  return actionGroup;
}

static GtkUIManager* getUIManager() {
  static GtkUIManager *uiManager = NULL;
  
  if(!uiManager) {
    
    
    uiManager = gtk_ui_manager_new();
    gtk_ui_manager_add_ui_from_string(uiManager, uiData, -1, NULL);
    
    gtk_ui_manager_insert_action_group(uiManager, createActions(), 0);
    
    gtk_ui_manager_ensure_update(uiManager);
  }
  
  return uiManager;
}


GtkWidget* getMenu() {
  return gtk_ui_manager_get_widget(getUIManager(), "/ui/menubar");
}

GtkWidget* getToolbar() {
  return gtk_ui_manager_get_widget(getUIManager(), "/ui/toolbar1");
}

GtkAccelGroup *getAccels() {
  return gtk_ui_manager_get_accel_group(getUIManager());
}