Open files via native file chooser

This commit is contained in:
Rafostar
2020-10-26 21:25:13 +01:00
parent 556809c1f4
commit ac06e84851
6 changed files with 81 additions and 4 deletions

View File

@@ -45,7 +45,8 @@ class ClapperApp extends Gtk.Application
`${clapperPath}/ui/clapper.ui` `${clapperPath}/ui/clapper.ui`
); );
let models = { let models = {
settingsMenu: uiBuilder.get_object('settingsMenu') addMediaMenu: uiBuilder.get_object('addMediaMenu'),
settingsMenu: uiBuilder.get_object('settingsMenu'),
}; };
let headerBar = new HeaderBar(window, models); let headerBar = new HeaderBar(window, models);
window.set_titlebar(headerBar); window.set_titlebar(headerBar);

View File

@@ -0,0 +1,46 @@
const { Gio, GObject, Gtk } = imports.gi;
var FileChooser = GObject.registerClass(
class ClapperFileChooser extends Gtk.FileChooserNative
{
_init(window, appName)
{
super._init({
transient_for: window,
});
let filter = new Gtk.FileFilter({
name: 'Media Files',
});
filter.add_mime_type('video/*');
filter.add_mime_type('audio/*');
filter.add_mime_type('application/claps');
this.add_filter(filter);
this.responseSignal = this.connect('response', this._onResponse.bind(this));
}
present()
{
/* File chooser closes itself when nobody is holding its ref */
this.ref();
super.show();
}
_onResponse(filechooser, response)
{
this.disconnect(this.responseSignal);
this.responseSignal = null;
if(response === Gtk.ResponseType.ACCEPT) {
let file = this.get_file();
let { player } = this.get_transient_for().get_child();
player.set_media(file.get_uri());
}
this.unref();
this.run_dispose();
}
});

View File

@@ -11,15 +11,22 @@ class ClapperHeaderBar extends Gtk.HeaderBar
this.set_title_widget(this._createWidgetForWindow(window)); this.set_title_widget(this._createWidgetForWindow(window));
let addMediaButton = new Gtk.MenuButton({
icon_name: 'list-add-symbolic',
});
let addMediaPopover = new HeaderBarPopover(models.addMediaMenu);
addMediaButton.set_popover(addMediaPopover);
this.pack_start(addMediaButton);
let openMenuButton = new Gtk.MenuButton({ let openMenuButton = new Gtk.MenuButton({
icon_name: 'open-menu-symbolic' icon_name: 'open-menu-symbolic',
}); });
let settingsPopover = new HeaderBarPopover(models.settingsMenu); let settingsPopover = new HeaderBarPopover(models.settingsMenu);
openMenuButton.set_popover(settingsPopover); openMenuButton.set_popover(settingsPopover);
this.pack_end(openMenuButton); this.pack_end(openMenuButton);
let fullscreenButton = new Gtk.Button({ let fullscreenButton = new Gtk.Button({
icon_name: 'view-fullscreen-symbolic' icon_name: 'view-fullscreen-symbolic',
}); });
fullscreenButton.connect('clicked', () => this.get_parent().fullscreen()); fullscreenButton.connect('clicked', () => this.get_parent().fullscreen());
this.pack_end(fullscreenButton); this.pack_end(fullscreenButton);

View File

@@ -1,8 +1,10 @@
const { GObject, Gst, Gtk } = imports.gi; const { GObject, Gst, Gtk } = imports.gi;
const Misc = imports.clapper_src.misc; const Misc = imports.clapper_src.misc;
const Prefs = imports.clapper_src.prefs; const Prefs = imports.clapper_src.prefs;
const { FileChooser } = imports.clapper_src.filechooser;
var actions = [ var actions = [
openLocal,
prefs, prefs,
about, about,
]; ];
@@ -11,6 +13,12 @@ var accels = [
['app.quit', ['q']], ['app.quit', ['q']],
]; ];
function openLocal(window, appName)
{
let fileChooser = new FileChooser(window);
fileChooser.present();
}
function prefs(window, appName) function prefs(window, appName)
{ {
let prefsWidget = Prefs.buildPrefsWidget(); let prefsWidget = Prefs.buildPrefsWidget();

View File

@@ -278,8 +278,10 @@ var Widget = GObject.registerClass({
{ {
switch(state) { switch(state) {
case GstPlayer.PlayerState.BUFFERING: case GstPlayer.PlayerState.BUFFERING:
if(!player.is_local_file) if(!player.is_local_file) {
this.needsTracksUpdate = true; this.needsTracksUpdate = true;
}
debug('player state changed to: BUFFERING');
break; break;
case GstPlayer.PlayerState.STOPPED: case GstPlayer.PlayerState.STOPPED:
this.controls.currentPosition = 0; this.controls.currentPosition = 0;
@@ -290,8 +292,12 @@ var Widget = GObject.registerClass({
player.disconnect(this.mediaInfoSignal); player.disconnect(this.mediaInfoSignal);
this.mediaInfoSignal = null; this.mediaInfoSignal = null;
} }
this.controls.togglePlayButton.setPrimaryIcon();
debug('player state changed to: STOPPED');
break;
case GstPlayer.PlayerState.PAUSED: case GstPlayer.PlayerState.PAUSED:
this.controls.togglePlayButton.setPrimaryIcon(); this.controls.togglePlayButton.setPrimaryIcon();
debug('player state changed to: PAUSED');
break; break;
case GstPlayer.PlayerState.PLAYING: case GstPlayer.PlayerState.PLAYING:
this.controls.togglePlayButton.setSecondaryIcon(); this.controls.togglePlayButton.setSecondaryIcon();
@@ -301,6 +307,7 @@ var Widget = GObject.registerClass({
'media_info_updated', this._onMediaInfoUpdated.bind(this) 'media_info_updated', this._onMediaInfoUpdated.bind(this)
); );
} }
debug('player state changed to: PLAYING');
break; break;
default: default:
break; break;

View File

@@ -1,5 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<menu id="addMediaMenu">
<section>
<item>
<attribute name="label" translatable="yes">Open Local File...</attribute>
<attribute name="action">app.openLocal</attribute>
</item>
</section>
</menu>
<menu id="settingsMenu"> <menu id="settingsMenu">
<section> <section>
<item> <item>