[vlmc-devel] [PATCH 2/2] Implement SettingValue::Type::List

yikei lu luyikei.qmltu at gmail.com
Fri Mar 11 11:46:26 CET 2016


QString
RecentProjects::flattenProjectList() const
..

    foreach ( RecentProject p, m_recentsProjects )
    {
        res += p.name + '#' + p.filePath + '#';
    }


In recent projects, we use QString to flatten a project list, but if a
user want to use a "#" in a project name?

2016-03-11 19:44 GMT+09:00 yikei lu <luyikei.qmltu at gmail.com>:
> In Library,
>
>
>     QDomElement media = medias.firstChildElement();
>     while ( media.isNull() == false )
>     {
>         if ( media.hasAttribute( "mrl" ) == true )
>         {
>             QString mrl = media.attribute( "mrl" );
>             mrl = m_workspace->toAbsolutePath( mrl );
>             Media*  m = addMedia( mrl );
>             if ( m == NULL )
>                 vlmcWarning() << "Failed to load media" << mrl <<
> "when loading project.";
>             else
>                 m_nbMediaToLoad.fetchAndAddAcquire( 1 );
>         }
>         media = media.nextSiblingElement();
>     }
>
>
> Like this code, while we don't have to use QList, I'm sure that it
> will be convenient if we can use it. Especially if we want to save a
> list of tracks, recent projects....
>
> 2016-03-11 19:31 GMT+09:00 Hugo Beauzée-Luyssen <hugo at beauzee.fr>:
>> On 03/11/2016 07:09 AM, Yikai Lu wrote:
>>>
>>> In order to remove save/load methods in many classes, we need to be able
>>> to save QList.
>>>
>>> ---
>>>   src/Settings/SettingValue.h |  1 +
>>>   src/Settings/Settings.cpp   | 52
>>> ++++++++++++++++++++++++++++++++++++++-------
>>>   2 files changed, 45 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/src/Settings/SettingValue.h b/src/Settings/SettingValue.h
>>> index ebc225e..cf9932f 100644
>>> --- a/src/Settings/SettingValue.h
>>> +++ b/src/Settings/SettingValue.h
>>> @@ -46,6 +46,7 @@ class   SettingValue : public QObject
>>>               Language,
>>>               KeyboardShortcut,
>>>               Path,
>>> +            List,
>>>               ByteArray, // For now this is only for private variables,
>>> and is not expected to be used at any time
>>>               //For effect engine settings:
>>>               Color,
>>> diff --git a/src/Settings/Settings.cpp b/src/Settings/Settings.cpp
>>> index ab48a23..2b5dc26 100644
>>> --- a/src/Settings/Settings.cpp
>>> +++ b/src/Settings/Settings.cpp
>>> @@ -77,10 +77,25 @@ Settings::save( QXmlStreamWriter& project )
>>>           if ( ( val->flags() & SettingValue::Runtime ) != 0 )
>>>               continue ;
>>>           project.writeStartElement( "setting" );
>>> -        project.writeAttribute( "key", val->key() );
>>> -        if ( val->get().canConvert<QString>() == false )
>>> -            vlmcWarning() << "Can't serialize" << val->key();
>>> -        project.writeAttribute( "value", val->get().toString() );
>>> +        if ( val->type() == SettingValue::List )
>>> +        {
>>> +            project.writeAttribute( "key", val->key() + "/List" );
>>> +            for ( const QVariant& var: val->get().toList() ) {
>>> +                project.writeStartElement( "setting" );
>>> +                project.writeAttribute( "key", val->key() );
>>> +                if ( var.canConvert<QString>() == false )
>>> +                    vlmcWarning() << "Can't serialize" << val->key();
>>> +                project.writeAttribute( "value", var.toString() );
>>> +                project.writeEndElement();
>>> +            }
>>> +        }
>>> +        else
>>> +        {
>>> +            project.writeAttribute( "key", val->key() );
>>> +            if ( val->get().canConvert<QString>() == false )
>>> +                vlmcWarning() << "Can't serialize" << val->key();
>>> +            project.writeAttribute( "value", val->get().toString() );
>>> +        }
>>>           project.writeEndElement();
>>>       }
>>>       project.writeEndElement();
>>> @@ -100,15 +115,36 @@ Settings::load( const QDomDocument& document )
>>>       while ( s.isNull() == false )
>>>       {
>>>           QString     key = s.attribute( "key" );
>>> -        QString     value = s.attribute( "value" );
>>> +        QString     value;
>>>
>>>           if ( key.isEmpty() == true )
>>>               vlmcWarning() << "Invalid setting node.";
>>>           else
>>>           {
>>> -            vlmcDebug() << "Loading" << key << "=>" << value;
>>> -            if ( setValue( key, value ) == false )
>>> -                vlmcWarning() << "Loaded invalid project setting:" <<
>>> key;
>>> +            if ( key.endsWith("/List") )
>>> +            {
>>> +                key.chop(5);
>>> +                s = s.firstChildElement( "setting" );
>>> +                QList<QVariant> list;
>>> +                while ( s.isNull() == false )
>>> +                {
>>> +                    if ( key.isEmpty() == true )
>>> +                        vlmcWarning() << "Invalid setting node.";
>>> +                    value = s.attribute( "value" );
>>> +                    vlmcDebug() << "Loading" << key << "=>" << value;
>>> +                    list << QVariant::fromValue( value );
>>> +                    s = s.nextSiblingElement();
>>> +                }
>>> +                if ( setValue( key, list ) == false )
>>> +                    vlmcWarning() << "Loaded invalid project setting:" <<
>>> key;
>>> +            }
>>> +            else
>>> +            {
>>> +                value = s.attribute( "value" );
>>> +                vlmcDebug() << "Loading" << key << "=>" << value;
>>> +                if ( setValue( key, value ) == false )
>>> +                    vlmcWarning() << "Loaded invalid project setting:" <<
>>> key;
>>> +            }
>>>           }
>>>           s = s.nextSiblingElement();
>>>       }
>>>
>>
>> I'm not sure I understand the reason for this patch.
>> Granted, project save/load is in a bad shape now, but it used to work
>> without QList handling. What are the values that *need* QList ?
>>
>> Regards,
>> _______________________________________________
>> Vlmc-devel mailing list
>> Vlmc-devel at videolan.org
>> https://mailman.videolan.org/listinfo/vlmc-devel


More information about the Vlmc-devel mailing list