[gnome-photos/wip/foo: 2/7] main-toolbar: Add a gear menu with "Open" and "Properties" in it
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-photos/wip/foo: 2/7] main-toolbar: Add a gear menu with "Open" and "Properties" in it
- Date: Tue, 26 Mar 2013 16:44:11 +0000 (UTC)
commit 01ae77e0d02df032de80696c41a5292e5cd15692
Author: Debarshi Ray <debarshir gnome org>
Date: Mon Mar 25 21:00:44 2013 +0100
main-toolbar: Add a gear menu with "Open" and "Properties" in it
src/Makefile.am | 1 +
src/photos-application.c | 85 ++++++++++++++++++++++++++++++++++++++++++++
src/photos-main-toolbar.c | 55 ++++++++++++++++++++++++++++
src/photos-preview-menu.ui | 16 ++++++++
src/photos.gresource.xml | 1 +
5 files changed, 158 insertions(+), 0 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index e0798ab..51cd2c2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -163,6 +163,7 @@ EXTRA_DIST = \
photos.gresource.xml \
photos-app-menu.ui \
photos-marshalers.list \
+ photos-preview-menu.ui \
photos-selection-menu.ui \
photos-tracker-resources.xml \
$(null)
diff --git a/src/photos-application.c b/src/photos-application.c
index 76a462a..0d9f54a 100644
--- a/src/photos-application.c
+++ b/src/photos-application.c
@@ -32,8 +32,10 @@
#include "eog-debug.h"
#include "photos-application.h"
+#include "photos-item-manager.h"
#include "photos-main-window.h"
#include "photos-mode-controller.h"
+#include "photos-properties-dialog.h"
#include "photos-resources.h"
@@ -41,9 +43,13 @@ struct _PhotosApplicationPrivate
{
GResource *resource;
GSimpleAction *fs_action;
+ GSimpleAction *gear_action;
+ GSimpleAction *open_action;
+ GSimpleAction *properties_action;
GSimpleAction *sel_all_action;
GSimpleAction *sel_none_action;
GtkWidget *main_window;
+ PhotosBaseManager *item_mngr;
PhotosModeController *mode_cntrlr;
};
@@ -52,6 +58,24 @@ G_DEFINE_TYPE (PhotosApplication, photos_application, GTK_TYPE_APPLICATION)
static void
+photos_application_action_toggle (GSimpleAction *simple, GVariant *parameter, gpointer user_data)
+{
+ PhotosApplication *self = PHOTOS_APPLICATION (user_data);
+ PhotosApplicationPrivate *priv = self->priv;
+ GVariant *state;
+ GVariant *new_state;
+
+ state = g_action_get_state (G_ACTION (simple));
+ if (state == NULL)
+ return;
+
+ new_state = g_variant_new ("b", !g_variant_get_boolean (state));
+ g_action_change_state (G_ACTION (simple), new_state);
+ g_variant_unref (state);
+}
+
+
+static void
photos_application_can_fullscreen_changed (PhotosModeController *mode_cntrlr, gpointer user_data)
{
PhotosApplication *self = PHOTOS_APPLICATION (user_data);
@@ -74,6 +98,42 @@ photos_application_fullscreen (GSimpleAction *simple, GVariant *parameter, gpoin
static void
+photos_application_open_current (PhotosApplication *self)
+{
+ PhotosApplicationPrivate *priv = self->priv;
+ GdkScreen *screen;
+ PhotosBaseItem *item;
+ guint32 time;
+
+ item = PHOTOS_BASE_ITEM (photos_base_manager_get_active_object (priv->item_mngr));
+ if (item == NULL)
+ return;
+
+ screen = gtk_window_get_screen (GTK_WINDOW (priv->main_window));
+ time = gtk_get_current_event_time ();
+ photos_base_item_open (item, screen, time);
+}
+
+
+static void
+photos_application_properties (PhotosApplication *self)
+{
+ PhotosApplicationPrivate *priv = self->priv;
+ GtkWidget *dialog;
+ PhotosBaseItem *item;
+ const gchar *id;
+
+ item = PHOTOS_BASE_ITEM (photos_base_manager_get_active_object (priv->item_mngr));
+ if (item == NULL)
+ return;
+
+ id = photos_base_item_get_id (item);
+ dialog = photos_properties_dialog_new (GTK_WINDOW (priv->main_window), id);
+ g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
+}
+
+
+static void
photos_application_quit (GSimpleAction *simple, GVariant *parameter, gpointer user_data)
{
PhotosApplication *self = PHOTOS_APPLICATION (user_data);
@@ -92,6 +152,11 @@ photos_application_window_mode_changed (PhotosApplication *self, PhotosWindowMod
enable = (mode == PHOTOS_WINDOW_MODE_OVERVIEW || mode == PHOTOS_WINDOW_MODE_FAVORITES);
g_simple_action_set_enabled (priv->sel_all_action, enable);
g_simple_action_set_enabled (priv->sel_none_action, enable);
+
+ enable = (mode == PHOTOS_WINDOW_MODE_PREVIEW);
+ g_simple_action_set_enabled (priv->gear_action, enable);
+ g_simple_action_set_enabled (priv->open_action, enable);
+ g_simple_action_set_enabled (priv->properties_action, enable);
}
@@ -114,6 +179,7 @@ photos_application_startup (GApplication *application)
GSimpleAction *action;
GtkBuilder *builder;
GtkSettings *settings;
+ GVariant *state;
G_APPLICATION_CLASS (photos_application_parent_class)
->startup (application);
@@ -126,6 +192,7 @@ photos_application_startup (GApplication *application)
settings = gtk_settings_get_default ();
g_object_set (settings, "gtk-application-prefer-dark-theme", TRUE, NULL);
+ priv->item_mngr = photos_item_manager_new ();
priv->mode_cntrlr = photos_mode_controller_new ();
action = g_simple_action_new ("about", NULL);
@@ -142,6 +209,19 @@ photos_application_startup (GApplication *application)
G_CALLBACK (photos_application_can_fullscreen_changed),
self);
+ state = g_variant_new ("b", FALSE);
+ priv->gear_action = g_simple_action_new_stateful ("gear-menu", NULL, state);
+ g_signal_connect (priv->gear_action, "activate", G_CALLBACK (photos_application_action_toggle), self);
+ g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (priv->gear_action));
+
+ priv->open_action = g_simple_action_new ("open-current", NULL);
+ g_signal_connect_swapped (priv->open_action, "activate", G_CALLBACK (photos_application_open_current),
self);
+ g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (priv->open_action));
+
+ priv->properties_action = g_simple_action_new ("properties", NULL);
+ g_signal_connect_swapped (priv->properties_action, "activate", G_CALLBACK (photos_application_properties),
self);
+ g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (priv->properties_action));
+
action = g_simple_action_new ("quit", NULL);
g_signal_connect (action, "activate", G_CALLBACK (photos_application_quit), self);
g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (action));
@@ -167,6 +247,7 @@ photos_application_startup (GApplication *application)
gtk_application_add_accelerator (GTK_APPLICATION (self), "<Primary>q", "app.quit", NULL);
gtk_application_add_accelerator (GTK_APPLICATION (self), "F11", "app.fullscreen", NULL);
+ gtk_application_add_accelerator (GTK_APPLICATION (self), "F10", "app.gear-menu", NULL);
gtk_application_add_accelerator (GTK_APPLICATION (self), "<Primary>a", "app.select-all", NULL);
priv->main_window = photos_main_window_new (GTK_APPLICATION (self));
@@ -206,8 +287,12 @@ photos_application_dispose (GObject *object)
}
g_clear_object (&priv->fs_action);
+ g_clear_object (&priv->gear_action);
+ g_clear_object (&priv->open_action);
+ g_clear_object (&priv->properties_action);
g_clear_object (&priv->sel_all_action);
g_clear_object (&priv->sel_none_action);
+ g_clear_object (&priv->item_mngr);
g_clear_object (&priv->mode_cntrlr);
G_OBJECT_CLASS (photos_application_parent_class)
diff --git a/src/photos-main-toolbar.c b/src/photos-main-toolbar.c
index f01c225..272839a 100644
--- a/src/photos-main-toolbar.c
+++ b/src/photos-main-toolbar.c
@@ -30,6 +30,7 @@
#include <glib/gi18n.h>
#include <libgd/gd.h>
+#include "photos-application.h"
#include "photos-collection-manager.h"
#include "photos-header-bar.h"
#include "photos-item-manager.h"
@@ -41,6 +42,7 @@
struct _PhotosMainToolbarPrivate
{
+ GSimpleAction *gear_menu;
GtkWidget *coll_back_button;
GtkWidget *selection_menu;
GtkWidget *toolbar;
@@ -249,6 +251,43 @@ photos_main_toolbar_clear_toolbar (PhotosMainToolbar *self)
photos_main_toolbar_clear_state_data (self);
photos_header_bar_clear (PHOTOS_HEADER_BAR (priv->toolbar));
+ g_simple_action_set_enabled (priv->gear_menu, FALSE);
+}
+
+
+static GMenu *
+photos_main_toolbar_create_preview_menu (PhotosMainToolbar *self)
+{
+ GMenu *menu;
+ GtkBuilder *builder;
+ PhotosBaseItem *item;
+
+ builder = gtk_builder_new ();
+ gtk_builder_add_from_resource (builder, "/org/gnome/photos/preview-menu.ui", NULL);
+
+ menu = G_MENU (g_object_ref (gtk_builder_get_object (builder, "preview-menu")));
+ item = PHOTOS_BASE_ITEM (photos_base_manager_get_active_object (self->priv->item_mngr));
+ if (item != NULL)
+ {
+ const gchar *default_app_name;
+
+ default_app_name = photos_base_item_get_default_app_name (item);
+ if (default_app_name != NULL)
+ {
+ GMenu *section;
+ gchar *label;
+
+ section = G_MENU (gtk_builder_get_object (builder, "open-section"));
+ g_menu_remove (section, 0);
+
+ label = g_strdup_printf (_("Open with %s"), default_app_name);
+ g_menu_prepend (section, label, "app.open-current");
+ g_free (label);
+ }
+ }
+
+ g_object_unref (builder);
+ return menu;
}
@@ -292,12 +331,23 @@ static void
photos_main_toolbar_populate_for_preview (PhotosMainToolbar *self)
{
PhotosMainToolbarPrivate *priv = self->priv;
+ GMenu *preview_menu;
GtkWidget *back_button;
+ GtkWidget *menu_button;
photos_header_bar_set_mode (PHOTOS_HEADER_BAR (priv->toolbar), PHOTOS_HEADER_BAR_MODE_STANDALONE);
back_button = photos_main_toolbar_add_back_button (self);
g_signal_connect (back_button, "clicked", G_CALLBACK (photos_main_toolbar_back_button_clicked), self);
+
+ preview_menu = photos_main_toolbar_create_preview_menu (self);
+ menu_button = gd_header_menu_button_new ();
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (menu_button), "app.gear-menu");
+ gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (menu_button), G_MENU_MODEL (preview_menu));
+ gd_header_button_set_symbolic_icon_name (GD_HEADER_BUTTON (menu_button), "emblem-system-symbolic");
+ gd_header_bar_pack_end (GD_HEADER_BAR (priv->toolbar), menu_button);
+
+ g_simple_action_set_enabled (priv->gear_menu, TRUE);
}
@@ -398,6 +448,7 @@ photos_main_toolbar_init (PhotosMainToolbar *self)
{
PhotosMainToolbarPrivate *priv;
GMenu *selection_menu;
+ GtkApplication *app;
GtkBuilder *builder;
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, PHOTOS_TYPE_MAIN_TOOLBAR, PhotosMainToolbarPrivate);
@@ -410,6 +461,10 @@ photos_main_toolbar_init (PhotosMainToolbar *self)
gtk_container_add (GTK_CONTAINER (self), priv->toolbar);
gtk_widget_show (priv->toolbar);
+ app = photos_application_new ();
+ priv->gear_menu = G_SIMPLE_ACTION (g_action_map_lookup_action (G_ACTION_MAP (app), "gear-menu"));
+ g_object_unref (app);
+
builder = gtk_builder_new ();
gtk_builder_add_from_resource (builder, "/org/gnome/photos/selection-menu.ui", NULL);
diff --git a/src/photos-preview-menu.ui b/src/photos-preview-menu.ui
new file mode 100644
index 0000000..0f1e523
--- /dev/null
+++ b/src/photos-preview-menu.ui
@@ -0,0 +1,16 @@
+<interface>
+ <menu id="preview-menu">
+ <section id="open-section">
+ <item>
+ <attribute name="action">app.open-current</attribute>
+ <attribute name="label" translatable="yes">Open</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="action">app.properties</attribute>
+ <attribute name="label" translatable="yes">Properties</attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
diff --git a/src/photos.gresource.xml b/src/photos.gresource.xml
index ff23572..458373e 100644
--- a/src/photos.gresource.xml
+++ b/src/photos.gresource.xml
@@ -2,6 +2,7 @@
<gresources>
<gresource prefix="/org/gnome/photos">
<file alias="app-menu.ui" preprocess="xml-stripblanks">photos-app-menu.ui</file>
+ <file alias="preview-menu.ui" preprocess="xml-stripblanks">photos-preview-menu.ui</file>
<file alias="selection-menu.ui" preprocess="xml-stripblanks">photos-selection-menu.ui</file>
</gresource>
</gresources>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]