Skip to content

Commit 9dd34c5

Browse files
authored
Merge pull request #5529 from MDoerner/OptionToDisableDragAndDrop
Adds an option to disable drag and drop for CE folders.
2 parents 74d66d2 + ff73180 commit 9dd34c5

File tree

12 files changed

+71
-9
lines changed

12 files changed

+71
-9
lines changed

Rubberduck.Core/Navigation/CodeExplorer/CodeExplorerViewModel.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,15 @@ public CodeExplorerViewModel(
6363
_state.StateChanged += HandleStateChanged;
6464
_state.ModuleStateChanged += ParserState_ModuleStateChanged;
6565

66-
_externalRemoveCommand = removeCommand;
6766
_generalSettingsProvider = generalSettingsProvider;
67+
_generalSettingsProvider.SettingsChanged += GeneralSettingsChanged;
68+
RefreshDragAndDropSetting();
69+
6870
_windowSettingsProvider = windowSettingsProvider;
6971
_uiDispatcher = uiDispatcher;
7072
_vbe = vbe;
7173
_templateProvider = templateProvider;
74+
_externalRemoveCommand = removeCommand;
7275
Annotations = annotations.ToList();
7376

7477
CollapseAllSubnodesCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteCollapseNodes, EvaluateCanSwitchNodeState);
@@ -79,6 +82,7 @@ public CodeExplorerViewModel(
7982
RemoveCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteRemoveCommand, _externalRemoveCommand.CanExecute);
8083
}
8184

85+
8286
OnPropertyChanged(nameof(Projects));
8387

8488
SyncCodePaneCommand = syncProvider.GetSyncCommand(this);
@@ -489,12 +493,25 @@ private void ExpandToNode(ICodeExplorerNode node)
489493

490494
public Visibility VBAVisibility => _vbe.Kind == VBEKind.Hosted ? Visibility.Visible : Visibility.Collapsed;
491495

496+
public bool AllowDragAndDrop { get; internal set; }
497+
498+
private void GeneralSettingsChanged(object sender, ConfigurationChangedEventArgs e)
499+
{
500+
RefreshDragAndDropSetting();
501+
}
502+
503+
private void RefreshDragAndDropSetting()
504+
{
505+
AllowDragAndDrop = _generalSettingsProvider.Read().EnableFolderDragAndDrop;
506+
}
507+
492508
public void Dispose()
493509
{
494510
if (_state != null)
495511
{
496512
_state.StateChanged -= HandleStateChanged;
497513
_state.ModuleStateChanged -= ParserState_ModuleStateChanged;
514+
_generalSettingsProvider.SettingsChanged -= GeneralSettingsChanged;
498515
}
499516
}
500517
}

Rubberduck.Core/Properties/Settings.Designer.cs

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Rubberduck.Core/Settings/GeneralSettings.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public interface IGeneralSettings
2121
bool UserEditedLogLevel { get; set; }
2222
int MinimumLogLevel { get; set; }
2323
bool SetDpiUnaware { get; set; }
24+
bool EnableFolderDragAndDrop { get; set; }
2425
List<ExperimentalFeature> EnableExperimentalFeatures { get; set; }
2526
}
2627

@@ -74,6 +75,7 @@ public int MinimumLogLevel
7475
}
7576

7677
public bool SetDpiUnaware { get; set; }
78+
public bool EnableFolderDragAndDrop { get; set; }
7779

7880
public List<ExperimentalFeature> EnableExperimentalFeatures { get; set; } = new List<ExperimentalFeature>();
7981

@@ -100,7 +102,8 @@ public bool Equals(GeneralSettings other)
100102
MinimumLogLevel == other.MinimumLogLevel &&
101103
EnableExperimentalFeatures.Count == other.EnableExperimentalFeatures.Count &&
102104
EnableExperimentalFeatures.All(other.EnableExperimentalFeatures.Contains) &&
103-
SetDpiUnaware == other.SetDpiUnaware;
105+
SetDpiUnaware == other.SetDpiUnaware &&
106+
EnableFolderDragAndDrop == other.EnableFolderDragAndDrop;
104107
}
105108
}
106109
}

