* MessagesWindow.cpp: beos interface
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: MessagesWindow.cpp,v 1.9 2003/05/17 15:20:46 titer Exp $
+ * $Id: MessagesWindow.cpp,v 1.10 2003/05/17 18:30:41 titer Exp $
*
* Authors: Eric Petit <titer@videolan.org>
*
#include "InterfaceWindow.h"
#include "MessagesWindow.h"
-static int UpdateMessages( intf_thread_t * p_intf );
+/*****************************************************************************
+ * MessagesView::Pulse
+ *****************************************************************************/
+void MessagesView::Pulse()
+{
+ int i_start, oldLength;
+ char * psz_module_type = NULL;
+ rgb_color red = { 200, 0, 0 };
+ rgb_color gray = { 150, 150, 150 };
+ rgb_color green = { 0, 150, 0 };
+ rgb_color orange = { 230, 180, 00 };
+ rgb_color color;
+
+ vlc_mutex_lock( p_sub->p_lock );
+ int i_stop = *p_sub->pi_stop;
+ vlc_mutex_unlock( p_sub->p_lock );
+
+ if( p_sub->i_start != i_stop )
+ {
+ for( i_start = p_sub->i_start;
+ i_start != i_stop;
+ i_start = (i_start+1) % VLC_MSG_QSIZE )
+ {
+ /* Add message */
+ switch( p_sub->p_msg[i_start].i_type )
+ {
+ case VLC_MSG_INFO: color = green; break;
+ case VLC_MSG_WARN: color = orange; break;
+ case VLC_MSG_ERR: color = red; break;
+ case VLC_MSG_DBG: color = gray; break;
+ }
+
+ switch( p_sub->p_msg[i_start].i_object_type )
+ {
+ case VLC_OBJECT_ROOT: psz_module_type = "root"; break;
+ case VLC_OBJECT_VLC: psz_module_type = "vlc"; break;
+ case VLC_OBJECT_MODULE: psz_module_type = "module"; break;
+ case VLC_OBJECT_INTF: psz_module_type = "interface"; break;
+ case VLC_OBJECT_PLAYLIST: psz_module_type = "playlist"; break;
+ case VLC_OBJECT_ITEM: psz_module_type = "item"; break;
+ case VLC_OBJECT_INPUT: psz_module_type = "input"; break;
+ case VLC_OBJECT_DECODER: psz_module_type = "decoder"; break;
+ case VLC_OBJECT_VOUT: psz_module_type = "video output"; break;
+ case VLC_OBJECT_AOUT: psz_module_type = "audio output"; break;
+ case VLC_OBJECT_SOUT: psz_module_type = "stream output"; break;
+ }
+
+ if( LockLooper() )
+ {
+ oldLength = TextLength();
+ BString string;
+ string << p_sub->p_msg[i_start].psz_module
+ << " " << psz_module_type << " : "
+ << p_sub->p_msg[i_start].psz_msg << "\n";
+ Insert( TextLength(), string.String(), strlen( string.String() ) );
+ SetFontAndColor( oldLength, TextLength(), NULL, 0, &color );
+ Draw( Bounds() );
+ UnlockLooper();
+ }
+ }
+
+ vlc_mutex_lock( p_sub->p_lock );
+ p_sub->i_start = i_start;
+ vlc_mutex_unlock( p_sub->p_lock );
+ }
+
+ /* Scroll at the end unless the is user is selecting something */
+ int32 start, end;
+ GetSelection( &start, &end );
+ if( start == end && fScrollBar->LockLooper() )
+ {
+ float min, max;
+ fScrollBar->GetRange( &min, &max );
+ fScrollBar->SetValue( max );
+ fScrollBar->UnlockLooper();
+ }
+
+ BTextView::Pulse();
+}
/*****************************************************************************
* MessagesWindow::MessagesWindow
rect.right -= B_V_SCROLL_BAR_WIDTH;
textRect = rect;
textRect.InsetBy( 5, 5 );
- fMessagesView = new BTextView( rect, "messages", textRect,
- B_FOLLOW_ALL, B_WILL_DRAW );
+ fMessagesView = new MessagesView( p_intf,
+ rect, "messages", textRect,
+ B_FOLLOW_ALL, B_WILL_DRAW );
fMessagesView->MakeEditable( false );
fMessagesView->SetStylable( true );
fScrollView = new BScrollView( "scrollview", fMessagesView, B_WILL_DRAW,
B_FOLLOW_ALL, false, true );
- fScrollBar = fScrollView->ScrollBar( B_VERTICAL );
+ fMessagesView->fScrollBar = fScrollView->ScrollBar( B_VERTICAL );
AddChild( fScrollView );
/* start window thread in hidden state */
Hide();
Show();
-
- /* update it */
- if( vlc_thread_create( p_intf, "update messages", UpdateMessages,
- VLC_THREAD_PRIORITY_LOW, VLC_FALSE ) )
- {
- msg_Err( p_intf, "cannot create update messages thread" );
- }
}
/*****************************************************************************
*****************************************************************************/
MessagesWindow::~MessagesWindow()
{
- vlc_thread_join( p_intf );
}
/*****************************************************************************
Hide();
Quit();
}
-
-/*****************************************************************************
- * UpdateMessages
- *****************************************************************************/
-static int UpdateMessages( intf_thread_t * p_intf )
-{
- /* workaround: wait a bit or it'll crash */
- msleep( 500000 );
-
- intf_sys_t * p_sys = (intf_sys_t*)p_intf->p_sys;
- msg_subscription_t * p_sub = p_sys->p_sub;
- MessagesWindow * messagesWindow = p_sys->p_window->fMessagesWindow;
- BTextView * messagesView = messagesWindow->fMessagesView;
- BScrollBar * scrollBar = messagesWindow->fScrollBar;
-
- while( !p_intf->b_die )
- {
- int i_start, oldLength;
- char * psz_module_type = NULL;
- rgb_color red = { 200, 0, 0 };
- rgb_color gray = { 150, 150, 150 };
- rgb_color green = { 0, 150, 0 };
- rgb_color orange = { 230, 180, 00 };
- rgb_color color;
-
- vlc_mutex_lock( p_sub->p_lock );
- int i_stop = *p_sub->pi_stop;
- vlc_mutex_unlock( p_sub->p_lock );
-
- if( p_sub->i_start != i_stop )
- {
- for( i_start = p_sub->i_start;
- i_start != i_stop;
- i_start = (i_start+1) % VLC_MSG_QSIZE )
- {
- /* Add message */
- switch( p_sub->p_msg[i_start].i_type )
- {
- case VLC_MSG_INFO: color = green; break;
- case VLC_MSG_WARN: color = orange; break;
- case VLC_MSG_ERR: color = red; break;
- case VLC_MSG_DBG: color = gray; break;
- }
-
- switch( p_sub->p_msg[i_start].i_object_type )
- {
- case VLC_OBJECT_ROOT: psz_module_type = "root"; break;
- case VLC_OBJECT_VLC: psz_module_type = "vlc"; break;
- case VLC_OBJECT_MODULE: psz_module_type = "module"; break;
- case VLC_OBJECT_INTF: psz_module_type = "interface"; break;
- case VLC_OBJECT_PLAYLIST: psz_module_type = "playlist"; break;
- case VLC_OBJECT_ITEM: psz_module_type = "item"; break;
- case VLC_OBJECT_INPUT: psz_module_type = "input"; break;
- case VLC_OBJECT_DECODER: psz_module_type = "decoder"; break;
- case VLC_OBJECT_VOUT: psz_module_type = "video output"; break;
- case VLC_OBJECT_AOUT: psz_module_type = "audio output"; break;
- case VLC_OBJECT_SOUT: psz_module_type = "stream output"; break;
- }
-
- if ( messagesView->LockLooper() )
- {
- oldLength = messagesView->TextLength();
- BString string;
- string << p_sub->p_msg[i_start].psz_module << " " << psz_module_type << " : " <<
- p_sub->p_msg[i_start].psz_msg << "\n";
- messagesView->Insert( messagesView->TextLength(),
- string.String(),
- strlen( string.String() ) );
- messagesView->SetFontAndColor( oldLength,
- messagesView->TextLength(),
- NULL, 0, &color );
- messagesView->Draw( messagesView->Bounds() );
- messagesView->UnlockLooper();
- }
-
- /* Scroll at the end */
-
- if( scrollBar->LockLooper() )
- {
- float min, max;
- scrollBar->GetRange( &min, &max );
- scrollBar->SetValue( max );
- scrollBar->UnlockLooper();
- }
- }
-
- vlc_mutex_lock( p_sub->p_lock );
- p_sub->i_start = i_start;
- vlc_mutex_unlock( p_sub->p_lock );
- }
- /* Wait a bit */
- msleep( INTF_IDLE_SLEEP );
- }
- return 0;
-}
* PreferencesWindow.cpp: beos interface
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: PreferencesWindow.cpp,v 1.21 2003/05/13 14:11:33 titer Exp $
+ * $Id: PreferencesWindow.cpp,v 1.22 2003/05/17 18:30:41 titer Exp $
*
* Authors: Eric Petit <titer@videolan.org>
*
{
StringItemWithView * first = (StringItemWithView*) _first;
StringItemWithView * second = (StringItemWithView*) _second;
-
- /* the beos module first */
- if( !strcmp( first->Text(), "beos" ) )
- return -1;
- if( !strcmp( second->Text(), "beos" ) )
- return 1;
- /* the main module in second */
- if( !strcmp( first->Text(), "main" ) )
- return -1;
- if( !strcmp( second->Text(), "main" ) )
+ /* The Modules tree at last */
+ if( !strcmp( first->Text(), _( "Modules" ) ) )
return 1;
+ if( !strcmp( second->Text(), _( "Modules" ) ) )
+ return -1;
/* alphabetic order */
return( strcmp( first->Text(), second->Text() ) );
fPrefsView = new BView( Bounds(), NULL, B_FOLLOW_ALL, B_WILL_DRAW );
fPrefsView->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );
AddChild( fPrefsView );
-
+
/* Create the preferences tree */
rect = Bounds();
rect.InsetBy( 10, 10 );
B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM,
0, false, true );
fPrefsView->AddChild( scrollview );
-
+
/* We need to be informed if the user selects an item */
fOutline->SetSelectionMessage( new BMessage( PREFS_ITEM_SELECTED ) );
rect.left = rect.right + 15 + B_V_SCROLL_BAR_WIDTH;
rect.right = Bounds().right - 15;
fDummyView = new BView( rect, "", B_FOLLOW_ALL_SIDES, B_WILL_DRAW );
+ fDummyView->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );
fPrefsView->AddChild( fDummyView );
/* Add a category for modules configuration */
StringItemWithView * modulesItem;
modulesItem = new StringItemWithView( _("Modules") );
- modulesItem->fConfigView = NULL;
fOutline->AddItem( modulesItem );
-
+
/* Fill the tree */
vlc_list_t * p_list;
p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE );
return;
}
- module_t * p_module;
+
+ /* First, handle the main module */
+ module_t * p_module = NULL;
+ module_config_t * p_item;
for( int i = 0; i < p_list->i_count; i++ )
{
p_module = (module_t*) p_list->p_values[i].p_object;
-
+
+ if( !strcmp( p_module->psz_object_name, "main" ) &&
+ ( p_item = p_module->p_config ) )
+ break;
+ else
+ p_module = NULL;
+ }
+
+ if( p_module )
+ {
+ /* We found the main module */
+ while( p_item->i_type == CONFIG_HINT_CATEGORY )
+ {
+ StringItemWithView * stringItem;
+ stringItem = new StringItemWithView( p_item->psz_text );
+ p_item++;
+ stringItem->fConfigView = BuildConfigView( &p_item, true );
+ fOutline->AddItem( stringItem );
+ }
+ }
+
+ for( int i = 0; i < p_list->i_count; i++ )
+ {
+ p_module = (module_t*) p_list->p_values[i].p_object;
+
+ if( !strcmp( p_module->psz_object_name, "main" ) )
+ continue;
+
/* If the module has no config option, ignore it */
- module_config_t * p_item;
p_item = p_module->p_config;
if( !p_item )
continue;
- do
- {
+ do {
if( p_item->i_type & CONFIG_ITEM )
break;
} while( p_item->i_type != CONFIG_HINT_END && p_item++ );
if( p_item->i_type == CONFIG_HINT_END )
continue;
-
- /* Build the config view for this module */
- rect = fDummyView->Bounds();
- rect.right -= B_V_SCROLL_BAR_WIDTH;
- BView * configView;
- configView = new BView( rect, "config view",
- B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, B_WILL_DRAW );
- configView->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );
-
- rect = configView->Bounds();
- rect.InsetBy( 10, 10 );
- rect.bottom = rect.top + TEXT_HEIGHT;
- ConfigTextControl * textControl;
- ConfigCheckBox * checkBox;
- ConfigMenuField * menuField;
- BPopUpMenu * popUp;
- p_item = p_module->p_config;
- bool firstItem = true;
- do
+ /* Create the capability tree if it doesn't already exist */
+ char * psz_capability;
+ psz_capability = p_module->psz_capability;
+ if( !psz_capability || !*psz_capability )
{
- switch( p_item->i_type )
+ /* Empty capability ? Let's look at the submodules */
+ module_t * p_submodule;
+ for( int j = 0; j < p_module->i_children; j++ )
{
- case CONFIG_ITEM_STRING:
- case CONFIG_ITEM_FILE:
- case CONFIG_ITEM_MODULE:
- case CONFIG_ITEM_DIRECTORY:
- if( !firstItem )
- rect.OffsetBy( 0, 25 );
- else
- firstItem = false;
-
- if( p_item->ppsz_list && p_item->ppsz_list[0] )
- {
- popUp = new BPopUpMenu( "" );
- menuField = new ConfigMenuField( rect, p_item->psz_text,
- popUp, p_item->psz_name );
- BMenuItem * menuItem;
- for( int i = 0; p_item->ppsz_list[i]; i++ )
- {
- menuItem = new BMenuItem( p_item->ppsz_list[i], new BMessage() );
- popUp->AddItem( menuItem );
- }
- configView->AddChild( menuField );
- }
- else
- {
- textControl = new ConfigTextControl( rect, p_item->psz_text,
- CONFIG_ITEM_STRING, p_item->psz_name );
- configView->AddChild( textControl );
- }
- break;
-
- case CONFIG_ITEM_INTEGER:
- if( !firstItem )
- rect.OffsetBy( 0, 25 );
- else
- firstItem = false;
-
- textControl = new ConfigTextControl( rect, p_item->psz_text,
- CONFIG_ITEM_INTEGER, p_item->psz_name );
- configView->AddChild( textControl );
- break;
-
- case CONFIG_ITEM_FLOAT:
- if( !firstItem )
- rect.OffsetBy( 0, 25 );
- else
- firstItem = false;
-
- textControl = new ConfigTextControl( rect, p_item->psz_text,
- CONFIG_ITEM_FLOAT, p_item->psz_name );
- configView->AddChild( textControl );
- break;
-
- case CONFIG_ITEM_BOOL:
- if( !firstItem )
- rect.OffsetBy( 0,25 );
- else
- firstItem = false;
-
- checkBox = new ConfigCheckBox( rect, p_item->psz_text,
- p_item->psz_name );
- configView->AddChild( checkBox );
+ p_submodule = (module_t*)p_module->pp_children[ j ];
+ if( p_submodule->psz_capability && *p_submodule->psz_capability )
+ {
+ psz_capability = p_submodule->psz_capability;
break;
+ }
}
+ }
- } while( p_item->i_type != CONFIG_HINT_END && p_item++ );
-
- /* Adjust the configView size */
- rect.bottom += 10;
- configView->ResizeTo( configView->Bounds().Width(), rect.bottom );
+ StringItemWithView * capabilityItem;
+ capabilityItem = NULL;
+ for( int j = 0; j < fOutline->CountItemsUnder( modulesItem, true ); j++ )
+ {
+ if( !strcmp( ((StringItemWithView*)
+ fOutline->ItemUnderAt( modulesItem, true, j ))->Text(),
+ psz_capability ) )
+ {
+ capabilityItem = (StringItemWithView*)
+ fOutline->ItemUnderAt( modulesItem, true, j );
+ break;
+ }
+ }
+ if( !capabilityItem )
+ {
+ capabilityItem = new StringItemWithView( psz_capability );
+ fOutline->AddUnder( capabilityItem, modulesItem );
+ }
- /* Add the item to the tree */
+ /* Now add the item ! */
StringItemWithView * stringItem;
stringItem = new StringItemWithView( p_module->psz_object_name );
- stringItem->fConfigView = configView;
- if( !strcmp( p_module->psz_object_name, "beos" )
- || !strcmp( p_module->psz_object_name, "main" ) )
- fOutline->AddItem( stringItem );
- else
- fOutline->AddUnder( stringItem, modulesItem );
+ stringItem->fConfigView = BuildConfigView( &p_item, false );
+ fOutline->AddUnder( stringItem, capabilityItem );
}
-
+
vlc_list_release( p_list );
-
+
/* Set the correct values */
ApplyChanges( false );
-
- /* Sort items, collapse the Modules one */
+
+ /* Sort items, collapse the tree */
fOutline->FullListSortItems( compare_func );
fOutline->Collapse( modulesItem );
-
+ for( int i = 0; i < fOutline->CountItemsUnder( modulesItem, true ); i++ )
+ fOutline->Collapse( fOutline->ItemUnderAt( modulesItem, true, i ) );
+
/* Select the first item */
fOutline->Select( 0 );
-
+
/* Add the buttons */
BButton * button;
rect = Bounds();
button = new BButton( rect, "", _("Defaults"), new BMessage( PREFS_DEFAULTS ),
B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM );
fPrefsView->AddChild( button );
-
+
Hide();
Show();
}
case PREFS_ITEM_SELECTED:
Update();
break;
-
+
case PREFS_DEFAULTS:
config_ResetAll( p_intf );
ApplyChanges( false );
break;
-
+
case PREFS_APPLY:
ApplyChanges( true );
break;
-
+
case PREFS_SAVE:
SaveChanges();
break;
void PreferencesWindow::FrameResized( float width, float height )
{
BWindow::FrameResized( width, height );
-
+
/* Get the current config BView */
BView * view;
view = fConfigScroll->ChildAt( 0 );
return;
StringItemWithView * selectedItem =
(StringItemWithView*) fOutline->ItemAt( fOutline->CurrentSelection() );
-
+
if( !selectedItem->fConfigView )
- /* This must be the "Modules" item */
+ /* This is a category */
return;
if( fConfigScroll )
fDummyView->RemoveChild( fConfigScroll );
delete fConfigScroll;
}
-
+
/* Create a BScrollView with the new config BView in it */
BRect oldBounds = selectedItem->fConfigView->Bounds();
selectedItem->fConfigView->ResizeTo( fDummyView->Bounds().Width() -
{
/* We have to fix the scrollbar manually because it doesn't handle
correctly simple BViews */
-
+
/* Get the current config view */
BView * view;
view = fConfigScroll->ChildAt( 0 );
-
+
/* Get the available BRect for display */
BRect display = fConfigScroll->Bounds();
display.right -= B_V_SCROLL_BAR_WIDTH;
-
+
/* Fix the scrollbar */
BScrollBar * scrollBar;
long max;
{
item = (StringItemWithView*) fOutline->ItemAt( i );
view = item->fConfigView;
-
+
if( !view )
- /* This must be the "Modules" item */
+ /* This is a category */
continue;
for( int j = 0; j < view->CountChildren(); j++ )
Hide();
Quit();
}
+
+/*****************************************************************************
+ * PreferencesWindow::BuildConfigView
+ *****************************************************************************/
+BView * PreferencesWindow::BuildConfigView( module_config_t ** pp_item,
+ bool stop_after_category )
+{
+ /* Build the config view for this module */
+ BRect rect = fDummyView->Bounds();
+ rect.right -= B_V_SCROLL_BAR_WIDTH;
+ BView * configView;
+ configView = new BView( rect, "config view",
+ B_FOLLOW_NONE, B_WILL_DRAW );
+ configView->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );
+
+ rect = configView->Bounds();
+ rect.InsetBy( 10, 10 );
+ rect.bottom = rect.top + TEXT_HEIGHT;
+ ConfigTextControl * textControl;
+ ConfigCheckBox * checkBox;
+ ConfigMenuField * menuField;
+ BPopUpMenu * popUp;
+
+ bool firstItem = true;
+ bool categoryHit = false;
+ do
+ {
+ switch( (*pp_item)->i_type )
+ {
+ case CONFIG_ITEM_STRING:
+ case CONFIG_ITEM_FILE:
+ case CONFIG_ITEM_MODULE:
+ case CONFIG_ITEM_DIRECTORY:
+ if( !firstItem )
+ rect.OffsetBy( 0, 25 );
+ else
+ firstItem = false;
+
+ if( (*pp_item)->ppsz_list && (*pp_item)->ppsz_list[0] )
+ {
+ popUp = new BPopUpMenu( "" );
+ menuField = new ConfigMenuField( rect, (*pp_item)->psz_text,
+ popUp, (*pp_item)->psz_name );
+ BMenuItem * menuItem;
+ for( int i = 0; (*pp_item)->ppsz_list[i]; i++ )
+ {
+ menuItem = new BMenuItem( (*pp_item)->ppsz_list[i], new BMessage() );
+ popUp->AddItem( menuItem );
+ }
+ configView->AddChild( menuField );
+ }
+ else
+ {
+ textControl = new ConfigTextControl( rect, (*pp_item)->psz_text,
+ CONFIG_ITEM_STRING, (*pp_item)->psz_name );
+ configView->AddChild( textControl );
+ }
+ break;
+
+ case CONFIG_ITEM_INTEGER:
+ if( !firstItem )
+ rect.OffsetBy( 0, 25 );
+ else
+ firstItem = false;
+
+ textControl = new ConfigTextControl( rect, (*pp_item)->psz_text,
+ CONFIG_ITEM_INTEGER, (*pp_item)->psz_name );
+ configView->AddChild( textControl );
+ break;
+
+ case CONFIG_ITEM_FLOAT:
+ if( !firstItem )
+ rect.OffsetBy( 0, 25 );
+ else
+ firstItem = false;
+
+ textControl = new ConfigTextControl( rect, (*pp_item)->psz_text,
+ CONFIG_ITEM_FLOAT, (*pp_item)->psz_name );
+ configView->AddChild( textControl );
+ break;
+
+ case CONFIG_ITEM_BOOL:
+ if( !strcmp( (*pp_item)->psz_name, "advanced" ) )
+ /* Don't show this one, the interface doesn't handle it anyway */
+ break;
+
+ if( !firstItem )
+ rect.OffsetBy( 0,25 );
+ else
+ firstItem = false;
+
+ checkBox = new ConfigCheckBox( rect, (*pp_item)->psz_text,
+ (*pp_item)->psz_name );
+ configView->AddChild( checkBox );
+ break;
+
+ case CONFIG_HINT_CATEGORY:
+ if( stop_after_category )
+ categoryHit = true;
+ }
+
+ } while( !categoryHit &&
+ (*pp_item)->i_type != CONFIG_HINT_END &&
+ (*pp_item)++ );
+
+ /* Adjust the configView size */
+ rect.bottom += 10;
+ configView->ResizeTo( configView->Bounds().Width(), rect.bottom );
+
+ return configView;
+}
+