Skip to content
Snippets Groups Projects

Improve favorites menu a bit

Merged Guido Gunther requested to merge guido.gunther/phosh:favorites into master
4 files
+ 118
15
Compare changes
  • Side-by-side
  • Inline
Files
4
+ 73
13
@@ -13,18 +13,22 @@
#include "config.h"
#include "favorites.h"
#include "phosh.h"
#include <gio/gdesktopappinfo.h>
enum {
APP_LAUNCHED,
SELECTION_ABORTED,
N_SIGNALS
};
static guint signals[N_SIGNALS] = { 0 };
typedef struct
{
GtkWidget *grid;
GtkWidget *scroll;
GtkWidget *evbox;
GtkWidget *flowbox;
GSettings *settings;
} PhoshFavoritesPrivate;
@@ -34,7 +38,7 @@ struct _PhoshFavorites
GtkWindowClass parent;
};
G_DEFINE_TYPE_WITH_PRIVATE(PhoshFavorites, phosh_favorites, GTK_TYPE_WINDOW)
G_DEFINE_TYPE_WITH_PRIVATE(PhoshFavorites, phosh_favorites, GTK_TYPE_WINDOW)
static void
@@ -89,6 +93,9 @@ add_favorite (PhoshFavorites *self,
gtk_style_context_add_class (gtk_widget_get_style_context (btn),
"phosh-favorite");
gtk_style_context_add_class (gtk_widget_get_style_context( GTK_WIDGET(btn) ),
"circular");
gtk_button_set_image (GTK_BUTTON (btn), image);
g_object_set (image, "margin", 20, NULL);
@@ -101,7 +108,7 @@ add_favorite (PhoshFavorites *self,
/* Add weston terminal as band aid in case all else fails for now */
static void
add_weston_terminal (PhoshFavorites *self, gint row)
add_weston_terminal (PhoshFavorites *self)
{
PhoshFavoritesPrivate *priv = phosh_favorites_get_instance_private (self);
GIcon *icon;
@@ -117,8 +124,11 @@ add_weston_terminal (PhoshFavorites *self, gint row)
g_object_set (image, "margin", 20, NULL);
gtk_button_set_image (GTK_BUTTON (btn), image);
gtk_style_context_add_class (gtk_widget_get_style_context( GTK_WIDGET(btn) ),
"circular");
g_signal_connect_swapped (btn, "clicked", G_CALLBACK (term_btn_clicked), self);
gtk_grid_attach (GTK_GRID (priv->grid), btn, 1, row++, 1, 1);
gtk_flow_box_insert (GTK_FLOW_BOX (priv->flowbox), btn, -1);
}
@@ -130,20 +140,37 @@ favorites_changed (GSettings *settings,
PhoshFavoritesPrivate *priv = phosh_favorites_get_instance_private (self);
gchar **favorites = g_settings_get_strv (settings, key);
GtkWidget *btn;
guint row = 1;
/* Remove all favorites first */
gtk_container_foreach (GTK_CONTAINER (priv->grid),
gtk_container_foreach (GTK_CONTAINER (priv->flowbox),
(GtkCallback) gtk_widget_destroy, NULL);
add_weston_terminal (self, row++);
for (gint i = 0; i < g_strv_length (favorites); i++) {
gchar *fav = favorites[i];
btn = add_favorite (self, fav);
if (btn)
gtk_grid_attach (GTK_GRID (priv->grid), btn, 1, row++, 1, 1);
gtk_flow_box_insert (GTK_FLOW_BOX (priv->flowbox), btn, -1);
}
g_strfreev (favorites);
add_weston_terminal (self);
}
static gboolean
draw_cb (GtkWidget *widget, cairo_t *cr, gpointer unused)
{
cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.1);
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
cairo_paint (cr);
return FALSE;
}
static gboolean
evbox_button_press_event_cb (PhoshFavorites *self, GdkEventButton *event)
{
g_signal_emit(self, signals[SELECTION_ABORTED], 0);
return FALSE;
}
@@ -152,23 +179,53 @@ phosh_favorites_constructed (GObject *object)
{
PhoshFavorites *self = PHOSH_FAVORITES (object);
PhoshFavoritesPrivate *priv = phosh_favorites_get_instance_private (self);
gint width, height;
G_OBJECT_CLASS (phosh_favorites_parent_class)->constructed (object);
/* window properties */
phosh_shell_get_usable_area (phosh(), NULL, NULL, &width, &height);
gtk_window_set_title (GTK_WINDOW (self), "phosh favorites");
gtk_window_set_decorated (GTK_WINDOW (self), FALSE);
gtk_window_resize (GTK_WINDOW (self), 100, 250);
gtk_window_resize (GTK_WINDOW (self), width, height);
gtk_widget_realize(GTK_WIDGET (self));
gtk_widget_set_app_paintable(GTK_WIDGET (self), TRUE);
g_signal_connect (G_OBJECT(self),
"draw",
G_CALLBACK(draw_cb),
NULL);
gtk_style_context_add_class (
gtk_widget_get_style_context (GTK_WIDGET (self)),
"phosh-favorites");
priv->grid = gtk_widget_new (GTK_TYPE_GRID, "halign",
GTK_ALIGN_CENTER, "valign",
GTK_ALIGN_CENTER, NULL);
gtk_container_add (GTK_CONTAINER (self), priv->grid);
/* Flowbox */
priv->flowbox = gtk_widget_new (GTK_TYPE_FLOW_BOX,
"halign", GTK_ALIGN_START,
"valign", GTK_ALIGN_CENTER,
"selection-mode", GTK_SELECTION_NONE,
"orientation", GTK_ORIENTATION_VERTICAL,
NULL);
gtk_flow_box_set_max_children_per_line (GTK_FLOW_BOX(priv->flowbox), G_MAXINT);
gtk_flow_box_set_homogeneous (GTK_FLOW_BOX(priv->flowbox), TRUE);
/* Scrolled window */
priv->scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scroll),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_NEVER);
gtk_container_add (GTK_CONTAINER (priv->scroll), priv->flowbox);
/* Eventbox */
priv->evbox = gtk_event_box_new ();
gtk_container_add (GTK_CONTAINER (priv->evbox), priv->scroll);
g_signal_connect_swapped (priv->evbox, "button_press_event",
G_CALLBACK (evbox_button_press_event_cb),
self);
gtk_widget_set_events (priv->evbox, GDK_BUTTON_PRESS_MASK);
gtk_container_add (GTK_CONTAINER (self), priv->evbox);
priv->settings = g_settings_new ("sm.puri.phosh");
g_signal_connect (priv->settings, "changed::favorites",
@@ -200,6 +257,9 @@ phosh_favorites_class_init (PhoshFavoritesClass *klass)
signals[APP_LAUNCHED] = g_signal_new ("app-launched",
G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL,
NULL, G_TYPE_NONE, 0);
signals[SELECTION_ABORTED] = g_signal_new ("selection-aborted",
G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL,
NULL, G_TYPE_NONE, 0);
}
Loading