← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 3044: Remember list sorting & splitter positions

 

------------------------------------------------------------
revno: 3044
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Tue 2012-09-11 00:14:27 +0200
message:
  Remember list sorting & splitter positions
modified:
  changelog.txt
  dcpp/SettingsManager.cpp
  dcpp/SettingsManager.h
  win32/ADLSearchFrame.cpp
  win32/DirectoryListingFrame.cpp
  win32/DirectoryListingFrame.h
  win32/FinishedFrameBase.h
  win32/HubFrame.cpp
  win32/PublicHubsFrame.cpp
  win32/QueueFrame.cpp
  win32/SearchFrame.cpp
  win32/TransferView.cpp
  win32/UsersFrame.cpp
  win32/UsersFrame.h
  win32/WinUtil.cpp
  win32/WinUtil.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	2012-09-04 17:58:06 +0000
+++ changelog.txt	2012-09-10 22:14:27 +0000
@@ -37,6 +37,7 @@
 * Update Boost to version 1.51
 * Merge 2 identical active mode settings (poy)
 * Fix NAT-PMP renewal (poy)
+* [L#226968] Remember list sorting & splitter positions (poy)
 
 -- 0.799 2012-05-05 --
 * Add icons (iceman50)

=== modified file 'dcpp/SettingsManager.cpp'
--- dcpp/SettingsManager.cpp	2012-09-09 14:31:02 +0000
+++ dcpp/SettingsManager.cpp	2012-09-10 22:14:27 +0000
@@ -67,6 +67,10 @@
 	"AutoDropInterval", "AutoDropElapsed", "AutoDropInactivity", "AutoDropMinSources",
 	"AutoDropFilesize",
 	"BalloonMainChat", "BalloonPM", "BalloonPMWindow", "BalloonFinishedDL", "BalloonFinishedFL",
+	"ADLSearchFrameSort", "ConnectionsSort", "DirectoryListingFrameSort", "DownloadsSort",
+	"FinishedDLFilesSort", "FinishedDLUsersSort", "FinishedULFilesSort",
+	"FinishedULUsersSort", "HubFrameSort", "PublicHubsFrameSort", "QueueFrameSort",
+	"SearchFrameSort", "UsersFrameSort",
 	"AwayIdle", "AutoRefreshTime", "AutoSearchLimit", "BufferSize", "DownloadSlots",
 	"HubLastLogLines", "MagnetAction", "MaxCommandLength", "MaxCompression", "MaxDownloadSpeed",
 	"MaxFilelistSize", "MaxHashSpeed", "MaxMessageLines", "MaxPMWindows", "MinMessageLines",
@@ -101,7 +105,8 @@
 	"TotalUpload", "TotalDownload",
 	"SENTRY",
 	// Floats
-	"TransfersPanedPos", "QueuePanedPos", "SearchPanedPos",
+	"FileListPanedPos", "HubPanedPos", "QueuePanedPos", "SearchPanedPos",
+	"TransfersPanedPos", "UsersPanedPos",
 	"SENTRY"
 };
 
@@ -304,9 +309,12 @@
 	setDefault(TOOLBAR_SIZE, 20);
 	setDefault(TAB_WIDTH, 150);
 	setDefault(TAB_STYLE, TAB_STYLE_OD | TAB_STYLE_BROWSER);
-	setDefault(TRANSFERS_PANED_POS, .7);
+	setDefault(FILE_LIST_PANED_POS, .3);
+	setDefault(HUB_PANED_POS, .7);
 	setDefault(QUEUE_PANED_POS, .3);
 	setDefault(SEARCH_PANED_POS, .2);
+	setDefault(TRANSFERS_PANED_POS, .7);
+	setDefault(USERS_PANED_POS, .7);
 	setDefault(KEEP_FINISHED_FILES, false);
 	setDefault(MIN_MESSAGE_LINES, 1);
 	setDefault(MAX_MESSAGE_LINES, 10);

=== modified file 'dcpp/SettingsManager.h'
--- dcpp/SettingsManager.h	2012-09-03 19:14:25 +0000
+++ dcpp/SettingsManager.h	2012-09-10 22:14:27 +0000
@@ -100,6 +100,11 @@
 
 		BALLOON_MAIN_CHAT, BALLOON_PM, BALLOON_PM_WINDOW, BALLOON_FINISHED_DL, BALLOON_FINISHED_FL,
 
+		ADLSEARCHFRAME_SORT, CONNECTIONS_SORT, DIRECTORYLISTINGFRAME_SORT, DOWNLOADS_SORT,
+		FINISHED_DL_FILES_SORT, FINISHED_DL_USERS_SORT, FINISHED_UL_FILES_SORT,
+		FINISHED_UL_USERS_SORT, HUBFRAME_SORT, PUBLICHUBSFRAME_SORT, QUEUEFRAME_SORT,
+		SEARCHFRAME_SORT, USERSFRAME_SORT,
+
 		// uncategorized
 		AWAY_IDLE, AUTO_REFRESH_TIME, AUTO_SEARCH_LIMIT, BUFFER_SIZE, DOWNLOAD_SLOTS,
 		HUB_LAST_LOG_LINES, MAGNET_ACTION, MAX_COMMAND_LENGTH, MAX_COMPRESSION, MAX_DOWNLOAD_SPEED,
@@ -138,8 +143,9 @@
 		TOTAL_UPLOAD = INT64_FIRST, TOTAL_DOWNLOAD,
 		INT64_LAST };
 
-	enum FloatSetting { FLOAT_FIRST = INT64_LAST +1,
-		TRANSFERS_PANED_POS = FLOAT_FIRST, QUEUE_PANED_POS, SEARCH_PANED_POS,
+	enum FloatSetting { FLOAT_FIRST = INT64_LAST + 1,
+		FILE_LIST_PANED_POS = FLOAT_FIRST, HUB_PANED_POS, QUEUE_PANED_POS, SEARCH_PANED_POS,
+		TRANSFERS_PANED_POS, USERS_PANED_POS,
 		FLOAT_LAST, SETTINGS_LAST = FLOAT_LAST };
 
 	enum { INCOMING_ACTIVE, INCOMING_ACTIVE_UPNP, INCOMING_PASSIVE };

=== modified file 'win32/ADLSearchFrame.cpp'
--- win32/ADLSearchFrame.cpp	2012-06-21 18:52:47 +0000
+++ win32/ADLSearchFrame.cpp	2012-09-10 22:14:27 +0000
@@ -66,6 +66,7 @@
 
 	{
 		auto cs = WinUtil::Seeds::table;
+		cs.style |= LVS_NOSORTHEADER;
 		cs.lvStyle |= LVS_EX_CHECKBOXES;
 		items = grid->addChild(cs);
 		grid->setWidget(items, 0, 0, 1, 6);

=== modified file 'win32/DirectoryListingFrame.cpp'
--- win32/DirectoryListingFrame.cpp	2012-09-04 19:55:12 +0000
+++ win32/DirectoryListingFrame.cpp	2012-09-10 22:14:27 +0000
@@ -230,6 +230,7 @@
 	searchGrid(0),
 	searchBox(0),
 	filterMethod(0),
+	paned(0),
 	dirs(0),
 	files(0),
 	speed(aSpeed),
@@ -293,7 +294,7 @@
 	searchGrid->setEnabled(false);
 	searchGrid->setVisible(false);
 
-	auto paned = grid->addChild(SplitterContainer::Seed(0.3));
+	paned = grid->addChild(SplitterContainer::Seed(SETTING(FILE_LIST_PANED_POS)));
 
 	{
 		dirs = paned->addChild(WidgetDirs::Seed(WinUtil::Seeds::treeView));
@@ -312,8 +313,9 @@
 		addWidget(files);
 
 		files->setSmallImageList(WinUtil::fileImages);
+
 		WinUtil::makeColumns(files, filesColumns, COLUMN_LAST, SETTING(DIRECTORYLISTINGFRAME_ORDER), SETTING(DIRECTORYLISTINGFRAME_WIDTHS));
-		files->setSort(COLUMN_FILENAME);
+		WinUtil::setTableSort(files, COLUMN_LAST, SettingsManager::DIRECTORYLISTINGFRAME_SORT, COLUMN_FILENAME);
 
 		files->onDblClicked([this] { handleDoubleClickFiles(); });
 		files->onKeyDown([this](int c) { return handleKeyDownFiles(c); });
@@ -379,7 +381,7 @@
 	{
 		auto showTree = addChild(WinUtil::Seeds::splitCheckBox);
 		showTree->setChecked(true);
-		showTree->onClicked([this, showTree, paned] {
+		showTree->onClicked([this, showTree] {
 			auto checked = showTree->getChecked();
 			dirs->setEnabled(checked);
 			paned->maximize(checked ? nullptr : files);
@@ -606,8 +608,11 @@
 }
 
 void DirectoryListingFrame::postClosing() {
+	SettingsManager::getInstance()->set(SettingsManager::FILE_LIST_PANED_POS, paned->getSplitterPos(0));
+
 	SettingsManager::getInstance()->set(SettingsManager::DIRECTORYLISTINGFRAME_ORDER, WinUtil::toString(files->getColumnOrder()));
 	SettingsManager::getInstance()->set(SettingsManager::DIRECTORYLISTINGFRAME_WIDTHS, WinUtil::toString(files->getColumnWidths()));
+	SettingsManager::getInstance()->set(SettingsManager::DIRECTORYLISTINGFRAME_SORT, WinUtil::getTableSort(files));
 }
 
 void DirectoryListingFrame::handleSearchSelChanged() {

=== modified file 'win32/DirectoryListingFrame.h'
--- win32/DirectoryListingFrame.h	2012-09-04 19:55:12 +0000
+++ win32/DirectoryListingFrame.h	2012-09-10 22:14:27 +0000
@@ -174,6 +174,8 @@
 	ComboBoxPtr searchBox;
 	ComboBoxPtr filterMethod;
 
+	SplitterContainerPtr paned;
+
 	typedef TypedTree<ItemInfo, true, dwt::VirtualTree> WidgetDirs;
 	typedef WidgetDirs* WidgetDirsPtr;
 	WidgetDirsPtr dirs;

=== modified file 'win32/FinishedFrameBase.h'
--- win32/FinishedFrameBase.h	2012-07-11 17:13:42 +0000
+++ win32/FinishedFrameBase.h	2012-09-10 22:14:27 +0000
@@ -107,9 +107,11 @@
 			files->setTableStyle(LVS_EX_LABELTIP | LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT);
 			this->addWidget(files);
 
-			WinUtil::makeColumns(files, filesColumns, FILES_COLUMN_LAST, SettingsManager::getInstance()->get(in_UL ? SettingsManager::FINISHED_UL_FILES_ORDER : SettingsManager::FINISHED_DL_FILES_ORDER),
+			WinUtil::makeColumns(files, filesColumns, FILES_COLUMN_LAST,
+				SettingsManager::getInstance()->get(in_UL ? SettingsManager::FINISHED_UL_FILES_ORDER : SettingsManager::FINISHED_DL_FILES_ORDER),
 				SettingsManager::getInstance()->get(in_UL ? SettingsManager::FINISHED_UL_FILES_WIDTHS : SettingsManager::FINISHED_DL_FILES_WIDTHS));
-			files->setSort(FILES_COLUMN_TIME);
+			WinUtil::setTableSort(files, FILES_COLUMN_LAST,
+				in_UL ? SettingsManager::FINISHED_UL_FILES_SORT : SettingsManager::FINISHED_DL_FILES_SORT, FILES_COLUMN_TIME);
 
 			files->setSmallImageList(WinUtil::fileImages);
 
@@ -123,9 +125,11 @@
 			users->setTableStyle(LVS_EX_LABELTIP | LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT);
 			this->addWidget(users);
 
-			WinUtil::makeColumns(users, usersColumns, USERS_COLUMN_LAST, SettingsManager::getInstance()->get(in_UL ? SettingsManager::FINISHED_UL_USERS_ORDER : SettingsManager::FINISHED_DL_USERS_ORDER),
+			WinUtil::makeColumns(users, usersColumns, USERS_COLUMN_LAST,
+				SettingsManager::getInstance()->get(in_UL ? SettingsManager::FINISHED_UL_USERS_ORDER : SettingsManager::FINISHED_DL_USERS_ORDER),
 				SettingsManager::getInstance()->get(in_UL ? SettingsManager::FINISHED_UL_USERS_WIDTHS : SettingsManager::FINISHED_DL_USERS_WIDTHS));
-			users->setSort(USERS_COLUMN_TIME);
+			WinUtil::setTableSort(users, USERS_COLUMN_LAST,
+				in_UL ? SettingsManager::FINISHED_UL_USERS_SORT : SettingsManager::FINISHED_DL_USERS_SORT, USERS_COLUMN_TIME);
 
 			users->setSmallImageList(WinUtil::userImages);
 
@@ -187,10 +191,12 @@
 	void postClosing() {
 		saveColumns(files,
 			in_UL ? SettingsManager::FINISHED_UL_FILES_ORDER : SettingsManager::FINISHED_DL_FILES_ORDER,
-			in_UL ? SettingsManager::FINISHED_UL_FILES_WIDTHS : SettingsManager::FINISHED_DL_FILES_WIDTHS);
+			in_UL ? SettingsManager::FINISHED_UL_FILES_WIDTHS : SettingsManager::FINISHED_DL_FILES_WIDTHS,
+			in_UL ? SettingsManager::FINISHED_UL_FILES_SORT : SettingsManager::FINISHED_DL_FILES_SORT);
 		saveColumns(users,
 			in_UL ? SettingsManager::FINISHED_UL_USERS_ORDER : SettingsManager::FINISHED_DL_USERS_ORDER,
-			in_UL ? SettingsManager::FINISHED_UL_USERS_WIDTHS : SettingsManager::FINISHED_DL_USERS_WIDTHS);
+			in_UL ? SettingsManager::FINISHED_UL_USERS_WIDTHS : SettingsManager::FINISHED_DL_USERS_WIDTHS,
+			in_UL ? SettingsManager::FINISHED_UL_USERS_SORT : SettingsManager::FINISHED_DL_USERS_SORT);
 
 		if(!in_UL)
 			SettingsManager::getInstance()->set(SettingsManager::FINISHED_DL_ONLY_FULL, bOnlyFull);
@@ -600,13 +606,15 @@
 		return 0;
 	}
 
-	void saveColumns(dwt::TablePtr table, SettingsManager::StrSetting order, SettingsManager::StrSetting widths) {
+	template<typename TableType>
+	void saveColumns(TableType table, SettingsManager::StrSetting order, SettingsManager::StrSetting widths, SettingsManager::IntSetting sort) {
 		SettingsManager::getInstance()->set(order, WinUtil::toString(table->getColumnOrder()));
 		SettingsManager::getInstance()->set(widths, WinUtil::toString(table->getColumnWidths()));
+		SettingsManager::getInstance()->set(sort, WinUtil::getTableSort(table));
 	}
 
 	template<typename TableType>
-	void clearTable(TableType* table) {
+	void clearTable(TableType table) {
 		table->clear();
 	}
 	inline void clearTables() {

=== modified file 'win32/HubFrame.cpp'
--- win32/HubFrame.cpp	2012-09-09 14:31:02 +0000
+++ win32/HubFrame.cpp	2012-09-10 22:14:27 +0000
@@ -183,7 +183,7 @@
 hubMenu(false),
 inTabComplete(false)
 {
-	paned = addChild(SplitterContainer::Seed(0.7));
+	paned = addChild(SplitterContainer::Seed(SETTING(HUB_PANED_POS)));
 
 	createChat(paned);
 	chat->setHelpId(IDH_HUB_CHAT);
@@ -207,8 +207,9 @@
 		addWidget(users);
 
 		users->setSmallImageList(WinUtil::userImages);
+
 		WinUtil::makeColumns(users, usersColumns, COLUMN_LAST, SETTING(HUBFRAME_ORDER), SETTING(HUBFRAME_WIDTHS));
-		users->setSort(COLUMN_NICK);
+		WinUtil::setTableSort(users, COLUMN_LAST, SettingsManager::HUBFRAME_SORT, COLUMN_NICK);
 
 		users->onDblClicked([this] { handleDoubleClickUsers(); });
 		users->onKeyDown([this](int c) { return handleUsersKeyDown(c); });
@@ -306,13 +307,16 @@
 }
 
 void HubFrame::postClosing() {
+	clearUserList();
+	clearTaskList();
+
 	SettingsManager::getInstance()->set(SettingsManager::GET_USER_INFO, showUsers->getChecked());
 
-	clearUserList();
-	clearTaskList();
+	SettingsManager::getInstance()->set(SettingsManager::HUB_PANED_POS, paned->getSplitterPos(0));
 
 	SettingsManager::getInstance()->set(SettingsManager::HUBFRAME_ORDER, WinUtil::toString(users->getColumnOrder()));
 	SettingsManager::getInstance()->set(SettingsManager::HUBFRAME_WIDTHS, WinUtil::toString(users->getColumnWidths()));
+	SettingsManager::getInstance()->set(SettingsManager::HUBFRAME_SORT, WinUtil::getTableSort(users));
 }
 
 void HubFrame::layout() {

=== modified file 'win32/PublicHubsFrame.cpp'
--- win32/PublicHubsFrame.cpp	2012-07-11 17:13:42 +0000
+++ win32/PublicHubsFrame.cpp	2012-09-10 22:14:27 +0000
@@ -123,7 +123,7 @@
 		}
 
 		WinUtil::makeColumns(hubs, hubsColumns, COLUMN_LAST, SETTING(PUBLICHUBSFRAME_ORDER), SETTING(PUBLICHUBSFRAME_WIDTHS));
-		hubs->setSort(COLUMN_USERS, false);
+		WinUtil::setTableSort(hubs, COLUMN_LAST, SettingsManager::PUBLICHUBSFRAME_SORT, COLUMN_USERS, false);
 
 		hubs->onDblClicked([this] { openSelected(); });
 		hubs->onKeyDown([this](int c) { return handleKeyDown(c); });
@@ -228,6 +228,7 @@
 void PublicHubsFrame::postClosing() {
 	SettingsManager::getInstance()->set(SettingsManager::PUBLICHUBSFRAME_ORDER, WinUtil::toString(hubs->getColumnOrder()));
 	SettingsManager::getInstance()->set(SettingsManager::PUBLICHUBSFRAME_WIDTHS, WinUtil::toString(hubs->getColumnWidths()));
+	SettingsManager::getInstance()->set(SettingsManager::PUBLICHUBSFRAME_SORT, WinUtil::getTableSort(hubs));
 }
 
 void PublicHubsFrame::layout() {

=== modified file 'win32/QueueFrame.cpp'
--- win32/QueueFrame.cpp	2012-07-11 17:13:42 +0000
+++ win32/QueueFrame.cpp	2012-09-10 22:14:27 +0000
@@ -88,8 +88,9 @@
 		addWidget(files, ALWAYS_FOCUS);
 
 		files->setSmallImageList(WinUtil::fileImages);
+
 		WinUtil::makeColumns(files, filesColumns, COLUMN_LAST, SETTING(QUEUEFRAME_ORDER), SETTING(QUEUEFRAME_WIDTHS));
-		files->setSort(COLUMN_TARGET);
+		WinUtil::setTableSort(files, COLUMN_LAST, SettingsManager::QUEUEFRAME_SORT, COLUMN_TARGET);
 
 		files->onKeyDown([this](int c) { return handleKeyDownFiles(c); });
 		files->onContextMenu([this](const dwt::ScreenCoordinate &sc) { return handleFilesContextMenu(sc); });
@@ -229,8 +230,10 @@
 
 void QueueFrame::postClosing() {
 	SettingsManager::getInstance()->set(SettingsManager::QUEUE_PANED_POS, paned->getSplitterPos(0));
+
 	SettingsManager::getInstance()->set(SettingsManager::QUEUEFRAME_ORDER, WinUtil::toString(files->getColumnOrder()));
 	SettingsManager::getInstance()->set(SettingsManager::QUEUEFRAME_WIDTHS, WinUtil::toString(files->getColumnWidths()));
+	SettingsManager::getInstance()->set(SettingsManager::QUEUEFRAME_SORT, WinUtil::getTableSort(files));
 }
 
 void QueueFrame::addQueueItem(QueueItemPtr&& ii, bool single) {

=== modified file 'win32/SearchFrame.cpp'
--- win32/SearchFrame.cpp	2012-07-12 13:17:54 +0000
+++ win32/SearchFrame.cpp	2012-09-10 22:14:27 +0000
@@ -258,7 +258,9 @@
 		addWidget(results);
 
 		results->setSmallImageList(WinUtil::fileImages);
+
 		WinUtil::makeColumns(results, resultsColumns, COLUMN_LAST, SETTING(SEARCHFRAME_ORDER), SETTING(SEARCHFRAME_WIDTHS));
+		WinUtil::setTableSort(results, COLUMN_LAST, SettingsManager::SEARCHFRAME_SORT, -1);
 
 		results->onDblClicked([this] { handleDownload(); });
 		results->onKeyDown([this](int c) { return handleKeyDown(c); });
@@ -384,6 +386,7 @@
 
 	SettingsManager::getInstance()->set(SettingsManager::SEARCHFRAME_ORDER, WinUtil::toString(results->getColumnOrder()));
 	SettingsManager::getInstance()->set(SettingsManager::SEARCHFRAME_WIDTHS, WinUtil::toString(results->getColumnWidths()));
+	SettingsManager::getInstance()->set(SettingsManager::SEARCHFRAME_SORT, WinUtil::getTableSort(results));
 }
 
 void SearchFrame::SearchInfo::view() {

=== modified file 'win32/TransferView.cpp'
--- win32/TransferView.cpp	2012-08-08 16:25:39 +0000
+++ win32/TransferView.cpp	2012-09-10 22:14:27 +0000
@@ -119,9 +119,9 @@
 		connections->setSmallImageList(arrows);
 
 		WinUtil::makeColumns(connections, connectionColumns, CONNECTION_COLUMN_LAST, SETTING(CONNECTIONS_ORDER), SETTING(CONNECTIONS_WIDTHS));
+		WinUtil::setTableSort(connections, CONNECTION_COLUMN_LAST, SettingsManager::CONNECTIONS_SORT, CONNECTION_COLUMN_USER);
 
 		WinUtil::setColor(connections);
-		connections->setSort(CONNECTION_COLUMN_USER);
 
 		connections->onContextMenu([this](const dwt::ScreenCoordinate &sc) { return handleConnectionsMenu(sc); });
 		connections->onKeyDown([this](int c) { return handleKeyDown(c); });
@@ -133,7 +133,8 @@
 		downloads = downloadsWindow->addChild(WidgetDownloads::Seed(WinUtil::Seeds::table));
 
 		WinUtil::makeColumns(downloads, downloadColumns, DOWNLOAD_COLUMN_LAST, SETTING(DOWNLOADS_ORDER), SETTING(DOWNLOADS_WIDTHS));
-		downloads->setSort(DOWNLOAD_COLUMN_STATUS);
+		WinUtil::setTableSort(downloads, DOWNLOAD_COLUMN_LAST, SettingsManager::DOWNLOADS_SORT, DOWNLOAD_COLUMN_STATUS);
+
 		WinUtil::setColor(downloads);
 		downloads->setSmallImageList(WinUtil::fileImages);
 
@@ -170,9 +171,11 @@
 void TransferView::handleDestroy() {
 	SettingsManager::getInstance()->set(SettingsManager::CONNECTIONS_ORDER, WinUtil::toString(connections->getColumnOrder()));
 	SettingsManager::getInstance()->set(SettingsManager::CONNECTIONS_WIDTHS, WinUtil::toString(connections->getColumnWidths()));
+	SettingsManager::getInstance()->set(SettingsManager::CONNECTIONS_SORT, WinUtil::getTableSort(connections));
 
 	SettingsManager::getInstance()->set(SettingsManager::DOWNLOADS_ORDER, WinUtil::toString(downloads->getColumnOrder()));
 	SettingsManager::getInstance()->set(SettingsManager::DOWNLOADS_WIDTHS, WinUtil::toString(downloads->getColumnWidths()));
+	SettingsManager::getInstance()->set(SettingsManager::DOWNLOADS_SORT, WinUtil::getTableSort(downloads));
 }
 
 bool TransferView::handleConnectionsMenu(dwt::ScreenCoordinate pt) {

=== modified file 'win32/UsersFrame.cpp'
--- win32/UsersFrame.cpp	2012-06-23 12:31:10 +0000
+++ win32/UsersFrame.cpp	2012-09-10 22:14:27 +0000
@@ -107,6 +107,7 @@
 UsersFrame::UsersFrame(TabViewPtr parent) :
 BaseType(parent, T_("Users"), IDH_USERS, IDI_USERS, false),
 grid(0),
+splitter(0),
 users(0),
 scroll(0),
 userInfo(0),
@@ -118,7 +119,7 @@
 	grid->row(0).align = GridInfo::STRETCH;
 
 	{
-		auto splitter = grid->addChild(SplitterContainer::Seed(0.7));
+		splitter = grid->addChild(SplitterContainer::Seed(SETTING(USERS_PANED_POS)));
 
 		if(!userIcons) {
 			const dwt::Point size(16, 16);
@@ -135,7 +136,7 @@
 		addWidget(users);
 
 		WinUtil::makeColumns(users, usersColumns, COLUMN_LAST, SETTING(USERSFRAME_ORDER), SETTING(USERSFRAME_WIDTHS));
-		users->setSort(COLUMN_NICK);
+		WinUtil::setTableSort(users, COLUMN_LAST, SettingsManager::USERSFRAME_SORT, COLUMN_NICK);
 
 		// TODO check default (browse vs get)
 		users->onDblClicked([this] { handleGetList(); });
@@ -232,8 +233,11 @@
 }
 
 void UsersFrame::postClosing() {
+	SettingsManager::getInstance()->set(SettingsManager::USERS_PANED_POS, splitter->getSplitterPos(0));
+
 	SettingsManager::getInstance()->set(SettingsManager::USERSFRAME_ORDER, WinUtil::toString(users->getColumnOrder()));
 	SettingsManager::getInstance()->set(SettingsManager::USERSFRAME_WIDTHS, WinUtil::toString(users->getColumnWidths()));
+	SettingsManager::getInstance()->set(SettingsManager::USERSFRAME_SORT, WinUtil::getTableSort(users));
 }
 
 UsersFrame::UserInfo::UserInfo(const UserPtr& u, bool visible) :

=== modified file 'win32/UsersFrame.h'
--- win32/UsersFrame.h	2012-07-11 17:13:42 +0000
+++ win32/UsersFrame.h	2012-09-10 22:14:27 +0000
@@ -116,6 +116,8 @@
 
 	GridPtr grid;
 
+	SplitterContainerPtr splitter;
+
 	typedef TypedTable<UserInfo, false> WidgetUsers;
 	typedef WidgetUsers* WidgetUsersPtr;
 	WidgetUsersPtr users;

=== modified file 'win32/WinUtil.cpp'
--- win32/WinUtil.cpp	2012-09-10 18:41:39 +0000
+++ win32/WinUtil.cpp	2012-09-10 22:14:27 +0000
@@ -1553,6 +1553,21 @@
 	table->setColumnOrder(o);
 }
 
+int WinUtil::tableSortSetting(int column, bool ascending) {
+	return ascending || column == -1 ? column : -column - 2;
+}
+
+pair<int, bool> WinUtil::tableSortSetting(int columnCount, int setting, int defaultCol, bool defaultAscending) {
+	SettingsManager::getInstance()->setDefault(static_cast<SettingsManager::IntSetting>(setting),
+		tableSortSetting(defaultCol, defaultAscending));
+	auto s = SettingsManager::getInstance()->get(static_cast<SettingsManager::IntSetting>(setting));
+	auto ret = s >= -1 ? make_pair(s, true) : make_pair(-s - 2, false);
+	if(ret.first >= columnCount) {
+		return make_pair(defaultCol, defaultAscending);
+	}
+	return ret;
+}
+
 dwt::IconPtr WinUtil::createIcon(unsigned id, long size) {
 	return new dwt::Icon(id, dwt::Point(size, size));
 }

=== modified file 'win32/WinUtil.h'
--- win32/WinUtil.h	2012-09-10 18:41:39 +0000
+++ win32/WinUtil.h	2012-09-10 22:14:27 +0000
@@ -211,30 +211,25 @@
 	static void makeColumns(dwt::TablePtr table, const ColumnInfo* columnInfo, size_t columnCount,
 		const string& order = Util::emptyString, const string& widths = Util::emptyString);
 
-	template<typename T>
-	static std::vector<int> splitTokens(const string& str, const T& defaults) {
-		const size_t n = sizeof(defaults) / sizeof(defaults[0]);
-		std::vector<int> ret(defaults, defaults + n);
-		StringTokenizer<string> tokens(str, ',') ;
-		const StringList& l = tokens.getTokens();
-		for(size_t i = 0; i < std::min(ret.size(), l.size()); ++i) {
-			ret[i] = Util::toInt(l[i]);
-		}
-		return ret;
-	}
+	/* functions to get / set table column sorting. a little trick is used to encode both the
+	column index & the "ascending sort" flag into an int. */
+private:
+	static int tableSortSetting(int column, bool ascending);
+	static pair<int, bool> tableSortSetting(int columnCount, int setting, int defaultCol, bool defaultAscending);
+public:
+	template<typename T>
+	static int getTableSort(T table) {
+		return tableSortSetting(table->getSortColumn(), table->isAscending());
+	}
+	template<typename T>
+	static void setTableSort(T table, int columnCount, int setting, int defaultCol, bool defaultAscending = true) {
+		auto sort = tableSortSetting(columnCount, setting, defaultCol, defaultAscending);
+		table->setSort(sort.first, sort.second);
+	}
+
 	static std::string toString(const std::vector<int>& tokens);
 	static void toInts(const string& str, std::vector<int>& tokens);
 
-	template<typename T>
-	static TStringList getStrings(const T& t) {
-		const size_t n = sizeof(t) / sizeof(t[0]);
-		TStringList ret(n);
-		for(size_t i = 0; i < n; ++i) {
-			ret[i] = T_(t[i]);
-		}
-		return ret;
-	}
-
 	// GUI related
 private:
 	static pair<ButtonPtr, ButtonPtr> addDlgButtons(GridPtr grid);