Merge lp:~unity-team/unity8/new-scopes into lp:unity8
- new-scopes
- Merge into trunk
Status: | Rejected |
---|---|
Rejected by: | Michał Sawicz |
Proposed branch: | lp:~unity-team/unity8/new-scopes |
Merge into: | lp:unity8 |
Diff against target: |
2757 lines (+912/-577) 53 files modified
data/unity8.conf (+5/-0) debian/control (+4/-1) debian/unity8.install (+1/-0) plugins/DashViews/listviewwithpageheader.cpp (+7/-0) po/ug.po (+2/-1) qml/Components/ApplicationManagerWrapper.qml (+8/-0) qml/Components/ApplicationScreenshot.qml (+1/-2) qml/Components/ListItems/Header.qml (+2/-14) qml/Components/PageHeader.qml (+26/-2) qml/Components/ResponsiveGridView.qml (+0/-1) qml/Components/SeeMore.qml (+4/-2) qml/Components/Showable.qml (+8/-0) qml/Components/Stage.qml (+13/-8) qml/Dash/Apps/RunningApplicationTile.qml (+2/-3) qml/Dash/Card.qml (+18/-2) qml/Dash/CardCarousel.qml (+78/-0) qml/Dash/CardFilterGrid.qml (+59/-0) qml/Dash/CardHeader.qml (+36/-19) qml/Dash/CardTool.qml (+7/-2) qml/Dash/Dash.qml (+49/-4) qml/Dash/DashApps.qml (+4/-19) qml/Dash/DashContent.qml (+48/-32) qml/Dash/DashContentOpenEffect.qml (+0/-57) qml/Dash/DashContentTabBarStyle.qml (+3/-0) qml/Dash/DashFilterGrid.qml (+4/-2) qml/Dash/DashPreviewPlaceholder.qml (+1/-1) qml/Dash/DashRenderer.qml (+6/-0) qml/Dash/GenericScopeView.qml (+64/-114) qml/Dash/PreviewListView.qml (+59/-138) qml/Dash/Previews/Preview.qml (+20/-15) qml/Dash/Previews/PreviewActions.qml (+1/-1) qml/Dash/Previews/PreviewAudioPlayback.qml (+3/-3) qml/Dash/Previews/PreviewHeader.qml (+3/-1) qml/Dash/Previews/PreviewImageGallery.qml (+10/-0) qml/Dash/Previews/PreviewTextSummary.qml (+6/-3) qml/Dash/Previews/PreviewWidgetFactory.qml (+1/-1) qml/Dash/ScopeDelegateMapper.qml (+1/-1) qml/Dash/ScopeItem.qml (+94/-0) qml/Dash/SearchableResultModel.qml (+1/-1) qml/Launcher/Launcher.qml (+0/-1) qml/Launcher/LauncherPanel.qml (+0/-1) qml/Panel/MenuContent.qml (+1/-0) qml/ScopeTool.qml (+9/-1) qml/Shell.qml (+156/-108) qml/ShellOrientator.qml (+43/-0) src/main.cpp (+11/-1) tests/mocks/Unity/fake_unity_plugin.cpp (+8/-1) tests/plugins/DashViews/organicgridtest.cpp (+2/-1) tests/plugins/DashViews/verticaljournaltest.cpp (+2/-1) tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp (+8/-0) tests/qmltests/Dash/Previews/tst_Preview.qml (+1/-1) tests/qmltests/Dash/tst_GenericScopeView.qml (+11/-11) tools/registry-tracker.cpp (+1/-0) |
To merge this branch: | bzr merge lp:~unity-team/unity8/new-scopes |
Related bugs: |
|
Related blueprints: |
list of todo's for unity8 MWC demo prep
(Undefined)
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
PS Jenkins bot (community) | continuous-integration | Needs Fixing | |
Review via email: mp+198359@code.launchpad.net |
Commit message
Description of the change
- 563. By Michal Hruby
-
Merged trunk
- 564. By Michał Sawicz
-
merge trunk
- 565. By Michal Hruby
-
Merge trunk
- 566. By Michał Sawicz
-
Merge trunk.
- 567. By Michal Hruby
-
Merged trunk
- 568. By Michal Hruby
-
Bump module import version in scope tool
- 569. By Michał Sawicz
-
Get layout from category template.
- 570. By Michał Sawicz
-
Get components from the scope.
- 571. By Michał Sawicz
-
Initial Carousel integration.
- 572. By Michał Sawicz
-
Fix indentation, add name to the Card test suite.
- 573. By Michał Sawicz
-
Add copyright headers.
- 574. By Michał Sawicz
-
Merge trunk
- 575. By Michał Sawicz
-
Add name to tst_CardHeader.qml.
- 576. By Michał Karnicki
-
Horizontal Card layout.
- 577. By Michał Sawicz
-
Merge trunk.
- 578. By Michał Sawicz
-
Merge trunk.
- 579. By Michał Sawicz
-
Merge trunk.
- 580. By Michal Hruby
-
Update Unity plugin version req in PreviewListView.qml
- 581. By Michał Sawicz
-
Merge trunk.
- 582. By Michal Hruby
-
Merged trunk
- 583. By Michał Sawicz
-
Merge trunk.
- 584. By Michał Karnicki
-
Minimum number of items in the carousel is 5.
- 585. By Michał Sawicz
-
Merge trunk.
- 586. By Michal Hruby
-
Enable taps, pass correct params to preview and activate
- 587. By Michał Sawicz
-
Merge trunk.
- 588. By Michał Sawicz
-
Merge trunk.
- 589. By Michał Sawicz
-
Use CardTool in CardFilterGrid and CardCarousel.
- 590. By Michał Sawicz
-
Disable Card in CardCarousel to not eat any input.
PS Jenkins bot (ps-jenkins) wrote : | # |
- 591. By Michał Sawicz
- 592. By Michał Sawicz
- 593. By Michał Sawicz
- 594. By Michał Sawicz
- 595. By Michał Sawicz
- 596. By Michał Sawicz
- 597. By Michał Sawicz
- 598. By Michał Sawicz
- 599. By Michał Sawicz
- 600. By Michał Sawicz
- 601. By Michał Sawicz
- 602. By Michał Sawicz
- 603. By Michał Sawicz
- 604. By Michał Sawicz
- 605. By Albert Astals Cid
- 606. By Albert Astals Cid
-
Merge lp:~unity-team/unity8/unity8-card-overlay again
- 607. By Michal Hruby
-
Display only top-level scopes when running on the device
- 608. By Michal Hruby
-
Pipe through stdout and stderr of the scopes
- 609. By Michał Karnicki
-
Merge newscopes-
new-dash- look. - 610. By Michal Hruby
- 611. By Michal Hruby
-
Merge trunk
- 612. By Albert Astals Cid
- 613. By Michal Hruby
-
Merge trunk
- 614. By Michal Hruby
- 615. By Michal Hruby
- 616. By Michal Hruby
- 617. By Michal Hruby
- 618. By Michal Hruby
- 619. By kevin gunn
-
merge in lp:~gerboland/unity8/sidestage-unlock-sidestage-appears
- 620. By kevin gunn
-
merge in lp:~gerboland/unity8/sidestage-unlock-sidestage-appears
- 621. By kevin gunn
- 622. By kevin gunn
-
whitespace update
- 623. By kevin gunn
-
update from trunk
- 624. By Albert Astals Cid
-
Merge lp:unity8
- 625. By Albert Astals Cid
- 626. By Albert Astals Cid
- 627. By Albert Astals Cid
- 628. By Albert Astals Cid
- 629. By Michal Hruby
-
Use PreviewStack and per-column widget models
- 630. By Albert Astals Cid
- 631. By Albert Astals Cid
- 632. By Albert Astals Cid
-
Merge lp:~aacid/unity8/new-scopes-preview-sometimes-disappears
- 633. By Michal Hruby
-
Remove blending rectangle, so previews aren't grey
- 634. By Michal Hruby
- 635. By Michal Hruby
-
Don't override scope list if already specified
- 636. By Michal Hruby
-
Fix the condition
- 637. By kevin gunn
-
merge in lp:~unity-team/unity8/rotate-n7 which is not to productized
- 638. By Michal Hruby
- 639. By Michal Hruby
- 640. By Albert Astals Cid
-
Remerge lp:~unity-team/unity8/rotate-n7
- 641. By Albert Astals Cid
- 642. By Albert Astals Cid
-
Merge lp:~aacid/unity8/show_video_playback_screenshot_loading_indicator
- 643. By Michał Sawicz
-
Tweak recommended scopes.
- 644. By Albert Astals Cid
- 645. By Michał Sawicz
-
Make Click scope the default.
- 646. By Scott Sweeny
-
temporary fix for 'See more' and 'See less' text color in previews
- 647. By Michał Sawicz
-
Merge trunk.
- 648. By Michał Sawicz
- 649. By Michał Sawicz
-
Fix running apps font.
- 650. By Michał Sawicz
- 651. By Michał Sawicz
-
Depend instead of Recommend the scopes, to make the image build work.
- 652. By Albert Astals Cid
-
Add back the workaround for not being able scroll the image gallery
Taken from AppPreview.qml
- 653. By Michał Karnicki
-
Update category label font color.
- 654. By Albert Astals Cid
-
Back button improvements
Move the back button to the header itself so it will be shown when the search is out too.
Make the back "button" bigger than the image - 655. By Michał Karnicki
-
Change 'Running Apps' to 'Recent'.
- 656. By Michał Sawicz
-
Fix header colours and chevrons.
- 657. By Michał Sawicz
-
Directly activate scopes, too.
- 658. By Albert Astals Cid
-
Hotfix Dash header positioning
Make sure that after calling positionAtBeginning (what we do when swiping from an app back to the dash) the header is correctly in place
Also make sure the pageHeader position is not controlled by non curret scopes - 659. By Michał Sawicz
-
Implement collapsed-rows support.
- 660. By Michał Sawicz
-
Clip dash when temporary visible.
- 661. By Michał Sawicz
-
Cache images in cards.
- 662. By Michał Sawicz
-
Resync.
- 663. By Michał Sawicz
-
Make sure SEARCH goes away when in previews.
- 664. By Michał Sawicz
-
Add preview columns support, fix spacing, clipping and cacheBuffer in previews.
- 665. By Albert Astals Cid
-
MouseArea -> AbstractButton to get haptics
- 666. By Jussi Pakkanen
-
Move downloads to their own threads so they don't muck about with the parent thread's event loop.
- 667. By Michał Sawicz
-
Merge trunk
- 668. By Michał Sawicz
- 669. By Daniel d'Andrada
-
When focus is requested by the app manager, only call the correct stage.
Instead of activating both stages and letting the correct one work it out.
- 670. By Gerry Boland
-
[sidestage] hide side stage if all side stage apps are closed
- 671. By Michał Sawicz
-
Fix default background.
- 672. By Gerry Boland
-
[tablet] enable launcher in greeter when allowed
- 673. By Michał Sawicz
-
Add preview activity indicator and fix subsequent preview input.
- 674. By Michael Terry
-
Merge lp:~mterry/unity8/ensure-selected-greeter.
Ensure that the selected() signal is emitted by the greeter on startup, fixing the background on startup for the first user in tablet mode.
- 675. By Michał Sawicz
-
Make sure activity indicator is only on screen when preview available, and make image widget fit on screen.
- 676. By Michał Sawicz
-
Improve visuals and close preview on home button press.
- 677. By Michał Karnicki
-
Fix CardHeader title font weight.
- 678. By Michał Sawicz
- 679. By Gerry Boland
-
Prevent sidestage from popping out incorrectly when app launched indirectly
- 680. By Michał Sawicz
-
Update category chevrons.
- 681. By Michał Sawicz
-
Fix PageHeader centering.
- 682. By Albert Astals Cid
- 683. By Michał Sawicz
-
Merge lp:~mhr3/unity8/design-tweaks .
- 684. By Michał Karnicki
-
Add top/bottom gradients.
- 685. By Michał Sawicz
-
Merge trunk.
- 686. By Michał Karnicki
-
Don't show gradient in last category.
- 687. By Michał Sawicz
-
Revert r695, 'cause LazyImage gets confused with some images.
- 688. By Michał Sawicz
-
Fix whitespace.
- 689. By Michał Sawicz
-
Fix broken mereg.
- 690. By Michael Zanetti
-
Keep aspect ratio of app screenshots and crop them square.
- 691. By Michał Sawicz
-
Fix activity indicator.
- 692. By Michał Sawicz
-
Revert r690, 'cause it's racy.
- 693. By Michał Sawicz
-
Fix edge demos.
- 694. By Michał Sawicz
-
Merge fix in lp:~unity-team/unity8/unity8-category-gradients.
- 695. By Michał Sawicz
-
Add gradient to RunningApplicat
ionsGrid, too, as it's not a DashRenderer... - 696. By Michał Sawicz
-
Spurious logs...
- 697. By Michal Hruby
-
Merge trunk
- 698. By Michal Hruby
-
Fix missing line
- 699. By Michał Sawicz
-
Merge trunk.
- 700. By Michał Sawicz
-
Bring gradients back into DashRenderer, where they belong.
- 701. By Michał Sawicz
-
Merge lp:~aacid/unity8/new-scopes_do_not_request_previews_on_activate
- 702. By Albert Astals Cid
-
Merge lp:unity8
- 703. By Albert Astals Cid
Michał Sawicz (saviq) wrote : | # |
This is cleaned up to merge into trunk in: lp:~unity-team/unity8/new-scopes-clean-to-trunk
Unmerged revisions
Preview Diff
1 | === modified file 'data/unity8.conf' | |||
2 | --- data/unity8.conf 2014-02-27 21:56:42 +0000 | |||
3 | +++ data/unity8.conf 2014-03-07 12:41:18 +0000 | |||
4 | @@ -29,6 +29,11 @@ | |||
5 | 29 | gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}" | 29 | gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}" |
6 | 30 | fi | 30 | fi |
7 | 31 | 31 | ||
8 | 32 | if [ -z "$UNITY_SCOPES_LIST" ]; then | ||
9 | 33 | # FIXME: remove once we have this in dconf | ||
10 | 34 | initctl set-env UNITY_SCOPES_LIST="scopes;clickscope;musicaggregator;videoaggregator" | ||
11 | 35 | fi | ||
12 | 36 | |||
13 | 32 | # Remove the socket if still there | 37 | # Remove the socket if still there |
14 | 33 | if [ -S "$MIR_SERVER_FILE" ]; then | 38 | if [ -S "$MIR_SERVER_FILE" ]; then |
15 | 34 | rm "$MIR_SERVER_FILE" | 39 | rm "$MIR_SERVER_FILE" |
16 | 35 | 40 | ||
17 | === modified file 'debian/control' | |||
18 | --- debian/control 2014-02-25 01:07:08 +0000 | |||
19 | +++ debian/control 2014-03-07 12:41:18 +0000 | |||
20 | @@ -96,7 +96,10 @@ | |||
21 | 96 | libcap2-bin, | 96 | libcap2-bin, |
22 | 97 | ${misc:Depends}, | 97 | ${misc:Depends}, |
23 | 98 | ${shlibs:Depends}, | 98 | ${shlibs:Depends}, |
25 | 99 | Recommends: ${unity-default-masterscopes}, | 99 | unity-scope-scopes, |
26 | 100 | unity-scope-onlinemusic, | ||
27 | 101 | unity-scope-mediascanner2, | ||
28 | 102 | unity-scope-click, | ||
29 | 100 | Breaks: indicator-network (<< 0.5.1) | 103 | Breaks: indicator-network (<< 0.5.1) |
30 | 101 | Replaces: ubuntu-touch-session (<< 0.82~) | 104 | Replaces: ubuntu-touch-session (<< 0.82~) |
31 | 102 | Description: Unity 8 shell | 105 | Description: Unity 8 shell |
32 | 103 | 106 | ||
33 | === modified file 'debian/unity8.install' | |||
34 | --- debian/unity8.install 2013-11-29 08:32:05 +0000 | |||
35 | +++ debian/unity8.install 2014-03-07 12:41:18 +0000 | |||
36 | @@ -10,6 +10,7 @@ | |||
37 | 10 | usr/share/unity8/Notifications | 10 | usr/share/unity8/Notifications |
38 | 11 | usr/share/unity8/Panel | 11 | usr/share/unity8/Panel |
39 | 12 | usr/share/unity8/Shell.qml | 12 | usr/share/unity8/Shell.qml |
40 | 13 | usr/share/unity8/ShellOrientator.qml | ||
41 | 13 | usr/share/unity8/SideStage | 14 | usr/share/unity8/SideStage |
42 | 14 | usr/share/unity8/graphics | 15 | usr/share/unity8/graphics |
43 | 15 | data/unity8.conf usr/share/upstart/sessions/ | 16 | data/unity8.conf usr/share/upstart/sessions/ |
44 | 16 | 17 | ||
45 | === modified file 'plugins/DashViews/listviewwithpageheader.cpp' | |||
46 | --- plugins/DashViews/listviewwithpageheader.cpp 2014-02-13 10:29:10 +0000 | |||
47 | +++ plugins/DashViews/listviewwithpageheader.cpp 2014-03-07 12:41:18 +0000 | |||
48 | @@ -366,6 +366,13 @@ | |||
49 | 366 | m_previousContentY = m_visibleItems.first()->y() - headerHeight; | 366 | m_previousContentY = m_visibleItems.first()->y() - headerHeight; |
50 | 367 | } | 367 | } |
51 | 368 | setContentY(m_visibleItems.first()->y() + m_clipItem->y() - headerHeight); | 368 | setContentY(m_visibleItems.first()->y() + m_clipItem->y() - headerHeight); |
52 | 369 | if (m_headerItem) { | ||
53 | 370 | // TODO This should not be needed and the code that adjust the m_headerItem position | ||
54 | 371 | // in viewportMoved() should be enough but in some cases we have not found a way to reproduce | ||
55 | 372 | // yet the code of viewportMoved() fails so here we make sure that at least if we are calling | ||
56 | 373 | // positionAtBeginning the header item will be correctly positioned | ||
57 | 374 | m_headerItem->setY(-m_minYExtent); | ||
58 | 375 | } | ||
59 | 369 | } | 376 | } |
60 | 370 | 377 | ||
61 | 371 | void ListViewWithPageHeader::showHeader() | 378 | void ListViewWithPageHeader::showHeader() |
62 | 372 | 379 | ||
63 | === modified file 'po/ug.po' | |||
64 | --- po/ug.po 2014-02-19 05:44:29 +0000 | |||
65 | +++ po/ug.po 2014-03-07 12:41:18 +0000 | |||
66 | @@ -6,11 +6,12 @@ | |||
67 | 6 | msgid "" | 6 | msgid "" |
68 | 7 | msgstr "" | 7 | msgstr "" |
69 | 8 | "Project-Id-Version: unity\n" | 8 | "Project-Id-Version: unity\n" |
71 | 9 | "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" | 9 | "Report-Msgid-Bugs-To: \n" |
72 | 10 | "POT-Creation-Date: 2014-02-13 18:37+0000\n" | 10 | "POT-Creation-Date: 2014-02-13 18:37+0000\n" |
73 | 11 | "PO-Revision-Date: 2014-02-15 12:09+0000\n" | 11 | "PO-Revision-Date: 2014-02-15 12:09+0000\n" |
74 | 12 | "Last-Translator: Gheyret T.Kenji <Unknown>\n" | 12 | "Last-Translator: Gheyret T.Kenji <Unknown>\n" |
75 | 13 | "Language-Team: Uyghur <ug@li.org>\n" | 13 | "Language-Team: Uyghur <ug@li.org>\n" |
76 | 14 | "Language: \n" | ||
77 | 14 | "MIME-Version: 1.0\n" | 15 | "MIME-Version: 1.0\n" |
78 | 15 | "Content-Type: text/plain; charset=UTF-8\n" | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
79 | 16 | "Content-Transfer-Encoding: 8bit\n" | 17 | "Content-Transfer-Encoding: 8bit\n" |
80 | 17 | 18 | ||
81 | === modified file 'qml/Components/ApplicationManagerWrapper.qml' | |||
82 | --- qml/Components/ApplicationManagerWrapper.qml 2013-10-11 11:43:11 +0000 | |||
83 | +++ qml/Components/ApplicationManagerWrapper.qml 2014-03-07 12:41:18 +0000 | |||
84 | @@ -166,4 +166,12 @@ | |||
85 | 166 | } | 166 | } |
86 | 167 | return desktopFile.substring(left+1, right); | 167 | return desktopFile.substring(left+1, right); |
87 | 168 | } | 168 | } |
88 | 169 | |||
89 | 170 | function setMainStageAppRect(item) { | ||
90 | 171 | ApplicationManager.setMainStageAppRect(item); | ||
91 | 172 | } | ||
92 | 173 | |||
93 | 174 | function setSideStageAppRect(item) { | ||
94 | 175 | ApplicationManager.setSideStageAppRect(item); | ||
95 | 176 | } | ||
96 | 169 | } | 177 | } |
97 | 170 | 178 | ||
98 | === modified file 'qml/Components/ApplicationScreenshot.qml' | |||
99 | --- qml/Components/ApplicationScreenshot.qml 2013-09-04 23:50:13 +0000 | |||
100 | +++ qml/Components/ApplicationScreenshot.qml 2014-03-07 12:41:18 +0000 | |||
101 | @@ -53,8 +53,7 @@ | |||
102 | 53 | ApplicationImage { | 53 | ApplicationImage { |
103 | 54 | id: applicationImage | 54 | id: applicationImage |
104 | 55 | objectName: "screenshot image" | 55 | objectName: "screenshot image" |
107 | 56 | width: applicationScreenshot.application ? parent.width : 0 | 56 | anchors.fill: parent |
106 | 57 | height: applicationScreenshot.application ? parent.height : 0 | ||
108 | 58 | visible: applicationScreenshot.application != null && ready | 57 | visible: applicationScreenshot.application != null && ready |
109 | 59 | source: ApplicationManager.findApplication((application) ? application.appId : "") | 58 | source: ApplicationManager.findApplication((application) ? application.appId : "") |
110 | 60 | } | 59 | } |
111 | 61 | 60 | ||
112 | === modified file 'qml/Components/ListItems/Header.qml' | |||
113 | --- qml/Components/ListItems/Header.qml 2013-10-11 11:43:45 +0000 | |||
114 | +++ qml/Components/ListItems/Header.qml 2014-03-07 12:41:18 +0000 | |||
115 | @@ -36,7 +36,7 @@ | |||
116 | 36 | right: parent.right | 36 | right: parent.right |
117 | 37 | rightMargin: units.gu(0.5) | 37 | rightMargin: units.gu(0.5) |
118 | 38 | top: parent.top | 38 | top: parent.top |
120 | 39 | bottom: bottomBorder.top | 39 | bottom: parent.bottom |
121 | 40 | } | 40 | } |
122 | 41 | 41 | ||
123 | 42 | Label { | 42 | Label { |
124 | @@ -47,14 +47,11 @@ | |||
125 | 47 | verticalCenter: parent.verticalCenter | 47 | verticalCenter: parent.verticalCenter |
126 | 48 | } | 48 | } |
127 | 49 | 49 | ||
130 | 50 | color: Theme.palette.selected.backgroundText //at 60% | 50 | color: "grey" // TODO karni: Update Ubuntu.Compoonents.Themes.Palette. |
129 | 51 | opacity: 0.6 | ||
131 | 52 | font.family: "Ubuntu" | 51 | font.family: "Ubuntu" |
132 | 53 | fontSize: "medium" | 52 | fontSize: "medium" |
133 | 54 | elide: Text.ElideRight | 53 | elide: Text.ElideRight |
134 | 55 | textFormat: Text.PlainText | 54 | textFormat: Text.PlainText |
135 | 56 | style: Text.Raised | ||
136 | 57 | styleColor: "black" | ||
137 | 58 | width: parent.width - image.width - image.leftMargin - anchors.leftMargin | 55 | width: parent.width - image.width - image.leftMargin - anchors.leftMargin |
138 | 59 | } | 56 | } |
139 | 60 | 57 | ||
140 | @@ -68,15 +65,6 @@ | |||
141 | 68 | } | 65 | } |
142 | 69 | } | 66 | } |
143 | 70 | 67 | ||
144 | 71 | ThinDivider { | ||
145 | 72 | id: bottomBorder | ||
146 | 73 | anchors { | ||
147 | 74 | left: parent.left | ||
148 | 75 | right: parent.right | ||
149 | 76 | bottom: parent.bottom | ||
150 | 77 | } | ||
151 | 78 | } | ||
152 | 79 | |||
153 | 80 | MouseArea { | 68 | MouseArea { |
154 | 81 | anchors.fill: parent | 69 | anchors.fill: parent |
155 | 82 | onClicked: parent.clicked(mouse) | 70 | onClicked: parent.clicked(mouse) |
156 | 83 | 71 | ||
157 | === modified file 'qml/Components/PageHeader.qml' | |||
158 | --- qml/Components/PageHeader.qml 2014-01-27 18:12:05 +0000 | |||
159 | +++ qml/Components/PageHeader.qml 2014-03-07 12:41:18 +0000 | |||
160 | @@ -18,7 +18,7 @@ | |||
161 | 18 | import Ubuntu.Components 0.1 | 18 | import Ubuntu.Components 0.1 |
162 | 19 | import Ubuntu.Components.Popups 0.1 | 19 | import Ubuntu.Components.Popups 0.1 |
163 | 20 | import Ubuntu.Components.ListItems 0.1 as ListItem | 20 | import Ubuntu.Components.ListItems 0.1 as ListItem |
165 | 21 | import Unity 0.1 | 21 | import Unity 0.2 |
166 | 22 | 22 | ||
167 | 23 | Item { | 23 | Item { |
168 | 24 | id: root | 24 | id: root |
169 | @@ -27,6 +27,9 @@ | |||
170 | 27 | property ListModel searchHistory | 27 | property ListModel searchHistory |
171 | 28 | property Scope scope | 28 | property Scope scope |
172 | 29 | property alias childItem: itemContainer.children | 29 | property alias childItem: itemContainer.children |
173 | 30 | property alias showBackButton: backButton.visible | ||
174 | 31 | |||
175 | 32 | signal backClicked | ||
176 | 30 | 33 | ||
177 | 31 | height: units.gu(8.5) | 34 | height: units.gu(8.5) |
178 | 32 | implicitHeight: units.gu(8.5) | 35 | implicitHeight: units.gu(8.5) |
179 | @@ -69,11 +72,32 @@ | |||
180 | 69 | 72 | ||
181 | 70 | Behavior on contentY { NumberAnimation { duration: 200; easing.type: Easing.OutQuad } } | 73 | Behavior on contentY { NumberAnimation { duration: 200; easing.type: Easing.OutQuad } } |
182 | 71 | 74 | ||
183 | 75 | AbstractButton { | ||
184 | 76 | id: backButton | ||
185 | 77 | visible: false | ||
186 | 78 | height: header.height | ||
187 | 79 | y: header.contentY | ||
188 | 80 | anchors { | ||
189 | 81 | left: parent.left | ||
190 | 82 | leftMargin: visible ? units.gu(2) : 0 | ||
191 | 83 | } | ||
192 | 84 | width: visible ? image.width + units.gu(2) : 0 | ||
193 | 85 | onClicked: root.backClicked(); | ||
194 | 86 | Image { | ||
195 | 87 | id: image | ||
196 | 88 | anchors.centerIn: parent | ||
197 | 89 | source: "graphics/headerback.png" | ||
198 | 90 | } | ||
199 | 91 | } | ||
200 | 92 | |||
201 | 72 | // FIXME this could potentially be simplified to avoid all the containers | 93 | // FIXME this could potentially be simplified to avoid all the containers |
202 | 73 | Item { | 94 | Item { |
203 | 74 | id: headerContainer | 95 | id: headerContainer |
204 | 75 | 96 | ||
206 | 76 | width: parent.width | 97 | anchors { |
207 | 98 | left: backButton.right | ||
208 | 99 | right: parent.right | ||
209 | 100 | } | ||
210 | 77 | height: childrenRect.height | 101 | height: childrenRect.height |
211 | 78 | 102 | ||
212 | 79 | Item { | 103 | Item { |
213 | 80 | 104 | ||
214 | === modified file 'qml/Components/ResponsiveGridView.qml' | |||
215 | --- qml/Components/ResponsiveGridView.qml 2014-01-27 18:03:45 +0000 | |||
216 | +++ qml/Components/ResponsiveGridView.qml 2014-03-07 12:41:18 +0000 | |||
217 | @@ -56,7 +56,6 @@ | |||
218 | 56 | fill: parent | 56 | fill: parent |
219 | 57 | leftMargin: margin/2 | 57 | leftMargin: margin/2 |
220 | 58 | rightMargin: margin/2 | 58 | rightMargin: margin/2 |
221 | 59 | topMargin: verticalSpacing | ||
222 | 60 | } | 59 | } |
223 | 61 | clip: parent.height != totalContentHeight | 60 | clip: parent.height != totalContentHeight |
224 | 62 | 61 | ||
225 | 63 | 62 | ||
226 | === modified file 'qml/Components/SeeMore.qml' | |||
227 | --- qml/Components/SeeMore.qml 2014-02-05 17:35:52 +0000 | |||
228 | +++ qml/Components/SeeMore.qml 2014-03-07 12:41:18 +0000 | |||
229 | @@ -34,7 +34,8 @@ | |||
230 | 34 | objectName: "seeMoreLabel" | 34 | objectName: "seeMoreLabel" |
231 | 35 | text: i18n.tr("See more") | 35 | text: i18n.tr("See more") |
232 | 36 | opacity: !more ? 0.8 : 0.4 | 36 | opacity: !more ? 0.8 : 0.4 |
234 | 37 | color: Theme.palette.selected.backgroundText | 37 | // TODO: Fix requiring Palette update |
235 | 38 | color: "grey" //Theme.palette.selected.backgroundText | ||
236 | 38 | font.weight: Font.Bold | 39 | font.weight: Font.Bold |
237 | 39 | 40 | ||
238 | 40 | MouseArea { | 41 | MouseArea { |
239 | @@ -56,7 +57,8 @@ | |||
240 | 56 | objectName: "seeLessLabel" | 57 | objectName: "seeLessLabel" |
241 | 57 | text: i18n.tr("See less") | 58 | text: i18n.tr("See less") |
242 | 58 | opacity: more ? 0.8 : 0.4 | 59 | opacity: more ? 0.8 : 0.4 |
244 | 59 | color: Theme.palette.selected.backgroundText | 60 | // TODO: Fix requiring Palette update |
245 | 61 | color: "grey" //Theme.palette.selected.backgroundText | ||
246 | 60 | font.weight: Font.Bold | 62 | font.weight: Font.Bold |
247 | 61 | 63 | ||
248 | 62 | MouseArea { | 64 | MouseArea { |
249 | 63 | 65 | ||
250 | === modified file 'qml/Components/Showable.qml' | |||
251 | --- qml/Components/Showable.qml 2013-10-01 18:18:52 +0000 | |||
252 | +++ qml/Components/Showable.qml 2014-03-07 12:41:18 +0000 | |||
253 | @@ -107,6 +107,9 @@ | |||
254 | 107 | if (!hideAnimation.running) { | 107 | if (!hideAnimation.running) { |
255 | 108 | hideAnimation.restart() | 108 | hideAnimation.restart() |
256 | 109 | } | 109 | } |
257 | 110 | if (__skipShowAnimation) { | ||
258 | 111 | hideAnimation.complete(); | ||
259 | 112 | } | ||
260 | 110 | } else { | 113 | } else { |
261 | 111 | visible = false | 114 | visible = false |
262 | 112 | required = false | 115 | required = false |
263 | @@ -115,6 +118,11 @@ | |||
264 | 115 | shown = false | 118 | shown = false |
265 | 116 | } | 119 | } |
266 | 117 | 120 | ||
267 | 121 | function hideNow() { | ||
268 | 122 | __skipShowAnimation = true; | ||
269 | 123 | hide(); | ||
270 | 124 | } | ||
271 | 125 | |||
272 | 118 | Connections { | 126 | Connections { |
273 | 119 | target: hideAnimation ? hideAnimation: null | 127 | target: hideAnimation ? hideAnimation: null |
274 | 120 | onRunningChanged: { | 128 | onRunningChanged: { |
275 | 121 | 129 | ||
276 | === modified file 'qml/Components/Stage.qml' | |||
277 | --- qml/Components/Stage.qml 2013-10-22 15:56:37 +0000 | |||
278 | +++ qml/Components/Stage.qml 2014-03-07 12:41:18 +0000 | |||
279 | @@ -65,7 +65,9 @@ | |||
280 | 65 | 65 | ||
281 | 66 | function activateApplication(desktopFile, addDelay) { | 66 | function activateApplication(desktopFile, addDelay) { |
282 | 67 | var application = applicationManager.getApplicationFromDesktopFile(desktopFile, stage.type); | 67 | var application = applicationManager.getApplicationFromDesktopFile(desktopFile, stage.type); |
284 | 68 | if (application != null && application == stage.focusedApplication) { | 68 | if (application == null) { |
285 | 69 | return; | ||
286 | 70 | } else if (application == stage.focusedApplication) { | ||
287 | 69 | stage.show(); | 71 | stage.show(); |
288 | 70 | return; | 72 | return; |
289 | 71 | } | 73 | } |
290 | @@ -84,11 +86,6 @@ | |||
291 | 84 | } | 86 | } |
292 | 85 | } | 87 | } |
293 | 86 | 88 | ||
294 | 87 | Connections { | ||
295 | 88 | target: applicationManager | ||
296 | 89 | onFocusRequested: activateApplication(appId) | ||
297 | 90 | } | ||
298 | 91 | |||
299 | 92 | /* Keep a reference to the focused application so that we can safely | 89 | /* Keep a reference to the focused application so that we can safely |
300 | 93 | unfocus it when the stage is not fully shown and refocus it when the stage | 90 | unfocus it when the stage is not fully shown and refocus it when the stage |
301 | 94 | is fully shown again. | 91 | is fully shown again. |
302 | @@ -142,6 +139,14 @@ | |||
303 | 142 | } | 139 | } |
304 | 143 | } | 140 | } |
305 | 144 | 141 | ||
306 | 142 | Timer { | ||
307 | 143 | id: hideScreenshotsAfterBriefDelay | ||
308 | 144 | // Since Mir & Qt have independent event loops, Mir often applies a focus request a frame later than when Qt | ||
309 | 145 | // asks for it. To work around, delay removing the screenshots a touch so Mir has definitely shown the app. | ||
310 | 146 | interval: 10 | ||
311 | 147 | onTriggered: stage.__hideScreenshots(); | ||
312 | 148 | } | ||
313 | 149 | |||
314 | 145 | function __hideScreenshots() { | 150 | function __hideScreenshots() { |
315 | 146 | newApplicationScreenshot.clearApplication(); | 151 | newApplicationScreenshot.clearApplication(); |
316 | 147 | oldApplicationScreenshot.clearApplication(); | 152 | oldApplicationScreenshot.clearApplication(); |
317 | @@ -177,7 +182,7 @@ | |||
318 | 177 | applicationManager.focusApplication(application); | 182 | applicationManager.focusApplication(application); |
319 | 178 | } | 183 | } |
320 | 179 | if (!delayedHideScreenshots.running) { | 184 | if (!delayedHideScreenshots.running) { |
322 | 180 | stage.__hideScreenshots(); | 185 | hideScreenshotsAfterBriefDelay.start(); |
323 | 181 | } | 186 | } |
324 | 182 | } else { | 187 | } else { |
325 | 183 | /* FIXME: calling ApplicationManager::focusApplication does not focus | 188 | /* FIXME: calling ApplicationManager::focusApplication does not focus |
326 | @@ -252,7 +257,7 @@ | |||
327 | 252 | delayedHideScreenshots.start(); | 257 | delayedHideScreenshots.start(); |
328 | 253 | } else { | 258 | } else { |
329 | 254 | stage.focusedApplicationWhenUsingScreenshots = null; | 259 | stage.focusedApplicationWhenUsingScreenshots = null; |
331 | 255 | stage.__hideScreenshots(); | 260 | hideScreenshotsAfterBriefDelay.start(); |
332 | 256 | } | 261 | } |
333 | 257 | } | 262 | } |
334 | 258 | } | 263 | } |
335 | 259 | 264 | ||
336 | === added file 'qml/Components/graphics/headerback@27.png' | |||
337 | 260 | Binary files qml/Components/graphics/headerback@27.png 1970-01-01 00:00:00 +0000 and qml/Components/graphics/headerback@27.png 2014-03-07 12:41:18 +0000 differ | 265 | Binary files qml/Components/graphics/headerback@27.png 1970-01-01 00:00:00 +0000 and qml/Components/graphics/headerback@27.png 2014-03-07 12:41:18 +0000 differ |
338 | === modified file 'qml/Dash/Apps/RunningApplicationTile.qml' | |||
339 | --- qml/Dash/Apps/RunningApplicationTile.qml 2013-10-28 14:12:24 +0000 | |||
340 | +++ qml/Dash/Apps/RunningApplicationTile.qml 2014-03-07 12:41:18 +0000 | |||
341 | @@ -108,10 +108,9 @@ | |||
342 | 108 | } | 108 | } |
343 | 109 | text: (application) ? application.name : "" | 109 | text: (application) ? application.name : "" |
344 | 110 | 110 | ||
346 | 111 | color: Theme.palette.selected.backgroundText | 111 | // TODO karni (for each Label): Update Ubuntu.Components.Themes.Palette and use theme color instead |
347 | 112 | color: "grey" | ||
348 | 112 | opacity: 0.9 | 113 | opacity: 0.9 |
349 | 113 | style: Text.Raised | ||
350 | 114 | styleColor: "black" | ||
351 | 115 | fontSize: "small" | 114 | fontSize: "small" |
352 | 116 | elide: Text.ElideMiddle | 115 | elide: Text.ElideMiddle |
353 | 117 | horizontalAlignment: Text.AlignHCenter | 116 | horizontalAlignment: Text.AlignHCenter |
354 | 118 | 117 | ||
355 | === modified file 'qml/Dash/Card.qml' | |||
356 | --- qml/Dash/Card.qml 2014-02-28 10:45:19 +0000 | |||
357 | +++ qml/Dash/Card.qml 2014-03-07 12:41:18 +0000 | |||
358 | @@ -17,7 +17,7 @@ | |||
359 | 17 | import QtQuick 2.0 | 17 | import QtQuick 2.0 |
360 | 18 | import Ubuntu.Components 0.1 | 18 | import Ubuntu.Components 0.1 |
361 | 19 | 19 | ||
363 | 20 | Item { | 20 | AbstractButton { |
364 | 21 | id: root | 21 | id: root |
365 | 22 | property var template | 22 | property var template |
366 | 23 | property var components | 23 | property var components |
367 | @@ -25,7 +25,7 @@ | |||
368 | 25 | 25 | ||
369 | 26 | property alias fontScale: header.fontScale | 26 | property alias fontScale: header.fontScale |
370 | 27 | property alias headerAlignment: header.headerAlignment | 27 | property alias headerAlignment: header.headerAlignment |
372 | 28 | readonly property alias headerHeight: header.height | 28 | property alias headerHeight: header.height |
373 | 29 | 29 | ||
374 | 30 | property bool showHeader: true | 30 | property bool showHeader: true |
375 | 31 | 31 | ||
376 | @@ -87,6 +87,7 @@ | |||
377 | 87 | height: template && template["card-layout"] === "horizontal" ? header.height : width / artShape.aspect | 87 | height: template && template["card-layout"] === "horizontal" ? header.height : width / artShape.aspect |
378 | 88 | objectName: "artImage" | 88 | objectName: "artImage" |
379 | 89 | source: cardData && cardData["art"] || "" | 89 | source: cardData && cardData["art"] || "" |
380 | 90 | cache: true | ||
381 | 90 | // FIXME uncomment when having investigated / fixed the crash | 91 | // FIXME uncomment when having investigated / fixed the crash |
382 | 91 | //sourceSize.width: width > height ? width : 0 | 92 | //sourceSize.width: width > height ? width : 0 |
383 | 92 | //sourceSize.height: height > width ? height : 0 | 93 | //sourceSize.height: height > width ? height : 0 |
384 | @@ -163,6 +164,9 @@ | |||
385 | 163 | titleWeight: components && components["subtitle"] ? Font.DemiBold : Font.Normal | 164 | titleWeight: components && components["subtitle"] ? Font.DemiBold : Font.Normal |
386 | 164 | 165 | ||
387 | 165 | opacity: showHeader ? 1 : 0 | 166 | opacity: showHeader ? 1 : 0 |
388 | 167 | inOverlay: root.template && root.template["overlay"] === true | ||
389 | 168 | fontColor: inOverlay ? "white" : summary.color | ||
390 | 169 | useMascotShape: !background.visible && !inOverlay | ||
391 | 166 | 170 | ||
392 | 167 | Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } } | 171 | Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } } |
393 | 168 | } | 172 | } |
394 | @@ -183,5 +187,17 @@ | |||
395 | 183 | text: cardData && cardData["summary"] || "" | 187 | text: cardData && cardData["summary"] || "" |
396 | 184 | height: text ? implicitHeight : 0 | 188 | height: text ? implicitHeight : 0 |
397 | 185 | fontSize: "small" | 189 | fontSize: "small" |
398 | 190 | color: getFontColor(background.color) | ||
399 | 191 | |||
400 | 192 | function getLuminance(color) { | ||
401 | 193 | return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b; | ||
402 | 194 | } | ||
403 | 195 | |||
404 | 196 | // TODO karni: Change "grey" to Ubuntu.Components.Palette color once updated. | ||
405 | 197 | function getFontColor(backgroundColor) { | ||
406 | 198 | if (backgroundColor === undefined) return "grey"; | ||
407 | 199 | var luminance = getLuminance(backgroundColor); | ||
408 | 200 | return luminance < 0.7 ? "white" : "grey" | ||
409 | 201 | } | ||
410 | 186 | } | 202 | } |
411 | 187 | } | 203 | } |
412 | 188 | 204 | ||
413 | === added file 'qml/Dash/CardCarousel.qml' | |||
414 | --- qml/Dash/CardCarousel.qml 1970-01-01 00:00:00 +0000 | |||
415 | +++ qml/Dash/CardCarousel.qml 2014-03-07 12:41:18 +0000 | |||
416 | @@ -0,0 +1,78 @@ | |||
417 | 1 | /* | ||
418 | 2 | * Copyright (C) 2013 Canonical, Ltd. | ||
419 | 3 | * | ||
420 | 4 | * This program is free software; you can redistribute it and/or modify | ||
421 | 5 | * it under the terms of the GNU General Public License as published by | ||
422 | 6 | * the Free Software Foundation; version 3. | ||
423 | 7 | * | ||
424 | 8 | * This program is distributed in the hope that it will be useful, | ||
425 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
426 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
427 | 11 | * GNU General Public License for more details. | ||
428 | 12 | * | ||
429 | 13 | * You should have received a copy of the GNU General Public License | ||
430 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
431 | 15 | */ | ||
432 | 16 | |||
433 | 17 | import QtQuick 2.0 | ||
434 | 18 | import Ubuntu.Components 0.1 | ||
435 | 19 | import "../Components" | ||
436 | 20 | |||
437 | 21 | |||
438 | 22 | DashRenderer { | ||
439 | 23 | id: cardCarousel | ||
440 | 24 | |||
441 | 25 | property alias cacheBuffer: carousel.cacheBuffer | ||
442 | 26 | property alias itemComponent: carousel.itemComponent | ||
443 | 27 | property alias minimumTileWidth: carousel.minimumTileWidth | ||
444 | 28 | property alias selectedItemScaleFactor: carousel.selectedItemScaleFactor | ||
445 | 29 | property alias tileAspectRatio: carousel.tileAspectRatio | ||
446 | 30 | |||
447 | 31 | currentItem: carousel.currentItem | ||
448 | 32 | height: carousel.implicitHeight + units.gu(6) | ||
449 | 33 | verticalSpacing: units.gu(3) | ||
450 | 34 | |||
451 | 35 | CardTool { | ||
452 | 36 | id: cardTool | ||
453 | 37 | |||
454 | 38 | template: cardCarousel.template | ||
455 | 39 | components: cardCarousel.components | ||
456 | 40 | viewWidth: cardCarousel.width | ||
457 | 41 | } | ||
458 | 42 | |||
459 | 43 | Carousel { | ||
460 | 44 | id: carousel | ||
461 | 45 | anchors.fill: parent | ||
462 | 46 | tileAspectRatio: cardCarousel.components && cardCarousel.components["art"]["aspect-ratio"] || 1.0 | ||
463 | 47 | // FIXME we need to "reverse" the carousel to make the selected item the size | ||
464 | 48 | // and push others back. | ||
465 | 49 | minimumTileWidth: cardTool.cardWidth / selectedItemScaleFactor | ||
466 | 50 | selectedItemScaleFactor: 1.38 | ||
467 | 51 | cacheBuffer: 1404 // 18px * 13gu * 6 | ||
468 | 52 | model: cardCarousel.model | ||
469 | 53 | highlightIndex: cardCarousel.highlightIndex | ||
470 | 54 | |||
471 | 55 | onClicked: cardCarousel.clicked(index, itemY) | ||
472 | 56 | onPressAndHold: cardCarousel.pressAndHold(index, itemY) | ||
473 | 57 | |||
474 | 58 | property real fontScale: 1 / selectedItemScaleFactor | ||
475 | 59 | property real headerHeight: cardTool.headerHeight / selectedItemScaleFactor | ||
476 | 60 | |||
477 | 61 | itemComponent: Card { | ||
478 | 62 | id: card | ||
479 | 63 | objectName: "delegate" + index | ||
480 | 64 | headerHeight: carousel.headerHeight | ||
481 | 65 | cardData: model | ||
482 | 66 | template: cardCarousel.template | ||
483 | 67 | components: cardCarousel.components | ||
484 | 68 | |||
485 | 69 | property bool explicitlyScaled | ||
486 | 70 | property var model | ||
487 | 71 | |||
488 | 72 | enabled: false | ||
489 | 73 | showHeader: explicitlyScaled | ||
490 | 74 | |||
491 | 75 | fontScale: carousel.fontScale | ||
492 | 76 | } | ||
493 | 77 | } | ||
494 | 78 | } | ||
495 | 0 | 79 | ||
496 | === added file 'qml/Dash/CardFilterGrid.qml' | |||
497 | --- qml/Dash/CardFilterGrid.qml 1970-01-01 00:00:00 +0000 | |||
498 | +++ qml/Dash/CardFilterGrid.qml 2014-03-07 12:41:18 +0000 | |||
499 | @@ -0,0 +1,59 @@ | |||
500 | 1 | /* | ||
501 | 2 | * Copyright (C) 2013 Canonical, Ltd. | ||
502 | 3 | * | ||
503 | 4 | * This program is free software; you can redistribute it and/or modify | ||
504 | 5 | * it under the terms of the GNU General Public License as published by | ||
505 | 6 | * the Free Software Foundation; version 3. | ||
506 | 7 | * | ||
507 | 8 | * This program is distributed in the hope that it will be useful, | ||
508 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
509 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
510 | 11 | * GNU General Public License for more details. | ||
511 | 12 | * | ||
512 | 13 | * You should have received a copy of the GNU General Public License | ||
513 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
514 | 15 | */ | ||
515 | 16 | |||
516 | 17 | import QtQuick 2.0 | ||
517 | 18 | import Ubuntu.Components 0.1 | ||
518 | 19 | |||
519 | 20 | DashFilterGrid { | ||
520 | 21 | id: genericFilterGrid | ||
521 | 22 | |||
522 | 23 | minimumHorizontalSpacing: units.gu(1) | ||
523 | 24 | delegateWidth: cardTool.cardWidth | ||
524 | 25 | delegateHeight: cardTool.cardHeight | ||
525 | 26 | verticalSpacing: units.gu(1) | ||
526 | 27 | collapsedRowCount: Math.min(2, template && template["collapsed-rows"] || 2) | ||
527 | 28 | |||
528 | 29 | CardTool { | ||
529 | 30 | id: cardTool | ||
530 | 31 | |||
531 | 32 | template: genericFilterGrid.template | ||
532 | 33 | // We can't trust the template since it may happen it is carousel | ||
533 | 34 | // that is being should as a grid because of the lack of elements | ||
534 | 35 | categoryLayout: "grid" | ||
535 | 36 | components: genericFilterGrid.components | ||
536 | 37 | } | ||
537 | 38 | |||
538 | 39 | delegate: Item { | ||
539 | 40 | width: genericFilterGrid.cellWidth | ||
540 | 41 | height: genericFilterGrid.cellHeight | ||
541 | 42 | Card { | ||
542 | 43 | id: card | ||
543 | 44 | width: cardTool.cardWidth | ||
544 | 45 | height: cardTool.cardHeight | ||
545 | 46 | headerHeight: cardTool.headerHeight | ||
546 | 47 | anchors.horizontalCenter: parent.horizontalCenter | ||
547 | 48 | objectName: "delegate" + index | ||
548 | 49 | cardData: model | ||
549 | 50 | template: genericFilterGrid.template | ||
550 | 51 | components: genericFilterGrid.components | ||
551 | 52 | |||
552 | 53 | headerAlignment: cardTool.headerAlignment | ||
553 | 54 | |||
554 | 55 | onClicked: genericFilterGrid.clicked(index, card.y) | ||
555 | 56 | onPressAndHold: genericFilterGrid.pressAndHold(index, card.y) | ||
556 | 57 | } | ||
557 | 58 | } | ||
558 | 59 | } | ||
559 | 0 | 60 | ||
560 | === modified file 'qml/Dash/CardHeader.qml' | |||
561 | --- qml/Dash/CardHeader.qml 2014-02-21 10:50:36 +0000 | |||
562 | +++ qml/Dash/CardHeader.qml 2014-03-07 12:41:18 +0000 | |||
563 | @@ -27,12 +27,17 @@ | |||
564 | 27 | property alias altPrice: altPriceLabel.text | 27 | property alias altPrice: altPriceLabel.text |
565 | 28 | 28 | ||
566 | 29 | property alias titleWeight: titleLabel.font.weight | 29 | property alias titleWeight: titleLabel.font.weight |
567 | 30 | property alias titleSize: titleLabel.fontSize | ||
568 | 30 | 31 | ||
569 | 31 | // FIXME: Saviq, used to scale fonts down in Carousel | 32 | // FIXME: Saviq, used to scale fonts down in Carousel |
570 | 32 | property real fontScale: 1.0 | 33 | property real fontScale: 1.0 |
571 | 33 | 34 | ||
572 | 34 | property alias headerAlignment: titleLabel.horizontalAlignment | 35 | property alias headerAlignment: titleLabel.horizontalAlignment |
573 | 35 | 36 | ||
574 | 37 | property bool inOverlay: false | ||
575 | 38 | property bool useMascotShape: true | ||
576 | 39 | property color fontColor: "grey" | ||
577 | 40 | |||
578 | 36 | visible: mascotImage.status === Image.Ready || title || price | 41 | visible: mascotImage.status === Image.Ready || title || price |
579 | 37 | height: row.height > 0 ? row.height + row.margins * 2 : 0 | 42 | height: row.height > 0 ? row.height + row.margins * 2 : 0 |
580 | 38 | 43 | ||
581 | @@ -42,13 +47,13 @@ | |||
582 | 42 | 47 | ||
583 | 43 | property real margins: units.gu(1) | 48 | property real margins: units.gu(1) |
584 | 44 | 49 | ||
585 | 50 | spacing: mascotShape.visible || mascotImage.visible || inOverlay ? margins : 0 | ||
586 | 45 | anchors { | 51 | anchors { |
587 | 46 | top: parent.top; left: parent.left; right: parent.right | 52 | top: parent.top; left: parent.left; right: parent.right |
588 | 47 | margins: margins | 53 | margins: margins |
589 | 48 | leftMargin: spacing | 54 | leftMargin: spacing |
590 | 49 | rightMargin: spacing | 55 | rightMargin: spacing |
591 | 50 | } | 56 | } |
592 | 51 | spacing: mascotShape.visible || (template && template["overlay"]) ? margins : 0 | ||
593 | 52 | 57 | ||
594 | 53 | UbuntuShape { | 58 | UbuntuShape { |
595 | 54 | id: mascotShape | 59 | id: mascotShape |
596 | @@ -57,35 +62,44 @@ | |||
597 | 57 | // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels. | 62 | // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels. |
598 | 58 | width: units.gu(6) | 63 | width: units.gu(6) |
599 | 59 | height: units.gu(5.625) | 64 | height: units.gu(5.625) |
611 | 60 | visible: image.status === Image.Ready | 65 | anchors.verticalCenter: parent.verticalCenter |
612 | 61 | readonly property int maxSize: Math.max(width, height) | 66 | visible: useMascotShape && image && image.status === Image.Ready |
613 | 62 | 67 | readonly property int maxSize: Math.max(width, height) * 4 | |
614 | 63 | image: Image { | 68 | |
615 | 64 | id: mascotImage | 69 | image: useMascotShape ? mascotImage : null |
616 | 65 | 70 | } | |
617 | 66 | sourceSize { width: mascotShape.maxSize; height: mascotShape.maxSize } | 71 | |
618 | 67 | fillMode: Image.PreserveAspectCrop | 72 | Image { |
619 | 68 | horizontalAlignment: Image.AlignHCenter | 73 | id: mascotImage |
620 | 69 | verticalAlignment: Image.AlignVCenter | 74 | |
621 | 70 | } | 75 | width: source ? mascotShape.width : 0 |
622 | 76 | height: mascotShape.height | ||
623 | 77 | anchors.verticalCenter: parent.verticalCenter | ||
624 | 78 | visible: !useMascotShape && status === Image.Ready | ||
625 | 79 | |||
626 | 80 | sourceSize { width: mascotShape.maxSize; height: mascotShape.maxSize } | ||
627 | 81 | fillMode: Image.PreserveAspectCrop | ||
628 | 82 | horizontalAlignment: Image.AlignHCenter | ||
629 | 83 | verticalAlignment: Image.AlignVCenter | ||
630 | 71 | } | 84 | } |
631 | 72 | 85 | ||
632 | 73 | Column { | 86 | Column { |
633 | 74 | objectName: "column" | 87 | objectName: "column" |
634 | 75 | width: parent.width - x | 88 | width: parent.width - x |
636 | 76 | spacing: units.gu(0.5) | 89 | spacing: units.gu(0.25) |
637 | 90 | anchors.verticalCenter: parent.verticalCenter | ||
638 | 77 | 91 | ||
639 | 78 | Label { | 92 | Label { |
640 | 79 | id: titleLabel | 93 | id: titleLabel |
641 | 80 | objectName: "titleLabel" | 94 | objectName: "titleLabel" |
642 | 81 | anchors { left: parent.left; right: parent.right } | 95 | anchors { left: parent.left; right: parent.right } |
643 | 82 | elide: Text.ElideRight | 96 | elide: Text.ElideRight |
645 | 83 | font.weight: Font.DemiBold | 97 | font.weight: Font.Normal |
646 | 98 | fontSize: "small" | ||
647 | 84 | wrapMode: Text.Wrap | 99 | wrapMode: Text.Wrap |
648 | 85 | maximumLineCount: 2 | 100 | maximumLineCount: 2 |
649 | 86 | fontSize: "small" | ||
650 | 87 | font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale) | 101 | font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale) |
652 | 88 | color: template["overlay"] === true ? "white" : Theme.palette.selected.backgroundText | 102 | color: fontColor |
653 | 89 | } | 103 | } |
654 | 90 | 104 | ||
655 | 91 | Label { | 105 | Label { |
656 | @@ -93,11 +107,11 @@ | |||
657 | 93 | objectName: "subtitleLabel" | 107 | objectName: "subtitleLabel" |
658 | 94 | anchors { left: parent.left; right: parent.right } | 108 | anchors { left: parent.left; right: parent.right } |
659 | 95 | elide: Text.ElideRight | 109 | elide: Text.ElideRight |
660 | 110 | fontSize: "small" | ||
661 | 96 | font.weight: Font.Light | 111 | font.weight: Font.Light |
662 | 97 | visible: titleLabel.text && text | 112 | visible: titleLabel.text && text |
663 | 98 | fontSize: "x-small" | ||
664 | 99 | font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale) | 113 | font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale) |
666 | 100 | color: template["overlay"] === true ? "white" : Theme.palette.selected.backgroundText | 114 | color: fontColor |
667 | 101 | } | 115 | } |
668 | 102 | 116 | ||
669 | 103 | Row { | 117 | Row { |
670 | @@ -118,7 +132,7 @@ | |||
671 | 118 | width: parent.labelWidth | 132 | width: parent.labelWidth |
672 | 119 | elide: Text.ElideRight | 133 | elide: Text.ElideRight |
673 | 120 | font.weight: Font.DemiBold | 134 | font.weight: Font.DemiBold |
675 | 121 | color: Theme.palette.selected.foreground | 135 | color: "#ff990000" |
676 | 122 | visible: text | 136 | visible: text |
677 | 123 | } | 137 | } |
678 | 124 | 138 | ||
679 | @@ -128,6 +142,8 @@ | |||
680 | 128 | width: parent.labelWidth | 142 | width: parent.labelWidth |
681 | 129 | elide: Text.ElideRight | 143 | elide: Text.ElideRight |
682 | 130 | horizontalAlignment: parent.labels === 3 ? Text.AlignHCenter : Text.AlignRight | 144 | horizontalAlignment: parent.labels === 3 ? Text.AlignHCenter : Text.AlignRight |
683 | 145 | font.strikeout: true | ||
684 | 146 | color: "black" | ||
685 | 131 | visible: text | 147 | visible: text |
686 | 132 | } | 148 | } |
687 | 133 | 149 | ||
688 | @@ -136,6 +152,7 @@ | |||
689 | 136 | width: parent.labelWidth | 152 | width: parent.labelWidth |
690 | 137 | elide: Text.ElideRight | 153 | elide: Text.ElideRight |
691 | 138 | horizontalAlignment: Text.AlignRight | 154 | horizontalAlignment: Text.AlignRight |
692 | 155 | color: fontColor | ||
693 | 139 | visible: text | 156 | visible: text |
694 | 140 | } | 157 | } |
695 | 141 | } | 158 | } |
696 | 142 | 159 | ||
697 | === modified file 'qml/Dash/CardTool.qml' | |||
698 | --- qml/Dash/CardTool.qml 2014-02-07 14:45:19 +0000 | |||
699 | +++ qml/Dash/CardTool.qml 2014-03-07 12:41:18 +0000 | |||
700 | @@ -43,6 +43,11 @@ | |||
701 | 43 | */ | 43 | */ |
702 | 44 | property var viewWidth | 44 | property var viewWidth |
703 | 45 | 45 | ||
704 | 46 | /*! | ||
705 | 47 | \brief The category layout for this card tool | ||
706 | 48 | */ | ||
707 | 49 | property string categoryLayout: template ? template["category-layout"] : "" | ||
708 | 50 | |||
709 | 46 | // FIXME: Saviq | 51 | // FIXME: Saviq |
710 | 47 | // Only way for the card below to actually be laid out completely. | 52 | // Only way for the card below to actually be laid out completely. |
711 | 48 | // If invisible or in "data" array, some components are not taken into account. | 53 | // If invisible or in "data" array, some components are not taken into account. |
712 | @@ -56,7 +61,7 @@ | |||
713 | 56 | If undefined, should use implicit width of the actual card. | 61 | If undefined, should use implicit width of the actual card. |
714 | 57 | */ | 62 | */ |
715 | 58 | readonly property var cardWidth: { | 63 | readonly property var cardWidth: { |
717 | 59 | switch (template !== undefined && template["category-layout"]) { | 64 | switch (categoryLayout) { |
718 | 60 | case "grid": | 65 | case "grid": |
719 | 61 | case "vertical-journal": | 66 | case "vertical-journal": |
720 | 62 | if (template["card-layout"] === "horizontal") return units.gu(38); | 67 | if (template["card-layout"] === "horizontal") return units.gu(38); |
721 | @@ -84,7 +89,7 @@ | |||
722 | 84 | If undefined, should use implicit height of the actual card. | 89 | If undefined, should use implicit height of the actual card. |
723 | 85 | */ | 90 | */ |
724 | 86 | readonly property var cardHeight: { | 91 | readonly property var cardHeight: { |
726 | 87 | switch (template !== undefined && template["category-layout"]) { | 92 | switch (categoryLayout) { |
727 | 88 | case "journal": | 93 | case "journal": |
728 | 89 | if (template["card-size"] >= 12 && template["card-size"] <= 38) return units.gu(template["card-size"]); | 94 | if (template["card-size"] >= 12 && template["card-size"] <= 38) return units.gu(template["card-size"]); |
729 | 90 | return units.gu(18.5); | 95 | return units.gu(18.5); |
730 | 91 | 96 | ||
731 | === modified file 'qml/Dash/Dash.qml' | |||
732 | --- qml/Dash/Dash.qml 2014-02-18 11:54:25 +0000 | |||
733 | +++ qml/Dash/Dash.qml 2014-03-07 12:41:18 +0000 | |||
734 | @@ -1,5 +1,5 @@ | |||
735 | 1 | /* | 1 | /* |
737 | 2 | * Copyright (C) 2013 Canonical, Ltd. | 2 | * Copyright (C) 2013, 2014 Canonical, Ltd. |
738 | 3 | * | 3 | * |
739 | 4 | * This program is free software; you can redistribute it and/or modify | 4 | * This program is free software; you can redistribute it and/or modify |
740 | 5 | * it under the terms of the GNU General Public License as published by | 5 | * it under the terms of the GNU General Public License as published by |
741 | @@ -16,7 +16,7 @@ | |||
742 | 16 | 16 | ||
743 | 17 | import QtQuick 2.0 | 17 | import QtQuick 2.0 |
744 | 18 | import Ubuntu.Components 0.1 | 18 | import Ubuntu.Components 0.1 |
746 | 19 | import Unity 0.1 | 19 | import Unity 0.2 |
747 | 20 | import Utils 0.1 | 20 | import Utils 0.1 |
748 | 21 | import "../Components" | 21 | import "../Components" |
749 | 22 | 22 | ||
750 | @@ -27,8 +27,9 @@ | |||
751 | 27 | visible: shown | 27 | visible: shown |
752 | 28 | 28 | ||
753 | 29 | property ListModel searchHistory: SearchHistoryModel {} | 29 | property ListModel searchHistory: SearchHistoryModel {} |
754 | 30 | property bool searchable: !dashContent.previewOpen && !scopeItem.previewOpen | ||
755 | 30 | 31 | ||
757 | 31 | property string showScopeOnLoaded: "home.scope" | 32 | property string showScopeOnLoaded: "clickscope" |
758 | 32 | property real contentScale: 1.0 | 33 | property real contentScale: 1.0 |
759 | 33 | 34 | ||
760 | 34 | function setCurrentScope(scopeId, animate, reset) { | 35 | function setCurrentScope(scopeId, animate, reset) { |
761 | @@ -39,6 +40,8 @@ | |||
762 | 39 | return | 40 | return |
763 | 40 | } | 41 | } |
764 | 41 | 42 | ||
765 | 43 | dashContent.closePreview(); | ||
766 | 44 | |||
767 | 42 | if (scopeIndex == dashContent.currentIndex && !reset) { | 45 | if (scopeIndex == dashContent.currentIndex && !reset) { |
768 | 43 | // the scope is already the current one | 46 | // the scope is already the current one |
769 | 44 | return | 47 | return |
770 | @@ -61,10 +64,19 @@ | |||
771 | 61 | DashContent { | 64 | DashContent { |
772 | 62 | id: dashContent | 65 | id: dashContent |
773 | 63 | objectName: "dashContent" | 66 | objectName: "dashContent" |
775 | 64 | anchors.fill: parent | 67 | width: parent.width |
776 | 68 | height: parent.height | ||
777 | 65 | model: filteredScopes | 69 | model: filteredScopes |
778 | 66 | scopes: scopes | 70 | scopes: scopes |
779 | 67 | searchHistory: dash.searchHistory | 71 | searchHistory: dash.searchHistory |
780 | 72 | visible: x != -width | ||
781 | 73 | onGotoScope: { | ||
782 | 74 | dash.setCurrentScope(scopeId, true, false); | ||
783 | 75 | } | ||
784 | 76 | onOpenScope: { | ||
785 | 77 | scopeItem.scope = scope; | ||
786 | 78 | x = -width; | ||
787 | 79 | } | ||
788 | 68 | onScopeLoaded: { | 80 | onScopeLoaded: { |
789 | 69 | if (scopeId == dash.showScopeOnLoaded) { | 81 | if (scopeId == dash.showScopeOnLoaded) { |
790 | 70 | dash.setCurrentScope(scopeId, false, false) | 82 | dash.setCurrentScope(scopeId, false, false) |
791 | @@ -72,6 +84,39 @@ | |||
792 | 72 | } | 84 | } |
793 | 73 | } | 85 | } |
794 | 74 | scale: dash.contentScale | 86 | scale: dash.contentScale |
795 | 87 | clip: scale != 1.0 || scopeItem.visible | ||
796 | 88 | Behavior on x { | ||
797 | 89 | UbuntuNumberAnimation { | ||
798 | 90 | onRunningChanged: { | ||
799 | 91 | if (!running && dashContent.x == 0) { | ||
800 | 92 | dashContent.closeScope(scopeItem.scope); | ||
801 | 93 | scopeItem.scope = null; | ||
802 | 94 | } | ||
803 | 95 | } | ||
804 | 96 | } | ||
805 | 97 | } | ||
806 | 98 | } | ||
807 | 99 | |||
808 | 100 | ScopeItem { | ||
809 | 101 | id: scopeItem | ||
810 | 102 | anchors.left: dashContent.right | ||
811 | 103 | width: parent.width | ||
812 | 104 | height: parent.height | ||
813 | 105 | searchHistory: dash.searchHistory | ||
814 | 106 | scale: dash.contentScale | ||
815 | 75 | clip: scale != 1.0 | 107 | clip: scale != 1.0 |
816 | 108 | visible: scope != null | ||
817 | 109 | onBack: { | ||
818 | 110 | dashContent.x = 0; | ||
819 | 111 | } | ||
820 | 112 | onGotoScope: { | ||
821 | 113 | // TODO | ||
822 | 114 | console.log("gotoScope from an openScope scope is not implemented"); | ||
823 | 115 | } | ||
824 | 116 | onOpenScope: { | ||
825 | 117 | // TODO | ||
826 | 118 | console.log("openScope from an openScope scope is not implemented"); | ||
827 | 119 | } | ||
828 | 120 | |||
829 | 76 | } | 121 | } |
830 | 77 | } | 122 | } |
831 | 78 | 123 | ||
832 | === modified file 'qml/Dash/DashApps.qml' | |||
833 | --- qml/Dash/DashApps.qml 2013-12-02 13:23:28 +0000 | |||
834 | +++ qml/Dash/DashApps.qml 2014-03-07 12:41:18 +0000 | |||
835 | @@ -29,28 +29,13 @@ | |||
836 | 29 | property var mainStageApplicationsModel: shell.applicationManager.mainStageApplications | 29 | property var mainStageApplicationsModel: shell.applicationManager.mainStageApplications |
837 | 30 | property var sideStageApplicationModel: shell.applicationManager.sideStageApplications | 30 | property var sideStageApplicationModel: shell.applicationManager.sideStageApplications |
838 | 31 | 31 | ||
857 | 32 | ListModel { | 32 | QtObject { |
858 | 33 | id: dummyVisibilityModifier | 33 | id: countObject |
859 | 34 | 34 | property int count: scopeView.scope.searchQuery.length == 0 ? (mainStageApplicationsModel.count + sideStageApplicationModel.count) : 0 | |
842 | 35 | ListElement { name: "running-apps" } | ||
843 | 36 | } | ||
844 | 37 | |||
845 | 38 | SortFilterProxyModel { | ||
846 | 39 | id: runningApplicationsModel | ||
847 | 40 | |||
848 | 41 | property var firstModel: mainStageApplicationsModel | ||
849 | 42 | property var secondModel: sideStageApplicationModel | ||
850 | 43 | property bool canEnableTerminationMode: scopeView.isCurrent | ||
851 | 44 | |||
852 | 45 | model: dummyVisibilityModifier | ||
853 | 46 | filterRole: 0 | ||
854 | 47 | filterRegExp: invertMatch ? ((mainStageApplicationsModel.count === 0 && | ||
855 | 48 | sideStageApplicationModel.count === 0) ? RegExp("running-apps") : RegExp("")) : RegExp("disabled") | ||
856 | 49 | invertMatch: scopeView.scope.searchQuery.length == 0 | ||
860 | 50 | } | 35 | } |
861 | 51 | 36 | ||
862 | 52 | onScopeChanged: { | 37 | onScopeChanged: { |
864 | 53 | scopeView.scope.categories.overrideResults("recent", runningApplicationsModel); | 38 | scopeView.scope.categories.addSpecialCategory("running.apps.category", "Recent", "", "{ \"template\": { \"category-layout\": \"running-apps\" } }", countObject); |
865 | 54 | enableHeightBehaviorOnNextCreation = (mainStageApplicationsModel.count + sideStageApplicationModel.count == 0) | 39 | enableHeightBehaviorOnNextCreation = (mainStageApplicationsModel.count + sideStageApplicationModel.count == 0) |
866 | 55 | } | 40 | } |
867 | 56 | } | 41 | } |
868 | 57 | 42 | ||
869 | === modified file 'qml/Dash/DashContent.qml' | |||
870 | --- qml/Dash/DashContent.qml 2014-02-18 11:54:25 +0000 | |||
871 | +++ qml/Dash/DashContent.qml 2014-03-07 12:41:18 +0000 | |||
872 | @@ -1,5 +1,5 @@ | |||
873 | 1 | /* | 1 | /* |
875 | 2 | * Copyright (C) 2013 Canonical, Ltd. | 2 | * Copyright (C) 2013, 2014 Canonical, Ltd. |
876 | 3 | * | 3 | * |
877 | 4 | * This program is free software; you can redistribute it and/or modify | 4 | * This program is free software; you can redistribute it and/or modify |
878 | 5 | * it under the terms of the GNU General Public License as published by | 5 | * it under the terms of the GNU General Public License as published by |
879 | @@ -16,7 +16,7 @@ | |||
880 | 16 | 16 | ||
881 | 17 | import QtQuick 2.0 | 17 | import QtQuick 2.0 |
882 | 18 | import Ubuntu.Components 0.1 | 18 | import Ubuntu.Components 0.1 |
884 | 19 | import Unity 0.1 | 19 | import Unity 0.2 |
885 | 20 | import "../Components" | 20 | import "../Components" |
886 | 21 | 21 | ||
887 | 22 | Item { | 22 | Item { |
888 | @@ -25,6 +25,7 @@ | |||
889 | 25 | property var model: null | 25 | property var model: null |
890 | 26 | property var scopes: null | 26 | property var scopes: null |
891 | 27 | property alias currentIndex: dashContentList.currentIndex | 27 | property alias currentIndex: dashContentList.currentIndex |
892 | 28 | property alias previewOpen: previewListView.open | ||
893 | 28 | 29 | ||
894 | 29 | property ScopeDelegateMapper scopeMapper : ScopeDelegateMapper {} | 30 | property ScopeDelegateMapper scopeMapper : ScopeDelegateMapper {} |
895 | 30 | property ListModel searchHistory | 31 | property ListModel searchHistory |
896 | @@ -33,6 +34,8 @@ | |||
897 | 33 | signal movementEnded() | 34 | signal movementEnded() |
898 | 34 | signal scopeLoaded(string scopeId) | 35 | signal scopeLoaded(string scopeId) |
899 | 35 | signal positionedAtBeginning() | 36 | signal positionedAtBeginning() |
900 | 37 | signal gotoScope(string scopeId) | ||
901 | 38 | signal openScope(var scope) | ||
902 | 36 | 39 | ||
903 | 37 | // If we set the current scope index before the scopes have been added, | 40 | // If we set the current scope index before the scopes have been added, |
904 | 38 | // then we need to wait until the loaded signals gets emitted from the scopes | 41 | // then we need to wait until the loaded signals gets emitted from the scopes |
905 | @@ -77,15 +80,27 @@ | |||
906 | 77 | } | 80 | } |
907 | 78 | } | 81 | } |
908 | 79 | 82 | ||
909 | 83 | function closeScope(scope) { | ||
910 | 84 | dashContentList.currentItem.theScope.closeScope(scope) | ||
911 | 85 | } | ||
912 | 86 | |||
913 | 87 | function closePreview() { | ||
914 | 88 | previewListView.open = false; | ||
915 | 89 | } | ||
916 | 90 | |||
917 | 80 | Item { | 91 | Item { |
918 | 81 | id: dashContentListHolder | 92 | id: dashContentListHolder |
920 | 82 | anchors.fill: parent | 93 | |
921 | 94 | x: previewListView.open ? -width : 0 | ||
922 | 95 | Behavior on x { UbuntuNumberAnimation { } } | ||
923 | 96 | width: parent.width | ||
924 | 97 | height: parent.height | ||
925 | 83 | 98 | ||
926 | 84 | ListView { | 99 | ListView { |
927 | 85 | id: dashContentList | 100 | id: dashContentList |
928 | 86 | objectName: "dashContentList" | 101 | objectName: "dashContentList" |
929 | 87 | 102 | ||
931 | 88 | interactive: dashContent.scopes.loaded && !previewListView.onScreen && !currentItem.moving | 103 | interactive: dashContent.scopes.loaded && !previewListView.open && !currentItem.moving |
932 | 89 | 104 | ||
933 | 90 | anchors.fill: parent | 105 | anchors.fill: parent |
934 | 91 | model: dashContent.model | 106 | model: dashContent.model |
935 | @@ -100,6 +115,7 @@ | |||
936 | 100 | cacheBuffer: 1073741823 | 115 | cacheBuffer: 1073741823 |
937 | 101 | onMovementStarted: dashContent.movementStarted() | 116 | onMovementStarted: dashContent.movementStarted() |
938 | 102 | onMovementEnded: dashContent.movementEnded() | 117 | onMovementEnded: dashContent.movementEnded() |
939 | 118 | clip: parent.x != 0 | ||
940 | 103 | 119 | ||
941 | 104 | // If the number of items is less than the current index, then need to reset to another item. | 120 | // If the number of items is less than the current index, then need to reset to another item. |
942 | 105 | onCountChanged: { | 121 | onCountChanged: { |
943 | @@ -133,21 +149,30 @@ | |||
944 | 133 | onLoaded: { | 149 | onLoaded: { |
945 | 134 | item.scope = Qt.binding(function() { return scope }) | 150 | item.scope = Qt.binding(function() { return scope }) |
946 | 135 | item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem }) | 151 | item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem }) |
950 | 136 | item.tabBarHeight = pageHeader.implicitHeight; | 152 | item.tabBarHeight = dashPageHeader.implicitHeight; |
951 | 137 | item.pageHeader = pageHeader; | 153 | item.pageHeader = dashPageHeader; |
949 | 138 | item.openEffect = openEffect; | ||
952 | 139 | item.previewListView = previewListView; | 154 | item.previewListView = previewListView; |
953 | 140 | dashContentList.movementStarted.connect(item.movementStarted) | 155 | dashContentList.movementStarted.connect(item.movementStarted) |
954 | 141 | dashContent.positionedAtBeginning.connect(item.positionedAtBeginning) | 156 | dashContent.positionedAtBeginning.connect(item.positionedAtBeginning) |
955 | 142 | dashContent.scopeLoaded(item.scope.id) | 157 | dashContent.scopeLoaded(item.scope.id) |
956 | 143 | } | 158 | } |
957 | 159 | Connections { | ||
958 | 160 | target: isCurrent ? scope : null | ||
959 | 161 | onGotoScope: { | ||
960 | 162 | // Note here scopeId is the signal parameter and not the loader property | ||
961 | 163 | dashContent.gotoScope(scopeId); | ||
962 | 164 | } | ||
963 | 165 | onOpenScope: { | ||
964 | 166 | dashContent.openScope(scope); | ||
965 | 167 | } | ||
966 | 168 | } | ||
967 | 144 | 169 | ||
968 | 145 | Component.onDestruction: active = false | 170 | Component.onDestruction: active = false |
969 | 146 | } | 171 | } |
970 | 147 | } | 172 | } |
971 | 148 | 173 | ||
972 | 149 | PageHeader { | 174 | PageHeader { |
974 | 150 | id: pageHeader | 175 | id: dashPageHeader |
975 | 151 | objectName: "pageHeader" | 176 | objectName: "pageHeader" |
976 | 152 | width: parent.width | 177 | width: parent.width |
977 | 153 | searchEntryEnabled: true | 178 | searchEntryEnabled: true |
978 | @@ -157,12 +182,16 @@ | |||
979 | 157 | childItem: TabBar { | 182 | childItem: TabBar { |
980 | 158 | id: tabBar | 183 | id: tabBar |
981 | 159 | objectName: "tabbar" | 184 | objectName: "tabbar" |
983 | 160 | height: units.gu(7) | 185 | height: units.gu(6.5) |
984 | 161 | width: parent.width | 186 | width: parent.width |
985 | 162 | selectionMode: false | 187 | selectionMode: false |
986 | 163 | style: DashContentTabBarStyle {} | 188 | style: DashContentTabBarStyle {} |
987 | 164 | 189 | ||
989 | 165 | model: dashContentList.model | 190 | // TODO This together with the __styleInstance onModelChanged below |
990 | 191 | // are a workaround for the first tab sometimes not showing the text. | ||
991 | 192 | // But Tabs are going away in the future so not sure if makes | ||
992 | 193 | // sense invetigating what's the problem at this stage | ||
993 | 194 | model: dashContentList.model.count > 0 ? dashContentList.model : null | ||
994 | 166 | 195 | ||
995 | 167 | onSelectedIndexChanged: { | 196 | onSelectedIndexChanged: { |
996 | 168 | dashContentList.currentIndex = selectedIndex; | 197 | dashContentList.currentIndex = selectedIndex; |
997 | @@ -176,36 +205,23 @@ | |||
998 | 176 | } | 205 | } |
999 | 177 | 206 | ||
1000 | 178 | Connections { | 207 | Connections { |
1005 | 179 | target: model | 208 | target: __styleInstance |
1006 | 180 | onCountChanged: { | 209 | onModelChanged: { |
1007 | 181 | if (tabBar.selectedIndex < 0 && model.count > 0) | 210 | tabBar.selectedIndex = -1; |
1008 | 182 | tabBar.selectedIndex = 0; | 211 | tabBar.selectedIndex = 0; |
1009 | 183 | } | 212 | } |
1010 | 184 | } | 213 | } |
1011 | 185 | |||
1012 | 186 | Component.onCompleted: { | ||
1013 | 187 | __styleInstance.headerTextStyle = Text.Raised | ||
1014 | 188 | __styleInstance.headerTextStyleColor = "black" | ||
1015 | 189 | } | ||
1016 | 190 | } | 214 | } |
1017 | 191 | } | 215 | } |
1018 | 192 | } | 216 | } |
1019 | 193 | 217 | ||
1020 | 194 | DashContentOpenEffect { | ||
1021 | 195 | id: openEffect | ||
1022 | 196 | anchors { | ||
1023 | 197 | fill: parent | ||
1024 | 198 | bottomMargin: -bottomOverflow | ||
1025 | 199 | } | ||
1026 | 200 | sourceItem: dashContentListHolder | ||
1027 | 201 | previewListView: previewListView | ||
1028 | 202 | } | ||
1029 | 203 | |||
1030 | 204 | PreviewListView { | 218 | PreviewListView { |
1031 | 205 | id: previewListView | 219 | id: previewListView |
1034 | 206 | openEffect: openEffect | 220 | visible: x != width |
1033 | 207 | categoryView: dashContentList.currentItem ? dashContentList.currentItem.categoryView : null | ||
1035 | 208 | scope: dashContentList.currentItem ? dashContentList.currentItem.theScope : null | 221 | scope: dashContentList.currentItem ? dashContentList.currentItem.theScope : null |
1037 | 209 | anchors.fill: parent | 222 | pageHeader: dashPageHeader |
1038 | 223 | width: parent.width | ||
1039 | 224 | height: parent.height | ||
1040 | 225 | anchors.left: dashContentListHolder.right | ||
1041 | 210 | } | 226 | } |
1042 | 211 | } | 227 | } |
1043 | 212 | 228 | ||
1044 | === removed file 'qml/Dash/DashContentOpenEffect.qml' | |||
1045 | --- qml/Dash/DashContentOpenEffect.qml 2013-11-05 16:06:09 +0000 | |||
1046 | +++ qml/Dash/DashContentOpenEffect.qml 1970-01-01 00:00:00 +0000 | |||
1047 | @@ -1,57 +0,0 @@ | |||
1048 | 1 | /* | ||
1049 | 2 | * Copyright (C) 2013 Canonical, Ltd. | ||
1050 | 3 | * | ||
1051 | 4 | * This program is free software; you can redistribute it and/or modify | ||
1052 | 5 | * it under the terms of the GNU General Public License as published by | ||
1053 | 6 | * the Free Software Foundation; version 3. | ||
1054 | 7 | * | ||
1055 | 8 | * This program is distributed in the hope that it will be useful, | ||
1056 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
1057 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
1058 | 11 | * GNU General Public License for more details. | ||
1059 | 12 | * | ||
1060 | 13 | * You should have received a copy of the GNU General Public License | ||
1061 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
1062 | 15 | */ | ||
1063 | 16 | |||
1064 | 17 | import QtQuick 2.0 | ||
1065 | 18 | import Ubuntu.Components 0.1 | ||
1066 | 19 | import "../Components" | ||
1067 | 20 | |||
1068 | 21 | OpenEffect { | ||
1069 | 22 | property PreviewListView previewListView: null | ||
1070 | 23 | |||
1071 | 24 | objectName: "openEffect" | ||
1072 | 25 | anchors { | ||
1073 | 26 | fill: parent | ||
1074 | 27 | bottomMargin: -bottomOverflow | ||
1075 | 28 | } | ||
1076 | 29 | |||
1077 | 30 | enabled: gap > 0.0 | ||
1078 | 31 | |||
1079 | 32 | topGapPx: (1 - gap) * positionPx | ||
1080 | 33 | topOpacity: (1 - gap * 1.2) | ||
1081 | 34 | bottomGapPx: positionPx + gap * (targetBottomGapPx - positionPx) | ||
1082 | 35 | bottomOverflow: units.gu(20) | ||
1083 | 36 | live: !expansionAnimation.running | ||
1084 | 37 | |||
1085 | 38 | property int targetBottomGapPx: height - units.gu(8) - bottomOverflow | ||
1086 | 39 | property real gap: previewListView.open ? 1.0 : 0.0 | ||
1087 | 40 | |||
1088 | 41 | Behavior on gap { | ||
1089 | 42 | NumberAnimation { | ||
1090 | 43 | id: expansionAnimation | ||
1091 | 44 | duration: 200 | ||
1092 | 45 | easing.type: Easing.InOutQuad | ||
1093 | 46 | onRunningChanged: { | ||
1094 | 47 | if (!previewListView.open && !running) { | ||
1095 | 48 | previewListView.onScreen = false | ||
1096 | 49 | } | ||
1097 | 50 | } | ||
1098 | 51 | } | ||
1099 | 52 | } | ||
1100 | 53 | Behavior on positionPx { | ||
1101 | 54 | enabled: previewListView.open | ||
1102 | 55 | UbuntuNumberAnimation {} | ||
1103 | 56 | } | ||
1104 | 57 | } | ||
1105 | 58 | 0 | ||
1106 | === modified file 'qml/Dash/DashContentTabBarStyle.qml' | |||
1107 | --- qml/Dash/DashContentTabBarStyle.qml 2013-12-02 15:58:26 +0000 | |||
1108 | +++ qml/Dash/DashContentTabBarStyle.qml 2014-03-07 12:41:18 +0000 | |||
1109 | @@ -18,4 +18,7 @@ | |||
1110 | 18 | 18 | ||
1111 | 19 | TabBarStyle { | 19 | TabBarStyle { |
1112 | 20 | indicatorImageSource: "graphics/tabbarchevron.png" | 20 | indicatorImageSource: "graphics/tabbarchevron.png" |
1113 | 21 | // TODO karni: These should come from updated Ubuntu Palette. | ||
1114 | 22 | headerTextColor: "#88888888" | ||
1115 | 23 | headerTextSelectedColor: "#888888" | ||
1116 | 21 | } | 24 | } |
1117 | 22 | 25 | ||
1118 | === modified file 'qml/Dash/DashFilterGrid.qml' | |||
1119 | --- qml/Dash/DashFilterGrid.qml 2013-12-10 15:39:51 +0000 | |||
1120 | +++ qml/Dash/DashFilterGrid.qml 2014-03-07 12:41:18 +0000 | |||
1121 | @@ -26,11 +26,14 @@ | |||
1122 | 26 | property alias delegate: filterGrid.delegate | 26 | property alias delegate: filterGrid.delegate |
1123 | 27 | property alias delegateWidth: filterGrid.delegateWidth | 27 | property alias delegateWidth: filterGrid.delegateWidth |
1124 | 28 | property alias delegateHeight: filterGrid.delegateHeight | 28 | property alias delegateHeight: filterGrid.delegateHeight |
1125 | 29 | property alias verticalSpacing: filterGrid.verticalSpacing | ||
1126 | 29 | property alias maximumNumberOfColumns: filterGrid.maximumNumberOfColumns | 30 | property alias maximumNumberOfColumns: filterGrid.maximumNumberOfColumns |
1127 | 30 | property alias minimumHorizontalSpacing: filterGrid.minimumHorizontalSpacing | 31 | property alias minimumHorizontalSpacing: filterGrid.minimumHorizontalSpacing |
1128 | 32 | property alias collapsedRowCount: filterGrid.collapsedRowCount | ||
1129 | 33 | |||
1130 | 34 | property FilterGrid grid: filterGrid | ||
1131 | 31 | 35 | ||
1132 | 32 | collapsedHeight: filterGrid.collapsedHeight | 36 | collapsedHeight: filterGrid.collapsedHeight |
1133 | 33 | collapsedRowCount: filterGrid.collapsedRowCount | ||
1134 | 34 | columns: filterGrid.columns | 37 | columns: filterGrid.columns |
1135 | 35 | rows: filter ? filterGrid.collapsedRowCount : filterGrid.uncollapsedRowCount | 38 | rows: filter ? filterGrid.collapsedRowCount : filterGrid.uncollapsedRowCount |
1136 | 36 | currentItem: filterGrid.currentItem | 39 | currentItem: filterGrid.currentItem |
1137 | @@ -38,7 +41,6 @@ | |||
1138 | 38 | height: filterGrid.height | 41 | height: filterGrid.height |
1139 | 39 | margins: filterGrid.margins | 42 | margins: filterGrid.margins |
1140 | 40 | uncollapsedHeight: filterGrid.uncollapsedHeight | 43 | uncollapsedHeight: filterGrid.uncollapsedHeight |
1141 | 41 | verticalSpacing: filterGrid.verticalSpacing | ||
1142 | 42 | 44 | ||
1143 | 43 | function startFilterAnimation(filter) { | 45 | function startFilterAnimation(filter) { |
1144 | 44 | filterGrid.startFilterAnimation(filter) | 46 | filterGrid.startFilterAnimation(filter) |
1145 | 45 | 47 | ||
1146 | === modified file 'qml/Dash/DashPreviewPlaceholder.qml' | |||
1147 | --- qml/Dash/DashPreviewPlaceholder.qml 2013-09-30 12:17:20 +0000 | |||
1148 | +++ qml/Dash/DashPreviewPlaceholder.qml 2014-03-07 12:41:18 +0000 | |||
1149 | @@ -20,6 +20,6 @@ | |||
1150 | 20 | DashPreview { | 20 | DashPreview { |
1151 | 21 | ActivityIndicator { | 21 | ActivityIndicator { |
1152 | 22 | anchors.centerIn: parent | 22 | anchors.centerIn: parent |
1154 | 23 | running: true | 23 | running: visible |
1155 | 24 | } | 24 | } |
1156 | 25 | } | 25 | } |
1157 | 26 | 26 | ||
1158 | === modified file 'qml/Dash/DashRenderer.qml' | |||
1159 | --- qml/Dash/DashRenderer.qml 2013-12-10 15:39:51 +0000 | |||
1160 | +++ qml/Dash/DashRenderer.qml 2014-03-07 12:41:18 +0000 | |||
1161 | @@ -62,4 +62,10 @@ | |||
1162 | 62 | 62 | ||
1163 | 63 | function startFilterAnimation(filter) { | 63 | function startFilterAnimation(filter) { |
1164 | 64 | } | 64 | } |
1165 | 65 | |||
1166 | 66 | /// Category template definition from the scope | ||
1167 | 67 | property var template | ||
1168 | 68 | |||
1169 | 69 | /// Component mapping and configuration from the scope | ||
1170 | 70 | property var components | ||
1171 | 65 | } | 71 | } |
1172 | 66 | 72 | ||
1173 | === modified file 'qml/Dash/GenericScopeView.qml' | |||
1174 | --- qml/Dash/GenericScopeView.qml 2014-02-28 10:46:49 +0000 | |||
1175 | +++ qml/Dash/GenericScopeView.qml 2014-03-07 12:41:18 +0000 | |||
1176 | @@ -17,7 +17,7 @@ | |||
1177 | 17 | import QtQuick 2.0 | 17 | import QtQuick 2.0 |
1178 | 18 | import Ubuntu.Components 0.1 | 18 | import Ubuntu.Components 0.1 |
1179 | 19 | import Utils 0.1 | 19 | import Utils 0.1 |
1181 | 20 | import Unity 0.1 | 20 | import Unity 0.2 |
1182 | 21 | import "../Components" | 21 | import "../Components" |
1183 | 22 | import "../Components/ListItems" as ListItems | 22 | import "../Components/ListItems" as ListItems |
1184 | 23 | 23 | ||
1185 | @@ -30,7 +30,6 @@ | |||
1186 | 30 | property alias moving: categoryView.moving | 30 | property alias moving: categoryView.moving |
1187 | 31 | property int tabBarHeight: 0 | 31 | property int tabBarHeight: 0 |
1188 | 32 | property PageHeader pageHeader: null | 32 | property PageHeader pageHeader: null |
1189 | 33 | property OpenEffect openEffect: null | ||
1190 | 34 | property Item previewListView: null | 33 | property Item previewListView: null |
1191 | 35 | 34 | ||
1192 | 36 | signal movementStarted | 35 | signal movementStarted |
1193 | @@ -55,7 +54,7 @@ | |||
1194 | 55 | Binding { | 54 | Binding { |
1195 | 56 | target: scope | 55 | target: scope |
1196 | 57 | property: "isActive" | 56 | property: "isActive" |
1198 | 58 | value: isCurrent && !previewListView.onScreen | 57 | value: isCurrent && !previewListView.open |
1199 | 59 | } | 58 | } |
1200 | 60 | 59 | ||
1201 | 61 | Timer { | 60 | Timer { |
1202 | @@ -115,10 +114,9 @@ | |||
1203 | 115 | objectName: "categoryListView" | 114 | objectName: "categoryListView" |
1204 | 116 | anchors.fill: parent | 115 | anchors.fill: parent |
1205 | 117 | model: scopeView.categories | 116 | model: scopeView.categories |
1207 | 118 | forceNoClip: previewListView.onScreen | 117 | forceNoClip: previewListView.open |
1208 | 119 | 118 | ||
1209 | 120 | property string expandedCategoryId: "" | 119 | property string expandedCategoryId: "" |
1210 | 121 | signal correctExpandedCategory(); | ||
1211 | 122 | 120 | ||
1212 | 123 | onContentYChanged: pageHeader.positionRealHeader(); | 121 | onContentYChanged: pageHeader.positionRealHeader(); |
1213 | 124 | onOriginYChanged: pageHeader.positionRealHeader(); | 122 | onOriginYChanged: pageHeader.positionRealHeader(); |
1214 | @@ -133,6 +131,7 @@ | |||
1215 | 133 | id: baseItem | 131 | id: baseItem |
1216 | 134 | objectName: "dashCategory" + category | 132 | objectName: "dashCategory" + category |
1217 | 135 | highlightWhenPressed: false | 133 | highlightWhenPressed: false |
1218 | 134 | showDivider: false | ||
1219 | 136 | 135 | ||
1220 | 137 | readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false | 136 | readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false |
1221 | 138 | readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filter : true | 137 | readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filter : true |
1222 | @@ -147,7 +146,7 @@ | |||
1223 | 147 | right: parent.right | 146 | right: parent.right |
1224 | 148 | } | 147 | } |
1225 | 149 | 148 | ||
1227 | 150 | source: getRenderer(model.renderer, model.contentType, model.rendererHint, results) | 149 | source: getRenderer(model.renderer, results) |
1228 | 151 | 150 | ||
1229 | 152 | onLoaded: { | 151 | onLoaded: { |
1230 | 153 | if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) { | 152 | if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) { |
1231 | @@ -155,9 +154,10 @@ | |||
1232 | 155 | scopeView.enableHeightBehaviorOnNextCreation = false; | 154 | scopeView.enableHeightBehaviorOnNextCreation = false; |
1233 | 156 | } | 155 | } |
1234 | 157 | if (source.toString().indexOf("Apps/RunningApplicationsGrid.qml") != -1) { | 156 | if (source.toString().indexOf("Apps/RunningApplicationsGrid.qml") != -1) { |
1238 | 158 | // TODO: the running apps grid doesn't support standard scope results model yet | 157 | // TODO: this is still a kludge :D Ideally add some kind of hook so that we |
1239 | 159 | item.firstModel = Qt.binding(function() { return results.firstModel }) | 158 | // can do this from DashApps.qml or think a better way that needs no special casing |
1240 | 160 | item.secondModel = Qt.binding(function() { return results.secondModel }) | 159 | item.firstModel = Qt.binding(function() { return mainStageApplicationsModel }) |
1241 | 160 | item.secondModel = Qt.binding(function() { return sideStageApplicationModel }) | ||
1242 | 161 | item.canEnableTerminationMode = Qt.binding(function() { return scopeView.isCurrent }) | 161 | item.canEnableTerminationMode = Qt.binding(function() { return scopeView.isCurrent }) |
1243 | 162 | } else { | 162 | } else { |
1244 | 163 | item.model = Qt.binding(function() { return results }) | 163 | item.model = Qt.binding(function() { return results }) |
1245 | @@ -170,6 +170,9 @@ | |||
1246 | 170 | } | 170 | } |
1247 | 171 | } | 171 | } |
1248 | 172 | updateDelegateCreationRange(); | 172 | updateDelegateCreationRange(); |
1249 | 173 | // FIXME: should be "template", not "renderer" | ||
1250 | 174 | item.template = Qt.binding(function() { return model.renderer }); | ||
1251 | 175 | item.components = Qt.binding(function() { return model.components }); | ||
1252 | 173 | } | 176 | } |
1253 | 174 | 177 | ||
1254 | 175 | Component.onDestruction: { | 178 | Component.onDestruction: { |
1255 | @@ -181,39 +184,24 @@ | |||
1256 | 181 | Connections { | 184 | Connections { |
1257 | 182 | target: rendererLoader.item | 185 | target: rendererLoader.item |
1258 | 183 | onClicked: { | 186 | onClicked: { |
1273 | 184 | // Prepare the preview in case activate() triggers a preview only | 187 | if (scopeView.scope.id === "scopes" || (scopeView.scope.id == "clickscope" && categoryId == "local")) { |
1274 | 185 | openEffect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight); | 188 | // TODO Technically it is possible that calling activate() will make the scope emit |
1275 | 186 | previewListView.categoryId = categoryId | 189 | // previewRequested so that we show a preview but there's no scope that does that yet |
1276 | 187 | previewListView.categoryDelegate = rendererLoader.item | 190 | // so it's not implemented |
1277 | 188 | previewListView.model = target.model; | 191 | var item = target.model.get(index); |
1278 | 189 | previewListView.init = true; | 192 | scopeView.scope.activate(item.result) |
1265 | 190 | previewListView.currentIndex = index; | ||
1266 | 191 | |||
1267 | 192 | var item = target.model.get(index); | ||
1268 | 193 | |||
1269 | 194 | if ((scopeView.scope.id == "applications.scope" && categoryId == "installed") | ||
1270 | 195 | || (scopeView.scope.id == "home.scope" && categoryId == "applications.scope")) { | ||
1271 | 196 | scopeView.scope.activate(item.uri, item.icon, item.category, 0, item.mimetype, item.title, | ||
1272 | 197 | item.comment, item.dndUri, item.metadata) | ||
1279 | 198 | } else { | 193 | } else { |
1280 | 194 | previewListView.model = target.model; | ||
1281 | 195 | previewListView.currentIndex = -1 | ||
1282 | 196 | previewListView.currentIndex = index; | ||
1283 | 199 | previewListView.open = true | 197 | previewListView.open = true |
1284 | 200 | |||
1285 | 201 | scopeView.scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title, | ||
1286 | 202 | item.comment, item.dndUri, item.metadata) | ||
1287 | 203 | } | 198 | } |
1288 | 204 | } | 199 | } |
1289 | 205 | onPressAndHold: { | 200 | onPressAndHold: { |
1290 | 206 | openEffect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight); | ||
1291 | 207 | previewListView.categoryId = categoryId | ||
1292 | 208 | previewListView.categoryDelegate = rendererLoader.item | ||
1293 | 209 | previewListView.model = target.model; | 201 | previewListView.model = target.model; |
1295 | 210 | previewListView.init = true; | 202 | previewListView.currentIndex = -1 |
1296 | 211 | previewListView.currentIndex = index; | 203 | previewListView.currentIndex = index; |
1297 | 212 | previewListView.open = true | 204 | previewListView.open = true |
1298 | 213 | |||
1299 | 214 | var item = target.model.get(index) | ||
1300 | 215 | scopeView.scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title, | ||
1301 | 216 | item.comment, item.dndUri, item.metadata) | ||
1302 | 217 | } | 205 | } |
1303 | 218 | } | 206 | } |
1304 | 219 | Connections { | 207 | Connections { |
1305 | @@ -221,9 +209,6 @@ | |||
1306 | 221 | onExpandedCategoryIdChanged: { | 209 | onExpandedCategoryIdChanged: { |
1307 | 222 | collapseAllButExpandedCategory(); | 210 | collapseAllButExpandedCategory(); |
1308 | 223 | } | 211 | } |
1309 | 224 | onCorrectExpandedCategory: { | ||
1310 | 225 | collapseAllButExpandedCategory(); | ||
1311 | 226 | } | ||
1312 | 227 | function collapseAllButExpandedCategory() { | 212 | function collapseAllButExpandedCategory() { |
1313 | 228 | var item = rendererLoader.item; | 213 | var item = rendererLoader.item; |
1314 | 229 | if (item.expandable) { | 214 | if (item.expandable) { |
1315 | @@ -275,6 +260,31 @@ | |||
1316 | 275 | } | 260 | } |
1317 | 276 | } | 261 | } |
1318 | 277 | } | 262 | } |
1319 | 263 | |||
1320 | 264 | Image { | ||
1321 | 265 | visible: index != 0 | ||
1322 | 266 | anchors { | ||
1323 | 267 | top: parent.top | ||
1324 | 268 | left: parent.left | ||
1325 | 269 | right: parent.right | ||
1326 | 270 | } | ||
1327 | 271 | fillMode: Image.Stretch | ||
1328 | 272 | source: "graphics/dash_divider_top_lightgrad.png" | ||
1329 | 273 | z: -1 | ||
1330 | 274 | } | ||
1331 | 275 | |||
1332 | 276 | Image { | ||
1333 | 277 | // FIXME Should not rely on count field of model, SortfilterProxyModel in this case. | ||
1334 | 278 | visible: index != categoryView.model.count - 1 | ||
1335 | 279 | anchors { | ||
1336 | 280 | bottom: parent.bottom | ||
1337 | 281 | left: parent.left | ||
1338 | 282 | right: parent.right | ||
1339 | 283 | } | ||
1340 | 284 | fillMode: Image.Stretch | ||
1341 | 285 | source: "graphics/dash_divider_top_darkgrad.png" | ||
1342 | 286 | z: -1 | ||
1343 | 287 | } | ||
1344 | 278 | } | 288 | } |
1345 | 279 | 289 | ||
1346 | 280 | onHeightChanged: rendererLoader.updateDelegateCreationRange(); | 290 | onHeightChanged: rendererLoader.updateDelegateCreationRange(); |
1347 | @@ -302,95 +312,35 @@ | |||
1348 | 302 | pageHeader: Item { | 312 | pageHeader: Item { |
1349 | 303 | implicitHeight: scopeView.tabBarHeight | 313 | implicitHeight: scopeView.tabBarHeight |
1350 | 304 | onHeightChanged: { | 314 | onHeightChanged: { |
1352 | 305 | if (scopeView.pageHeader) { | 315 | if (scopeView.pageHeader && scopeView.isCurrent) { |
1353 | 306 | scopeView.pageHeader.height = height; | 316 | scopeView.pageHeader.height = height; |
1354 | 307 | } | 317 | } |
1355 | 308 | } | 318 | } |
1356 | 309 | onYChanged: positionRealHeader(); | 319 | onYChanged: positionRealHeader(); |
1357 | 310 | 320 | ||
1358 | 311 | function positionRealHeader() { | 321 | function positionRealHeader() { |
1360 | 312 | if (scopeView.pageHeader) { | 322 | if (scopeView.pageHeader && scopeView.isCurrent) { |
1361 | 313 | scopeView.pageHeader.y = y + parent.y; | 323 | scopeView.pageHeader.y = y + parent.y; |
1362 | 314 | } | 324 | } |
1363 | 315 | } | 325 | } |
1364 | 316 | } | 326 | } |
1365 | 317 | } | 327 | } |
1366 | 318 | 328 | ||
1442 | 319 | function getDefaultRendererId(contentType) { | 329 | function getRenderer(template, results) { |
1443 | 320 | switch (contentType) { | 330 | var layout = template["category-layout"]; |
1444 | 321 | default: return "grid"; | 331 | |
1445 | 322 | } | 332 | if (layout == "running-apps") { |
1446 | 323 | } | 333 | return "Apps/RunningApplicationsGrid.qml"; |
1447 | 324 | 334 | } | |
1448 | 325 | function getRenderer(rendererId, contentType, rendererHint, results) { | 335 | |
1449 | 326 | if (rendererId == "default") { | 336 | if (layout === "carousel") { |
1450 | 327 | rendererId = getDefaultRendererId(contentType); | 337 | // TODO: Selectively disable carousel, 4 is fixed for now, should change depending on form factor |
1451 | 328 | } | 338 | if (results.count <= 4) layout = "grid"; |
1452 | 329 | if (rendererId == "carousel") { | 339 | } |
1453 | 330 | // Selectively disable carousel, 6 is fixed for now, should change on the form factor | 340 | switch (layout) { |
1454 | 331 | if (results.count <= 6) | 341 | case "carousel": return "CardCarousel.qml"; |
1455 | 332 | rendererId = "grid" | 342 | case "grid": |
1456 | 333 | } | 343 | default: return "CardFilterGrid.qml"; |
1382 | 334 | switch (rendererId) { | ||
1383 | 335 | case "carousel": { | ||
1384 | 336 | switch (contentType) { | ||
1385 | 337 | case "music": return "Music/MusicCarousel.qml"; | ||
1386 | 338 | case "video": return "Video/VideoCarousel.qml"; | ||
1387 | 339 | default: return "Generic/GenericCarousel.qml"; | ||
1388 | 340 | } | ||
1389 | 341 | } | ||
1390 | 342 | case "grid": { | ||
1391 | 343 | switch (contentType) { | ||
1392 | 344 | case "apps": { | ||
1393 | 345 | if (rendererHint == "toggled") | ||
1394 | 346 | return "Apps/DashPluginFilterGrid.qml"; | ||
1395 | 347 | else | ||
1396 | 348 | return "Generic/GenericFilterGrid.qml"; | ||
1397 | 349 | } | ||
1398 | 350 | case "music": return "Music/MusicFilterGrid.qml"; | ||
1399 | 351 | case "video": return "Video/VideoFilterGrid.qml"; | ||
1400 | 352 | case "weather": return "Generic/WeatherFilterGrid.qml"; | ||
1401 | 353 | default: return "Generic/GenericFilterGrid.qml"; | ||
1402 | 354 | } | ||
1403 | 355 | } | ||
1404 | 356 | case "special": { | ||
1405 | 357 | switch (contentType) { | ||
1406 | 358 | case "apps": return "Apps/RunningApplicationsGrid.qml"; | ||
1407 | 359 | default: return "Generic/GenericFilterGrid.qml"; | ||
1408 | 360 | } | ||
1409 | 361 | } | ||
1410 | 362 | default: return "Generic/GenericFilterGrid.qml"; | ||
1411 | 363 | } | ||
1412 | 364 | } | ||
1413 | 365 | |||
1414 | 366 | Connections { | ||
1415 | 367 | target: scopeView.scope | ||
1416 | 368 | onPreviewReady: { | ||
1417 | 369 | if (previewListView.init) { | ||
1418 | 370 | // Preview was triggered because of a click on the item. Need to expand now. | ||
1419 | 371 | if (!previewListView.open) { | ||
1420 | 372 | previewListView.open = true | ||
1421 | 373 | } | ||
1422 | 374 | |||
1423 | 375 | var index = previewListView.currentIndex | ||
1424 | 376 | previewListView.currentIndex = -1 | ||
1425 | 377 | previewListView.currentIndex = index | ||
1426 | 378 | previewListView.init = false | ||
1427 | 379 | } | ||
1428 | 380 | previewListView.currentItem.previewData = preview | ||
1429 | 381 | } | ||
1430 | 382 | } | ||
1431 | 383 | |||
1432 | 384 | // TODO: Move as InverseMouseArea to DashPreview | ||
1433 | 385 | MouseArea { | ||
1434 | 386 | objectName: "closePreviewMouseArea" | ||
1435 | 387 | enabled: previewListView.onScreen | ||
1436 | 388 | anchors { | ||
1437 | 389 | fill: parent | ||
1438 | 390 | topMargin: openEffect.bottomGapPx | ||
1439 | 391 | } | ||
1440 | 392 | onClicked: { | ||
1441 | 393 | previewListView.open = false; | ||
1457 | 394 | } | 344 | } |
1458 | 395 | } | 345 | } |
1459 | 396 | } | 346 | } |
1460 | 397 | 347 | ||
1461 | === modified file 'qml/Dash/PreviewListView.qml' | |||
1462 | --- qml/Dash/PreviewListView.qml 2014-01-28 15:57:51 +0000 | |||
1463 | +++ qml/Dash/PreviewListView.qml 2014-03-07 12:41:18 +0000 | |||
1464 | @@ -16,53 +16,53 @@ | |||
1465 | 16 | 16 | ||
1466 | 17 | import QtQuick 2.0 | 17 | import QtQuick 2.0 |
1467 | 18 | import Ubuntu.Components 0.1 | 18 | import Ubuntu.Components 0.1 |
1469 | 19 | import Unity 0.1 | 19 | import Unity 0.2 |
1470 | 20 | import "../Components" | 20 | import "../Components" |
1471 | 21 | import "Previews" as Previews | ||
1472 | 21 | 22 | ||
1473 | 22 | Item { | 23 | Item { |
1476 | 23 | property OpenEffect openEffect: null | 24 | id: root |
1477 | 24 | property ScopeListView categoryView: null | 25 | |
1478 | 25 | property Scope scope: null | 26 | property Scope scope: null |
1479 | 27 | property var pageHeader: null | ||
1480 | 26 | 28 | ||
1481 | 27 | property alias open: previewListView.open | 29 | property alias open: previewListView.open |
1482 | 28 | property alias onScreen: previewListView.onScreen | ||
1483 | 29 | property alias categoryId: previewListView.categoryId | ||
1484 | 30 | property alias categoryDelegate: previewListView.categoryDelegate | ||
1485 | 31 | property alias init: previewListView.init | ||
1486 | 32 | property alias model: previewListView.model | 30 | property alias model: previewListView.model |
1487 | 33 | property alias currentIndex: previewListView.currentIndex | 31 | property alias currentIndex: previewListView.currentIndex |
1488 | 34 | property alias currentItem: previewListView.currentItem | 32 | property alias currentItem: previewListView.currentItem |
1489 | 35 | property alias count: previewListView.count | 33 | property alias count: previewListView.count |
1490 | 36 | 34 | ||
1498 | 37 | Image { | 35 | PageHeader { |
1499 | 38 | objectName: "pointerArrow" | 36 | id: header |
1500 | 39 | anchors { | 37 | width: parent.width |
1501 | 40 | top: previewListView.bottom | 38 | searchEntryEnabled: false |
1502 | 41 | left: parent.left | 39 | scope: root.scope |
1503 | 42 | leftMargin: previewListView.categoryDelegate !== undefined && previewListView.categoryDelegate.currentItem ? | 40 | height: units.gu(8.5) |
1504 | 43 | previewListView.categoryDelegate.currentItem.center + (-width + margins) / 2 : 0 | 41 | showBackButton: true |
1505 | 42 | onBackClicked: root.open = false | ||
1506 | 44 | 43 | ||
1511 | 45 | Behavior on leftMargin { | 44 | childItem: Label { |
1512 | 46 | SmoothedAnimation { | 45 | id: label |
1513 | 47 | duration: UbuntuAnimation.FastDuration | 46 | anchors { |
1514 | 48 | } | 47 | left: parent.left |
1515 | 48 | right: parent.right | ||
1516 | 49 | verticalCenter: parent.verticalCenter | ||
1517 | 49 | } | 50 | } |
1518 | 51 | text: scope ? i18n.tr("%1 Preview").arg(scope.name) : "" | ||
1519 | 52 | color: "#888888" | ||
1520 | 53 | font.family: "Ubuntu" | ||
1521 | 54 | font.weight: Font.Light | ||
1522 | 55 | fontSize: "x-large" | ||
1523 | 56 | elide: Text.ElideRight | ||
1524 | 50 | } | 57 | } |
1525 | 51 | height: units.gu(1) | ||
1526 | 52 | width: units.gu(2) | ||
1527 | 53 | property int margins: previewListView.categoryDelegate ? previewListView.categoryDelegate.margins : 0 | ||
1528 | 54 | opacity: previewListView.open ? .5 : 0 | ||
1529 | 55 | |||
1530 | 56 | source: "graphics/tooltip_arrow.png" | ||
1531 | 57 | } | 58 | } |
1532 | 58 | 59 | ||
1533 | 59 | ListView { | 60 | ListView { |
1534 | 60 | id: previewListView | 61 | id: previewListView |
1535 | 61 | objectName: "previewListView" | 62 | objectName: "previewListView" |
1536 | 62 | height: openEffect.bottomGapPx - openEffect.topGapPx | ||
1537 | 63 | anchors { | 63 | anchors { |
1540 | 64 | top: parent.top | 64 | top: header.bottom |
1541 | 65 | topMargin: openEffect.topGapPx | 65 | bottom: parent.bottom |
1542 | 66 | left: parent.left | 66 | left: parent.left |
1543 | 67 | right: parent.right | 67 | right: parent.right |
1544 | 68 | } | 68 | } |
1545 | @@ -77,71 +77,17 @@ | |||
1546 | 77 | 77 | ||
1547 | 78 | // To be set before opening the preview | 78 | // To be set before opening the preview |
1548 | 79 | property string categoryId: "" | 79 | property string categoryId: "" |
1549 | 80 | property var categoryDelegate | ||
1550 | 81 | 80 | ||
1551 | 82 | // because the ListView is built asynchronous, setting the | 81 | // because the ListView is built asynchronous, setting the |
1552 | 83 | // currentIndex directly won't work. We need to refresh it | 82 | // currentIndex directly won't work. We need to refresh it |
1553 | 84 | // when the first preview is ready to be displayed. | 83 | // when the first preview is ready to be displayed. |
1554 | 85 | property bool init: true | 84 | property bool init: true |
1555 | 86 | 85 | ||
1556 | 87 | PreviewDelegateMapper { | ||
1557 | 88 | id: previewDelegateMapper | ||
1558 | 89 | } | ||
1559 | 90 | |||
1560 | 91 | onCurrentIndexChanged: positionListView(); | ||
1561 | 92 | |||
1562 | 93 | function positionListView() { | ||
1563 | 94 | if (!open) { | ||
1564 | 95 | return; | ||
1565 | 96 | } | ||
1566 | 97 | |||
1567 | 98 | var row = Math.floor(currentIndex / categoryDelegate.columns); | ||
1568 | 99 | if (categoryDelegate.collapsedRowCount <= row) { | ||
1569 | 100 | categoryView.expandedCategoryId = categoryId | ||
1570 | 101 | } | ||
1571 | 102 | |||
1572 | 103 | categoryDelegate.highlightIndex = currentIndex | ||
1573 | 104 | |||
1574 | 105 | if (!init && model !== undefined) { | ||
1575 | 106 | var item = model.get(currentIndex) | ||
1576 | 107 | scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title, item.comment, item.dndUri, item.metadata) | ||
1577 | 108 | } | ||
1578 | 109 | |||
1579 | 110 | // Adjust contentY in case we need to change to it to show the next row | ||
1580 | 111 | if (categoryDelegate.rows > 1) { | ||
1581 | 112 | var itemY = categoryView.contentItem.mapFromItem(categoryDelegate.currentItem).y; | ||
1582 | 113 | |||
1583 | 114 | // Find new contentY and effect.postionPx | ||
1584 | 115 | var newContentY = itemY - openEffect.positionPx - categoryDelegate.verticalSpacing; | ||
1585 | 116 | |||
1586 | 117 | // Make sure the item is not covered by a header. Move the effect split down if necessary | ||
1587 | 118 | var headerHeight = pageHeader.height + categoryView.stickyHeaderHeight; | ||
1588 | 119 | var effectAdjust = Math.max(openEffect.positionPx, headerHeight); | ||
1589 | 120 | |||
1590 | 121 | // Make sure we don't overscroll the listview. If yes, adjust effect position | ||
1591 | 122 | if (newContentY < 0) { | ||
1592 | 123 | effectAdjust += newContentY; | ||
1593 | 124 | newContentY = 0; | ||
1594 | 125 | } | ||
1595 | 126 | if (newContentY > Math.max(0, categoryView.contentHeight - categoryView.height)) { | ||
1596 | 127 | effectAdjust += -(categoryView.contentHeight - categoryView.height) + newContentY | ||
1597 | 128 | newContentY = categoryView.contentHeight - categoryView.height; | ||
1598 | 129 | } | ||
1599 | 130 | |||
1600 | 131 | openEffect.positionPx = effectAdjust; | ||
1601 | 132 | categoryView.contentY = newContentY; | ||
1602 | 133 | } | ||
1603 | 134 | } | ||
1604 | 135 | |||
1605 | 136 | property bool open: false | 86 | property bool open: false |
1606 | 137 | property bool onScreen: false | ||
1607 | 138 | 87 | ||
1608 | 139 | onOpenChanged: { | 88 | onOpenChanged: { |
1609 | 140 | if (open) { | 89 | if (open) { |
1610 | 141 | onScreen = true; | ||
1611 | 142 | categoryDelegate.highlightIndex = currentIndex; | ||
1612 | 143 | pageHeader.unfocus(); | 90 | pageHeader.unfocus(); |
1613 | 144 | positionListView(); | ||
1614 | 145 | } else { | 91 | } else { |
1615 | 146 | // Cancel any pending preview requests or actions | 92 | // Cancel any pending preview requests or actions |
1616 | 147 | if (previewListView.currentItem.previewData !== undefined) { | 93 | if (previewListView.currentItem.previewData !== undefined) { |
1617 | @@ -149,68 +95,43 @@ | |||
1618 | 149 | } | 95 | } |
1619 | 150 | scope.cancelActivation(); | 96 | scope.cancelActivation(); |
1620 | 151 | model = undefined; | 97 | model = undefined; |
1621 | 152 | categoryView.correctExpandedCategory(); | ||
1622 | 153 | categoryDelegate.highlightIndex = -1; | ||
1623 | 154 | } | 98 | } |
1624 | 155 | } | 99 | } |
1625 | 156 | 100 | ||
1635 | 157 | Rectangle { | 101 | delegate: Item { |
1627 | 158 | anchors.fill: parent | ||
1628 | 159 | color: Qt.rgba(0, 0, 0, .3) | ||
1629 | 160 | z: -1 | ||
1630 | 161 | } | ||
1631 | 162 | |||
1632 | 163 | delegate: Loader { | ||
1633 | 164 | id: previewLoader | ||
1634 | 165 | objectName: "previewLoader" + index | ||
1636 | 166 | height: previewListView.height | 102 | height: previewListView.height |
1637 | 167 | width: previewListView.width | 103 | width: previewListView.width |
1684 | 168 | asynchronous: true | 104 | |
1685 | 169 | source: previewListView.onScreen ? | 105 | readonly property bool ready: preview.previewModel.loaded |
1686 | 170 | (previewData !== undefined ? previewDelegateMapper.map(previewData.rendererName) : "DashPreviewPlaceholder.qml") : "" | 106 | |
1687 | 171 | 107 | Previews.Preview { | |
1688 | 172 | onPreviewDataChanged: { | 108 | id: preview |
1689 | 173 | if (previewData !== undefined && source.toString().indexOf("DashPreviewPlaceholder.qml") != -1) { | 109 | objectName: "preview" + index |
1690 | 174 | previewLoader.opacity = 0; | 110 | anchors.fill: parent |
1691 | 175 | } | 111 | |
1692 | 176 | } | 112 | isCurrent: parent.ListView.isCurrentItem |
1693 | 177 | 113 | ||
1694 | 178 | onSourceChanged: { | 114 | previewModel: { |
1695 | 179 | if (previewData !== undefined) { | 115 | var previewStack = root.scope.preview(result); |
1696 | 180 | fadeIn.start() | 116 | return previewStack.get(0); |
1697 | 181 | } | 117 | } |
1698 | 182 | } | 118 | |
1699 | 183 | 119 | // onClose: { | |
1700 | 184 | PropertyAnimation { | 120 | // previewListView.open = false |
1701 | 185 | id: fadeIn | 121 | // } |
1702 | 186 | target: previewLoader | 122 | |
1703 | 187 | property: "opacity" | 123 | } |
1704 | 188 | from: 0.0 | 124 | |
1705 | 189 | to: 1.0 | 125 | MouseArea { |
1706 | 190 | duration: UbuntuAnimation.BriskDuration | 126 | id: processingMouseArea |
1707 | 191 | } | 127 | objectName: "processingMouseArea" |
1708 | 192 | 128 | anchors.fill: parent | |
1709 | 193 | property var previewData | 129 | enabled: !preview.previewModel.loaded || preview.previewModel.processingAction |
1710 | 194 | property bool valid: item !== null | 130 | |
1711 | 195 | 131 | ActivityIndicator { | |
1712 | 196 | onLoaded: { | 132 | anchors.centerIn: parent |
1713 | 197 | if (previewListView.onScreen && previewData !== undefined) { | 133 | visible: root.open && parent.enabled |
1714 | 198 | item.previewData = Qt.binding(function() { return previewData }) | 134 | running: visible |
1669 | 199 | item.isCurrent = Qt.binding(function() { return ListView.isCurrentItem }) | ||
1670 | 200 | } | ||
1671 | 201 | } | ||
1672 | 202 | |||
1673 | 203 | Connections { | ||
1674 | 204 | ignoreUnknownSignals: true | ||
1675 | 205 | target: item | ||
1676 | 206 | onClose: { | ||
1677 | 207 | previewListView.open = false | ||
1678 | 208 | } | ||
1679 | 209 | } | ||
1680 | 210 | |||
1681 | 211 | function closePreviewSpinner() { | ||
1682 | 212 | if (item) { | ||
1683 | 213 | item.showProcessingAction = false; | ||
1715 | 214 | } | 135 | } |
1716 | 215 | } | 136 | } |
1717 | 216 | } | 137 | } |
1718 | 217 | 138 | ||
1719 | === modified file 'qml/Dash/Previews/Preview.qml' | |||
1720 | --- qml/Dash/Previews/Preview.qml 2014-02-12 09:36:33 +0000 | |||
1721 | +++ qml/Dash/Previews/Preview.qml 2014-03-07 12:41:18 +0000 | |||
1722 | @@ -39,7 +39,8 @@ | |||
1723 | 39 | clip: true | 39 | clip: true |
1724 | 40 | 40 | ||
1725 | 41 | Connections { | 41 | Connections { |
1727 | 42 | target: shell.applicationManager | 42 | target: shell.applicationManager || null |
1728 | 43 | ignoreUnknownSignals: true | ||
1729 | 43 | onMainStageFocusedApplicationChanged: { | 44 | onMainStageFocusedApplicationChanged: { |
1730 | 44 | root.close(); | 45 | root.close(); |
1731 | 45 | } | 46 | } |
1732 | @@ -48,7 +49,11 @@ | |||
1733 | 48 | } | 49 | } |
1734 | 49 | } | 50 | } |
1735 | 50 | 51 | ||
1737 | 51 | onPreviewModelChanged: processingMouseArea.enabled = false | 52 | Binding { |
1738 | 53 | target: previewModel | ||
1739 | 54 | property: "widgetColumnCount" | ||
1740 | 55 | value: row.columns | ||
1741 | 56 | } | ||
1742 | 52 | 57 | ||
1743 | 53 | MouseArea { | 58 | MouseArea { |
1744 | 54 | anchors.fill: parent | 59 | anchors.fill: parent |
1745 | @@ -60,18 +65,21 @@ | |||
1746 | 60 | spacing: units.gu(1) | 65 | spacing: units.gu(1) |
1747 | 61 | anchors { fill: parent; margins: spacing } | 66 | anchors { fill: parent; margins: spacing } |
1748 | 62 | 67 | ||
1749 | 68 | property int columns: width >= units.gu(80) ? 2 : 1 | ||
1750 | 69 | property real columnWidth: width / columns | ||
1751 | 70 | |||
1752 | 63 | Repeater { | 71 | Repeater { |
1754 | 64 | model: 1 | 72 | model: previewModel |
1755 | 65 | 73 | ||
1756 | 66 | delegate: ListView { | 74 | delegate: ListView { |
1757 | 67 | id: column | 75 | id: column |
1758 | 68 | anchors { top: parent.top; bottom: parent.bottom } | 76 | anchors { top: parent.top; bottom: parent.bottom } |
1760 | 69 | width: row.width | 77 | width: row.columnWidth |
1761 | 70 | spacing: row.spacing | 78 | spacing: row.spacing |
1762 | 71 | bottomMargin: Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0 | 79 | bottomMargin: Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0 |
1763 | 72 | 80 | ||
1766 | 73 | model: previewModel | 81 | model: columnModel |
1767 | 74 | cacheBuffer: units.gu(40) | 82 | cacheBuffer: height |
1768 | 75 | 83 | ||
1769 | 76 | Behavior on contentY { UbuntuNumberAnimation { } } | 84 | Behavior on contentY { UbuntuNumberAnimation { } } |
1770 | 77 | 85 | ||
1771 | @@ -80,10 +88,14 @@ | |||
1772 | 80 | widgetType: model.type | 88 | widgetType: model.type |
1773 | 81 | widgetData: model.properties | 89 | widgetData: model.properties |
1774 | 82 | isCurrentPreview: root.isCurrent | 90 | isCurrentPreview: root.isCurrent |
1776 | 83 | anchors { left: parent.left; right: parent.right } | 91 | anchors { |
1777 | 92 | left: parent.left | ||
1778 | 93 | right: parent.right | ||
1779 | 94 | leftMargin: units.gu(1) | ||
1780 | 95 | rightMargin: units.gu(1) | ||
1781 | 96 | } | ||
1782 | 84 | 97 | ||
1783 | 85 | onTriggered: { | 98 | onTriggered: { |
1784 | 86 | processingMouseArea.enabled = true; | ||
1785 | 87 | previewModel.triggered(widgetId, actionId, data); | 99 | previewModel.triggered(widgetId, actionId, data); |
1786 | 88 | } | 100 | } |
1787 | 89 | 101 | ||
1788 | @@ -94,11 +106,4 @@ | |||
1789 | 94 | } | 106 | } |
1790 | 95 | } | 107 | } |
1791 | 96 | } | 108 | } |
1792 | 97 | |||
1793 | 98 | MouseArea { | ||
1794 | 99 | id: processingMouseArea | ||
1795 | 100 | objectName: "processingMouseArea" | ||
1796 | 101 | anchors.fill: parent | ||
1797 | 102 | enabled: false | ||
1798 | 103 | } | ||
1799 | 104 | } | 109 | } |
1800 | 105 | 110 | ||
1801 | === modified file 'qml/Dash/Previews/PreviewActions.qml' | |||
1802 | --- qml/Dash/Previews/PreviewActions.qml 2014-02-12 09:11:54 +0000 | |||
1803 | +++ qml/Dash/Previews/PreviewActions.qml 2014-03-07 12:41:18 +0000 | |||
1804 | @@ -24,7 +24,7 @@ | |||
1805 | 24 | PreviewWidget { | 24 | PreviewWidget { |
1806 | 25 | id: root | 25 | id: root |
1807 | 26 | 26 | ||
1809 | 27 | height: row.height | 27 | height: row.height + units.gu(1) |
1810 | 28 | 28 | ||
1811 | 29 | Row { | 29 | Row { |
1812 | 30 | id: row | 30 | id: row |
1813 | 31 | 31 | ||
1814 | === modified file 'qml/Dash/Previews/PreviewAudioPlayback.qml' | |||
1815 | --- qml/Dash/Previews/PreviewAudioPlayback.qml 2014-02-05 12:37:20 +0000 | |||
1816 | +++ qml/Dash/Previews/PreviewAudioPlayback.qml 2014-03-07 12:41:18 +0000 | |||
1817 | @@ -139,7 +139,7 @@ | |||
1818 | 139 | objectName: "trackTitleLabel" | 139 | objectName: "trackTitleLabel" |
1819 | 140 | anchors { top: parent.top; left: parent.left; right: parent.right } | 140 | anchors { top: parent.top; left: parent.left; right: parent.right } |
1820 | 141 | opacity: 0.9 | 141 | opacity: 0.9 |
1822 | 142 | color: Theme.palette.selected.backgroundText | 142 | color: "grey"//Theme.palette.selected.backgroundText // TODO karni: Use updated Palette. |
1823 | 143 | fontSize: "small" | 143 | fontSize: "small" |
1824 | 144 | horizontalAlignment: Text.AlignLeft | 144 | horizontalAlignment: Text.AlignLeft |
1825 | 145 | text: modelData["title"] | 145 | text: modelData["title"] |
1826 | @@ -152,7 +152,7 @@ | |||
1827 | 152 | anchors { top: trackTitleLabel.bottom; left: parent.left; right: parent.right } | 152 | anchors { top: trackTitleLabel.bottom; left: parent.left; right: parent.right } |
1828 | 153 | visible: text !== "" | 153 | visible: text !== "" |
1829 | 154 | opacity: 0.9 | 154 | opacity: 0.9 |
1831 | 155 | color: Theme.palette.selected.backgroundText | 155 | color: "lightgrey"//Theme.palette.selected.backgroundText // TODO karni: Use updated Palette. |
1832 | 156 | fontSize: "small" | 156 | fontSize: "small" |
1833 | 157 | horizontalAlignment: Text.AlignLeft | 157 | horizontalAlignment: Text.AlignLeft |
1834 | 158 | text: modelData["subtitle"] || "" | 158 | text: modelData["subtitle"] || "" |
1835 | @@ -192,7 +192,7 @@ | |||
1836 | 192 | anchors.verticalCenter: parent.verticalCenter | 192 | anchors.verticalCenter: parent.verticalCenter |
1837 | 193 | width: parent.column3Width | 193 | width: parent.column3Width |
1838 | 194 | opacity: 0.9 | 194 | opacity: 0.9 |
1840 | 195 | color: Theme.palette.selected.backgroundText | 195 | color: "grey"//Theme.palette.selected.backgroundText // TODO karni: Use updated Palette. |
1841 | 196 | fontSize: "small" | 196 | fontSize: "small" |
1842 | 197 | horizontalAlignment: Text.AlignRight | 197 | horizontalAlignment: Text.AlignRight |
1843 | 198 | text: audio.lengthToString(modelData["length"]) | 198 | text: audio.lengthToString(modelData["length"]) |
1844 | 199 | 199 | ||
1845 | === modified file 'qml/Dash/Previews/PreviewHeader.qml' | |||
1846 | --- qml/Dash/Previews/PreviewHeader.qml 2014-02-07 14:08:40 +0000 | |||
1847 | +++ qml/Dash/Previews/PreviewHeader.qml 2014-03-07 12:41:18 +0000 | |||
1848 | @@ -34,5 +34,7 @@ | |||
1849 | 34 | title: root.widgetData["title"] || "" | 34 | title: root.widgetData["title"] || "" |
1850 | 35 | subtitle: root.widgetData["subtitle"] || "" | 35 | subtitle: root.widgetData["subtitle"] || "" |
1851 | 36 | width: parent.width | 36 | width: parent.width |
1852 | 37 | |||
1853 | 38 | titleSize: "large" | ||
1854 | 37 | } | 39 | } |
1855 | 38 | } | ||
1856 | 39 | \ No newline at end of file | 40 | \ No newline at end of file |
1857 | 41 | } | ||
1858 | 40 | 42 | ||
1859 | === modified file 'qml/Dash/Previews/PreviewImageGallery.qml' | |||
1860 | --- qml/Dash/Previews/PreviewImageGallery.qml 2014-02-05 12:08:18 +0000 | |||
1861 | +++ qml/Dash/Previews/PreviewImageGallery.qml 2014-03-07 12:41:18 +0000 | |||
1862 | @@ -32,6 +32,16 @@ | |||
1863 | 32 | orientation: ListView.Horizontal | 32 | orientation: ListView.Horizontal |
1864 | 33 | cacheBuffer: width * 3 | 33 | cacheBuffer: width * 3 |
1865 | 34 | model: root.widgetData["sources"] | 34 | model: root.widgetData["sources"] |
1866 | 35 | clip: true | ||
1867 | 36 | |||
1868 | 37 | // FIXME: Because of ListViews inside ListViews inside Flickables inside ListViews (and some more) | ||
1869 | 38 | // we finally reached the point where this ListView doesn't correctly get swipe input any more but | ||
1870 | 39 | // instead the parent ListView is the one that is swiped. This MouseArea sort of creates a blocking | ||
1871 | 40 | // layer to make sure this ListView can be swiped, regardless of what's behind it. | ||
1872 | 41 | MouseArea { | ||
1873 | 42 | anchors.fill: parent | ||
1874 | 43 | enabled: parent.contentWidth > parent.width | ||
1875 | 44 | } | ||
1876 | 35 | 45 | ||
1877 | 36 | LazyImage { | 46 | LazyImage { |
1878 | 37 | objectName: "placeholderScreenshot" | 47 | objectName: "placeholderScreenshot" |
1879 | 38 | 48 | ||
1880 | === modified file 'qml/Dash/Previews/PreviewTextSummary.qml' | |||
1881 | --- qml/Dash/Previews/PreviewTextSummary.qml 2014-02-06 10:23:05 +0000 | |||
1882 | +++ qml/Dash/Previews/PreviewTextSummary.qml 2014-03-07 12:41:18 +0000 | |||
1883 | @@ -38,7 +38,8 @@ | |||
1884 | 38 | right: parent.right | 38 | right: parent.right |
1885 | 39 | } | 39 | } |
1886 | 40 | fontSize: "large" | 40 | fontSize: "large" |
1888 | 41 | color: Theme.palette.selected.backgroundText | 41 | // TODO karni: Yet another fix requiring Palette update. |
1889 | 42 | color: "grey" //Theme.palette.selected.backgroundText | ||
1890 | 42 | visible: text !== "" | 43 | visible: text !== "" |
1891 | 43 | opacity: .8 | 44 | opacity: .8 |
1892 | 44 | text: widgetData["title"] || "" | 45 | text: widgetData["title"] || "" |
1893 | @@ -58,8 +59,10 @@ | |||
1894 | 58 | } | 59 | } |
1895 | 59 | height: (!seeMore.visible || seeMore.more) ? contentHeight : contentHeight / lineCount * (maximumCollapsedLineCount - 2) | 60 | height: (!seeMore.visible || seeMore.more) ? contentHeight : contentHeight / lineCount * (maximumCollapsedLineCount - 2) |
1896 | 60 | clip: true | 61 | clip: true |
1899 | 61 | fontSize: "medium" | 62 | fontSize: "small" |
1900 | 62 | color: Theme.palette.selected.backgroundText | 63 | lineHeight: 1.2 |
1901 | 64 | // TODO karni: Yet another fix requiring Palette update. | ||
1902 | 65 | color: "grey" //Theme.palette.selected.backgroundText | ||
1903 | 63 | opacity: .8 | 66 | opacity: .8 |
1904 | 64 | text: widgetData["text"] | 67 | text: widgetData["text"] |
1905 | 65 | wrapMode: Text.Wrap | 68 | wrapMode: Text.Wrap |
1906 | 66 | 69 | ||
1907 | === modified file 'qml/Dash/Previews/PreviewWidgetFactory.qml' | |||
1908 | --- qml/Dash/Previews/PreviewWidgetFactory.qml 2014-02-21 11:24:12 +0000 | |||
1909 | +++ qml/Dash/Previews/PreviewWidgetFactory.qml 2014-03-07 12:41:18 +0000 | |||
1910 | @@ -46,7 +46,7 @@ | |||
1911 | 46 | case "audio": return "PreviewAudioPlayback.qml"; | 46 | case "audio": return "PreviewAudioPlayback.qml"; |
1912 | 47 | case "gallery": return "PreviewImageGallery.qml"; | 47 | case "gallery": return "PreviewImageGallery.qml"; |
1913 | 48 | case "header": return "PreviewHeader.qml"; | 48 | case "header": return "PreviewHeader.qml"; |
1915 | 49 | case "image": return "PreviewZoomableImage.qml" | 49 | case "image": return "PreviewZoomableImage.qml"; |
1916 | 50 | case "progress": return "PreviewProgress.qml"; | 50 | case "progress": return "PreviewProgress.qml"; |
1917 | 51 | case "rating-input": return "PreviewRatingInput.qml"; | 51 | case "rating-input": return "PreviewRatingInput.qml"; |
1918 | 52 | case "reviews": return "PreviewRatingDisplay.qml"; | 52 | case "reviews": return "PreviewRatingDisplay.qml"; |
1919 | 53 | 53 | ||
1920 | === modified file 'qml/Dash/ScopeDelegateMapper.qml' | |||
1921 | --- qml/Dash/ScopeDelegateMapper.qml 2013-10-11 10:12:35 +0000 | |||
1922 | +++ qml/Dash/ScopeDelegateMapper.qml 2014-03-07 12:41:18 +0000 | |||
1923 | @@ -17,7 +17,7 @@ | |||
1924 | 17 | import QtQuick 2.0 | 17 | import QtQuick 2.0 |
1925 | 18 | 18 | ||
1926 | 19 | QtObject { | 19 | QtObject { |
1928 | 20 | property var scopeDelegateMapping: {"applications.scope": "DashApps.qml", | 20 | property var scopeDelegateMapping: {"clickscope": "DashApps.qml", |
1929 | 21 | "home.scope": "DashHome.qml" | 21 | "home.scope": "DashHome.qml" |
1930 | 22 | } | 22 | } |
1931 | 23 | property string genericScope: "GenericScopeView.qml" | 23 | property string genericScope: "GenericScopeView.qml" |
1932 | 24 | 24 | ||
1933 | === added file 'qml/Dash/ScopeItem.qml' | |||
1934 | --- qml/Dash/ScopeItem.qml 1970-01-01 00:00:00 +0000 | |||
1935 | +++ qml/Dash/ScopeItem.qml 2014-03-07 12:41:18 +0000 | |||
1936 | @@ -0,0 +1,94 @@ | |||
1937 | 1 | /* | ||
1938 | 2 | * Copyright (C) 2014 Canonical, Ltd. | ||
1939 | 3 | * | ||
1940 | 4 | * This program is free software; you can redistribute it and/or modify | ||
1941 | 5 | * it under the terms of the GNU General Public License as published by | ||
1942 | 6 | * the Free Software Foundation; version 3. | ||
1943 | 7 | * | ||
1944 | 8 | * This program is distributed in the hope that it will be useful, | ||
1945 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
1946 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
1947 | 11 | * GNU General Public License for more details. | ||
1948 | 12 | * | ||
1949 | 13 | * You should have received a copy of the GNU General Public License | ||
1950 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
1951 | 15 | */ | ||
1952 | 16 | |||
1953 | 17 | import QtQuick 2.0 | ||
1954 | 18 | import Ubuntu.Components 0.1 | ||
1955 | 19 | import Unity 0.2 | ||
1956 | 20 | import "../Components" | ||
1957 | 21 | |||
1958 | 22 | Item { | ||
1959 | 23 | id: root | ||
1960 | 24 | |||
1961 | 25 | property alias scope: scopeView.scope | ||
1962 | 26 | property alias previewOpen: previewListView.open | ||
1963 | 27 | |||
1964 | 28 | property ListModel searchHistory | ||
1965 | 29 | |||
1966 | 30 | signal back | ||
1967 | 31 | signal gotoScope(string scopeId) | ||
1968 | 32 | signal openScope(var scope) | ||
1969 | 33 | |||
1970 | 34 | Item { | ||
1971 | 35 | id: scopeViewHolder | ||
1972 | 36 | |||
1973 | 37 | x: previewListView.open ? -width : 0 | ||
1974 | 38 | Behavior on x { UbuntuNumberAnimation { } } | ||
1975 | 39 | width: parent.width | ||
1976 | 40 | height: parent.height | ||
1977 | 41 | |||
1978 | 42 | GenericScopeView { | ||
1979 | 43 | id: scopeView | ||
1980 | 44 | width: parent.width | ||
1981 | 45 | height: parent.height | ||
1982 | 46 | isCurrent: scope != null | ||
1983 | 47 | tabBarHeight: scopeItemPageHeader.implicitHeight | ||
1984 | 48 | pageHeader: scopeItemPageHeader | ||
1985 | 49 | previewListView: previewListView | ||
1986 | 50 | |||
1987 | 51 | Connections { | ||
1988 | 52 | target: scopeView.isCurrent ? scope : null | ||
1989 | 53 | onGotoScope: root.gotoScope(scopeId); | ||
1990 | 54 | onOpenScope: root.openScope(scope); | ||
1991 | 55 | } | ||
1992 | 56 | } | ||
1993 | 57 | |||
1994 | 58 | PageHeader { | ||
1995 | 59 | id: scopeItemPageHeader | ||
1996 | 60 | width: parent.width | ||
1997 | 61 | searchEntryEnabled: true | ||
1998 | 62 | searchHistory: root.searchHistory | ||
1999 | 63 | scope: root.scope | ||
2000 | 64 | height: units.gu(8.5) | ||
2001 | 65 | showBackButton: true | ||
2002 | 66 | onBackClicked: root.back(); | ||
2003 | 67 | |||
2004 | 68 | childItem: Label { | ||
2005 | 69 | id: label | ||
2006 | 70 | anchors { | ||
2007 | 71 | left: parent.left | ||
2008 | 72 | right: parent.right | ||
2009 | 73 | verticalCenter: parent.verticalCenter | ||
2010 | 74 | } | ||
2011 | 75 | text: scope ? scope.name : "" | ||
2012 | 76 | color: "#888888" | ||
2013 | 77 | font.family: "Ubuntu" | ||
2014 | 78 | font.weight: Font.Light | ||
2015 | 79 | fontSize: "x-large" | ||
2016 | 80 | elide: Text.ElideRight | ||
2017 | 81 | } | ||
2018 | 82 | } | ||
2019 | 83 | } | ||
2020 | 84 | |||
2021 | 85 | PreviewListView { | ||
2022 | 86 | id: previewListView | ||
2023 | 87 | visible: x != width | ||
2024 | 88 | pageHeader: scopeItemPageHeader | ||
2025 | 89 | scope: root.scope | ||
2026 | 90 | width: parent.width | ||
2027 | 91 | height: parent.height | ||
2028 | 92 | anchors.left: scopeViewHolder.right | ||
2029 | 93 | } | ||
2030 | 94 | } | ||
2031 | 0 | 95 | ||
2032 | === modified file 'qml/Dash/SearchableResultModel.qml' | |||
2033 | --- qml/Dash/SearchableResultModel.qml 2013-09-30 12:17:20 +0000 | |||
2034 | +++ qml/Dash/SearchableResultModel.qml 2014-03-07 12:41:18 +0000 | |||
2035 | @@ -15,7 +15,7 @@ | |||
2036 | 15 | */ | 15 | */ |
2037 | 16 | 16 | ||
2038 | 17 | import Utils 0.1 | 17 | import Utils 0.1 |
2040 | 18 | import Unity 0.1 | 18 | import Unity 0.2 |
2041 | 19 | 19 | ||
2042 | 20 | SortFilterProxyModel { | 20 | SortFilterProxyModel { |
2043 | 21 | id: root | 21 | id: root |
2044 | 22 | 22 | ||
2045 | === added file 'qml/Dash/graphics/dash_divider_top_darkgrad@27.png' | |||
2046 | 23 | Binary files qml/Dash/graphics/dash_divider_top_darkgrad@27.png 1970-01-01 00:00:00 +0000 and qml/Dash/graphics/dash_divider_top_darkgrad@27.png 2014-03-07 12:41:18 +0000 differ | 23 | Binary files qml/Dash/graphics/dash_divider_top_darkgrad@27.png 1970-01-01 00:00:00 +0000 and qml/Dash/graphics/dash_divider_top_darkgrad@27.png 2014-03-07 12:41:18 +0000 differ |
2047 | === added file 'qml/Dash/graphics/dash_divider_top_lightgrad@27.png' | |||
2048 | 24 | Binary files qml/Dash/graphics/dash_divider_top_lightgrad@27.png 1970-01-01 00:00:00 +0000 and qml/Dash/graphics/dash_divider_top_lightgrad@27.png 2014-03-07 12:41:18 +0000 differ | 24 | Binary files qml/Dash/graphics/dash_divider_top_lightgrad@27.png 1970-01-01 00:00:00 +0000 and qml/Dash/graphics/dash_divider_top_lightgrad@27.png 2014-03-07 12:41:18 +0000 differ |
2049 | === renamed file 'qml/Dash/graphics/header_handlearrow2@20.png' => 'qml/Dash/graphics/header_handlearrow2@27.png' | |||
2050 | 25 | Binary files qml/Dash/graphics/header_handlearrow2@20.png 2013-08-08 14:34:00 +0000 and qml/Dash/graphics/header_handlearrow2@27.png 2014-03-07 12:41:18 +0000 differ | 25 | Binary files qml/Dash/graphics/header_handlearrow2@20.png 2013-08-08 14:34:00 +0000 and qml/Dash/graphics/header_handlearrow2@27.png 2014-03-07 12:41:18 +0000 differ |
2051 | === renamed file 'qml/Dash/graphics/header_handlearrow@20.png' => 'qml/Dash/graphics/header_handlearrow@27.png' | |||
2052 | 26 | Binary files qml/Dash/graphics/header_handlearrow@20.png 2013-08-08 14:34:00 +0000 and qml/Dash/graphics/header_handlearrow@27.png 2014-03-07 12:41:18 +0000 differ | 26 | Binary files qml/Dash/graphics/header_handlearrow@20.png 2013-08-08 14:34:00 +0000 and qml/Dash/graphics/header_handlearrow@27.png 2014-03-07 12:41:18 +0000 differ |
2053 | === added file 'qml/Dash/graphics/paper_landscape@27.png' | |||
2054 | 27 | Binary files qml/Dash/graphics/paper_landscape@27.png 1970-01-01 00:00:00 +0000 and qml/Dash/graphics/paper_landscape@27.png 2014-03-07 12:41:18 +0000 differ | 27 | Binary files qml/Dash/graphics/paper_landscape@27.png 1970-01-01 00:00:00 +0000 and qml/Dash/graphics/paper_landscape@27.png 2014-03-07 12:41:18 +0000 differ |
2055 | === added file 'qml/Dash/graphics/paper_portrait@27.png' | |||
2056 | 28 | Binary files qml/Dash/graphics/paper_portrait@27.png 1970-01-01 00:00:00 +0000 and qml/Dash/graphics/paper_portrait@27.png 2014-03-07 12:41:18 +0000 differ | 28 | Binary files qml/Dash/graphics/paper_portrait@27.png 1970-01-01 00:00:00 +0000 and qml/Dash/graphics/paper_portrait@27.png 2014-03-07 12:41:18 +0000 differ |
2057 | === modified file 'qml/Dash/graphics/tabbarchevron@27.png' | |||
2058 | 29 | Binary files qml/Dash/graphics/tabbarchevron@27.png 2013-12-02 15:58:26 +0000 and qml/Dash/graphics/tabbarchevron@27.png 2014-03-07 12:41:18 +0000 differ | 29 | Binary files qml/Dash/graphics/tabbarchevron@27.png 2013-12-02 15:58:26 +0000 and qml/Dash/graphics/tabbarchevron@27.png 2014-03-07 12:41:18 +0000 differ |
2059 | === modified file 'qml/Launcher/Launcher.qml' | |||
2060 | --- qml/Launcher/Launcher.qml 2013-12-04 13:41:51 +0000 | |||
2061 | +++ qml/Launcher/Launcher.qml 2014-03-07 12:41:18 +0000 | |||
2062 | @@ -18,7 +18,6 @@ | |||
2063 | 18 | import "../Components" | 18 | import "../Components" |
2064 | 19 | import Ubuntu.Components 0.1 | 19 | import Ubuntu.Components 0.1 |
2065 | 20 | import Ubuntu.Gestures 0.1 | 20 | import Ubuntu.Gestures 0.1 |
2066 | 21 | import Unity 0.1 | ||
2067 | 22 | import Unity.Launcher 0.1 | 21 | import Unity.Launcher 0.1 |
2068 | 23 | 22 | ||
2069 | 24 | Item { | 23 | Item { |
2070 | 25 | 24 | ||
2071 | === modified file 'qml/Launcher/LauncherPanel.qml' | |||
2072 | --- qml/Launcher/LauncherPanel.qml 2013-12-04 13:41:51 +0000 | |||
2073 | +++ qml/Launcher/LauncherPanel.qml 2014-03-07 12:41:18 +0000 | |||
2074 | @@ -17,7 +17,6 @@ | |||
2075 | 17 | import QtQuick 2.0 | 17 | import QtQuick 2.0 |
2076 | 18 | import Ubuntu.Components 0.1 | 18 | import Ubuntu.Components 0.1 |
2077 | 19 | import Ubuntu.Components.ListItems 0.1 as ListItems | 19 | import Ubuntu.Components.ListItems 0.1 as ListItems |
2078 | 20 | import Unity 0.1 | ||
2079 | 21 | import Unity.Launcher 0.1 | 20 | import Unity.Launcher 0.1 |
2080 | 22 | import Ubuntu.Components.Popups 0.1 | 21 | import Ubuntu.Components.Popups 0.1 |
2081 | 23 | import "../Components/ListItems" | 22 | import "../Components/ListItems" |
2082 | 24 | 23 | ||
2083 | === modified file 'qml/Panel/MenuContent.qml' | |||
2084 | --- qml/Panel/MenuContent.qml 2014-01-14 16:44:35 +0000 | |||
2085 | +++ qml/Panel/MenuContent.qml 2014-03-07 12:41:18 +0000 | |||
2086 | @@ -26,6 +26,7 @@ | |||
2087 | 26 | MainView { | 26 | MainView { |
2088 | 27 | id: content | 27 | id: content |
2089 | 28 | 28 | ||
2090 | 29 | nativeOrientationAngle: 0 // stop contents being re-rotated when shell in landscape | ||
2091 | 29 | property QtObject indicatorsModel: null | 30 | property QtObject indicatorsModel: null |
2092 | 30 | property bool __contentActive: false | 31 | property bool __contentActive: false |
2093 | 31 | readonly property int currentMenuIndex: tabs.selectedTabIndex | 32 | readonly property int currentMenuIndex: tabs.selectedTabIndex |
2094 | 32 | 33 | ||
2095 | === modified file 'qml/ScopeTool.qml' | |||
2096 | --- qml/ScopeTool.qml 2014-01-10 10:42:44 +0000 | |||
2097 | +++ qml/ScopeTool.qml 2014-03-07 12:41:18 +0000 | |||
2098 | @@ -18,7 +18,7 @@ | |||
2099 | 18 | import Ubuntu.Components 0.1 | 18 | import Ubuntu.Components 0.1 |
2100 | 19 | import Ubuntu.Components.Popups 0.1 | 19 | import Ubuntu.Components.Popups 0.1 |
2101 | 20 | import Utils 0.1 | 20 | import Utils 0.1 |
2103 | 21 | import Unity 0.1 | 21 | import Unity 0.2 |
2104 | 22 | import "Components" | 22 | import "Components" |
2105 | 23 | import "Dash" | 23 | import "Dash" |
2106 | 24 | 24 | ||
2107 | @@ -61,6 +61,14 @@ | |||
2108 | 61 | color: "#FCFCFC" | 61 | color: "#FCFCFC" |
2109 | 62 | } | 62 | } |
2110 | 63 | 63 | ||
2111 | 64 | Image { | ||
2112 | 65 | anchors.fill: dashContent | ||
2113 | 66 | source: root.width > root.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png" | ||
2114 | 67 | fillMode: Image.PreserveAspectCrop | ||
2115 | 68 | horizontalAlignment: Image.AlignRight | ||
2116 | 69 | verticalAlignment: Image.AlignTop | ||
2117 | 70 | } | ||
2118 | 71 | |||
2119 | 64 | DashContent { | 72 | DashContent { |
2120 | 65 | id: dashContent | 73 | id: dashContent |
2121 | 66 | 74 | ||
2122 | 67 | 75 | ||
2123 | === modified file 'qml/Shell.qml' | |||
2124 | --- qml/Shell.qml 2014-03-04 11:42:38 +0000 | |||
2125 | +++ qml/Shell.qml 2014-03-07 12:41:18 +0000 | |||
2126 | @@ -37,6 +37,7 @@ | |||
2127 | 37 | 37 | ||
2128 | 38 | FocusScope { | 38 | FocusScope { |
2129 | 39 | id: shell | 39 | id: shell |
2130 | 40 | objectName: "shell" | ||
2131 | 40 | 41 | ||
2132 | 41 | // this is only here to select the width / height of the window if not running fullscreen | 42 | // this is only here to select the width / height of the window if not running fullscreen |
2133 | 42 | property bool tablet: false | 43 | property bool tablet: false |
2134 | @@ -77,10 +78,11 @@ | |||
2135 | 77 | // FIXME: if application focused before shell starts, shell draws on top of it only. | 78 | // FIXME: if application focused before shell starts, shell draws on top of it only. |
2136 | 78 | // We should detect already running applications on shell start and bring them to the front. | 79 | // We should detect already running applications on shell start and bring them to the front. |
2137 | 79 | applicationManager.unfocusCurrentApplication(); | 80 | applicationManager.unfocusCurrentApplication(); |
2138 | 81 | |||
2139 | 82 | applicationManager.setMainStageAppRect(mainStageAppRect); | ||
2140 | 83 | applicationManager.setSideStageAppRect(sideStageAppRect); | ||
2141 | 80 | } | 84 | } |
2142 | 81 | 85 | ||
2143 | 82 | readonly property bool applicationFocused: !!applicationManager.mainStageFocusedApplication | ||
2144 | 83 | || !!applicationManager.sideStageFocusedApplication | ||
2145 | 84 | // Used for autopilot testing. | 86 | // Used for autopilot testing. |
2146 | 85 | readonly property string currentFocusedAppId: ApplicationManager.focusedApplicationId | 87 | readonly property string currentFocusedAppId: ApplicationManager.focusedApplicationId |
2147 | 86 | 88 | ||
2148 | @@ -116,6 +118,11 @@ | |||
2149 | 116 | } | 118 | } |
2150 | 117 | } | 119 | } |
2151 | 118 | 120 | ||
2152 | 121 | Connections { | ||
2153 | 122 | target: applicationManager | ||
2154 | 123 | onFocusRequested: activateApplication(appId) | ||
2155 | 124 | } | ||
2156 | 125 | |||
2157 | 119 | GSettings { | 126 | GSettings { |
2158 | 120 | id: backgroundSettings | 127 | id: backgroundSettings |
2159 | 121 | schema.id: "org.gnome.desktop.background" | 128 | schema.id: "org.gnome.desktop.background" |
2160 | @@ -125,27 +132,6 @@ | |||
2161 | 125 | shell.background = gSettingsPicture | 132 | shell.background = gSettingsPicture |
2162 | 126 | } | 133 | } |
2163 | 127 | 134 | ||
2164 | 128 | // This is a dummy image that is needed to determine if the picture url | ||
2165 | 129 | // in backgroundSettings points to a valid picture file. | ||
2166 | 130 | // We can't do this with the real background image because setting a | ||
2167 | 131 | // new source in onStatusChanged triggers a binding loop detection | ||
2168 | 132 | // inside Image, which causes it not to render even though a valid source | ||
2169 | 133 | // would be set. We don't mind about this image staying black and just | ||
2170 | 134 | // use it for verification to populate the source for the real | ||
2171 | 135 | // background image. | ||
2172 | 136 | Image { | ||
2173 | 137 | source: shell.background | ||
2174 | 138 | height: 0 | ||
2175 | 139 | width: 0 | ||
2176 | 140 | sourceSize.height: 0 | ||
2177 | 141 | sourceSize.width: 0 | ||
2178 | 142 | onStatusChanged: { | ||
2179 | 143 | if (status == Image.Error && source != shell.defaultBackground) { | ||
2180 | 144 | shell.background = defaultBackground | ||
2181 | 145 | } | ||
2182 | 146 | } | ||
2183 | 147 | } | ||
2184 | 148 | |||
2185 | 149 | VolumeControl { | 135 | VolumeControl { |
2186 | 150 | id: volumeControl | 136 | id: volumeControl |
2187 | 151 | } | 137 | } |
2188 | @@ -161,67 +147,94 @@ | |||
2189 | 161 | // Whether the underlay is fully covered by opaque UI elements. | 147 | // Whether the underlay is fully covered by opaque UI elements. |
2190 | 162 | property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicatorsMenuWidth | 148 | property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicatorsMenuWidth |
2191 | 163 | 149 | ||
2194 | 164 | readonly property bool applicationRunning: ((mainStage.applications && mainStage.applications.count > 0) | 150 | readonly property bool mainStageApplicationRunning: mainStage.applications && mainStage.applications.count > 0 |
2195 | 165 | || (sideStage.applications && sideStage.applications.count > 0)) | 151 | readonly property bool sideStageApplicationRunning: sideStage.applications && sideStage.applications.count > 0 |
2196 | 166 | 152 | ||
2197 | 167 | // Whether the user should see the topmost application surface (if there's one at all). | 153 | // Whether the user should see the topmost application surface (if there's one at all). |
2199 | 168 | readonly property bool applicationSurfaceShouldBeSeen: applicationRunning && !stages.fullyHidden | 154 | readonly property bool mainStageApplicationShown: mainStageApplicationRunning && !stages.fullyHidden |
2200 | 169 | && !mainStage.usingScreenshots // but want sideStage animating over app surface | 155 | && !mainStage.usingScreenshots // but want sideStage animating over app surface |
2201 | 170 | 156 | ||
2202 | 171 | 157 | ||
2203 | 172 | 158 | ||
2204 | 173 | // NB! Application surfaces are stacked behing the shell one. So they can only be seen by the user | 159 | // NB! Application surfaces are stacked behing the shell one. So they can only be seen by the user |
2205 | 174 | // through the translucent parts of the shell surface. | 160 | // through the translucent parts of the shell surface. |
2248 | 175 | visible: !fullyCovered && !applicationSurfaceShouldBeSeen | 161 | visible: !fullyCovered && !mainStageApplicationShown |
2249 | 176 | 162 | ||
2250 | 177 | CrossFadeImage { | 163 | Item { |
2251 | 178 | id: backgroundImage | 164 | id: underlayClipper |
2252 | 179 | objectName: "backgroundImage" | 165 | clip: !parent.mainStageApplicationShown && parent.sideStageApplicationRunning && stagesOuterContainer.showProgress > 0 |
2253 | 180 | 166 | width: { | |
2254 | 181 | anchors.fill: parent | 167 | if (clip) { |
2255 | 182 | source: shell.background | 168 | var w = parent.width - sideStage.width |
2256 | 183 | fillMode: Image.PreserveAspectCrop | 169 | w += stagesOuterContainer.x + stages.x + (sideStage.x - sideStageRevealer.openedValue) |
2257 | 184 | } | 170 | return Math.min(w, parent.width); |
2216 | 185 | |||
2217 | 186 | Rectangle { | ||
2218 | 187 | anchors.fill: parent | ||
2219 | 188 | color: "black" | ||
2220 | 189 | opacity: dash.disappearingAnimationProgress | ||
2221 | 190 | } | ||
2222 | 191 | |||
2223 | 192 | Dash { | ||
2224 | 193 | id: dash | ||
2225 | 194 | objectName: "dash" | ||
2226 | 195 | |||
2227 | 196 | available: !greeter.shown && !lockscreen.shown | ||
2228 | 197 | hides: [stages, launcher, panel.indicators] | ||
2229 | 198 | shown: disappearingAnimationProgress !== 1.0 | ||
2230 | 199 | enabled: disappearingAnimationProgress === 0.0 && edgeDemo.dashEnabled | ||
2231 | 200 | // FIXME: unfocus all applications when going back to the dash | ||
2232 | 201 | onEnabledChanged: { | ||
2233 | 202 | if (enabled) { | ||
2234 | 203 | shell.applicationManager.unfocusCurrentApplication() | ||
2235 | 204 | } | ||
2236 | 205 | } | ||
2237 | 206 | |||
2238 | 207 | anchors { | ||
2239 | 208 | fill: parent | ||
2240 | 209 | topMargin: panel.panelHeight | ||
2241 | 210 | } | ||
2242 | 211 | |||
2243 | 212 | contentScale: 1.0 - 0.2 * disappearingAnimationProgress | ||
2244 | 213 | opacity: 1.0 - disappearingAnimationProgress | ||
2245 | 214 | property real disappearingAnimationProgress: { | ||
2246 | 215 | if (greeter.shown) { | ||
2247 | 216 | return greeter.showProgress; | ||
2258 | 217 | } else { | 171 | } else { |
2266 | 218 | return stagesOuterContainer.showProgress; | 172 | return parent.width; |
2267 | 219 | } | 173 | } |
2268 | 220 | } | 174 | } |
2269 | 221 | 175 | height: parent.height | |
2270 | 222 | // FIXME: only necessary because stagesOuterContainer.showProgress and | 176 | |
2271 | 223 | // greeterRevealer.animatedProgress are not animated | 177 | Image { |
2272 | 224 | Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }} | 178 | anchors.fill: dash |
2273 | 179 | source: shell.width > shell.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png" | ||
2274 | 180 | fillMode: Image.PreserveAspectCrop | ||
2275 | 181 | horizontalAlignment: Image.AlignRight | ||
2276 | 182 | verticalAlignment: Image.AlignTop | ||
2277 | 183 | } | ||
2278 | 184 | |||
2279 | 185 | Dash { | ||
2280 | 186 | id: dash | ||
2281 | 187 | objectName: "dash" | ||
2282 | 188 | |||
2283 | 189 | available: !greeter.shown && !lockscreen.shown | ||
2284 | 190 | hides: [stages, launcher, panel.indicators] | ||
2285 | 191 | shown: disappearingAnimationProgress !== 1.0 | ||
2286 | 192 | enabled: disappearingAnimationProgress === 0.0 && edgeDemo.dashEnabled | ||
2287 | 193 | // FIXME: unfocus all applications when going back to the dash | ||
2288 | 194 | onEnabledChanged: { | ||
2289 | 195 | if (enabled) { | ||
2290 | 196 | shell.applicationManager.unfocusCurrentApplication() | ||
2291 | 197 | } | ||
2292 | 198 | } | ||
2293 | 199 | |||
2294 | 200 | width: underlay.width | ||
2295 | 201 | height: underlay.height - y | ||
2296 | 202 | y: panel.panelHeight | ||
2297 | 203 | |||
2298 | 204 | contentScale: 1.0 - 0.2 * disappearingAnimationProgress | ||
2299 | 205 | opacity: 1.0 - disappearingAnimationProgress | ||
2300 | 206 | property real disappearingAnimationProgress: { | ||
2301 | 207 | if (greeter.shown) { | ||
2302 | 208 | return greeter.showProgress; | ||
2303 | 209 | } else { | ||
2304 | 210 | if (underlayClipper.clip) | ||
2305 | 211 | return 0; | ||
2306 | 212 | else | ||
2307 | 213 | return stagesOuterContainer.showProgress; | ||
2308 | 214 | } | ||
2309 | 215 | } | ||
2310 | 216 | |||
2311 | 217 | // FIXME: only necessary because stagesOuterContainer.showProgress and | ||
2312 | 218 | // greeterRevealer.animatedProgress are not animated | ||
2313 | 219 | Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }} | ||
2314 | 220 | } | ||
2315 | 221 | |||
2316 | 222 | Rectangle { | ||
2317 | 223 | width: underlay.width | ||
2318 | 224 | height: underlay.height | ||
2319 | 225 | color: "black" | ||
2320 | 226 | opacity: 0.5 * ((sideStage.x - sideStageRevealer.closedValue) / (sideStageRevealer.openedValue - sideStageRevealer.closedValue)) | ||
2321 | 227 | visible: sideStageHideButton.enabled | ||
2322 | 228 | } | ||
2323 | 229 | |||
2324 | 230 | AbstractButton { | ||
2325 | 231 | id: sideStageHideButton | ||
2326 | 232 | enabled: mainStage.applications.count == 0 && sideStage.shown | ||
2327 | 233 | anchors.fill: parent | ||
2328 | 234 | onClicked: { | ||
2329 | 235 | sideStage.hide(); | ||
2330 | 236 | } | ||
2331 | 237 | } | ||
2332 | 225 | } | 238 | } |
2333 | 226 | } | 239 | } |
2334 | 227 | 240 | ||
2335 | @@ -230,7 +243,7 @@ | |||
2336 | 230 | 243 | ||
2337 | 231 | width: parent.width | 244 | width: parent.width |
2338 | 232 | height: parent.height | 245 | height: parent.height |
2340 | 233 | x: launcher.progress | 246 | x: mainStage.applications.count > 0 ? launcher.progress : 0 |
2341 | 234 | Behavior on x {SmoothedAnimation{velocity: 600}} | 247 | Behavior on x {SmoothedAnimation{velocity: 600}} |
2342 | 235 | 248 | ||
2343 | 236 | property real showProgress: | 249 | property real showProgress: |
2344 | @@ -242,6 +255,16 @@ | |||
2345 | 242 | 255 | ||
2346 | 243 | x: width | 256 | x: width |
2347 | 244 | 257 | ||
2348 | 258 | function doLauncherHide() { | ||
2349 | 259 | if (mainStage.applications.count > 0) { | ||
2350 | 260 | hide(); | ||
2351 | 261 | } else { | ||
2352 | 262 | if (sideStage.shown) { | ||
2353 | 263 | sideStage.hide(); | ||
2354 | 264 | } | ||
2355 | 265 | } | ||
2356 | 266 | } | ||
2357 | 267 | |||
2358 | 245 | property bool fullyShown: shown && x == 0 && parent.x == 0 | 268 | property bool fullyShown: shown && x == 0 && parent.x == 0 |
2359 | 246 | property bool fullyHidden: !shown && x == width | 269 | property bool fullyHidden: !shown && x == width |
2360 | 247 | available: !greeter.shown | 270 | available: !greeter.shown |
2361 | @@ -326,11 +349,6 @@ | |||
2362 | 326 | rightEdgeDraggingAreaWidth: shell.edgeSize | 349 | rightEdgeDraggingAreaWidth: shell.edgeSize |
2363 | 327 | normalApplicationY: shell.panelHeight | 350 | normalApplicationY: shell.panelHeight |
2364 | 328 | 351 | ||
2365 | 329 | onShownChanged: { | ||
2366 | 330 | if (!shown && mainStage.applications.count == 0) { | ||
2367 | 331 | stages.hide(); | ||
2368 | 332 | } | ||
2369 | 333 | } | ||
2370 | 334 | // FIXME: when hiding the side stage, refocus the main stage | 352 | // FIXME: when hiding the side stage, refocus the main stage |
2371 | 335 | // application so that it goes in front of the side stage | 353 | // application so that it goes in front of the side stage |
2372 | 336 | // application and hides it | 354 | // application and hides it |
2373 | @@ -355,12 +373,29 @@ | |||
2374 | 355 | width: units.gu(40) | 373 | width: units.gu(40) |
2375 | 356 | height: stages.height | 374 | height: stages.height |
2376 | 357 | handleExpanded: sideStageRevealer.pressed | 375 | handleExpanded: sideStageRevealer.pressed |
2377 | 376 | |||
2378 | 377 | Connections { | ||
2379 | 378 | target: sideStage.applications | ||
2380 | 379 | onCountChanged: { | ||
2381 | 380 | if (sideStage.applications.count == 0) { | ||
2382 | 381 | if (sideStage.shown) { // if all SS app closed, hide side stage | ||
2383 | 382 | sideStage.hide(); | ||
2384 | 383 | } else { | ||
2385 | 384 | // Sidestage is hidden and there is no main app, make sure the | ||
2386 | 385 | // stages is totally hidden too | ||
2387 | 386 | if (mainStage.applications.count == 0) { | ||
2388 | 387 | stages.hideNow(); | ||
2389 | 388 | } | ||
2390 | 389 | } | ||
2391 | 390 | } | ||
2392 | 391 | } | ||
2393 | 392 | } | ||
2394 | 358 | } | 393 | } |
2395 | 359 | 394 | ||
2396 | 360 | Revealer { | 395 | Revealer { |
2397 | 361 | id: sideStageRevealer | 396 | id: sideStageRevealer |
2398 | 362 | 397 | ||
2400 | 363 | enabled: mainStage.applications.count > 0 && sideStage.applications.count > 0 | 398 | enabled: sideStage.applications.count > 0 |
2401 | 364 | && sideStage.available | 399 | && sideStage.available |
2402 | 365 | direction: Qt.RightToLeft | 400 | direction: Qt.RightToLeft |
2403 | 366 | openedValue: parent.width - sideStage.width | 401 | openedValue: parent.width - sideStage.width |
2404 | @@ -378,6 +413,26 @@ | |||
2405 | 378 | orientation: Qt.Horizontal | 413 | orientation: Qt.Horizontal |
2406 | 379 | } | 414 | } |
2407 | 380 | 415 | ||
2408 | 416 | // Defines the rectangle occupied by an application on the main or side stage. | ||
2409 | 417 | // Used only to inform the ApplicationManager. Can be removed when the proper | ||
2410 | 418 | // architecture is in place (unity8 as mir compositor). | ||
2411 | 419 | Item { | ||
2412 | 420 | id: mainStageAppRect | ||
2413 | 421 | x: mainStage.x | ||
2414 | 422 | y: mainStage.y + mainStage.normalApplicationY | ||
2415 | 423 | width: mainStage.width | ||
2416 | 424 | height: mainStage.height | ||
2417 | 425 | visible: false; enabled: false | ||
2418 | 426 | } | ||
2419 | 427 | Item { | ||
2420 | 428 | id: sideStageAppRect | ||
2421 | 429 | x: sideStageRevealer.openedValue | ||
2422 | 430 | y: sideStage.y + sideStage.normalApplicationY | ||
2423 | 431 | width: sideStage.width | ||
2424 | 432 | height: sideStage.height | ||
2425 | 433 | visible: false; enabled: false | ||
2426 | 434 | } | ||
2427 | 435 | |||
2428 | 381 | DragHandle { | 436 | DragHandle { |
2429 | 382 | id: stagesDragHandle | 437 | id: stagesDragHandle |
2430 | 383 | 438 | ||
2431 | @@ -461,7 +516,7 @@ | |||
2432 | 461 | hides: [launcher, panel.indicators, hud] | 516 | hides: [launcher, panel.indicators, hud] |
2433 | 462 | shown: true | 517 | shown: true |
2434 | 463 | 518 | ||
2436 | 464 | defaultBackground: shell.background | 519 | defaultBackground: shell.defaultBackground |
2437 | 465 | 520 | ||
2438 | 466 | y: panel.panelHeight | 521 | y: panel.panelHeight |
2439 | 467 | width: parent.width | 522 | width: parent.width |
2440 | @@ -474,7 +529,9 @@ | |||
2441 | 474 | 529 | ||
2442 | 475 | function removeApplicationFocus() { | 530 | function removeApplicationFocus() { |
2443 | 476 | greeter.previousMainApp = applicationManager.mainStageFocusedApplication; | 531 | greeter.previousMainApp = applicationManager.mainStageFocusedApplication; |
2445 | 477 | greeter.previousSideApp = applicationManager.sideStageFocusedApplication; | 532 | if (sideStage.fullyShown) { // if side stage hidden, don't focus it on restore |
2446 | 533 | greeter.previousSideApp = applicationManager.sideStageFocusedApplication; | ||
2447 | 534 | } | ||
2448 | 478 | applicationManager.unfocusCurrentApplication(); | 535 | applicationManager.unfocusCurrentApplication(); |
2449 | 479 | } | 536 | } |
2450 | 480 | 537 | ||
2451 | @@ -543,8 +600,14 @@ | |||
2452 | 543 | } | 600 | } |
2453 | 544 | 601 | ||
2454 | 545 | InputFilterArea { | 602 | InputFilterArea { |
2457 | 546 | anchors.fill: parent | 603 | width: { |
2458 | 547 | blockInput: !applicationFocused || greeter.shown || lockscreen.shown || launcher.shown | 604 | if (applicationManager.sideStageFocusedApplication && sideStage.shown) |
2459 | 605 | return parent.width - sideStage.width; | ||
2460 | 606 | else | ||
2461 | 607 | return parent.width; | ||
2462 | 608 | } | ||
2463 | 609 | height: parent.height | ||
2464 | 610 | blockInput: !applicationManager.mainStageFocusedApplication || greeter.shown || lockscreen.shown || launcher.shown | ||
2465 | 548 | || panel.indicators.shown || hud.shown | 611 | || panel.indicators.shown || hud.shown |
2466 | 549 | } | 612 | } |
2467 | 550 | 613 | ||
2468 | @@ -571,7 +634,7 @@ | |||
2469 | 571 | function showHome() { | 634 | function showHome() { |
2470 | 572 | var animate = !greeter.shown && !stages.shown | 635 | var animate = !greeter.shown && !stages.shown |
2471 | 573 | greeter.hide() | 636 | greeter.hide() |
2473 | 574 | dash.setCurrentScope("home.scope", animate, false) | 637 | dash.setCurrentScope("clickscope", animate, false) |
2474 | 575 | stages.hide() | 638 | stages.hide() |
2475 | 576 | } | 639 | } |
2476 | 577 | 640 | ||
2477 | @@ -594,7 +657,7 @@ | |||
2478 | 594 | contentEnabled: edgeDemo.panelContentEnabled | 657 | contentEnabled: edgeDemo.panelContentEnabled |
2479 | 595 | } | 658 | } |
2480 | 596 | fullscreenMode: shell.fullscreenMode | 659 | fullscreenMode: shell.fullscreenMode |
2482 | 597 | searchVisible: !greeter.shown && !lockscreen.shown && dash.shown | 660 | searchVisible: !greeter.shown && !lockscreen.shown && dash.shown && dash.searchable |
2483 | 598 | 661 | ||
2484 | 599 | InputFilterArea { | 662 | InputFilterArea { |
2485 | 600 | anchors { | 663 | anchors { |
2486 | @@ -646,7 +709,7 @@ | |||
2487 | 646 | theHud: hud | 709 | theHud: hud |
2488 | 647 | anchors.fill: parent | 710 | anchors.fill: parent |
2489 | 648 | enabled: hud.available | 711 | enabled: hud.available |
2491 | 649 | applicationIsOnForeground: applicationFocused | 712 | applicationIsOnForeground: (stages.shown && mainStage.applications.count > 0) || (stages.shown && sideStage.shown) |
2492 | 650 | } | 713 | } |
2493 | 651 | 714 | ||
2494 | 652 | InputFilterArea { | 715 | InputFilterArea { |
2495 | @@ -668,7 +731,7 @@ | |||
2496 | 668 | anchors.bottom: parent.bottom | 731 | anchors.bottom: parent.bottom |
2497 | 669 | width: parent.width | 732 | width: parent.width |
2498 | 670 | dragAreaWidth: shell.edgeSize | 733 | dragAreaWidth: shell.edgeSize |
2500 | 671 | available: (!greeter.shown || greeter.narrowMode) && edgeDemo.launcherEnabled | 734 | available: !greeter.locked && edgeDemo.launcherEnabled |
2501 | 672 | 735 | ||
2502 | 673 | onShowDashHome: { | 736 | onShowDashHome: { |
2503 | 674 | if (edgeDemo.running) | 737 | if (edgeDemo.running) |
2504 | @@ -678,11 +741,11 @@ | |||
2505 | 678 | } | 741 | } |
2506 | 679 | onDash: { | 742 | onDash: { |
2507 | 680 | if (stages.shown) { | 743 | if (stages.shown) { |
2509 | 681 | stages.hide(); | 744 | stages.doLauncherHide(); |
2510 | 682 | launcher.hide(); | 745 | launcher.hide(); |
2511 | 683 | } | 746 | } |
2512 | 684 | } | 747 | } |
2514 | 685 | onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("applications.scope", false, true) | 748 | onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("clickscope", false, true) |
2515 | 686 | onLauncherApplicationSelected:{ | 749 | onLauncherApplicationSelected:{ |
2516 | 687 | if (edgeDemo.running) | 750 | if (edgeDemo.running) |
2517 | 688 | return; | 751 | return; |
2518 | @@ -762,21 +825,6 @@ | |||
2519 | 762 | value: "unity8" | 825 | value: "unity8" |
2520 | 763 | } | 826 | } |
2521 | 764 | 827 | ||
2522 | 765 | OSKController { | ||
2523 | 766 | anchors.topMargin: panel.panelHeight | ||
2524 | 767 | anchors.fill: parent // as needs to know the geometry of the shell | ||
2525 | 768 | } | ||
2526 | 769 | |||
2527 | 770 | //FIXME: This should be handled in the input stack, keyboard shouldnt propagate | ||
2528 | 771 | MouseArea { | ||
2529 | 772 | anchors.bottom: parent.bottom | ||
2530 | 773 | anchors.left: parent.left | ||
2531 | 774 | anchors.right: parent.right | ||
2532 | 775 | height: shell.applicationManager ? shell.applicationManager.keyboardHeight : 0 | ||
2533 | 776 | |||
2534 | 777 | enabled: shell.applicationManager && shell.applicationManager.keyboardVisible | ||
2535 | 778 | } | ||
2536 | 779 | |||
2537 | 780 | Label { | 828 | Label { |
2538 | 781 | anchors.centerIn: parent | 829 | anchors.centerIn: parent |
2539 | 782 | visible: applicationManager.fake | 830 | visible: applicationManager.fake |
2540 | @@ -797,7 +845,7 @@ | |||
2541 | 797 | launcher: launcher | 845 | launcher: launcher |
2542 | 798 | dash: dash | 846 | dash: dash |
2543 | 799 | indicators: panel.indicators | 847 | indicators: panel.indicators |
2545 | 800 | underlay: underlay | 848 | underlay: underlayClipper |
2546 | 801 | } | 849 | } |
2547 | 802 | 850 | ||
2548 | 803 | Connections { | 851 | Connections { |
2549 | 804 | 852 | ||
2550 | === added file 'qml/ShellOrientator.qml' | |||
2551 | --- qml/ShellOrientator.qml 1970-01-01 00:00:00 +0000 | |||
2552 | +++ qml/ShellOrientator.qml 2014-03-07 12:41:18 +0000 | |||
2553 | @@ -0,0 +1,43 @@ | |||
2554 | 1 | /* | ||
2555 | 2 | * Copyright (C) 2014 Canonical, Ltd. | ||
2556 | 3 | * | ||
2557 | 4 | * This program is free software; you can redistribute it and/or modify | ||
2558 | 5 | * it under the terms of the GNU General Public License as published by | ||
2559 | 6 | * the Free Software Foundation; version 3. | ||
2560 | 7 | * | ||
2561 | 8 | * This program is distributed in the hope that it will be useful, | ||
2562 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2563 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2564 | 11 | * GNU General Public License for more details. | ||
2565 | 12 | * | ||
2566 | 13 | * You should have received a copy of the GNU General Public License | ||
2567 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
2568 | 15 | */ | ||
2569 | 16 | |||
2570 | 17 | import QtQuick 2.0 | ||
2571 | 18 | import QtQuick.Window 2.0 | ||
2572 | 19 | import Unity.Application 0.1 | ||
2573 | 20 | |||
2574 | 21 | Item { | ||
2575 | 22 | id: orientator | ||
2576 | 23 | |||
2577 | 24 | // this is only here to select the width / height of the window if not running fullscreen | ||
2578 | 25 | property bool tablet: false | ||
2579 | 26 | width: tablet ? units.gu(160) : applicationArguments.hasGeometry() ? applicationArguments.width() : units.gu(40) | ||
2580 | 27 | height: tablet ? units.gu(100) : applicationArguments.hasGeometry() ? applicationArguments.height() : units.gu(71) | ||
2581 | 28 | |||
2582 | 29 | Item { | ||
2583 | 30 | anchors.fill: parent | ||
2584 | 31 | rotation: Screen.angleBetween(nativeOrientation, Screen.primaryOrientation) | ||
2585 | 32 | Shell { | ||
2586 | 33 | x: (parent.rotation == 0) ? 0 : (parent.width - parent.height) / 2 | ||
2587 | 34 | y: (parent.rotation == 0) ? 0 : -(parent.width - parent.height) / 2 | ||
2588 | 35 | width: (parent.rotation == 0) ? parent.width : parent.height | ||
2589 | 36 | height: (parent.rotation == 0) ? parent.height : parent.width | ||
2590 | 37 | } | ||
2591 | 38 | } | ||
2592 | 39 | |||
2593 | 40 | OSKController { | ||
2594 | 41 | anchors.fill: parent // as needs to know the geometry of the shell | ||
2595 | 42 | } | ||
2596 | 43 | } | ||
2597 | 0 | 44 | ||
2598 | === modified file 'src/main.cpp' | |||
2599 | --- src/main.cpp 2014-02-27 11:54:16 +0000 | |||
2600 | +++ src/main.cpp 2014-03-07 12:41:18 +0000 | |||
2601 | @@ -98,6 +98,16 @@ | |||
2602 | 98 | view->setFlags(Qt::FramelessWindowHint); | 98 | view->setFlags(Qt::FramelessWindowHint); |
2603 | 99 | } | 99 | } |
2604 | 100 | 100 | ||
2605 | 101 | const QByteArray orientation = qgetenv("NATIVE_ORIENTATION"); | ||
2606 | 102 | Qt::ScreenOrientation orientationAngle = Qt::PrimaryOrientation; | ||
2607 | 103 | if (orientation == "landscape") { | ||
2608 | 104 | orientationAngle = Qt::LandscapeOrientation; | ||
2609 | 105 | } else if (!orientation.isEmpty() && orientation != "portrait") { | ||
2610 | 106 | qDebug() << "Unknown NATIVE_ORIENTATION setting, ignoring"; | ||
2611 | 107 | } | ||
2612 | 108 | |||
2613 | 109 | view->rootContext()->setContextProperty("nativeOrientation", orientationAngle); | ||
2614 | 110 | |||
2615 | 101 | // You will need this if you want to interact with touch-only components using a mouse | 111 | // You will need this if you want to interact with touch-only components using a mouse |
2616 | 102 | // Needed only when manually testing on a desktop. | 112 | // Needed only when manually testing on a desktop. |
2617 | 103 | MouseTouchAdaptor *mouseTouchAdaptor = 0; | 113 | MouseTouchAdaptor *mouseTouchAdaptor = 0; |
2618 | @@ -115,7 +125,7 @@ | |||
2619 | 115 | nativeInterface->setProperty("ubuntuSessionType", 1); | 125 | nativeInterface->setProperty("ubuntuSessionType", 1); |
2620 | 116 | view->setProperty("role", 2); // INDICATOR_ACTOR_ROLE | 126 | view->setProperty("role", 2); // INDICATOR_ACTOR_ROLE |
2621 | 117 | 127 | ||
2623 | 118 | QUrl source(::qmlDirectory()+"Shell.qml"); | 128 | QUrl source(::qmlDirectory()+"ShellOrientator.qml"); |
2624 | 119 | prependImportPaths(view->engine(), ::overrideImportPaths()); | 129 | prependImportPaths(view->engine(), ::overrideImportPaths()); |
2625 | 120 | appendImportPaths(view->engine(), ::fallbackImportPaths()); | 130 | appendImportPaths(view->engine(), ::fallbackImportPaths()); |
2626 | 121 | 131 | ||
2627 | 122 | 132 | ||
2628 | === modified file 'tests/mocks/Unity/fake_unity_plugin.cpp' | |||
2629 | --- tests/mocks/Unity/fake_unity_plugin.cpp 2014-02-07 09:55:56 +0000 | |||
2630 | +++ tests/mocks/Unity/fake_unity_plugin.cpp 2014-03-07 12:41:18 +0000 | |||
2631 | @@ -48,5 +48,12 @@ | |||
2632 | 48 | qmlRegisterUncreatableType<CategoryResults>(uri, 0, 1, "CategoryResults", "Can't create"); | 48 | qmlRegisterUncreatableType<CategoryResults>(uri, 0, 1, "CategoryResults", "Can't create"); |
2633 | 49 | qmlRegisterType<DeeListModel>(uri, 0, 1, "DeeListModel"); | 49 | qmlRegisterType<DeeListModel>(uri, 0, 1, "DeeListModel"); |
2634 | 50 | 50 | ||
2636 | 51 | qmlRegisterType<scopes_ng::PreviewModel>(uri, 0, 1, "FakePreviewModel"); | 51 | // same for version 0.2 |
2637 | 52 | qmlRegisterUncreatableType<Preview>(uri, 0, 2, "Preview", "Can't create Preview object in QML."); | ||
2638 | 53 | qmlRegisterType<Scopes>(uri, 0, 2, "Scopes"); | ||
2639 | 54 | qmlRegisterType<Scope>(uri, 0, 2, "Scope"); | ||
2640 | 55 | qmlRegisterType<Categories>(uri, 0, 2, "Categories"); | ||
2641 | 56 | qmlRegisterUncreatableType<CategoryResults>(uri, 0, 2, "CategoryResults", "Can't create"); | ||
2642 | 57 | qmlRegisterType<DeeListModel>(uri, 0, 2, "DeeListModel"); | ||
2643 | 58 | qmlRegisterType<scopes_ng::PreviewModel>(uri, 0, 2, "FakePreviewModel"); | ||
2644 | 52 | } | 59 | } |
2645 | 53 | 60 | ||
2646 | === modified file 'tests/plugins/DashViews/organicgridtest.cpp' | |||
2647 | --- tests/plugins/DashViews/organicgridtest.cpp 2014-01-14 12:25:52 +0000 | |||
2648 | +++ tests/plugins/DashViews/organicgridtest.cpp 2014-03-07 12:41:18 +0000 | |||
2649 | @@ -134,11 +134,12 @@ | |||
2650 | 134 | view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/organicgridtest.qml")); | 134 | view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/organicgridtest.qml")); |
2651 | 135 | 135 | ||
2652 | 136 | view->show(); | 136 | view->show(); |
2653 | 137 | QTest::qWaitForWindowExposed(view); | ||
2654 | 137 | view->resize(470, 400); | 138 | view->resize(470, 400); |
2655 | 138 | QTest::qWaitForWindowExposed(view); | ||
2656 | 139 | 139 | ||
2657 | 140 | grid = dynamic_cast<OrganicGrid*>(view->rootObject()->findChild<QObject*>("grid")); | 140 | grid = dynamic_cast<OrganicGrid*>(view->rootObject()->findChild<QObject*>("grid")); |
2658 | 141 | grid->setModel(model); | 141 | grid->setModel(model); |
2659 | 142 | QTRY_COMPARE(grid->width(), 470.); | ||
2660 | 142 | 143 | ||
2661 | 143 | checkInitialPositions(); | 144 | checkInitialPositions(); |
2662 | 144 | } | 145 | } |
2663 | 145 | 146 | ||
2664 | === modified file 'tests/plugins/DashViews/verticaljournaltest.cpp' | |||
2665 | --- tests/plugins/DashViews/verticaljournaltest.cpp 2014-01-17 10:08:23 +0000 | |||
2666 | +++ tests/plugins/DashViews/verticaljournaltest.cpp 2014-03-07 12:41:18 +0000 | |||
2667 | @@ -135,11 +135,12 @@ | |||
2668 | 135 | view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/verticaljournaltest.qml")); | 135 | view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/verticaljournaltest.qml")); |
2669 | 136 | 136 | ||
2670 | 137 | view->show(); | 137 | view->show(); |
2671 | 138 | view->resize(470, 400); | ||
2672 | 139 | QTest::qWaitForWindowExposed(view); | 138 | QTest::qWaitForWindowExposed(view); |
2673 | 139 | view->resize(470, 400); | ||
2674 | 140 | 140 | ||
2675 | 141 | vj = dynamic_cast<VerticalJournal*>(view->rootObject()->findChild<QObject*>("vj")); | 141 | vj = dynamic_cast<VerticalJournal*>(view->rootObject()->findChild<QObject*>("vj")); |
2676 | 142 | vj->setModel(model); | 142 | vj->setModel(model); |
2677 | 143 | QTRY_COMPARE(vj->width(), 470.); | ||
2678 | 143 | 144 | ||
2679 | 144 | checkInitialPositions(); | 145 | checkInitialPositions(); |
2680 | 145 | } | 146 | } |
2681 | 146 | 147 | ||
2682 | === modified file 'tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp' | |||
2683 | --- tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp 2014-02-24 16:05:07 +0000 | |||
2684 | +++ tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp 2014-03-07 12:41:18 +0000 | |||
2685 | @@ -103,6 +103,14 @@ | |||
2686 | 103 | { | 103 | { |
2687 | 104 | GestureTest::init(); | 104 | GestureTest::init(); |
2688 | 105 | 105 | ||
2689 | 106 | // We shouldn't need the three lines below, but a compiz/unity7 | ||
2690 | 107 | // regression means we don't pass the test without them because | ||
2691 | 108 | // the window doesn't have the proper size. Can be removed in the | ||
2692 | 109 | // future if the regression is fixed and tests pass again | ||
2693 | 110 | m_view->resize(m_view->rootObject()->width(), m_view->rootObject()->height()); | ||
2694 | 111 | QTRY_COMPARE(m_view->width(), (int)m_view->rootObject()->width()); | ||
2695 | 112 | QTRY_COMPARE(m_view->height(), (int)m_view->rootObject()->height()); | ||
2696 | 113 | |||
2697 | 106 | fakeTimeSource.reset(new FakeTimeSource); | 114 | fakeTimeSource.reset(new FakeTimeSource); |
2698 | 107 | fakeTimer = new FakeTimer(fakeTimeSource); | 115 | fakeTimer = new FakeTimer(fakeTimeSource); |
2699 | 108 | } | 116 | } |
2700 | 109 | 117 | ||
2701 | === modified file 'tests/qmltests/Dash/Previews/tst_Preview.qml' | |||
2702 | --- tests/qmltests/Dash/Previews/tst_Preview.qml 2014-02-12 08:22:16 +0000 | |||
2703 | +++ tests/qmltests/Dash/Previews/tst_Preview.qml 2014-03-07 12:41:18 +0000 | |||
2704 | @@ -18,7 +18,7 @@ | |||
2705 | 18 | import QtTest 1.0 | 18 | import QtTest 1.0 |
2706 | 19 | import "../../../../qml/Dash/Previews" | 19 | import "../../../../qml/Dash/Previews" |
2707 | 20 | import Unity.Test 0.1 as UT | 20 | import Unity.Test 0.1 as UT |
2709 | 21 | import Unity 0.1 as Unity | 21 | import Unity 0.2 as Unity |
2710 | 22 | 22 | ||
2711 | 23 | Rectangle { | 23 | Rectangle { |
2712 | 24 | id: root | 24 | id: root |
2713 | 25 | 25 | ||
2714 | === modified file 'tests/qmltests/Dash/tst_GenericScopeView.qml' | |||
2715 | --- tests/qmltests/Dash/tst_GenericScopeView.qml 2014-02-05 08:20:25 +0000 | |||
2716 | +++ tests/qmltests/Dash/tst_GenericScopeView.qml 2014-03-07 12:41:18 +0000 | |||
2717 | @@ -301,18 +301,18 @@ | |||
2718 | 301 | } | 301 | } |
2719 | 302 | 302 | ||
2720 | 303 | function test_getRendererCarouselGridFallback() { | 303 | function test_getRendererCarouselGridFallback() { |
2724 | 304 | var rendererId = "carousel" | 304 | var template = new Object() |
2725 | 305 | var contentType = "" | 305 | template["category-layout"] = "carousel" |
2723 | 306 | var rendererHint = "" | ||
2726 | 307 | var results = new Object() | 306 | var results = new Object() |
2735 | 308 | 307 | var renderer | |
2736 | 309 | results.count = 7 | 308 | |
2737 | 310 | var renderer = genericScopeView.getRenderer(rendererId, contentType, rendererHint, results) | 309 | results.count = 5 |
2738 | 311 | compare(renderer, "Generic/GenericCarousel.qml") | 310 | renderer = genericScopeView.getRenderer(template, results) |
2739 | 312 | 311 | compare(renderer, "CardCarousel.qml") | |
2740 | 313 | results.count = 6 | 312 | |
2741 | 314 | renderer = genericScopeView.getRenderer(rendererId, contentType, rendererHint, results) | 313 | results.count = 4 |
2742 | 315 | compare(renderer, "Generic/GenericFilterGrid.qml") | 314 | renderer = genericScopeView.getRenderer(template, results) |
2743 | 315 | compare(renderer, "CardFilterGrid.qml") | ||
2744 | 316 | } | 316 | } |
2745 | 317 | 317 | ||
2746 | 318 | function test_showPreviewCarousel() { | 318 | function test_showPreviewCarousel() { |
2747 | 319 | 319 | ||
2748 | === modified file 'tools/registry-tracker.cpp' | |||
2749 | --- tools/registry-tracker.cpp 2013-12-20 15:27:59 +0000 | |||
2750 | +++ tools/registry-tracker.cpp 2014-03-07 12:41:18 +0000 | |||
2751 | @@ -112,5 +112,6 @@ | |||
2752 | 112 | QStringList arguments; | 112 | QStringList arguments; |
2753 | 113 | arguments << m_runtime_config.fileName(); | 113 | arguments << m_runtime_config.fileName(); |
2754 | 114 | 114 | ||
2755 | 115 | m_registry.setProcessChannelMode(QProcess::ForwardedChannels); | ||
2756 | 115 | m_registry.start(registryBin, arguments); | 116 | m_registry.start(registryBin, arguments); |
2757 | 116 | } | 117 | } |
FAILED: Continuous integration, rev:589 /code.launchpad .net/~unity- team/unity8/ new-scopes/ +merge/ 198359/ +edit-commit- message
No commit message was specified in the merge proposal. Click on the following link and set the commit message (if you want a jenkins rebuild you need to trigger it yourself):
https:/
http:// jenkins. qa.ubuntu. com/job/ unity8- ci/2228/ jenkins. qa.ubuntu. com/job/ generic- mediumtests- trusty/ 2889 jenkins. qa.ubuntu. com/job/ generic- mediumtests- trusty- touch/2633/ console jenkins. qa.ubuntu. com/job/ unity-phablet- qmluitests- trusty/ 1099 jenkins. qa.ubuntu. com/job/ unity8- trusty- amd64-ci/ 750 jenkins. qa.ubuntu. com/job/ unity8- trusty- armhf-ci/ 752 jenkins. qa.ubuntu. com/job/ unity8- trusty- armhf-ci/ 752/artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ unity8- trusty- i386-ci/ 750 jenkins. qa.ubuntu. com/job/ autopilot- testrunner- otto-trusty/ 2535 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- trusty- amd64/2891 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- trusty- amd64/2891/ artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- trusty- armhf/2634 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- trusty- armhf/2634/ artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ generic- mediumtests- runner- mako/5059/ console s-jenkins. ubuntu- ci:8080/ job/touch- flash-device/ 3615
Executed test runs:
UNSTABLE: http://
FAILURE: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
FAILURE: http://
SUCCESS: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/unity8- ci/2228/ rebuild
http://