]> git.sesse.net Git - vlc/blob - modules/gui/beos/PlayListWindow.cpp
Some clean-up. Playlist works again.
[vlc] / modules / gui / beos / PlayListWindow.cpp
1 /*****************************************************************************
2  * PlayListWindow.cpp: beos interface
3  *****************************************************************************
4  * Copyright (C) 1999, 2000, 2001 VideoLAN
5  * $Id: PlayListWindow.cpp,v 1.3 2002/10/10 23:11:52 titer Exp $
6  *
7  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
8  *          Samuel Hocevar <sam@zoy.org>
9  *          Tony Castley <tony@castley.net>
10  *          Richard Shepherd <richard@rshepherd.demon.co.uk>
11  *          Stephan Aßmus <stippi@yellowbites.com>
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
26  *****************************************************************************/
27
28 /* System headers */
29 #include <InterfaceKit.h>
30 #include <StorageKit.h>
31 #include <string.h>
32
33 /* VLC headers */
34 #include <vlc/vlc.h>
35 #include <vlc/intf.h>
36
37 /* BeOS interface headers */
38 #include "VlcWrapper.h"
39 #include "InterfaceWindow.h"
40 #include "ListViews.h"
41 #include "MsgVals.h"
42 #include "PlayListWindow.h"
43
44 enum
45 {
46         MSG_SELECT_ALL          = 'sall',
47         MSG_SELECT_NONE         = 'none',
48         MSG_RANDOMIZE           = 'rndm',
49         MSG_SORT_NAME           = 'srtn',
50         MSG_SORT_PATH           = 'srtp',
51         MSG_REMOVE                      = 'rmov',
52         MSG_REMOVE_ALL          = 'rmal',
53 };
54
55
56 /*****************************************************************************
57  * PlayListWindow::PlayListWindow
58  *****************************************************************************/
59 PlayListWindow::PlayListWindow( BRect frame, const char* name,
60                                                                 playlist_t *playlist,
61                                                                 InterfaceWindow* mainWindow,
62                                                                 intf_thread_t *p_interface )
63         :       BWindow( frame, name, B_FLOATING_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
64                                  B_WILL_ACCEPT_FIRST_CLICK | B_ASYNCHRONOUS_CONTROLS ),
65                 fPlaylist( playlist ),
66                 fMainWindow( mainWindow )
67 {
68         this->p_intf = p_interface;
69     SetName( "playlist" );
70
71     // set up the main menu bar
72         fMenuBar = new BMenuBar( BRect(0.0, 0.0, frame.Width(), 15.0), "main menu",
73                                                          B_FOLLOW_NONE, B_ITEMS_IN_ROW, false );
74
75     AddChild( fMenuBar );
76
77         // Add the File menu
78         BMenu *fileMenu = new BMenu( "File" );
79         fMenuBar->AddItem( fileMenu );
80         BMenuItem* item = new BMenuItem( "Open File" B_UTF8_ELLIPSIS,
81                                                                          new BMessage( OPEN_FILE ), 'O' );
82         item->SetTarget( fMainWindow );
83         fileMenu->AddItem( item );
84
85         CDMenu* cd_menu = new CDMenu( "Open Disc" );
86         fileMenu->AddItem( cd_menu );
87
88         fileMenu->AddSeparatorItem();
89         item = new BMenuItem( "Close",
90                                                   new BMessage( B_QUIT_REQUESTED ), 'W' );
91         fileMenu->AddItem( item );
92
93         // Add the Edit menu
94         BMenu *editMenu = new BMenu( "Edit" );
95         fMenuBar->AddItem( editMenu );
96         item = new BMenuItem( "Select All",
97                                                   new BMessage( MSG_SELECT_ALL ), 'A' );
98         editMenu->AddItem( item );
99         item = new BMenuItem( "Select None",
100                                                   new BMessage( MSG_SELECT_NONE ), 'A', B_SHIFT_KEY );
101         editMenu->AddItem( item );
102
103         editMenu->AddSeparatorItem();
104         item = new BMenuItem( "Sort by Name",
105                                                   new BMessage( MSG_SORT_NAME ), 'N' );
106         editMenu->AddItem( item );
107         item = new BMenuItem( "Sort by Path",
108                                                   new BMessage( MSG_SORT_PATH ), 'P' );
109         editMenu->AddItem( item );
110         item = new BMenuItem( "Randomize",
111                                                   new BMessage( MSG_RANDOMIZE ), 'R' );
112         editMenu->AddItem( item );
113         editMenu->AddSeparatorItem();
114         item = new BMenuItem( "Remove",
115                                                   new BMessage( MSG_REMOVE ) );
116         editMenu->AddItem( item );
117         item = new BMenuItem( "Remove All",
118                                                   new BMessage( MSG_REMOVE_ALL ) );
119         editMenu->AddItem( item );
120
121 editMenu->SetEnabled( false );
122
123         // make menu bar resize to correct height
124         float menuWidth, menuHeight;
125         fMenuBar->GetPreferredSize( &menuWidth, &menuHeight );
126         // don't change next line! it's a workarround!
127         fMenuBar->ResizeTo( frame.Width(), menuHeight );
128
129         frame = Bounds();
130         frame.top += fMenuBar->Bounds().IntegerHeight() + 1;
131         frame.right -= B_V_SCROLL_BAR_WIDTH;
132
133         fListView = new PlaylistView( frame, fMainWindow );
134         fBackgroundView = new BScrollView( "playlist scrollview",
135                                                                            fListView, B_FOLLOW_ALL_SIDES,
136                                                                            0, false, true,
137                                                                            B_NO_BORDER );
138
139         AddChild( fBackgroundView );
140
141         // be up to date
142         UpdatePlaylist();
143         FrameResized( Bounds().Width(), Bounds().Height() );
144         SetSizeLimits( menuWidth * 2.0, menuWidth * 6.0,
145                                    menuHeight * 5.0, menuHeight * 25.0 );
146
147         UpdatePlaylist( true );
148         // start window thread in hidden state
149         Hide();
150         Show();
151 }
152
153 /*****************************************************************************
154  * PlayListWindow::~PlayListWindow
155  *****************************************************************************/
156 PlayListWindow::~PlayListWindow()
157 {
158 }
159
160 /*****************************************************************************
161  * PlayListWindow::QuitRequested
162  *****************************************************************************/
163 bool
164 PlayListWindow::QuitRequested()
165 {
166         Hide(); 
167         return false;
168 }
169
170 /*****************************************************************************
171  * PlayListWindow::MessageReceived
172  *****************************************************************************/
173 void
174 PlayListWindow::MessageReceived( BMessage * p_message )
175 {
176         switch ( p_message->what )
177         {
178                 case OPEN_DVD:
179                 case B_REFS_RECEIVED:
180                 case B_SIMPLE_DATA:
181                         // forward to interface window
182                         fMainWindow->PostMessage( p_message );
183                         break;
184                 case MSG_SELECT_ALL:
185                         break;
186                 case MSG_SELECT_NONE:
187                         break;
188                 case MSG_RANDOMIZE:
189                         break;
190                 case MSG_SORT_NAME:
191                         break;
192                 case MSG_SORT_PATH:
193                         break;
194                 case MSG_REMOVE:
195                         break;
196                 case MSG_REMOVE_ALL:
197                         break;
198                 default:
199                         BWindow::MessageReceived( p_message );
200                         break;
201         }
202 }
203
204 /*****************************************************************************
205  * PlayListWindow::FrameResized
206  *****************************************************************************/
207 void
208 PlayListWindow::FrameResized(float width, float height)
209 {
210         BRect r(Bounds());
211         fMenuBar->MoveTo(r.LeftTop());
212         fMenuBar->ResizeTo(r.Width(), fMenuBar->Bounds().Height());
213         r.top += fMenuBar->Bounds().Height() + 1.0;
214         fBackgroundView->MoveTo(r.LeftTop());
215         // the "+ 1.0" is to make the scrollbar
216         // be partly covered by the window border
217         fBackgroundView->ResizeTo(r.Width() + 1.0, r.Height() + 1.0);
218 }
219
220 /*****************************************************************************
221  * PlayListWindow::ReallyQuit
222  *****************************************************************************/
223 void
224 PlayListWindow::ReallyQuit()
225 {
226     Lock();
227     Hide();
228     Quit();
229 }
230
231 /*****************************************************************************
232  * PlayListWindow::UpdatePlaylist
233  *****************************************************************************/
234 void
235 PlayListWindow::UpdatePlaylist( bool rebuild )
236 {
237         if ( rebuild )
238         {
239                 // remove all items
240                 int32 count = fListView->CountItems();
241                 while ( BListItem* item = fListView->RemoveItem( --count ) )
242                         delete item;
243         
244                 // rebuild listview from VLC's playlist
245                 for ( int i = 0; i < fPlaylist->i_size; i++ )
246                         fListView->AddItem( new PlaylistItem( fPlaylist->pp_items[i]->psz_name ) );
247         }
248         fListView->SetCurrent( fPlaylist->i_index );
249         fListView->SetPlaying( p_intf->p_sys->p_vlc_wrapper->is_playing() );
250 }