bookmarks.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:8k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * bookmarks.cpp : Bookmarks
  3.  ****************************************************************************
  4.  * Copyright (C) 2007-2008 the VideoLAN team
  5.  *
  6.  * Authors: Antoine Lejeune <phytos@via.ecp.fr>
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  21.  *****************************************************************************/
  22. #ifdef HAVE_CONFIG_H
  23. # include "config.h"
  24. #endif
  25. #include "dialogs/bookmarks.hpp"
  26. #include "input_manager.hpp"
  27. #include <QGridLayout>
  28. #include <QSpacerItem>
  29. #include <QPushButton>
  30. BookmarksDialog *BookmarksDialog::instance = NULL;
  31. BookmarksDialog::BookmarksDialog( intf_thread_t *_p_intf ):QVLCFrame( _p_intf )
  32. {
  33.     setWindowFlags( Qt::Tool );
  34.     setWindowOpacity( config_GetFloat( p_intf, "qt-opacity" ) );
  35.     setWindowTitle( qtr( "Edit Bookmarks" ) );
  36.     QGridLayout *layout = new QGridLayout( this );
  37.     QPushButton *addButton = new QPushButton( qtr( "Create" ) );
  38.     addButton->setToolTip( qtr( "Create a new bookmark" ) );
  39.     QPushButton *delButton = new QPushButton( qtr( "Delete" ) );
  40.     delButton->setToolTip( qtr( "Delete the selected item" ) );
  41.     QPushButton *clearButton = new QPushButton( qtr( "Clear" ) );
  42.     clearButton->setToolTip( qtr( "Delete all the bookmarks" ) );
  43. #if 0
  44.     QPushButton *extractButton = new QPushButton( qtr( "Extract" ) );
  45.     extractButton->setToolTip( qtr() );
  46. #endif
  47.     QPushButton *closeButton = new QPushButton( qtr( "&Close" ) );
  48.     bookmarksList = new QTreeWidget( this );
  49.     bookmarksList->setRootIsDecorated( false );
  50.     bookmarksList->setAlternatingRowColors( true );
  51.     bookmarksList->setSelectionMode( QAbstractItemView::ExtendedSelection );
  52.     bookmarksList->setSelectionBehavior( QAbstractItemView::SelectRows );
  53.     bookmarksList->setEditTriggers( QAbstractItemView::SelectedClicked );
  54.     bookmarksList->setColumnCount( 3 );
  55.     bookmarksList->resize( sizeHint() );
  56.     QStringList headerLabels;
  57.     headerLabels << qtr( "Description" );
  58.     headerLabels << qtr( "Bytes" );
  59.     headerLabels << qtr( "Time" );
  60.     bookmarksList->setHeaderLabels( headerLabels );
  61.     layout->addWidget( addButton, 0, 0 );
  62.     layout->addWidget( delButton, 1, 0 );
  63.     layout->addWidget( clearButton, 2, 0 );
  64.     layout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding ), 4, 0 );
  65. #if 0
  66.     layout->addWidget( extractButton, 5, 0 );
  67. #endif
  68.     layout->addWidget( bookmarksList, 0, 1, 6, 2);
  69.     layout->setColumnStretch( 1, 1 );
  70.     layout->addWidget( closeButton, 7, 2 );
  71.     CONNECT( THEMIM->getIM(), bookmarksChanged(),
  72.              this, update() );
  73.     CONNECT( bookmarksList, activated( QModelIndex ), this,
  74.              activateItem( QModelIndex ) );
  75.     CONNECT( bookmarksList, itemChanged( QTreeWidgetItem*, int ),
  76.              this, edit( QTreeWidgetItem*, int ) );
  77.     BUTTONACT( addButton, add() );
  78.     BUTTONACT( delButton, del() );
  79.     BUTTONACT( clearButton, clear() );
  80. #if 0
  81.     BUTTONACT( extractButton, extract() );
  82. #endif
  83.     BUTTONACT( closeButton, close() );
  84.     readSettings( "Bookmarks", QSize( 435, 280 ) );
  85.     updateGeometry();
  86. }
  87. BookmarksDialog::~BookmarksDialog()
  88. {
  89.     writeSettings( "Bookmarks" );
  90. }
  91. void BookmarksDialog::update()
  92. {
  93.     input_thread_t *p_input = THEMIM->getInput();
  94.     if( !p_input ) return;
  95.     seekpoint_t **pp_bookmarks;
  96.     int i_bookmarks;
  97.     if( bookmarksList->topLevelItemCount() > 0 )
  98.     {
  99.         bookmarksList->model()->removeRows( 0, bookmarksList->topLevelItemCount() );
  100.     }
  101.     if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks,
  102.                        &i_bookmarks ) != VLC_SUCCESS )
  103.         return;
  104.     for( int i = 0; i < i_bookmarks; i++ )
  105.     {
  106.         // List with the differents elements of the row
  107.         QStringList row;
  108.         row << QString( qfu( pp_bookmarks[i]->psz_name ) );
  109.         row << QString::number( pp_bookmarks[i]->i_byte_offset );
  110.         int total = pp_bookmarks[i]->i_time_offset/ 1000000;
  111.         int hour = total / (60*60);
  112.         int min = (total - hour*60*60) / 60;
  113.         int sec = total - hour*60*60 - min*60;
  114.         QString str;
  115.         row << str.sprintf("%02d:%02d:%02d", hour, min, sec );
  116.         QTreeWidgetItem *item = new QTreeWidgetItem( bookmarksList, row );
  117.         item->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEditable |
  118.                         Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
  119.         bookmarksList->insertTopLevelItem( i, item );
  120.         vlc_seekpoint_Delete( pp_bookmarks[i] );
  121.     }
  122.     free( pp_bookmarks );
  123. }
  124. void BookmarksDialog::add()
  125. {
  126.     input_thread_t *p_input = THEMIM->getInput();
  127.     if( !p_input ) return;
  128.     seekpoint_t bookmark;
  129.     if( !input_Control( p_input, INPUT_GET_BOOKMARK, &bookmark ) )
  130.     {
  131.         bookmark.psz_name = const_cast<char *>qtu( THEMIM->getIM()->getName() +
  132.                    QString::number( bookmarksList->topLevelItemCount() ) );
  133.         input_Control( p_input, INPUT_ADD_BOOKMARK, &bookmark );
  134.     }
  135. }
  136. void BookmarksDialog::del()
  137. {
  138.     input_thread_t *p_input = THEMIM->getInput();
  139.     if( !p_input ) return;
  140.     int i_focused = bookmarksList->currentIndex().row();
  141.     if( i_focused >= 0 )
  142.     {
  143.         input_Control( p_input, INPUT_DEL_BOOKMARK, i_focused );
  144.     }
  145. }
  146. void BookmarksDialog::clear()
  147. {
  148.     input_thread_t *p_input = THEMIM->getInput();
  149.     if( !p_input ) return;
  150.     input_Control( p_input, INPUT_CLEAR_BOOKMARKS );
  151. }
  152. void BookmarksDialog::edit( QTreeWidgetItem *item, int column )
  153. {
  154.     QStringList fields;
  155.     // We can only edit a item if it is the last item selected
  156.     if( bookmarksList->selectedItems().isEmpty() ||
  157.         bookmarksList->selectedItems().last() != item )
  158.         return;
  159.     input_thread_t *p_input = THEMIM->getInput();
  160.     if( !p_input )
  161.         return;
  162.     // We get the row number of the item
  163.     int i_edit = bookmarksList->indexOfTopLevelItem( item );
  164.     // We get the bookmarks list
  165.     seekpoint_t** pp_bookmarks;
  166.     seekpoint_t*  p_seekpoint = NULL;
  167.     int i_bookmarks;
  168.     if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks,
  169.                        &i_bookmarks ) != VLC_SUCCESS )
  170.         return;
  171.     if( i_edit >= i_bookmarks )
  172.         goto clear;
  173.     // We modify the seekpoint
  174.     p_seekpoint = pp_bookmarks[i_edit];
  175.     if( column == 0 )
  176.     {
  177.         free( p_seekpoint->psz_name );
  178.         p_seekpoint->psz_name = strdup( qtu( item->text( column ) ) );
  179.     }
  180.     else if( column == 1 )
  181.         p_seekpoint->i_byte_offset = atoi( qtu( item->text( column ) ) );
  182.     else if( column == 2 )
  183.     {
  184.         fields = item->text( column ).split( ":", QString::SkipEmptyParts );
  185.         if( fields.size() == 1 )
  186.             p_seekpoint->i_time_offset = 1000000 * ( fields[0].toInt() );
  187.         else if( fields.size() == 2 )
  188.             p_seekpoint->i_time_offset = 1000000 * ( fields[0].toInt() * 60 + fields[1].toInt() );
  189.         else if( fields.size() == 3 )
  190.             p_seekpoint->i_time_offset = 1000000 * ( fields[0].toInt() * 3600 + fields[1].toInt() * 60 + fields[2].toInt() );
  191.         else
  192.         {
  193.             msg_Err( p_intf, "Invalid string format for time" );
  194.             goto clear;
  195.         }
  196.     }
  197.     // Send the modification
  198.     input_Control( p_input, INPUT_CHANGE_BOOKMARK, p_seekpoint, i_edit );
  199. clear:
  200.     // Clear the bookmark list
  201.     for( int i = 0; i < i_bookmarks; i++)
  202.         vlc_seekpoint_Delete( pp_bookmarks[i] );
  203.     free( pp_bookmarks );
  204. }
  205. void BookmarksDialog::extract()
  206. {
  207.     // TODO
  208. }
  209. void BookmarksDialog::activateItem( QModelIndex index )
  210. {
  211.     input_thread_t *p_input = THEMIM->getInput();
  212.     if( !p_input ) return;
  213.     input_Control( p_input, INPUT_SET_BOOKMARK, index.row() );
  214. }