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
2f353e18
Commit
2f353e18
authored
May 01, 2014
by
Francois Cartegnie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Qt4: prune SQL media library code
refs
c2c113e3
parent
532b001b
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
19 additions
and
1756 deletions
+19
-1756
modules/gui/qt4/Makefile.am
modules/gui/qt4/Makefile.am
+0
-5
modules/gui/qt4/components/playlist/ml_item.cpp
modules/gui/qt4/components/playlist/ml_item.cpp
+0
-356
modules/gui/qt4/components/playlist/ml_item.hpp
modules/gui/qt4/components/playlist/ml_item.hpp
+0
-76
modules/gui/qt4/components/playlist/ml_model.cpp
modules/gui/qt4/components/playlist/ml_model.cpp
+0
-693
modules/gui/qt4/components/playlist/ml_model.hpp
modules/gui/qt4/components/playlist/ml_model.hpp
+0
-129
modules/gui/qt4/components/playlist/playlist.cpp
modules/gui/qt4/components/playlist/playlist.cpp
+0
-6
modules/gui/qt4/components/playlist/selector.cpp
modules/gui/qt4/components/playlist/selector.cpp
+0
-14
modules/gui/qt4/components/playlist/standardpanel.cpp
modules/gui/qt4/components/playlist/standardpanel.cpp
+2
-15
modules/gui/qt4/components/simple_preferences.cpp
modules/gui/qt4/components/simple_preferences.cpp
+0
-6
modules/gui/qt4/dialogs/ml_configuration.cpp
modules/gui/qt4/dialogs/ml_configuration.cpp
+0
-308
modules/gui/qt4/dialogs/ml_configuration.hpp
modules/gui/qt4/dialogs/ml_configuration.hpp
+0
-113
modules/gui/qt4/ui/sprefs_interface.ui
modules/gui/qt4/ui/sprefs_interface.ui
+17
-34
modules/gui/qt4/util/pictureflow.cpp
modules/gui/qt4/util/pictureflow.cpp
+0
-1
No files found.
modules/gui/qt4/Makefile.am
View file @
2f353e18
...
...
@@ -49,7 +49,6 @@ libqt4_plugin_la_SOURCES = \
dialogs/bookmarks.cpp dialogs/bookmarks.hpp
\
dialogs/preferences.cpp dialogs/preferences.hpp
\
dialogs/mediainfo.cpp dialogs/mediainfo.hpp
\
dialogs/ml_configuration.cpp dialogs/ml_configuration.hpp
\
dialogs/epg.cpp dialogs/epg.hpp
\
dialogs/extended.cpp dialogs/extended.hpp
\
dialogs/messages.cpp dialogs/messages.hpp
\
...
...
@@ -85,8 +84,6 @@ libqt4_plugin_la_SOURCES = \
components/epg/EPGView.cpp components/epg/EPGView.hpp
\
components/epg/EPGWidget.cpp components/epg/EPGWidget.hpp
\
components/playlist/views.cpp components/playlist/views.hpp
\
components/playlist/ml_item.cpp components/playlist/ml_item.hpp
\
components/playlist/ml_model.cpp components/playlist/ml_model.hpp
\
components/playlist/vlc_model.cpp components/playlist/vlc_model.hpp
\
components/playlist/playlist_model.cpp
\
components/playlist/playlist_model.hpp
\
...
...
@@ -169,7 +166,6 @@ nodist_libqt4_plugin_la_SOURCES = \
dialogs/firstrun.moc.cpp
\
dialogs/extensions.moc.cpp
\
dialogs/fingerprintdialog.moc.cpp
\
dialogs/ml_configuration.moc.cpp
\
components/extended_panels.moc.cpp
\
components/info_panels.moc.cpp
\
components/info_widgets.moc.cpp
\
...
...
@@ -190,7 +186,6 @@ nodist_libqt4_plugin_la_SOURCES = \
components/playlist/playlist.moc.cpp
\
components/playlist/standardpanel.moc.cpp
\
components/playlist/selector.moc.cpp
\
components/playlist/ml_model.moc.cpp
\
components/sout/profile_selector.moc.cpp
\
components/sout/sout_widgets.moc.cpp
\
util/animators.moc.cpp
\
...
...
modules/gui/qt4/components/playlist/ml_item.cpp
deleted
100644 → 0
View file @
532b001b
/*****************************************************************************
* ml_item.cpp: the SQL media library's result item
*****************************************************************************
* Copyright (C) 2008-2011 the VideoLAN Team and AUTHORS
* $Id$
*
* Authors: Antoine Lejeune <phytos@videolan.org>
* Jean-Philippe André <jpeg@videolan.org>
* Rémi Duraffort <ivoire@videolan.org>
* Adrien Maglo <magsoft@videolan.org>
* Srikanth Raju <srikiraju#gmail#com>
*
* 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#ifdef SQL_MEDIA_LIBRARY
#include <QDateTime>
#include <QUrl>
#include <QFileInfo>
#include "ml_item.hpp"
#include <assert.h>
/**
* @brief Compare the attribute 'meta' between medias a and b.
* @param a
* @param b
* @param meta
* @note If a->meta < b->meta, return -1
* If a->meta == b->meta, return 0
* If a->meta > b->meta, return +1
* @note If a->meta == NULL and b->meta != NULL (strings), then b>a
*/
static
int
compareMeta
(
ml_media_t
*
a
,
ml_media_t
*
b
,
ml_select_e
meta
)
{
bool
i_ret
=
0
;
# define scomp(c) i_ret = ((a->c&&b->c&&*a->c&&*b->c) ?\
strcasecmp(a->c,b->c) : \
(a->c&&*a->c?-1:(b->c&&*b->c?1:0))); break;
# define icomp(c) i_ret = (a->c<b->c?-1:(a->c==b->c?0:1)); break;
if
(
a
==
b
)
return
0
;
vlc_mutex_lock
(
&
a
->
lock
);
vlc_mutex_lock
(
&
b
->
lock
);
switch
(
meta
)
{
case
ML_ALBUM
:
scomp
(
psz_album
);
case
ML_ALBUM_ID
:
icomp
(
i_album_id
);
//case ML_ARTIST: scomp( psz_artist );
//case ML_ARTIST_ID: icomp( i_artist_id );
case
ML_COVER
:
scomp
(
psz_cover
);
case
ML_DURATION
:
icomp
(
i_duration
);
case
ML_EXTRA
:
scomp
(
psz_extra
);
case
ML_GENRE
:
scomp
(
psz_genre
);
case
ML_ID
:
icomp
(
i_id
);
case
ML_LAST_PLAYED
:
icomp
(
i_last_played
);
case
ML_ORIGINAL_TITLE
:
scomp
(
psz_orig_title
);
case
ML_PLAYED_COUNT
:
icomp
(
i_played_count
);
// case ML_ROLE: 0;
case
ML_SCORE
:
icomp
(
i_score
);
case
ML_TITLE
:
scomp
(
psz_title
);
case
ML_TRACK_NUMBER
:
icomp
(
i_track_number
);
case
ML_TYPE
:
icomp
(
i_type
);
case
ML_URI
:
scomp
(
psz_uri
);
case
ML_VOTE
:
icomp
(
i_vote
);
case
ML_YEAR
:
icomp
(
i_year
);
default:
break
;
}
# undef scomp
# undef icomp
vlc_mutex_unlock
(
&
a
->
lock
);
vlc_mutex_unlock
(
&
b
->
lock
);
return
i_ret
;
}
MLItem
::
MLItem
(
intf_thread_t
*
_p_intf
,
ml_media_t
*
p_media
,
MLItem
*
p_parent
)
{
parentItem
=
p_parent
;
if
(
p_media
)
ml_gc_incref
(
p_media
);
media
=
p_media
;
p_ml
=
ml_Get
(
_p_intf
);
}
MLItem
::~
MLItem
()
{
// Free private data
if
(
this
->
media
)
ml_gc_decref
(
this
->
media
);
if
(
!
children
.
isEmpty
()
)
clearChildren
();
}
AbstractPLItem
*
MLItem
::
child
(
int
row
)
const
{
if
(
row
<
0
||
row
>=
childCount
()
)
return
NULL
;
else
return
children
.
at
(
row
);
}
input_item_t
*
MLItem
::
inputItem
()
{
return
ml_CreateInputItem
(
p_ml
,
id
(
MLMEDIA_ID
)
);
}
/**
* @brief Get a QVariant representing the data on a column
* @param column
* @return The QVariant may be formed of a int, QString
* Use toString() to print it on the screen, except for pixmaps
*/
QVariant
MLItem
::
data
(
ml_select_e
columntype
)
const
{
ml_person_t
*
p_people
=
NULL
,
*
p_person
=
NULL
;
QVariant
ret
;
QString
temp
;
#define sget(a) if(media->a) ret = qfu(media->a);
#define iget(a) if(media->a) ret = QVariant(media->a);
vlc_mutex_lock
(
&
media
->
lock
);
switch
(
columntype
)
{
case
ML_ALBUM
:
sget
(
psz_album
);
break
;
case
ML_ALBUM_ID
:
iget
(
i_album_id
);
break
;
case
ML_ARTIST
:
vlc_mutex_unlock
(
&
media
->
lock
);
p_people
=
ml_GetPersonsFromMedia
(
p_ml
,
media
,
ML_PERSON_ARTIST
);
vlc_mutex_lock
(
&
media
->
lock
);
p_person
=
p_people
;
while
(
p_person
)
{
if
(
!
EMPTY_STR
(
p_person
->
psz_name
)
)
{
temp
.
isEmpty
()
?
temp
=
qfu
(
p_person
->
psz_name
)
:
temp
.
append
(
","
).
append
(
qfu
(
p_person
->
psz_name
)
);
}
p_person
=
p_person
->
p_next
;
}
ml_FreePeople
(
p_people
);
ret
=
temp
;
break
;
case
ML_COVER
:
sget
(
psz_cover
);
break
;
case
ML_DURATION
:
if
(
media
->
i_duration
)
ret
=
QTime
().
addSecs
(
media
->
i_duration
/
1000000
).
toString
(
"HH:mm:ss"
);
break
;
case
ML_EXTRA
:
sget
(
psz_extra
);
break
;
case
ML_GENRE
:
sget
(
psz_genre
);
break
;
case
ML_ID
:
iget
(
i_id
);
break
;
case
ML_LAST_PLAYED
:
if
(
media
->
i_last_played
>
0
)
{
QDateTime
time
(
QDate
(
1970
,
1
,
1
)
);
ret
=
time
.
addSecs
(
qint64
(
media
->
i_last_played
)
);
}
break
;
case
ML_ORIGINAL_TITLE
:
sget
(
psz_orig_title
);
break
;
case
ML_PLAYED_COUNT
:
iget
(
i_played_count
);
break
;
// case ML_ROLE: return qtr( "Role" );
case
ML_SCORE
:
if
(
media
->
i_score
)
iget
(
i_score
);
break
;
case
ML_TITLE
:
temp
=
qfu
(
media
->
psz_title
);
/* If no title, return filename */
if
(
temp
.
isEmpty
()
)
{
vlc_mutex_unlock
(
&
media
->
lock
);
QUrl
uri
=
getURI
();
vlc_mutex_lock
(
&
media
->
lock
);
if
(
uri
.
scheme
()
!=
"file"
)
{
ret
=
QUrl
::
fromPercentEncoding
(
uri
.
toString
().
toUtf8
()
);
}
else
{
QFileInfo
p_file
(
uri
.
toLocalFile
()
);
ret
=
p_file
.
fileName
().
isEmpty
()
?
p_file
.
absoluteFilePath
()
:
p_file
.
fileName
();
}
}
else
{
ret
=
temp
;
}
break
;
case
ML_TRACK_NUMBER
:
if
(
media
->
i_track_number
)
iget
(
i_track_number
);
break
;
case
ML_TYPE
:
if
(
media
->
i_type
&
ML_AUDIO
)
temp
=
"Audio"
;
if
(
media
->
i_type
&
ML_VIDEO
)
temp
=
"Video"
;
if
(
media
->
i_type
&
ML_STREAM
)
{
if
(
temp
.
isEmpty
()
)
temp
=
"Stream"
;
else
temp
+=
" stream"
;
}
if
(
media
->
i_type
&
ML_REMOVABLE
)
{
if
(
temp
.
isEmpty
()
)
temp
=
"Removable media"
;
else
temp
+=
" (removable media)"
;
}
if
(
media
->
i_type
&
ML_NODE
)
{
if
(
temp
.
isEmpty
()
)
temp
=
"Playlist"
;
else
temp
+=
" (Playlist)"
;
}
if
(
temp
.
isEmpty
()
)
temp
=
qtr
(
"Unknown"
);
ret
=
temp
;
break
;
case
ML_URI
:
sget
(
psz_uri
);
break
;
case
ML_VOTE
:
if
(
media
->
i_vote
)
iget
(
i_vote
);
break
;
case
ML_YEAR
:
if
(
media
->
i_year
)
iget
(
i_year
);
break
;
default:
break
;
}
vlc_mutex_unlock
(
&
media
->
lock
);
#undef sget
#undef iget
return
ret
;
}
bool
MLItem
::
setData
(
ml_select_e
meta
,
const
QVariant
&
data
)
{
# define setmeta(a) ml_LockMedia(media); free(media->a); \
media->a = strdup( qtu(data.toString()) ); ml_UnlockMedia( media ); \
goto update;
switch
(
meta
)
{
/* String values */
case
ML_ALBUM
:
setmeta
(
psz_album
);
case
ML_ARTIST
:
ml_DeletePersonTypeFromMedia
(
media
,
ML_PERSON_ARTIST
);
ml_CreateAppendPersonAdv
(
&
media
->
p_people
,
ML_PERSON_ARTIST
,
(
char
*
)
qtu
(
data
.
toString
()),
0
);
return
ml_UpdateSimple
(
p_ml
,
ML_MEDIA
,
NULL
,
id
(
MLMEDIA_ID
),
ML_PEOPLE
,
ML_PERSON_ARTIST
,
qtu
(
data
.
toString
()
)
)
==
VLC_SUCCESS
;
case
ML_EXTRA
:
setmeta
(
psz_extra
);
case
ML_GENRE
:
setmeta
(
psz_genre
);
case
ML_ORIGINAL_TITLE
:
setmeta
(
psz_orig_title
);
case
ML_TITLE
:
setmeta
(
psz_title
);
update:
Q_ASSERT
(
qtu
(
data
.
toString
()
)
);
return
ml_UpdateSimple
(
p_ml
,
ML_MEDIA
,
NULL
,
id
(
MLMEDIA_ID
),
meta
,
qtu
(
data
.
toString
()
)
)
==
VLC_SUCCESS
;
/* Modifiable integers */
case
ML_TRACK_NUMBER
:
case
ML_YEAR
:
return
ml_UpdateSimple
(
p_ml
,
ML_MEDIA
,
NULL
,
id
(
MLMEDIA_ID
),
meta
,
data
.
toInt
()
)
==
VLC_SUCCESS
;
// TODO case ML_VOTE:
/* Non modifiable meta */
default:
return
false
;
}
# undef setmeta
}
int
MLItem
::
id
(
int
type
)
{
switch
(
type
)
{
case
INPUTITEM_ID
:
return
inputItem
()
->
i_id
;
case
MLMEDIA_ID
:
return
media
->
i_id
;
default:
case
PLAYLIST_ID
:
assert
(
NULL
);
return
-
1
;
}
}
ml_media_t
*
MLItem
::
getMedia
()
const
{
return
media
;
}
QUrl
MLItem
::
getURI
()
const
{
QString
uri
;
vlc_mutex_lock
(
&
media
->
lock
);
uri
=
qfu
(
media
->
psz_uri
);
vlc_mutex_unlock
(
&
media
->
lock
);
if
(
uri
.
isEmpty
()
)
return
QUrl
();
// This should be rootItem
QUrl
url
=
QUrl
::
fromEncoded
(
uri
.
toUtf8
(),
QUrl
::
TolerantMode
);
if
(
url
.
scheme
().
isEmpty
()
)
url
.
setScheme
(
"file"
);
return
url
;
}
QString
MLItem
::
getTitle
()
const
{
QString
title
;
vlc_mutex_lock
(
&
media
->
lock
);
title
=
QString
(
media
->
psz_title
);
vlc_mutex_unlock
(
&
media
->
lock
);
return
title
;
}
bool
MLItem
::
operator
<
(
MLItem
*
item
)
{
int
ret
=
compareMeta
(
getMedia
(),
item
->
getMedia
(),
ML_ALBUM
);
if
(
ret
==
-
1
)
return
true
;
else
return
false
;
}
#endif
modules/gui/qt4/components/playlist/ml_item.hpp
deleted
100644 → 0
View file @
532b001b
/*****************************************************************************
* ml_item.hpp: the SQL media library's result item
*****************************************************************************
* Copyright (C) 2008-2011 the VideoLAN Team and AUTHORS
* $Id$
*
* Authors: Antoine Lejeune <phytos@videolan.org>
* Jean-Philippe André <jpeg@videolan.org>
* Rémi Duraffort <ivoire@videolan.org>
* Adrien Maglo <magsoft@videolan.org>
* Srikanth Raju <srikiraju#gmail#com>
*
* 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef _MEDIA_LIBRARY_MLITEM_H
#define _MEDIA_LIBRARY_MLITEM_H
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#ifdef SQL_MEDIA_LIBRARY
#include <vlc_common.h>
#include <vlc_interface.h>
#include <vlc_media_library.h>
#include "playlist_item.hpp"
#include "ml_model.hpp"
#include "qt4.hpp"
class
MLModel
;
class
MLItem
:
public
AbstractPLItem
{
friend
class
MLModel
;
public:
MLItem
(
intf_thread_t
*
_p_intf
,
ml_media_t
*
p_media
,
MLItem
*
p_parent
);
virtual
~
MLItem
();
bool
operator
<
(
MLItem
*
item
);
private:
/* AbstractPLItem */
int
id
(
int
type
);
input_item_t
*
inputItem
();
AbstractPLItem
*
child
(
int
row
)
const
;
virtual
QUrl
getURI
()
const
;
virtual
QString
getTitle
()
const
;
/* Local */
QVariant
data
(
ml_select_e
meta
)
const
;
bool
setData
(
ml_select_e
meta
,
const
QVariant
&
data
);
// Media structure connections
ml_media_t
*
getMedia
()
const
;
ml_media_t
*
media
;
media_library_t
*
p_ml
;
};
#endif
#endif
modules/gui/qt4/components/playlist/ml_model.cpp
deleted
100644 → 0
View file @
532b001b
/*****************************************************************************
* ml_model.cpp: the SQL media library's model
*****************************************************************************
* Copyright (C) 2008-2011 the VideoLAN Team and AUTHORS
* $Id$
*
* Authors: Antoine Lejeune <phytos@videolan.org>
* Jean-Philippe André <jpeg@videolan.org>
* Rémi Duraffort <ivoire@videolan.org>
* Adrien Maglo <magsoft@videolan.org>
* Srikanth Raju <srikiraju#gmail#com>
*
* 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#ifdef SQL_MEDIA_LIBRARY
#include <QUrl>
#include <QMenu>
#include <QMimeData>
#include <QApplication>
#include "ml_item.hpp"
#include "ml_model.hpp"
#include "dialogs/playlist.hpp"
#include "components/playlist/sorting.h"
#include "dialogs_provider.hpp"
#include "input_manager.hpp"
/* THEMIM */
#include "util/qt_dirs.hpp"
#include <assert.h>
#include <vlc_intf_strings.h>
static
int
mediaAdded
(
vlc_object_t
*
p_this
,
char
const
*
psz_var
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
data
);
static
int
mediaDeleted
(
vlc_object_t
*
p_this
,
char
const
*
psz_var
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
data
);
static
int
mediaUpdated
(
vlc_object_t
*
p_this
,
char
const
*
psz_var
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
data
);
/* Register ML Events */
const
QEvent
::
Type
MLEvent
::
MediaAdded_Type
=
(
QEvent
::
Type
)
QEvent
::
registerEventType
();
const
QEvent
::
Type
MLEvent
::
MediaRemoved_Type
=
(
QEvent
::
Type
)
QEvent
::
registerEventType
();
const
QEvent
::
Type
MLEvent
::
MediaUpdated_Type
=
(
QEvent
::
Type
)
QEvent
::
registerEventType
();
/**
* @brief Definition of the result item model for the result tree
* @param parent the parent Qt object
*/
MLModel
::
MLModel
(
intf_thread_t
*
_p_intf
,
QObject
*
parent
)
:
VLCModel
(
_p_intf
,
parent
)
{
p_ml
=
ml_Get
(
p_intf
);
if
(
!
p_ml
)
return
;
vlc_array_t
*
p_result_array
=
vlc_array_new
();
if
(
p_result_array
)
{
ml_Find
(
p_ml
,
p_result_array
,
ML_MEDIA
);
insertResultArray
(
p_result_array
);
ml_DestroyResultArray
(
p_result_array
);
vlc_array_destroy
(
p_result_array
);
}
var_AddCallback
(
p_ml
,
"media-added"
,
mediaAdded
,
this
);
var_AddCallback
(
p_ml
,
"media-deleted"
,
mediaDeleted
,
this
);
var_AddCallback
(
p_ml
,
"media-meta-change"
,
mediaUpdated
,
this
);
}
/**
* @brief Simple destructor for the model
*/
MLModel
::~
MLModel
()
{
if
(
!
p_ml
)
return
;
var_DelCallback
(
p_ml
,
"media-meta-change"
,
mediaUpdated
,
this
);
var_DelCallback
(
p_ml
,
"media-deleted"
,
mediaDeleted
,
this
);
var_DelCallback
(
p_ml
,
"media-added"
,
mediaAdded
,
this
);
}
void
MLModel
::
removeAll
()
{
vlc_array_t
*
p_where
=
vlc_array_new
();
if
(
!
p_where
)
return
;
int
rows
=
rowCount
();
if
(
rows
>
0
)
{
beginRemoveRows
(
createIndex
(
0
,
0
),
0
,
rows
-
1
);
QList
<
MLItem
*
>::
iterator
it
=
items
.
begin
();
ml_element_t
p_find
[
items
.
count
()
];
int
i
=
0
;
while
(
it
!=
items
.
end
()
)
{
p_find
[
i
].
criteria
=
ML_ID
;
p_find
[
i
].
value
.
i
=
(
*
it
)
->
id
(
MLMEDIA_ID
);
vlc_array_append
(
p_where
,
&
p_find
[
i
++
]
);
delete
*
it
;
it
++
;
}
ml_Delete
(
p_ml
,
p_where
);
items
.
clear
();
endRemoveRows
();
}
vlc_array_destroy
(
p_where
);
reset
();
}
QModelIndex
MLModel
::
index
(
int
row
,
int
column
,
const
QModelIndex
&
parent
)
const
{
if
(
parent
.
isValid
()
||
row
>=
items
.
count
()
)
return
QModelIndex
();
else
{
QModelIndex
idx
=
createIndex
(
row
,
column
,
items
.
value
(
row
)
);
return
idx
;
}
}
QModelIndex
MLModel
::
parent
(
const
QModelIndex
&
)
const
{
return
QModelIndex
();
}
void
MLModel
::
filter
(
const
QString
&
search_text
,
const
QModelIndex
&
root
,
bool
b_recursive
)
{
Q_UNUSED
(
search_text
);
Q_UNUSED
(
root
);
Q_UNUSED
(
b_recursive
);
/* FIXME */
}
void
MLModel
::
sort
(
const
int
column
,
Qt
::
SortOrder
order
)
{
Q_UNUSED
(
column
);
Q_UNUSED
(
order
);
}
/**
* @brief Return the index of currently playing item
*/
QModelIndex
MLModel
::
currentIndex
()
const
{
input_thread_t
*
p_input_thread
=
THEMIM
->
getInput
();
if
(
!
p_input_thread
)
return
QModelIndex
();
input_item_t
*
p_iitem
=
input_GetItem
(
p_input_thread
);
int
i
=
0
;
foreach
(
MLItem
*
item
,
items
)
{
if
(
item
->
inputItem
()
==
p_iitem
)
return
index
(
i
,
0
);
i
++
;
}
return
QModelIndex
();
}
QModelIndex
MLModel
::
indexByPLID
(
const
int
i_plid
,
const
int
c
)
const
{
Q_UNUSED
(
i_plid
);
Q_UNUSED
(
c
);
return
QModelIndex
();
/* FIXME ? */
}
QModelIndex
MLModel
::
indexByInputItemID
(
const
int
i_inputitem_id
,
const
int
c
)
const
{
Q_UNUSED
(
c
);
foreach
(
MLItem
*
item
,
items
)
if
(
item
->
id
(
INPUTITEM_ID
)
==
i_inputitem_id
)
{
return
index
(
items
.
indexOf
(
item
),
0
);
}
return
QModelIndex
();
}
/**
* @brief This returns the type of data shown in the specified column
* @param column must be valid
* @return The type, or ML_END in case of error
*/
ml_select_e
MLModel
::
columnType
(
int
logicalindex
)
const
{
if
(
logicalindex
<
0
||
logicalindex
>=
columnCount
()
)
return
ML_END
;
return
meta_to_mlmeta
(
columnToMeta
(
logicalindex
)
);
}
Qt
::
ItemFlags
MLModel
::
flags
(
const
QModelIndex
&
index
)
const
{
if
(
!
index
.
isValid
()
)
return
0
;
if
(
isEditable
(
index
)
)
return
Qt
::
ItemIsEnabled
|
Qt
::
ItemIsSelectable
|
Qt
::
ItemIsDragEnabled
|
Qt
::
ItemIsEditable
;
else
return
Qt
::
ItemIsEnabled
|
Qt
::
ItemIsSelectable
|
Qt
::
ItemIsDragEnabled
;
}
bool
MLModel
::
isEditable
(
const
QModelIndex
&
index
)
const
{
if
(
!
index
.
isValid
()
)
return
false
;
ml_select_e
type
=
columnType
(
index
.
column
()
);
switch
(
type
)
{
// Read-only members: not editable
case
ML_ALBUM_ID
:
case
ML_ARTIST_ID
:
case
ML_DURATION
:
case
ML_ID
:
case
ML_LAST_PLAYED
:
case
ML_PLAYED_COUNT
:
case
ML_TYPE
:
return
false
;
// Read-write members: editable
case
ML_ALBUM
:
case
ML_ARTIST
:
case
ML_COVER
:
case
ML_EXTRA
:
case
ML_GENRE
:
case
ML_ORIGINAL_TITLE
:
// case ML_ROLE:
case
ML_SCORE
:
case
ML_TITLE
:
case
ML_TRACK_NUMBER
:
case
ML_URI
:
case
ML_VOTE
:
case
ML_YEAR
:
return
true
;
default:
return
false
;
}
}
QMimeData
*
MLModel
::
mimeData
(
const
QModelIndexList
&
indexes
)
const
{
QList
<
QUrl
>
urls
;
QList
<
int
>
rows
;
foreach
(
QModelIndex
idx
,
indexes
)
{
if
(
rows
.
contains
(
idx
.
row
()
)
)
continue
;
rows
.
append
(
idx
.
row
()
);
AbstractPLItem
*
item
=
static_cast
<
AbstractPLItem
*>
(
idx
.
internalPointer
()
);
urls
.
append
(
item
->
getURI
()
);
}
QMimeData
*
data
=
new
QMimeData
;
data
->
setUrls
(
urls
);
return
data
;
}
int
MLModel
::
rowCount
(
const
QModelIndex
&
parent
)
const
{
if
(
!
parent
.
isValid
()
)
return
items
.
count
();
return
0
;
}
void
MLModel
::
rebuild
(
playlist_item_t
*
p
)
{
Q_UNUSED
(
p
);
emit
layoutChanged
();
}
void
MLModel
::
doDelete
(
QModelIndexList
list
)
{
for
(
int
i
=
0
;
i
<
list
.
count
();
++
i
)
{
const
QModelIndex
&
index
=
list
.
at
(
i
);
if
(
!
index
.
isValid
()
)
break
;
int
id
=
itemId
(
list
.
at
(
i
),
MLMEDIA_ID
);
ml_DeleteSimple
(
p_ml
,
id
);
/* row will be removed by the lib callback */
}
}
bool
MLModel
::
removeRows
(
int
row
,
int
count
,
const
QModelIndex
&
parent
)
{
/* !warn probably not a good idea to expose this as public method */
if
(
row
<
0
||
count
<
0
)
return
false
;
beginRemoveRows
(
parent
,
row
,
row
);
MLItem
*
item
=
items
.
takeAt
(
row
);
assert
(
item
);
if
(
likely
(
item
)
)
delete
item
;
endRemoveRows
();
return
true
;
}
QVariant
MLModel
::
data
(
const
QModelIndex
&
index
,
const
int
role
)
const
{
if
(
index
.
isValid
()
)
{
if
(
role
==
Qt
::
DisplayRole
||
role
==
Qt
::
EditRole
)
{
MLItem
*
it
=
static_cast
<
MLItem
*>
(
index
.
internalPointer
()
);
if
(
!
it
)
return
QVariant
();
QVariant
tmp
=
it
->
data
(
columnType
(
index
.
column
()
)
);
return
tmp
;
}
else
if
(
role
==
Qt
::
DecorationRole
&&
index
.
column
()
==
0
)
{
/*
FIXME: (see ml_type_e)
media->type uses flags for media type information
*/
return
QVariant
(
icons
[
getInputItem
(
index
)
->
i_type
]
);
}
else
if
(
role
==
IsLeafNodeRole
)
return
isLeaf
(
index
);
else
if
(
role
==
IsCurrentsParentNodeRole
)
return
isParent
(
index
,
currentIndex
()
);
else
if
(
role
==
IsCurrentRole
)
{
return
QVariant
(
isCurrent
(
index
)
);
}
}
return
QVariant
();
}
bool
MLModel
::
setData
(
const
QModelIndex
&
idx
,
const
QVariant
&
value
,
int
role
)
{
if
(
role
!=
Qt
::
EditRole
||
!
idx
.
isValid
()
)
return
false
;
MLItem
*
media
=
static_cast
<
MLItem
*>
(
idx
.
internalPointer
()
);
media
->
setData
(
columnType
(
idx
.
column
()
),
value
);
emit
dataChanged
(
idx
,
idx
);
return
true
;
}
/**
* @brief Insert a media to the model in a given row
* @param p_media the media to append
* @param row the future row for this media, -1 to append at the end
* @return a VLC error code
*/
int
MLModel
::
insertMedia
(
ml_media_t
*
p_media
,
int
row
)
{
// Some checks
if
(
!
p_media
||
row
<
-
1
||
row
>
rowCount
()
)
return
VLC_EGENERIC
;
if
(
row
==
-
1
)
row
=
rowCount
();
// Create and insert the item
MLItem
*
item
=
new
MLItem
(
p_intf
,
p_media
,
NULL
);
items
.
append
(
item
);
return
VLC_SUCCESS
;
}
/**
* @brief Insert all medias from a result array to the model
* @param p_result_array the medias to append
* @return see insertMedia
*/
int
MLModel
::
insertResultArray
(
vlc_array_t
*
p_result_array
,
int
row
)
{
int
i_ok
=
VLC_SUCCESS
;
int
count
=
vlc_array_count
(
p_result_array
);
if
(
!
count
)
return
i_ok
;
emit
layoutAboutToBeChanged
();
if
(
row
==
-
1
)
row
=
rowCount
();
// Signal Qt that we will insert rows
beginInsertRows
(
createIndex
(
-
1
,
-
1
),
row
,
row
+
count
-
1
);
// Loop and insert
for
(
int
i
=
0
;
i
<
count
;
++
i
)
{
ml_result_t
*
p_result
=
(
ml_result_t
*
)
vlc_array_item_at_index
(
p_result_array
,
i
);
if
(
!
p_result
||
p_result
->
type
!=
ML_TYPE_MEDIA
)
continue
;
i_ok
=
insertMedia
(
p_result
->
value
.
p_media
,
row
+
i
);
if
(
i_ok
!=
VLC_SUCCESS
)
break
;
}
// Signal we're done
endInsertRows
();
emit
layoutChanged
();
return
i_ok
;
}
bool
MLModel
::
event
(
QEvent
*
event
)
{
if
(
event
->
type
()
==
MLEvent
::
MediaAdded_Type
)
{
event
->
accept
();
MLEvent
*
e
=
static_cast
<
MLEvent
*>
(
event
);
vlc_array_t
*
p_result
=
vlc_array_new
();
if
(
ml_FindMedia
(
e
->
p_ml
,
p_result
,
ML_ID
,
e
->
ml_media_id
)
==
VLC_SUCCESS
)
{
insertResultArray
(
p_result
);
ml_DestroyResultArray
(
p_result
);
}
vlc_array_destroy
(
p_result
);
return
true
;
}
else
if
(
event
->
type
()
==
MLEvent
::
MediaRemoved_Type
)
{
event
->
accept
();
MLEvent
*
e
=
static_cast
<
MLEvent
*>
(
event
);
removeRow
(
getIndexByMLID
(
e
->
ml_media_id
).
row
()
);
return
true
;
}
else
if
(
event
->
type
()
==
MLEvent
::
MediaUpdated_Type
)
{
event
->
accept
();
/* Never implemented... */
return
true
;
}
return
VLCModel
::
event
(
event
);
}
/** **************************************************************************
* \brief Add a media to the playlist
*
* \param id the item id
* @todo this code must definitely be done by the ML core
*****************************************************************************/
static
void
AddItemToPlaylist
(
int
i_media_id
,
bool
bPlay
,
media_library_t
*
p_ml
,
bool
bRenew
)
{
input_item_t
*
p_item
=
ml_CreateInputItem
(
p_ml
,
i_media_id
);
if
(
!
p_item
)
{
msg_Dbg
(
p_ml
,
"unable to create input item for media %d"
,
i_media_id
);
return
;
}
playlist_t
*
p_playlist
=
THEPL
;
playlist_item_t
*
p_playlist_item
=
NULL
;
playlist_Lock
(
p_playlist
);
if
(
!
bRenew
)
{
p_playlist_item
=
playlist_ItemGetByInput
(
p_playlist
,
p_item
);
}
if
(
!
p_playlist_item
||
p_playlist_item
->
i_id
==
1
)
{
playlist_AddInput
(
p_playlist
,
p_item
,
PLAYLIST_APPEND
,
PLAYLIST_END
,
true
,
true
);
p_playlist_item
=
playlist_ItemGetByInput
(
p_playlist
,
p_item
);
}
playlist_Unlock
(
p_playlist
);
if
(
!
p_playlist_item
||
p_playlist_item
->
i_id
==
1
)
{
msg_Dbg
(
p_ml
,
"could not find playlist item %s (%s:%d)"
,
p_item
->
psz_name
,
__FILE__
,
__LINE__
);
return
;
}
/* Auto play item */
if
(
bPlay
)
// || p_playlist->status.i_status == PLAYLIST_STOPPED )
{
playlist_Control
(
p_playlist
,
PLAYLIST_VIEWPLAY
,
false
,
NULL
,
p_playlist_item
);
}
vlc_gc_decref
(
p_item
);
}
void
MLModel
::
activateItem
(
const
QModelIndex
&
idx
)
{
if
(
!
idx
.
isValid
()
)
return
;
AddItemToPlaylist
(
itemId
(
idx
,
MLMEDIA_ID
),
true
,
p_ml
,
true
);
}
bool
MLModel
::
action
(
QAction
*
action
,
const
QModelIndexList
&
indexes
)
{
actionsContainerType
a
=
action
->
data
().
value
<
actionsContainerType
>
();
input_item_t
*
p_input
;
switch
(
a
.
action
)
{
case
ACTION_PLAY
:
if
(
!
indexes
.
empty
()
&&
indexes
.
first
().
isValid
()
)
{
activateItem
(
indexes
.
first
()
);
return
true
;
}
break
;
case
ACTION_ADDTOPLAYLIST
:
foreach
(
const
QModelIndex
&
index
,
indexes
)
{
if
(
!
index
.
isValid
()
)
return
false
;
AddItemToPlaylist
(
itemId
(
index
,
MLMEDIA_ID
),
false
,
p_ml
,
true
);
}
return
true
;
case
ACTION_REMOVE
:
doDelete
(
indexes
);
return
true
;
case
ACTION_SORT
:
break
;
case
ACTION_CLEAR
:
removeAll
();
return
true
;
case
ACTION_ENQUEUEFILE
:
foreach
(
const
QString
&
uri
,
a
.
uris
)
playlist_Add
(
THEPL
,
uri
.
toAscii
().
constData
(),
NULL
,
PLAYLIST_APPEND
|
PLAYLIST_PREPARSE
,
PLAYLIST_END
,
false
,
pl_Unlocked
);
return
true
;
case
ACTION_ENQUEUEDIR
:
if
(
a
.
uris
.
isEmpty
()
)
return
false
;
p_input
=
input_item_New
(
a
.
uris
.
first
().
toAscii
().
constData
(),
NULL
);
if
(
unlikely
(
p_input
==
NULL
)
)
return
false
;
/* FIXME: playlist_AddInput() can fail */
playlist_AddInput
(
THEPL
,
p_input
,
PLAYLIST_APPEND
,
PLAYLIST_END
,
true
,
pl_Unlocked
);
vlc_gc_decref
(
p_input
);
return
true
;
case
ACTION_ENQUEUEGENERIC
:
foreach
(
const
QString
&
uri
,
a
.
uris
)
{
p_input
=
input_item_New
(
qtu
(
uri
),
NULL
);
/* Insert options */
foreach
(
const
QString
&
option
,
a
.
options
.
split
(
" :"
)
)
{
QString
temp
=
colon_unescape
(
option
);
if
(
!
temp
.
isEmpty
()
)
input_item_AddOption
(
p_input
,
qtu
(
temp
),
VLC_INPUT_OPTION_TRUSTED
);
}
/* FIXME: playlist_AddInput() can fail */
playlist_AddInput
(
THEPL
,
p_input
,
PLAYLIST_APPEND
|
PLAYLIST_PREPARSE
,
PLAYLIST_END
,
false
,
pl_Unlocked
);
vlc_gc_decref
(
p_input
);
}
return
true
;
default:
break
;
}
return
false
;
}
bool
MLModel
::
isSupportedAction
(
actions
action
,
const
QModelIndex
&
index
)
const
{
switch
(
action
)
{
case
ACTION_ADDTOPLAYLIST
:
return
index
.
isValid
();
case
ACTION_SORT
:
return
false
;
case
ACTION_PLAY
:
case
ACTION_STREAM
:
case
ACTION_SAVE
:
case
ACTION_INFO
:
case
ACTION_REMOVE
:
return
index
.
isValid
();
case
ACTION_EXPLORE
:
if
(
index
.
isValid
()
)
return
getURI
(
index
).
startsWith
(
"file://"
);
case
ACTION_CREATENODE
:
return
false
;
case
ACTION_CLEAR
:
return
rowCount
()
&&
canEdit
();
case
ACTION_ENQUEUEFILE
:
case
ACTION_ENQUEUEDIR
:
case
ACTION_ENQUEUEGENERIC
:
return
canEdit
();
default:
return
false
;
}
return
false
;
}
QModelIndex
MLModel
::
rootIndex
()
const
{
// FIXME
return
QModelIndex
();
}
bool
MLModel
::
isTree
()
const
{
// FIXME ?
return
false
;
}
bool
MLModel
::
canEdit
()
const
{
/* can always insert */
return
true
;
}
QModelIndex
MLModel
::
getIndexByMLID
(
int
id
)
const
{
for
(
int
i
=
0
;
i
<
rowCount
(
);
i
++
)
{
QModelIndex
idx
=
index
(
i
,
0
);
MLItem
*
item
=
static_cast
<
MLItem
*
>
(
idx
.
internalPointer
()
);
if
(
item
->
id
(
MLMEDIA_ID
)
==
id
)
return
idx
;
}
return
QModelIndex
();
}
bool
MLModel
::
isParent
(
const
QModelIndex
&
index
,
const
QModelIndex
&
current
)
const
{
Q_UNUSED
(
index
);
Q_UNUSED
(
current
);
return
false
;
}
bool
MLModel
::
isLeaf
(
const
QModelIndex
&
index
)
const
{
Q_UNUSED
(
index
);
return
true
;
}
/* ML Callbacks handling */
inline
void
postMLEvent
(
vlc_object_t
*
p_this
,
QEvent
::
Type
type
,
void
*
data
,
int32_t
i
)
{
MLModel
*
p_model
=
static_cast
<
MLModel
*>
(
data
);
media_library_t
*
p_ml
=
(
media_library_t
*
)
p_this
;
QApplication
::
postEvent
(
p_model
,
new
MLEvent
(
type
,
p_ml
,
i
)
);
}
static
int
mediaAdded
(
vlc_object_t
*
p_this
,
char
const
*
psz_var
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
data
)
{
VLC_UNUSED
(
psz_var
);
VLC_UNUSED
(
oldval
);
postMLEvent
(
p_this
,
MLEvent
::
MediaAdded_Type
,
data
,
newval
.
i_int
);
return
VLC_SUCCESS
;
}
static
int
mediaDeleted
(
vlc_object_t
*
p_this
,
char
const
*
psz_var
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
data
)
{
VLC_UNUSED
(
psz_var
);
VLC_UNUSED
(
oldval
);
postMLEvent
(
p_this
,
MLEvent
::
MediaRemoved_Type
,
data
,
newval
.
i_int
);
return
VLC_SUCCESS
;
}
static
int
mediaUpdated
(
vlc_object_t
*
p_this
,
char
const
*
psz_var
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
data
)
{
VLC_UNUSED
(
psz_var
);
VLC_UNUSED
(
oldval
);
postMLEvent
(
p_this
,
MLEvent
::
MediaUpdated_Type
,
data
,
newval
.
i_int
);
return
VLC_SUCCESS
;
}
#endif
modules/gui/qt4/components/playlist/ml_model.hpp
deleted
100644 → 0
View file @
532b001b
/*****************************************************************************
* ml_model.hpp SQL ML model
*****************************************************************************
* Copyright (C) 2008-2011 the VideoLAN Team and AUTHORS
* $Id$
*
* Authors: Antoine Lejeune <phytos@videolan.org>
* Jean-Philippe André <jpeg@videolan.org>
* Rémi Duraffort <ivoire@videolan.org>
* Adrien Maglo <magsoft@videolan.org>
* Srikanth Raju <srikiraju#gmail#com>
*
* 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef _MEDIA_LIBRARY_MLMODEL_H
#define _MEDIA_LIBRARY_MLMODEL_H
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#ifdef SQL_MEDIA_LIBRARY
#include <vlc_common.h>
#include <vlc_interface.h>
#include <vlc_media_library.h>
#include "components/playlist/vlc_model.hpp"
#include "ml_item.hpp"
#include "qt4.hpp"
#include <QMutex>
#include <QEvent>
class
MLItem
;
/** *************************************************************************
* \brief ML Events class because we don't want direct callbacks
****************************************************************************/
class
MLEvent
:
public
QEvent
{
public:
static
const
QEvent
::
Type
MediaAdded_Type
;
static
const
QEvent
::
Type
MediaRemoved_Type
;
static
const
QEvent
::
Type
MediaUpdated_Type
;
MLEvent
(
QEvent
::
Type
type
,
media_library_t
*
_p_ml
,
int32_t
_ml_media_id
)
:
QEvent
(
type
),
ml_media_id
(
_ml_media_id
),
p_ml
(
_p_ml
)
{};
int32_t
ml_media_id
;
media_library_t
*
p_ml
;
/* store instance */
};
/** *************************************************************************
* \brief Tree model for the result list
****************************************************************************/
class
MLModel
:
public
VLCModel
{
Q_OBJECT
;
public:
// Basic QAbstractItemModel implementation
MLModel
(
intf_thread_t
*
_p_intf
,
QObject
*
parent
=
NULL
);
virtual
~
MLModel
();
QVariant
data
(
const
QModelIndex
&
idx
,
const
int
role
=
Qt
::
DisplayRole
)
const
;
bool
setData
(
const
QModelIndex
&
idx
,
const
QVariant
&
value
,
int
role
=
Qt
::
EditRole
);
QModelIndex
index
(
int
row
,
int
column
,
const
QModelIndex
&
parent
=
QModelIndex
()
)
const
;
int
rowCount
(
const
QModelIndex
&
parent
=
QModelIndex
()
)
const
;
QModelIndex
parent
(
const
QModelIndex
&
)
const
;
Qt
::
ItemFlags
flags
(
const
QModelIndex
&
)
const
;
QMimeData
*
mimeData
(
const
QModelIndexList
&
indexes
)
const
;
virtual
bool
removeRows
(
int
row
,
int
count
,
const
QModelIndex
&
parent
=
QModelIndex
()
);
virtual
void
sort
(
const
int
column
,
Qt
::
SortOrder
order
=
Qt
::
AscendingOrder
);
// Custom functions
bool
isEditable
(
const
QModelIndex
&
)
const
;
ml_select_e
columnType
(
int
column
)
const
;
virtual
bool
event
(
QEvent
*
e
);
QModelIndex
getIndexByMLID
(
int
id
)
const
;
/* VLCModelSubInterface */
virtual
void
rebuild
(
playlist_item_t
*
p
=
NULL
);
virtual
void
doDelete
(
QModelIndexList
selected
);
virtual
void
createNode
(
QModelIndex
,
QString
)
{};
virtual
void
removeAll
();
virtual
QModelIndex
rootIndex
()
const
;
virtual
void
filter
(
const
QString
&
search_text
,
const
QModelIndex
&
root
,
bool
b_recursive
);
virtual
QModelIndex
currentIndex
()
const
;
virtual
QModelIndex
indexByPLID
(
const
int
i_plid
,
const
int
c
)
const
;
virtual
QModelIndex
indexByInputItemID
(
const
int
i_inputitem_id
,
const
int
c
)
const
;
virtual
bool
isTree
()
const
;
virtual
bool
canEdit
()
const
;
virtual
bool
action
(
QAction
*
action
,
const
QModelIndexList
&
indexes
);
virtual
bool
isSupportedAction
(
actions
action
,
const
QModelIndex
&
)
const
;
/* VLCModelSubInterface virtual slots */
virtual
void
activateItem
(
const
QModelIndex
&
index
);
protected:
/* VLCModel subclassing */
bool
isParent
(
const
QModelIndex
&
index
,
const
QModelIndex
&
current
)
const
;
bool
isLeaf
(
const
QModelIndex
&
index
)
const
;
private:
/* custom */
int
insertMedia
(
ml_media_t
*
p_media
,
int
row
=
-
1
);
int
insertResultArray
(
vlc_array_t
*
p_result_array
,
int
row
=
-
1
);
QList
<
MLItem
*
>
items
;
media_library_t
*
p_ml
;
};
#endif
#endif
modules/gui/qt4/components/playlist/playlist.cpp
View file @
2f353e18
...
...
@@ -30,7 +30,6 @@
#include "components/playlist/standardpanel.hpp"
/* MainView */
#include "components/playlist/selector.hpp"
/* PLSelector */
#include "components/playlist/playlist_model.hpp"
/* PLModel */
#include "components/playlist/ml_model.hpp"
/* MLModel */
#include "components/interface_widgets.hpp"
/* CoverArtLabel */
#include "util/searchlineedit.hpp"
...
...
@@ -100,11 +99,6 @@ PlaylistWidget::PlaylistWidget( intf_thread_t *_p_i, QWidget *_par )
model
->
setModel
(
VLCProxyModel
::
PL_MODEL
,
plmodel
);
model
->
switchToModel
(
VLCProxyModel
::
PL_MODEL
);
#ifdef SQL_MEDIA_LIBRARY
MLModel
*
mlmodel
=
new
MLModel
(
p_intf
,
model
);
model
->
setModel
(
VLCProxyModel
::
SQLML_MODEL
,
mlmodel
);
#endif
mainView
=
new
StandardPLPanel
(
this
,
p_intf
,
p_root
,
selector
,
model
);
/* Location Bar */
...
...
modules/gui/qt4/components/playlist/selector.cpp
View file @
2f353e18
...
...
@@ -240,12 +240,6 @@ void PLSelector::createItems()
ml
->
treeItem
()
->
setData
(
0
,
SPECIAL_ROLE
,
QVariant
(
IS_ML
)
);
ml
->
treeItem
()
->
setData
(
0
,
Qt
::
DecorationRole
,
QIcon
(
":/sidebar/library"
)
);
#ifdef SQL_MEDIA_LIBRARY
/* SQL ML */
ml
=
addItem
(
SQL_ML_TYPE
,
"SQL Media Library"
)
->
treeItem
();
ml
->
treeItem
()
->
setData
(
0
,
Qt
::
DecorationRole
,
QIcon
(
":/sidebar/library"
)
);
#endif
/* SD nodes */
QTreeWidgetItem
*
mycomp
=
addItem
(
CATEGORY_TYPE
,
N_
(
"My Computer"
),
false
,
true
)
->
treeItem
();
QTreeWidgetItem
*
devices
=
addItem
(
CATEGORY_TYPE
,
N_
(
"Devices"
),
false
,
true
)
->
treeItem
();
...
...
@@ -377,14 +371,6 @@ void PLSelector::setSource( QTreeWidgetItem *item )
item
->
setData
(
0
,
CAP_SEARCH_ROLE
,
true
);
}
}
#ifdef SQL_MEDIA_LIBRARY
else
if
(
i_type
==
SQL_ML_TYPE
)
{
emit
categoryActivated
(
NULL
,
true
);
curItem
=
item
;
return
;
}
#endif
curItem
=
item
;
...
...
modules/gui/qt4/components/playlist/standardpanel.cpp
View file @
2f353e18
...
...
@@ -30,7 +30,6 @@
#include "components/playlist/vlc_model.hpp"
/* VLCModel */
#include "components/playlist/playlist_model.hpp"
/* PLModel */
#include "components/playlist/ml_model.hpp"
/* MLModel */
#include "components/playlist/views.hpp"
/* 3 views */
#include "components/playlist/selector.hpp"
/* PLSelector */
#include "util/animators.hpp"
/* PixmapAnimator */
...
...
@@ -478,21 +477,9 @@ void StandardPLPanel::searchDelayed( const QString& searchText )
/* This activated by the selector selection */
void
StandardPLPanel
::
setRootItem
(
playlist_item_t
*
p_item
,
bool
b
)
{
#ifdef SQL_MEDIA_LIBRARY
if
(
b
)
{
msg_Dbg
(
p_intf
,
"Setting the SQL ML"
);
if
(
model
->
switchToModel
(
VLCProxyModel
::
SQLML_MODEL
)
)
currentView
->
setModel
(
model
);
}
else
#else
Q_UNUSED
(
b
);
#endif
{
if
(
model
->
switchToModel
(
VLCProxyModel
::
PL_MODEL
)
)
model
->
rebuild
(
p_item
);
}
if
(
model
->
switchToModel
(
VLCProxyModel
::
PL_MODEL
)
)
model
->
rebuild
(
p_item
);
}
void
StandardPLPanel
::
browseInto
(
const
QModelIndex
&
index
)
...
...
modules/gui/qt4/components/simple_preferences.cpp
View file @
2f353e18
...
...
@@ -29,7 +29,6 @@
#include "components/simple_preferences.hpp"
#include "components/preferences_widgets.hpp"
#include "dialogs/ml_configuration.hpp"
#include <vlc_config_cat.h>
#include <vlc_configuration.h>
...
...
@@ -749,11 +748,6 @@ SPrefsPanel::SPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent,
#else
ui
.
osGroupBox
->
hide
();
#endif
#ifdef SQL_MEDIA_LIBRARY
BUTTONACT
(
ui
.
sqlMLbtn
,
configML
()
);
#else
ui
.
sqlMLbtn
->
hide
();
#endif
/* interface */
char
*
psz_intf
=
config_GetPsz
(
p_intf
,
"intf"
);
...
...
modules/gui/qt4/dialogs/ml_configuration.cpp
deleted
100644 → 0
View file @
532b001b
/*****************************************************************************
* ml_configuration.cpp: SQL ML's configuration dialog (folder view)
*****************************************************************************
* Copyright (C) 2008-2010 the VideoLAN Team and AUTHORS
* $Id$
*
* Authors: Antoine Lejeune <phytos@videolan.org>
* Jean-Philippe André <jpeg@videolan.org>
* Rémi Duraffort <ivoire@videolan.org>
* Adrien Maglo <magsoft@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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#ifdef SQL_MEDIA_LIBRARY
#include "ml_configuration.hpp"
#include <QTreeView>
#include <QPushButton>
#include <QDialogButtonBox>
MLConfDialog
*
MLConfDialog
::
instance
=
NULL
;
/** **************************************************************************
* MODEL FOR THE FILESYSTEM
*****************************************************************************/
Qt
::
ItemFlags
MLDirModel
::
flags
(
const
QModelIndex
&
index
)
const
{
Qt
::
ItemFlags
flags
=
QDirModel
::
flags
(
index
);
flags
|=
Qt
::
ItemIsUserCheckable
;
if
(
b_recursive
)
{
for
(
int
i
=
0
;
i
<
monitoredDirs
.
count
();
i
++
)
{
if
(
filePath
(
index
).
startsWith
(
monitoredDirs
.
at
(
i
)
)
)
{
if
(
monitoredDirs
.
at
(
i
)
!=
filePath
(
index
)
)
flags
^=
Qt
::
ItemIsEnabled
;
break
;
}
}
}
return
flags
;
}
QVariant
MLDirModel
::
data
(
const
QModelIndex
&
index
,
int
role
)
const
{
if
(
index
.
column
()
==
0
&&
role
==
Qt
::
CheckStateRole
)
{
if
(
itemCheckState
.
contains
(
filePath
(
index
)
)
)
return
itemCheckState
.
value
(
filePath
(
index
)
);
else
if
(
b_recursive
)
{
for
(
int
i
=
0
;
i
<
monitoredDirs
.
count
();
i
++
)
{
if
(
filePath
(
index
).
startsWith
(
monitoredDirs
.
at
(
i
)
)
)
return
Qt
::
Checked
;
}
return
Qt
::
Unchecked
;
}
else
return
Qt
::
Unchecked
;
}
return
QDirModel
::
data
(
index
,
role
);
}
bool
MLDirModel
::
setData
(
const
QModelIndex
&
index
,
const
QVariant
&
value
,
int
role
)
{
QModelIndex
idx
;
QModelIndex
topLeft
,
bottomRight
;
// index to signal they have changed
if
(
role
==
Qt
::
CheckStateRole
)
{
if
(
value
==
Qt
::
Checked
)
{
monitoredDirs
<<
filePath
(
index
);
itemCheckState
[
filePath
(
index
)]
=
Qt
::
Checked
;
/* We have to make his parents Qt::PartiallyChecked */
idx
=
index
.
parent
();
while
(
idx
!=
QModelIndex
()
)
{
if
(
!
(
!
b_recursive
&&
monitoredDirs
.
contains
(
filePath
(
idx
)
)
)
)
itemCheckState
[
filePath
(
idx
)]
=
Qt
::
PartiallyChecked
;
topLeft
=
idx
;
idx
=
idx
.
parent
();
}
/* We have to remove his children that are monitored if we are
in recursive mode */
if
(
b_recursive
)
{
for
(
int
i
=
0
;
i
<
monitoredDirs
.
count
()
-
1
;
i
++
)
{
if
(
monitoredDirs
.
at
(
i
).
startsWith
(
filePath
(
index
)
)
)
{
itemCheckState
.
take
(
monitoredDirs
.
at
(
i
)
);
monitoredDirs
.
removeAt
(
i
);
i
--
;
}
}
}
}
else
if
(
monitoredDirs
.
removeOne
(
filePath
(
index
)
)
)
{
itemCheckState
.
take
(
filePath
(
index
)
);
/* We have to make his parent Qt::Unchecked
if index is his only child */
for
(
idx
=
index
.
parent
();
idx
!=
QModelIndex
();
idx
=
idx
.
parent
()
)
{
if
(
monitoredDirs
.
count
()
==
0
)
{
itemCheckState
.
take
(
filePath
(
idx
)
);
topLeft
=
idx
;
continue
;
}
for
(
int
i
=
0
;
i
<
monitoredDirs
.
count
();
i
++
)
{
if
(
monitoredDirs
.
at
(
i
).
startsWith
(
filePath
(
idx
)
)
)
break
;
itemCheckState
.
take
(
filePath
(
idx
)
);
topLeft
=
idx
;
}
}
}
emit
dataChanged
(
topLeft
,
index
);
return
true
;
}
return
QDirModel
::
setData
(
index
,
value
,
role
);
}
int
MLDirModel
::
columnCount
(
const
QModelIndex
&
)
const
{
return
1
;
}
void
MLDirModel
::
reset
(
bool
_b_recursive
,
vlc_array_t
*
p_array
)
{
b_recursive
=
_b_recursive
;
itemCheckState
.
clear
();
monitoredDirs
.
clear
();
for
(
int
i
=
0
;
i
<
vlc_array_count
(
p_array
);
i
++
)
{
setData
(
index
(
qfu
((
char
*
)
vlc_array_item_at_index
(
p_array
,
i
))
),
Qt
::
Checked
,
Qt
::
CheckStateRole
);
}
emit
layoutChanged
();
}
void
MLDirModel
::
setRecursivity
(
bool
_b_recursive
)
{
/* If the selection becomes recursive, we may have to delete from
monitoredDirs some directories */
if
(
!
b_recursive
&&
_b_recursive
)
{
for
(
int
i
=
0
;
i
<
monitoredDirs
.
count
();
i
++
)
{
for
(
int
j
=
i
+
1
;
j
<
monitoredDirs
.
count
();
j
++
)
{
if
(
monitoredDirs
.
at
(
i
).
startsWith
(
monitoredDirs
.
at
(
j
)
)
)
{
setData
(
index
(
monitoredDirs
.
at
(
i
)
),
Qt
::
Unchecked
,
Qt
::
CheckStateRole
);
i
--
;
}
else
if
(
monitoredDirs
.
at
(
j
).
startsWith
(
monitoredDirs
.
at
(
i
)
)
)
setData
(
index
(
monitoredDirs
.
at
(
j
)
),
Qt
::
Unchecked
,
Qt
::
CheckStateRole
);
}
}
}
b_recursive
=
_b_recursive
;
emit
layoutChanged
();
}
/** **************************************************************************
* PREFERENCES DIALOG FOR THE MEDIA LIBRARY
*****************************************************************************/
MLConfDialog
::
MLConfDialog
(
QWidget
*
parent
,
intf_thread_t
*
_p_intf
)
:
QVLCDialog
(
parent
,
_p_intf
),
p_intf
(
_p_intf
)
{
p_monitored_dirs
=
NULL
;
setWindowTitle
(
qtr
(
"Media library Preferences"
)
);
setMinimumSize
(
400
,
300
);
setParent
(
parent
,
Qt
::
Window
);
setWindowModality
(
Qt
::
NonModal
);
resize
(
550
,
450
);
QGridLayout
*
main_layout
=
new
QGridLayout
(
this
);
/* Directories selection */
QStringList
nameFilters
;
model
=
new
MLDirModel
(
nameFilters
,
QDir
::
Dirs
|
QDir
::
NoDotAndDotDot
,
QDir
::
Name
,
this
);
QTreeView
*
tree
=
new
QTreeView
(
this
);
tree
->
setModel
(
model
);
/* recursivity */
recursivity
=
new
QCheckBox
(
qtr
(
"Subdirectory recursive scanning"
)
);
synchronous
=
new
QCheckBox
(
qtr
(
"Use safe transactions"
)
);
/* Buttons */
QDialogButtonBox
*
buttonsBox
=
new
QDialogButtonBox
();
QPushButton
*
save
=
new
QPushButton
(
qtr
(
"&Save"
)
);
QPushButton
*
cancel
=
new
QPushButton
(
qtr
(
"&Cancel"
)
);
QPushButton
*
reset
=
new
QPushButton
(
qtr
(
"&Reset"
)
);
buttonsBox
->
addButton
(
save
,
QDialogButtonBox
::
AcceptRole
);
buttonsBox
->
addButton
(
cancel
,
QDialogButtonBox
::
RejectRole
);
buttonsBox
->
addButton
(
reset
,
QDialogButtonBox
::
ResetRole
);
main_layout
->
addWidget
(
tree
,
0
,
0
);
main_layout
->
addWidget
(
recursivity
,
1
,
0
);
main_layout
->
addWidget
(
synchronous
,
2
,
0
);
main_layout
->
addWidget
(
buttonsBox
,
3
,
0
);
p_ml
=
ml_Get
(
p_intf
);
init
();
BUTTONACT
(
save
,
save
()
);
BUTTONACT
(
cancel
,
cancel
()
);
BUTTONACT
(
reset
,
reset
()
);
CONNECT
(
recursivity
,
toggled
(
bool
),
model
,
setRecursivity
(
bool
)
);
}
void
MLConfDialog
::
init
()
{
bool
b_recursive
=
var_CreateGetBool
(
p_ml
,
"ml-recursive-scan"
);
recursivity
->
setChecked
(
b_recursive
);
bool
b_sync
=
var_CreateGetBool
(
p_ml
,
"ml-synchronous"
);
synchronous
->
setChecked
(
b_sync
);
if
(
p_monitored_dirs
)
vlc_array_destroy
(
p_monitored_dirs
);
p_monitored_dirs
=
vlc_array_new
();
ml_Control
(
p_ml
,
ML_GET_MONITORED
,
p_monitored_dirs
);
model
->
reset
(
b_recursive
,
p_monitored_dirs
);
}
void
MLConfDialog
::
save
()
{
QStringList
newDirs
=
model
->
monitoredDirs
;
QStringList
toDelete
;
for
(
int
i
=
0
;
i
<
vlc_array_count
(
p_monitored_dirs
);
i
++
)
{
if
(
newDirs
.
removeAll
(
qfu
((
char
*
)
vlc_array_item_at_index
(
p_monitored_dirs
,
i
))
)
==
0
)
{
toDelete
<<
qfu
((
char
*
)
vlc_array_item_at_index
(
p_monitored_dirs
,
i
));
}
}
for
(
int
i
=
0
;
i
<
toDelete
.
count
();
i
++
)
{
ml_Control
(
p_ml
,
ML_DEL_MONITORED
,
qtu
(
toDelete
.
at
(
i
)
)
);
}
for
(
int
i
=
0
;
i
<
newDirs
.
count
();
i
++
)
{
ml_Control
(
p_ml
,
ML_ADD_MONITORED
,
qtu
(
newDirs
.
at
(
i
)
)
);
}
var_SetBool
(
p_ml
,
"ml-recursive-scan"
,
recursivity
->
isChecked
()
);
var_SetBool
(
p_ml
,
"ml-synchronous"
,
synchronous
->
isChecked
()
);
init
();
hide
();
}
void
MLConfDialog
::
cancel
()
{
init
();
hide
();
}
void
MLConfDialog
::
reset
()
{
init
();
}
#endif
modules/gui/qt4/dialogs/ml_configuration.hpp
deleted
100644 → 0
View file @
532b001b
/*****************************************************************************
* ml_configuration.hpp: SQL ML's configuration dialog (folder view)
*****************************************************************************
* Copyright (C) 2008-2010 the VideoLAN Team and AUTHORS
* $Id$
*
* Authors: Antoine Lejeune <phytos@videolan.org>
* Jean-Philippe André <jpeg@videolan.org>
* Rémi Duraffort <ivoire@videolan.org>
* Adrien Maglo <magsoft@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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef _MEDIA_LIBRARY_CONFIG_H
#define _MEDIA_LIBRARY_CONFIG_H
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#ifdef SQL_MEDIA_LIBRARY
#include <vlc_common.h>
#include <vlc_media_library.h>
#include "util/qvlcframe.hpp"
#include <QDirModel>
#include <QCheckBox>
#include <QDialogButtonBox>
#include <QPushButton>
/** Classes in this header */
class
MLDirModel
;
class
MLConfDialog
;
/** *************************************************************************
* \brief Model representing the filesystem and whose items are checkable
****************************************************************************/
class
MLDirModel
:
public
QDirModel
{
Q_OBJECT
;
public:
MLDirModel
(
const
QStringList
&
nameFilters
,
QDir
::
Filters
filters
,
QDir
::
SortFlags
sort
,
QObject
*
parent
=
0
)
:
QDirModel
(
nameFilters
,
filters
,
sort
,
parent
)
{};
virtual
Qt
::
ItemFlags
flags
(
const
QModelIndex
&
index
)
const
;
virtual
QVariant
data
(
const
QModelIndex
&
index
,
int
role
)
const
;
virtual
bool
setData
(
const
QModelIndex
&
index
,
const
QVariant
&
value
,
int
role
=
Qt
::
EditRole
);
int
columnCount
(
const
QModelIndex
&
parent
=
QModelIndex
()
)
const
;
void
reset
(
bool
,
vlc_array_t
*
);
QStringList
monitoredDirs
;
private:
bool
b_recursive
;
QMap
<
QString
,
Qt
::
CheckState
>
itemCheckState
;
intf_thread_t
*
p_intf
;
media_library_t
*
p_ml
;
public
slots
:
void
setRecursivity
(
bool
);
};
/** *************************************************************************
* \brief Configuration dialog for the media library
****************************************************************************/
class
MLConfDialog
:
public
QVLCDialog
{
Q_OBJECT
;
public:
MLConfDialog
(
QWidget
*
,
intf_thread_t
*
);
private:
void
init
();
vlc_array_t
*
p_monitored_dirs
;
media_library_t
*
p_ml
;
intf_thread_t
*
p_intf
;
MLDirModel
*
model
;
QCheckBox
*
recursivity
;
QCheckBox
*
synchronous
;
static
MLConfDialog
*
instance
;
private
slots
:
void
save
();
void
cancel
();
void
reset
();
void
close
()
{
save
();
};
};
#endif
#endif
modules/gui/qt4/ui/sprefs_interface.ui
View file @
2f353e18
...
...
@@ -8,7 +8,7 @@
<x>
0
</x>
<y>
0
</y>
<width>
686
</width>
<height>
6
56
</height>
<height>
6
67
</height>
</rect>
</property>
<property
name=
"sizePolicy"
>
...
...
@@ -318,16 +318,7 @@
</sizepolicy>
</property>
<layout
class=
"QGridLayout"
name=
"gridLayout_7"
>
<property
name=
"leftMargin"
>
<number>
0
</number>
</property>
<property
name=
"topMargin"
>
<number>
0
</number>
</property>
<property
name=
"rightMargin"
>
<number>
0
</number>
</property>
<property
name=
"bottomMargin"
>
<property
name=
"margin"
>
<number>
0
</number>
</property>
<item
row=
"1"
column=
"1"
>
...
...
@@ -432,48 +423,41 @@
</property>
</widget>
</item>
<item
row=
"
2
"
column=
"0"
>
<widget
class=
"QCheckBox"
name=
"
treePlaylist
"
>
<item
row=
"
0
"
column=
"0"
>
<widget
class=
"QCheckBox"
name=
"
OneInterfaceMode
"
>
<property
name=
"text"
>
<string>
Display playlist tre
e
</string>
<string>
Allow only one instanc
e
</string>
</property>
</widget>
</item>
<item
row=
"
0"
column=
"1
"
>
<widget
class=
"QCheckBox"
name=
"
EnqueueOneInterfaceMod
e"
>
<item
row=
"
1"
column=
"0"
colspan=
"2
"
>
<widget
class=
"QCheckBox"
name=
"
oneInstanceFromFil
e"
>
<property
name=
"text"
>
<string>
Enqueue items into playlist in one instance mode
</string>
<string>
Use only one instance when started from file manager
</string>
</property>
</widget>
</item>
<item
row=
"2"
column=
"
1
"
>
<widget
class=
"QCheckBox"
name=
"
playPauseBox
"
>
<item
row=
"2"
column=
"
0
"
>
<widget
class=
"QCheckBox"
name=
"
treePlaylist
"
>
<property
name=
"text"
>
<string>
Pause on the last frame of a video
</string>
<string>
Display playlist tree
</string>
</property>
</widget>
</item>
<item
row=
"
0"
column=
"0
"
>
<widget
class=
"QCheckBox"
name=
"
OneInterfaceMode
"
>
<item
row=
"
2"
column=
"1
"
>
<widget
class=
"QCheckBox"
name=
"
playPauseBox
"
>
<property
name=
"text"
>
<string>
Allow only one instance
</string>
<string>
Pause on the last frame of a video
</string>
</property>
</widget>
</item>
<item
row=
"4"
column=
"1"
>
<widget
class=
"QComboBox"
name=
"artFetcher"
/>
</item>
<item
row=
"5"
column=
"0"
>
<widget
class=
"QPushButton"
name=
"sqlMLbtn"
>
<property
name=
"text"
>
<string>
Configure Media Library
</string>
</property>
</widget>
</item>
<item
row=
"1"
column=
"0"
colspan=
"2"
>
<widget
class=
"QCheckBox"
name=
"oneInstanceFromFile"
>
<item
row=
"0"
column=
"1"
>
<widget
class=
"QCheckBox"
name=
"EnqueueOneInterfaceMode"
>
<property
name=
"text"
>
<string>
Use only one instance when started from file manager
</string>
<string>
Enqueue items into playlist in one instance mode
</string>
</property>
</widget>
</item>
...
...
@@ -678,7 +662,6 @@
<tabstop>
treePlaylist
</tabstop>
<tabstop>
playPauseBox
</tabstop>
<tabstop>
artFetcher
</tabstop>
<tabstop>
sqlMLbtn
</tabstop>
<tabstop>
updatesBox
</tabstop>
<tabstop>
updatesDays
</tabstop>
<tabstop>
saveRecentlyPlayed
</tabstop>
...
...
modules/gui/qt4/util/pictureflow.cpp
View file @
2f353e18
...
...
@@ -30,7 +30,6 @@
*/
#include "pictureflow.hpp"
#include "components/playlist/ml_model.hpp"
#include <QApplication>
#include <QImage>
...
...
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