public CoverArtPanel(AudioPlayer audioPlayer, params ITrackSelector[] trackSelectors) : base(false, 0) { ButtonBox buttonBox = new HButtonBox(); _selectedButton = new ToggleButton("Selected"); _playingButton = new ToggleButton("Playing"); buttonBox.Add(_playingButton); buttonBox.Add(_selectedButton); PackStart(buttonBox, false, false, 0); EventBox eventBox = new EventBox(); eventBox.Add(_picture); eventBox.ButtonPressEvent += (o, args) => { var window = new Gtk.Window(WindowType.Toplevel); var pixbuf = _currentPixbuf.Copy(); AutoScalingImage image = new AutoScalingImage(); window.Add(image); int left, top, right, bottom; window.GetFrameDimensions(out left, out top, out right, out bottom); int windowHeightWithFullImage = pixbuf.Height + top + bottom; if (windowHeightWithFullImage > Screen.Height) window.SetDefaultSize(((pixbuf.Width + left + right) * Screen.Height) / windowHeightWithFullImage, Screen.Height); else window.SetDefaultSize(pixbuf.Width + left + right, pixbuf.Height + top + bottom); window.AllowShrink = true; image.Pixbuf = pixbuf; Track track = _selectedButton.Active ? _selectedTrack : _playingTrack; window.Title = String.Format("{0} - {1}", string.Join("; ", track.Album.Artists.Select(a => a.Name)), track.Album.Title); window.ShowAll(); image.QueueResize(); window.SizeAllocated += (o1, allocatedArgs) => { Console.WriteLine("window: {0}", window.Allocation); Console.WriteLine("args: {0}", allocatedArgs.Allocation); if (window.Allocation.Width != allocatedArgs.Allocation.Width || window.Allocation.Height != allocatedArgs.Allocation.Height) { image.SizeAllocate(allocatedArgs.Allocation); image.QueueResize(); image.QueueDraw(); window.QueueDraw(); } }; }; PackStart(eventBox, true, true, 0); _selectedButton.Toggled += SelectedButtonOnToggled; _playingButton.Toggled += PlayingButtonOnToggled; foreach (var trackSelector in trackSelectors) { if (trackSelector.HasFocus) _selectedTrack = trackSelector.CurrentTrack; trackSelector.SelectedTrack += TrackSelectorOnSelectedTrack; } audioPlayer.TrackChanged += AudioPlayerOnTrackChanged; _selectedButton.Shown += (sender, args) => _selectedButton.Active = true; ShowAll(); }