From 51aa8be7830056d8b4ea654a317bbf0cf628c425 Mon Sep 17 00:00:00 2001 From: daleclack Date: Sat, 6 Nov 2021 21:40:31 +0800 Subject: [PATCH] Add Media Player --- GCR_CMake | 2 +- Gtk4/.vscode/c_cpp_properties.json | 4 +- Gtk4/CMakeLists.txt | 6 +- .../16x16/actions/multimedia-player1.png | Bin 0 -> 586 bytes .../48x48/actions/multimedia-player1.png | Bin 0 -> 2552 bytes .../actions/multimedia-player1_running.png | Bin 0 -> 14739 bytes Gtk4/res/leftpanel.ui | 38 +++++ Gtk4/res/media_menu.xml | 31 ++++ Gtk4/src/LeftPanel.cpp | 45 ++++- Gtk4/src/MediaPlayer.cpp | 161 ++++++++++++++++++ Gtk4/src/MediaPlayer.h | 7 + 11 files changed, 285 insertions(+), 9 deletions(-) create mode 100644 Gtk4/res/icons/16x16/actions/multimedia-player1.png create mode 100644 Gtk4/res/icons/48x48/actions/multimedia-player1.png create mode 100644 Gtk4/res/icons/48x48/actions/multimedia-player1_running.png create mode 100644 Gtk4/res/media_menu.xml create mode 100644 Gtk4/src/MediaPlayer.cpp create mode 100644 Gtk4/src/MediaPlayer.h diff --git a/GCR_CMake b/GCR_CMake index b5a7fe5..6ea69ec 160000 --- a/GCR_CMake +++ b/GCR_CMake @@ -1 +1 @@ -Subproject commit b5a7fe5719ed0df8998b2ba961e09d967a385ec6 +Subproject commit 6ea69eca6817aead20a2cb87cdd08ab8e9a173cd diff --git a/Gtk4/.vscode/c_cpp_properties.json b/Gtk4/.vscode/c_cpp_properties.json index 6f27afb..c0d0e71 100644 --- a/Gtk4/.vscode/c_cpp_properties.json +++ b/Gtk4/.vscode/c_cpp_properties.json @@ -21,12 +21,10 @@ "/usr/include/uuid/**", */ //For manjaro(Arch linux) - "/usr/lib/dbus-1.0/include/**", "/usr/lib/glib-2.0/include/**", "/usr/include/lzo/**", "/usr/include/cloudproviders/**", - "${workspaceFolder}/**", "/usr/include/gtk-3.0/**", "/usr/include/at-spi2-atk/2.0/**", @@ -55,7 +53,7 @@ "`pkg-config --cflags --libs gtk+-3.0`" ], "configurationProvider": "ms-vscode.cmake-tools" - }, + }, { "name": "win32", "includePath": [ diff --git a/Gtk4/CMakeLists.txt b/Gtk4/CMakeLists.txt index bfbd7ea..e2e2eb2 100644 --- a/Gtk4/CMakeLists.txt +++ b/Gtk4/CMakeLists.txt @@ -35,6 +35,7 @@ set(RESOURCE_LIST icons/16x16/actions/window-minimize.png icons/16x16/actions/drawing_app.png icons/16x16/actions/file-app.png + icons/16x16/actions/multimedia-player1.png icons/24x24/actions/view-grid-symbolic.png icons/24x24/actions/view-list-symbolic.png icons/48x48/actions/game.png @@ -48,6 +49,8 @@ set(RESOURCE_LIST icons/48x48/actions/drawing_app_running.png icons/48x48/actions/file-app.png icons/48x48/actions/file-app-running.png + icons/48x48/actions/multimedia-player1.png + icons/48x48/actions/multimedia-player1_running.png icons/scalable/status/graphics.svg icons/scalable/status/log_out.svg icons/scalable/status/system.svg @@ -55,6 +58,7 @@ set(RESOURCE_LIST gnome-fs-directory.png gnome-fs-regular.png STRIPBLANKS appmenu.xml + STRIPBLANKS media_menu.xml STRIPBLANKS stack.ui STRIPBLANKS leftpanel.ui STRIPBLANKS game1.ui) @@ -71,7 +75,7 @@ compile_gresources(RESOURCE_FILE add_custom_target(resource ALL DEPENDS ${RESOURCE_FILE}) set(SOURCES src/main.cpp src/MainWin.cpp src/MainStack.cpp src/LeftPanel.cpp src/GameWin.cpp - src/drawing.cpp src/TextEditor.cpp src/FileWindow.cpp src/winconf.cpp) + src/drawing.cpp src/TextEditor.cpp src/FileWindow.cpp src/winconf.cpp src/MediaPlayer.cpp) # Step 4:Add the resource to compile list and compile if(WIN32) diff --git a/Gtk4/res/icons/16x16/actions/multimedia-player1.png b/Gtk4/res/icons/16x16/actions/multimedia-player1.png new file mode 100644 index 0000000000000000000000000000000000000000..9e9726bea14b8a6c562cce6f4ba278ffda1a97d9 GIT binary patch literal 586 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 + + + 1 + 1 + 1 + 0 + + + + + 16 + multimedia-player + + + + + Media Player + 1 + + + + + + 1 @@ -399,5 +423,19 @@ + + + 1 + 1 + 1 + 0 + + + 48 + multimedia-player1 + + + + diff --git a/Gtk4/res/media_menu.xml b/Gtk4/res/media_menu.xml new file mode 100644 index 0000000..03146f5 --- /dev/null +++ b/Gtk4/res/media_menu.xml @@ -0,0 +1,31 @@ + + + +
+ + Open Media File + win.open + + + Pause Media + win.pause + + + Play Media + win.play + + + Clear Media + win.clear + + + About + win.about + + + Exit + win.quit + +
+
+
\ No newline at end of file diff --git a/Gtk4/src/LeftPanel.cpp b/Gtk4/src/LeftPanel.cpp index 0c4f154..d35d32d 100644 --- a/Gtk4/src/LeftPanel.cpp +++ b/Gtk4/src/LeftPanel.cpp @@ -6,6 +6,7 @@ #include "TextEditor.h" #include "drawing.h" #include "FileWindow.h" +#include "MediaPlayer.h" struct _LeftPanel{ GtkBox parent; @@ -17,18 +18,19 @@ struct _LeftPanel{ //Button for win32 applications GtkWidget * btn_vlc, * btn_note; //Integrated applications - GtkWidget * btnabout, * btnfiles, * btndraw, * btngame, * btnrun, * btneditor; + GtkWidget * btnabout, * btnfiles, * btndraw, * btngame, * btnrun, * btneditor, * btnmedia; //Panel Buttons - GtkWidget * panel_file, * panel_game, * panel_editor, * panel_drawing; + GtkWidget * panel_file, * panel_game, * panel_editor, * panel_drawing, * panel_media; //Panel Images - GtkWidget * file_image, * game_image, * editor_image, * drawing_image; + GtkWidget * file_image, * game_image, * editor_image, * drawing_image, * media_image; //Application Windows GameWin * game1; FileWindow * file_win; DrawingApp * draw_win; TextEditor * editor_win; + MediaPlayer * media_player; //Status - gboolean game_running, file_running, editor_running, drawapp_running; + gboolean game_running, file_running, editor_running, drawapp_running, media_running; }; G_DEFINE_TYPE(LeftPanel,left_panel,GTK_TYPE_BOX) @@ -193,6 +195,33 @@ static void btneditor_clicked(GtkWidget * widget,LeftPanel * parent_panel){ } } +//Functions for media player window +static gboolean media_player_closed(GtkWindow * window,LeftPanel * parent_panel){ + parent_panel->media_running = FALSE; + gtk_image_set_from_icon_name(GTK_IMAGE(parent_panel->media_image),"multimedia-player1"); + gtk_window_destroy(window); + return TRUE; +} + +static void btnmedia_clicked(GtkWidget * widget,LeftPanel * parent_panel){ + if(!parent_panel->media_running){ + //Create a window + parent_panel->media_player = media_player_new(parent_panel->parent_win); + //Connect to the close signal for window + g_signal_connect(parent_panel->media_player,"close-request",G_CALLBACK(media_player_closed),parent_panel); + + //Change Panel Status + gtk_image_set_from_icon_name(GTK_IMAGE(parent_panel->media_image),"multimedia-player1_running"); + parent_panel->media_running = TRUE; + + //Show Window + gtk_window_present(GTK_WINDOW(parent_panel->media_player)); + }else{ + //The Files Window is running, control the window + window_ctrl(parent_panel,GTK_WINDOW(parent_panel->media_player)); + } +} + static void left_panel_init(LeftPanel * panel){ gtk_widget_init_template(GTK_WIDGET(panel)); @@ -205,6 +234,7 @@ static void left_panel_init(LeftPanel * panel){ panel->drawapp_running = FALSE; panel->editor_running = FALSE; panel->game_running = FALSE; + panel->media_running = FALSE; //Connect Signals //Audacious media player @@ -237,11 +267,15 @@ static void left_panel_init(LeftPanel * panel){ //Drawing App g_signal_connect(panel->btndraw,"clicked",G_CALLBACK(btndraw_clicked),panel); g_signal_connect_swapped(panel->btndraw,"clicked",G_CALLBACK(gtk_popover_popdown),panel->popover1); + //Media Player + g_signal_connect(panel->btnmedia,"clicked",G_CALLBACK(btnmedia_clicked),panel); + g_signal_connect_swapped(panel->btnmedia,"clicked",G_CALLBACK(gtk_popover_popdown),panel->popover1); //Panel Buttons g_signal_connect(panel->panel_game,"clicked",G_CALLBACK(btngame_clicked),panel); g_signal_connect(panel->panel_file,"clicked",G_CALLBACK(btnfile_clicked),panel); g_signal_connect(panel->panel_editor,"clicked",G_CALLBACK(btneditor_clicked),panel); g_signal_connect(panel->panel_drawing,"clicked",G_CALLBACK(btndraw_clicked),panel); + g_signal_connect(panel->panel_media,"clicked",G_CALLBACK(btnmedia_clicked),panel); } static void left_panel_class_init(LeftPanelClass * klass){ @@ -262,6 +296,7 @@ static void left_panel_class_init(LeftPanelClass * klass){ gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass),LeftPanel,btngame); gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass),LeftPanel,btnrun); gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass),LeftPanel,btneditor); + gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass),LeftPanel,btnmedia); gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass),LeftPanel,panel_file); gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass),LeftPanel,file_image); gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass),LeftPanel,panel_game); @@ -270,6 +305,8 @@ static void left_panel_class_init(LeftPanelClass * klass){ gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass),LeftPanel,editor_image); gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass),LeftPanel,panel_drawing); gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass),LeftPanel,drawing_image); + gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass),LeftPanel,panel_media); + gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass),LeftPanel,media_image); } LeftPanel * left_panel_new(){ diff --git a/Gtk4/src/MediaPlayer.cpp b/Gtk4/src/MediaPlayer.cpp new file mode 100644 index 0000000..b8ac23b --- /dev/null +++ b/Gtk4/src/MediaPlayer.cpp @@ -0,0 +1,161 @@ +#include "MediaPlayer.h" + +struct _MediaPlayer{ + GtkApplicationWindow parent; + GtkWidget * video; + GtkWidget * menubtn; +}; + +G_DEFINE_TYPE(MediaPlayer,media_player,GTK_TYPE_APPLICATION_WINDOW) + +static void clear_activated(GSimpleAction *action, + GVariant *parmeter, + gpointer data) +{ + MediaPlayer * player = MEDIA_PLAYER(data); + + GtkMediaStream * stream = gtk_video_get_media_stream(GTK_VIDEO(player->video)); + gtk_media_file_clear(GTK_MEDIA_FILE(stream)); + gtk_video_set_file(GTK_VIDEO(player->video),NULL); + //Set window title + gtk_window_set_title(GTK_WINDOW(data),"Gtk4 Media"); +} + +static void pause_activated(GSimpleAction *action, + GVariant *parmeter, + gpointer data) +{ + MediaPlayer * player = MEDIA_PLAYER(data); + GtkMediaStream *media=gtk_video_get_media_stream(GTK_VIDEO(player->video)); + + if(media!=NULL){ + gtk_media_stream_pause(media); + g_object_unref(media); + } + +} + +static void play_activated(GSimpleAction *action, + GVariant *parmeter, + gpointer data) +{ + MediaPlayer * player = MEDIA_PLAYER(data); + GtkMediaStream *media=gtk_video_get_media_stream(GTK_VIDEO(player->video)); + + if(media!=NULL){ + gtk_media_stream_play(media); + g_object_unref(media); + } +} + +static void about_activated(GSimpleAction *action, + GVariant *parmeter, + gpointer data) +{ + GtkWindow *win = GTK_WINDOW(data); + const char *authors[]={ + "Dale Clack", + NULL + }; + //Program version + char *version; + version=g_strdup_printf("2.0\nRunning Against GTK %d.%d.%d", + gtk_get_major_version(), + gtk_get_minor_version(), + gtk_get_micro_version()); + GtkWidget *dialog; + dialog=gtk_dialog_new(); + gtk_show_about_dialog(win, + "program-name","Gtk4 Media", + "version",version, + "copyright", "© 2019—2021 The Xe Project", + "comments","A Simple Media Player", + "authors",authors, + "logo-icon-name","media-player1", + "title","About Gtk4 Media", + NULL); +} + +static void dialog_response(GtkWidget *widget,int response,MediaPlayer * player){ + //Get File and set the file to the mediacontrols + if(response==GTK_RESPONSE_OK){ + //Get media File and filename + char *filename=NULL; + GFile *file=gtk_file_chooser_get_file(GTK_FILE_CHOOSER(widget)); + gtk_video_set_file(GTK_VIDEO(player->video),file); + filename=g_file_get_basename(file); + gtk_window_set_title(GTK_WINDOW(player),filename); + //Free the memory + g_object_unref(file); + free(filename); + } + gtk_window_destroy(GTK_WINDOW(widget)); +} + +static void open_activated(GSimpleAction *action, + GVariant *parmeter, + gpointer data) +{ + //Set a dialog and choose the file + GtkWindow *parent = GTK_WINDOW(data); + GtkWidget *dialog; + GtkFileChooserAction action1=GTK_FILE_CHOOSER_ACTION_OPEN; + dialog = gtk_file_chooser_dialog_new("Open Media File",parent,action1, + "OK",GTK_RESPONSE_OK,"Cancel",GTK_RESPONSE_CANCEL,NULL); + //Set filter + GtkFileFilter *filter; + filter=gtk_file_filter_new(); + gtk_file_filter_add_pattern(filter,"*.mp3"); + gtk_file_filter_add_pattern(filter,"*.wav"); + gtk_file_filter_add_pattern(filter,"*.flac"); + gtk_file_filter_add_pattern(filter,"*.aac"); + gtk_file_filter_add_pattern(filter,"*.m4a"); + gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog),filter); + g_signal_connect(dialog,"response",G_CALLBACK(dialog_response),parent); + gtk_widget_show(dialog); +} + +static void quit_activated(GSimpleAction * action,GVariant * parmeter, gpointer data) +{ + gtk_window_close(GTK_WINDOW(data)); +} + +static void media_player_init(MediaPlayer * self){ + //Initalize Window + GtkWidget * header = gtk_header_bar_new(); + gtk_window_set_title(GTK_WINDOW(self),"Video Player"); + gtk_window_set_titlebar(GTK_WINDOW(self),header); + + //Ininalize Action + GActionEntry entries[] = { + {"quit",quit_activated,NULL,NULL,NULL}, + {"open",open_activated,NULL,NULL,NULL}, + {"play",play_activated,NULL,NULL,NULL}, + {"pause",pause_activated,NULL,NULL,NULL}, + {"clear",clear_activated,NULL,NULL,NULL}, + {"about",about_activated,NULL,NULL,NULL} + }; + g_action_map_add_action_entries(G_ACTION_MAP(self),entries,G_N_ELEMENTS(entries),self); + + //Add Menu + self->menubtn = gtk_menu_button_new(); + GtkBuilder * menu_builder = gtk_builder_new_from_resource("/org/gtk/daleclack/media_menu.xml"); + GMenuModel * model = G_MENU_MODEL(gtk_builder_get_object(menu_builder,"media-menu")); + GtkWidget * popover = gtk_popover_menu_new_from_model(model); + gtk_widget_set_halign(popover,GTK_ALIGN_END); + gtk_menu_button_set_popover(GTK_MENU_BUTTON(self->menubtn),popover); + gtk_header_bar_pack_end(GTK_HEADER_BAR(header),self->menubtn); + + //Create video + self->video = gtk_video_new(); + gtk_widget_set_size_request(self->video,400,200); + gtk_window_set_child(GTK_WINDOW(self),self->video); + + g_object_unref(menu_builder); +} + +static void media_player_class_init(MediaPlayerClass * klass){} + +MediaPlayer * media_player_new(GtkWindow * parent_win){ + return (MediaPlayer*)g_object_new(media_player_get_type(),"transient-for",parent_win,NULL); +} diff --git a/Gtk4/src/MediaPlayer.h b/Gtk4/src/MediaPlayer.h new file mode 100644 index 0000000..22ba04a --- /dev/null +++ b/Gtk4/src/MediaPlayer.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +G_DECLARE_FINAL_TYPE(MediaPlayer,media_player,MEDIA,PLAYER,GtkApplicationWindow) + +MediaPlayer * media_player_new(GtkWindow * parent_win);