summaryrefslogtreecommitdiff
diff options
authorAndrea Azzarone <azzaronea@gmail.com>2012-04-24 20:32:14 -0400
committerTarmac <>2012-04-24 20:32:14 -0400
commit7ea4881a70d3be6f08b5f200f10e7f340ac8397c (patch)
tree508eba5f8143fcb5a3336db8c80dea0a1dc9db8b
parent2c5982c81982a905102e7ef60c947c96b6e3e2c4 (diff)
parentb4c2948f8a0018f77450c2a84a4ca55cdd734c96 (diff)
Enable dnd for all launcher icons (and not just the ones matching the type).. Fixes: https://bugs.launchpad.net/bugs/880798. Approved by Marco Trevisan (Treviño).
(bzr r2336)
-rw-r--r--manual-tests/Launcher.txt23
-rw-r--r--plugins/unityshell/src/AbstractLauncherIcon.h6
-rw-r--r--plugins/unityshell/src/BamfLauncherIcon.cpp56
-rw-r--r--plugins/unityshell/src/BamfLauncherIcon.h7
-rw-r--r--plugins/unityshell/src/DndData.h8
-rw-r--r--plugins/unityshell/src/Launcher.cpp5
-rw-r--r--plugins/unityshell/src/LauncherIcon.h19
-rw-r--r--plugins/unityshell/src/MockLauncherIcon.h9
-rw-r--r--plugins/unityshell/src/TrashLauncherIcon.cpp10
-rw-r--r--plugins/unityshell/src/TrashLauncherIcon.h6
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: