Skip to content

Commit

Permalink
Set adjustable button width in settings, use readonly commands
Browse files Browse the repository at this point in the history
  • Loading branch information
Hosch250 committed Feb 26, 2016
1 parent 6dd9e37 commit e680e79
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 72 deletions.
1 change: 1 addition & 0 deletions RetailCoder.VBE/Rubberduck.csproj
Expand Up @@ -554,6 +554,7 @@
<DependentUpon>SearchView.xaml</DependentUpon>
</Compile>
<Compile Include="UI\FolderBrowser.cs" />
<Compile Include="UI\GeneralConverters\EqualWidthConverter.cs" />
<Compile Include="UI\IMessageBox.cs" />
<Compile Include="UI\ParserErrors\ParseErrorListItem.cs" />
<Compile Include="UI\Refactorings\EncapsulateFieldDialog.cs">
Expand Down
20 changes: 20 additions & 0 deletions RetailCoder.VBE/UI/GeneralConverters/EqualWidthConverter.cs
@@ -0,0 +1,20 @@
using System;
using System.Globalization;
using System.Linq;
using System.Windows.Data;

namespace Rubberduck.UI.GeneralConverters
{
public class EqualWidthConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return Math.Abs(values.Cast<double>().Max()) < .1 ? -1 : values.Cast<double>().Max();
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return new object[] { };
}
}
}
47 changes: 37 additions & 10 deletions RetailCoder.VBE/UI/Settings/SettingsControl.xaml
Expand Up @@ -5,10 +5,13 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:settings="clr-namespace:Rubberduck.UI.Settings"
xmlns:converters="clr-namespace:Rubberduck.UI.Settings.Converters"
xmlns:generalConverters="clr-namespace:Rubberduck.UI.GeneralConverters"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="600"
d:DataContext="{d:DesignInstance {x:Type settings:SettingsControlViewModel}, IsDesignTimeCreatable=False}">
<UserControl.Resources>
<generalConverters:EqualWidthConverter x:Key="EqualWidthConverter" />

<LinearGradientBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFD9F4FF" Offset="0"/>
<GradientStop Color="#FF9BDDFB" Offset="1"/>
Expand Down Expand Up @@ -95,24 +98,48 @@
Background="{x:Static SystemColors.ControlDarkBrush}">
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Right">
<Button Content="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=Settings_ResetSettings}"
MinWidth="75"
<Button Name="ResetButton"
Content="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=Settings_ResetSettings}"
Height="20"
HorizontalAlignment="Right"
Margin="20,0"
Command="{Binding ResetButtonCommand}" />
<Button Content="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=OK}"
MinWidth="75"
Padding="10,0"
Command="{Binding ResetButtonCommand}">
<Button.MinWidth>
<MultiBinding Converter="{StaticResource EqualWidthConverter}">
<Binding ElementName="OkButton" Path="ActualWidth" />
<Binding ElementName="CancelButton" Path="ActualWidth" />
</MultiBinding>
</Button.MinWidth>
</Button>
<Button Name="OkButton"
Content="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=OK}"
Height="20"
HorizontalAlignment="Left"
Margin="5,0"
Command="{Binding OKButtonCommand}" />
<Button Content="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=CancelButtonText}"
MinWidth="75"
Padding="10,0"
Command="{Binding OKButtonCommand}">
<Button.MinWidth>
<MultiBinding Converter="{StaticResource EqualWidthConverter}">
<Binding ElementName="CancelButton" Path="ActualWidth" />
<Binding ElementName="ResetButton" Path="ActualWidth" />
</MultiBinding>
</Button.MinWidth>
</Button>
<Button Name="CancelButton"
Content="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=CancelButtonText}"
Height="20"
HorizontalAlignment="Right"
Margin="5,0,10,0"
Command="{Binding CancelButtonCommand}" />
Margin="5,0"
Padding="10,0"
Command="{Binding CancelButtonCommand}">
<Button.MinWidth>
<MultiBinding Converter="{StaticResource EqualWidthConverter}">
<Binding ElementName="OkButton" Path="ActualWidth" />
<Binding ElementName="ResetButton" Path="ActualWidth" />
</MultiBinding>
</Button.MinWidth>
</Button>
</StackPanel>
</DockPanel>
</Border>
Expand Down
86 changes: 34 additions & 52 deletions RetailCoder.VBE/UI/Settings/SettingsControlViewModel.cs
Expand Up @@ -30,6 +30,10 @@ public class SettingsControlViewModel : ViewModelBase
};

