50
50
, devices_settings_(devices_settings)
51
51
, notification_(notification)
52
, file_manager_(parent_->file_manager_)
55
55
UpdateVisibility();
61
61
parent_->tooltip_text = volume_->GetName();
62
62
parent_->icon_name = volume_->GetIconName();
63
parent_->SetQuirk(Quirk::RUNNING, file_manager_->IsPrefixOpened(volume_->GetUri()));
66
65
void UpdateVisibility()
68
UpdateKeepInLauncher();
69
parent_->SetQuirk(Quirk::VISIBLE, keep_in_launcher_);
72
void UpdateKeepInLauncher()
74
auto const& identifier = volume_->GetIdentifier();
75
keep_in_launcher_ = !devices_settings_->IsABlacklistedDevice(identifier);
67
parent_->SetQuirk(Quirk::VISIBLE, IsVisible());
72
return devices_settings_->IsABlacklistedDevice(volume_->GetIdentifier());
77
if (IsBlackListed() && parent_->GetManagedWindows().empty())
78
83
void ConnectSignals()
80
connections_.Add(volume_->changed.connect(sigc::mem_fun(this, &Impl::OnVolumeChanged)));
85
connections_.Add(volume_->changed.connect([this] { UpdateIcon(); }));
81
86
connections_.Add(volume_->removed.connect(sigc::mem_fun(this, &Impl::OnVolumeRemoved)));
82
connections_.Add(devices_settings_->changed.connect(sigc::mem_fun(this, &Impl::OnSettingsChanged)));
83
connections_.Add(file_manager_->locations_changed.connect(sigc::mem_fun(this, &Impl::UpdateIcon)));
86
void OnVolumeChanged()
87
connections_.Add(devices_settings_->changed.connect([this] { UpdateVisibility(); }));
88
connections_.Add(parent_->windows_changed.connect([this] (int) { UpdateVisibility(); }));
91
91
void OnVolumeRemoved()
93
if (devices_settings_->IsABlacklistedDevice(volume_->GetIdentifier()))
94
devices_settings_->TryToUnblacklist(volume_->GetIdentifier());
93
devices_settings_->TryToUnblacklist(volume_->GetIdentifier());
96
94
parent_->UnStick();
100
void OnSettingsChanged()
105
98
bool CanEject() const
107
100
return volume_->CanBeEjected();
152
145
void OpenInFileManager(uint64_t timestamp)
154
147
DoActionWhenMounted([this, timestamp] {
155
file_manager_->OpenActiveChild(volume_->GetUri(), timestamp);
148
file_manager_->Open(volume_->GetUri(), timestamp);
171
164
AppendSeparatorItem(result);
172
165
AppendNameItem(result);
173
166
AppendSeparatorItem(result);
174
AppendUnlockFromLauncherItem(result);
167
AppendWindowsItems(result);
168
AppendToggleLockFromLauncherItem(result);
175
169
AppendEjectItem(result);
176
170
AppendSafelyRemoveItem(result);
177
171
AppendUnmountItem(result);
172
AppendQuitItem(result);
182
void AppendUnlockFromLauncherItem(MenuItemsVector& menu)
177
void AppendToggleLockFromLauncherItem(MenuItemsVector& menu)
184
179
if (volume_->GetIdentifier().empty())
187
182
glib::Object<DbusmenuMenuitem> menu_item(dbusmenu_menuitem_new());
189
dbusmenu_menuitem_property_set(menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Unlock from Launcher"));
184
const char* label = IsBlackListed() ? _("Lock to Launcher") : _("Unlock from Launcher");
185
dbusmenu_menuitem_property_set(menu_item, DBUSMENU_MENUITEM_PROP_LABEL, label);
190
186
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_ENABLED, true);
191
187
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
193
gsignals_.Add(new ItemSignal(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, [this] (DbusmenuMenuitem*, int) {
194
auto const& identifier = volume_->GetIdentifier();
196
devices_settings_->TryToBlacklist(identifier);
189
parent_->glib_signals_.Add(new ItemSignal(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, [this] (DbusmenuMenuitem*, int) {
190
if (!IsBlackListed())
193
devices_settings_->TryToBlacklist(volume_->GetIdentifier());
197
devices_settings_->TryToUnblacklist(volume_->GetIdentifier());
199
201
menu.push_back(menu_item);
220
222
dbusmenu_menuitem_property_set_bool(menu_item, QuicklistMenuItem::MARKUP_ENABLED_PROPERTY, true);
221
223
dbusmenu_menuitem_property_set_bool(menu_item, QuicklistMenuItem::MARKUP_ACCEL_DISABLED_PROPERTY, true);
223
gsignals_.Add(new ItemSignal(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, [this] (DbusmenuMenuitem*, unsigned timestamp) {
225
parent_->glib_signals_.Add(new ItemSignal(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, [this] (DbusmenuMenuitem*, unsigned timestamp) {
224
226
OpenInFileManager(timestamp);
227
229
menu.push_back(menu_item);
232
void AppendWindowsItems(MenuItemsVector& menu)
234
if (!parent_->IsRunning())
237
auto const& windows_items = parent_->GetWindowsMenuItems();
238
if (!windows_items.empty())
240
menu.insert(end(menu), begin(windows_items), end(windows_items));
241
AppendSeparatorItem(menu);
230
245
void AppendOpenItem(MenuItemsVector& menu)
232
247
glib::Object<DbusmenuMenuitem> menu_item(dbusmenu_menuitem_new());
235
250
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_ENABLED, true);
236
251
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
238
gsignals_.Add(new ItemSignal(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, [this] (DbusmenuMenuitem*, unsigned timestamp) {
253
parent_->glib_signals_.Add(new ItemSignal(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, [this] (DbusmenuMenuitem*, unsigned timestamp) {
239
254
OpenInFileManager(timestamp);
253
268
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_ENABLED, true);
254
269
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
256
gsignals_.Add(new ItemSignal(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, [this] (DbusmenuMenuitem*, int) {
271
parent_->glib_signals_.Add(new ItemSignal(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, [this] (DbusmenuMenuitem*, int) {
257
273
EjectAndShowNotification();
271
287
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_ENABLED, true);
272
288
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
274
gsignals_.Add(new ItemSignal(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, [this] (DbusmenuMenuitem*, int) {
275
volume_->StopDrive();
290
parent_->glib_signals_.Add(new ItemSignal(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, [this] (DbusmenuMenuitem*, int) {
292
volume_->StopDrive();
278
295
menu.push_back(menu_item);
289
306
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_ENABLED, true);
290
307
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
292
gsignals_.Add(new ItemSignal(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, [this] (DbusmenuMenuitem*, int) {
309
parent_->glib_signals_.Add(new ItemSignal(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, [this] (DbusmenuMenuitem*, int) {
313
menu.push_back(menu_item);
316
void AppendQuitItem(MenuItemsVector& menu)
318
if (!parent_->IsRunning())
322
AppendSeparatorItem(menu);
324
glib::Object<DbusmenuMenuitem> menu_item(dbusmenu_menuitem_new());
326
dbusmenu_menuitem_property_set(menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Quit"));
327
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_ENABLED, true);
328
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
330
parent_->glib_signals_.Add(new ItemSignal(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, [this] (DbusmenuMenuitem*, int) {
296
334
menu.push_back(menu_item);
309
347
VolumeLauncherIcon* parent_;
310
bool keep_in_launcher_;
311
348
Volume::Ptr volume_;
312
349
DevicesSettings::Ptr devices_settings_;
313
350
DeviceNotificationDisplay::Ptr notification_;
314
351
FileManager::Ptr file_manager_;
316
glib::SignalManager gsignals_;
317
352
connection::Manager connections_;
325
360
DevicesSettings::Ptr const& devices_settings,
326
361
DeviceNotificationDisplay::Ptr const& notification,
327
362
FileManager::Ptr const& fm)
328
: SimpleLauncherIcon(IconType::DEVICE)
363
: WindowedLauncherIcon(IconType::DEVICE)
364
, StorageLauncherIcon(GetIconType(), fm)
329
365
, pimpl_(new Impl(volume, devices_settings, notification, fm, this))
367
UpdateStorageWindows();
332
370
VolumeLauncherIcon::~VolumeLauncherIcon()
335
373
void VolumeLauncherIcon::AboutToRemove()
375
StorageLauncherIcon::AboutToRemove();
338
378
EjectAndShowNotification();
339
379
else if (CanStop())
360
400
return pimpl_->StopDrive();
363
void VolumeLauncherIcon::ActivateLauncherIcon(ActionArg arg)
365
SimpleLauncherIcon::ActivateLauncherIcon(arg);
366
pimpl_->OpenInFileManager(arg.timestamp);
369
403
AbstractLauncherIcon::MenuItemsVector VolumeLauncherIcon::GetMenus()
371
405
return pimpl_->GetMenus();
388
422
SetQuirk(Quirk::VISIBLE, true);
391
bool VolumeLauncherIcon::OnShouldHighlightOnDrag(DndData const& dnd_data)
393
for (auto const& uri : dnd_data.Uris())
395
if (uri.find("file://") == 0)
402
425
nux::DndAction VolumeLauncherIcon::OnQueryAcceptDrop(DndData const& dnd_data)
404
427
return dnd_data.Uris().empty() ? nux::DNDACTION_NONE : nux::DNDACTION_COPY;
412
435
FullyAnimateQuirkDelayed(100, LauncherIcon::Quirk::SHIMMER);
438
std::string VolumeLauncherIcon::GetVolumeUri() const
440
return pimpl_->volume_->GetUri();
443
WindowList VolumeLauncherIcon::GetStorageWindows() const
445
return file_manager_->WindowsForLocation(GetVolumeUri());
448
void VolumeLauncherIcon::OpenInstanceLauncherIcon(Time timestamp)
450
pimpl_->OpenInFileManager(timestamp);