Rubberduck.Core/UI/CodeExplorer/CodeExplorerControl.xaml.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,13 @@ private void TreeView_PreviewMouseMove(object sender, MouseEventArgs e)
5656

5757
private void EvaluateDragInitialization(object sender, MouseEventArgs e)
5858
{
59-
if (e.LeftButton != MouseButtonState.Pressed)
59+
if (e.LeftButton != MouseButtonState.Pressed
60+
|| !(DataContext is CodeExplorerViewModel viewModel)
61+
|| !viewModel.AllowDragAndDrop)
6062
{
6163
return;
6264
}
63-
65+
6466
var currentPosition = e.GetPosition(null);
6567
var fromLeftClick = currentPosition - _lastLeftClickPosition;
6668

Rubberduck.Core/UI/Settings/GeneralSettings.xaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,13 @@
8989
<CheckBox Margin="15,0,0,5" Content="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=GeneralSettings_IncludePreRelease}"
9090
IsChecked="{Binding IncludePreRelease}"
9191
IsEnabled="{Binding IsChecked, ElementName=IsVersionCheckEnabled}"/>
92-
9392
<CheckBox Margin="5,0,0,5" Content="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=GeneralSettings_CompileBeforeParse}"
9493
IsChecked="{Binding CompileBeforeParse}" />
9594
<CheckBox Margin="5,0,0,5" Content="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=GeneralSettings_SetDpiUnaware}"
96-
IsEnabled="{Binding SetDpiUnawareEnabled}" IsChecked="{Binding SetDpiUnaware}" />
95+
IsEnabled="{Binding SetDpiUnawareEnabled}"
96+
IsChecked="{Binding SetDpiUnaware}" />
97+
<CheckBox Margin="5,0,0,5" Content="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=GeneralSettings_EnableDragAndDrop}"
98+
IsChecked="{Binding EnableFolderDragAndDrop}" />
9799
<StackPanel Orientation="Horizontal"/>
98100

99101
<Label Content="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=GeneralSettings_MinimumLogLevelLabel}" FontWeight="SemiBold" />

Rubberduck.Core/UI/Settings/GeneralSettingsViewModel.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ public ObservableViewModelCollection<HotkeySettingViewModel> Hotkeys
102102
}
103103
}
104104
}
105+
105106
private void InvalidateShouldDisplayWarning(object sender, ElementPropertyChangedEventArgs<HotkeySettingViewModel> e)
106107
{
107108
OnPropertyChanged(nameof(ShouldDisplayHotkeyModificationLabel));
@@ -195,6 +196,20 @@ public bool CompileBeforeParse
195196
}
196197
}
197198

