]> git.sesse.net Git - vlc/blobdiff - modules/gui/wxwindows/iteminfo.cpp
* modules/video_output/x11/*:
[vlc] / modules / gui / wxwindows / iteminfo.cpp
index 17f33cfac06dc09554020a090ed37174b598f112..1d97d9dbf80166e9494ef4d43ccc7f5524ca12d1 100644 (file)
@@ -1,8 +1,8 @@
 /*****************************************************************************
  * iteminfo.cpp : wxWindows plugin for vlc
  *****************************************************************************
- * Copyright (C) 2000-2001 VideoLAN
- * $Id: iteminfo.cpp,v 1.1 2003/10/06 16:23:30 zorglub Exp $
+ * Copyright (C) 2000-2004 VideoLAN
+ * $Id$
  *
  * Authors: ClĂ©ment Stenac <zorglub@videolan.org>
  *
 
 #include <vlc/vlc.h>
 
-#ifdef WIN32                                                 /* mingw32 hack */
-#undef Yield
-#undef CreateDialog
-#endif
-
-/* Let vlc take care of the i18n stuff */
-#define WXINTL_NO_GETTEXT_MACRO
-
-#include <wx/wxprec.h>
-#include <wx/wx.h>
-#include <wx/notebook.h>
-#include <wx/textctrl.h>
 #include <wx/combobox.h>
-#include <wx/spinctrl.h>
 #include <wx/statline.h>
 
 #include <vlc/intf.h>
@@ -66,14 +53,15 @@ enum
     Name_Event,
     Author_Event,
     Enabled_Event,
+    New_Event,
 };
 
 BEGIN_EVENT_TABLE(ItemInfoDialog, wxDialog)
     /* Button events */
     EVT_BUTTON(wxID_OK, ItemInfoDialog::OnOk)
     EVT_BUTTON(wxID_CANCEL, ItemInfoDialog::OnCancel)
-
     /* Events generated by the panels */
+    EVT_BUTTON( New_Event, ItemInfoDialog::OnNewGroup)
 
 END_EVENT_TABLE()
 
@@ -83,7 +71,7 @@ END_EVENT_TABLE()
 ItemInfoDialog::ItemInfoDialog( intf_thread_t *_p_intf,
                                 playlist_item_t *_p_item,
                                 wxWindow* _p_parent ):
