2021-02-09 17:37:26 +02:00
/* koto-playerbar.c
*
* Copyright 2021 Joshua Strobl
*
* Licensed under the Apache License , Version 2.0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
2021-02-24 20:17:18 +02:00
# include <gtk-4.0/gtk/gtk.h>
2021-02-12 12:56:41 +02:00
# include "koto-button.h"
2021-02-09 17:37:26 +02:00
# include "koto-config.h"
# include "koto-playerbar.h"
struct _KotoPlayerBar {
2021-02-24 20:17:18 +02:00
GObject parent_instance ;
GtkWidget * main ;
2021-02-09 17:37:26 +02:00
/* Sections */
GtkWidget * playback_section ;
GtkWidget * primary_controls_section ;
GtkWidget * secondary_controls_section ;
/* Primary Buttons */
2021-02-12 12:56:41 +02:00
KotoButton * back_button ;
KotoButton * play_pause_button ;
KotoButton * forward_button ;
KotoButton * repeat_button ;
KotoButton * shuffle_button ;
KotoButton * playlist_button ;
KotoButton * eq_button ;
2021-02-09 17:37:26 +02:00
GtkWidget * volume_button ;
/* Selected Playback Section */
GtkWidget * playback_details_section ;
GtkWidget * artwork ;
GtkWidget * playback_title ;
GtkWidget * playback_album ;
GtkWidget * playback_artist ;
} ;
struct _KotoPlayerBarClass {
2021-02-24 20:17:18 +02:00
GObjectClass parent_class ;
2021-02-09 17:37:26 +02:00
} ;
2021-02-24 20:17:18 +02:00
G_DEFINE_TYPE ( KotoPlayerBar , koto_playerbar , G_TYPE_OBJECT ) ;
2021-02-09 17:37:26 +02:00
static void koto_playerbar_constructed ( GObject * obj ) ;
static void koto_playerbar_class_init ( KotoPlayerBarClass * c ) {
GObjectClass * gobject_class ;
gobject_class = G_OBJECT_CLASS ( c ) ;
gobject_class - > constructed = koto_playerbar_constructed ;
}
static void koto_playerbar_constructed ( GObject * obj ) {
KotoPlayerBar * self = KOTO_PLAYERBAR ( obj ) ;
2021-02-24 20:17:18 +02:00
self - > main = gtk_center_box_new ( ) ;
gtk_center_box_set_baseline_position ( GTK_CENTER_BOX ( self - > main ) , GTK_BASELINE_POSITION_CENTER ) ;
gtk_widget_add_css_class ( self - > main , " player-bar " ) ;
2021-02-09 17:37:26 +02:00
self - > playback_section = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
self - > primary_controls_section = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
self - > secondary_controls_section = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2021-02-24 20:17:18 +02:00
gtk_center_box_set_start_widget ( GTK_CENTER_BOX ( self - > main ) , GTK_WIDGET ( self - > primary_controls_section ) ) ;
gtk_center_box_set_center_widget ( GTK_CENTER_BOX ( self - > main ) , GTK_WIDGET ( self - > playback_section ) ) ;
gtk_center_box_set_end_widget ( GTK_CENTER_BOX ( self - > main ) , GTK_WIDGET ( self - > secondary_controls_section ) ) ;
2021-02-09 17:37:26 +02:00
koto_playerbar_create_playback_details ( self ) ;
koto_playerbar_create_primary_controls ( self ) ;
koto_playerbar_create_secondary_controls ( self ) ;
2021-02-24 20:17:18 +02:00
gtk_widget_set_hexpand ( GTK_WIDGET ( self - > main ) , TRUE ) ;
2021-02-09 17:37:26 +02:00
}
static void koto_playerbar_init ( KotoPlayerBar * self ) {
2021-02-24 20:17:18 +02:00
( void ) self ;
2021-02-09 17:37:26 +02:00
}
KotoPlayerBar * koto_playerbar_new ( void ) {
2021-02-24 20:17:18 +02:00
return g_object_new ( KOTO_TYPE_PLAYERBAR , NULL ) ;
2021-02-09 17:37:26 +02:00
}
void koto_playerbar_create_playback_details ( KotoPlayerBar * bar ) {
bar - > playback_details_section = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2021-02-24 20:17:18 +02:00
GtkIconTheme * default_icon_theme = gtk_icon_theme_get_for_display ( gdk_display_get_default ( ) ) ; // Get the icon theme for this display
2021-02-09 17:37:26 +02:00
if ( default_icon_theme ! = NULL ) {
2021-02-27 17:26:24 +02:00
gint scale_factor = gtk_widget_get_scale_factor ( GTK_WIDGET ( bar - > main ) ) ;
2021-02-24 20:17:18 +02:00
GtkIconPaintable * audio_paintable = gtk_icon_theme_lookup_icon ( default_icon_theme , " audio-x-generic-symbolic " , NULL , 96 , scale_factor , GTK_TEXT_DIR_NONE , GTK_ICON_LOOKUP_PRELOAD ) ;
if ( GTK_IS_ICON_PAINTABLE ( audio_paintable ) ) {
if ( GTK_IS_IMAGE ( bar - > artwork ) ) {
gtk_image_set_from_paintable ( GTK_IMAGE ( bar - > artwork ) , GDK_PAINTABLE ( audio_paintable ) ) ;
} else { // Not an image
bar - > artwork = gtk_image_new_from_paintable ( GDK_PAINTABLE ( audio_paintable ) ) ;
gtk_widget_set_size_request ( bar - > artwork , 96 , 96 ) ;
gtk_box_append ( GTK_BOX ( bar - > playback_section ) , bar - > artwork ) ;
}
2021-02-09 17:37:26 +02:00
}
}
2021-02-12 12:56:41 +02:00
bar - > playback_title = gtk_label_new ( " Title " ) ;
bar - > playback_album = gtk_label_new ( " Album " ) ;
bar - > playback_artist = gtk_label_new ( " Artist " ) ;
2021-02-09 17:37:26 +02:00
2021-02-24 20:17:18 +02:00
gtk_box_append ( GTK_BOX ( bar - > playback_details_section ) , GTK_WIDGET ( bar - > playback_title ) ) ;
gtk_box_append ( GTK_BOX ( bar - > playback_details_section ) , GTK_WIDGET ( bar - > playback_album ) ) ;
gtk_box_append ( GTK_BOX ( bar - > playback_details_section ) , GTK_WIDGET ( bar - > playback_artist ) ) ;
2021-02-09 17:37:26 +02:00
2021-02-24 20:17:18 +02:00
gtk_box_append ( GTK_BOX ( bar - > playback_section ) , GTK_WIDGET ( bar - > playback_details_section ) ) ;
2021-02-09 17:37:26 +02:00
}
void koto_playerbar_create_primary_controls ( KotoPlayerBar * bar ) {
2021-02-25 18:15:36 +02:00
bar - > back_button = koto_button_new_with_icon ( " " , " media-skip-backward-symbolic " , NULL , KOTO_BUTTON_PIXBUF_SIZE_NORMAL ) ;
bar - > play_pause_button = koto_button_new_with_icon ( " " , " media-playback-start-symbolic " , NULL , KOTO_BUTTON_PIXBUF_SIZE_LARGE ) ; // TODO: Have this take in a state and switch to a different icon if necessary
bar - > forward_button = koto_button_new_with_icon ( " " , " media-skip-forward-symbolic " , NULL , KOTO_BUTTON_PIXBUF_SIZE_NORMAL ) ;
2021-02-09 17:37:26 +02:00
if ( bar - > back_button ! = NULL ) {
2021-02-24 20:17:18 +02:00
gtk_box_append ( GTK_BOX ( bar - > primary_controls_section ) , GTK_WIDGET ( bar - > back_button ) ) ;
2021-02-09 17:37:26 +02:00
}
if ( bar - > play_pause_button ! = NULL ) {
2021-02-24 20:17:18 +02:00
gtk_box_append ( GTK_BOX ( bar - > primary_controls_section ) , GTK_WIDGET ( bar - > play_pause_button ) ) ;
2021-02-09 17:37:26 +02:00
}
if ( bar - > forward_button ! = NULL ) {
2021-02-24 20:17:18 +02:00
gtk_box_append ( GTK_BOX ( bar - > primary_controls_section ) , GTK_WIDGET ( bar - > forward_button ) ) ;
2021-02-09 17:37:26 +02:00
}
}
void koto_playerbar_create_secondary_controls ( KotoPlayerBar * bar ) {
2021-02-25 18:15:36 +02:00
bar - > repeat_button = koto_button_new_with_icon ( " " , " media-playlist-repeat-symbolic " , NULL , KOTO_BUTTON_PIXBUF_SIZE_NORMAL ) ;
bar - > shuffle_button = koto_button_new_with_icon ( " " , " media-playlist-shuffle-symbolic " , NULL , KOTO_BUTTON_PIXBUF_SIZE_NORMAL ) ;
bar - > playlist_button = koto_button_new_with_icon ( " " , " playlist-symbolic " , NULL , KOTO_BUTTON_PIXBUF_SIZE_NORMAL ) ;
bar - > eq_button = koto_button_new_with_icon ( " " , " multimedia-equalizer-symbolic " , NULL , KOTO_BUTTON_PIXBUF_SIZE_NORMAL ) ;
2021-02-09 17:37:26 +02:00
bar - > volume_button = gtk_volume_button_new ( ) ; // Have this take in a state and switch to a different icon if necessary
gtk_scale_button_set_value ( GTK_SCALE_BUTTON ( bar - > volume_button ) , 0.5 ) ;
if ( bar - > repeat_button ! = NULL ) {
2021-02-24 20:17:18 +02:00
gtk_box_append ( GTK_BOX ( bar - > secondary_controls_section ) , GTK_WIDGET ( bar - > repeat_button ) ) ;
2021-02-09 17:37:26 +02:00
}
if ( bar - > shuffle_button ! = NULL ) {
2021-02-24 20:17:18 +02:00
gtk_box_append ( GTK_BOX ( bar - > secondary_controls_section ) , GTK_WIDGET ( bar - > shuffle_button ) ) ;
2021-02-09 17:37:26 +02:00
}
if ( bar - > playlist_button ! = NULL ) {
2021-02-24 20:17:18 +02:00
gtk_box_append ( GTK_BOX ( bar - > secondary_controls_section ) , GTK_WIDGET ( bar - > playlist_button ) ) ;
2021-02-09 17:37:26 +02:00
}
if ( bar - > eq_button ! = NULL ) {
2021-02-24 20:17:18 +02:00
gtk_box_append ( GTK_BOX ( bar - > secondary_controls_section ) , GTK_WIDGET ( bar - > eq_button ) ) ;
2021-02-09 17:37:26 +02:00
}
if ( bar - > volume_button ! = NULL ) {
2021-02-24 20:17:18 +02:00
gtk_box_append ( GTK_BOX ( bar - > secondary_controls_section ) , bar - > volume_button ) ;
2021-02-09 17:37:26 +02:00
}
}
2021-02-24 20:17:18 +02:00
GtkWidget * koto_playerbar_get_main ( KotoPlayerBar * bar ) {
return bar - > main ;
}