2008-11-13 23:23:02 UTC
previous
next
// MainWindow.cs is part of Echo Media Player
// Copyright (C) 2008 Shane O'Connell
//
// [ The original file includes a copyright header in this location describing
// the file as being released under the terms of the GNU General Public
// License. It has been removed in order to display the file as part of the
// archive. ]
//
using System;
using Echo;
namespace Echo.UI
{
public class MainWindow : Gtk.Window
{
private Gtk.StatusIcon status_icon;
public MainWindow() : base(Gtk.WindowType.Toplevel)
{
Gtk.ActionGroup action_group = new Gtk.ActionGroup("default");
Gtk.ActionEntry[] actions = new Gtk.ActionEntry[] {
new Gtk.ActionEntry("file-menu", null, "_File", null, null, null),
new Gtk.ActionEntry("view-menu", null, "_View", null, null, null),
new Gtk.ActionEntry("playback-menu", null, "_Playback", null, null, null),
new Gtk.ActionEntry("repeat-menu", null, "_Repeat", null, null, null),
new Gtk.ActionEntry("shuffle-menu", null, "_Shuffle", null, null, null),
new Gtk.ActionEntry("help-menu", null, "_Help", null, null, null),
new Gtk.ActionEntry("new-playlist", null, "_New Playlist", null, null, null),
new Gtk.ActionEntry("new-smart-playlist", null, "New _Smart Playlist", null, null, null),
new Gtk.ActionEntry("open-file", Gtk.Stock.Open, null, null, null, null),
new Gtk.ActionEntry("open-url", null, "Open _URL", null, null, null),
new Gtk.ActionEntry("refresh-libraries", null, "Refresh _Libraries", null, null, null),
new Gtk.ActionEntry("close", Gtk.Stock.Close,
delegate(object o, EventArgs e) { this.Hide(); }),
new Gtk.ActionEntry("quit", Gtk.Stock.Quit,
delegate(object o, EventArgs e) { Gtk.Application.Quit(); }),
new Gtk.ActionEntry("view-fullscreen", null, "_Full Screen", null, null, null),
new Gtk.ActionEntry("play-pause", Gtk.Stock.MediaPlay, null),
new Gtk.ActionEntry("next-track", Gtk.Stock.MediaNext, null),
new Gtk.ActionEntry("previous-track", Gtk.Stock.MediaPrevious, null),
new Gtk.ActionEntry("stop-when-finished", null, "_Stop When Finished", null, null, null),
new Gtk.ActionEntry("about", Gtk.Stock.About, null)
};
action_group.Add(actions);
Gtk.ToggleActionEntry[] toggle_actions = new Gtk.ToggleActionEntry[] {
new Gtk.ToggleActionEntry("view-browser", null, "_Browser Pane", null, null, null, true)
};
action_group.Add(toggle_actions);
Gtk.RadioActionEntry[] shuffle_actions = new Gtk.RadioActionEntry[] {
new Gtk.RadioActionEntry("shuffle-off", null, "Shuffle _Off", null, null, 0),
new Gtk.RadioActionEntry("shuffle-by-song", null, "Shuffle By _Song", null, null, 1),
new Gtk.RadioActionEntry("shuffle-by-artist", null, "Shuffle By _Artist", null, null, 2),
new Gtk.RadioActionEntry("shuffle-by-album", null, "Shuffle By Al_bum", null, null, 3)
};
action_group.Add(shuffle_actions, 0, null);
Gtk.RadioActionEntry[] repeat_actions = new Gtk.RadioActionEntry[] {
new Gtk.RadioActionEntry("repeat-off", null, "Repeat _Off", null, null, 0),
new Gtk.RadioActionEntry("repeat-all", null, "Repeat _All", null, null, 1),
new Gtk.RadioActionEntry("repeat-single", null, "Repeat _Single", null, null, 2)
};
action_group.Add(repeat_actions, 0, null);
string ui_info =
"<ui>" +
" <menubar name='main-menubar'>" +
" <menu action='file-menu'>" +
" <menuitem action='new-playlist'/>" +
" <menuitem action='new-smart-playlist'/>" +
" <separator/>" +
" <menuitem action='open-file'/>" +
" <menuitem action='open-url'/>" +
" <separator/>" +
" <menuitem action='refresh-libraries'/>" +
" <separator/>" +
" <menuitem action='close'/>" +
" <menuitem action='quit'/>" +
" </menu>" +
" <menu action='view-menu'>" +
" <menuitem action='view-browser'/>" +
" <menuitem action='view-fullscreen'/>" +
" </menu>" +
" <menu action='playback-menu'>" +
" <menuitem action='play-pause'/>" +
" <menuitem action='next-track'/>" +
" <menuitem action='previous-track'/>" +
" <separator/>" +
" <menuitem action='stop-when-finished'/>" +
" <menu action='repeat-menu'>" +
" <menuitem action='repeat-off'/>" +
" <separator/>" +
" <menuitem action='repeat-all'/>" +
" <menuitem action='repeat-single'/>" +
" </menu>" +
" <menu action='shuffle-menu'>" +
" <menuitem action='shuffle-off'/>" +
" <separator/>" +
" <menuitem action='shuffle-by-song'/>" +
" <menuitem action='shuffle-by-artist'/>" +
" <menuitem action='shuffle-by-album'/>" +
" </menu>" +
" </menu>" +
" <menu action='help-menu'>" +
" <menuitem action='about'/>" +
" </menu>" +
" </menubar>" +
" <toolbar name='main-toolbar'>" +
" <toolitem action='previous-track'/>" +
" <toolitem action='play-pause'/>" +
" </toolbar>" +
" <popup name='status-icon-popup'>" +
" <menuitem action='play-pause'/>" +
" <menuitem action='previous-track'/>" +
" <menuitem action='next-track'/>" +
" <separator/>" +
" <menuitem action='quit'/>" +
" </popup>" +
" <popup name='next-track-popup'>" +
" <menuitem action='shuffle-off'/>" +
" <separator/>" +
" <menuitem action='shuffle-by-song'/>" +
" <menuitem action='shuffle-by-artist'/>" +
" <menuitem action='shuffle-by-album'/>" +
" </popup>" +
"</ui>";
Gtk.UIManager ui_manager = new Gtk.UIManager();
ui_manager.InsertActionGroup(action_group, 0);
ui_manager.AddUiFromString(ui_info);
Gtk.Menu status_icon_menu = (Gtk.Menu)ui_manager.GetWidget("/status-icon-popup");
this.status_icon = Gtk.StatusIcon.NewFromStock(Gtk.Stock.Execute);
this.status_icon.PopupMenu += delegate(object o, Gtk.PopupMenuArgs args)
{
this.status_icon.PresentMenu(status_icon_menu, (uint)args.Args[0], (uint)args.Args[1]);
};
this.status_icon.Activate += delegate(object o, EventArgs args)
{
if (this.Visible)
this.Hide();
else
this.Show();
};
this.Title = "Echo Media Player";
this.DefaultWidth = 800;
this.DefaultHeight = 600;
Gtk.MenuBar menubar = (Gtk.MenuBar)ui_manager.GetWidget("/main-menubar");
Gtk.Statusbar statusbar = new Gtk.Statusbar();
Gtk.Toolbar toolbar = (Gtk.Toolbar)ui_manager.GetWidget("/main-toolbar");
toolbar.ToolbarStyle = Gtk.ToolbarStyle.Icons;
Gtk.MenuToolButton next_track_button = new Gtk.MenuToolButton(Gtk.Stock.MediaNext);
action_group.GetAction("next-track").ConnectProxy(next_track_button);
next_track_button.Menu = ui_manager.GetWidget("/next-track-popup");
toolbar.Insert(next_track_button, toolbar.NItems);
toolbar.Insert(new Gtk.SeparatorToolItem(), toolbar.NItems);
Gtk.HPaned browser_sizer = new Gtk.HPaned();
browser_sizer.Add1(new Gtk.Label("Browser"));
browser_sizer.Add2(new TabPane());
browser_sizer.Position = 200;
Gtk.HPaned main_sizer = new Gtk.HPaned();
main_sizer.Add1(new Gtk.Label("Sources"));
main_sizer.Add2(browser_sizer);
main_sizer.Position = 160;
Gtk.VBox vbox = new Gtk.VBox(false, 0);
vbox.PackStart(menubar, false, true, 0);
vbox.PackStart(toolbar, false, true, 0);
vbox.PackStart(main_sizer, true, true, 0);
vbox.PackStart(statusbar, false, true, 0);
this.Add(vbox);
this.ShowAll();
}
protected override bool OnDeleteEvent (Gdk.Event evnt)
{
// TODO why do I have to do this?
this.Hide();
return true;
}
}
}