199+
private bool _enableFolderDragAndDrop;
200+
public bool EnableFolderDragAndDrop
201+
{
202+
get => _enableFolderDragAndDrop;
203+
set
204+
{
205+
if (_enableFolderDragAndDrop != value)
206+
{
207+
_enableFolderDragAndDrop = value;
208+
OnPropertyChanged();
209+
}
210+
}
211+
}
212+
198213
private bool _setDpiUnaware;
199214
public bool SetDpiUnaware
200215
{
@@ -305,6 +320,7 @@ private Rubberduck.Settings.GeneralSettings GetCurrentGeneralSettings()
305320
IncludePreRelease = IncludePreRelease,
306321
CompileBeforeParse = CompileBeforeParse,
307322
SetDpiUnaware = SetDpiUnaware,
323+
EnableFolderDragAndDrop = EnableFolderDragAndDrop,
308324
IsSmartIndenterPrompted = _indenterPrompted,
309325
IsAutoSaveEnabled = AutoSaveEnabled,
310326
AutoSavePeriod = AutoSavePeriod,
@@ -331,6 +347,7 @@ private void TransferSettingsToView(IGeneralSettings general, IHotkeySettings ho
331347
IncludePreRelease = general.IncludePreRelease;
332348
CompileBeforeParse = general.CompileBeforeParse;
333349
SetDpiUnaware = general.SetDpiUnaware;
350+
EnableFolderDragAndDrop = general.EnableFolderDragAndDrop;
334351
_indenterPrompted = general.IsSmartIndenterPrompted;
335352
AutoSaveEnabled = general.IsAutoSaveEnabled;
336353
AutoSavePeriod = general.AutoSavePeriod;

Rubberduck.Resources/RubberduckUI.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Rubberduck.Resources/RubberduckUI.de.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1722,6 +1722,9 @@ Wollen Sie fortfahren?</value>
17221722
<data name="RenameDialog_TitleText_Folder" xml:space="preserve">
17231723
<value>Ordner umbenennen</value>
17241724
</data>
1725+
<data name="GeneralSettings_EnableDragAndDrop" xml:space="preserve">
1726+
<value>Drag and Drop im Code Explorer aktivieren</value>
1727+
</data>
17251728
<data name="AnnotateDeclarationDialog_AdjustAttributeLabel" xml:space="preserve">
17261729
<value>Attribut hinzufügen / anpassen</value>
17271730
</data>

Rubberduck.Resources/RubberduckUI.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1953,6 +1953,9 @@ Do you want to proceed?</value>
19531953
<data name="RenameDialog_TitleText_Folder" xml:space="preserve">
19541954
<value>Rename folder</value>
19551955
</data>
1956+
<data name="GeneralSettings_EnableDragAndDrop" xml:space="preserve">
1957+
<value>Enable drag and drop in Code Explorer</value>
1958+
</data>
19561959
<data name="AnnotateDeclarationDialog_AdjustAttributeLabel" xml:space="preserve">
19571960
<value>Add/Adjust attribute</value>
19581961
</data>

Rubberduck.Resources/Settings/SettingsUI.Designer.cs

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Rubberduck.Resources/Settings/SettingsUI.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@
202202
<value>Click [{0}] to close the window and apply changes, or [{1}] to discard them.</value>
203203
</data>
204204
<data name="PageInstructions_IndenterSettings" xml:space="preserve">
205-
<value>Configure indenter settings.</value>
205+
<value>Configure indenter settings</value>
206206
</data>
207207
<data name="PageInstructions_InspectionSettings" xml:space="preserve">
208208
<value>Configure inspection severity. Use "DoNotShow" to disable an inspection.</value>

RubberduckTests/CodeExplorer/CodeExplorerViewModelTests.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
using Rubberduck.Parsing.Annotations;
1414
using Rubberduck.Parsing.UIContext;
1515
using Rubberduck.Parsing.VBA;
16+
using Rubberduck.Settings;
17+
using Rubberduck.SettingsProvider;
1618
using Rubberduck.UI.Command.ComCommands;
1719
using RubberduckTests.Mocks;
1820
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
@@ -2353,11 +2355,14 @@ public void UnparsedSetToTrue_NoProjects()
23532355
var parser = MockParser.Create(vbe.Object, null, MockVbeEvents.CreateMockVbeEvents(vbe));
23542356
var state = parser.State;
23552357
var dispatcher = new Mock<IUiDispatcher>();
2358+
var generalSettingsProvider = new Mock<IConfigurationService<GeneralSettings>>();
2359+
var generalSettings = new GeneralSettings();
2360+
generalSettingsProvider.Setup(m => m.Read()).Returns(generalSettings);
23562361

23572362
dispatcher.Setup(m => m.Invoke(It.IsAny<Action>())).Callback((Action argument) => argument.Invoke());
23582363
dispatcher.Setup(m => m.StartTask(It.IsAny<Action>(), It.IsAny<TaskCreationOptions>())).Returns((Action argument, TaskCreationOptions options) => Task.Factory.StartNew(argument.Invoke, options));
23592364

2360-
var viewModel = new CodeExplorerViewModel(state, null, null, null, dispatcher.Object, vbe.Object, null,
2365+
var viewModel = new CodeExplorerViewModel(state, null, generalSettingsProvider.Object, null, dispatcher.Object, vbe.Object, null,
23612366
new CodeExplorerSyncProvider(vbe.Object, state, vbeEvents.Object), new List<IAnnotation>());
23622367

23632368
parser.Parse(new CancellationTokenSource());

0 commit comments

Comments
 (0)