diff options
| -rw-r--r-- | manual-tests/Launcher.txt | 23 | ||||
| -rw-r--r-- | plugins/unityshell/src/AbstractLauncherIcon.h | 6 | ||||
| -rw-r--r-- | plugins/unityshell/src/BamfLauncherIcon.cpp | 56 | ||||
| -rw-r--r-- | plugins/unityshell/src/BamfLauncherIcon.h | 7 | ||||
| -rw-r--r-- | plugins/unityshell/src/DndData.h | 8 | ||||
| -rw-r--r-- | plugins/unityshell/src/Launcher.cpp | 5 | ||||
| -rw-r--r-- | plugins/unityshell/src/LauncherIcon.h | 19 | ||||
| -rw-r--r-- | plugins/unityshell/src/MockLauncherIcon.h | 9 | ||||
| -rw-r--r-- | plugins/unityshell/src/TrashLauncherIcon.cpp | 10 | ||||
| -rw-r--r-- | plugins/unityshell/src/TrashLauncherIcon.h | 6 |
10 files changed, 102 insertions, 47 deletions
diff --git a/manual-tests/Launcher.txt b/manual-tests/Launcher.txt index 751ddbe96..0256bed01 100644 --- a/manual-tests/Launcher.txt +++ b/manual-tests/Launcher.txt @@ -465,3 +465,26 @@ Expected Result: The numbers [1-9] should be displayed overlaid on the icons. "Keyboard Shortcut" menu should appear as well. + +Drag file to launcher icons +--------------------------- +Setup: +#. Add the Firefox icon to the launcher. +#. Create an html file on the desktop. +#. Create an empty folder on the desktop. + +Actions: +#. Drag the html file. +#. Drop it into the Firefox icon. + +Expected Result: +The Firefox icon should be highlighted during the drag&drop. +Firefox should open the html file. + +Actions: +#. Drag the new folder. +#. Drop it into the Firefox icon. + +Expected Result: +The Firefox icon should *not* be highlighted during the drag&drop. +Firefox should open the folder in a new Firefox window. diff --git a/plugins/unityshell/src/AbstractLauncherIcon.h b/plugins/unityshell/src/AbstractLauncherIcon.h index d34e07a97..1cbcab329 100644 --- a/plugins/unityshell/src/AbstractLauncherIcon.h +++ b/plugins/unityshell/src/AbstractLauncherIcon.h @@ -180,9 +180,11 @@ public: virtual std::list<DbusmenuMenuitem*> Menus() = 0; - virtual nux::DndAction QueryAcceptDrop(unity::DndData& dnd_data) = 0; + virtual nux::DndAction QueryAcceptDrop(DndData const& dnd_data) = 0; - virtual void AcceptDrop(unity::DndData& dnd_data) = 0; + virtual bool ShouldHighlightOnDrag(DndData const& dnd_data) = 0; + + virtual void AcceptDrop(DndData const& dnd_data) = 0; virtual void SendDndEnter() = 0; diff --git a/plugins/unityshell/src/BamfLauncherIcon.cpp b/plugins/unityshell/src/BamfLauncherIcon.cpp index 5a413810c..dadcf9e4b 100644 --- a/plugins/unityshell/src/BamfLauncherIcon.cpp +++ b/plugins/unityshell/src/BamfLauncherIcon.cpp @@ -18,6 +18,8 @@ * Marco Trevisan (TreviƱo) <3v1n0@ubuntu.com> */ +#include <boost/algorithm/string.hpp> + #include <Nux/Nux.h> #include <Nux/BaseWindow.h> @@ -1069,31 +1071,12 @@ std::string BamfLauncherIcon::GetRemoteUri() return _remote_uri; } -std::set<std::string> BamfLauncherIcon::ValidateUrisForLaunch(unity::DndData& uris) +std::set<std::string> BamfLauncherIcon::ValidateUrisForLaunch(DndData const& uris) { std::set<std::string> result; - gboolean is_home_launcher = g_str_has_suffix(DesktopFile().c_str(), "nautilus-home.desktop"); - - if (is_home_launcher) - { - for (auto k : uris.Uris()) - result.insert(k); - return result; - } - - for (auto i : uris.Types()) - { - for (auto j : GetSupportedTypes()) - { - if (g_content_type_is_a(i.c_str(), j.c_str())) - { - for (auto k : uris.UrisByType(i)) - result.insert(k); - break; - } - } - } + for (auto uri : uris.Uris()) + result.insert(uri); return result; } @@ -1125,12 +1108,37 @@ void BamfLauncherIcon::OnDndLeave() _dnd_hover_timer = 0; } -nux::DndAction BamfLauncherIcon::OnQueryAcceptDrop(unity::DndData& dnd_data) +bool BamfLauncherIcon::OnShouldHighlightOnDrag(DndData const& dnd_data) +{ + bool is_home_launcher = boost::algorithm::ends_with(DesktopFile(), "nautilus-home.desktop") || + boost::algorithm::ends_with(DesktopFile(), "nautilus.desktop"); + + if (is_home_launcher) + { + return true; + } + + for (auto type : dnd_data.Types()) + { + for (auto supported_type : GetSupportedTypes()) + { + if (g_content_type_is_a(type.c_str(), supported_type.c_str())) + { + if (!dnd_data.UrisByType(type).empty()) + return true; + } + } + } + + return false; +} + +nux::DndAction BamfLauncherIcon::OnQueryAcceptDrop(DndData const& dnd_data) { return ValidateUrisForLaunch(dnd_data).empty() ? nux::DNDACTION_NONE : nux::DNDACTION_COPY; } -void BamfLauncherIcon::OnAcceptDrop(unity::DndData& dnd_data) +void BamfLauncherIcon::OnAcceptDrop(DndData const& dnd_data) { OpenInstanceWithUris(ValidateUrisForLaunch(dnd_data)); } diff --git a/plugins/unityshell/src/BamfLauncherIcon.h b/plugins/unityshell/src/BamfLauncherIcon.h index 8baaf0d3e..e7752902c 100644 --- a/plugins/unityshell/src/BamfLauncherIcon.h +++ b/plugins/unityshell/src/BamfLauncherIcon.h @@ -69,17 +69,18 @@ protected: void UpdateIconGeometries(std::vector<nux::Point3> center); void OnCenterStabilized(std::vector<nux::Point3> center); void AddProperties(GVariantBuilder* builder); - void OnAcceptDrop(unity::DndData& dnd_data); + void OnAcceptDrop(DndData const& dnd_data); void OnDndEnter(); void OnDndHovered(); void OnDndLeave(); void OpenInstanceLauncherIcon(ActionArg arg); void ToggleSticky(); - nux::DndAction OnQueryAcceptDrop(unity::DndData& dnd_data); + bool OnShouldHighlightOnDrag(DndData const& dnd_data); + nux::DndAction OnQueryAcceptDrop(DndData const& dnd_data); std::list<DbusmenuMenuitem*> GetMenus(); - std::set<std::string> ValidateUrisForLaunch(unity::DndData& dnd_data); + std::set<std::string> ValidateUrisForLaunch(DndData const& dnd_data); std::string GetRemoteUri(); std::string BamfName() const; diff --git a/plugins/unityshell/src/DndData.h b/plugins/unityshell/src/DndData.h index d6df7778a..e714d8bcf 100644 --- a/plugins/unityshell/src/DndData.h +++ b/plugins/unityshell/src/DndData.h @@ -42,22 +42,22 @@ public: /** * Returns a std::set<std::string> with all the uris. **/ - std::set<std::string>& Uris() { return uris_; } + std::set<std::string> const& Uris() const { return uris_; } /** * Returns a std::set<std::string> with all the types. **/ - std::set<std::string>& Types() { return types_; } + std::set<std::string> const& Types() const { return types_; } /** * Returns a std::set<std::string> with all uris of a given type. **/ - std::set<std::string>& UrisByType(const std::string& type) { return types_to_uris_[type]; } + std::set<std::string> const& UrisByType(const std::string& type) const { return types_to_uris_.find(type)->second; } /** * Returns a std::set<std::string> with all types of a given uri. **/ - std::string& TypeByUri(const std::string& uris) { return uris_to_types_[uris]; } + std::string const& TypeByUri(const std::string& uris) { return uris_to_types_.find(uris)->second; } private: std::set<std::string> uris_; diff --git a/plugins/unityshell/src/Launcher.cpp b/plugins/unityshell/src/Launcher.cpp index 012b05d57..5263ca559 100644 --- a/plugins/unityshell/src/Launcher.cpp +++ b/plugins/unityshell/src/Launcher.cpp @@ -2666,9 +2666,6 @@ void Launcher::OnDNDDataCollected(const std::list<char*>& mimes) break; } - if (!_dnd_data.Uris().size()) - return; - _hide_machine->SetQuirk(LauncherHideMachine::EXTERNAL_DND_ACTIVE, true); if (IsOverlayOpen()) @@ -2687,7 +2684,7 @@ void Launcher::OnDNDDataCollected(const std::list<char*>& mimes) { for (auto it : *_model) { - if (it->QueryAcceptDrop(_dnd_data) != nux::DNDACTION_NONE) + if (it->ShouldHighlightOnDrag(_dnd_data)) it->SetQuirk(AbstractLauncherIcon::QUIRK_DROP_PRELIGHT, true); else it->SetQuirk(AbstractLauncherIcon::QUIRK_DROP_DIM, true); diff --git a/plugins/unityshell/src/LauncherIcon.h b/plugins/unityshell/src/LauncherIcon.h index a32eb57e0..7d1c3ea66 100644 --- a/plugins/unityshell/src/LauncherIcon.h +++ b/plugins/unityshell/src/LauncherIcon.h @@ -166,12 +166,18 @@ public: void RemoveEntryRemote(LauncherEntryRemote::Ptr const& remote); - nux::DndAction QueryAcceptDrop(unity::DndData& dnd_data) + nux::DndAction QueryAcceptDrop(DndData const& dnd_data) { return OnQueryAcceptDrop(dnd_data); } - void AcceptDrop(unity::DndData& dnd_data) + + bool ShouldHighlightOnDrag(DndData const& dnd_data) + { + return OnShouldHighlightOnDrag(dnd_data); + } + + void AcceptDrop(DndData const& dnd_data) { return OnAcceptDrop(dnd_data); } @@ -240,12 +246,17 @@ protected: return ""; } - virtual nux::DndAction OnQueryAcceptDrop(unity::DndData& dnd_data) + virtual nux::DndAction OnQueryAcceptDrop(DndData const& dnd_data) { return nux::DNDACTION_NONE; } - virtual void OnAcceptDrop(unity::DndData& dnd_data) {} + virtual bool OnShouldHighlightOnDrag(DndData const& dnd_data) + { + return false; + } + + virtual void OnAcceptDrop(DndData const& dnd_data) {} virtual void OnDndEnter() {} diff --git a/plugins/unityshell/src/MockLauncherIcon.h b/plugins/unityshell/src/MockLauncherIcon.h index 2a1fb6c6a..d0d45f296 100644 --- a/plugins/unityshell/src/MockLauncherIcon.h +++ b/plugins/unityshell/src/MockLauncherIcon.h @@ -257,12 +257,17 @@ public: return std::list<DbusmenuMenuitem*> (); } - nux::DndAction QueryAcceptDrop(unity::DndData& dnd_data) + nux::DndAction QueryAcceptDrop(DndData const& dnd_data) { return nux::DNDACTION_NONE; } - void AcceptDrop(unity::DndData& dnd_data) {} + bool ShouldHighlightOnDrag(DndData const& dnd_data) + { + return false; + } + + void AcceptDrop(DndData const& dnd_data) {} void SendDndEnter() {} diff --git a/plugins/unityshell/src/TrashLauncherIcon.cpp b/plugins/unityshell/src/TrashLauncherIcon.cpp index 105d3a2e4..057af3baa 100644 --- a/plugins/unityshell/src/TrashLauncherIcon.cpp +++ b/plugins/unityshell/src/TrashLauncherIcon.cpp @@ -158,12 +158,18 @@ void TrashLauncherIcon::OnTrashChanged(GFileMonitor* monitor, } -nux::DndAction TrashLauncherIcon::OnQueryAcceptDrop(unity::DndData& dnd_data) +nux::DndAction TrashLauncherIcon::OnQueryAcceptDrop(DndData const& dnd_data) { return nux::DNDACTION_MOVE; } -void TrashLauncherIcon::OnAcceptDrop(unity::DndData& dnd_data) +bool TrashLauncherIcon::OnShouldHighlightOnDrag(DndData const& dnd_data) +{ + return true; +} + + +void TrashLauncherIcon::OnAcceptDrop(DndData const& dnd_data) { for (auto it : dnd_data.Uris()) { diff --git a/plugins/unityshell/src/TrashLauncherIcon.h b/plugins/unityshell/src/TrashLauncherIcon.h index cce3569e8..cf7e9277d 100644 --- a/plugins/unityshell/src/TrashLauncherIcon.h +++ b/plugins/unityshell/src/TrashLauncherIcon.h @@ -42,8 +42,10 @@ public: protected: void UpdateTrashIcon(); - nux::DndAction OnQueryAcceptDrop(unity::DndData& dnd_data); - void OnAcceptDrop(unity::DndData& dnd_data); + nux::DndAction OnQueryAcceptDrop(DndData const& dnd_data); + bool OnShouldHighlightOnDrag(DndData const& dnd_data); + void OnAcceptDrop(DndData const& dnd_data); + std::string GetName() const; private: |
