X-Git-Url: http://pileus.org/git/?p=aweather;a=blobdiff_plain;f=src%2Faweather-gui.c;h=6d8e4239fadca1f331f3eeeb0b9bfebf0fef0594;hp=7b42818d912452dc08c0a344c45e8d549ec62db4;hb=5d02e9824afbc67d431e3d3e59797425f91cddcd;hpb=4e582af3ff02eebe2c5a1172dbd3052a0fafcf60 diff --git a/src/aweather-gui.c b/src/aweather-gui.c index 7b42818..6d8e423 100644 --- a/src/aweather-gui.c +++ b/src/aweather-gui.c @@ -26,6 +26,50 @@ #include "aweather-gui.h" #include "aweather-location.h" +/* Autohide */ +typedef struct { + GtkWidget *widget; + GtkWidget *window; + GtkPositionType position; + gulong handler; +} GtkAutohideData; +static gboolean _gtk_widget_autohide_cb(GtkWidget *win, + GdkEventMotion *event, GtkAutohideData *data) +{ + GtkAllocation alloc; + gtk_widget_get_allocation(data->window, &alloc); + if (data->position == GTK_POS_BOTTOM) + g_debug("GtkWidget: autohide_cb - y=%lf, h=%d", event->y, alloc.height); + gint position = -1; + if (event->x < 20) position = GTK_POS_LEFT; + if (event->y < 20) position = GTK_POS_TOP; + if (event->x > alloc.width - 20) position = GTK_POS_RIGHT; + if (event->y > alloc.height - 20) position = GTK_POS_BOTTOM; + if (position == data->position) + gtk_widget_show(data->widget); + else + gtk_widget_hide(data->widget); + return FALSE; +} +static void _gtk_widget_autohide(GtkWidget *widget, GtkWidget *viewer, + GtkPositionType position) +{ + GtkAutohideData *data = g_new0(GtkAutohideData, 1); + data->widget = widget; + data->position = position; + data->window = viewer; + data->handler = g_signal_connect(data->window, "motion-notify-event", + G_CALLBACK(_gtk_widget_autohide_cb), data); + g_object_set_data(G_OBJECT(widget), "autohidedata", data); + gtk_widget_hide(widget); +} +static void _gtk_widget_autoshow(GtkWidget *widget) +{ + GtkAutohideData *data = g_object_get_data(G_OBJECT(widget), "autohidedata"); + g_signal_handler_disconnect(data->window, data->handler); + g_free(data); + gtk_widget_show(widget); +} /************* * Callbacks * @@ -116,16 +160,22 @@ G_MODULE_EXPORT void on_zoomout(GtkAction *action, AWeatherGui *self) G_MODULE_EXPORT void on_fullscreen(GtkToggleAction *action, AWeatherGui *self) { - g_message("fullscreen"); - gchar *hide[] = {"main_menu", "main_sidebar", "main_tabs"}; + GtkWidget *menu = aweather_gui_get_widget(self, "main_menu"); + GtkWidget *toolbar = aweather_gui_get_widget(self, "main_toolbar"); + GtkWidget *sidebar = aweather_gui_get_widget(self, "main_sidebar"); + GtkWidget *tabs = aweather_gui_get_widget(self, "main_tabs"); if (gtk_toggle_action_get_active(action)) { gtk_window_fullscreen(GTK_WINDOW(self)); - for (int i = 0; i < G_N_ELEMENTS(hide); i++) - gtk_widget_hide(aweather_gui_get_widget(self, hide[i])); + gtk_widget_hide(menu); + _gtk_widget_autohide(toolbar, GTK_WIDGET(self->viewer), GTK_POS_TOP); + _gtk_widget_autohide(sidebar, GTK_WIDGET(self->viewer), GTK_POS_RIGHT); + _gtk_widget_autohide(tabs, GTK_WIDGET(self->viewer), GTK_POS_BOTTOM); } else { gtk_window_unfullscreen(GTK_WINDOW(self)); - for (int i = 0; i < G_N_ELEMENTS(hide); i++) - gtk_widget_show(aweather_gui_get_widget(self, hide[i])); + gtk_widget_show(menu); + _gtk_widget_autoshow(toolbar); + _gtk_widget_autoshow(sidebar); + _gtk_widget_autoshow(tabs); } } @@ -134,7 +184,37 @@ G_MODULE_EXPORT void on_refresh(GtkAction *action, AWeatherGui *self) grits_viewer_refresh(self->viewer); } -G_MODULE_EXPORT void on_plugin_toggled(GtkCellRendererToggle *cell, gchar *path_str, AWeatherGui *self) +static gboolean on_update_timeout(AWeatherGui *self) +{ + g_debug("AWeatherGui: on_update_timeout"); + grits_viewer_set_time(self->viewer, time(NULL)); + grits_viewer_refresh(self->viewer); + return FALSE; +} +static void set_update_timeout(AWeatherGui *self) +{ + GObject *action = aweather_gui_get_object(self, "update"); + gint freq = grits_prefs_get_integer(self->prefs, "aweather/update_freq", NULL); + if (self->update_source) { + g_debug("AWeatherGui: set_update_timeout - clear"); + g_source_remove(self->update_source); + } + self->update_source = 0; + if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)) && freq > 0) { + g_debug("AWeatherGui: set_update_timeout - %d min", freq); + self->update_source = g_timeout_add_seconds(freq*60, + (GSourceFunc)on_update_timeout, self); + } +} +G_MODULE_EXPORT void on_update(GtkToggleAction *action, AWeatherGui *self) +{ + grits_prefs_set_boolean(self->prefs, "aweather/update_enab", + gtk_toggle_action_get_active(action)); + set_update_timeout(self); +} + +G_MODULE_EXPORT void on_plugin_toggled(GtkCellRendererToggle *cell, + gchar *path_str, AWeatherGui *self) { GtkWidget *tview = aweather_gui_get_widget(self, "prefs_plugins_view"); GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tview)); @@ -218,6 +298,15 @@ G_MODULE_EXPORT void on_offline(GtkToggleAction *action, AWeatherGui *self) grits_viewer_set_offline(self->viewer, value); } +G_MODULE_EXPORT int on_update_freq_changed(GtkSpinButton *spinner, AWeatherGui *self) +{ + gint value = gtk_spin_button_get_value_as_int(spinner); + g_debug("AWeatherGui: on_update_freq_changed - %p, freq=%d", self, value); + grits_prefs_set_integer(self->prefs, "aweather/update_freq", value); + set_update_timeout(self); + return TRUE; +} + G_MODULE_EXPORT void on_initial_site_changed(GtkComboBox *combo, AWeatherGui *self) { gchar *code; @@ -282,12 +371,15 @@ static void site_setup(AWeatherGui *self) static void prefs_setup(AWeatherGui *self) { /* Set values */ + gint uf = grits_prefs_get_integer(self->prefs, "aweather/update_freq", NULL); gchar *nu = grits_prefs_get_string (self->prefs, "aweather/nexrad_url", NULL); gint ll = grits_prefs_get_integer(self->prefs, "aweather/log_level", NULL); gchar *is = grits_prefs_get_string (self->prefs, "aweather/initial_site", NULL); + GtkWidget *ufw = aweather_gui_get_widget(self, "prefs_general_freq"); GtkWidget *nuw = aweather_gui_get_widget(self, "prefs_general_url"); GtkWidget *llw = aweather_gui_get_widget(self, "prefs_general_log"); GtkWidget *isw = aweather_gui_get_widget(self, "prefs_general_site"); + if (uf) gtk_spin_button_set_value(GTK_SPIN_BUTTON(ufw), uf); if (nu) gtk_entry_set_text(GTK_ENTRY(nuw), nu), g_free(nu); if (ll) gtk_spin_button_set_value(GTK_SPIN_BUTTON(llw), ll); if (is) { @@ -310,6 +402,13 @@ static void prefs_setup(AWeatherGui *self) gtk_tree_view_append_column(tview, col2); g_signal_connect(rend2, "toggled", G_CALLBACK(on_plugin_toggled), self); gtk_tree_view_set_model(GTK_TREE_VIEW(tview), GTK_TREE_MODEL(self->gtk_plugins)); + + /* Setup auto update enable */ + gboolean auto_update = grits_prefs_get_boolean(self->prefs, "aweather/update_enab", NULL); + GObject *action = aweather_gui_get_object(self, "update"); + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), auto_update); + g_signal_connect_swapped(self->viewer, "refresh", G_CALLBACK(set_update_timeout), self); + set_update_timeout(self); } static void time_setup(AWeatherGui *self) @@ -342,6 +441,27 @@ static void time_setup(AWeatherGui *self) G_CALLBACK(update_time_widget), self); } +static void icons_setup(AWeatherGui *self) +{ + gchar *icons[] = { + ICONDIR "/hicolor/16x16/apps/aweather.png", + ICONDIR "/hicolor/22x22/apps/aweather.png", + ICONDIR "/hicolor/24x24/apps/aweather.png", + ICONDIR "/hicolor/32x32/apps/aweather.png", + ICONDIR "/hicolor/48x48/apps/aweather.png", + ICONDIR "/hicolor/scalable/apps/aweather.svg", + }; + GList *list = NULL; + for (int i = 0; i < G_N_ELEMENTS(icons); i++) { + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(icons[i], NULL); + if (!pixbuf) + g_warning("AWeatherGui: icons_setup - %s failed", icons[i]); + list = g_list_prepend(list, pixbuf); + } + gtk_window_set_default_icon_list(list); + g_list_free(list); +} + /*********** * Methods * @@ -407,6 +527,23 @@ void aweather_gui_deattach_plugin(AWeatherGui *self, const gchar *name) grits_plugins_disable(self->plugins, name); gtk_widget_queue_draw(GTK_WIDGET(self->viewer)); } +void aweather_gui_load_plugins(AWeatherGui *self) +{ + g_debug("AWeatherGui: load_plugins"); + GtkTreeIter iter; + for (GList *cur = grits_plugins_available(self->plugins); cur; cur = cur->next) { + gchar *name = cur->data; + GError *error = NULL; + gboolean enabled = grits_prefs_get_boolean_v(self->prefs, "plugins", cur->data, &error); + if (error && error->code == G_KEY_FILE_ERROR_GROUP_NOT_FOUND) + enabled = TRUE; + gtk_list_store_append(self->gtk_plugins, &iter); + gtk_list_store_set(self->gtk_plugins, &iter, 0, name, 1, enabled, -1); + if (enabled) + aweather_gui_attach_plugin(self, name); + } +} + /**************** @@ -424,29 +561,16 @@ static void aweather_gui_parser_finished(GtkBuildable *_self, GtkBuilder *builde self->prefs = grits_prefs_new(config, defaults); self->plugins = grits_plugins_new(PLUGINSDIR, self->prefs); self->viewer = GRITS_VIEWER(aweather_gui_get_widget(self, "main_viewer")); + self->gtk_plugins = GTK_LIST_STORE(aweather_gui_get_object(self, "plugins")); grits_viewer_setup(self->viewer, self->plugins, self->prefs); g_free(config); g_free(defaults); - /* Plugins */ - GtkTreeIter iter; - self->gtk_plugins = GTK_LIST_STORE(aweather_gui_get_object(self, "plugins")); - for (GList *cur = grits_plugins_available(self->plugins); cur; cur = cur->next) { - gchar *name = cur->data; - GError *error = NULL; - gboolean enabled = grits_prefs_get_boolean_v(self->prefs, "plugins", cur->data, &error); - if (error && error->code == G_KEY_FILE_ERROR_GROUP_NOT_FOUND) - enabled = TRUE; - gtk_list_store_append(self->gtk_plugins, &iter); - gtk_list_store_set(self->gtk_plugins, &iter, 0, name, 1, enabled, -1); - if (enabled) - aweather_gui_attach_plugin(self, name); - } - /* Misc, helpers */ site_setup(self); time_setup(self); prefs_setup(self); + icons_setup(self); /* Connect signals */ gtk_builder_connect_signals(self->builder, self); @@ -455,6 +579,8 @@ static void aweather_gui_parser_finished(GtkBuildable *_self, GtkBuilder *builde g_signal_connect_swapped(self->viewer, "offline", G_CALLBACK(gtk_toggle_action_set_active), aweather_gui_get_object(self, "offline")); + g_signal_connect_swapped(self->viewer, "realize", + G_CALLBACK(aweather_gui_load_plugins), self); } static void aweather_gui_buildable_init(GtkBuildableIface *iface) {