SelectedSettingsView = SettingsViews.First(v => v.View == activeView);

_okButtonCommand = new DelegateCommand(_ => SaveAndCloseWindow());
_cancelButtonCommand = new DelegateCommand(_ => CloseWindow());
_resetButtonCommand = new DelegateCommand(_ => ResetSettings());
}

private ObservableCollection<SettingsView> _settingsViews;
Expand Down Expand Up @@ -75,73 +79,51 @@ private void SaveConfig()
_configService.SaveConfiguration(_config, _config.UserSettings.GeneralSettings.Language.Code != oldLangCode);
}

public event EventHandler OnOKButtonClicked;
public event EventHandler OnCancelButtonClicked;

#region Commands

private ICommand _okButtonCommand;
public ICommand OKButtonCommand
private void CloseWindow()
{
get
var handler = OnWindowClosed;
if (handler != null)
{
if (_okButtonCommand != null)
{
return _okButtonCommand;
}
return _okButtonCommand = new DelegateCommand(_ =>
{
SaveConfig();
var handler = OnOKButtonClicked;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
});
handler(this, EventArgs.Empty);
}
}

private ICommand _cancelButtonCommand;
public ICommand CancelButtonCommand
private void SaveAndCloseWindow()
{
get
SaveConfig();
CloseWindow();
}

private void ResetSettings()
{
var defaultConfig = _configService.GetDefaultConfiguration();
foreach (var vm in SettingsViews.Select(v => v.Control.ViewModel))
{
if (_cancelButtonCommand != null)
{
return _cancelButtonCommand;
}
return _cancelButtonCommand = new DelegateCommand(_ =>
{
var handler = OnCancelButtonClicked;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
});
vm.SetToDefaults(defaultConfig);
}
}

private ICommand _resetButtonCommand;
public ICommand ResetButtonCommand
public event EventHandler OnWindowClosed;

private readonly ICommand _okButtonCommand;
public ICommand OKButtonCommand
{
get
{
if (_resetButtonCommand != null)
{
return _resetButtonCommand;
}
return _resetButtonCommand = new DelegateCommand(_ =>
{
var defaultConfig = _configService.GetDefaultConfiguration();
foreach (var vm in SettingsViews.Select(v => v.Control.ViewModel))
{
vm.SetToDefaults(defaultConfig);
}
});
return _okButtonCommand;
}
}

#endregion
private readonly ICommand _cancelButtonCommand;
public ICommand CancelButtonCommand
{
get { return _cancelButtonCommand; }
}

private readonly ICommand _resetButtonCommand;
public ICommand ResetButtonCommand
{
get { return _resetButtonCommand; }
}
}
}
10 changes: 2 additions & 8 deletions RetailCoder.VBE/UI/Settings/SettingsForm.cs
Expand Up @@ -43,16 +43,10 @@ public SettingsForm(IGeneralConfigService configService, SettingsViews activeVie
},
activeView);

ViewModel.OnOKButtonClicked += ViewModel_OnOKButtonClicked;
ViewModel.OnCancelButtonClicked += ViewModel_OnCancelButtonClicked;
ViewModel.OnWindowClosed += ViewModel_OnWindowClosed;
}

void ViewModel_OnOKButtonClicked(object sender, System.EventArgs e)
{
Close();
}

void ViewModel_OnCancelButtonClicked(object sender, System.EventArgs e)
void ViewModel_OnWindowClosed(object sender, System.EventArgs e)
{
Close();
}
Expand Down
4 changes: 2 additions & 2 deletions RubberduckTests/Settings/SettingsControlTests.cs
Expand Up @@ -400,7 +400,7 @@ public void OKButtonFiresEvent()
var eventIsFired = false;
var viewModel = GetDefaultViewModel(GetConfigLoader(GetDefaultConfig()));

viewModel.OnOKButtonClicked += (sender, args) => { eventIsFired = true; };
viewModel.OnWindowClosed += (sender, args) => { eventIsFired = true; };

viewModel.OKButtonCommand.Execute(null);

Expand All @@ -413,7 +413,7 @@ public void CancelButtonFiresEvent()
var eventIsFired = false;
var viewModel = GetDefaultViewModel(GetConfigLoader(GetDefaultConfig()));

viewModel.OnCancelButtonClicked += (sender, args) => { eventIsFired = true; };
viewModel.OnWindowClosed += (sender, args) => { eventIsFired = true; };

viewModel.CancelButtonCommand.Execute(null);

Expand Down

0 comments on commit e680e79

Please sign in to comment.