1 /* Gnome Music Player Client (GMPC)
2  * Copyright (C) 2004-2011 Qball Cow <qball@gmpclient.org>
3  * Project homepage: http://gmpclient.org/
4 
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 2 of the License, or
8  * (at your option) any later version.
9 
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.
14 
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 #include <gtk/gtk.h>
21 #include "main.h"
22 #include "title_header.h"
23 #include "playlist3.h"
24 
25 /* glue code */
26 extern GmpcBrowsersMetadata *browsers_metadata;
27 
28 static GtkWidget *header_labels[5];
29 
playlist3_header_song(void)30 static void playlist3_header_song(void)
31 {
32     mpd_Song *song = mpd_playlist_get_current_song(connection);
33     if (song)
34     {
35         GtkTreeView *tree = (GtkTreeView *) gtk_builder_get_object(pl3_xml, "cat_tree");
36         gmpc_browsers_metadata_select_browser(browsers_metadata, tree);
37         gmpc_browsers_metadata_set_song(browsers_metadata, song);
38     }
39 }
40 
41 
playlist3_header_artist(void)42 static void playlist3_header_artist(void)
43 {
44     mpd_Song *song = mpd_playlist_get_current_song(connection);
45     if (song && song->artist)
46     {
47         GtkTreeView *tree = (GtkTreeView *) gtk_builder_get_object(pl3_xml, "cat_tree");
48         gmpc_browsers_metadata_select_browser(browsers_metadata, tree);
49         gmpc_browsers_metadata_set_artist(browsers_metadata, song->artist);
50     }
51 }
52 
53 
playlist3_header_album(void)54 static void playlist3_header_album(void)
55 {
56     mpd_Song *song = mpd_playlist_get_current_song(connection);
57     if (song && song->artist && song->album)
58     {
59         GtkTreeView *tree = (GtkTreeView *) gtk_builder_get_object(pl3_xml, "cat_tree");
60         gmpc_browsers_metadata_select_browser(browsers_metadata, tree);
61         gmpc_browsers_metadata_set_album(browsers_metadata, song->artist, song->album);
62     }
63 }
playlist3_header_update_style(GtkWidget * widget,GtkStyle * prev,gpointer data)64 static void playlist3_header_update_style(GtkWidget *widget, GtkStyle *prev, gpointer data)
65 {
66     gtk_widget_modify_text(header_labels[1], GTK_STATE_NORMAL, &(widget->style->text[GTK_STATE_INSENSITIVE]));
67     gtk_widget_modify_fg(header_labels[1], GTK_STATE_NORMAL, &(widget->style->text[GTK_STATE_INSENSITIVE]));
68 
69     gtk_widget_modify_text(header_labels[3], GTK_STATE_NORMAL, &(widget->style->text[GTK_STATE_INSENSITIVE]));
70     gtk_widget_modify_fg(header_labels[3], GTK_STATE_NORMAL, &(widget->style->text[GTK_STATE_INSENSITIVE]));
71 }
72 
playlist3_new_header(void)73 void playlist3_new_header(void)
74 {
75     GtkWidget *hbox10 = GTK_WIDGET(gtk_builder_get_object(pl3_xml, "hbox10"));
76     if (hbox10)
77     {
78         GtkWidget *hbox = gtk_hbox_new(FALSE, 6);
79         GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
80         // expand in width, align in middle
81         GtkAlignment *title_header_top_alignment = gtk_alignment_new(0,0.5,1.0,0);
82         // set a 3 px top/bottom border (looks better then 6)
83         gtk_alignment_set_padding(title_header_top_alignment, 3,3,0,0);
84 
85         // set minimum width 300 pixels.
86         gtk_widget_set_size_request(title_header_top_alignment, 300, -1);
87         /** Title */
88         header_labels[0] = (GtkWidget *)gmpc_clicklabel_new("");
89         gmpc_clicklabel_font_size(GMPC_CLICKLABEL(header_labels[0]), 12);
90         gmpc_clicklabel_set_do_bold(GMPC_CLICKLABEL(header_labels[0]), TRUE);
91         gmpc_clicklabel_set_ellipsize(GMPC_CLICKLABEL(header_labels[0]), PANGO_ELLIPSIZE_END);
92 
93         header_labels[1] = gtk_label_new(_("By"));
94         /** Artist */
95         header_labels[2] = (GtkWidget *)gmpc_clicklabel_new("");
96         gmpc_clicklabel_set_ellipsize(GMPC_CLICKLABEL(header_labels[2]), PANGO_ELLIPSIZE_NONE);
97 
98         header_labels[3] = gtk_label_new(_("From"));
99         /** Albumr */
100         header_labels[4] = (GtkWidget *)gmpc_clicklabel_new("");
101         gmpc_clicklabel_set_ellipsize(GMPC_CLICKLABEL(header_labels[4]), PANGO_ELLIPSIZE_END);
102 
103 
104 
105 
106         gtk_box_pack_start(GTK_BOX(vbox), header_labels[0], FALSE, TRUE, 0);
107         gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
108 
109         gtk_box_pack_start(GTK_BOX(hbox), header_labels[1], FALSE, TRUE, 0);
110         gtk_box_pack_start(GTK_BOX(hbox), header_labels[2], FALSE, TRUE, 0);
111         gtk_box_pack_start(GTK_BOX(hbox), header_labels[3], FALSE, TRUE, 0);
112         gtk_box_pack_start(GTK_BOX(hbox), header_labels[4], TRUE, TRUE, 0);
113 
114         g_signal_connect(G_OBJECT(header_labels[0]), "clicked", G_CALLBACK(playlist3_header_song), NULL);
115         g_signal_connect(G_OBJECT(header_labels[2]), "clicked", G_CALLBACK(playlist3_header_artist), NULL);
116         g_signal_connect(G_OBJECT(header_labels[4]), "clicked", G_CALLBACK(playlist3_header_album), NULL);
117 
118         gtk_container_add(GTK_CONTAINER(title_header_top_alignment), vbox);
119         gtk_box_pack_start(GTK_BOX(hbox10), title_header_top_alignment, TRUE, TRUE, 0);
120         gtk_widget_show_all(hbox10);
121 
122         g_signal_connect(G_OBJECT(hbox10), "style-set", G_CALLBACK(playlist3_header_update_style), NULL);
123         playlist3_header_update_style(hbox10, NULL, NULL);
124     }
125 }
126 
127 
playlist3_update_header(void)128 void playlist3_update_header(void)
129 {
130     char buffer[1024];
131     if (header_labels[0] == NULL)
132         return;
133 
134     if (mpd_check_connected(connection))
135     {
136         mpd_Song *song = mpd_playlist_get_current_song(connection);
137         /** Set new header */
138         if (mpd_player_get_state(connection) != MPD_STATUS_STATE_STOP && song)
139         {
140             mpd_song_markup(buffer, 1024, "[%title%|%shortfile%][ (%name%)]", song);
141             gmpc_clicklabel_set_text(GMPC_CLICKLABEL(header_labels[0]), buffer);
142             gmpc_clicklabel_set_sensitive(GMPC_CLICKLABEL(header_labels[0]), TRUE);
143             if (song->artist)
144             {
145                 gtk_widget_show(header_labels[1]);
146                 gtk_widget_show(header_labels[2]);
147                 gmpc_clicklabel_set_text(GMPC_CLICKLABEL(header_labels[2]), song->artist);
148             } else
149             {
150                 gtk_widget_hide(header_labels[1]);
151                 gtk_widget_hide(header_labels[2]);
152             }
153             if (song->album)
154             {
155                 gtk_widget_show(header_labels[3]);
156                 gtk_widget_show(header_labels[4]);
157                 if (song->date)
158                 {
159                     gchar *text = g_strdup_printf("%s (%s)", song->album, song->date);
160                     gmpc_clicklabel_set_text(GMPC_CLICKLABEL(header_labels[4]), text);
161                     g_free(text);
162                 } else
163                 {
164                     gmpc_clicklabel_set_text(GMPC_CLICKLABEL(header_labels[4]), song->album);
165                 }
166 
167             } else
168             {
169                 gtk_widget_hide(header_labels[3]);
170                 gtk_widget_hide(header_labels[4]);
171             }
172 
173         } else
174         {
175             gmpc_clicklabel_set_text(GMPC_CLICKLABEL(header_labels[0]), _("Not Playing"));
176             gmpc_clicklabel_set_sensitive(GMPC_CLICKLABEL(header_labels[0]), FALSE);
177             gtk_widget_hide(header_labels[1]);
178             gtk_widget_hide(header_labels[2]);
179             gtk_widget_hide(header_labels[3]);
180             gtk_widget_hide(header_labels[4]);
181         }
182     } else
183     {
184         gmpc_clicklabel_set_text(GMPC_CLICKLABEL(header_labels[0]), _("Not Connected"));
185         gmpc_clicklabel_set_sensitive(GMPC_CLICKLABEL(header_labels[0]), FALSE);
186         gtk_widget_hide(header_labels[1]);
187         gtk_widget_hide(header_labels[2]);
188         gtk_widget_hide(header_labels[3]);
189         gtk_widget_hide(header_labels[4]);
190 
191     }
192 }
193 
194