Worked on CreateProjectDialog

This commit is contained in:
Tiberiu Chibici 2014-08-16 11:05:26 +03:00
parent 5dc71eca92
commit c933b96347
9 changed files with 185 additions and 52 deletions

View File

@ -67,6 +67,7 @@
<Compile Include="Utils\InputHelper.cs" /> <Compile Include="Utils\InputHelper.cs" />
<Compile Include="Utils\LinqExtension.cs" /> <Compile Include="Utils\LinqExtension.cs" />
<Compile Include="Utils\BitmapHelper.cs" /> <Compile Include="Utils\BitmapHelper.cs" />
<Compile Include="Utils\PathHelper.cs" />
<Compile Include="Utils\TreeExtensions.cs" /> <Compile Include="Utils\TreeExtensions.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

View File

@ -21,5 +21,19 @@ namespace RainmeterStudio.Core.Utils
foreach (var obj in container) foreach (var obj in container)
action(obj); action(obj);
} }
/// <summary>
/// Appends an item at the end of the container
/// </summary>
/// <typeparam name="T">Enumerable type</typeparam>
/// <param name="container">Container</param>
/// <param name="item">Item to append</param>
public static IEnumerable<T> Append<T> (this IEnumerable<T> container, T item)
{
foreach (var i in container)
yield return i;
yield return item;
}
} }
} }

View File

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace RainmeterStudio.Core.Utils
{
public static class PathHelper
{
/// <summary>
/// Validates a path
/// </summary>
/// <param name="path">The path</param>
/// <returns>True if the path is valid</returns>
public static bool IsPathValid(string path)
{
// Check for invalid characters
if (Path.GetInvalidPathChars().Intersect(path).Any())
return false;
return true;
}
}
}

View File

@ -147,5 +147,41 @@ namespace RainmeterStudio.Properties {
this["MainWindow_Top"] = value; this["MainWindow_Top"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string CreateProjectDialog_RecentLocations {
get {
return ((string)(this["CreateProjectDialog_RecentLocations"]));
}
set {
this["CreateProjectDialog_RecentLocations"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string CreateProjectDialog_SavedLocation {
get {
return ((string)(this["CreateProjectDialog_SavedLocation"]));
}
set {
this["CreateProjectDialog_SavedLocation"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool CreateProjectDialog_CreateDirectoryCheckbox {
get {
return ((bool)(this["CreateProjectDialog_CreateDirectoryCheckbox"]));
}
set {
this["CreateProjectDialog_CreateDirectoryCheckbox"] = value;
}
}
} }
} }

View File

@ -32,5 +32,14 @@
<Setting Name="MainWindow_Top" Type="System.Double" Scope="User"> <Setting Name="MainWindow_Top" Type="System.Double" Scope="User">
<Value Profile="(Default)">10</Value> <Value Profile="(Default)">10</Value>
</Setting> </Setting>
<Setting Name="CreateProjectDialog_RecentLocations" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="CreateProjectDialog_SavedLocation" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="CreateProjectDialog_CreateDirectoryCheckbox" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
</Settings> </Settings>
</SettingsFile> </SettingsFile>

View File

@ -107,7 +107,6 @@ namespace RainmeterStudio.UI.Controller
// Create dialog // Create dialog
var dialog = new CreateProjectDialog(this); var dialog = new CreateProjectDialog(this);
dialog.Owner = OwnerWindow; dialog.Owner = OwnerWindow;
dialog.SelectedLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Rainmeter Studio Projects");
if (name != null) if (name != null)
dialog.Name = name; dialog.Name = name;

View File

@ -2,9 +2,11 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:r="clr-namespace:RainmeterStudio.Resources" xmlns:r="clr-namespace:RainmeterStudio.Resources"
Title="{x:Static r:Strings.CreateProjectDialog_Title}" Height="320" Width="480" xmlns:p="clr-namespace:RainmeterStudio.Properties"
Title="{x:Static r:Strings.CreateProjectDialog_Title}" Width="600" Height="400"
WindowStartupLocation="CenterOwner" WindowStartupLocation="CenterOwner"
WindowStyle="ToolWindow" ShowInTaskbar="False"> WindowStyle="ToolWindow" ShowInTaskbar="False"
Closed="Window_Closed">
<Grid Background="WhiteSmoke"> <Grid Background="WhiteSmoke">
<Grid.RowDefinitions> <Grid.RowDefinitions>
@ -53,8 +55,10 @@
<!-- Location --> <!-- Location -->
<TextBlock Grid.Row="1" Text="{x:Static r:Strings.CreateProjectDialog_Location}" /> <TextBlock Grid.Row="1" Text="{x:Static r:Strings.CreateProjectDialog_Location}" />
<ComboBox Name="textLocation" IsEditable="True" <ComboBox Name="textLocation" IsEditable="True"
Grid.Row="1" Grid.Column="1" /> Grid.Row="1" Grid.Column="1" />
<Button Grid.Row="1" Grid.Column="2" Content="{x:Static r:Strings.Dialog_Browse}"/> <Button Grid.Row="1" Grid.Column="2" Content="{x:Static r:Strings.Dialog_Browse}"/>
<CheckBox Name="checkLocationDefault" <CheckBox Name="checkLocationDefault"
Grid.Row="1" Grid.Column="3" Grid.Row="1" Grid.Column="3"
@ -63,14 +67,13 @@
<!-- Path --> <!-- Path -->
<TextBlock Grid.Row="2" Text="{x:Static r:Strings.CreateProjectDialog_Path}"/> <TextBlock Grid.Row="2" Text="{x:Static r:Strings.CreateProjectDialog_Path}"/>
<ComboBox Name="textPath" <TextBox Name="textPath" Grid.Row="2" Grid.Column="1" />
IsEditable="True"
Grid.Row="2" Grid.Column="1" />
<Button Grid.Row="2" Grid.Column="2" Content="{x:Static r:Strings.Dialog_Browse}" /> <Button Grid.Row="2" Grid.Column="2" Content="{x:Static r:Strings.Dialog_Browse}" />
<CheckBox Name="checkCreateDirectory" <CheckBox Name="checkCreateDirectory"
Grid.Row="2" Grid.Column="3" Grid.Row="2" Grid.Column="3"
Content="{x:Static r:Strings.CreateProjectDialog_PathCreateFolder}" Content="{x:Static r:Strings.CreateProjectDialog_PathCreateFolder}"
IsChecked="True" IsChecked="{Binding Source={x:Static p:Settings.Default}, Path=CreateProjectDialog_CreateDirectoryCheckbox, Mode=TwoWay}"
Checked="checkCreateDirectory_CheckChanged" Checked="checkCreateDirectory_CheckChanged"
Unchecked="checkCreateDirectory_CheckChanged" Unchecked="checkCreateDirectory_CheckChanged"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
@ -79,8 +82,8 @@
<StackPanel Grid.Row="2" Orientation="Horizontal" <StackPanel Grid.Row="2" Orientation="Horizontal"
HorizontalAlignment="Right"> HorizontalAlignment="Right">
<Button Command="{Binding CreateCommand}" IsDefault="True" Content="{x:Static r:Strings.Dialog_Create}" /> <Button Name="buttonCreate" IsDefault="True" Content="{x:Static r:Strings.Dialog_Create}" Click="buttonCreate_Click"/>
<Button Command="{Binding CancelCommand}" IsCancel="True" Content="{x:Static r:Strings.Dialog_Cancel}" /> <Button Name="buttonCancel" IsCancel="True" Content="{x:Static r:Strings.Dialog_Cancel}" Click="buttonCancel_Click" />
</StackPanel> </StackPanel>
</Grid> </Grid>

View File

@ -14,6 +14,8 @@ using System.Windows.Shapes;
using RainmeterStudio.Business; using RainmeterStudio.Business;
using RainmeterStudio.Core.Documents; using RainmeterStudio.Core.Documents;
using RainmeterStudio.Core.Model; using RainmeterStudio.Core.Model;
using RainmeterStudio.Core.Utils;
using RainmeterStudio.Properties;
using RainmeterStudio.UI.Controller; using RainmeterStudio.UI.Controller;
namespace RainmeterStudio.UI.Dialogs namespace RainmeterStudio.UI.Dialogs
@ -23,34 +25,6 @@ namespace RainmeterStudio.UI.Dialogs
/// </summary> /// </summary>
public partial class CreateProjectDialog : Window public partial class CreateProjectDialog : Window
{ {
#region Commands
private Command _createCommand;
public Command CreateCommand
{
get
{
if (_createCommand == null)
_createCommand = new Command("CreateCommand", Create, Validate);
return _createCommand;
}
}
private Command _cancelCommand;
public Command CancelCommand
{
get
{
if (_cancelCommand == null)
_cancelCommand = new Command("CancelCommand", Cancel);
return _cancelCommand;
}
}
#endregion
#region Properties #region Properties
/// <summary> /// <summary>
@ -120,45 +94,62 @@ namespace RainmeterStudio.UI.Dialogs
private bool _pathUserSet = false; private bool _pathUserSet = false;
private bool _ignoreNextChange = false; private bool _ignoreNextChange = false;
private ProjectController _projectController;
#endregion #endregion
/// <summary>
/// Initializes the create project dialog
/// </summary>
/// <param name="projectController">Project controller</param>
public CreateProjectDialog(ProjectController projectController) public CreateProjectDialog(ProjectController projectController)
{ {
InitializeComponent(); InitializeComponent();
_projectController = projectController;
// Add event handlers // Add event handlers
textLocation.AddHandler(TextBoxBase.TextChangedEvent, new TextChangedEventHandler(textLocation_TextChanged)); textLocation.AddHandler(TextBoxBase.TextChangedEvent, new TextChangedEventHandler(textLocation_TextChanged));
textPath.AddHandler(TextBoxBase.TextChangedEvent, new TextChangedEventHandler(textPath_TextChanged));
// Set data context // Populate controls
DataContext = this;
// Populate templates
listTemplates.ItemsSource = projectController.ProjectTemplates.OrderBy(x => x.DisplayText); listTemplates.ItemsSource = projectController.ProjectTemplates.OrderBy(x => x.DisplayText);
textLocation.ItemsSource = GetRecentLocations().OrderBy(x => x);
textLocation.Text = GetLocation();
Validate();
// Focus on name textbox // Focus on name textbox
textName.Focus(); textName.Focus();
} }
private void Create() private string GetLocation()
{ {
DialogResult = true; // Get setting
Close(); string location = Settings.Default.CreateProjectDialog_SavedLocation;
// No location provided, use default
if (String.IsNullOrEmpty(location))
return System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Rainmeter Studio Projects");
return location;
} }
private void Cancel() private IEnumerable<string> GetRecentLocations()
{ {
DialogResult = false; return Settings.Default.CreateProjectDialog_RecentLocations
Close(); .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
} }
private bool Validate() private void Validate()
{ {
bool res = true; bool res = true;
res &= !String.IsNullOrWhiteSpace(textPath.Text);
res &= (listTemplates.SelectedItem != null); res &= (listTemplates.SelectedItem != null);
return res; res &= !String.IsNullOrWhiteSpace(textPath.Text);
res &= PathHelper.IsPathValid(textPath.Text);
buttonCreate.IsEnabled = res;
} }
private void UpdatePath() private void UpdatePath()
@ -206,7 +197,15 @@ namespace RainmeterStudio.UI.Dialogs
else else
{ {
_pathUserSet = true; _pathUserSet = true;
try
{
textLocation.Text = System.IO.Path.GetDirectoryName(textPath.Text);
}
catch { }
} }
Validate();
} }
private void checkCreateDirectory_CheckChanged(object sender, RoutedEventArgs e) private void checkCreateDirectory_CheckChanged(object sender, RoutedEventArgs e)
@ -216,6 +215,44 @@ namespace RainmeterStudio.UI.Dialogs
private void listTemplates_SelectionChanged(object sender, SelectionChangedEventArgs e) private void listTemplates_SelectionChanged(object sender, SelectionChangedEventArgs e)
{ {
Validate();
}
private void buttonCreate_Click(object sender, RoutedEventArgs e)
{
DialogResult = true;
Close();
}
private void buttonCancel_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
Close();
}
private void Window_Closed(object sender, EventArgs e)
{
// Save settings
if (DialogResult.HasValue && DialogResult.Value)
{
// Save recent locations
IEnumerable<string> recentLocations = GetRecentLocations();
if (!recentLocations.Contains(SelectedLocation))
{
if (recentLocations.Count() > 5)
recentLocations = recentLocations.Skip(1);
recentLocations = recentLocations.Append(SelectedLocation);
}
Settings.Default.CreateProjectDialog_RecentLocations = recentLocations.Aggregate((first, second) => first + "|" + second);
// Save location
if (checkLocationDefault.IsChecked.HasValue && checkLocationDefault.IsChecked.Value)
{
Settings.Default.CreateProjectDialog_SavedLocation = SelectedLocation;
}
}
} }
} }
} }

View File

@ -38,6 +38,15 @@
<setting name="MainWindow_Top" serializeAs="String"> <setting name="MainWindow_Top" serializeAs="String">
<value>10</value> <value>10</value>
</setting> </setting>
<setting name="CreateProjectDialog_RecentLocations" serializeAs="String">
<value />
</setting>
<setting name="CreateProjectDialog_SavedLocation" serializeAs="String">
<value />
</setting>
<setting name="CreateProjectDialog_CreateDirectoryCheckbox" serializeAs="String">
<value>True</value>
</setting>
</RainmeterStudio.Properties.Settings> </RainmeterStudio.Properties.Settings>
</userSettings> </userSettings>
</configuration> </configuration>