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

yikei lu luyikei.qmltu at gmail.com
Fri Mar 11 14:59:34 CET 2016


For this case, we might want to be able to save QMap<QString, QString>
as a settingvalue. Which can specify keys, not only values.

2016-03-11 22:23 GMT+09:00 Hugo Beauzée-Luyssen <hugo at beauzee.fr>:
> On 03/11/2016 11:46 AM, yikei lu wrote:
>>
>> 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
>>
>> _______________________________________________
>> Vlmc-devel mailing list
>> Vlmc-devel at videolan.org
>> https://mailman.videolan.org/listinfo/vlmc-devel
>>
>
> I don't think we can replace this '#' uglyness with a simple QList. There
> might we ways using a QList<QStringList>, but in any case, I don't think
> that this is completely related to your patch.
> I'll try to review the 1 one more thoroughly
>
>
> 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