diff options
author | wang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com> | 2019-05-28 14:00:55 +0800 |
---|---|---|
committer | wang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com> | 2019-05-28 14:00:55 +0800 |
commit | 7d29d877baafe52cc0e0bbdf7d86deff61073651 (patch) | |
tree | b3d106a241e5c3b5be6b7f1fbe596ac3024ae0ad | |
parent | 33c89065c315edd838873116bec8723326f43488 (diff) |
registerShortcut
Change-Id: I66dbf6f12a890e67908594ed238556f5456b7ed7
30 files changed, 1838 insertions, 84 deletions
diff --git a/homescreen/homescreen.pro b/homescreen/homescreen.pro index 4fcfb31..0de8e03 100644 --- a/homescreen/homescreen.pro +++ b/homescreen/homescreen.pro @@ -28,14 +28,18 @@ SOURCES += \ src/statusbarserver.cpp \ src/applicationlauncher.cpp \ src/mastervolume.cpp \ - src/homescreenhandler.cpp + src/homescreenhandler.cpp \ + src/toucharea.cpp \ + src/shortcutappmodel.cpp HEADERS += \ src/statusbarmodel.h \ src/statusbarserver.h \ src/applicationlauncher.h \ src/mastervolume.h \ - src/homescreenhandler.h + src/homescreenhandler.h \ + src/toucharea.h \ + src/shortcutappmodel.h OTHER_FILES += \ README.md diff --git a/homescreen/qml/ShortcutArea.qml b/homescreen/qml/ShortcutArea.qml index a8ce127..217aa9f 100644 --- a/homescreen/qml/ShortcutArea.qml +++ b/homescreen/qml/ShortcutArea.qml @@ -24,47 +24,41 @@ Item { width: 785 height: 218 - - ListModel { - id: applicationModel - ListElement { - appid: 'launcher' - name: 'launcher' - application: 'launcher@0.1' - } - ListElement { - appid: 'mediaplayer' - name: 'MediaPlayer' - application: 'mediaplayer@0.1' - } - ListElement { - appid: 'hvac' - name: 'HVAC' - application: 'hvac@0.1' - } - ListElement { - appid: 'navigation' - name: 'Navigation' - application: 'navigation@0.1' - } - } - property int pid: -1 RowLayout { anchors.fill: parent spacing: 2 Repeater { - model: applicationModel + id: repeater + model: shortcutAppModel delegate: ShortcutIcon { Layout.fillWidth: true Layout.fillHeight: true - name: model.name - active: model.name === launcher.current + name: shortcutAppModel.getName(model.index) + icon: shortcutAppModel.getIcon(model.index) + isBlank: shortcutAppModel.isBlank(model.index) + active: shortcutAppModel.getName(model.index).toLowerCase() === launcher.current onClicked: { - homescreenHandler.tapShortcut(model.appid) + console.log("launcher.current====="+homescreenHandler.getCurrentApplication()) + if(launcher.current === shortcutAppModel.getName(model.index)) { + return + } + homescreenHandler.tapShortcut(shortcutAppModel.getId(model.index), false) } } } } + + Connections { + target: shortcutAppModel + onUpdateShortcut: { + for(var i = 0; i < 4; i++) { + var item = repeater.itemAt(i) + item.name = shortcutAppModel.getName(i) + item.icon = shortcutAppModel.getIcon(i) + item.isBlank = shortcutAppModel.isBlank(i) + } + } + } } diff --git a/homescreen/qml/ShortcutIcon.qml b/homescreen/qml/ShortcutIcon.qml index 1100a7c..e891c99 100644 --- a/homescreen/qml/ShortcutIcon.qml +++ b/homescreen/qml/ShortcutIcon.qml @@ -24,7 +24,10 @@ MouseArea { width: 195 height: 216.8 property string name: 'Home' + property string icon:'./images/Shortcut/' property bool active: false + property bool isBlank: false + Item { id: icon property real desaturation: 0 @@ -32,14 +35,42 @@ MouseArea { Image { id: inactiveIcon anchors.fill: parent - source: './images/Shortcut/%1.svg'.arg(root.name.toLowerCase()) + source: './images/Shortcut/blank.svg' +// source: isBlank ? './images/Shortcut/blank.svg' : root.icon + property string initial: root.name.substring(0,1).toUpperCase() + Label { + style: Text.Outline + styleColor: '#00FFFF' + color: 'transparent' + font.pixelSize: 75 + anchors.centerIn: parent + text: inactiveIcon.initial + visible: root.isBlank + } } Image { id: activeIcon anchors.fill: parent - source: './images/Shortcut/%1_active.svg'.arg(root.name.toLowerCase()) + source: './images/Shortcut/blank_active.svg' +// source: isBlank ? './images/Shortcut/blank_active.svg' : root.icon + property string initial: root.name.substring(0,1).toUpperCase() + Label { + style: Text.Outline + styleColor: '#00FFFF' + color: 'transparent' + font.pixelSize: 75 + anchors.centerIn: parent + text: activeIcon.initial + visible: root.isBlank + } opacity: 0.0 } + Image { + id: sourceIcon + anchors.fill: parent + source: isBlank ? null : root.icon + } + layer.enabled: true layer.effect: Desaturate { id: desaturate @@ -47,6 +78,7 @@ MouseArea { cached: true } } + Label { id: name y: 160 @@ -57,21 +89,11 @@ MouseArea { anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Text.AlignHCenter color: "white" - text: qsTr(model.name.toUpperCase()) + text: qsTr((root.name === "launcher" ? "home" : root.name).toUpperCase()) } + states: [ State { - when: launcher.launching - PropertyChanges { - target: root - enabled: false - } - PropertyChanges { - target: icon - desaturation: 1.0 - } - }, - State { when: root.active PropertyChanges { target: inactiveIcon @@ -83,18 +105,4 @@ MouseArea { } } ] - - transitions: [ - Transition { - NumberAnimation { - properties: 'opacity' - duration: 500 - easing.type: Easing.OutExpo - } - NumberAnimation { - properties: 'desaturation' - duration: 250 - } - } - ] } diff --git a/homescreen/qml/StatusArea.qml b/homescreen/qml/StatusArea.qml index d2e0930..961cd88 100644 --- a/homescreen/qml/StatusArea.qml +++ b/homescreen/qml/StatusArea.qml @@ -109,6 +109,12 @@ Item { font.pixelSize: 32 } } + MouseArea { + anchors.fill: parent + onClicked: { + homescreenHandler.killRunningApplications() + } + } } } ColumnLayout { @@ -117,11 +123,16 @@ Item { Layout.fillHeight: true Layout.preferredWidth: 76 spacing: -10 + Rectangle { + Layout.preferredWidth: 77 + Layout.preferredHeight: 55 + opacity: 0 + } Image { id: bt_icon Layout.preferredWidth: 77 - Layout.preferredHeight: 73 + Layout.preferredHeight: 55 source: connStatus ? './images/Status/HMI_Status_Bluetooth_On-01.png' : './images/Status/HMI_Status_Bluetooth_Inactive-01.png' fillMode: Image.PreserveAspectFit property string deviceName: "none" @@ -138,7 +149,7 @@ Item { model: StatusBarModel { objectName: "statusBar" } delegate: Image { Layout.preferredWidth: 77 - Layout.preferredHeight: 73 + Layout.preferredHeight: 55 source: model.modelData fillMode: Image.PreserveAspectFit } diff --git a/homescreen/qml/images/AGL_HMI_Blue_Background_NoCar-01.png b/homescreen/qml/images/AGL_HMI_Blue_Background_NoCar-01.png Binary files differindex 357c204..a4e026c 100644 --- a/homescreen/qml/images/AGL_HMI_Blue_Background_NoCar-01.png +++ b/homescreen/qml/images/AGL_HMI_Blue_Background_NoCar-01.png diff --git a/homescreen/qml/images/AGL_HMI_Full_Background.png b/homescreen/qml/images/AGL_HMI_Full_Background.png Binary files differnew file mode 100644 index 0000000..9631ca0 --- /dev/null +++ b/homescreen/qml/images/AGL_HMI_Full_Background.png diff --git a/homescreen/qml/images/AGL_HMI_Normal_Background.png b/homescreen/qml/images/AGL_HMI_Normal_Background.png Binary files differnew file mode 100644 index 0000000..c686067 --- /dev/null +++ b/homescreen/qml/images/AGL_HMI_Normal_Background.png diff --git a/homescreen/qml/images/Shortcut/blank.svg b/homescreen/qml/images/Shortcut/blank.svg new file mode 100644 index 0000000..3bccdca --- /dev/null +++ b/homescreen/qml/images/Shortcut/blank.svg @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Home" + x="0px" + y="0px" + viewBox="0 0 195 216.8" + style="enable-background:new 0 0 195 216.8;" + xml:space="preserve" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + sodipodi:docname="sdl_usb.svg"><metadata + id="metadata61"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs59" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1018" + id="namedview57" + showgrid="false" + showguides="true" + inkscape:guide-bbox="true" + inkscape:zoom="1.0885609" + inkscape:cx="18.255591" + inkscape:cy="102.46209" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:current-layer="Home"><sodipodi:guide + position="52.936865,144.9161" + orientation="0,1" + id="guide4189" + inkscape:locked="false" /><sodipodi:guide + position="66.027543,153.29873" + orientation="1,0" + id="guide4191" + inkscape:locked="false" /><sodipodi:guide + position="34.449153,79.00339" + orientation="0,1" + id="guide4193" + inkscape:locked="false" /><sodipodi:guide + position="132.05509,117.35678" + orientation="1,0" + id="guide4195" + inkscape:locked="false" /><sodipodi:guide + position="98.9839,162.94449" + orientation="1,0" + id="guide4266" + inkscape:locked="false" /><sodipodi:guide + position="67.290679,111.95975" + orientation="0,1" + id="guide4268" + inkscape:locked="false" /></sodipodi:namedview><style + type="text/css" + id="style3"> + .st0{fill:#FFFFFF;} + .st1{font-family:'Roboto-Regular';} + .st2{font-size:11px;} + .st3{letter-spacing:2;} + .st4{fill:url(#SVGID_1_);} + .st5{fill:url(#SVGID_2_);} + .st6{fill:url(#SVGID_3_);} + .st7{fill:url(#SVGID_4_);} + .st8{fill:url(#SVGID_5_);} +</style></svg>
\ No newline at end of file diff --git a/homescreen/qml/images/Shortcut/blank_active.svg b/homescreen/qml/images/Shortcut/blank_active.svg new file mode 100644 index 0000000..0b63bc9 --- /dev/null +++ b/homescreen/qml/images/Shortcut/blank_active.svg @@ -0,0 +1,100 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:i="&ns_ai;" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Home" + x="0px" + y="0px" + viewBox="0 0 195 216.8" + style="enable-background:new 0 0 195 216.8;" + xml:space="preserve" + sodipodi:docname="sdl_usb_active.svg" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata + id="metadata3773"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs + id="defs3771" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1018" + id="namedview3769" + showgrid="false" + inkscape:zoom="3.8560885" + inkscape:cx="97.5" + inkscape:cy="108.4" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:current-layer="g3764" /> +<style + type="text/css" + id="style3750"> + .st0{fill:#0DF9FF;} + .st1{fill:url(#Active_2_1_);} + .st2{fill:#FFFFFF;} + .st3{font-family:'Roboto-Regular';} + .st4{font-size:11px;} + .st5{letter-spacing:2;} + .st6{fill:url(#SVGID_1_);} + .st7{fill:url(#SVGID_2_);} + .st8{fill:url(#SVGID_3_);} + .st9{fill:url(#SVGID_4_);} + .st10{fill:url(#SVGID_5_);} +</style> +<switch + id="switch3766"> + <g + i:extraneous="self" + id="g3764"> + <rect + id="Active_1" + y="214.3" + transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 195.8833 431.0468)" + class="st0" + width="195.9" + height="2.4" /> + <linearGradient + id="Active_2_1_" + gradientUnits="userSpaceOnUse" + x1="97.9416" + y1="236.9585" + x2="97.9416" + y2="-68.5304"> + <stop + offset="0" + style="stop-color:#0DF9FF" + id="stop3753" /> + <stop + offset="9.208472e-02" + style="stop-color:#0DF9FF;stop-opacity:0.853" + id="stop3755" /> + <stop + offset="0.6264" + style="stop-color:#0DF9FF;stop-opacity:0" + id="stop3757" /> + </linearGradient> + <rect + id="Active_2" + class="st1" + width="195.9" + height="214.3" /> + + </g> +</switch> +</svg>
\ No newline at end of file diff --git a/homescreen/qml/images/Shortcut/sdl_usb.svg b/homescreen/qml/images/Shortcut/sdl_usb.svg new file mode 100644 index 0000000..3b6a7e9 --- /dev/null +++ b/homescreen/qml/images/Shortcut/sdl_usb.svg @@ -0,0 +1,311 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Home" + x="0px" + y="0px" + viewBox="0 0 195 216.8" + style="enable-background:new 0 0 195 216.8;" + xml:space="preserve" + inkscape:version="0.91 r13725" + sodipodi:docname="sdl.svg"><metadata + id="metadata61"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs59" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1855" + inkscape:window-height="1056" + id="namedview57" + showgrid="false" + showguides="true" + inkscape:guide-bbox="true" + inkscape:zoom="1.0885609" + inkscape:cx="18.255591" + inkscape:cy="102.46209" + inkscape:window-x="65" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:current-layer="Home"><sodipodi:guide + position="52.936865,144.9161" + orientation="0,1" + id="guide4189" /><sodipodi:guide + position="66.027543,153.29873" + orientation="1,0" + id="guide4191" /><sodipodi:guide + position="34.449153,79.00339" + orientation="0,1" + id="guide4193" /><sodipodi:guide + position="132.05509,117.35678" + orientation="1,0" + id="guide4195" /><sodipodi:guide + position="98.9839,162.94449" + orientation="1,0" + id="guide4266" /><sodipodi:guide + position="67.290679,111.95975" + orientation="0,1" + id="guide4268" /></sodipodi:namedview><style + type="text/css" + id="style3"> + .st0{fill:#FFFFFF;} + .st1{font-family:'Roboto-Regular';} + .st2{font-size:11px;} + .st3{letter-spacing:2;} + .st4{fill:url(#SVGID_1_);} + .st5{fill:url(#SVGID_2_);} + .st6{fill:url(#SVGID_3_);} + .st7{fill:url(#SVGID_4_);} + .st8{fill:url(#SVGID_5_);} +</style><image + y="71.883904" + x="66.027542" + id="image4332" + xlink:href="data:image/png;base64,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 +" + preserveAspectRatio="none" + height="65.912712" + width="66.02755" /></svg> diff --git a/homescreen/qml/images/Shortcut/sdl_usb_active.svg b/homescreen/qml/images/Shortcut/sdl_usb_active.svg new file mode 100644 index 0000000..9584885 --- /dev/null +++ b/homescreen/qml/images/Shortcut/sdl_usb_active.svg @@ -0,0 +1,278 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ + <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/"> + <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/"> + <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/"> + <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/"> + <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/"> + <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/"> + <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/"> + <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/"> +]> +<svg version="1.1" id="Home" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 195 216.8" + style="enable-background:new 0 0 195 216.8;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#0DF9FF;} + .st1{fill:url(#Active_2_1_);} + .st2{fill:#FFFFFF;} + .st3{font-family:'Roboto-Regular';} + .st4{font-size:11px;} + .st5{letter-spacing:2;} + .st6{fill:url(#SVGID_1_);} + .st7{fill:url(#SVGID_2_);} + .st8{fill:url(#SVGID_3_);} + .st9{fill:url(#SVGID_4_);} + .st10{fill:url(#SVGID_5_);} +</style> +<switch> + <g i:extraneous="self"> + <rect id="Active_1" y="214.3" transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 195.8833 431.0468)" class="st0" width="195.9" height="2.4"/> + <linearGradient id="Active_2_1_" gradientUnits="userSpaceOnUse" x1="97.9416" y1="236.9585" x2="97.9416" y2="-68.5304"> + <stop offset="0" style="stop-color:#0DF9FF"/> + <stop offset="9.208472e-02" style="stop-color:#0DF9FF;stop-opacity:0.853"/> + <stop offset="0.6264" style="stop-color:#0DF9FF;stop-opacity:0"/> + </linearGradient> + <rect id="Active_2" class="st1" width="195.9" height="214.3"/> + <g> +<image + y="71.883904" + x="66.027542" + id="image4332" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJEAAACUCAYAAACTFcuQAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI +WXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4gsNBy0he+6l0QAAIABJREFUeNrtnXe8nFWd/9/fZ+a2 +NJIQkhBIgVACSA1NwEKzQFhQaYKNVRErurqK6K5Zd9ey6qooKuz+LCjogq4rGEBFUCkaIRBCE0hI +Jb3dm7l1Zs7n98d5ZuZpM7kJKfeSe3wF79w788xzzvM53/Otn68xNDLHB/t0k4yzq78Qv/9Os71t +aGXSw4aWoDZmS8HaIj/BGGPGcYjxkT+vE8yrvHB53vk9s7VDqzYEIq7q1SuCgLeHLwMzrkKM2Nrn +JG7AaC85fnJjiz0xBKI9cHygT8cQcISJ44GPbu91JK4j4K/hkbf4O0320BCIXu6Sp1vTcq0MV5GP +mfHuHXz5X5PnmlIvfTe02vN7yprm9zQQBXluoMRZ2I7fQIJzrcQ5+RzPAYcNSaKXybhSmpIv8qvI +jKcbjNzJq9ojx98AXJk3fa/NlgyBaDCa6EW9UuJKjFEGb96OSxSB/wO+CfQAHwHeCjRt43V+KdEO +YAG3XZ+3O4dANJCBI53kihwZSpqZZly+HZdZB3wfuB5YnvjbvsCVwIeBvbdjtX8tx704Fn6n1e4Y +AtFAUpaLOjUHrU683Yw3GjH/Tn/HfOC7wE+Arq28txW4CLgGOHw7LLoHzJgtcOTZ9DQ8+Qez0hCI +dvG4SMqNh9EAlHkUMWU7LlMGfgVcB/xxe/R04I2hi+Cs7VDEewweUpn3WQubitBxo1lx0BkrgxVE +E+FQSiygxALEpG38eEeo6xwEvGU7AQTggDnA2cCh4TW7tuHzLYJTyPMnSizI9fKaIUm0k8cHSroc +8bbwxkcCp6b2duNpPQ98G/h/QGc/jx5s21ZpH+DvgQ8B+2+jZJoHrDNxy/XN9uMhEO3A8f6+0jtN +uRkYpwGn1cDSn6lJwO+9lLA54evE1OPgi4LGgLKDIAjfpUZAVeRraQbOBz4OnFT9g1Hn9hX96UGT +3Q/gxKrvtdp1QyDaniHZVX3lC0SuNWd8QtJxjZ5dxswKwC3hEfN0SkglPmMBSP6PKsP32tJf9O7u +bppzzVUtwCyCqaybUPX7TkV2NcabgZzHkWqYUgJfUaCZLXHiWoCuTdz+44nWOQSiBuPyDRtGDRsx +djJAYMW8ufw9GOO2fkrFHsILwI3hv039WYDKg/tec7CNEtJDwQzk+iMdORC40uB9wGht4/o4lV8v +y7/Y1czym806hhTrjDF8xNgzctL8nDTflH9Etk2+mAeAi4FDgC8jNvXn1HMSG5qNDU3bvp/WN8GG +JlDZ9fcjLwDXSEyRuBpYsk0Py3Jzcmj+iL5ttwRf9pLofT3lDwt7l3mT/cD6ynIKFb3A/wBfA1uQ +qVxnfEwSQS6gJAh64cZRL20Z3tPVRT7fVlXBFFONGp6jAXAOcHXaRWAZt1691guCzQAm3XlDW+6f +9lgQvaer/I9mHG7YTNCRjc+b2FgF3ID3Kq/v9ywt8D+7Xm5sbd3h87myUwQ5cAHgXMatx5So5DgW +n8v0DqA1U+/PWg6zRZLuN1h9Y1vu0y97EL1LGt3U694Z2Wvvl3Roo5tKLPm8UFH+GVCM2V8ZHzYD +ZGD+Dd3FgB+P3DVTvkhiTI/Lxk2WcKoJzonyOtOHDMYpy/CzzAe5VhZ8Aefo7AtuumW0bXpZgeg9 +BU1wOQ432N/kbuqfsqvKruvDe5W/DvbnTCO++jo8PDx6wgMh4L/adu+pfWWPkIT3TRqocs8RC63i +XqghrSXU8T4JvCKOP6PROsj0rhy5ZeHLRTe22bJBC6LzVq4cNnLffVvautzFoO81vokQArUVWQv8 +APi2wYrszVvZvuHSmnkrKTD+uy03ID0X7+0Wcg4LDCeXkk4WmaRqUzsV+BQwy//VkIWwk9Xer8pf +w08LhH2+e1jwjeI6ireNt8Kgs8722WvCP7Z1lReAvtDQJRQ9tsRjiPcB0/ABzhX13lv5WQr/Oeiz +HO3d7QPW/dXTCnkLcM5FJpCeX2KODwr+TnCoKqGVypwj849dQ1Xn6NVtXeUFI4e7/xw0kuiKQun7 +wIRQMhyGdEB9L21Vd3ESc/CB0Hsscu6bMhxwMeMrh3JlKINTDz8cMYLBMN61aRNB82hE2Usbi+g9 +VgFA0vFY/b+9EO8EPoExWRkGaUpXxFYLPWoB3ZTtvnVbgh/cMcm6BgyI3rauc998a/OHQuB8ADQ6 +pv1ZUpZUV6bdsB96fYelytQ6qaNmB4gy04Y3MdsGcUaLxBWFIliOwOszKUW8jpMd8wlyFwAfE7yy +vuYe+1AfsifB3SejN8jlb/p+qz27W0B0aWfnpDbXPANsn7I0LTC+tLWvMVTB1nOI64H/NuiqYEqN +bszMK6cmjBw/GJHj5Tiu6CzVQCRlroUifqSIN2om8BGDyxTmzlsKfVaNs6j28j+QPVqi/NSPR7Y8 +uUtAdMWGrsml5rYRAe61yP29wfGyDF+Gpb7IAfcC35RPn1DKnFc2eLycN+RK/GhUK3vCeOeWEhaV +KEbaV5Dww4Yvp2FcZfBeYGyWME/JKQNh33XkvgVAnp4ft9ninQaid3YUfwmc400hcqCAxiDaAvw0 +PLL+ljUpayCAnUTrqCbmzZvHvJkztzkvYzAfc1cC3T0QlMsRJSm9dilflF+iEYjLgI+ZMYNMPSl2 +qbIZ5fDF4z8a1XTiDgXRRVJuWKF0pxxjMQ6iklFYffKZB9Ei4L+QbgA2x2AP2dGJ6MbL+Rcb29dz +x6RJ7KnjSom+HlBvEZqakCthLvSieWM/4iXL1CEDsDPMFxrMytJQk3aLiS7B0wAun/+7nwy3VdsF +ordt7jvO4IMACgIzdClS29YvZA+ArhP8L4TIbqAmRt2CVtkKrsxPRrcwNDJOgvYSmMOlsqIsQ6eM +Ru4M4Bjg/UJvB9os7qJNASJ0L9xqohDAd340unlev0D0tg3FU5TXTBNHG7w7+SVpE9u7P4BbEV8B +nkzpcoorQBYVxxZOPjB+PDI/hJJ+jss7SgRycWU55mysY6f5ZzEe4wqDj2w1tbi257/vjPn+Z3v2 +5tFNv02B6K0be4/CgjF505XyZ2nsbhQ9cmpgWInP2/k2YkNcLgqZ1RV3VkW64+bRrUOoeAnj0k19 +5CsLGtQxULJHK3A5Pi3lyBT66l7Efmc5/r3s1H3LXs1/tQs2afQww3DFX5qpYaJ4RDSGgVD9FCgp +JlSzfDrmE7eiu6HouGX8EHh25Hj76tW4ljHILFRTxTakgp6KT0l5M9AP/4kws4WOrhPtsk19T5o0 +MhRxjZ5qL3A78DXD5iZPXBrakgYYrqV2XK1ugz/YED3SjrboLt/YTbmtjaC3N3wulnEyKcP3VD01 +puOLM98DDK/vuhRAEbOFdtnG3nZglOofh6uBHwHXCVZmRzAaxDUMpByS43/2bh560LvqiGvv82db +GQxHdvw/7h6waK6wMQp4F+gfEFOVdN1V/XpWsLdu8CBKnodh+cqNoJuAnopDwuo5rCoftajFJcwc +t4xpG3qquxNQ6zqxXN4/kwyFKQaiqJzxPt5K9uWngNOSsshEwS7d0NsOGpWh05sSEiaWsKm4GRCr +VAAsDz8dNXjN9EtW90Kzql5TZwG3jW0a1GB6y9oemnM1q0hRtGQa+Fk6SiKWIivYpet72gWjttcR +WdWYzVi4eAHzjj9+UC/0RWt7wCBnAaKW76PAlxJVxrpxLYNXp5s9m0s/fE0VSTIlc27ZanFcTZcq +2CXrvSTKiBBbfess7gfaMrYFFsJdBw9uRfkiiWBjL3JenYiHcmJbF5dr4baxg3e+r5VoWwgcBCM2 +9mJKquBbB1GYt1Swi9b1tFsjSZQVYTerxZDl+J99Brep/qbVW8jn8n5GQVA/0JmyZhyU4baJg1vn +u2BTNy3lHI4yJmt0simJMxGCSDDKqlm/VR+DKaEJma/SAzNuG+TAuXB9byLVQhk/ZbkswvdUjoDK +XgoCfrH34A7VXNLRgyvKB6tylk6xRKrl70Z0ogvX9njrLL3dMo6zHL8YP7jN9AtXd6IgF4FLw3Eq +MBsYg09L/SlQylJFpZp5YyZ+vs/glk5v6hC53p56hW9RmBTyfoPV9/E0zhQbPE64C9d2+5yk8LWo +e4AHiHOAz2EcH1m6m4Av4+vdviXYmFlcGAqoC9d2+0v2tnLb5MG5cGr0i8iU8jWJpfRBmEgbG0xL +MVPiwLDyqntFN2oJwrKduqMZcQnwWdAhEU9H9D37hpLpE8AtQj5HShErNeFHI9/FRRtFex/0TRhc +XnqVGzz0SBZB4JLlBin1e3AKn8mruij1dVPq66a52afW1pnOSHyuzWLgJolDlHxjpLIiHCMEVwqe +QtxOI5a0wCj19TDcehi7rofBPZQhe0VelXSCekIssntLg2ATXbC622fWREtoEuUQfik0EfiowfuB +UUoQW6cdcWkrFQgE5wHnIebhJdOtkKTMC9M0BG9a3QUYvxwEFl183VRX48nHF0b9PBwH1jh/VRfI +sCDywOof6tPwHItXAm2Kpq5kmRX9nrtm4klDvxoWan4bwvSYxKWEuGB1J5L41b4jBrTcyUzLjeU0 +m9eJGnq9TQMSR2dtFG093UTVOTnVK40AOBJfp3UZ0U4CanjmPw+8Hs9p/SOkM6JpvqasagMmgmZj +fBrPWPJl4OlYmKjCHGIB562slX6V8447x48YUCiKVIWE28xiqcwCAoXWmULxpXCCqvyvUl05QFD0 +xg1i1toehnV3+QBv9T5d+P+qloR6PUinCt0u9LjQOyTykbdE/in6b7mkoyUdImmxpBWSzhSMlPhW +5TOV2Hjss9Xf0SLxDoknJX4nmCVh0fc4qToHQ+RLxqy1PZy5YgDwV3VQw4GEUw0LLrJeIAJl1PDW +xUxx97Pj5vt6sKLLliLx+z8LT3z1AF5vsX4YDBuBk4EpwIKMvxdCJbwZuLSft2yh4n0Hniv7SqCt +3s63YpnhuaaBIoj64z3BZr1YaDesXwFYo4nb99v1zsbzVhRiSrFZXbWlkrYwG1/M19+n3C5fSfrH +qhZgRi7BVOBKLlmyFIC9GnQHsC3nUIWs4jp8inHsZsIaTRQYv540bPc4G1eIsnVX4xZkqI2VjWWz +lhfasSiIIumIiUO/bHDXfsN3mYPw3BWd/jbMGlqNYBUaln8CDq45MSx7S9XQ1wd6oxn3IZPMi2kL +DKOXOybFa//OXNFBW5DLkmYWKtb/i9nkut+ZfgQVprevAk+kdkYIqAqWuyjz+/1H7ZLlP3OFaEuX +6mfZHgU7d3mhHWMUijIKZEsiZ7bTQXTmmgItpTDA61ycayWdRzASuALxKaxWtZCWUKmplIHLQbeB +OTMveZAIrL1fdW6zXuysRvst1BHCr5mEzwTNpM+DODdRZDwQKuFzIvUx1STAiiBQEKBykbumjN7p +IGpVZyontrYXLCxSsoKds3xLO/08zhTsHBCds7K75pPw2mfdGwn/Mh54v8FHBaON7KCpso+89wLf +x8yF6WbM2f+lda46d3kXmFfwI6k5Iwy+Jq8DZXviLO75De/3eeDbgv8GujJdc2Y4M6ws1NvDXQfv +vXNA5DqTvBwZmdEq2BuXZYEoathFJpnbsSCauXIl+zXtS6k7crNqiOQDgKtlXIlo25paWKHbCy/5 +cUzXmcIAapDjrv13rL5xzootVH23qkqeFnll/D+iK1ovLhUpi24Hfgh81SocTZbWOJxzNA8bQU8Z +fjvRdiiIWlxXLZejjvg0UyHor+m+Myz8CeVRlLoL9QPANdXjKMGPBM/Jl7W0sbVP1H66NrSm/tM5 +K5Wa85Sa8xSH7XiPcVd7N+XmfKxSXF7v+Qq+DOd0QbeiTFZ1SK6AvfBzXeS94JyUIsAKW0YUuwsE +xR3Pka6oMyjDqFWoF9gbljaSRHF5YPmXJonOWrSRXHMT5gJkzivMkXpgI0HuVKWZs1kx8yzKZJD6 +XXUKXwc+Y4F1m3x5dm9rJ38YP56dPV63WlhfV2T1orlHMsSRwF1ej6sVM0fXOuoEjsR2H7Bkibqv +uMBVrCgHxVyOeycPe8mSqKncGZGOYf5DSndWwV6/dEuYT2R1lO+INqqAe6ZtH4het2QzFuTDCgJl +xaGiZGHnAp8GTumPEyZxne8AnwDrRsICuHvKSHbneMPSQqi4p0jTpwK3GZyQLe0zSYyRl07XETa6 +Sb4r2tTGEHdPHbWdICpkOrDjD0uFoOKhroSpYx7qhFf3pQxXDmqeZJfhMfbe81kSDyPukDglei/J +e8r4+eeIMYgPStbtEL0lt9sBBHD31BH8ZspwXCUxvsa1uFTiRIkxEt+PHVeqhUcy1mG6xDclViK+ +ETL0V99XDUsIRMDZSzp43eJt5bHcQrZnn9QRF5Bw+cdCBoqHQ17SyBme6zL+v6r+EoYREKV4RibV ++3LhPxKfrj4UlFe40ibRFAScsayHs57b/NJ3wQ4Yv5s6gt9MG0nZ4ueVjM2CdyNaEdciUutDfMNV +xijB1RKLEbcjneIT7iosBz4cZIAFOc5Y1sMZL3Rvk8s6Riyqmq5U+efC3Z9S6sSOTyW6Z+oI8qUR +bMmNZEtuZFqR9HP+teBk+SK5O4gLnZi4Tt2ruFBineAPgkmVgGfeFQmacpz67HoGyvj9lBG8ONWv +RefwEf6U8xPpRXwxjO9dqojek206VH+upKQ8CDwieLsqGRrhWjnk1yIobguG0t+nND7s7BfavWJt +CZKpBHWV/31uu3Wi5Dh7cQFnLqKjWZZ78GDggyFpWFtM+aZRtoYBmgtcYrC0Qo9jAM7xu+mjGUjj +7EWbcblmzJWStVqGzz74rWCCYZmxByNaZlFdj8XmU3lvBDYlM1td2MOtbHDvtFEZOlEH1kfMgLEM +TVaiYGctam9XJOwRnUDqZoMdB6LqzS7ZUruvMJWjnnMR728ZW9d5l61oPw9cSCWgauFjcL5i474D +Bw6gzlxcwGsxYTWJi81lqsH/yRNVNeb6iC9Che7wa8Bzqc0nVcvefz99VAxE9KWsrFh3tzAaVbAz +F7VXK2AtRqIcBZH/KcjldziIouP0FwoElP3OqsaOIoVLVuUh/DjGISTCCMn9Ut23HphLBOcbLKBy +/dAmFjnumz5yQEmnMxZ2YEFGjyLZOPPe7POzdk41bSlWc2/Il/POsZArPBuAlTiOYc2hhyv+HTUF +rYbigp2xcHMiAFtz+Pqbqt1hOZfnT9N2fgD2zBfWINdWk4fpmEYlWn8tMf7m9LbMqMXbCPYWUCxi +7wIwiS0bRjHv+IGTB/za5T0EfX1USMNqvEO04ft+zK54mayhe9jnmYem/6PANwgb7SRDKt58Dmlp +4nycSjNoqWCnL9xcdTY2jjiAy+8aEMWk06IOcM4vYPZbtpGcqTraw938p6itVGoSw1r2AgZedcZr +F7Vj8tpdUOH19t74d+H1n20dy4FvAf9F2D+t3n7MPM5CSRS4bbHEdkNOmpX6KDe14PLNjfpeXCyY +Efa96KbOnJQOK/xB0CO4JLRwyBehd0s7xS3tsGjAdMgEoJQXRausRdVx2QfcKMgJTg83BzR4rpHf +TRb8h2C5PAgP25qFlgx7SGCvfn5zmJQWDfDHA7AWijQn8aeDx+y+nbi4A5UrYYQ052nonh+PeL+w +DxvaO0uoKhHtrOUM6734ZLGyYV6ih8r+Hw8eWBbdqxcVMLlaaXuMM0pTwe4QHFkNRFeOvCztoPbC +Ce419E3g17U0e4t6V2JqmEHBXv3c5naDUamQiNUyMmq5XbsXRFUwLWwn2rfXkl3K/R5owXQx8Bng +0JQTzeqc2X58HOx6pN6aXuU3VwD88ea9YLYNGDAFlENLLiSZqKm14wz9EDg3BYhoolK2s2Q+8F3g +JrCeZO1HhI22YK96dnO7WTYrSIQtq4rD7lKRh48YP7B25XObqT3m1MOtKOGxWFw/G1x/EfjXyhFJ +BExyolwK+PMRew0cnem+xWj/sd6bXFXCATQC+AKei3Frek9yrAnBdD2wLuOTBTvt2U3tYBmtdLOb +REaV9U4LmHfoqIEDpufbvQUCdcI09iovZTiPbev19nXgn4FCPH01R68rY7kyc3dCYthLGa96tr1m +WdWWoik0QH7W2Eed2YS5CyOdGiAVgnpKmOA2wXHJr3BhBp9DtGYR5u/GsWzFRtpH7YWrr1jfHybk +Hx56cnv6aVR8TLBFcAswrna9Ms2IJjfwSNxzzaNoH7VXcjMV8TndObwSvi2dGIdRByx26t821fKJ +TFl2/l3AFwX3Z2XWWRhpfvCwMQNmAU/9W6dvpAeYK2IKarOpeKy9/jce33riA2Djqg7KrI4+YVJP +uDn/F3gvxsbIkVElf3/w0IGjhJ+2aCMuBLk5lywxNy8o7JfA5ApLZ8r9Xe3BZlUjKzIKdsozm2pM +aXWqR8PPP4D4MlanzVSYsSzZgNITZi7aSEvRq0ZBeMwp3aGwUi1yrcGMrGTiOq0OHgB7G2hplCJL +eAaSVas3s+T0AwbMWpz0xBpyTS0EoQM5IaXGCW4GXtdvYv2KTnTKM5vCpLStj/CCC0BfBW4BS51n +zrvCqq/+fNjYAbOIpzy7CSvXvNMZI1TCdU3oxOyf+g0Pgy4CWxqVXJW0FALHnw8dN3DOOolTnm2n +UqgQyUMHXz/3FeCqfl6sYCc/s7HdZKP6Q0NbrcT2x14lu+4G4lGW+NHhAopOzDtyYPlZTvnb5rAk +qRJHS4FqJj7gezlYrk5jVeLNW3kBeBNiQap+zHlnemCOhw4fM0DXIsr4ppbQmvtKzc5Kt8w2qWAn +P72xHSXI0JNyLIavRJxcLAX+E/MlLllKviwgGLEXq0pLWHLAAQNqAU/+2yZwatQT4ECwj4SOyGEN +7eLavNeFFuDcLFlnw8ewrgcWDjC23ZOf2QTOYUGMECwAXg12J6RblRn4ao9k9lqYePTBTHkUfw/A +VPmWnEuAzxE21FNk05pzqGMzE7oHljQC6OrtJWgKKNdn1XlB8FHEVMQ1JMuesz+3D/AXPLXMK2O+ +OWeoYzN7920ecGuhdkfQnEtOygF/IOzzkV4fYSc9taEdbFQqncL/J4fPxbmZWHCzoauuAx86+BK+ +L0hCqNVusBwY8waIzvTK5cIVInnIztV7a0UJ/zQZsaY6ymgf8A7gtppL2RAOw+jta2f+sQNHQs9c +tJF8T9j3Ki1C0jrRiU9uiJQMZbUBqR6IrwHuJFbz1ZAJqhOf9/JVsBVZ9yELqnGfh48cWM66E55a +BwQpEvTEwXQO6GqSJdOW2GCRfQO6HPg5ZuWw3VO4BKGaWy4x7+h9dvv8T3ymA8qlNIjioSVfAXvC +kxvq6URWp4zoNcAdGCPiLWpSMZXoLvwZxr8TZtYlt6v/KoOyTyp+7KiBo3ie8PQGH2+qBHyzwk3G +ccDVYcJcvmGLjNrfPo4PJfQm3yBnWA4ePmLMbgWRoiBSpWl1KpO0YMc/UQdEje1aA04EfoNPqejP +cPhW5rPxSVF1DmajnDfogceOHT1guk+f+Mw6VMpVuxvWoW4+AJ/b9J4sHaKO3K4LpnLOCCRcby+P +HbfvLgeRKxWT962MeSTKqPtf6iHEXInRgqMRa/oROwgQ5yEeAW5HnJz5PQa5kiPX5DhqQWHASKS/ +zhjHqi2ddDSPoSM/BpeN7cV4Psj9QjC9mGGTJMfX8D10v0KE40iIXNlB2RE0tcB99+16RbvOfcdf +C5u5YEPYqqqeJKodacIIAk8ikJFneCjwO9DkpAulgWCr0Kn8OvPbwyPPCR47amDpTMc+sY6c+WaA +DQqHm4FL8L3Cjuhf7oC+hU/7LVTV0SBcDgdFjAVHj90lkqhc6ouoxHEnmdUOjoIdt2C991hr68dZ +WTkeP2YMxzyxiUDlSue9pJCeCtyJcXjKkKvHzi8ew6dd/NwHd9Kk7KoeIwGPHT1wvODHPb6WkLaW +mI4YX0ozdGbIDnJeqkN3rM1p1Xfyc+D9mK2PFTBWQhYm5h+58xTwGc90MKyv6Lve1fKvlKLCMQp2 +7Pz17dTJJ0puHBeCqDKOeXIjQUm1gGUcdpPCY2tmv6j4/Xc9gfEVIj00kkD01RsBcuLxYwZOKOG4 +BevCVQ2ocINXswjjhtqxeP7sy6DG3mtWx5g2/mhwmZL+qTDzUgaut8gTx0/c4SBq6ytGKtpiNlnE +plDBjn1sfbss2SAmRbkR/pSPgagKpsfWYhakSDrCMQ6ffnBG1mlVJ8S3GF+NcCOox78/0dLFajl8 +5fzePHXEwPH+vuKJDTQ5pfixLWYnaxpwFdhVWcZJfOMbwEMhmJZaQprLgQsgcDD/+Xvh4ot3CIha +e/uSO12WsPXNVLBjHlvfrqhOFOVTS80sG0TJcfRj68LQWaUiwQCNM99k5Y3Qnxwew4w1oK9LfItK +SCV6o5G0hM7hXiotfAy4eOAA6pj562r8z6rcc2wLhQ17+Udgf0uEm2QJlUG+GFPGgmpFbOQ4DFyR +LSMnsvDmf4HZs18SiFqqIBKW8hWbL7A0PCvIjh7lYl9Y2hIb6wXnyKcc/Kqf1sEEiS/hQyrX1nMn +CBheWM/wzvUcdfC6AaWAW3PedzVUgoSi9pYOfCD7IMS7BauSxA0JQoKDgceBRYLD4hwFwlme4YX1 +HPl3H95xJprqVH0oQkwaK9IXDShF+lcz9OSJ+zH/2PGUXNkTVcY5LjYILpAYKfHfilOtRHioo6wk +7CPx7xLLBd8Q7FslandUy40riVNHPrqWV8wfGAQOjx0+hvnHjmf+seNxYcZAhc7HRVIwJaYL3gBM +TK5JJZM0nKrP3BTPIqUBV3UMOo5csPYlAkhV4VNZ69p3RTg2j5y3NlSs41aWJeoBAMoBPH3Mtifp +H7lgDVbKVXtcg7BaDkubwVcFH8g24qI6RfWY6pVnaP03g+VJraOi0Tnnc5uE48mOfeD0XX/MveLR +ddXtasrSGWwa8GnBu/H9Duv6a8KxHDjb4NksB3o04ODM8dSx47f7OGvq7k0SaERKhqqrXrBXzFtb +TUqzDN0uOgGX2z4QRce0+xYzYq8RNTW59gUqjA9xAAASN0lEQVQtIb/iP2e6izLcvYKiwU/l3QN/ +S3sOQuOakCZBjqKKPHf8pJ0KnKMeX025lItZ7ZXVtFrMabLEZ4G/tzBUUk1BzdYYy8D5gjnVd1hk +DSMVwr2B8dxLtFxnPNNBvquXeFBeynD7FeyICIiqgiL5YyiWdgSIouOIR9ZUmx0SUKnUaAI+IV/i +Ui8tNSl1ncEcjM8jHknFTKOsrWZYU0BP50YWnnzwDpvLpEdWMsblsbYc1u1QoHo+sXEYnwg92q2p +lCSR1Qr8WuA/IFkZUdmKDrOAJ4/bcX6jGc90kOvqDo2B+CNIpJcVArm4tlQv6rEzeMZyTaKLJrqo +eX4FxVCy5IFLY/eSVPJq9G+B4DzBw4LfSZyS5aev0Aqqr0xL047NbdqLZiwH9JVxOcWVUP/dYyU+ +J1gk8SnJAwji+mBUQAt+KBgmXyhRzmpZ16Uc3Wqi2LWDH06Hd+xGmehiKKqsqQM77OE1YaJ+ihjI +SHqWgKdP2DmFi4c+uo5cFRURh5Mph7gQ7GZQLqrz1MCVJog28yEVUSssIGHJVA4PM+Op47dvFx/+ +yJqa595i0ZrKlw4HPgRcQ5iwZ0kPUNSI9r+bL3QuCQdjlcM+rCwplxzPnjRxpzyPGXM7CHLdyfBW +VnJwwQ57eE29RP1IMmwNTzsLRJVxwBNraOuN1o3H0jTfiHcP5LJPChIKtgDmC/4TuMWgrMjfomLZ +mWEOXJ/x7GlbB9SMh9eEjfoUKSWKrpZn6xD2L/guj1l7Mnm37QavD1ne4mYOYXRF0IdYePyEnfoc +ZsztwII0iKqKTq1xRMFm/HVNtWQoVXJmcd2tZMbCE3ZRCfVscfis9cgJh6uy41PLabrTogly8dSm +1FFs8BTGl4X9FFSKlthVuQaqeUNGyXIsOrEW9D3oLxvIWdlD2YEFsZhS9DubgCtCA2E/1bNS0ryB +78VTCif6hXrSKeWg1Bew8ORdE4ieMbcDs+50eCFtPhbs0LkhiCIuyTgXSMQ82JUgSoxD/rI6jHNW +S7l9TpNxj1RLobCta+JL8GXR/6Wwxj7rI77hSz7yzF1K1iU4LgPgLXiD4KB+1vqD593+GBFyO1Uj +tOLZEyfulvWeMbcDrHsr3gbvsbZD566JpYJENJKooYbhc6J3F4iqutNfV4XMFhYNKB8J/BaY0NgE +iHmhVuIbuNxoDcuJrQEiq4b2WwSftzo513XS0e4BLhJsNiKUPmH64HMnTtit6+xB1FV1O4gk8Wf1 +6C4EKVf2LrTOtmcUgxYU5KJyQYIFgomCowUrG5FbRf5Nkk8IWyJfpTKWOutQj5pZcFZoEd5GGIJo +9Nnw9ytDQq6zibCTOYAgB5aDYGBwHFSMj4a4ENjBf1mdUqxTnc8qH8gFu10SRZ2W+WHDyYXOk6Aa +WAHEVOBuYEajNKbEBimY10m+okRGYsbnThH8O/Da+oIu9buyGedL3BnzWpjIkaO3uYklxw6c3PL9 +5nYwjK7acWQRZ6NiVlfBDvrz6lQ+Ufw4q3WMH0ggSo6D566p9huLAGOqoTvChiyZXrwMNFUKC/4N +T18cPeJPBD6LL0xMHv/11TDvmf4SVnEWhvxBGM+fNGFArud+cztoUxREiQOpNvFCviKTIkS/1R2t +AXeY1R+Vh3HQ3NX+bPAH+FLEUfgEuf8DTqhZcIqsQyql9R1Ib8Unx30pbMk623wNnqU9xqrzmtvx +ZdgFVMsCkRkLT5o44NdU8WxAUmXRoWlq0/+8uh1VFOtkUVF8lMix9JTxDIYx/c8vevO4SvVmII0D +bgZ7XWPej9jGCVuO1EixrI4Uirx6AXQGsNRClldZwAuvnMBgGfvN7aDVdSb16FTLI5NtvWnezujz +sSvGop5JWNBMsTwM+lzFdb9e8HrBGMGcfs4tUAarWh3lvYBviT4dWApQliiW23hh1HoG3ehHrpkQ +eRfTIzJSGo2GnREH7DjdWBhZjAMfXIULrJJAtRljFmIMno/wEpnqFV+mxE80wb5quRhvQ7oFMykk +2PHSeyIrXmUMxiFFC10z1qWSQHDAg6v8cZbw+CrMT7UYhAKcxLLT9mWwjmkPrfTMaQFhVpiB93x/ +g7Dpr6JeqBAhaZdzaHKIG0EfJqAPBZ5VIy9eeOV+g3aN9n9oOXk1YWk5rQxXe8GmPbCq6mxUltaY +PgQBo0iOF08dz2AeUx5a7Xt11RIcWvDhimuzjq/EgjwMnAO2vlI0sOzUfQf1eux3/wqaglxomKi+ +/RpDhBVs2gMr29WojLqOWK9ILZfLs+KUwQ2myQ+uxsJUlDBs0oL4JPD51KKYrRF6leB57ysJWHrq +xEE794l/WkWz5yHMpJ8i3i9eGX8r2NT7V4bVHinXvMXNu2z5ZMDStsgOPN4GL5puFZMnrfKOS68M +NCE+hCfxKpnpAiebs7xt38E9T4BHHgFmMqV7la95a8ggE20VmZp3wSbf/2K7KZJPVFOMzgTuI1Em +ks4MsPgNBE0sP22fQbu2+/9lLTmV6AOaqnUJygtc0GSuVHK8+Kr9BzeAbhX7T1yFmSLUOVuzKrJB +JFGw/f/0om/LkO0DkXwO8I9FpXVpLGcmLZ5UCSIGrHj14NYRJj+w0lcnUAbKLH/NlEE7l0n3vojl +jMDCenTbpu7QJ+HbYr05Q0sq2P5/fLGdDBBljI8D1wt6s3t7ppSH6k3KiRdPH+S7dxDrPHl5l4NF +k8NSQiYTAKciPkUkzJN8n3kQhTpRSoIJsljCzGotCuoHG1O/LyvATKx6zaShJ7srwPP75ZDLk6uY +6daA107RlGM1AReAfdJruDUidEypcnaDgk3644tPmzTSM8qrta5RFy0A91f9Ocb7gfXUg2lKOIme +kv+KDcETcPrpQ097R4377mPvloOoJHu2FHsTwWhlPKEYXcMIsL8HfRyYknyK2VwnQVHSC0GhyZ1G +G8c409yGN5m+yoWCdYL78XQyWx3OGc1BL81BL/tw0NCD34FjQv5wmvuM5r5emvt6q49MDR5n+Ld9 +8PlUS/BNB6ck31P3Gq68LGgecUoVbPvct+KYnDEG6RywS4DJ20bPH+/6vDUdK3pKyow1p+83hITt +Ac99SzHLhX6ebGdfHRBMD/Xcd2G09TeyJbOfgW4EUC7fteZVE+emvnXivUuPgNxMmcZgNtWkj9VA +lAgYZfu3NyIijXr74U8JWxiYM1afOQSm/ozx963EcLVnQtzYUf3z6Bh8TnecpLS+g7Hytx/I9LjD +zVt3+tQHtq68VFB+/5oDrdT7T3jD8GJEWzaVceYNe+5m4zYwlyWbqiVB1V8FOJM/qcuOtRsLcPER +Q4ipAOfe5dVORoEaU9tlPKVTgU+BzaI/O1uUzVgkNM9kvVZ216963ZRHoL8acMo5dWtu/LhT7kaM +xaN/iiJ9v/oxIgypDbmvw5vyLGAOYeWAcrGVjefsvWci59bl7DMhgD4wc5FWqtlelYqrrror4RyD +fwJOVP/OuvYAW+QCepG7q1guXrfp7OntDQ+S7doRv1v2XQX2nlC9z6WLybOPOoN/lG+h3Rvralv1 +YZDRrMVQINavnwwXMWAoiXfuENx6G3AR48YtI6j0a1OtT0uyCjghhZpNXAJ8VsYhmV6b6Gd81bGT +4UB3rTtzyt9ty91u1xMZ99tlk1y+aUzgSm8x+Jet+ATSPLTiOuAzmAqxxtci84D2mRjCOdhw9pSX +PYT2+f0yn5UpB0G8ZWqs2Y+l9uwYfDrL1Yh9k9LGYh6amhIVsv18r5Rr+rZTd2HzmQcu3ekgqoy9 +7lw2vamFE4VNNemL2TiqKeMxaeN/9gypFV9TVmejyF0q2pbWxIazXl6AGve7ZTXPslyEZMbix1Xk +t2EYan/gEyRI2Ku+oAi1TfQZKRdca3JLAMrOntx09uQntue+d8jZMOzuJfu25XIfiVz1bUj71/uy +jPP8odBaWFrv2E5/1nCCAIdKIwavziSx9z0rcHJhR8TGKktiHQ43+JTgMow8qv9gVRFbRjuy7/p9 +qG+tf92UlS91CjtFwRj72xVfw9zhiBnAtP7ehCpN50Jfk7GVzu3h78smAoxeK9F51oEDHjcjfrOa +5qCvKl0to/duFEUZNbgnYXwGUbW0lOFtkWI8wGsEjxms3XD2lHfuyPnsVC117G+Wz8b0Xpk1+4oS +NVfLTGJWRooZfKP5uvY/Kn6i14kBqXrNnrBxWXOL2Hz6wGrQxwPrGFbopMkgsCCjlCuZyB2zIwzs +9ZI+h3Gyxel36jh3bRPQHR57d2583eT37oxpBTtzzTay8SvFIDhK4kqJZxJSPMmKGsMfPpepB9/W +IIid5XVMXAmaCWjGsL6BZ8WN7u6mJTCi8MlcgrjqkpO4TOIZibvA90SJEHzFMjpi15T7bDEIjuoL +gqOC7tZ/2Fnz2iUrvdevl45RvnywBbmRgWgD+5nQcOpL8Cxjr043nvoTq0SfN79h9yrgY+5emlnJ +t5WOVs14uplr8cWXGe+1zKxVzK4QWl5qck91nn7A6p09v12/XW94pGnM1HFXyoJmyV0Fdsg2XuEL +eDq+QiPwWWxn1pDorEjh9Ts3+DvyvpVYhI0+SFB5NrpXfKehfwD+AWOvLJ2ojoa+ziz4IoCK+mH7 +rKmbdtUj3a0yf+TdSz9pcER4IzOQ96ome6ZE24ZESKWuk/gMUKiS0EWS5Wq0dFRTQH1tmd+9Dii8 +YeoOnU/rb5bQLF/xGqRS1BU3uwnbqtcQMl7Yv5rxTqBFoa6T6cetXCewJyXfO85gdfsbpn5qdzzH +AaM4jLpr8Vsx+yQKhoE7JFXtFNUj43/6X+B9iPXxnheRul/V0vAq73EyFOQoq0jPG7dfAW+9azE5 +a/ISx5VSjV7qS52qF2ganlF/Vtodn5Y9IdvwYoN2YT/seMPUb+7uZzfgtM9RcxafJLOHKoXeipgt +DdIaMN8+/BJgqbZhkrKEROpvWCUUCyPvXtbPcuMU+I82X337yq1+ppo75s0woYsL5077xUB5ZgPP +hLnjkWHDgwnTyVlAufhRMzsf785vCKLIiPma+uGbqgaVJOjsycObt54PPnzOYiykh4l7kOv7tcLT +9lTgRhKsall8bBHjv2jiUQX5a+TY0NnZt4yLGwdF92wQRcawO5ccK2x6gFrwVSdnRJ3+CS6i5IQ2 +EvqaKjtZSnpjkmXino5YKgNG57nxY67tjkUEFjLlBzUfjZcORqwZXrQixiyQmGXoO8B+2Qy2lnWI +zcf4KpIjCNZ2rnYPcsUBPQPtOQ2akHjbXUveHEgnIY4KG6k0ZFOMiJk+zPekFzirshDEP5zR3C5h +OAc+h8fqHz1VoVYrh8nhwznXgY2upy0lGWaFPSTTAwH8rfPcA34w0J/NoMuraJmz+A05x8dktBp2 +EKZ9pbQmk5XOK/i41fE16SUuiNI+ng/hKfla+/kk1iAWIQqGbu4878CbBsszGbTJOcPuXrKvSnwa +eHPItD8W0dwYRtXxReALQoWYyd1vJSrbQypoM3Qt8GnP4JkFtAi1vFnZ0LrwyJtTEl/rmzXtmcH2 +LAZvhtdsBRy7fjhNm1thBK3l7jnACdEuPYlWB1kP9DvANWBbtoqTCoOlMq5p7C3xHeBiox7JIRFN +rPKWYEV30HKcf9HcS2FsJxdbeQhEu2k03bXohMDZaMp2laE3k+FXSqbVRByav5J4D2brs5nvE1ld +VStfEwx+IjgrygRlEe7niqadIA57QAGfN9HTM+vA+wf72r/sck1b71j8WjnNJAfIDpJ0ldVRYlJ9 +1Kzma2qkJwmmmvgVcHS9lUzi0LCfSpoHAeTc872zDrz95bLmL++E5V8vOayp7K4xszxwIVJzPz/5 +gkJfU0KCzEDMAQ7MRGWq/RFg9n9IHQ53Y+n8gx58OS7znpD1Drcub2tqKd0DGmG+kfHeSC2xIyoV +mLLQ16Tz8KGw2wmdnomQObHzyqwEdCBWABSdnc+bDljycl7ePQNEUd3pl4s+GnIIHBJdhpjLMar7 +SHWPqKS/J3zPRkO3Fy846Io9ZU3zexqIit2lnzBcd6Gm5jxchrgmyZMjJZh0s4oG4v9Bxg/K8HVw +Zcp07ElrusdJotj4+bMzcrmmE4Smmyc12J4l/BbwcNmVn+ItBz+6Jy7jng2iqs60aEqQ14cj59nb +ERNStpY/5roQN4DKAC6wm7hg+hN78vINgShjBL9YdL2Mg0CHA/uH5v86TI8J28zjyy9n9umloZUa +AtHWxy+e/2oolQDdw1sOvnxoUdLj/wPaSDrGQq6emwAAAABJRU5ErkJggg== +" + preserveAspectRatio="none" + height="65.912712" + width="66.02755" /> + </g> + </g> +</switch> +</svg> diff --git a/homescreen/qml/images/Shortcut/shortcut.qrc b/homescreen/qml/images/Shortcut/shortcut.qrc index 5d67341..54df1ad 100644 --- a/homescreen/qml/images/Shortcut/shortcut.qrc +++ b/homescreen/qml/images/Shortcut/shortcut.qrc @@ -8,5 +8,11 @@ <file>mediaplayer_active.svg</file> <file>navigation.svg</file> <file>navigation_active.svg</file> + <file>video.svg</file> + <file>video_active.svg</file> + <file>sdl_usb.svg</file> + <file>sdl_usb_active.svg</file> + <file>blank.svg</file> + <file>blank_active.svg</file> </qresource> </RCC> diff --git a/homescreen/qml/images/Shortcut/video.svg b/homescreen/qml/images/Shortcut/video.svg new file mode 100644 index 0000000..e368922 --- /dev/null +++ b/homescreen/qml/images/Shortcut/video.svg @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + viewBox="0 0 195 217" + height="217" + width="195" + version="1.1" + id="svg2"> + <metadata + id="metadata8"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs6" /> + <image + y="0" + x="0" + id="image10" + xlink:href="data:image/png;base64,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 +saNgIER9vJAmFrMmFNr4923DxrbK3eEE48FgwnyeM+8JRbttnpoQvAnDeNY8Jobp2evzAtM+a/wq +xLBCG0jWKrRSqR82y+Iny2do43Qri+kZhgl6Ln94jzKqA0S1uAgtlDS/s9XM2nhRRafI4rmhQBO6 +PmNb5hjf8m+/V3lWAABFZ95IFM8JXudnis58A3X3BtsH9fmCEornD0woRWZEjKDcKOmhiPhVUfHL +4dbQb74/b96W6VoL0z4M23WhbhmpN5/ZXJ9ZqlZu3VpPVZ1bBWfS20f3Ntq91Hs7hZc5doPtpJ5Q +JGQNsug82bMEamPjJEQk9d6xp34GSR9kRW8CfUnVHa8XyMzu66LqgR51psgE6lCVnXnXMqmy8/ml +ekJGkvXOMkTQSy9V937HmRA9tayyUdVa0ajtXI4uZ20D7eGzaWZmZmZmZmZmZmZmZmZmZmZmZmZm +ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm +ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYv6v8BHUYYj+AaytYAAAAA +SUVORK5CYII= +" + style="image-rendering:optimizeQuality" + preserveAspectRatio="none" + height="217" + width="195" /> +</svg> diff --git a/homescreen/qml/images/Shortcut/video_active.svg b/homescreen/qml/images/Shortcut/video_active.svg new file mode 100644 index 0000000..344385f --- /dev/null +++ b/homescreen/qml/images/Shortcut/video_active.svg @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + viewBox="0 0 195 217" + height="217" + width="195" + version="1.1" + id="svg2"> + <metadata + id="metadata8"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs6" /> + <image + y="0" + x="0" + id="image10" + xlink:href="data:image/png;base64,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 +" + style="image-rendering:optimizeQuality" + preserveAspectRatio="none" + height="217" + width="195" /> +</svg> diff --git a/homescreen/qml/images/fullscreen.png b/homescreen/qml/images/fullscreen.png Binary files differnew file mode 100644 index 0000000..f56a13c --- /dev/null +++ b/homescreen/qml/images/fullscreen.png diff --git a/homescreen/qml/images/images.qrc b/homescreen/qml/images/images.qrc index 37ad676..39f7eb6 100644 --- a/homescreen/qml/images/images.qrc +++ b/homescreen/qml/images/images.qrc @@ -6,5 +6,10 @@ <file>Utility_Music_Background-01.png</file> <file>Utility_Radio_Background-01.png</file> <file>AGL_HMI_Blue_Background_NoCar-01.png</file> + <file>AGL_HMI_Full_Background.png</file> + <file>AGL_HMI_Normal_Background.png</file> + <file>fullscreen.png</file> + <file>normal.png</file> + <file>normal_disable.png</file> </qresource> </RCC> diff --git a/homescreen/qml/images/normal.png b/homescreen/qml/images/normal.png Binary files differnew file mode 100644 index 0000000..92dee7a --- /dev/null +++ b/homescreen/qml/images/normal.png diff --git a/homescreen/qml/images/normal_disable.png b/homescreen/qml/images/normal_disable.png Binary files differnew file mode 100644 index 0000000..f191241 --- /dev/null +++ b/homescreen/qml/images/normal_disable.png diff --git a/homescreen/qml/main.qml b/homescreen/qml/main.qml index 7d40276..a8d095b 100644 --- a/homescreen/qml/main.qml +++ b/homescreen/qml/main.qml @@ -26,6 +26,7 @@ Window { width: container.width * container.scale height: container.height * container.scale title: 'HomeScreen' + color: "#00000000" Image { id: container @@ -60,6 +61,145 @@ Window { Layout.preferredHeight: 215 } } + + + state: "normal" + + states: [ + State { + name: "normal" + PropertyChanges { + target: topArea + y: 0 + } + PropertyChanges { + target: applicationArea + y: 218 + } + PropertyChanges { + target: mediaArea + y: 1705 + } + }, + State { + name: "fullscreen" + PropertyChanges { + target: topArea + y: -220 + } + PropertyChanges { + target: applicationArea + y: -1490 + } + PropertyChanges { + target: mediaArea + y: 2135 + } + } + ] + transitions: Transition { + NumberAnimation { + target: topArea + property: "y" + easing.type: "OutQuad" + duration: 250 + } + NumberAnimation { + target: mediaArea + property: "y" + easing.type: "OutQuad" + duration: 250 + } + } + + } + Item { + id: switchBtn + width: 70 + height: 70 + anchors.right: parent.right + anchors.top: parent.top + z: 1 + property bool enableSwitchBtn: true + Image { + anchors.right: parent.right + anchors.rightMargin: 20 + anchors.top: parent.top + anchors.topMargin: 25 + width: 35 + height: 35 + id: image + source: './images/normal.png' + } + + MouseArea { + anchors.fill: parent + onClicked: { + if(switchBtn.enableSwitchBtn) { + var appName = homescreenHandler.getCurrentApplication() + if (container.state === 'normal') { + image.source = './images/fullscreen.png' + container.state = 'fullscreen' + touchArea.switchArea(1) + homescreenHandler.tapShortcut(appName, true) + container.opacity = 0.0 + } else { + image.source = './images/normal.png' + container.state = 'normal' + touchArea.switchArea(0) + homescreenHandler.tapShortcut(appName, false) + container.opacity = 1.0 + } + } + } + } + } + + Item { + id: rebootBtn + width: 70 + height: 70 + anchors.left: parent.left + anchors.top: parent.top + z: 1 + MouseArea { + anchors.fill: parent + onClicked: { + homescreenHandler.reboot(); + } + } + } + + function changeSwitchState(is_navigation) { + if(container.state === 'normal') { + if(is_navigation) { + switchBtn.enableSwitchBtn = true + image.source = './images/normal.png' + } else { + switchBtn.enableSwitchBtn = false + image.source = './images/normal_disable.png' + } + } + } + + Connections { + target: homescreenHandler + onShowWindow: { + container.state = 'normal' + image.visible = true + touchArea.switchArea(0) + container.opacity = 1.0 + } + } + + Connections { + target: homescreenHandler + onHideWindow: { + container.state = 'fullscreen' + image.visible = false + touchArea.switchArea(1) + container.opacity = 0.0 + } } Timer { diff --git a/homescreen/src/applicationlauncher.cpp b/homescreen/src/applicationlauncher.cpp index 5a1e2d6..a72ea9f 100644 --- a/homescreen/src/applicationlauncher.cpp +++ b/homescreen/src/applicationlauncher.cpp @@ -81,5 +81,6 @@ void ApplicationLauncher::setCurrent(const QString ¤t) { if (m_current == current) return; m_current = current; + qDebug() << "setCurrent" << m_current; emit currentChanged(current); } diff --git a/homescreen/src/homescreenhandler.cpp b/homescreen/src/homescreenhandler.cpp index 865f6a5..a06fa7e 100644 --- a/homescreen/src/homescreenhandler.cpp +++ b/homescreen/src/homescreenhandler.cpp @@ -17,13 +17,18 @@ #include <QFileInfo> #include "homescreenhandler.h" #include <functional> +#include <QProcess> +#include <dirent.h> +#include <stdio.h> #include "hmi-debug.h" +#define BUF_SIZE 1024 void* HomescreenHandler::myThis = 0; HomescreenHandler::HomescreenHandler(QObject *parent) : QObject(parent), - mp_qhs(NULL) + mp_qhs(NULL), + current_application("launcher") { } @@ -48,6 +53,7 @@ void HomescreenHandler::init(int port, const char *token, QLibWindowmanager *qwm mp_qhs->set_event_handler(QLibHomeScreen::Event_ShowWindow,[this](json_object *object){ HMI_DEBUG("Launcher","Surface launcher got Event_ShowWindow\n"); mp_qwm->activateWindow(m_myname); + emit showWindow(); }); mp_qhs->set_event_handler(QLibHomeScreen::Event_OnScreenMessage, [this](json_object *object){ @@ -83,17 +89,112 @@ void HomescreenHandler::init(int port, const char *token, QLibWindowmanager *qwm emit showInformation(QString(QLatin1String(info))); }); + + mp_qhs->set_event_handler(QLibHomeScreen::Event_HideWindow, [this](json_object *object) { + emit hideWindow(); + HMI_DEBUG("HomeScreen","set_event_handler Event_HideWindow"); + }); + + mp_qhs->set_event_handler(QLibHomeScreen::Event_RegisterShortcut,[this](json_object *object){ + HMI_DEBUG("HomeScreen","set_event_handler Event_RegisterShortcut"); + json_object *p_obj = json_object_object_get(object, "parameter"); + const char *shortcut_id = json_object_get_string( + json_object_object_get(p_obj, "shortcut_id")); + const char *shortcut_name = json_object_get_string( + json_object_object_get(p_obj, "shortcut_name")); + const char *position = json_object_get_string( + json_object_object_get(p_obj, "position")); + HMI_DEBUG("HomeScreen", "Event_RegisterShortcut id==%s, name==%s, position ==%s", shortcut_id, shortcut_name, position); + emit shortcutChanged(QString(QLatin1String(shortcut_id)), QString(QLatin1String(shortcut_name)), QString(QLatin1String(position))); + }); } -void HomescreenHandler::tapShortcut(QString application_id) +void HomescreenHandler::tapShortcut(QString application_id, bool is_full) { HMI_DEBUG("HomeScreen","tapShortcut %s", application_id.toStdString().c_str()); struct json_object* j_json = json_object_new_object(); struct json_object* value; - value = json_object_new_string("normal.full"); + if(is_full) { + value = json_object_new_string("fullscreen"); + HMI_DEBUG("HomeScreen","fullscreen"); + } else { + value = json_object_new_string("normal.full"); + HMI_DEBUG("HomeScreen","normal"); + } json_object_object_add(j_json, "area", value); + mp_qhs->showWindow(application_id.section('@', 0, 0).toStdString().c_str(), j_json); +} + +void HomescreenHandler::updateShortcut(QString id, struct json_object* object) +{ + mp_qhs->updateShortcut(id.toStdString().c_str(), object); +} + + +void HomescreenHandler::setCurrentApplication(QString application_name) +{ + HMI_DEBUG("HomeScreen","setCurrentApplication %s", application_name.toStdString().c_str()); + current_application = application_name; +} + +QString HomescreenHandler::getCurrentApplication() +{ + HMI_DEBUG("HomeScreen","getCurrentApplication %s", current_application.toStdString().c_str()); + return current_application; +} + +int HomescreenHandler::getPidOfApplication(QString application_name) { + DIR *dir = NULL; + struct dirent *dir_ent_ptr = NULL; + FILE *fp = NULL; + char file_path[50] = {0}; + char cur_task_ame[50] = {0}; + char buf[BUF_SIZE] = {0}; + int pid = -1; + + dir = opendir("/proc"); + if (dir) { + while((dir_ent_ptr = readdir(dir)) != NULL) { + if ((strcmp(dir_ent_ptr->d_name, ".") == 0) || (strcmp(dir_ent_ptr->d_name, "..") == 0) + || (DT_DIR != dir_ent_ptr->d_type)) + continue; + sprintf(file_path, "/proc/%s/status", dir_ent_ptr->d_name); + fp = fopen(file_path, "r"); + if (fp) { + if (fgets(buf, BUF_SIZE - 1, fp) == NULL) { + fclose(fp); + continue; + } + sscanf(buf, "%*s %s", cur_task_ame); + if (0 == strcmp(application_name.toStdString().c_str(), cur_task_ame)) { + pid = atoi(dir_ent_ptr->d_name); + break; + } + } + } + } - mp_qhs->showWindow(application_id.toStdString().c_str(), j_json); + return pid; +} + +void HomescreenHandler::killRunningApplications() +{ + QProcess *proc = new QProcess; + QProcess *proc2 = new QProcess; +// int num = getPidOfApplication("afbd-video@0.1"); +// QString procNum = QString::number(num); + QString command = "/usr/bin/pkill videoplayer"; + QString command2 = "/usr/bin/pkill navigation"; + proc->start(command); + proc2->start(command2); + HMI_DEBUG("homescreen", command.toStdString().c_str()); + HMI_DEBUG("homescreen", command2.toStdString().c_str()); +} + +void HomescreenHandler::reboot() +{ + QProcess::execute("sync"); + QProcess::execute("reboot -f"); } void HomescreenHandler::onRep_static(struct json_object* reply_contents) diff --git a/homescreen/src/homescreenhandler.h b/homescreen/src/homescreenhandler.h index d617737..4afbac4 100644 --- a/homescreen/src/homescreenhandler.h +++ b/homescreen/src/homescreenhandler.h @@ -34,7 +34,12 @@ public: void init(int port, const char* token, QLibWindowmanager *qwm, QString myname); - Q_INVOKABLE void tapShortcut(QString application_id); + Q_INVOKABLE void tapShortcut(QString application_name, bool is_full); + Q_INVOKABLE QString getCurrentApplication(); + Q_INVOKABLE void killRunningApplications(); + Q_INVOKABLE void reboot(); + void setCurrentApplication(QString application_name); + int getPidOfApplication(QString application_name); void onRep(struct json_object* reply_contents); void onEv(const string& event, struct json_object* event_contents); @@ -47,10 +52,18 @@ public: signals: void showNotification(QString application_id, QString icon_path, QString text); void showInformation(QString info); + void shortcutChanged(QString shortcut_id, QString shortcut_name, QString position); + void showWindow(); + void hideWindow(); + +public slots: + void updateShortcut(QString id, struct json_object* object); + private: QLibHomeScreen *mp_qhs; QLibWindowmanager *mp_qwm; QString m_myname; + QString current_application; }; #endif // HOMESCREENHANDLER_H diff --git a/homescreen/src/main.cpp b/homescreen/src/main.cpp index ec0a76b..0c477fd 100644 --- a/homescreen/src/main.cpp +++ b/homescreen/src/main.cpp @@ -22,6 +22,7 @@ #include <QtQml/QQmlContext> #include <QtQml/qqml.h> #include <QQuickWindow> +#include <QThread> #include <qlibwindowmanager.h> #include <weather.h> @@ -31,6 +32,8 @@ #include "afm_user_daemon_proxy.h" #include "mastervolume.h" #include "homescreenhandler.h" +#include "toucharea.h" +#include "shortcutappmodel.h" #include "hmi-debug.h" // XXX: We want this DBus connection to be shared across the different @@ -91,9 +94,12 @@ int main(int argc, char *argv[]) // qmlRegisterType<ApplicationLauncher>("HomeScreen", 1, 0, "ApplicationLauncher"); qmlRegisterType<StatusBarModel>("HomeScreen", 1, 0, "StatusBarModel"); qmlRegisterType<MasterVolume>("MasterVolume", 1, 0, "MasterVolume"); + qmlRegisterType<ShortcutAppModel>("ShortcutAppModel", 1, 0, "ShortcutAppModel"); ApplicationLauncher *launcher = new ApplicationLauncher(); QLibWindowmanager* layoutHandler = new QLibWindowmanager(); + HomescreenHandler* homescreenHandler = new HomescreenHandler(); + ShortcutAppModel* shortcutAppModel = new ShortcutAppModel(); if(layoutHandler->init(port,token) != 0){ exit(EXIT_FAILURE); } @@ -104,24 +110,6 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - layoutHandler->set_event_handler(QLibWindowmanager::Event_SyncDraw, [layoutHandler, &graphic_role](json_object *object) { - layoutHandler->endDraw(graphic_role); - }); - - layoutHandler->set_event_handler(QLibWindowmanager::Event_ScreenUpdated, [layoutHandler, launcher](json_object *object) { - json_object *jarray = json_object_object_get(object, "ids"); - int arrLen = json_object_array_length(jarray); - for( int idx = 0; idx < arrLen; idx++) - { - QString label = QString(json_object_get_string( json_object_array_get_idx(jarray, idx) )); - HMI_DEBUG("HomeScreen","Event_ScreenUpdated application: %s.", label.toStdString().c_str()); - QMetaObject::invokeMethod(launcher, "setCurrent", Qt::QueuedConnection, Q_ARG(QString, label)); - } - }); - - HomescreenHandler* homescreenHandler = new HomescreenHandler(); - homescreenHandler->init(port, token.toStdString().c_str(), layoutHandler, graphic_role); - QUrl bindingAddress; bindingAddress.setScheme(QStringLiteral("ws")); bindingAddress.setHost(QStringLiteral("localhost")); @@ -132,11 +120,16 @@ int main(int argc, char *argv[]) query.addQueryItem(QStringLiteral("token"), token); bindingAddress.setQuery(query); + TouchArea* touchArea = new TouchArea(); + homescreenHandler->init(port, token.toStdString().c_str(), layoutHandler, graphic_role); + // mail.qml loading QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("bindingAddress", bindingAddress); engine.rootContext()->setContextProperty("layoutHandler", layoutHandler); engine.rootContext()->setContextProperty("homescreenHandler", homescreenHandler); + engine.rootContext()->setContextProperty("touchArea", touchArea); + engine.rootContext()->setContextProperty("shortcutAppModel", shortcutAppModel); engine.rootContext()->setContextProperty("launcher", launcher); engine.rootContext()->setContextProperty("weather", new Weather(bindingAddress)); engine.rootContext()->setContextProperty("bluetooth", new Bluetooth(bindingAddress, engine.rootContext())); @@ -147,9 +140,44 @@ int main(int argc, char *argv[]) QQuickWindow *window = qobject_cast<QQuickWindow *>(root); homescreenHandler->setQuickWindow(window); + layoutHandler->set_event_handler(QLibWindowmanager::Event_SyncDraw, [layoutHandler, &graphic_role](json_object *object) { + layoutHandler->endDraw(graphic_role); + }); + + layoutHandler->set_event_handler(QLibWindowmanager::Event_ScreenUpdated, [layoutHandler, launcher, homescreenHandler, root](json_object *object) { + json_object *jarray = json_object_object_get(object, "ids"); + HMI_DEBUG("HomeScreen","ids=%s", json_object_to_json_string(object)); + int arrLen = json_object_array_length(jarray); + QString label = QString(""); + for( int idx = 0; idx < arrLen; idx++) + { + label = QString(json_object_get_string( json_object_array_get_idx(jarray, idx) )); + HMI_DEBUG("HomeScreen","Event_ScreenUpdated application11: %s.", label.toStdString().c_str()); + homescreenHandler->setCurrentApplication(label); + QMetaObject::invokeMethod(launcher, "setCurrent", Qt::QueuedConnection, Q_ARG(QString, label)); + } + if((arrLen == 1) && (QString("navigation") == label)){ + QMetaObject::invokeMethod(root, "changeSwitchState", Q_ARG(QVariant, true)); + }else{ + QMetaObject::invokeMethod(root, "changeSwitchState", Q_ARG(QVariant, false)); + } + }); + + touchArea->setWindow(window); + QThread* thread = new QThread; + touchArea->moveToThread(thread); + QObject::connect(thread, &QThread::started, touchArea, &TouchArea::init); + + thread->start(); + QList<QObject *> sobjs = engine.rootObjects(); StatusBarModel *statusBar = sobjs.first()->findChild<StatusBarModel *>("statusBar"); statusBar->init(bindingAddress, engine.rootContext()); + QObject::connect(homescreenHandler, SIGNAL(shortcutChanged(QString, QString, QString)), shortcutAppModel, SLOT(changeShortcut(QString, QString, QString))); + QObject::connect(shortcutAppModel, SIGNAL(shortcutUpdated(QString, struct json_object*)), homescreenHandler, SLOT(updateShortcut(QString, struct json_object*))); + + shortcutAppModel->screenUpdated(); + return a.exec(); } diff --git a/homescreen/src/shortcutappmodel.cpp b/homescreen/src/shortcutappmodel.cpp new file mode 100644 index 0000000..76078da --- /dev/null +++ b/homescreen/src/shortcutappmodel.cpp @@ -0,0 +1,268 @@ +/* + * Copyright (c) 2017 TOYOTA MOTOR CORPORATION + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "shortcutappmodel.h" +#include "hmi-debug.h" +#include <unistd.h> +#define SHORTCUTKEY_PATH "/var/local/lib/afm/applications/homescreen/0.1/etc/registeredApp.json" + +class ShortcutAppModel::Private +{ +public: + Private(); + + QList<RegisterApp> data; +}; + +ShortcutAppModel::Private::Private() +{ +} + + +ShortcutAppModel::ShortcutAppModel(QObject *parent) + : QAbstractListModel(parent) + , d(new Private()) +{ + getAppQueue(); +} + +ShortcutAppModel::~ShortcutAppModel() +{ + delete this->d; +} + +int ShortcutAppModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + + return this->d->data.count(); +} + +QVariant ShortcutAppModel::data(const QModelIndex &index, int role) const +{ + QVariant ret; + if (!index.isValid()) + return ret; + + switch (role) { + case Qt::DecorationRole: + ret = this->d->data[index.row()].icon; + break; + case Qt::DisplayRole: + ret = this->d->data[index.row()].name; + break; + case Qt::UserRole: + ret = this->d->data[index.row()].id; + break; + default: + break; + } + + return ret; +} + +QHash<int, QByteArray> ShortcutAppModel::roleNames() const +{ + QHash<int, QByteArray> roles; + roles[Qt::DecorationRole] = "icon"; + roles[Qt::DisplayRole] = "name"; + roles[Qt::UserRole] = "id"; + return roles; +} + +void ShortcutAppModel::changeShortcut(QString id, QString name, QString position) +{ + for(int i = 1; i < d->data.size(); i++) { + if(id == d->data.at(i).id) { + return; + } + } + d->data.removeAt(position.toInt() + 1); + + RegisterApp temp; + temp.id = id; + temp.name = name; + temp.icon = temp.icon = getIconPath(temp.id); + if (temp.icon == "") { + temp.isBlank = true; + } else { + temp.isBlank = false; + } + + d->data.insert(position.toInt() + 1, temp); + setAppQueue(); + emit updateShortcut(); + struct json_object* obj = makeAppListJson(); + emit shortcutUpdated(QString("launcher"), obj); +} + +struct json_object* ShortcutAppModel::makeAppListJson() +{ + struct json_object* obj = json_object_new_object(); + struct json_object* obj_array = json_object_new_array(); + for(int i = 1; i < d->data.size(); i++) + { + struct json_object* obj_shortcut = json_object_new_object(); + json_object_object_add(obj_shortcut, "shortcut_id", json_object_new_string(d->data.at(i).id.toStdString().c_str())); + json_object_object_add(obj_shortcut, "shortcut_name", json_object_new_string(d->data.at(i).name.toStdString().c_str())); + json_object_array_add(obj_array, obj_shortcut); + } + json_object_object_add(obj, "shortcut", obj_array); + HMI_DEBUG("Homescreen", "makeAppListJson id1=%s",json_object_new_string(d->data.at(1).name.toStdString().c_str())); + return obj; +} + +QString ShortcutAppModel::getId(int index) const +{ + return d->data.at(index).id; +} + +QString ShortcutAppModel::getName(int index) const +{ + return d->data.at(index).name; +} + +QString ShortcutAppModel::getIcon(int index) const +{ + return d->data.at(index).icon; +} + +bool ShortcutAppModel::isBlank(int index) const +{ + return d->data.at(index).isBlank; +} + +QString ShortcutAppModel::getIconPath(QString id) +{ + QString name = id.section('@', 0, 0); + QString version = id.section('@', 1, 1); + QString boardIconPath = "/var/local/lib/afm/applications/" + name + "/" + version + "/icon.svg"; + QString appIconPath = ":/images/Shortcut/" + name + ".svg"; + if (QFile::exists(boardIconPath)) { + return "file://" + boardIconPath; + } else if (QFile::exists(appIconPath)) { + return appIconPath.section('/', 1, -1); + } + return ""; +} + +void ShortcutAppModel::getAppQueue() +{ + QProcess *process = new QProcess(this); + if(checkAppFile()) { + process->start("cp /var/local/lib/afm/applications/homescreen/0.1/etc/registeredApp.aaa.json /var/local/lib/afm/applications/homescreen/0.1/etc/registeredApp.json"); + } else { + process->start("cp /var/local/lib/afm/applications/homescreen/0.1/etc/registeredApp.json /var/local/lib/afm/applications/homescreen/0.1/etc/registeredApp.aaa.json"); + } + QThread::msleep(300); + + QFile file(SHORTCUTKEY_PATH); + if(file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QByteArray allData = file.readAll(); + QString str(allData); + if(str == "") { + file.close(); + + } + QJsonParseError json_error; + QJsonDocument jsonDoc(QJsonDocument::fromJson(allData, &json_error)); + + if(json_error.error != QJsonParseError::NoError) + { + HMI_ERROR("HomeScreen", "registeredApp.json error"); + return; + } + + QJsonObject rootObj = jsonDoc.object(); + + QJsonObject subObj = rootObj.value("1st shortcut key").toObject(); + setAppQueuePoint(subObj["id"].toString(), subObj["name"].toString()); + subObj = rootObj.value("2nd shortcut key").toObject(); + setAppQueuePoint(subObj["id"].toString(), subObj["name"].toString()); + subObj = rootObj.value("3rd shortcut key").toObject(); + setAppQueuePoint(subObj["id"].toString(), subObj["name"].toString()); + subObj = rootObj.value("4th shortcut key").toObject(); + setAppQueuePoint(subObj["id"].toString(), subObj["name"].toString()); + } + file.close(); +} + +void ShortcutAppModel::setAppQueuePoint(QString id, QString name) +{ + app.id = id; + app.icon = getIconPath(app.id); + if (app.icon == "") { + app.isBlank = true; + } else { + app.isBlank = false; + } + app.name = name; + d->data.append(app); +} + +void ShortcutAppModel::screenUpdated() +{ + struct json_object* obj = makeAppListJson(); + emit shortcutUpdated(QString("launcher"), obj); +} + +void ShortcutAppModel::setAppQueue() +{ + QFile file(SHORTCUTKEY_PATH); + if(file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QJsonObject rootObj, subObj1, subObj2, subObj3, subObj4; + subObj1.insert("id", d->data.at(0).id); + subObj1.insert("name", d->data.at(0).name); + subObj2.insert("id", d->data.at(1).id); + subObj2.insert("name", d->data.at(1).name); + subObj3.insert("id", d->data.at(2).id); + subObj3.insert("name", d->data.at(2).name); + subObj4.insert("id", d->data.at(3).id); + subObj4.insert("name", d->data.at(3).name); + rootObj.insert("1st shortcut key", subObj1); + rootObj.insert("2nd shortcut key", subObj2); + rootObj.insert("3rd shortcut key", subObj3); + rootObj.insert("4th shortcut key", subObj4); + + QJsonDocument jsonDoc; + jsonDoc.setObject(rootObj); + + file.write(jsonDoc.toJson()); + } else { + HMI_ERROR("HomeScreen", "write to registeredApp.json file failed"); + } + file.flush(); + fsync(file.handle()); + file.close(); +} + +bool ShortcutAppModel::checkAppFile() +{ + bool fileError = false; + QFile file(SHORTCUTKEY_PATH); + if(file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QByteArray line = file.readLine(); + if(line == "\n" || line.isEmpty()) { + fileError = true; + } + } else { + fileError = true; + HMI_ERROR("HomeScreen", "registeredApp.json file open failed"); + } + file.close(); + return fileError; +} diff --git a/homescreen/src/shortcutappmodel.h b/homescreen/src/shortcutappmodel.h new file mode 100644 index 0000000..f177a95 --- /dev/null +++ b/homescreen/src/shortcutappmodel.h @@ -0,0 +1,62 @@ +#ifndef SHORTCUTAPPMODEL_H +#define SHORTCUTAPPMODEL_H + +#include <QtCore/QAbstractListModel> +#include <QXmlStreamReader> +#include <QXmlStreamWriter> +#include <QFile> +#include <QProcess> +#include <QThread> +#include <QJsonDocument> +#include <QJsonParseError> +#include <QJsonObject> +#include <json_object.h> + +struct RegisterApp { + QString id; + QString name; + QString icon; + bool isBlank; +}; + +class ShortcutAppModel : public QAbstractListModel +{ + Q_OBJECT +public: + explicit ShortcutAppModel(QObject *parent = nullptr); + ~ShortcutAppModel(); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QHash<int, QByteArray> roleNames() const override; + + Q_INVOKABLE QString getId(int index) const; + Q_INVOKABLE QString getName(int index) const; + Q_INVOKABLE QString getIcon(int index) const; + Q_INVOKABLE bool isBlank(int index) const; + + void screenUpdated(); + +public slots: + void changeShortcut(QString id, QString name, QString position); + +signals: + void updateShortcut(); + void shortcutUpdated(QString id, struct json_object* object); + +private: + void getAppQueue(); + void setAppQueue(); + bool checkAppFile(); + void setAppQueuePoint(QString id, QString name); + QString getIconPath(QString id); + struct json_object* makeAppListJson(); + + class Private; + Private *d; + RegisterApp app; + +}; + +#endif // SHORTCUTAPPMODEL_H diff --git a/homescreen/src/toucharea.cpp b/homescreen/src/toucharea.cpp new file mode 100644 index 0000000..1cf4384 --- /dev/null +++ b/homescreen/src/toucharea.cpp @@ -0,0 +1,36 @@ +#include "toucharea.h" +#include "hmi-debug.h" + +TouchArea::TouchArea() +{ +} + +TouchArea::~TouchArea() +{ + +} + +void TouchArea::setWindow(QQuickWindow *window) +{ + myWindow = window; +} + +void TouchArea::init() +{ + bitmapNormal = QPixmap(":/images/AGL_HMI_Normal_Background.png").createHeuristicMask(); + bitmapFullscreen = QPixmap(":/images/AGL_HMI_Full_Background.png").createHeuristicMask(); + myWindow->setMask(QRegion(bitmapNormal)); +} + +void TouchArea::switchArea(int areaType) +{ + if(areaType == NORMAL) { + myWindow->setMask(QRegion(bitmapNormal)); + HMI_DEBUG("HomeScreen","TouchArea switchArea: %d.", areaType); + } else if (areaType == FULLSCREEN) { + HMI_DEBUG("HomeScreen","TouchArea switchArea: %d.", areaType); + myWindow->setMask(QRegion(bitmapFullscreen)); + } +} + + diff --git a/homescreen/src/toucharea.h b/homescreen/src/toucharea.h new file mode 100644 index 0000000..69c6872 --- /dev/null +++ b/homescreen/src/toucharea.h @@ -0,0 +1,30 @@ +#ifndef TOUCHAREA_H +#define TOUCHAREA_H + +#include <QBitmap> +#include <QQuickWindow> + +enum { + NORMAL=0, + FULLSCREEN +}; + +class TouchArea : public QObject +{ + Q_OBJECT +public: + explicit TouchArea(); + ~TouchArea(); + + Q_INVOKABLE void switchArea(int areaType); + void setWindow(QQuickWindow* window); + +public slots: + void init(); + +private: + QBitmap bitmapNormal, bitmapFullscreen; + QQuickWindow* myWindow; +}; + +#endif // TOUCHAREA_H diff --git a/package/etc/registeredApp.aaa.json b/package/etc/registeredApp.aaa.json new file mode 100644 index 0000000..490b33c --- /dev/null +++ b/package/etc/registeredApp.aaa.json @@ -0,0 +1,18 @@ +{ + "1st shortcut key": { + "id": "launcher@0.1", + "name": "launcher" + }, + "2nd shortcut key": { + "id": "sdl_usb@5.0", + "name": "sdl_usb" + }, + "3rd shortcut key": { + "id": "video@0.1", + "name": "video" + }, + "4th shortcut key": { + "id": "navigation@0.1", + "name": "navigation" + } +} diff --git a/package/etc/registeredApp.json b/package/etc/registeredApp.json new file mode 100644 index 0000000..490b33c --- /dev/null +++ b/package/etc/registeredApp.json @@ -0,0 +1,18 @@ +{ + "1st shortcut key": { + "id": "launcher@0.1", + "name": "launcher" + }, + "2nd shortcut key": { + "id": "sdl_usb@5.0", + "name": "sdl_usb" + }, + "3rd shortcut key": { + "id": "video@0.1", + "name": "video" + }, + "4th shortcut key": { + "id": "navigation@0.1", + "name": "navigation" + } +} diff --git a/package/package.pro b/package/package.pro index 09c7a01..1f175d3 100644 --- a/package/package.pro +++ b/package/package.pro @@ -12,6 +12,12 @@ copy_config.commands = $(COPY_FILE) \"$$replace(copy_config.depends, /, $$QMAKE_ QMAKE_EXTRA_TARGETS += copy_config PRE_TARGETDEPS += $$copy_config.target +copy_json.target = $$OUT_PWD/root/etc +copy_json.depends = $$_PRO_FILE_PWD_/etc +copy_json.commands = $(COPY_DIR) \"$$replace(copy_json.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_json.target, /, $$QMAKE_DIR_SEP)\" +QMAKE_EXTRA_TARGETS += copy_json +PRE_TARGETDEPS += $$copy_json.target + wgt.target = package wgt.commands = wgtpkg-pack -f -o homescreen.wgt root |