-    wxDialog( _p_parent, -1, wxU(_("Playlist Item options")),
+    wxDialog( _p_parent, -1, wxU(_("Playlist item info")),
              wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE )
 {
     /* Initializations */
@@ -139,115 +127,136 @@ ItemInfoDialog::~ItemInfoDialog()
  *****************************************************************************/
 wxPanel *ItemInfoDialog::InfoPanel( wxWindow* parent )
 {
-    wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
+    wxPanel *info_panel = new wxPanel( parent, -1, wxDefaultPosition,
                                   wxDefaultSize );
+    info_panel->SetAutoLayout( TRUE );
+    wxBoxSizer *info_sizer = new wxBoxSizer( wxHORIZONTAL );
 
-    wxStaticBox *panel_box = new wxStaticBox( panel, -1,
-                                   wxU(_("Item informations")) );
-    wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
-                                                          wxVERTICAL );
-
-    info_subpanel = new wxPanel( panel, -1 );
+    /* Create a box to surround the controls */
+    wxStaticBox *panel_box = new wxStaticBox( info_panel, -1,
+                                   wxU(_("Item Info")) );
 
-    wxFlexGridSizer *subpanel_sizer =
-                    new wxFlexGridSizer( 3, 1 , 0 , 0 );
+    wxStaticBoxSizer *box_sizer = new wxStaticBoxSizer( panel_box,
+                                                          wxVERTICAL );
 
+    wxFlexGridSizer *sizer = new wxFlexGridSizer(2,3,20);
     /* URI Textbox */
     wxStaticText *uri_label =
-           new wxStaticText(info_subpanel, -1, wxU(_("URI")) );
+           new wxStaticText( info_panel, -1, wxU(_("URI")) );
 
-    uri_text =  new wxTextCtrl( info_subpanel, Uri_Event,
-                                wxT(p_item->psz_uri),
-                                wxDefaultPosition, wxSize( 300, -1 ),
-                                wxTE_PROCESS_ENTER);
-
-    subpanel_sizer->Add( uri_label, 0, wxALIGN_LEFT |
-                         wxALIGN_CENTER_VERTICAL );
-    subpanel_sizer->Add( uri_text, 0, wxALIGN_RIGHT |
-                         wxALIGN_CENTER_VERTICAL );
+    uri_text = new wxTextCtrl( info_panel, Uri_Event,
+        wxU(p_item->input.psz_uri), wxDefaultPosition, wxSize( 300, -1 ),
+        wxTE_PROCESS_ENTER );
 
+    sizer->Add( uri_label, 0 , wxALIGN_LEFT |wxALL , 5 );
+    sizer->Add( uri_text, 1 , wxALIGN_RIGHT | wxALL , 5 );
 
     /* Name Textbox */
     wxStaticText *name_label =
-           new wxStaticText(info_subpanel, -1, wxU(_("Name")) );
+           new wxStaticText(  info_panel, -1, wxU(_("Name")) );
 
-    name_text =
-                   new wxTextCtrl( info_subpanel, Uri_Event,
-                                   wxT(p_item->psz_name),
-                                   wxDefaultPosition, wxSize( 300, -1 ),
-                                   wxTE_PROCESS_ENTER);
+    name_text = new wxTextCtrl( info_panel, Uri_Event,
+        wxU(p_item->input.psz_name), wxDefaultPosition, wxSize( 300, -1 ),
+        wxTE_PROCESS_ENTER );
 
-    subpanel_sizer->Add( name_label, 0, wxALIGN_LEFT |
-                         wxALIGN_CENTER_VERTICAL );
-    subpanel_sizer->Add( name_text, 0, wxALIGN_RIGHT |
-                         wxALIGN_CENTER_VERTICAL );
+    sizer->Add( name_label, 0 , wxALIGN_LEFT |wxALL , 5  );
+    sizer->Add( name_text, 1 , wxALIGN_RIGHT | wxALL , 5 );
 
     /* Author Textbox */
     wxStaticText *author_label =
-           new wxStaticText(info_subpanel, -1, wxU(_("Author")) );
+           new wxStaticText( info_panel, -1, wxU(_("Author")) );
 
-    author_text =
-                   new wxTextCtrl( info_subpanel, Uri_Event,
-                                   wxT(p_item->psz_author),
+    author_text = new wxTextCtrl( info_panel, Uri_Event,
+                                   wxU( playlist_ItemGetInfo( p_item,
+                                          _("General"), _("Author") ) ),
                                    wxDefaultPosition, wxSize( 300, -1 ),
                                    wxTE_PROCESS_ENTER);
 
-    subpanel_sizer->Add( author_label, 0, wxALIGN_LEFT |
-                         wxALIGN_CENTER_VERTICAL );
-    subpanel_sizer->Add( author_text, 0, wxALIGN_RIGHT |
-                         wxALIGN_CENTER_VERTICAL );
+    sizer->Add( author_label, 0 , wxALIGN_LEFT | wxALL , 5 );
+    sizer->Add( author_text, 1 , wxALIGN_RIGHT | wxALL , 5);
 
-    info_subpanel->SetSizerAndFit( subpanel_sizer );
+    /* Treeview */
+    info_tree = new wxTreeCtrl( info_panel, -1, wxDefaultPosition,
+                                wxSize(220,200),
+                                wxSUNKEN_BORDER |wxTR_HAS_BUTTONS |
+                                wxTR_HIDE_ROOT );
 
-    /* Stuff everything into the main panel */
-    panel_sizer->Add( info_subpanel, 1,
-                      wxEXPAND | wxALIGN_LEFT |
-                      wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+    sizer->Layout();
+    box_sizer->Add( sizer, 0, wxEXPAND, 5 );
+    box_sizer->Add( info_tree, 0, wxEXPAND, 5 );
+    info_sizer->Add( box_sizer, 1, wxBOTTOM, 5 );
 
-    panel->SetSizerAndFit( panel_sizer );
+    info_panel->SetSizer( info_sizer );
+    info_sizer->Layout();
+    info_sizer->SetSizeHints( info_panel );
 
-    return panel;
+    UpdateInfo();
+
+    return info_panel;
 }
 
 wxPanel *ItemInfoDialog::GroupPanel( wxWindow* parent )
 {
     wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
                                   wxDefaultSize );
-
     wxStaticBox *panel_box = new wxStaticBox( panel, -1,
                                    wxU(_("Group Info")) );
-
     wxStaticBoxSizer *panel_sizer = new wxStaticBoxSizer( panel_box,
                                                          wxVERTICAL);
-
     wxBoxSizer *subpanel_sizer;
-
     group_subpanel = new wxPanel( panel, -1 );
-
     subpanel_sizer = new wxBoxSizer( wxVERTICAL) ;
-
     enabled_checkbox = new wxCheckBox( group_subpanel,
-                                     -1,
-                                     wxU(_("Item enabled")) );
+                                     -1, wxU(_("Item Enabled")) );
 
     enabled_checkbox->SetValue( p_item->b_enabled);
 
     wxStaticText *group_label = new wxStaticText( group_subpanel,
                                         -1, wxU(_("Group")) );
-    group_spin = new wxSpinCtrl( group_subpanel,
-                                             -1 );
-    group_spin->SetValue( p_item->i_group > 0 ? p_item->i_group : 0);
+
+    playlist_t *p_playlist =
+                (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
+                                       FIND_ANYWHERE );
+    if( p_playlist == NULL )
+    {
+        return NULL;
+    }
+
+    group_combo = new wxComboBox( group_subpanel, -1,
+                                 wxT(""),wxDefaultPosition, wxDefaultSize,
+                                 0, NULL, wxCB_READONLY );
+
+    wxButton *newgroup_button = new wxButton( group_subpanel, New_Event,
+                                    wxU(_("New Group")));
+
+    for( int i=0; i< p_playlist->i_groups ; i++)
+    {
+        group_combo->Append( wxU( p_playlist->pp_groups[i]->psz_name ) );
+        if( p_playlist->pp_groups[i]->i_id == p_item->i_group )
+        {
+            group_combo->SetSelection( i );
+            group_combo->SetValue( wxU( p_playlist->pp_groups[i]->psz_name ) );
+        }
+    }
+
+    vlc_object_release ( p_playlist );
 
     subpanel_sizer->Add( enabled_checkbox, 0, wxALIGN_RIGHT|
                          wxALIGN_CENTER_VERTICAL );
     subpanel_sizer->Add( group_label, 0, wxALIGN_LEFT |
                          wxALIGN_CENTER_VERTICAL );
-    subpanel_sizer->Add( group_spin, 0, wxALIGN_RIGHT );
+
+    wxBoxSizer *group_sizer = new wxBoxSizer( wxHORIZONTAL);
+    group_sizer->Add(group_combo, 0, wxALIGN_LEFT|wxRIGHT, 5);
+    group_sizer->Add( newgroup_button, 0, wxALIGN_RIGHT|wxLEFT, 5);
+    group_sizer->Layout();
+
+    subpanel_sizer->Add( group_sizer, 0, wxALIGN_RIGHT );
 
     group_subpanel->SetSizerAndFit( subpanel_sizer );
 
     /* Stuff everything into the main panel */
-     panel_sizer->Add( group_subpanel, 0,
+    panel_sizer->Add( group_subpanel, 0,
                       wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 );
 
     panel->SetSizerAndFit( panel_sizer );
@@ -256,14 +265,45 @@ wxPanel *ItemInfoDialog::GroupPanel( wxWindow* parent )
     return panel;
 }
 
+void ItemInfoDialog::UpdateInfo()
+{
+    if( !info_root )
+    {
+       info_root = info_tree->AddRoot( wxU( p_item->input.psz_name) );
+    }
+
+    /* Rebuild the tree */
+    for( int i = 0; i< p_item->input.i_categories ; i++)
+    {
+        if( !strcmp( p_item->input.pp_categories[i]->psz_name, _("Options") ) )
+        {
+            continue;
+        }
+        wxTreeItemId cat = info_tree->AppendItem( info_root,
+                            wxU( p_item->input.pp_categories[i]->psz_name) );
+
+        for( int j = 0 ; j < p_item->input.pp_categories[i]->i_infos ; j++ )
+        {
+           info_tree->AppendItem( cat , (wxString)
+               wxU(p_item->input.pp_categories[i]->pp_infos[j]->psz_name) +
+               wxT(": ") +
+               wxU(p_item->input.pp_categories[i]->pp_infos[j]->psz_value) );
+        }
+
+        info_tree->Expand( cat );
+    }
+}
+
 /*****************************************************************************
  * Events methods.
  *****************************************************************************/
 void ItemInfoDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
 {
-    p_item->psz_name = strdup( name_text->GetLineText(0) );
-    p_item->psz_uri = strdup( uri_text->GetLineText(0) );
-    p_item->psz_author = strdup( author_text->GetLineText(0) );
+    vlc_mutex_lock( &p_item->input.lock );
+    p_item->input.psz_name = strdup( name_text->GetLineText(0).mb_str() );
+    p_item->input.psz_uri = strdup( uri_text->GetLineText(0).mb_str() );
+    playlist_ItemAddInfo( p_item,"General","Author",
+                            author_text->GetLineText(0).mb_str() );
     vlc_bool_t b_old_enabled = p_item->b_enabled;
 
     playlist_t * p_playlist =
@@ -276,11 +316,21 @@ void ItemInfoDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
         else if( b_old_enabled == VLC_TRUE && !enabled_checkbox->IsChecked() )
             p_playlist->i_enabled --;
 
+        for (int i=0 ; i< p_playlist->i_groups ; i++)
+        {
+           if( !strcasecmp( p_playlist->pp_groups[i]->psz_name,
+                            group_combo->GetValue().mb_str() ))
+           {
+               p_item->i_group = p_playlist->pp_groups[i]->i_id;
+               break;
+           }
+        }
+
         vlc_object_release( p_playlist );
     }
 
     p_item->b_enabled = enabled_checkbox->IsChecked() ? VLC_TRUE : VLC_FALSE ;
-    p_item->i_group = group_spin->GetValue();
+    vlc_mutex_unlock( &p_item->input.lock );
     EndModal( wxID_OK );
 }
 
@@ -289,6 +339,18 @@ void ItemInfoDialog::OnCancel( wxCommandEvent& WXUNUSED(event) )
     EndModal( wxID_CANCEL );
 }
 
-/******************************************************************************
- * Info panel event methods.
- ******************************************************************************/
+void ItemInfoDialog::OnNewGroup( wxCommandEvent& WXUNUSED(event) )
+{
+    NewGroup *p_newgroup = NULL;
+
+    p_newgroup = new NewGroup( p_intf, this );
+
+    if( p_newgroup)
+    {
+        if( p_newgroup->ShowModal() == wxID_OK && p_newgroup->psz_name)
+        {
+            group_combo->Append( wxU( p_newgroup->psz_name ) );
+        }
+        delete( p_newgroup );
+    }
+}