← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2380: Rework file and folder icons, add one for incomplete dirs

 

------------------------------------------------------------
revno: 2380
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Wed 2011-01-05 21:22:31 +0100
message:
  Rework file and folder icons, add one for incomplete dirs
removed:
  res/folders.bmp
added:
  res/Exec.ico
  res/File.ico
modified:
  changelog.txt
  dwt/include/dwt/resources/ImageList.h
  dwt/src/ImageList.cpp
  help/SConscript
  res/Directory.ico
  win32/DCPlusPlus.rc
  win32/DirectoryListingFrame.cpp
  win32/FinishedFrameBase.h
  win32/QueueFrame.cpp
  win32/QueueFrame.h
  win32/SearchFrame.cpp
  win32/SystemFrame.cpp
  win32/TransferView.cpp
  win32/WinUtil.cpp
  win32/WinUtil.h
  win32/resource.h


--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk

Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'changelog.txt'
--- changelog.txt	2011-01-03 20:11:13 +0000
+++ changelog.txt	2011-01-05 20:22:31 +0000
@@ -64,6 +64,7 @@
 * Ameliorate the MiniUPnPc device selection
 * Prevent an endless loop on connection failure (thanks bigmuscle)
 * More consistent behavior in file lists for back / forward / up, and some buttons (poy)
+* Rework file and folder icons, add one for incomplete dirs (poy)
 
 -- 0.770 2010-07-05 --
 * [L#550300] Catch more potential file corruptions (thanks bigmuscle)

=== modified file 'dwt/include/dwt/resources/ImageList.h'
--- dwt/include/dwt/resources/ImageList.h	2011-01-02 17:12:02 +0000
+++ dwt/include/dwt/resources/ImageList.h	2011-01-05 20:22:31 +0000
@@ -136,10 +136,8 @@
 
 	COLORREF getBkColor() const;
 
-	int size() const;
-
-	/// Deprecated, use size
-	int getImageCount() const;
+	bool empty() const;
+	size_t size() const;
 
 private:
 	friend class Handle<ImageListPolicy>;

=== modified file 'dwt/src/ImageList.cpp'
--- dwt/src/ImageList.cpp	2011-01-02 17:12:02 +0000
+++ dwt/src/ImageList.cpp	2011-01-05 20:22:31 +0000
@@ -105,13 +105,12 @@
 	return Point( x, y );
 }
 
-int ImageList::size() const
-{
-	return ImageList_GetImageCount( handle() );
+bool ImageList::empty() const {
+	return size() == 0;
 }
 
-int ImageList::getImageCount() const {
-	return size();
+size_t ImageList::size() const {
+	return ImageList_GetImageCount(handle());
 }
 
 IconPtr ImageList::getIcon(unsigned i) const {

=== modified file 'help/SConscript'
--- help/SConscript	2011-01-02 17:12:02 +0000
+++ help/SConscript	2011-01-05 20:22:31 +0000
@@ -61,8 +61,6 @@
 	web_files.append('external.png')
 	web_files.append('office11.css')
 	web_files.append('style.css')
-	for file in Glob('#/res/*.bmp'):
-		web_files.append(file)
 	for file in Glob('#/res/*.ico'):
 		web_files.append(file)
 	for file in Glob('#/res/*.png'):
@@ -82,7 +80,6 @@
 CHM_sources.append('office11.css')
 CHM_sources.append('resource.h')
 CHM_sources.append('style.css')
-CHM_sources.append(Glob('#/res/*.bmp'))
 CHM_sources.append(Glob('#/res/*.ico'))
 CHM_sources.append(Glob('#/res/*.png'))
 CHM_sources.sort()

=== modified file 'res/Directory.ico'
Binary files res/Directory.ico	2010-03-11 17:25:17 +0000 and res/Directory.ico	2011-01-05 20:22:31 +0000 differ
=== added file 'res/Exec.ico'
Binary files res/Exec.ico	1970-01-01 00:00:00 +0000 and res/Exec.ico	2011-01-05 20:22:31 +0000 differ
=== added file 'res/File.ico'
Binary files res/File.ico	1970-01-01 00:00:00 +0000 and res/File.ico	2011-01-05 20:22:31 +0000 differ
=== removed file 'res/folders.bmp'
Binary files res/folders.bmp	2005-03-12 13:36:52 +0000 and res/folders.bmp	1970-01-01 00:00:00 +0000 differ
=== modified file 'win32/DCPlusPlus.rc'
--- win32/DCPlusPlus.rc	2011-01-03 21:26:01 +0000
+++ win32/DCPlusPlus.rc	2011-01-05 20:22:31 +0000
@@ -34,13 +34,6 @@
 
 /////////////////////////////////////////////////////////////////////////////
 //
-// Bitmap
-//
-
-IDB_FOLDERS             BITMAP                  "res/folders.bmp"
-
-/////////////////////////////////////////////////////////////////////////////
-//
 // Icon
 //
 
@@ -99,6 +92,8 @@
 IDI_USER_NOSLOT         ICON                    "res/UserNoSlot.ico"
 IDI_USER_OP             ICON                    "res/UserOp.ico"
 IDI_UP                  ICON                    "res/Up.ico"
+IDI_FILE                ICON                    "res/File.ico"
+IDI_EXEC                ICON                    "res/Exec.ico"
 
 /////////////////////////////////////////////////////////////////////////////
 //

=== modified file 'win32/DirectoryListingFrame.cpp'
--- win32/DirectoryListingFrame.cpp	2011-01-03 21:26:01 +0000
+++ win32/DirectoryListingFrame.cpp	2011-01-05 20:22:31 +0000
@@ -54,10 +54,10 @@
 
 int DirectoryListingFrame::ItemInfo::getImage() const {
 	if(type == DIRECTORY || type == USER) {
-		return dir->getComplete() ? WinUtil::getDirIconIndex() : WinUtil::getDirMaskedIndex();
+		return dir->getComplete() ? WinUtil::DIR_ICON : WinUtil::DIR_ICON_INCOMPLETE;
 	}
 
-	return WinUtil::getIconIndex(getText(COLUMN_FILENAME));
+	return WinUtil::getFileIcon(getText(COLUMN_FILENAME));
 }
 
 int DirectoryListingFrame::ItemInfo::compareItems(ItemInfo* a, ItemInfo* b, int col) {

=== modified file 'win32/FinishedFrameBase.h'
--- win32/FinishedFrameBase.h	2011-01-02 17:12:02 +0000
+++ win32/FinishedFrameBase.h	2011-01-05 20:22:31 +0000
@@ -259,7 +259,7 @@
 			return columns[col];
 		}
 		int getImage() const {
-			return WinUtil::getIconIndex(Text::toT(file));
+			return WinUtil::getFileIcon(Text::toT(file));
 		}
 
 		static int compareItems(FileInfo* a, FileInfo* b, int col) {

=== modified file 'win32/QueueFrame.cpp'
--- win32/QueueFrame.cpp	2011-01-02 17:12:02 +0000
+++ win32/QueueFrame.cpp	2011-01-05 20:22:31 +0000
@@ -427,11 +427,11 @@
 }
 
 int QueueFrame::DirItemInfo::getImage() {
-	return WinUtil::getDirIconIndex();
+	return WinUtil::DIR_ICON;
 }
 
 int QueueFrame::DirItemInfo::getSelectedImage() {
-	return WinUtil::getDirIconIndex();
+	return WinUtil::DIR_ICON;
 }
 
 HTREEITEM QueueFrame::addDirectory(const string& dir, bool isFileList /* = false */, HTREEITEM startAt /* = NULL */) {

=== modified file 'win32/QueueFrame.h'
--- win32/QueueFrame.h	2011-01-02 17:12:02 +0000
+++ win32/QueueFrame.h	2011-01-05 20:22:31 +0000
@@ -129,7 +129,7 @@
 		}
 
 		int getImage() const {
-			return WinUtil::getIconIndex(Text::toT(getTarget()));
+			return WinUtil::getFileIcon(Text::toT(getTarget()));
 		}
 
 		static int compareItems(QueueItemInfo* a, QueueItemInfo* b, int col) {

=== modified file 'win32/SearchFrame.cpp'
--- win32/SearchFrame.cpp	2011-01-02 17:12:02 +0000
+++ win32/SearchFrame.cpp	2011-01-05 20:22:31 +0000
@@ -51,7 +51,7 @@
 
 int SearchFrame::SearchInfo::getImage() {
 	const SearchResultPtr& sr = srs[0];
-	return sr->getType() == SearchResult::TYPE_FILE ? WinUtil::getIconIndex(Text::toT(sr->getFile())) : WinUtil::getDirIconIndex();
+	return sr->getType() == SearchResult::TYPE_FILE ? WinUtil::getFileIcon(Text::toT(sr->getFile())) : WinUtil::DIR_ICON;
 }
 
 int SearchFrame::SearchInfo::compareItems(SearchInfo* a, SearchInfo* b, int col) {

=== modified file 'win32/SystemFrame.cpp'
--- win32/SystemFrame.cpp	2011-01-02 17:12:02 +0000
+++ win32/SystemFrame.cpp	2011-01-05 20:22:31 +0000
@@ -97,7 +97,7 @@
 	string path_a = Text::fromT(path);
 	if(File::getSize(path_a) != -1) {
 		ShellMenuPtr menu = addChild(ShellMenu::Seed());
-		menu->setTitle(escapeMenu(path), WinUtil::fileImages->getIcon(WinUtil::getIconIndex(path)));
+		menu->setTitle(escapeMenu(path), WinUtil::fileImages->getIcon(WinUtil::getFileIcon(path)));
 		menu->appendItem(T_("&Open"), std::bind(&WinUtil::openFile, path), dwt::IconPtr(), true, true);
 		menu->appendItem(T_("Open &folder"), std::bind(&WinUtil::openFolder, path));
 		menu->appendShellMenu(StringList(1, path_a));

=== modified file 'win32/TransferView.cpp'
--- win32/TransferView.cpp	2011-01-02 17:12:02 +0000
+++ win32/TransferView.cpp	2011-01-05 20:22:31 +0000
@@ -668,7 +668,7 @@
 }
 
 int TransferView::DownloadInfo::getImage() const {
-	return WinUtil::getIconIndex(Text::toT(path));
+	return WinUtil::getFileIcon(Text::toT(path));
 }
 
 void TransferView::DownloadInfo::update(const TransferView::TickInfo& ti) {

=== modified file 'win32/WinUtil.cpp'
--- win32/WinUtil.cpp	2011-01-03 20:11:13 +0000
+++ win32/WinUtil.cpp	2011-01-05 20:22:31 +0000
@@ -77,9 +77,6 @@
 dwt::FontPtr WinUtil::monoFont;
 dwt::ImageListPtr WinUtil::fileImages;
 dwt::ImageListPtr WinUtil::userImages;
-int WinUtil::fileImageCount;
-int WinUtil::dirIconIndex;
-int WinUtil::dirMaskedIndex;
 TStringList WinUtil::lastDirs;
 MainWindow* WinUtil::mainWindow = 0;
 float WinUtil::dpiFactor = 0;
@@ -138,39 +135,51 @@
 
 	fileImages = dwt::ImageListPtr(new dwt::ImageList(dwt::Point(16, 16)));
 
-	dirIconIndex = fileImageCount++;
-	dirMaskedIndex = fileImageCount++;
-
+	// get the directory icon (DIR_ICON).
 	if(BOOLSETTING(USE_SYSTEM_ICONS)) {
-		SHFILEINFO fi;
-		::SHGetFileInfo(_T("./"), FILE_ATTRIBUTE_DIRECTORY, &fi, sizeof(fi), SHGFI_ICON | SHGFI_SMALLICON
-			| SHGFI_USEFILEATTRIBUTES);
-		dwt::Icon tmp(fi.hIcon);
-		fileImages->add(tmp);
-		// @todo This one should be masked further for the incomplete folder thing
-		fileImages->add(tmp);
-	} else {
-		dwt::Bitmap tmp(IDB_FOLDERS);
-		fileImages->add(tmp, RGB(255, 0, 255));
-
-		// Unknown file
-		fileImageCount++;
-	}
+		::SHFILEINFO info;
+		if(::SHGetFileInfo(_T("./"), FILE_ATTRIBUTE_DIRECTORY, &info, sizeof(info),
+			SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES) && info.hIcon)
+		{
+			dwt::Icon icon(info.hIcon);
+			fileImages->add(icon);
+		}
+	}
+	if(fileImages->empty()) {
+		fileImages->add(*createIcon(IDI_DIRECTORY, 16));
+	}
+
+	// create the incomplete directory icon (DIR_ICON_INCOMPLETE).
+	{
+		vector<dwt::IconPtr> icons;
+		icons.push_back(fileImages->getIcon(DIR_ICON));
+		icons.push_back(createIcon(IDI_EXEC, 16));
+		fileImages->add(*dwt::util::merge(icons));
+	}
+
+	// add the generic file icon (FILE_ICON_GENERIC).
+	fileImages->add(*createIcon(IDI_FILE, 16));
 
 	{
 		userImages = dwt::ImageListPtr(new dwt::ImageList(dwt::Point(16, 16)));
-		auto userIcon = [](unsigned id) { return createIcon(id, 16); };
+
 		const unsigned baseCount = USER_ICON_MOD_START;
 		const unsigned modifierCount = USER_ICON_LAST - USER_ICON_MOD_START;
+
+		auto userIcon = [](unsigned id) { return createIcon(id, 16); };
 		dwt::IconPtr bases[baseCount] = { userIcon(IDI_USER), userIcon(IDI_USER_AWAY), userIcon(IDI_USER_BOT) };
 		dwt::IconPtr modifiers[modifierCount] = { userIcon(IDI_USER_NOCON), userIcon(IDI_USER_NOSLOT), userIcon(IDI_USER_OP) };
+
 		for(size_t iBase = 0; iBase < baseCount; ++iBase) {
 			for(size_t i = 0, n = modifierCount * modifierCount; i < n; ++i) {
 				vector<dwt::IconPtr> icons;
+
 				icons.push_back(bases[iBase]);
+
 				for(size_t iMod = 0; iMod < modifierCount; ++iMod)
 					if(i & (1 << iMod))
 						icons.push_back(modifiers[iMod]);
+
 				userImages->add(*dwt::util::merge(icons));
 			}
 		}
@@ -606,33 +615,30 @@
 	return formatHubNames(ClientManager::getInstance()->getHubNames(cid, hintUrl, priv));
 }
 
-int WinUtil::getIconIndex(const tstring& aFileName) {
+size_t WinUtil::getFileIcon(const tstring& aFileName) {
 	if(BOOLSETTING(USE_SYSTEM_ICONS)) {
-		SHFILEINFO fi;
-		string x = Text::toLower(Util::getFileExt(Text::fromT(aFileName)));
-		if(!x.empty()) {
-			ImageIter j = fileIndexes.find(x);
-			if(j != fileIndexes.end())
-				return j->second;
-		}
-		tstring fn = Text::toT(Text::toLower(Util::getFileName(Text::fromT(aFileName))));
-		::SHGetFileInfo(fn.c_str(), FILE_ATTRIBUTE_NORMAL, &fi, sizeof(fi), SHGFI_ICON | SHGFI_SMALLICON
-			| SHGFI_USEFILEATTRIBUTES);
-		if(!fi.hIcon) {
-			return 2;
-		}
-		try {
-			dwt::Icon tmp(fi.hIcon);
-			fileImages->add(tmp);
-
-			fileIndexes[x] = fileImageCount++;
-			return fileImageCount - 1;
-		} catch (const dwt::DWTException&) {
-			return 2;
-		}
-	} else {
-		return 2;
+		string ext = Text::toLower(Util::getFileExt(Text::fromT(aFileName)));
+		if(!ext.empty()) {
+			auto index = fileIndexes.find(ext);
+			if(index != fileIndexes.end())
+				return index->second;
+		}
+
+		::SHFILEINFO info;
+		if(::SHGetFileInfo(Text::toT(Text::toLower(Util::getFileName(Text::fromT(aFileName)))).c_str(), FILE_ATTRIBUTE_NORMAL,
+			&info, sizeof(info), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES) && info.hIcon)
+		{
+			size_t ret = fileImages->size();
+			fileIndexes[ext] = ret;
+
+			dwt::Icon icon(info.hIcon);
+			fileImages->add(icon);
+
+			return ret;
+		}
 	}
+
+	return FILE_ICON_GENERIC;
 }
 
 void WinUtil::reducePaths(string& message) {

=== modified file 'win32/WinUtil.h'
--- win32/WinUtil.h	2011-01-03 20:11:13 +0000
+++ win32/WinUtil.h	2011-01-05 20:22:31 +0000
@@ -48,6 +48,15 @@
 
 class WinUtil {
 public:
+	// pre-defined icon indexes used by the "fileImages" image list - see also getFileIcon.
+	enum {
+		DIR_ICON,
+		DIR_ICON_INCOMPLETE,
+
+		FILE_ICON_GENERIC
+	};
+
+	// icon indexes to use with the "userImages" image list.
 	enum {
 		// base icons
 		USER_ICON,
@@ -73,15 +82,12 @@
 	static tstring commands;
 	static dwt::ImageListPtr fileImages;
 	static dwt::ImageListPtr userImages;
-	static int fileImageCount;
-	static int dirIconIndex;
-	static int dirMaskedIndex;
 	static TStringList lastDirs;
 	static MainWindow* mainWindow;
 	//static dwt::TabView* mdiParent;
 	static float dpiFactor;
 
-	typedef unordered_map<string, int> ImageMap;
+	typedef unordered_map<string, size_t> ImageMap;
 	typedef ImageMap::iterator ImageIter;
 	static ImageMap fileIndexes;
 
@@ -171,9 +177,7 @@
 		const dwt::Application::Callback& f_ok,
 		const dwt::Application::Callback& f_cancel);
 
-	static int getIconIndex(const tstring& aFileName);
-	static int getDirIconIndex() { return dirIconIndex; }
-	static int getDirMaskedIndex() { return dirMaskedIndex; }
+	static size_t getFileIcon(const tstring& aFileName);
 
 	static bool isShift() { return (::GetKeyState(VK_SHIFT) & 0x8000) > 0; }
 	static bool isAlt() { return (::GetKeyState(VK_MENU) & 0x8000) > 0; }

=== modified file 'win32/resource.h'
--- win32/resource.h	2011-01-03 20:11:13 +0000
+++ win32/resource.h	2011-01-05 20:22:31 +0000
@@ -58,6 +58,8 @@
 #define IDI_USER_NOSLOT 150
 #define IDI_USER_OP 151
 #define IDI_UP 152
+#define IDI_FILE 153
+#define IDI_EXEC 154
 
 #define IDB_FOLDERS 200