From d43e5fa873105d822fc212ee1c9bb8d18eeba259 Mon Sep 17 00:00:00 2001 From: Qball Cow Date: Sun, 10 May 2009 15:36:10 +0200 Subject: [PATCH] Turn plugin into a GmpcPluginBase object that implements the BrowserIface. --- src/plugin.c | 312 ++++++++++++++++++++++++++++++++++++----------------------- src/plugin.h | 33 ++++--- 2 files changed, 209 insertions(+), 136 deletions(-) rewrite src/plugin.h (81%) diff --git a/src/plugin.c b/src/plugin.c index 24156af..8b2047b 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -9,8 +9,19 @@ #include "exo-wrap-table.h" #include "plugin.h" +const GType albumview_plugin_get_type(void); +#define ALBUM_VIEW_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), albumview_plugin_get_type(), AlbumViewPlugin)) #define AV_LOG_DOMAIN "AlbumViewPlugin" +typedef struct _AlbumViewPluginPrivate { + int supported_columns; + int supported_rows; + + MpdData *data; +}_AlbumViewPluginPrivate; + + + static gchar * albumview_format_time(unsigned long seconds); static void albumview_browser_save_myself(void); /* Allow gmpc to check the version the plugin is compiled against */ @@ -20,42 +31,7 @@ GtkTreeModel *albumview_model = NULL; static void position_changed(GtkRange *range, gpointer data); static void filter_list(GtkEntry *entry, gpointer data); -void update_view(void); -/** - * Browser extention - */ -gmpcPlBrowserPlugin albumview_gbp = { - /** add */ - .add = albumview_add, - /** selected */ - .selected = albumview_selected, - /** unselected */ - .unselected = albumview_unselected, -}; - - -/** - * Define the plugin structure - */ -gmpcPlugin plugin = { - /* name */ - .name = "Album View", - /* version */ - .version = {PLUGIN_MAJOR_VERSION,PLUGIN_MINOR_VERSION,PLUGIN_MICRO_VERSION}, - /* type */ - .plugin_type = GMPC_PLUGIN_PL_BROWSER, - /* init function */ - .init = albumview_plugin_init, - /** playlist extention struct */ - .browser = &albumview_gbp, - /** Connection changed */ - .mpd_connection_changed = albumview_connection_changed, - /** enable/disable */ - .get_enabled = albumview_get_enabled, - .set_enabled = albumview_set_enabled, - /* Safe myself */ - .save_yourself = albumview_browser_save_myself -}; +void update_view(AlbumViewPlugin *self); static GtkTreeRowReference *albumview_ref = NULL; static GtkWidget *albumview_vbox= NULL, *albumview_tree = NULL,*albumview_combo = NULL; @@ -64,19 +40,19 @@ static gboolean cancel_query = FALSE; * Get/Set enable */ -int albumview_get_enabled(void) +static int albumview_get_enabled(GmpcPluginBase *plug) { return cfg_get_single_value_as_int_with_default(config, "albumview", "enable", TRUE); } -void albumview_set_enabled(int enabled) +void albumview_set_enabled(GmpcPluginBase *plug, int enabled) { cfg_set_single_value_as_int(config, "albumview", "enable", enabled); if(enabled) { if(albumview_ref == NULL) { - albumview_add(GTK_WIDGET(playlist3_get_category_tree_view())); + albumview_add(GMPC_PLUGIN_BROWSER_IFACE(plug), GTK_WIDGET(playlist3_get_category_tree_view())); } } else @@ -98,7 +74,7 @@ void albumview_set_enabled(int enabled) /** * Playlist browser functions */ -static void albumview_add(GtkWidget *category_tree) +static void albumview_add(GmpcPluginBrowserIface *plug, GtkWidget *category_tree) { GtkTreePath *path; GtkTreeModel *model = GTK_TREE_MODEL(playlist3_get_category_tree_store()); @@ -114,7 +90,7 @@ static void albumview_add(GtkWidget *category_tree) pos = cfg_get_single_value_as_int_with_default(config, "albumview","position",2); playlist3_insert_browser(&iter, pos); gtk_list_store_set(GTK_LIST_STORE(model), &iter, - PL3_CAT_TYPE, plugin.id, + PL3_CAT_TYPE, GMPC_PLUGIN_BASE(plug)->id, PL3_CAT_TITLE,"Album View", PL3_CAT_ICON_ID, "gtk-open", -1); @@ -151,109 +127,85 @@ static void albumview_browser_save_myself(void) GtkWidget *entry = NULL; int album_size = 200; -int supported_columns = 1; -int supported_rows = 1; -void size_changed(GtkWidget *widget, GtkAllocation *alloc) +void size_changed(GtkWidget *widget, GtkAllocation *alloc, gpointer user_data) { + AlbumViewPlugin *self = ALBUM_VIEW_PLUGIN(user_data); int columns = (alloc->width-10)/(album_size +25); int rows = (alloc->height-10)/(album_size +40); - if(columns != supported_columns || rows != supported_rows) + if(columns != self->priv->supported_columns || rows != self->priv->supported_rows) { - supported_columns = (columns)?columns:1; - supported_rows = (rows)?rows:1; + self->priv->supported_columns = (columns)?columns:1; + self->priv->supported_rows = (rows)?rows:1; g_log(AV_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "update columns: %i %i %i\n", alloc->width-20,columns, album_size); if(entry && GTK_WIDGET_IS_SENSITIVE(entry)) { - update_view(); + update_view(self); } } } -void album_size_changed(GtkRange *spin) +void album_size_changed(GtkRange *spin, gpointer user_data) { + AlbumViewPlugin *self = ALBUM_VIEW_PLUGIN(user_data); int new_size = ((int)gtk_range_get_value(spin))*20; if(new_size != album_size) { album_size = new_size; - size_changed(albumview_vbox, &(albumview_vbox->allocation)); - /* - if(entry && GTK_WIDGET_IS_SENSITIVE(entry)) - { - update_view(); - } - */ + g_log(AV_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Set new size: %i\n", new_size); + /* Reset so it gets redrawn */ + self->priv->supported_columns = -1; + /* Force re-display */ + size_changed(albumview_vbox, &(albumview_vbox->allocation), self); } cfg_set_single_value_as_int(config, "albumview", "zoom-level", (int)gtk_range_get_value(spin)); } -static gboolean expose_event(GtkWidget *wid, GdkEventExpose *event, gpointer data) -{ - /* TODO improve this, somehow applying the clipmask fail. */ - int offset = 0;//((event->area.y)%(album_size+40)); - int step = (album_size +40)- offset; - int start = 0;//event->area.y; - int flip = 0;//((int)(event->area.y+step-5)/(album_size+40))&1; - int stop = wid->allocation.height;//event->area.y+event->area.height; - cairo_t *cc = gdk_cairo_create(GTK_WIDGET(wid)->window); - do{ - if(flip) - cairo_set_source_rgba(cc, 1.0,1.0,1.0,1.0); - else - cairo_set_source_rgba(cc, 0.8,0.8,0.8,1.0); - cairo_rectangle(cc, 0, start, wid->allocation.width,step ); - cairo_fill(cc); - start += step; - step = album_size+40; - flip = (flip == 1)?0:1; - }while(startstyle->white)); -// gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), TRUE); - // gtk_widget_set_app_paintable(GTK_WIDGET(event),TRUE); - // g_signal_connect(G_OBJECT(event), "expose-event", G_CALLBACK(expose_event), NULL); - gtk_box_pack_start(GTK_BOX(albumview_vbox),hscale, FALSE, FALSE, 0);//gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), event); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(event), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); -// gtk_container_add(GTK_CONTAINER(event), iv); - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(event), iv); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(event), GTK_SHADOW_ETCHED_IN); + /* setup bg */ + gtk_widget_modify_bg(bg_event, GTK_STATE_NORMAL,&(albumview_vbox->style->white)); + gtk_event_box_set_visible_window(GTK_EVENT_BOX(bg_event), TRUE); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(event), bg_event); + gtk_container_add(GTK_CONTAINER(bg_event), iv); gtk_widget_show_all(albumview_vbox); /* maintain my own reference to the widget, so it won't get destroyed removing @@ -263,25 +215,28 @@ static void albumview_init() } -static void albumview_selected(GtkWidget *container) +static void albumview_selected(GmpcPluginBrowserIface *plug, GtkWidget *container) { + AlbumViewPlugin *self = ALBUM_VIEW_PLUGIN(plug); if(albumview_vbox== NULL) { - albumview_init(); - albumview_connection_changed(connection,1,NULL); + albumview_init((AlbumViewPlugin *)plug); + albumview_connection_changed(gmpcconn, connection,1,self); } gtk_container_add(GTK_CONTAINER(container), albumview_vbox); gtk_widget_show(albumview_vbox); } -static void albumview_unselected(GtkWidget *container) +static void albumview_unselected(GmpcPluginBrowserIface *plug,GtkWidget *container) { gtk_container_remove(GTK_CONTAINER(container), albumview_vbox); } -void albumview_plugin_init(void) +void albumview_plugin_init(AlbumViewPlugin *self) { +/* TODO: fix this */ +/* gchar *path = gmpc_plugin_get_data_path(&plugin); gchar *url = g_build_path(G_DIR_SEPARATOR_S,path, "albumview", NULL); debug_printf(DEBUG_WARNING,"Found url: %s\n", url); @@ -291,6 +246,7 @@ void albumview_plugin_init(void) g_free(path); g_free(url); + */ } #define TIMER_SUB(start,stop,diff) diff.tv_usec = stop.tv_usec - start.tv_usec;\ diff.tv_sec = stop.tv_sec - start.tv_sec;\ @@ -327,7 +283,7 @@ MpdData *complete_list = NULL; GtkWidget *pb; int max = 0, current = 0; -static gboolean load_list_itterate(MpdData *data) +static gboolean load_list_itterate(AlbumViewPlugin *self) { MpdData *data2 = NULL; current++; @@ -338,15 +294,15 @@ static gboolean load_list_itterate(MpdData *data) g_free(temp); } - if(data) + if(self->priv->data) { mpd_database_search_field_start(connection, MPD_TAG_ITEM_ARTIST); - mpd_database_search_add_constraint(connection, MPD_TAG_ITEM_ALBUM, (data)->tag); + mpd_database_search_add_constraint(connection, MPD_TAG_ITEM_ALBUM, (self->priv->data)->tag); data2 = mpd_database_search_commit(connection); if(data2) { mpd_Song *song = mpd_newSong(); - song->album = g_strdup((data)->tag); + song->album = g_strdup((self->priv->data)->tag); song->artist = g_strdup(data2->tag); if(!mpd_data_is_last(data2)) { @@ -354,7 +310,7 @@ static gboolean load_list_itterate(MpdData *data) if(mpd_server_tag_supported(connection, MPD_TAG_ITEM_ALBUM_ARTIST)) { mpd_database_search_field_start(connection, MPD_TAG_ITEM_ALBUM_ARTIST); - mpd_database_search_add_constraint(connection, MPD_TAG_ITEM_ALBUM, (data)->tag); + mpd_database_search_add_constraint(connection, MPD_TAG_ITEM_ALBUM, (self->priv->data)->tag); MpdData *data3 = mpd_database_search_commit(connection); if(mpd_data_is_last(data3)){ song->albumartist = g_strdup(data3->tag); @@ -379,9 +335,9 @@ static gboolean load_list_itterate(MpdData *data) } } - (data) = mpd_data_get_next((data)); + (self->priv->data) = mpd_data_get_next((self->priv->data)); } - if(data == NULL){ + if(self->priv->data == NULL){ int items = 0; MpdData_real *iter; complete_list = (MpdData *)misc_sort_mpddata(mpd_data_get_first(complete_list), (GCompareDataFunc)__add_sort, NULL); @@ -390,17 +346,17 @@ static gboolean load_list_itterate(MpdData *data) for(iter = (MpdData_real*)complete_list; iter; iter = iter->next) items++; gtk_widget_set_sensitive(entry, TRUE); - filter_list(GTK_ENTRY(entry), NULL); + filter_list(GTK_ENTRY(entry), self); return FALSE; } - g_idle_add((GSourceFunc)load_list_itterate, data); + g_idle_add((GSourceFunc)load_list_itterate, self); return FALSE; } static GList *current_item = NULL; static GtkWidget *table = NULL; -static void load_list(void) +static void load_list(AlbumViewPlugin *self) { if(complete_list)mpd_data_free(complete_list); complete_list = NULL; @@ -410,25 +366,29 @@ static void load_list(void) pb = gtk_progress_bar_new(); gtk_box_pack_start(GTK_BOX(albumview_tree), pb, FALSE, FALSE, 0); - gtk_widget_show_all(albumview_tree); + gtk_widget_show(pb); mpd_database_search_field_start(connection, MPD_TAG_ITEM_ALBUM); MpdData *iter,*data = mpd_database_search_commit(connection); max = 0; current = 0; gtk_widget_set_sensitive(entry, FALSE); for(iter = data; iter; iter = mpd_data_get_next_real(iter, FALSE)) max++; - g_idle_add((GSourceFunc)load_list_itterate, data); + self->priv->data= data; + g_idle_add((GSourceFunc)load_list_itterate, self); } -void albumview_connection_changed(MpdObj *mi, int connect,void *usedata) +void albumview_connection_changed(GmpcConnection *conn, MpdObj *mi, int connect,void *usedata) { + AlbumViewPlugin *self = ALBUM_VIEW_PLUGIN(usedata); if(connect && albumview_vbox) { - load_list(); + load_list(self); } else if(albumview_vbox){ mpd_data_free(complete_list); complete_list = NULL; + if(table) + gtk_widget_hide(table); } } static void album_add(GtkWidget *button, mpd_Song *song) @@ -504,6 +464,7 @@ static GtkWidget * create_button(MpdData_real *complete_list_iter) gtk_widget_set_size_request(vbox, album_size+20,album_size+40); item = gmpc_metaimage_new_size(META_ALBUM_ART,album_size); + gmpc_metaimage_set_scale_up(GMPC_METAIMAGE(item), TRUE); gtk_widget_set_has_tooltip(GTK_WIDGET(item), FALSE); gmpc_metaimage_set_squared(GMPC_METAIMAGE(item), TRUE); @@ -542,6 +503,7 @@ static guint update_timeout = 0; static void filter_list(GtkEntry *entry, gpointer data) { + AlbumViewPlugin *self = ALBUM_VIEW_PLUGIN(data); GRegex *regex = NULL; int items = 0; GList *list = NULL; @@ -572,7 +534,7 @@ static void filter_list(GtkEntry *entry, gpointer data) g_string_free(s, TRUE); for(complete_list_iter = (MpdData_real *) mpd_data_get_first(complete_list); complete_list_iter; - complete_list_iter = mpd_data_get_next_real(complete_list_iter, FALSE)) + complete_list_iter = (MpdData_real *)mpd_data_get_next_real((MpdData *)complete_list_iter, FALSE)) { if(g_regex_match(regex,complete_list_iter->song->album,0,NULL)|| g_regex_match(regex,complete_list_iter->song->artist,0,NULL)|| @@ -593,17 +555,18 @@ static void filter_list(GtkEntry *entry, gpointer data) gtk_range_set_range(GTK_RANGE(hscale), 0, (items>0)?items:1); gtk_range_set_value(GTK_RANGE(hscale), 0); - update_view(); + update_view(self); } static void position_changed(GtkRange *range, gpointer data) { + AlbumViewPlugin *self = ALBUM_VIEW_PLUGIN(data); gint i=0,value = (int)gtk_range_get_value(range); current_item = g_list_first(current_item); for(i=0;inext; current_item = current_item->next){i++;} - update_view(); + update_view(self); } -static gboolean update_view_real(void) +static gboolean update_view_real(AlbumViewPlugin *self) { MpdData *complete_list_iter; const char *search_query = gtk_entry_get_text(GTK_ENTRY(entry)); @@ -645,7 +608,7 @@ static gboolean update_view_real(void) gtk_range_set_value(GTK_RANGE(hscale), 0); } - int rows = supported_rows; + int rows = self->priv->supported_rows; /** * Create holding table if it does not exist */ @@ -657,7 +620,7 @@ static gboolean update_view_real(void) } /* I know how large it is going to be.. so lets set the size */ - gtk_widget_set_size_request(table, supported_columns*(album_size+20)+6, (rows)*(album_size+40)); + gtk_widget_set_size_request(table, self->priv->supported_columns*(album_size+20)+6, (rows)*(album_size+40)); /** * Add albums */ @@ -675,7 +638,7 @@ static gboolean update_view_real(void) GtkWidget *item; int a,b; if(vbox == NULL){ - vbox = create_button(complete_list_iter); + vbox = create_button((MpdData_real *)complete_list_iter); } else{ item = g_object_get_data(G_OBJECT(vbox), "item"); @@ -691,7 +654,7 @@ static gboolean update_view_real(void) j++; } v_items++; - }while(v_items < (rows*supported_columns)&& (iter = iter->next)); + }while(v_items < (rows*self->priv->supported_columns)&& (iter = iter->next)); printf("%p %i\n", iter, v_items); } /* remove list */ @@ -714,10 +677,113 @@ static gboolean update_view_real(void) } -void update_view() +void update_view(AlbumViewPlugin *self) { if(update_timeout != 0) { g_source_remove(update_timeout); } - update_timeout = g_timeout_add(10, (GSourceFunc)update_view_real,NULL); + update_timeout = g_timeout_add(10, (GSourceFunc)update_view_real,self); +} + +/** + * Gobject plugin + */ +static void albumview_plugin_class_init (AlbumViewPluginClass *klass); + +static int *albumview_plugin_get_version(GmpcPluginBase *plug, int *length) +{ + static int version[3] = {PLUGIN_MAJOR_VERSION,PLUGIN_MINOR_VERSION,PLUGIN_MICRO_VERSION}; + if(length) *length = 3; + return (int *)version; +} + +static const char *albumview_plugin_get_name(GmpcPluginBase *plug) +{ + return ("Album View"); +} +static GObject *albumview_plugin_constructor(GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) { + AlbumViewPluginClass * klass; + AlbumViewPlugin *self; + GObjectClass * parent_class; + klass = (g_type_class_peek (albumview_plugin_get_type())); + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); + self = (AlbumViewPlugin *) parent_class->constructor (type, n_construct_properties, construct_properties); + + g_log(AV_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Constructing plugin"); + + /* setup private structure */ + self->priv = g_malloc0(sizeof(AlbumViewPluginPrivate)); + /* set defaults */ + self->priv->supported_rows = 1; + self->priv->supported_columns = 1; + g_signal_connect_object(G_OBJECT(gmpcconn), "connection-changed", G_CALLBACK(albumview_connection_changed), self, 0); + + /* Setup textdomain */ +/* bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); +*/ + GMPC_PLUGIN_BASE(self)->translation_domain = NULL;//GETTEXT_PACKAGE; + GMPC_PLUGIN_BASE(self)->plugin_type = GMPC_PLUGIN_NO_GUI; + + albumview_plugin_init(self); + + return G_OBJECT(self); +} +static void albumview_plugin_finalize(GObject *obj) { + AlbumViewPlugin *self = (AlbumViewPlugin *)obj; + AlbumViewPluginClass * klass = (g_type_class_peek (play_queue_plugin_get_type())); + gpointer parent_class = g_type_class_peek_parent (klass); + + g_log(AV_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Destroying plugin"); + + if(self->priv){ + g_free(self->priv); + self->priv = NULL; + } + if(parent_class) + G_OBJECT_CLASS(parent_class)->finalize(obj); +} + + +static void albumview_plugin_class_init (AlbumViewPluginClass *klass) +{ + G_OBJECT_CLASS(klass)->finalize = albumview_plugin_finalize; + G_OBJECT_CLASS(klass)->constructor = albumview_plugin_constructor; + /* Connect plugin functions */ + GMPC_PLUGIN_BASE_CLASS(klass)->get_version = albumview_plugin_get_version; + GMPC_PLUGIN_BASE_CLASS(klass)->get_name = albumview_plugin_get_name; + + GMPC_PLUGIN_BASE_CLASS(klass)->get_enabled = albumview_get_enabled; + GMPC_PLUGIN_BASE_CLASS(klass)->set_enabled = albumview_set_enabled; +} + +static void albumview_plugin_browser_iface_init(GmpcPluginBrowserIfaceIface * iface) { + iface->browser_add = albumview_add; + iface->browser_selected = albumview_selected; + iface->browser_unselected = albumview_unselected; +} + +const GType albumview_plugin_get_type(void) { + static GType albumview_plugin_type_id = 0; + if(albumview_plugin_type_id == 0) { + static const GTypeInfo info = { + .class_size = sizeof(AlbumViewPluginClass), + .class_init = (GClassInitFunc)albumview_plugin_class_init, + .instance_size = sizeof(AlbumViewPlugin), + .n_preallocs = 0 + }; + + albumview_plugin_type_id = g_type_register_static(GMPC_PLUGIN_TYPE_BASE, "AlbumViewPlugin", &info, 0); + + /** Browser interface */ + static const GInterfaceInfo iface_info = { (GInterfaceInitFunc) albumview_plugin_browser_iface_init, + (GInterfaceFinalizeFunc) NULL, NULL}; + g_type_add_interface_static (albumview_plugin_type_id, GMPC_PLUGIN_TYPE_BROWSER_IFACE, &iface_info); + } + return albumview_plugin_type_id; +} + +G_MODULE_EXPORT GType plugin_get_type(void) +{ + return albumview_plugin_get_type(); } diff --git a/src/plugin.h b/src/plugin.h dissimilarity index 81% index 0d2ffe1..ec66936 100644 --- a/src/plugin.h +++ b/src/plugin.h @@ -1,13 +1,20 @@ -#ifndef __SERVERSTATS_PLUGIN_H__ -#define __SERVERSTATS_PLUGIN_H__ -void albumview_set_enabled(int enabled); -int albumview_get_enabled(void); -static void albumview_add(GtkWidget *category_tree); - -static void albumview_selected(GtkWidget *container); - -static void albumview_unselected(GtkWidget *container); - -void albumview_plugin_init(void); -void albumview_connection_changed(MpdObj *mi, int connect,void *userdata); -#endif +#ifndef __SERVERSTATS_PLUGIN_H__ +#define __SERVERSTATS_PLUGIN_H__ + +typedef struct _AlbumViewPluginPrivate AlbumViewPluginPrivate; + +typedef struct _AlbumViewPlugin +{ + GmpcPluginBase parent_instance; + AlbumViewPluginPrivate *priv; +} AlbumViewPlugin ; + +typedef struct _AlbumViewPluginClass +{ + GmpcPluginBaseClass parent_class; +} AlbumViewPluginClass; + +static void albumview_add(GmpcPluginBrowserIface *plug, GtkWidget *category_tree); + +void albumview_connection_changed(GmpcConnection *conn, MpdObj *mi, int connect,void *usedata); +#endif -- 2.11.4.GIT