Commit f08d346e authored by Clément Stenac's avatar Clément Stenac

Handle all types of buttons and fix layouts

parent a483f98c
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
#include <wx/statline.h> #include <wx/statline.h>
#define FREE( i ) { if( i ) free( i ); i = NULL; }
/***************************************************************************** /*****************************************************************************
* Event Table. * Event Table.
*****************************************************************************/ *****************************************************************************/
...@@ -37,7 +39,9 @@ enum ...@@ -37,7 +39,9 @@ enum
{ {
OkYes_Event, OkYes_Event,
No_Event, No_Event,
Cancel_Event Cancel_Event,
Clear_Event,
NoShow_Event
}; };
BEGIN_EVENT_TABLE( InteractionDialog, wxFrame) BEGIN_EVENT_TABLE( InteractionDialog, wxFrame)
...@@ -45,6 +49,8 @@ BEGIN_EVENT_TABLE( InteractionDialog, wxFrame) ...@@ -45,6 +49,8 @@ BEGIN_EVENT_TABLE( InteractionDialog, wxFrame)
EVT_BUTTON( OkYes_Event, InteractionDialog::OnOkYes ) EVT_BUTTON( OkYes_Event, InteractionDialog::OnOkYes )
EVT_BUTTON( Cancel_Event, InteractionDialog::OnCancel) EVT_BUTTON( Cancel_Event, InteractionDialog::OnCancel)
EVT_BUTTON( No_Event, InteractionDialog::OnNo ) EVT_BUTTON( No_Event, InteractionDialog::OnNo )
EVT_BUTTON( Clear_Event, InteractionDialog::OnClear )
EVT_CHECKBOX( NoShow_Event, InteractionDialog::OnNoShow )
END_EVENT_TABLE() END_EVENT_TABLE()
/***************************************************************************** /*****************************************************************************
...@@ -69,11 +75,12 @@ InteractionDialog::InteractionDialog( intf_thread_t *_p_intf, ...@@ -69,11 +75,12 @@ InteractionDialog::InteractionDialog( intf_thread_t *_p_intf,
buttons_panel->SetSizer( buttons_sizer ); buttons_panel->SetSizer( buttons_sizer );
main_sizer = new wxBoxSizer( wxVERTICAL ); main_sizer = new wxBoxSizer( wxVERTICAL );
main_sizer->Add( widgets_panel, 0, wxEXPAND | wxALL, 5 ); main_sizer->Add( widgets_panel, 1, wxEXPAND | wxALL, 5 );
main_sizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND ); main_sizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND );
main_sizer->Add( buttons_panel, 0, wxEXPAND | wxALL, 5 ); main_sizer->Add( buttons_panel, 0, wxEXPAND | wxALL, 5 );
SetSizer( main_sizer ); SetSizer( main_sizer );
b_noshow = false;
Render(); Render();
} }
...@@ -84,10 +91,15 @@ InteractionDialog::~InteractionDialog() ...@@ -84,10 +91,15 @@ InteractionDialog::~InteractionDialog()
void InteractionDialog::Update( ) void InteractionDialog::Update( )
{ {
widgets_panel->DestroyChildren(); widgets_panel->DestroyChildren();
/* FIXME: Needed for the spacer */
buttons_sizer->Remove( 1 );buttons_sizer->Remove( 2 );buttons_sizer->Remove( 3 );
buttons_panel->DestroyChildren(); buttons_panel->DestroyChildren();
input_widgets.clear(); input_widgets.clear();
Render(); Render();
Show(); if( b_noshow == false )
{
Show();
}
} }
/// \todo Dirty - Clean that up /// \todo Dirty - Clean that up
...@@ -96,36 +108,52 @@ void InteractionDialog::Render() ...@@ -96,36 +108,52 @@ void InteractionDialog::Render()
wxStaticText *label; wxStaticText *label;
wxTextCtrl *input; wxTextCtrl *input;
//-------------- Widgets ------------------
for( int i = 0 ; i< p_dialog->i_widgets; i++ ) if( p_dialog->i_id == DIALOG_ERRORS )
{ {
user_widget_t* p_widget = p_dialog->pp_widgets[i]; wxTextCtrl *errors ; // Special case
/// \todo Merge cleanly with preferences widgets label = new wxStaticText( widgets_panel, -1,
switch( p_widget->i_type ) wxU( _("The following errors happened. More details might be available "
"in the log file.") ) );
errors = new wxTextCtrl( widgets_panel, -1, wxT(""),
wxDefaultPosition, wxDefaultSize,
wxTE_MULTILINE | wxTE_READONLY );
for( int i = 0 ; i< p_dialog->i_widgets; i++ )
{ {
case WIDGET_TEXT: (*errors) << wxL2U( p_dialog->pp_widgets[i]->psz_text ) << wxU( "\n" ) ;
label = new wxStaticText( widgets_panel, -1, }
wxU( p_widget->psz_text ) ); widgets_sizer->Add( label );
widgets_sizer->Add( label ); widgets_sizer->Add( errors, 0, wxEXPAND|wxALL, 3 );
break; }
case WIDGET_INPUT_TEXT: else
label = new wxStaticText( widgets_panel, -1, {
wxU( p_widget->psz_text ) ); //-------------- Widgets ------------------
input = new wxTextCtrl( widgets_panel, -1 ); for( int i = 0 ; i< p_dialog->i_widgets; i++ )
widgets_sizer->Add( label ); {
widgets_sizer->Add( input ); user_widget_t* p_widget = p_dialog->pp_widgets[i];
/// \todo Merge cleanly with preferences widgets
InputWidget widget; switch( p_widget->i_type )
widget.control = input; {
widget.val = &p_widget->val; case WIDGET_TEXT:
widget.i_type = WIDGET_INPUT_TEXT; label = new wxStaticText( widgets_panel, -1,
input_widgets.push_back( widget ); wxU( p_widget->psz_text ) );
widgets_sizer->Add( label );
break;
case WIDGET_INPUT_TEXT:
label = new wxStaticText( widgets_panel, -1,
wxU( p_widget->psz_text ) );
input = new wxTextCtrl( widgets_panel, -1 );
widgets_sizer->Add( label , 0, 0, 0);
widgets_sizer->Add( input, 0, wxEXPAND , 0 );
InputWidget widget;
widget.control = input;
widget.val = &p_widget->val;
widget.i_type = WIDGET_INPUT_TEXT;
input_widgets.push_back( widget );
}
} }
} }
widgets_sizer->Layout();
widgets_panel->SetSizerAndFit( widgets_sizer );
main_sizer->Layout();
SetSizerAndFit( main_sizer );
//-------------- Buttons ------------------ //-------------- Buttons ------------------
if( p_dialog->i_flags & DIALOG_OK_CANCEL ) if( p_dialog->i_flags & DIALOG_OK_CANCEL )
...@@ -134,10 +162,39 @@ void InteractionDialog::Render() ...@@ -134,10 +162,39 @@ void InteractionDialog::Render()
OkYes_Event, wxU( _("OK") ) ); OkYes_Event, wxU( _("OK") ) );
wxButton *cancel = new wxButton( buttons_panel, wxButton *cancel = new wxButton( buttons_panel,
Cancel_Event, wxU( _("Cancel") ) ); Cancel_Event, wxU( _("Cancel") ) );
buttons_sizer->Add( ok, 0, wxEXPAND | wxRIGHT| wxLEFT, 5 ); buttons_sizer->Add( ok, 0, wxEXPAND | wxRIGHT| wxLEFT | wxALIGN_CENTER, 5 );
buttons_sizer->Add( cancel, 0, wxEXPAND | wxRIGHT| wxLEFT, 5 ); buttons_sizer->Add( cancel, 0, wxEXPAND | wxRIGHT| wxLEFT | wxALIGN_CENTER, 5 );
}
else if( p_dialog->i_flags & DIALOG_YES_NO_CANCEL )
{
wxButton *yes = new wxButton( buttons_panel,
OkYes_Event, wxU( _("Yes") ) );
wxButton *no = new wxButton( buttons_panel,
No_Event, wxU( _("No") ) );
wxButton *cancel = new wxButton( buttons_panel,
Cancel_Event, wxU( _("Cancel") ) );
buttons_sizer->Add( yes, 0, wxEXPAND | wxRIGHT| wxLEFT | wxALIGN_CENTER, 5 );
buttons_sizer->Add( no, 0, wxEXPAND | wxRIGHT| wxLEFT | wxALIGN_CENTER, 5 );
buttons_sizer->Add( cancel, 0, wxEXPAND | wxRIGHT| wxLEFT | wxALIGN_CENTER, 5 );
} }
else if( p_dialog->i_flags & DIALOG_CLEAR_NOSHOW )
{
wxCheckBox *noshow = new wxCheckBox( buttons_panel,
NoShow_Event, wxU( _("Don't show") ) );
noshow->SetValue( b_noshow );
wxButton *clear = new wxButton( buttons_panel,
Clear_Event, wxU( _("Clear") ) );
buttons_sizer->Add( noshow, 0, wxEXPAND | wxRIGHT| wxLEFT | wxALIGN_LEFT, 5 );
buttons_sizer->Add( 0, 0, 1 );
buttons_sizer->Add( clear , 0, wxEXPAND | wxRIGHT| wxLEFT | wxALIGN_RIGHT, 5 );
}
widgets_sizer->Layout();
widgets_panel->SetSizerAndFit( widgets_sizer );
buttons_sizer->Layout();
buttons_panel->SetSizerAndFit( buttons_sizer );
main_sizer->Layout();
SetSizerAndFit( main_sizer );
} }
/***************************************************************************** /*****************************************************************************
...@@ -163,8 +220,35 @@ void InteractionDialog::OnOkYes( wxCommandEvent& event ) ...@@ -163,8 +220,35 @@ void InteractionDialog::OnOkYes( wxCommandEvent& event )
Finish( DIALOG_OK_YES ); Finish( DIALOG_OK_YES );
} }
void InteractionDialog::OnClear( wxCommandEvent& event )
{
int i;
vlc_mutex_lock( &p_dialog->p_interaction->object_lock );
for( i = p_dialog->i_widgets - 1 ; i >= 0 ; i-- )
{
user_widget_t *p_widget = p_dialog->pp_widgets[i];
FREE( p_widget->psz_text );
FREE( p_widget->val.psz_string );
REMOVE_ELEM( p_dialog->pp_widgets, p_dialog->i_widgets, i );
free( p_widget );
}
widgets_panel->DestroyChildren();
/* FIXME: Needed for the spacer */
buttons_sizer->Remove( 1 );buttons_sizer->Remove( 2 );buttons_sizer->Remove( 3 );
buttons_panel->DestroyChildren();
input_widgets.clear();
vlc_mutex_unlock( &p_dialog->p_interaction->object_lock );
Render();
}
void InteractionDialog::OnNoShow( wxCommandEvent& event )
{
b_noshow = event.IsChecked();
}
void InteractionDialog::Finish( int i_ret ) void InteractionDialog::Finish( int i_ret )
{ {
vlc_mutex_lock( &p_dialog->p_interaction->object_lock );
vector<InputWidget>::iterator it = input_widgets.begin(); vector<InputWidget>::iterator it = input_widgets.begin();
while ( it < input_widgets.end() ) while ( it < input_widgets.end() )
{ {
...@@ -173,8 +257,9 @@ void InteractionDialog::Finish( int i_ret ) ...@@ -173,8 +257,9 @@ void InteractionDialog::Finish( int i_ret )
it++; it++;
} }
Hide(); Hide();
vlc_mutex_lock( &p_dialog->p_interaction->object_lock );
p_dialog->i_status = ANSWERED_DIALOG; p_dialog->i_status = ANSWERED_DIALOG;
p_dialog->i_return = i_ret; p_dialog->i_return = i_ret;
vlc_mutex_unlock( &p_dialog->p_interaction->object_lock ); vlc_mutex_unlock( &p_dialog->p_interaction->object_lock );
} }
#undef FREE
...@@ -57,6 +57,8 @@ namespace wxvlc ...@@ -57,6 +57,8 @@ namespace wxvlc
void OnOkYes ( wxCommandEvent& event ); void OnOkYes ( wxCommandEvent& event );
void OnCancel( wxCommandEvent& event ); void OnCancel( wxCommandEvent& event );
void OnNo ( wxCommandEvent& event ); void OnNo ( wxCommandEvent& event );
void OnClear ( wxCommandEvent& event );
void OnNoShow( wxCommandEvent& event );
void Render(); void Render();
void Finish( int ); void Finish( int );
...@@ -75,6 +77,8 @@ namespace wxvlc ...@@ -75,6 +77,8 @@ namespace wxvlc
intf_thread_t *p_intf; intf_thread_t *p_intf;
interaction_dialog_t *p_dialog; interaction_dialog_t *p_dialog;
wxWindow *p_parent; wxWindow *p_parent;
bool b_noshow;
}; };
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment