Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Added GosuEx::FileDialogs.

Apparently only for Windows XP, Vista and 7, FileDialogs supports "Open File.." and "Save File.." dialogs, including filters, predefined filenames and for Vista/7 the new file dialogs.
  • Loading branch information...
commit ad0bf199011231d8464babb4a82d522490ad42c7 1 parent aad5b1d
authored July 17, 2010
12  FileDialogs/AutoLink.hpp
... ...
@@ -0,0 +1,12 @@
7  FileDialogs/FileDialogs.cpp
... ...
@@ -0,0 +1,7 @@
  1
+#include "FileDialogs.hpp"
  2
+
  3
+using namespace GosuEx;
  4
+
  5
+FileDialogs::Filter::Filter(const std::wstring& name, const std::wstring& pattern) { this->name = name; this->pattern = pattern; }
  6
+
  7
+FileDialogs::FilterList& FileDialogs::FilterList::operator%(Filter& filter) { filters.push_back(filter); return *this; }
50  FileDialogs/FileDialogs.hpp
... ...
@@ -0,0 +1,50 @@
  1
+#ifndef GOSUEX_FILEDIALOGS_FILEDIALOGS_HPP
  2
+#define GOSUEX_FILEDIALOGS_FILEDIALOGS_HPP
  3
+
  4
+#include <GosuEx/FileDialogs/Fwd.hpp>
  5
+#include <Gosu/Fwd.hpp>
  6
+
  7
+#include <string>
  8
+#include <vector>
  9
+
  10
+namespace GosuEx {
  11
+	namespace FileDialogs {
  12
+
  13
+		// Filters are used to specify allowed file types.
  14
+		struct Filter {
  15
+			std::wstring name, pattern;
  16
+			Filter(const std::wstring& name, const std::wstring& pattern);
  17
+		};
  18
+
  19
+
  20
+		// A filterlist is a list of filters that can be passed to open/save dialogs.
  21
+		// You can use it like that: FilterList() % Filter(L"All Files", L"*.*") % Filter(L"Images", L"*.png;*.jpg;*.jpeg").
  22
+		struct FilterList {
  23
+			std::vector<Filter> filters;
  24
+			FilterList& operator%(Filter& filter);
  25
+		};
  26
+
  27
+		// This is the "parent" of all dialogs.
  28
+		class FileDialog {
  29
+		public:
  30
+			virtual void setFilename(const std::wstring& name) = 0;
  31
+		};
  32
+
  33
+		// Parent of all "Open File..." dialogs.
  34
+		class OpenFileDialog : public FileDialog {
  35
+		public:
  36
+			virtual std::wstring open() = 0;
  37
+		};
  38
+
  39
+		// Parent of all "Save File..." dialogs.
  40
+		class SaveFileDialog : public FileDialog {
  41
+		public:
  42
+			virtual std::wstring save() = 0;
  43
+		};
  44
+
  45
+		// Just call these.
  46
+		OpenFileDialog* getOpenFileDialog(Gosu::Window& win, const std::wstring& initialdir = L"", const std::wstring& title = L"", FilterList& filters = FilterList());
  47
+		SaveFileDialog* getSaveFileDialog(Gosu::Window& win, const std::wstring& initialdir = L"", const std::wstring& title = L"", FilterList& filters = FilterList());
  48
+	}
  49
+}
  50
+#endif
94  FileDialogs/FileDialogs.vcxproj
... ...
@@ -0,0 +1,94 @@
  1
+<?xml version="1.0" encoding="utf-8"?>
  2
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  3
+  <ItemGroup Label="ProjectConfigurations">
  4
+    <ProjectConfiguration Include="Debug|Win32">
  5
+      <Configuration>Debug</Configuration>
  6
+      <Platform>Win32</Platform>
  7
+    </ProjectConfiguration>
  8
+    <ProjectConfiguration Include="Release|Win32">
  9
+      <Configuration>Release</Configuration>
  10
+      <Platform>Win32</Platform>
  11
+    </ProjectConfiguration>
  12
+  </ItemGroup>
  13
+  <ItemGroup>
  14
+    <ClInclude Include="AutoLink.hpp" />
  15
+    <ClInclude Include="FileDialogs.hpp" />
  16
+    <ClInclude Include="FileDialogsWin.hpp" />
  17
+    <ClInclude Include="Fwd.hpp" />
  18
+  </ItemGroup>
  19
+  <ItemGroup>
  20
+    <ClCompile Include="FileDialogs.cpp" />
  21
+    <ClCompile Include="FileDialogsWin.cpp" />
  22
+  </ItemGroup>
  23
+  <PropertyGroup Label="Globals">
  24
+    <ProjectGuid>{D7FF49B7-DBCC-4248-8759-D42A1CC67F1A}</ProjectGuid>
  25
+    <Keyword>Win32Proj</Keyword>
  26
+    <RootNamespace>FileDialogs</RootNamespace>
  27
+  </PropertyGroup>
  28
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  29
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
  30
+    <ConfigurationType>StaticLibrary</ConfigurationType>
  31
+    <UseDebugLibraries>true</UseDebugLibraries>
  32
+    <CharacterSet>Unicode</CharacterSet>
  33
+  </PropertyGroup>
  34
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
  35
+    <ConfigurationType>StaticLibrary</ConfigurationType>
  36
+    <UseDebugLibraries>false</UseDebugLibraries>
  37
+    <WholeProgramOptimization>true</WholeProgramOptimization>
  38
+    <CharacterSet>Unicode</CharacterSet>
  39
+  </PropertyGroup>
  40
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  41
+  <ImportGroup Label="ExtensionSettings">
  42
+  </ImportGroup>
  43
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
  44
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  45
+  </ImportGroup>
  46
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
  47
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  48
+  </ImportGroup>
  49
+  <PropertyGroup Label="UserMacros" />
  50
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
  51
+    <OutDir>$(ProjectDir)..\lib\</OutDir>
  52
+  </PropertyGroup>
  53
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
  54
+    <OutDir>$(ProjectDir)..\lib\</OutDir>
  55
+  </PropertyGroup>
  56
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
  57
+    <TargetName>$(ProjectName)Debug</TargetName>
  58
+  </PropertyGroup>
  59
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
  60
+    <ClCompile>
  61
+      <PrecompiledHeader>
  62
+      </PrecompiledHeader>
  63
+      <WarningLevel>Level3</WarningLevel>
  64
+      <Optimization>Disabled</Optimization>
  65
+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  66
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
  67
+    </ClCompile>
  68
+    <Link>
  69
+      <SubSystem>Windows</SubSystem>
  70
+      <GenerateDebugInformation>true</GenerateDebugInformation>
  71
+    </Link>
  72
+  </ItemDefinitionGroup>
  73
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
  74
+    <ClCompile>
  75
+      <WarningLevel>Level3</WarningLevel>
  76
+      <PrecompiledHeader>
  77
+      </PrecompiledHeader>
  78
+      <Optimization>MaxSpeed</Optimization>
  79
+      <FunctionLevelLinking>true</FunctionLevelLinking>
  80
+      <IntrinsicFunctions>true</IntrinsicFunctions>
  81
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  82
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
  83
+    </ClCompile>
  84
+    <Link>
  85
+      <SubSystem>Windows</SubSystem>
  86
+      <GenerateDebugInformation>true</GenerateDebugInformation>
  87
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
  88
+      <OptimizeReferences>true</OptimizeReferences>
  89
+    </Link>
  90
+  </ItemDefinitionGroup>
  91
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  92
+  <ImportGroup Label="ExtensionTargets">
  93
+  </ImportGroup>
  94
+</Project>
39  FileDialogs/FileDialogs.vcxproj.filters
... ...
@@ -0,0 +1,39 @@
  1
+<?xml version="1.0" encoding="utf-8"?>
  2
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  3
+  <ItemGroup>
  4
+    <Filter Include="Source Files">
  5
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
  6
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
  7
+    </Filter>
  8
+    <Filter Include="Header Files">
  9
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
  10
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
  11
+    </Filter>
  12
+    <Filter Include="Resource Files">
  13
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
  14
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
  15
+    </Filter>
  16
+  </ItemGroup>
  17
+  <ItemGroup>
  18
+    <ClInclude Include="Fwd.hpp">
  19
+      <Filter>Header Files</Filter>
  20
+    </ClInclude>
  21
+    <ClInclude Include="FileDialogsWin.hpp">
  22
+      <Filter>Header Files</Filter>
  23
+    </ClInclude>
  24
+    <ClInclude Include="FileDialogs.hpp">
  25
+      <Filter>Header Files</Filter>
  26
+    </ClInclude>
  27
+    <ClInclude Include="AutoLink.hpp">
  28
+      <Filter>Header Files</Filter>
  29
+    </ClInclude>
  30
+  </ItemGroup>
  31
+  <ItemGroup>
  32
+    <ClCompile Include="FileDialogsWin.cpp">
  33
+      <Filter>Source Files</Filter>
  34
+    </ClCompile>
  35
+    <ClCompile Include="FileDialogs.cpp">
  36
+      <Filter>Source Files</Filter>
  37
+    </ClCompile>
  38
+  </ItemGroup>
  39
+</Project>
56  FileDialogs/FileDialogsWin.cpp
... ...
@@ -0,0 +1,56 @@
  1
+#include "FileDialogsWin.hpp"
  2
+
  3
+using namespace GosuEx;
  4
+
  5
+// Statics for W7
  6
+template<typename T> HMODULE GosuEx::FileDialogs::FileDialog7<T>::ShellDLL = NULL;
  7
+template<typename T> HRESULT(WINAPI* GosuEx::FileDialogs::FileDialog7<T>::SHCIFPN)(PCWSTR, IBindCtx*, REFIID, void**);
  8
+
  9
+// XP
  10
+FileDialogs::OpenFileDialogXP::OpenFileDialogXP(Gosu::Window& win, const std::wstring& initialdir, const std::wstring& title, FilterList& filters): FileDialogXP<OpenFileDialog>(win, initialdir, title, filters) {}
  11
+
  12
+std::wstring FileDialogs::OpenFileDialogXP::open() {
  13
+	if (GetOpenFileName(&this->p))
  14
+		return this->filename;
  15
+	return L"";
  16
+}
  17
+
  18
+FileDialogs::SaveFileDialogXP::SaveFileDialogXP(Gosu::Window& win, const std::wstring& initialdir, const std::wstring& title, FilterList& filters): FileDialogXP<SaveFileDialog>(win, initialdir, title, filters) {}
  19
+
  20
+std::wstring FileDialogs::SaveFileDialogXP::save() {
  21
+	if (GetSaveFileName(&this->p))
  22
+		return this->filename;
  23
+	return L"";
  24
+}
  25
+
  26
+// Win7
  27
+FileDialogs::OpenFileDialog7::OpenFileDialog7(Gosu::Window& win, const std::wstring& initialdir, const std::wstring& title, FilterList& filters): FileDialog7<OpenFileDialog>(CLSID_FileOpenDialog, win, initialdir, title, filters) {}
  28
+
  29
+std::wstring FileDialogs::OpenFileDialog7::open() {
  30
+	return _result();
  31
+}
  32
+
  33
+FileDialogs::SaveFileDialog7::SaveFileDialog7(Gosu::Window& win, const std::wstring& initialdir, const std::wstring& title, FilterList& filters): FileDialog7<SaveFileDialog>(CLSID_FileSaveDialog, win, initialdir, title, filters) {}
  34
+
  35
+std::wstring FileDialogs::SaveFileDialog7::save() {
  36
+	return _result();
  37
+}
  38
+
  39
+// Determinate whether or not to use the new dialogs
  40
+bool FileDialogs::useNewDialogs() {
  41
+	return GetProcAddress(LoadLibrary(L"Shell32.dll"), "SHCreateItemFromParsingName") != NULL;
  42
+}
  43
+
  44
+// And the functions to get the dialogs
  45
+FileDialogs::OpenFileDialog* FileDialogs::getOpenFileDialog(Gosu::Window& win, const std::wstring& initialdir, const std::wstring& title, FilterList& filters) {
  46
+	if (useNewDialogs())
  47
+		return new OpenFileDialog7(win, initialdir, title, filters);
  48
+	return new OpenFileDialogXP(win, initialdir, title, filters);
  49
+}
  50
+
  51
+FileDialogs::SaveFileDialog* FileDialogs::getSaveFileDialog(Gosu::Window& win, const std::wstring& initialdir, const std::wstring& title, FilterList& filters) {
  52
+	if (useNewDialogs())
  53
+		return new SaveFileDialog7(win, initialdir, title, filters);
  54
+	else
  55
+		return new SaveFileDialogXP(win, initialdir, title, filters);
  56
+}
185  FileDialogs/FileDialogsWin.hpp
... ...
@@ -0,0 +1,185 @@
  1
+#ifndef GOSUEX_FILEDIALOGS_FILEDIALOGSWIN_HPP
  2
+#define GOSUEX_FILEDIALOGS_FILEDIALOGSWIN_HPP
  3
+
  4
+#include <GosuEx/FileDialogs/FileDialogs.hpp>
  5
+
  6
+// Only in Kenya..  Err, I mean on Windows.
  7
+#ifdef _WIN32
  8
+#	include <Windows.h>
  9
+# include <stdio.h>
  10
+# include <ShObjIdl.h>
  11
+# include <Gosu/Window.hpp>
  12
+# include <boost/foreach.hpp>
  13
+
  14
+namespace GosuEx {
  15
+	namespace FileDialogs {
  16
+
  17
+		// File Dialogs for XP, maybe lower.
  18
+
  19
+		// Parent.
  20
+		template<typename T> class FileDialogXP : public T {
  21
+		protected:
  22
+			OPENFILENAME p; // "Handle"
  23
+			std::wstring filename, initdir, title, filterStr; // Saved because.. I do not want any possible access violations.
  24
+
  25
+			FileDialogXP(Gosu::Window& window, const std::wstring& initialdir, const std::wstring& title, FilterList& filters) {
  26
+				this->initdir = initialdir;
  27
+				this->title = title;
  28
+				this->filename.resize(MAX_PATH);
  29
+				ZeroMemory(&this->p, sizeof(OPENFILENAME));
  30
+				this->p.lStructSize = sizeof(OPENFILENAME);
  31
+				this->p.hwndOwner = window.handle();
  32
+				this->p.hInstance = NULL;
  33
+				this->p.lpstrCustomFilter = NULL;
  34
+				this->p.nMaxCustFilter = NULL;
  35
+				this->p.lpstrFile = &filename[0];
  36
+				this->p.nMaxFile = filename.size();
  37
+				this->p.lpstrFileTitle = NULL;
  38
+				this->p.nMaxFileTitle = 0;
  39
+				this->p.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
  40
+				this->p.lpstrDefExt = 0;
  41
+
  42
+				if (filters.filters.size()) {
  43
+					BOOST_FOREACH(const Filter& filter, filters.filters) {
  44
+						this->filterStr.append(filter.name);
  45
+						this->filterStr.append(L"\0", 1);
  46
+						this->filterStr.append(filter.pattern);
  47
+						this->filterStr.append(L"\0", 1);
  48
+					}
  49
+					this->filterStr.append(L"\0", 1);
  50
+					this->p.lpstrFilter = &filterStr[0]; // evil voodooo magic, but apparently, it works fine.
  51
+				}
  52
+				else
  53
+					this->p.lpstrFilter = NULL;
  54
+				
  55
+				if (this->title.length())
  56
+					this->p.lpstrTitle = &this->title[0];
  57
+				else
  58
+					this->p.lpstrTitle = NULL;
  59
+			}
  60
+
  61
+			virtual void setFilename(const std::wstring& filename) {
  62
+				this->filename = filename;
  63
+				this->filename.resize(MAX_PATH);
  64
+				this->p.lpstrFile = &this->filename[0];
  65
+				this->p.nMaxFile = this->filename.size();
  66
+			}
  67
+		};
  68
+		
  69
+		// Open File under XP
  70
+		class OpenFileDialogXP : public FileDialogXP<OpenFileDialog> {
  71
+		public:
  72
+			OpenFileDialogXP(Gosu::Window& win, const std::wstring& initialdir, const std::wstring& title, FilterList& filters);
  73
+
  74
+			virtual std::wstring open();
  75
+		};
  76
+
  77
+		// Save a file under XP
  78
+		class SaveFileDialogXP : public FileDialogXP<SaveFileDialog> {
  79
+		public:
  80
+			SaveFileDialogXP(Gosu::Window& win, const std::wstring& initialdir, const std::wstring& title, FilterList& filters);
  81
+
  82
+			virtual std::wstring save();
  83
+		};
  84
+
  85
+
  86
+		// File Dialogs for Windows Vista, 7, maybe newer.
  87
+
  88
+		// Parent
  89
+		template<typename T> class FileDialog7 : public T {
  90
+		protected:
  91
+			IFileDialog* pfd;
  92
+			HRESULT hr;
  93
+			HWND handle;
  94
+			std::wstring title, filename;
  95
+			IShellItem* initialdir;
  96
+			std::vector<COMDLG_FILTERSPEC> rgSpec;
  97
+			FilterList filters;
  98
+			static HMODULE ShellDLL;
  99
+			static HRESULT(WINAPI* SHCIFPN)(PCWSTR, IBindCtx*, REFIID, void**);
  100
+
  101
+			FileDialog7(const IID& id, Gosu::Window& win, const std::wstring& initialdir, const std::wstring& title, FilterList& filters) {
  102
+				if (FileDialog7::ShellDLL == NULL) {
  103
+					CoInitialize(NULL);
  104
+					FileDialog7::ShellDLL = LoadLibrary(L"Shell32.dll");
  105
+					(FARPROC&)FileDialog7::SHCIFPN = GetProcAddress(FileDialog7::ShellDLL, "SHCreateItemFromParsingName");
  106
+				}
  107
+
  108
+				this->handle = win.handle();
  109
+				this->title = title;
  110
+				this->filters = filters;
  111
+				this->hr = FileDialog7::SHCIFPN(initialdir.c_str(), NULL, IID_PPV_ARGS(&this->initialdir));
  112
+				if (!SUCCEEDED(hr))
  113
+					throw std::runtime_error("FileDialog7: cannot parse name");
  114
+
  115
+				this->hr = CoCreateInstance(id, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&this->pfd));
  116
+				if (!SUCCEEDED(this->hr))
  117
+					throw std::runtime_error("FileDialog7: Unable to create CoInstance");
  118
+
  119
+				this->pfd->SetTitle(&this->title[0]);
  120
+				this->pfd->SetFolder(this->initialdir);
  121
+				if (this->filters.filters.size()) {
  122
+					this->rgSpec.reserve(this->filters.filters.size());
  123
+					BOOST_FOREACH(const Filter& filter, this->filters.filters) {
  124
+						COMDLG_FILTERSPEC sp;
  125
+						sp.pszName = filter.name.c_str();
  126
+						sp.pszSpec = filter.pattern.c_str();
  127
+						this->rgSpec.push_back(sp);
  128
+					}
  129
+					pfd->SetFileTypes(this->rgSpec.size(), &this->rgSpec[0]);
  130
+				}
  131
+			}
  132
+		public:
  133
+			~FileDialog7() {
  134
+				this->pfd->Release();
  135
+				this->initialdir->Release();
  136
+			}
  137
+
  138
+			virtual void setFilename(const std::wstring& filename) {
  139
+				this->filename = filename;
  140
+				this->pfd->SetFileName(this->filename.c_str());
  141
+			}
  142
+
  143
+		protected:
  144
+			// Used to get the result
  145
+			// since this is the same on save and open
  146
+			std::wstring _result() {
  147
+				this->hr = pfd->Show(handle);
  148
+				if (!SUCCEEDED(this->hr)) // Either it did not work, or the user aborted
  149
+					return L"";
  150
+
  151
+				IShellItem *psiResult;
  152
+				this->hr = pfd->GetResult(&psiResult);
  153
+
  154
+				if (!SUCCEEDED(this->hr))
  155
+					return L"";
  156
+
  157
+				wchar_t *filename;
  158
+				psiResult->GetDisplayName(SIGDN_FILESYSPATH, &filename);
  159
+				std::wstring result(filename);
  160
+				psiResult->Release();
  161
+				CoTaskMemFree(filename);
  162
+				return result;
  163
+			}
  164
+		};
  165
+
  166
+		// Open
  167
+		class OpenFileDialog7 : public FileDialog7<OpenFileDialog> {
  168
+		public:
  169
+			OpenFileDialog7(Gosu::Window& win, const std::wstring& initialdir, const std::wstring& title, FilterList& filters);
  170
+
  171
+			virtual std::wstring open();
  172
+		};
  173
+
  174
+		class SaveFileDialog7 : public FileDialog7<SaveFileDialog> { 
  175
+		public:
  176
+			SaveFileDialog7(Gosu::Window& win, const std::wstring& initialdir, const std::wstring& title, FilterList& filters);
  177
+			
  178
+			virtual std::wstring save();
  179
+		};
  180
+
  181
+		bool useNewDialogs();
  182
+	}
  183
+}
  184
+#	endif
  185
+#endif
12  GosuEx_VS100.sln
@@ -3,12 +3,12 @@ Microsoft Visual Studio Solution File, Format Version 11.00
3 3
 # Visual C++ Express 2010
4 4
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Data", "Data\Data_VS100.vcxproj", "{B2FAD7C7-2C6A-4E03-964C-AA2CDE5C2029}"
5 5
 EndProject
6  
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FpsCounter", "FpsCounter\FpsCounter_VS100.vcxproj", "{CB168722-F0FB-46B5-87F0-3AB954C11320}"
7  
-EndProject
8 6
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Shader", "Shader\Shader_VS100.vcxproj", "{690AB793-BA3F-43ED-9887-62FB54CF21D0}"
9 7
 EndProject
10 8
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Frames", "Frames\Frames.vcxproj", "{0A206042-1213-4EFB-AF48-1627AF72629E}"
11 9
 EndProject
  10
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FileDialogs", "FileDialogs\FileDialogs.vcxproj", "{D7FF49B7-DBCC-4248-8759-D42A1CC67F1A}"
  11
+EndProject
12 12
 Global
13 13
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
14 14
 		Debug|Win32 = Debug|Win32
@@ -19,10 +19,6 @@ Global
19 19
 		{B2FAD7C7-2C6A-4E03-964C-AA2CDE5C2029}.Debug|Win32.Build.0 = Debug|Win32
20 20
 		{B2FAD7C7-2C6A-4E03-964C-AA2CDE5C2029}.Release|Win32.ActiveCfg = Release|Win32
21 21
 		{B2FAD7C7-2C6A-4E03-964C-AA2CDE5C2029}.Release|Win32.Build.0 = Release|Win32
22  
-		{CB168722-F0FB-46B5-87F0-3AB954C11320}.Debug|Win32.ActiveCfg = Debug|Win32
23  
-		{CB168722-F0FB-46B5-87F0-3AB954C11320}.Debug|Win32.Build.0 = Debug|Win32
24  
-		{CB168722-F0FB-46B5-87F0-3AB954C11320}.Release|Win32.ActiveCfg = Release|Win32
25  
-		{CB168722-F0FB-46B5-87F0-3AB954C11320}.Release|Win32.Build.0 = Release|Win32
26 22
 		{690AB793-BA3F-43ED-9887-62FB54CF21D0}.Debug|Win32.ActiveCfg = Debug|Win32
27 23
 		{690AB793-BA3F-43ED-9887-62FB54CF21D0}.Debug|Win32.Build.0 = Debug|Win32
28 24
 		{690AB793-BA3F-43ED-9887-62FB54CF21D0}.Release|Win32.ActiveCfg = Release|Win32
@@ -31,6 +27,10 @@ Global
31 27
 		{0A206042-1213-4EFB-AF48-1627AF72629E}.Debug|Win32.Build.0 = Debug|Win32
32 28
 		{0A206042-1213-4EFB-AF48-1627AF72629E}.Release|Win32.ActiveCfg = Release|Win32
33 29
 		{0A206042-1213-4EFB-AF48-1627AF72629E}.Release|Win32.Build.0 = Release|Win32
  30
+		{D7FF49B7-DBCC-4248-8759-D42A1CC67F1A}.Debug|Win32.ActiveCfg = Debug|Win32
  31
+		{D7FF49B7-DBCC-4248-8759-D42A1CC67F1A}.Debug|Win32.Build.0 = Debug|Win32
  32
+		{D7FF49B7-DBCC-4248-8759-D42A1CC67F1A}.Release|Win32.ActiveCfg = Release|Win32
  33
+		{D7FF49B7-DBCC-4248-8759-D42A1CC67F1A}.Release|Win32.Build.0 = Release|Win32
34 34
 	EndGlobalSection
35 35
 	GlobalSection(SolutionProperties) = preSolution
36 36
 		HideSolutionNode = FALSE
2  README.md
Source Rendered
@@ -7,6 +7,8 @@ EXTENSIONS
7 7
 <dd>Easy to use FPS counter class. Header-only.</dd>
8 8
 <dt>Shader</dt>
9 9
 <dd>Provides simple ways to load, run and debug shaders with gosu. Header-only</dd>
  10
+<dt>FileDialogs</dt>
  11
+<dd>As of now only supported for Windows XP, Vista and 7, FileDialogs provide "Open File..." and "Save File..." dialogs. Library.</dd>
10 12
 <dt>Frames</dt>
11 13
 <dd>Widgets that can be used to build an user interface pretty fast and pretty easy in Gosu. Library.</dd>
12 14
 </dl>

0 notes on commit ad0bf19

Please sign in to comment.
Something went wrong with that request. Please try again.