1
/* gb-workbench-actions.c
3
* Copyright (C) 2015 Christian Hergert <christian@hergert.me>
5
* This program is free software: you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation, either version 3 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19
#define G_LOG_DOMAIN "gb-workbench-actions"
21
#include <glib/gi18n.h>
24
#include "gb-workbench.h"
25
#include "gb-workbench-actions.h"
26
#include "gb-workbench-private.h"
29
gb_workbench_actions_build (GSimpleAction *action,
33
GbWorkbench *self = user_data;
35
g_assert (GB_IS_WORKBENCH (self));
37
gb_workbench_build_async (self, FALSE, NULL, NULL, NULL);
41
gb_workbench_actions_rebuild (GSimpleAction *action,
45
GbWorkbench *self = user_data;
47
g_assert (GB_IS_WORKBENCH (self));
49
gb_workbench_build_async (self, TRUE, NULL, NULL, NULL);
53
gb_workbench_actions_new_document (GSimpleAction *action,
57
GbWorkbench *self = user_data;
59
g_assert (GB_IS_WORKBENCH (self));
61
gb_workbench_add_temporary_buffer (self);
65
gb_workbench_actions_global_search (GSimpleAction *action,
69
GbWorkbench *self = user_data;
71
g_assert (GB_IS_WORKBENCH (self));
73
gtk_widget_grab_focus (GTK_WIDGET (self->search_box));
77
gb_workbench_actions_open_uri_list (GSimpleAction *action,
81
GbWorkbench *self = user_data;
82
const gchar **uri_list;
84
g_assert (GB_IS_WORKBENCH (self));
86
uri_list = g_variant_get_strv (parameter, NULL);
90
gb_workbench_open_uri_list (self, (const gchar * const *)uri_list);
96
gb_workbench_actions_open_response (GtkFileChooser *chooser,
100
g_autoptr(GbWorkbench) self = user_data;
102
g_assert (GB_IS_WORKBENCH (self));
104
gtk_widget_hide (GTK_WIDGET (chooser));
108
case GTK_RESPONSE_OK:
115
file_uri = gtk_file_chooser_get_uri (chooser);
116
uri = g_path_get_dirname (file_uri);
117
if (g_strcmp0 (self->current_folder_uri, uri) != 0)
119
g_free (self->current_folder_uri);
120
self->current_folder_uri = uri;
126
files = gtk_file_chooser_get_files (chooser);
127
for (iter = files; iter; iter = iter->next)
129
gb_workbench_open (self, G_FILE (iter->data));
130
g_clear_object (&iter->data);
132
g_slist_free (files);
136
case GTK_RESPONSE_CANCEL:
141
gtk_widget_destroy (GTK_WIDGET (chooser));
145
gb_workbench_actions_open (GSimpleAction *action,
149
GbWorkbench *self = user_data;
151
GtkWidget *suggested;
153
g_assert (GB_IS_WORKBENCH (self));
155
dialog = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG,
156
"action", GTK_FILE_CHOOSER_ACTION_OPEN,
159
"select-multiple", TRUE,
160
"show-hidden", FALSE,
161
"transient-for", self,
162
"title", _("Open Document"),
165
if (self->current_folder_uri != NULL)
166
gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dialog), self->current_folder_uri);
168
gtk_dialog_add_buttons (GTK_DIALOG (dialog),
169
_("Cancel"), GTK_RESPONSE_CANCEL,
170
_("Open"), GTK_RESPONSE_OK,
173
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
175
suggested = gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
176
gtk_style_context_add_class (gtk_widget_get_style_context (suggested),
177
GTK_STYLE_CLASS_SUGGESTED_ACTION);
179
g_signal_connect (dialog,
181
G_CALLBACK (gb_workbench_actions_open_response),
182
g_object_ref (self));
184
gtk_window_present (GTK_WINDOW (dialog));
188
gb_workbench_actions_save_all (GSimpleAction *action,
192
GbWorkbench *self = user_data;
193
IdeBufferManager *buffer_manager;
195
g_assert (GB_IS_WORKBENCH (self));
197
buffer_manager = ide_context_get_buffer_manager (self->context);
198
ide_buffer_manager_save_all_async (buffer_manager, NULL, NULL, NULL);
202
save_all_quit_cb (GObject *object,
203
GAsyncResult *result,
206
IdeBufferManager *buffer_manager = (IdeBufferManager *)object;
207
g_autoptr(GbWorkbench) self = user_data;
209
g_assert (GB_IS_WORKBENCH (self));
210
g_assert (IDE_IS_BUFFER_MANAGER (buffer_manager));
212
/* TODO: We should find a way to propagate error info back.
213
* Right now, save_all doesn't.
216
ide_buffer_manager_save_all_finish (buffer_manager, result, NULL);
217
gtk_window_close (GTK_WINDOW (self));
221
gb_workbench_actions_save_all_quit (GSimpleAction *action,
225
GbWorkbench *self = user_data;
226
IdeBufferManager *buffer_manager;
228
g_assert (GB_IS_WORKBENCH (self));
230
buffer_manager = ide_context_get_buffer_manager (self->context);
231
ide_buffer_manager_save_all_async (buffer_manager, NULL, save_all_quit_cb, g_object_ref (self));
235
gb_workbench_actions_show_command_bar (GSimpleAction *action,
239
GbWorkbench *self = user_data;
241
g_assert (GB_IS_WORKBENCH (self));
243
gb_command_bar_show (self->command_bar);
247
gb_workbench_actions_nighthack (GSimpleAction *action,
251
g_autoptr(GSettings) settings = NULL;
253
g_object_set (gtk_settings_get_default (),
254
"gtk-application-prefer-dark-theme", TRUE,
257
settings = g_settings_new ("org.gnome.builder.editor");
258
g_settings_set_string (settings, "style-scheme-name", "builder-dark");
262
gb_workbench_actions_dayhack (GSimpleAction *action,
266
g_autoptr(GSettings) settings = NULL;
268
g_object_set (gtk_settings_get_default (),
269
"gtk-application-prefer-dark-theme", FALSE,
272
settings = g_settings_new ("org.gnome.builder.editor");
273
g_settings_set_string (settings, "style-scheme-name", "builder");
277
gb_workbench_actions_search_docs (GSimpleAction *action,
281
GbWorkbench *self = user_data;
284
g_return_if_fail (GB_IS_WORKBENCH (self));
286
str = g_variant_get_string (parameter, NULL);
287
gb_editor_workspace_search_help (self->editor_workspace, str);
291
gb_workbench_actions_show_gear_menu (GSimpleAction *action,
295
GbWorkbench *self = user_data;
297
g_assert (GB_IS_WORKBENCH (self));
299
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->gear_menu_button), TRUE);
302
static const GActionEntry GbWorkbenchActions[] = {
303
{ "build", gb_workbench_actions_build },
304
{ "dayhack", gb_workbench_actions_dayhack },
305
{ "global-search", gb_workbench_actions_global_search },
306
{ "new-document", gb_workbench_actions_new_document },
307
{ "nighthack", gb_workbench_actions_nighthack },
308
{ "open", gb_workbench_actions_open },
309
{ "open-uri-list", gb_workbench_actions_open_uri_list, "as" },
310
{ "rebuild", gb_workbench_actions_rebuild },
311
{ "save-all", gb_workbench_actions_save_all },
312
{ "save-all-quit", gb_workbench_actions_save_all_quit },
313
{ "search-docs", gb_workbench_actions_search_docs, "s" },
314
{ "show-command-bar", gb_workbench_actions_show_command_bar },
315
{ "show-gear-menu", gb_workbench_actions_show_gear_menu },
319
gb_workbench_actions_init (GbWorkbench *self)
321
GSimpleActionGroup *actions;
324
g_assert (GB_IS_WORKBENCH (self));
326
actions = g_simple_action_group_new ();
327
g_action_map_add_action_entries (G_ACTION_MAP (actions), GbWorkbenchActions,
328
G_N_ELEMENTS (GbWorkbenchActions), self);
330
action = g_action_map_lookup_action (G_ACTION_MAP (actions), "build");
331
g_object_bind_property (self, "building", action, "enabled",
332
(G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN));
334
action = g_action_map_lookup_action (G_ACTION_MAP (actions), "rebuild");
335
g_object_bind_property (self, "building", action, "enabled",
336
(G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN));
338
gtk_widget_insert_action_group (GTK_WIDGET (self), "workbench", G_ACTION_GROUP (actions));