Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
4ed4e121
Commit
4ed4e121
authored
Nov 07, 2009
by
Jakob Leben
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Qt4: more media browser (PL Selector) beautification
parent
bc157d87
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
470 additions
and
85 deletions
+470
-85
modules/gui/qt4/components/playlist/playlist.cpp
modules/gui/qt4/components/playlist/playlist.cpp
+60
-1
modules/gui/qt4/components/playlist/playlist.hpp
modules/gui/qt4/components/playlist/playlist.hpp
+35
-0
modules/gui/qt4/components/playlist/selector.cpp
modules/gui/qt4/components/playlist/selector.cpp
+295
-72
modules/gui/qt4/components/playlist/selector.hpp
modules/gui/qt4/components/playlist/selector.hpp
+78
-11
modules/gui/qt4/components/playlist/standardpanel.cpp
modules/gui/qt4/components/playlist/standardpanel.cpp
+2
-1
No files found.
modules/gui/qt4/components/playlist/playlist.cpp
View file @
4ed4e121
...
...
@@ -33,6 +33,9 @@
#include "input_manager.hpp"
/* art signal */
#include "main_interface.hpp"
/* DropEvent TODO remove this*/
#include <QGroupBox>
#include <iostream>
/**********************************************************************
* Playlist Widget. The embedded playlist
**********************************************************************/
...
...
@@ -46,7 +49,12 @@ PlaylistWidget::PlaylistWidget( intf_thread_t *_p_i ) : p_intf ( _p_i )
/* Source Selector */
selector
=
new
PLSelector
(
this
,
p_intf
);
leftW
->
addWidget
(
selector
);
QVBoxLayout
*
selBox
=
new
QVBoxLayout
();
selBox
->
setContentsMargins
(
0
,
5
,
0
,
0
);
selBox
->
addWidget
(
selector
);
QGroupBox
*
selGroup
=
new
QGroupBox
(
qtr
(
"Media Browser"
)
);
selGroup
->
setLayout
(
selBox
);
leftW
->
addWidget
(
selGroup
);
/* Create a Container for the Art Label
in order to have a beautiful resizing for the selector above it */
...
...
@@ -140,3 +148,54 @@ void PlaylistWidget::closeEvent( QCloseEvent *event )
event
->
ignore
();
}
}
PlaylistEventManager
::
PlaylistEventManager
(
playlist_t
*
_pl
)
:
pl
(
_pl
)
{
var_AddCallback
(
pl
,
"playlist-item-append"
,
itemAddedCb
,
this
);
var_AddCallback
(
pl
,
"playlist-item-deleted"
,
itemRemovedCb
,
this
);
}
PlaylistEventManager
::~
PlaylistEventManager
()
{
var_DelCallback
(
pl
,
"playlist-item-append"
,
itemAddedCb
,
this
);
var_DelCallback
(
pl
,
"playlist-item-deleted"
,
itemRemovedCb
,
this
);
}
int
PlaylistEventManager
::
itemAddedCb
(
vlc_object_t
*
obj
,
const
char
*
var
,
vlc_value_t
old
,
vlc_value_t
cur
,
void
*
data
)
{
PlaylistEventManager
*
p_this
=
static_cast
<
PlaylistEventManager
*>
(
data
);
p_this
->
trigger
(
cur
,
ItemAddedEv
);
return
VLC_SUCCESS
;
}
int
PlaylistEventManager
::
itemRemovedCb
(
vlc_object_t
*
obj
,
const
char
*
var
,
vlc_value_t
old
,
vlc_value_t
cur
,
void
*
data
)
{
PlaylistEventManager
*
p_this
=
static_cast
<
PlaylistEventManager
*>
(
data
);
p_this
->
trigger
(
cur
,
ItemRemovedEv
);
return
VLC_SUCCESS
;
}
void
PlaylistEventManager
::
trigger
(
vlc_value_t
val
,
int
type
)
{
if
(
type
==
ItemAddedEv
)
{
playlist_add_t
*
p_add
=
static_cast
<
playlist_add_t
*>
(
val
.
p_address
);
QApplication
::
postEvent
(
this
,
new
PLEMEvent
(
type
,
p_add
->
i_item
,
p_add
->
i_node
)
);
}
else
{
QApplication
::
postEvent
(
this
,
new
PLEMEvent
(
type
,
val
.
i_int
,
0
)
);
}
}
void
PlaylistEventManager
::
customEvent
(
QEvent
*
e
)
{
PLEMEvent
*
ev
=
static_cast
<
PLEMEvent
*>
(
e
);
if
(
(
int
)
ev
->
type
()
==
ItemAddedEv
)
emit
itemAdded
(
ev
->
item
,
ev
->
parent
);
else
emit
itemRemoved
(
ev
->
item
);
}
modules/gui/qt4/components/playlist/playlist.hpp
View file @
4ed4e121
...
...
@@ -34,6 +34,7 @@
#include "dialogs_provider.hpp"
/* Media Info from ArtLabel */
#include "components/interface_widgets.hpp"
//#include <vlc_playlist.h>
#include <QSplitter>
#include <QLabel>
...
...
@@ -75,5 +76,39 @@ public:
}
};
enum
PLEventType
{
ItemAddedEv
=
QEvent
::
User
,
ItemRemovedEv
};
class
PLEMEvent
:
public
QEvent
{
public:
PLEMEvent
(
int
t
,
int
i
,
int
p
)
:
QEvent
(
(
QEvent
::
Type
)
t
),
item
(
i
),
parent
(
p
)
{}
int
item
;
int
parent
;
};
class
PlaylistEventManager
:
public
QObject
{
Q_OBJECT
;
public:
PlaylistEventManager
(
playlist_t
*
);
~
PlaylistEventManager
();
signals:
void
itemAdded
(
int
,
int
);
void
itemRemoved
(
int
);
private:
static
int
itemAddedCb
(
vlc_object_t
*
,
const
char
*
,
vlc_value_t
,
vlc_value_t
,
void
*
);
static
int
itemRemovedCb
(
vlc_object_t
*
,
const
char
*
,
vlc_value_t
,
vlc_value_t
,
void
*
);
void
trigger
(
vlc_value_t
,
int
);
void
customEvent
(
QEvent
*
);
playlist_t
*
pl
;
};
#endif
modules/gui/qt4/components/playlist/selector.cpp
View file @
4ed4e121
...
...
@@ -32,31 +32,93 @@
#include "playlist_item.hpp"
#include "qt4.hpp"
#include "../../dialogs_provider.hpp"
#include "playlist.hpp"
#include <QVBoxLayout>
#include <QHeaderView>
#include <QMimeData>
#include <Q
PushButton
>
#include <Q
Label
>
#include <Q
InputDialog
>
#include <Q
MessageBox
>
#include <vlc_playlist.h>
#include <vlc_services_discovery.h>
#include <iostream>
PLSelItem
::
PLSelItem
(
QTreeWidgetItem
*
i
,
const
QString
&
text
)
:
qitem
(
i
),
btnAction
(
NULL
)
{
layout
=
new
QHBoxLayout
();
layout
->
setContentsMargins
(
0
,
0
,
0
,
0
);
lbl
=
new
QLabel
(
text
);
lbl
->
setMargin
(
3
);
layout
->
addWidget
(
lbl
);
setLayout
(
layout
);
}
void
PLSelItem
::
addAction
(
ItemAction
act
,
const
QString
&
tooltip
)
{
if
(
btnAction
)
return
;
switch
(
act
)
{
case
ADD_ACTION
:
btnAction
=
new
QPushButton
(
"+"
);
break
;
case
RM_ACTION
:
btnAction
=
new
QPushButton
(
"-"
);
break
;
}
if
(
!
tooltip
.
isEmpty
()
)
btnAction
->
setToolTip
(
tooltip
);
btnAction
->
setMaximumWidth
(
23
);
layout
->
addWidget
(
btnAction
);
btnAction
->
hide
();
CONNECT
(
btnAction
,
clicked
(),
this
,
triggerAction
()
);
}
void
PLSelItem
::
showAction
()
{
if
(
btnAction
)
btnAction
->
show
();
}
void
PLSelItem
::
hideAction
()
{
if
(
btnAction
)
btnAction
->
hide
();
}
void
PLSelItem
::
setText
(
const
QString
&
text
)
{
lbl
->
setText
(
text
);
}
void
PLSelItem
::
enterEvent
(
QEvent
*
ev
){
showAction
();
}
void
PLSelItem
::
leaveEvent
(
QEvent
*
ev
){
hideAction
();
}
PLSelector
::
PLSelector
(
QWidget
*
p
,
intf_thread_t
*
_p_intf
)
:
QTreeWidget
(
p
),
p_intf
(
_p_intf
)
{
setItemDelegate
(
new
PLSelectorDelegate
()
);
setFrameStyle
(
QFrame
::
StyledPanel
|
QFrame
::
Plain
);
/* custom QItemDelegate just to assure the minimum row height,
which otherwise fails when new child item is inserted */
setFrameStyle
(
QFrame
::
NoFrame
);
viewport
()
->
setAutoFillBackground
(
false
);
setIconSize
(
QSize
(
24
,
24
)
);
setIndentation
(
1
5
);
setIndentation
(
1
0
);
header
()
->
hide
();
//setHeaderLabel( qtr( "Medias" ) );
//header()->setMovable( false );
setRootIsDecorated
(
false
);
setAlternatingRowColors
(
true
);
setAlternatingRowColors
(
false
);
setItemDelegate
(
new
PLSelectorDelegate
()
);
podcastsParent
=
NULL
;
podcastsParentId
=
-
1
;
viewport
()
->
setAcceptDrops
(
true
);
setDropIndicatorShown
(
true
);
invisibleRootItem
()
->
setFlags
(
invisibleRootItem
()
->
flags
()
&
~
Qt
::
ItemIsDropEnabled
);
plEM
=
new
PlaylistEventManager
(
THEPL
);
CONNECT
(
plEM
,
itemAdded
(
int
,
int
),
this
,
plItemAdded
(
int
,
int
)
);
CONNECT
(
plEM
,
itemRemoved
(
int
),
this
,
plItemRemoved
(
int
)
);
CONNECT
(
THEMIM
->
getIM
(),
metaChanged
(
input_item_t
*
),
this
,
inputItemUpdate
(
input_item_t
*
)
);
createItems
();
CONNECT
(
this
,
itemActivated
(
QTreeWidgetItem
*
,
int
),
this
,
setSource
(
QTreeWidgetItem
*
)
);
...
...
@@ -69,6 +131,20 @@ PLSelector::PLSelector( QWidget *p, intf_thread_t *_p_intf )
// view->setCurrentIndex( model->index( 0, 0, QModelIndex() ) );
}
PLSelector
::~
PLSelector
()
{
if
(
podcastsParent
)
{
int
c
=
podcastsParent
->
childCount
();
for
(
int
i
=
0
;
i
<
c
;
i
++
)
{
QTreeWidgetItem
*
item
=
podcastsParent
->
child
(
i
);
input_item_t
*
p_input
=
item
->
data
(
0
,
IN_ITEM_ROLE
).
value
<
input_item_t
*>
();
vlc_gc_decref
(
p_input
);
}
}
}
void
PLSelector
::
setSource
(
QTreeWidgetItem
*
item
)
{
if
(
!
item
)
...
...
@@ -76,65 +152,107 @@ void PLSelector::setSource( QTreeWidgetItem *item )
bool
b_ok
;
int
i_type
=
item
->
data
(
0
,
TYPE_ROLE
).
toInt
(
&
b_ok
);
if
(
!
b_ok
)
if
(
!
b_ok
||
i_type
==
CATEGORY_TYPE
)
return
;
assert
(
(
i_type
==
PL_TYPE
||
i_type
==
ML_TYPE
||
i_type
==
SD_TYPE
)
)
;
bool
sd_loaded
;
if
(
i_type
==
SD_TYPE
)
{
QString
qs
=
item
->
data
(
0
,
NAME_ROLE
).
toString
();
if
(
!
playlist_IsServicesDiscoveryLoaded
(
THEPL
,
qtu
(
qs
)
)
)
{
sd_loaded
=
playlist_IsServicesDiscoveryLoaded
(
THEPL
,
qtu
(
qs
)
);
if
(
!
sd_loaded
)
playlist_ServicesDiscoveryAdd
(
THEPL
,
qtu
(
qs
)
);
}
}
if
(
i_type
==
SD_TYPE
)
msg_Dbg
(
p_intf
,
"SD already loaded, reloading"
);
playlist_Lock
(
THEPL
);
playlist_item_t
*
pl_item
=
NULL
;
if
(
i_type
==
SD_TYPE
)
{
pl_item
=
playlist_ChildSearchName
(
THEPL
->
p_root_category
,
qtu
(
item
->
data
(
0
,
LONGNAME_ROLE
).
toString
()
)
);
else
if
(
i_type
==
PL_TYPE
)
pl_item
=
THEPL
->
p_local_category
;
else
if
(
i_type
==
ML_TYPE
)
pl_item
=
THEPL
->
p_ml_category
;
if
(
item
->
data
(
0
,
SPECIAL_ROLE
).
toInt
()
==
IS_PODCAST
)
{
if
(
pl_item
&&
!
sd_loaded
)
{
podcastsParentId
=
pl_item
->
i_id
;
for
(
int
i
=
0
;
i
<
pl_item
->
i_children
;
i
++
)
addPodcastItem
(
pl_item
->
pp_children
[
i
]
);
}
pl_item
=
NULL
;
//to prevent activating it
}
}
else
pl_item
=
item
->
data
(
0
,
PL_ITEM_ROLE
).
value
<
playlist_item_t
*>
();
playlist_Unlock
(
THEPL
);
if
(
pl_item
)
emit
activated
(
pl_item
);
}
void
PLSelector
::
makeStandardItem
(
QTreeWidgetItem
*
item
,
const
QString
&
str
)
PLSelItem
*
PLSelector
::
addItem
(
SelectorItemType
type
,
const
QString
&
str
,
bool
drop
,
QTreeWidgetItem
*
parentItem
)
{
QTreeWidgetItem
*
item
=
parentItem
?
new
QTreeWidgetItem
(
parentItem
)
:
new
QTreeWidgetItem
(
this
);
PLSelItem
*
selItem
=
new
PLSelItem
(
item
,
str
);
setItemWidget
(
item
,
0
,
selItem
);
item
->
setData
(
0
,
TYPE_ROLE
,
(
int
)
type
);
if
(
!
drop
)
item
->
setFlags
(
item
->
flags
()
&
~
Qt
::
ItemIsDropEnabled
);
return
selItem
;
}
PLSelItem
*
putSDData
(
PLSelItem
*
item
,
const
char
*
name
,
const
char
*
longname
)
{
item
->
treeItem
()
->
setData
(
0
,
NAME_ROLE
,
qfu
(
name
)
);
item
->
treeItem
()
->
setData
(
0
,
LONGNAME_ROLE
,
qfu
(
longname
)
);
return
item
;
}
PLSelItem
*
putPLData
(
PLSelItem
*
item
,
playlist_item_t
*
plItem
)
{
item
->
setText
(
0
,
str
);
item
->
treeItem
()
->
setData
(
0
,
PL_ITEM_ROLE
,
QVariant
::
fromValue
(
plItem
)
);
/* item->setData( 0, PL_ITEM_ID_ROLE, plItem->i_id );
item->setData( 0, IN_ITEM_ROLE, QVariant::fromValue( (void*) plItem->p_input ) ); );*/
return
item
;
}
PLSelItem
*
PLSelector
::
addPodcastItem
(
playlist_item_t
*
p_item
)
{
vlc_gc_incref
(
p_item
->
p_input
);
char
*
psz_name
=
input_item_GetName
(
p_item
->
p_input
);
PLSelItem
*
item
=
addItem
(
PL_ITEM_TYPE
,
qfu
(
psz_name
),
false
,
podcastsParent
);
item
->
addAction
(
RM_ACTION
,
qtr
(
"Remove this podcast subscription"
)
);
item
->
treeItem
()
->
setData
(
0
,
PL_ITEM_ROLE
,
QVariant
::
fromValue
(
p_item
)
);
item
->
treeItem
()
->
setData
(
0
,
PL_ITEM_ID_ROLE
,
QVariant
(
p_item
->
i_id
)
);
item
->
treeItem
()
->
setData
(
0
,
IN_ITEM_ROLE
,
QVariant
::
fromValue
(
p_item
->
p_input
)
);
CONNECT
(
item
,
action
(
PLSelItem
*
),
this
,
podcastRemove
(
PLSelItem
*
)
);
free
(
psz_name
);
return
item
;
}
void
PLSelector
::
createItems
()
{
QTreeWidgetItem
*
pl
=
new
QTreeWidgetItem
(
this
);
makeStandardItem
(
pl
,
qtr
(
"Playlist"
)
);
pl
->
setData
(
0
,
TYPE_ROLE
,
PL_TYPE
);
pl
->
setData
(
0
,
PPL_ITEM_ROLE
,
QVariant
::
fromValue
(
THEPL
->
p_local_category
)
);
PLSelItem
*
pl
=
putPLData
(
addItem
(
PL_ITEM_TYPE
,
qtr
(
"Playlist"
),
true
),
THEPL
->
p_local_category
);
pl
->
treeItem
()
->
setData
(
0
,
SPECIAL_ROLE
,
QVariant
(
IS_PL
)
);
PLSelItem
*
ml
=
putPLData
(
addItem
(
PL_ITEM_TYPE
,
qtr
(
"Media Library"
),
true
),
THEPL
->
p_ml_category
);
ml
->
treeItem
()
->
setData
(
0
,
SPECIAL_ROLE
,
QVariant
(
IS_ML
)
);
QTreeWidgetItem
*
lib
=
new
QTreeWidgetItem
(
this
);
makeStandardItem
(
lib
,
qtr
(
"Media Library"
)
);
lib
->
setData
(
0
,
TYPE_ROLE
,
ML_TYPE
);
lib
->
setData
(
0
,
PPL_ITEM_ROLE
,
QVariant
::
fromValue
(
THEPL
->
p_ml_category
)
);
QTreeWidgetItem
*
msrc
=
addItem
(
CATEGORY_TYPE
,
qtr
(
"Media Sources"
),
false
)
->
treeItem
();
QTreeWidgetItem
*
sds
=
new
QTreeWidgetItem
(
this
);
makeStandardItem
(
sds
,
qtr
(
"Services"
)
);
sds
->
setExpanded
(
true
);
sds
->
setFlags
(
sds
->
flags
()
&
~
Qt
::
ItemIsDropEnabled
);
QTreeWidgetItem
*
mfldrs
=
NULL
;
QTreeWidgetItem
*
mfldrs
=
new
QTreeWidgetItem
(
sds
);
makeStandardItem
(
mfldrs
,
qtr
(
"Media Folders"
)
);
mfldrs
->
setFlags
(
mfldrs
->
flags
()
&
~
Qt
::
ItemIsDropEnabled
);
QTreeWidgetItem
*
shouts
=
NULL
;
QTreeWidgetItem
*
shouts
=
new
QTreeWidgetItem
(
sds
);
makeStandardItem
(
shouts
,
qtr
(
"Shoutcast"
)
);
shouts
->
setFlags
(
shouts
->
flags
()
&
~
Qt
::
ItemIsDropEnabled
);
msrc
->
setExpanded
(
true
);
char
**
ppsz_longnames
;
char
**
ppsz_names
=
vlc_sd_GetNames
(
&
ppsz_longnames
);
...
...
@@ -142,55 +260,45 @@ void PLSelector::createItems()
return
;
char
**
ppsz_name
=
ppsz_names
,
**
ppsz_longname
=
ppsz_longnames
;
QTreeWidgetItem
*
sd_item
;
for
(
;
*
ppsz_name
;
ppsz_name
++
,
ppsz_longname
++
)
{
sd_item
=
new
QTreeWidgetItem
(
);
//msg_Dbg( p_intf, "Adding a SD item: %s", *ppsz_longname );
#define SD_IS( name ) ( !strcmp( *ppsz_name, name ) )
if
(
SD_IS
(
"shoutcast"
)
||
SD_IS
(
"shoutcasttv"
)
||
SD_IS
(
"frenchtv"
)
||
SD_IS
(
"freebox"
)
)
{
shouts
->
addChild
(
sd_item
);
makeStandardItem
(
sd_item
,
qfu
(
*
ppsz_longname
)
);
if
(
!
shouts
)
shouts
=
addItem
(
CATEGORY_TYPE
,
qtr
(
"Shoutcast"
),
false
,
msrc
)
->
treeItem
();
putSDData
(
addItem
(
SD_TYPE
,
*
ppsz_longname
,
false
,
shouts
),
*
ppsz_name
,
*
ppsz_longname
);
}
else
if
(
SD_IS
(
"video_dir"
)
||
SD_IS
(
"audio_dir"
)
||
SD_IS
(
"picture_dir"
)
)
{
mfldrs
->
addChild
(
sd_item
);
makeStandardItem
(
sd_item
,
qfu
(
*
ppsz_longname
)
);
if
(
!
mfldrs
)
mfldrs
=
addItem
(
CATEGORY_TYPE
,
qtr
(
"Media Folders"
),
false
,
msrc
)
->
treeItem
();
putSDData
(
addItem
(
SD_TYPE
,
*
ppsz_longname
,
false
,
mfldrs
),
*
ppsz_name
,
*
ppsz_longname
);
}
else
if
(
SD_IS
(
"podcast"
)
)
{
sds
->
addChild
(
sd_item
);
QLabel
*
lbl
=
new
QLabel
(
"Podcasts"
);
lbl
->
setMargin
(
3
);
QPushButton
*
btn
=
new
QPushButton
();
btn
->
setMaximumWidth
(
30
);
btn
->
setIcon
(
QIcon
(
":/menu/preferences"
)
);
QHBoxLayout
*
hbox
=
new
QHBoxLayout
();
hbox
->
setContentsMargins
(
0
,
0
,
0
,
0
);
hbox
->
addWidget
(
lbl
);
hbox
->
addWidget
(
btn
);
QWidget
*
w
=
new
QWidget
();
w
->
setLayout
(
hbox
);
CONNECT
(
btn
,
clicked
(),
THEDP
,
podcastConfigureDialog
()
);
setItemWidget
(
sd_item
,
0
,
w
);
PLSelItem
*
podItem
=
addItem
(
SD_TYPE
,
qtr
(
"Podcasts"
),
false
,
msrc
);
putSDData
(
podItem
,
*
ppsz_name
,
*
ppsz_longname
);
podItem
->
treeItem
()
->
setData
(
0
,
SPECIAL_ROLE
,
QVariant
(
IS_PODCAST
)
);
podItem
->
addAction
(
ADD_ACTION
,
qtr
(
"Subscribe to a podcast"
)
);
CONNECT
(
podItem
,
action
(
PLSelItem
*
),
this
,
podcastAdd
(
PLSelItem
*
)
);
podcastsParent
=
podItem
->
treeItem
();
}
else
{
sds
->
addChild
(
sd_item
);
makeStandardItem
(
sd_item
,
qfu
(
*
ppsz_longname
)
);
putSDData
(
addItem
(
SD_TYPE
,
qtr
(
*
ppsz_longname
),
false
,
msrc
),
*
ppsz_name
,
*
ppsz_longname
);
}
#undef SD_IS
sd_item
->
setData
(
0
,
TYPE_ROLE
,
SD_TYPE
);
sd_item
->
setData
(
0
,
NAME_ROLE
,
qfu
(
*
ppsz_name
)
);
sd_item
->
setData
(
0
,
LONGNAME_ROLE
,
qfu
(
*
ppsz_longname
)
);
sd_item
->
setFlags
(
sd_item
->
flags
()
&
~
Qt
::
ItemIsDropEnabled
);
free
(
*
ppsz_name
);
free
(
*
ppsz_longname
);
}
...
...
@@ -212,9 +320,10 @@ bool PLSelector::dropMimeData ( QTreeWidgetItem * parent, int index,
QVariant
type
=
parent
->
data
(
0
,
TYPE_ROLE
);
if
(
type
==
QVariant
()
)
return
false
;
int
i_type
=
type
.
toInt
();
if
(
i_type
!=
PL_TYPE
&&
i_type
!=
ML_TYPE
)
return
false
;
bool
to_pl
=
i_type
==
PL_TYPE
;
int
i_truth
=
parent
->
data
(
0
,
SPECIAL_ROLE
).
toInt
();
if
(
i_truth
!=
IS_PL
&&
i_truth
!=
IS_ML
)
return
false
;
bool
to_pl
=
(
i_truth
==
IS_PL
);
if
(
data
->
hasFormat
(
"vlc/qt-playlist-item"
)
)
{
...
...
@@ -238,6 +347,120 @@ bool PLSelector::dropMimeData ( QTreeWidgetItem * parent, int index,
return
true
;
}
PLSelector
::~
PLSelector
()
void
PLSelector
::
plItemAdded
(
int
item
,
int
parent
)
{
if
(
parent
!=
podcastsParentId
)
return
;
playlist_Lock
(
THEPL
);
playlist_item_t
*
p_item
=
playlist_ItemGetById
(
THEPL
,
item
);
if
(
!
p_item
)
{
playlist_Unlock
(
THEPL
);
return
;
}
int
c
=
podcastsParent
->
childCount
();
for
(
int
i
=
0
;
i
<
c
;
i
++
)
{
QTreeWidgetItem
*
podItem
=
podcastsParent
->
child
(
i
);
if
(
podItem
->
data
(
0
,
PL_ITEM_ID_ROLE
).
toInt
()
==
item
)
{
//msg_Dbg( p_intf, "Podcast already in: (%d) %s", item, p_item->p_input->psz_uri);
playlist_Unlock
(
THEPL
);
return
;
}
}
//msg_Dbg( p_intf, "Adding podcast: (%d) %s", item, p_item->p_input->psz_uri );
addPodcastItem
(
p_item
);
playlist_Unlock
(
THEPL
);
podcastsParent
->
setExpanded
(
true
);
}
void
PLSelector
::
plItemRemoved
(
int
id
)
{
int
c
=
podcastsParent
->
childCount
();
for
(
int
i
=
0
;
i
<
c
;
i
++
)
{
QTreeWidgetItem
*
item
=
podcastsParent
->
child
(
i
);
if
(
item
->
data
(
0
,
PL_ITEM_ID_ROLE
).
toInt
()
==
id
)
{
input_item_t
*
p_input
=
item
->
data
(
0
,
IN_ITEM_ROLE
).
value
<
input_item_t
*>
();
//msg_Dbg( p_intf, "Removing podcast: (%d) %s", id, p_input->psz_uri );
vlc_gc_decref
(
p_input
);
delete
item
;
return
;
}
}
}
void
PLSelector
::
inputItemUpdate
(
input_item_t
*
arg
)
{
int
c
=
podcastsParent
->
childCount
();
for
(
int
i
=
0
;
i
<
c
;
i
++
)
{
QTreeWidgetItem
*
item
=
podcastsParent
->
child
(
i
);
input_item_t
*
p_input
=
item
->
data
(
0
,
IN_ITEM_ROLE
).
value
<
input_item_t
*>
();
if
(
p_input
==
arg
)
{
PLSelItem
*
si
=
itemWidget
(
item
);
char
*
psz_name
=
input_item_GetName
(
p_input
);
si
->
setText
(
qfu
(
psz_name
)
);
free
(
psz_name
);
return
;
}
}
}
void
PLSelector
::
podcastAdd
(
PLSelItem
*
item
)
{
bool
ok
;
QString
url
=
QInputDialog
::
getText
(
this
,
qtr
(
"Subscribe"
),
qtr
(
"Enter URL of the podcast to subscribe to:"
),
QLineEdit
::
Normal
,
QString
(),
&
ok
);
if
(
!
ok
||
url
.
isEmpty
()
)
return
;
setSource
(
podcastsParent
);
//to load the SD in case it's not loaded
vlc_object_t
*
p_obj
=
(
vlc_object_t
*
)
vlc_object_find_name
(
p_intf
->
p_libvlc
,
"podcast"
,
FIND_CHILD
);
if
(
!
p_obj
)
return
;
QString
request
(
"ADD:"
);
request
+=
url
;
var_SetString
(
p_obj
,
"podcast-request"
,
qtu
(
request
)
);
vlc_object_release
(
p_obj
);
}
void
PLSelector
::
podcastRemove
(
PLSelItem
*
item
)
{
//FIXME will translators know to leave that %1 somewhere inside?
QString
question
(
qtr
(
"Do you really want to unsubscribe from %1?"
)
);
question
=
question
.
arg
(
item
->
text
()
);
QMessageBox
::
StandardButton
res
=
QMessageBox
::
question
(
this
,
qtr
(
"Unsubscribe"
),
question
,
QMessageBox
::
Ok
|
QMessageBox
::
Cancel
,
QMessageBox
::
Cancel
);
if
(
res
==
QMessageBox
::
Cancel
)
return
;
input_item_t
*
input
=
item
->
treeItem
()
->
data
(
0
,
IN_ITEM_ROLE
).
value
<
input_item_t
*>
();
if
(
!
input
)
return
;
vlc_object_t
*
p_obj
=
(
vlc_object_t
*
)
vlc_object_find_name
(
p_intf
->
p_libvlc
,
"podcast"
,
FIND_CHILD
);
if
(
!
p_obj
)
return
;
QString
request
(
"RM:"
);
char
*
psz_uri
=
input_item_GetURI
(
input
);
request
+=
qfu
(
psz_uri
);
var_SetString
(
p_obj
,
"podcast-request"
,
qtu
(
request
)
);
vlc_object_release
(
p_obj
);
free
(
psz_uri
);
}
PLSelItem
*
PLSelector
::
itemWidget
(
QTreeWidgetItem
*
item
)
{
return
(
static_cast
<
PLSelItem
*>
(
QTreeWidget
::
itemWidget
(
item
,
0
)
)
);
}
\ No newline at end of file
modules/gui/qt4/components/playlist/selector.hpp
View file @
4ed4e121
...
...
@@ -32,38 +32,92 @@
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QStyledItemDelegate>
#include <QPainter>
#include <QPushButton>
#include <QLabel>
#include <QHBoxLayout>
#include <vlc_playlist.h>
#include "qt4.hpp"
class
PlaylistWidget
;
class
PlaylistEventManager
;
enum
{
PL_TYPE
,
ML_TYPE
,
enum
SelectorItemType
{
CATEGORY_TYPE
,
SD_TYPE
,
PL_ITEM_TYPE
};
enum
SpecialData
{
IS_PODCAST
=
1
,
IS_PL
,
IS_ML
};
enum
{
TYPE_ROLE
=
Qt
::
UserRole
,
PPL_ITEM_ROLE
,
NAME_ROLE
,
LONGNAME_ROLE
,
NAME_ROLE
,
//QString
LONGNAME_ROLE
,
//QString
PL_ITEM_ROLE
,
//playlist_item_t*
PL_ITEM_ID_ROLE
,
//playlist_item_t->i_id
IN_ITEM_ROLE
,
//input_item_t->i_id
SPECIAL_ROLE
//SpecialData
};
enum
ItemAction
{
ADD_ACTION
,
RM_ACTION
};
class
PLSelItem
:
public
QWidget
{
Q_OBJECT
;
public:
PLSelItem
(
QTreeWidgetItem
*
,
const
QString
&
);
void
setText
(
const
QString
&
);
void
addAction
(
ItemAction
,
const
QString
&
toolTip
=
0
);
QTreeWidgetItem
*
treeItem
()
{
return
qitem
;
}
QString
text
()
{
return
lbl
->
text
();
}
public
slots
:
void
showAction
();
void
hideAction
();
private
slots
:
void
triggerAction
()
{
emit
action
(
this
);
}
signals:
void
action
(
PLSelItem
*
);
private:
void
enterEvent
(
QEvent
*
);
void
leaveEvent
(
QEvent
*
);
QTreeWidgetItem
*
qitem
;
QPushButton
*
btnAction
;
QLabel
*
lbl
;
QHBoxLayout
*
layout
;
};
class
PLSelectorDelegate
:
public
QStyledItemDelegate
{
private:
private:
/*void paint ( QPainter * painter,
const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
if( index.data( TYPE_ROLE ).toInt() == CATEGORY_TYPE )
painter->fillRect( option.rect, QColor( 200,200,200 ) );
QRect r = option.rect;
r.setLeft( r.left() + 5 );
painter->drawText( r, Qt::AlignLeft | Qt::AlignVCenter, index.data().toString() );
}*/
QSize
sizeHint
(
const
QStyleOptionViewItem
&
option
,
const
QModelIndex
&
index
)
const
{
QSize
sz
=
QStyledItemDelegate
::
sizeHint
(
option
,
index
);
if
(
sz
.
height
()
<
25
)
sz
.
setHeight
(
25
);
if
(
sz
.
height
()
<
23
)
sz
.
setHeight
(
23
);
return
sz
;
}
};
Q_DECLARE_METATYPE
(
playlist_item_t
*
);
Q_DECLARE_METATYPE
(
input_item_t
*
);
class
PLSelector
:
public
QTreeWidget
{
Q_OBJECT
;
...
...
@@ -74,12 +128,25 @@ protected:
friend
class
PlaylistWidget
;
private:
QStringList
mimeTypes
()
const
;
void
makeStandardItem
(
QTreeWidgetItem
*
,
const
QString
&
);
bool
dropMimeData
(
QTreeWidgetItem
*
parent
,
int
index
,
const
QMimeData
*
data
,
Qt
::
DropAction
action
);
void
createItems
();
PLSelItem
*
addItem
(
SelectorItemType
type
,
const
QString
&
str
,
bool
drop
,
QTreeWidgetItem
*
parentItem
=
0
);
PLSelItem
*
addPodcastItem
(
playlist_item_t
*
p_item
);
inline
PLSelItem
*
itemWidget
(
QTreeWidgetItem
*
);
intf_thread_t
*
p_intf
;
PlaylistEventManager
*
plEM
;
QTreeWidgetItem
*
podcastsParent
;
int
podcastsParentId
;
private
slots
:
void
setSource
(
QTreeWidgetItem
*
item
);
void
plItemAdded
(
int
,
int
);
void
plItemRemoved
(
int
);
void
inputItemUpdate
(
input_item_t
*
);
void
podcastAdd
(
PLSelItem
*
);
void
podcastRemove
(
PLSelItem
*
);
signals:
void
activated
(
playlist_item_t
*
);
};
...
...
modules/gui/qt4/components/playlist/standardpanel.cpp
View file @
4ed4e121
...
...
@@ -295,7 +295,8 @@ void StandardPLPanel::setRoot( playlist_item_t *p_item )
QPL_LOCK
;
assert
(
p_item
);
p_item
=
playlist_GetPreferredNode
(
THEPL
,
p_item
);
playlist_item_t
*
p_pref_item
=
playlist_GetPreferredNode
(
THEPL
,
p_item
);
if
(
p_pref_item
)
p_item
=
p_pref_item
;
/* needed for popupAdd() */
currentRootId
=
p_item
->
i_id
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment