📄 iteminfo.cpp
字号:
/***************************************************************************** * iteminfo.cpp : wxWindows plugin for vlc ***************************************************************************** * Copyright (C) 2000-2004 VideoLAN * $Id: iteminfo.cpp,v 1.8 2004/01/29 17:51:08 zorglub Exp $ * * Authors: Cl閙ent Stenac <zorglub@videolan.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#include <stdlib.h> /* malloc(), free() */#include <errno.h> /* ENOMEM */#include <string.h> /* strerror() */#include <stdio.h>#include <vlc/vlc.h>#include <wx/combobox.h>#include <wx/statline.h>#include <vlc/intf.h>#include "wxwindows.h"#ifndef wxRB_SINGLE# define wxRB_SINGLE 0#endif/***************************************************************************** * Event Table. *****************************************************************************//* IDs for the controls and the menu commands */enum{ Uri_Event, 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()/***************************************************************************** * Constructor. *****************************************************************************/ItemInfoDialog::ItemInfoDialog( intf_thread_t *_p_intf, playlist_item_t *_p_item, wxWindow* _p_parent ): wxDialog( _p_parent, -1, wxU(_("Playlist item info")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE ){ /* Initializations */ p_intf = _p_intf; p_parent = _p_parent; p_item = _p_item; SetIcon( *p_intf->p_sys->p_icon ); /* Create a panel to put everything in */ wxPanel *panel = new wxPanel( this, -1 ); panel->SetAutoLayout( TRUE ); /* Create the standard info panel */ wxPanel *info_panel = InfoPanel( panel ); /* Create the group panel */ wxPanel *group_panel = GroupPanel( panel ); /* Separation */ wxStaticLine *static_line = new wxStaticLine( panel, wxID_OK ); /* Create the buttons */ wxButton *ok_button = new wxButton( panel, wxID_OK, wxU(_("OK")) ); ok_button->SetDefault(); wxButton *cancel_button = new wxButton( panel, wxID_CANCEL, wxU(_("Cancel")) ); /* Place everything in sizers */ wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL ); button_sizer->Add( ok_button, 0, wxALL, 5 ); button_sizer->Add( cancel_button, 0, wxALL, 5 ); button_sizer->Layout(); wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL ); panel_sizer->Add( info_panel, 0, wxEXPAND | wxALL, 5 ); panel_sizer->Add( group_panel, 0, wxEXPAND | wxALL, 5 ); panel_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 ); panel_sizer->Add( button_sizer, 0, wxALIGN_LEFT | wxALIGN_BOTTOM | wxALL, 5 ); panel_sizer->Layout(); panel->SetSizerAndFit( panel_sizer ); main_sizer->Add( panel, 1, wxGROW, 0 ); main_sizer->Layout(); SetSizerAndFit( main_sizer );}ItemInfoDialog::~ItemInfoDialog(){}/***************************************************************************** * Private methods. *****************************************************************************/wxPanel *ItemInfoDialog::InfoPanel( wxWindow* parent ){ wxPanel *info_panel = new wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize ); info_panel->SetAutoLayout( TRUE ); wxBoxSizer *info_sizer = new wxBoxSizer( wxHORIZONTAL ); /* Create a box to surround the controls */ wxStaticBox *panel_box = new wxStaticBox( info_panel, -1, wxU(_("Item Info")) ); wxStaticBoxSizer *box_sizer = new wxStaticBoxSizer( panel_box, wxVERTICAL ); /* URI Textbox */ wxStaticText *uri_label = new wxStaticText( info_panel, -1, wxU(_("URI")) ); uri_text = new wxTextCtrl( info_panel, Uri_Event, wxU(p_item->psz_uri), wxDefaultPosition, wxSize( 300, -1 ), wxTE_PROCESS_ENTER); wxBoxSizer *uri_sizer = new wxBoxSizer( wxHORIZONTAL ); uri_sizer->Add( uri_label, 0 , wxALIGN_RIGHT |wxALL , 5 ); uri_sizer->Add( uri_text, 1 , wxALIGN_RIGHT | wxALL , 5 ); uri_sizer->Layout(); box_sizer->Add( uri_sizer, 1, wxEXPAND , 5); /* Name Textbox */ wxStaticText *name_label = new wxStaticText( info_panel, -1, wxU(_("Name")) ); name_text = new wxTextCtrl( info_panel, Uri_Event, wxU(p_item->psz_name), wxDefaultPosition, wxSize( 300, -1 ), wxTE_PROCESS_ENTER); wxBoxSizer *name_sizer = new wxBoxSizer( wxHORIZONTAL ); name_sizer->Add( name_label, 0 , wxALIGN_RIGHT |wxALL , 5 ); name_sizer->Add( name_text, 1 , wxALIGN_RIGHT | wxALL , 5 ); name_sizer->Layout(); box_sizer->Add( name_sizer, 1 , wxEXPAND, 5 ); /* Author Textbox */ wxStaticText *author_label = new wxStaticText( info_panel, -1, wxU(_("Author")) ); author_text = new wxTextCtrl( info_panel, Uri_Event, wxU( playlist_ItemGetInfo( p_item, _("General"), _("Author") ) ), wxDefaultPosition, wxSize( 300, -1 ), wxTE_PROCESS_ENTER); wxBoxSizer *author_sizer = new wxBoxSizer( wxHORIZONTAL ); author_sizer->Add( author_label, 0 , wxALIGN_RIGHT | wxALL , 5 ); author_sizer->Add( author_text, 1 , wxALIGN_RIGHT | wxALL , 5); author_sizer->Layout(); box_sizer->Add( author_sizer, 1, wxEXPAND, 5 ); /* Treeview */ info_tree = new wxTreeCtrl( info_panel, -1, wxDefaultPosition, wxSize(220,200), wxSUNKEN_BORDER |wxTR_HAS_BUTTONS | wxTR_HIDE_ROOT ); box_sizer->Add( info_tree, 0, wxEXPAND, 5 ); info_sizer->Add( box_sizer, 1, wxBOTTOM, 5 ); info_panel->SetSizer( info_sizer ); info_sizer->Layout(); info_sizer->SetSizeHints( info_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")) ); enabled_checkbox->SetValue( p_item->b_enabled); wxStaticText *group_label = new wxStaticText( group_subpanel, -1, wxU(_("Group")) ); 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 ) ); } 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 ); 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, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5 ); panel->SetSizerAndFit( panel_sizer ); /* Update panel */ return panel;}void ItemInfoDialog::UpdateInfo(){ if( !info_root ) { info_root = info_tree->AddRoot( wxU( p_item->psz_name) ); } /* Rebuild the tree */ for( int i = 0; i< p_item->i_categories ; i++) { if( !strcmp( p_item->pp_categories[i]->psz_name, _("Options") ) ) { continue; } wxTreeItemId cat = info_tree->AppendItem( info_root, wxU( p_item->pp_categories[i]->psz_name) ); for( int j = 0 ; j < p_item->pp_categories[i]->i_infos ; j++ ) { info_tree->AppendItem( cat , (wxString) wxU(p_item->pp_categories[i]->pp_infos[j]->psz_name) + wxT(": ") + wxU(p_item->pp_categories[i]->pp_infos[j]->psz_value) ); } }}/***************************************************************************** * Events methods. *****************************************************************************/void ItemInfoDialog::OnOk( wxCommandEvent& WXUNUSED(event) ){ vlc_mutex_lock( &p_item->lock ); p_item->psz_name = strdup( name_text->GetLineText(0).mb_str() ); p_item->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 = (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist != NULL ) { if( b_old_enabled == VLC_FALSE && enabled_checkbox->IsChecked() ) p_playlist->i_enabled ++; 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 ; vlc_mutex_unlock( &p_item->lock ); EndModal( wxID_OK );}void ItemInfoDialog::OnCancel( wxCommandEvent& WXUNUSED(event) ){ EndModal( wxID_CANCEL );}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 ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -