Official eMule-Board: The Return Of Multi-sort - Official eMule-Board

Jump to content


  • (2 Pages)
  • +
  • 1
  • 2

The Return Of Multi-sort

#1 User is offline   SlugFiller 

  • The one and only master slug
  • PipPipPipPipPipPipPip
  • Group: Members
  • Posts: 6988
  • Joined: 15-September 02

Posted 22 July 2005 - 10:31 PM

After a recent shrinking of the multi-sort code, thanks to the efforts of the official devs, I present to you the new, trimmer, slimmer, multi-sort.

It features:
-Unlimited layers of re-sorting(as opposed to just 4).
-Saving and loading of all of these layers(Yup, unlimited, you can have billions if you have the memory and disk space, and columns), so that the sorting style remains after a restart.
-Operates on all lists, not just the ones the devs remembered(and there are a couple they forgot). In fact, support from the child class is only an optimization, the modified parent class(CMuleListCtrl) can be used to patch even a CList that wasn't intended to have any form of layered sorting.
-As part of the above, it removes ugly OO evilness, which someone decided to copy over and over even though it was remarked "It's okay so long as it is only done once"(It's not "once" anymore).

So, here we go. First, the #1 helper function, using the neatly provided sort history(thanks for that, by the way):
MuleListCtrl.h
	DWORD_PTR GetParamAt(POSITION pos, int iPos) {
  LPARAM lParam = m_Params.GetAt(pos);
  if(lParam == 0xFEEBDEEF) //same as MLC_MAGIC!
  	m_Params.SetAt(pos, lParam = CListCtrl::GetItemData(iPos));
  return lParam;
	}
	// SLUGFILLER: multiSort
	int MultiSortProc(LPARAM lParam1, LPARAM lParam2) {
  for (POSITION pos = m_liSortHistory.GetHeadPosition(); pos != NULL; ) {
  	// Use sort history for layered sorting
  	int dwParamSort = m_liSortHistory.GetNext(pos);

  	int ret = m_SortProc(lParam1, lParam2, dwParamSort);
  	if (ret)
    return ret;
  }

  return 0;	// Failed to sort
	}
	static int CALLBACK MultiSortCallback(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) {
  return ((CMuleListCtrl*)lParamSort)->MultiSortProc(lParam1, lParam2);
	}
	// SLUGFILLER: multiSort

A couple of fail-safes, for the lists that forget they're using multi-sort:
MuleListCtrl.cpp
CMuleListCtrl::CMuleListCtrl(PFNLVCOMPARE pfnCompare, DWORD dwParamSort) {
	
	m_SortProc = pfnCompare;
	m_dwParamSort = dwParamSort;
	UpdateSortHistory(m_dwParamSort, 0);	// SLUGFILLER: multiSort - fail-safe, ensure it's in the sort history(no inverse check)

MuleListCtrl.cpp
	case LVM_SORTITEMS:
  //book keeping...

  m_dwParamSort = (LPARAM)wParam;
  UpdateSortHistory(m_dwParamSort, 0);	// SLUGFILLER: multiSort - fail-safe, ensure it's in the sort history(no inverse check)
  m_SortProc = (PFNLVCOMPARE)lParam;

And while we're at it, let's get the main sort do multi-sorting for us, so we don't have to change the load process in such forgetful lists:
MuleListCtrl.cpp
	case LVM_SORTITEMS:
  //book keeping...

  m_dwParamSort = (LPARAM)wParam;
  UpdateSortHistory(m_dwParamSort, 0);	// SLUGFILLER: multiSort - fail-safe, ensure it's in the sort history(no inverse check)
  m_SortProc = (PFNLVCOMPARE)lParam;
  // SLUGFILLER: multiSort - hook our own callback for automatic layered sorting
  lParam = (LPARAM)MultiSortCallback;
  wParam = (WPARAM)this;
  // SLUGFILLER: multiSort
  for(POSITION pos = m_Params.GetHeadPosition(); pos != NULL; m_Params.GetNext(pos))
  	m_Params.SetAt(pos, MLC_MAGIC);
  break;

Actually, thanks to this little piece of code, I was finally able to take my code out of all the lists, which now call a single sort, but get a multi-sort. All thanks to the fact that CMuleListCtrl is now in charge of settings, instead of CPreferences, so once again, thanks for that.

Now, I promised saving and loading, and I shall keep:
MuleListCtrl.cpp
void CMuleListCtrl::SaveSettings()
{
	ASSERT(!m_Name.IsEmpty());
	if (m_Name.IsEmpty())
  return;

	CIni ini(thePrefs.GetConfigFile(), _T("ListControlSetup"));

	ShowWindow(SW_HIDE);

	// SLUGFILLER: multiSort - store unlimited sorts
	int i;
	CString strSortHist;
	POSITION pos = m_liSortHistory.GetTailPosition();
	if (pos != NULL) {
  strSortHist.Format(_T("%d"), m_liSortHistory.GetPrev(pos));
  while (pos != NULL) {
  	strSortHist.AppendChar(_T(','));
  	strSortHist.AppendFormat(_T("%d"), m_liSortHistory.GetPrev(pos));
  }
	}
	ini.WriteString(m_Name + _T("SortHistory"), strSortHist);
	// SLUGFILLER: multiSort
	// store additional settings

If you're wondering what the "int i;" is for, it's defined in the code I replaced and is used below, so I had to put it there. Speaking of things I've removed:
MuleListCtrl.cpp
	ShowWindow(SW_SHOW);

	// SLUGFILLER: multiSort remove - unused
	delete[] piColOrders;
	delete[] piColWidths;


And on to loading:
MuleListCtrl.cpp
void CMuleListCtrl::LoadSettings()
{
	ASSERT(!m_Name.IsEmpty());
	if (m_Name.IsEmpty())
  return;

	CIni ini(thePrefs.GetConfigFile(), _T("ListControlSetup"));
	CHeaderCtrl* pHeaderCtrl = GetHeaderCtrl();

	// sort history
	// SLUGFILLER: multiSort - read unlimited sorts
	CString strSortHist = ini.GetString(m_Name + _T("SortHistory"));
	int nOffset = 0;
	CString strTemp;
	nOffset = ini.Parse(strSortHist, nOffset, strTemp);
	while (!strTemp.IsEmpty()) {
  UpdateSortHistory((int)_tstoi(strTemp), 0);	// avoid duplicates(cannot detect inverse, but it does half the job)
  nOffset = ini.Parse(strSortHist, nOffset, strTemp);
	}
	// SLUGFILLER: multiSort
	
	m_iCurrentSortItem= ini.GetInt( m_Name + _T("TableSortItem"), 0);

It's nice that CIni::Parse is public. I could have used CString::Tokenize, but this is so much cleaner and more appropriate.
But it wouldn't be complete without:
MuleListCtrl.cpp
	delete[] piColWidths;
	delete[] piColHidden;
	// SLUGFILLER: multiSort remove - unused
}

Gotta love replacing staticly-sized arrays with native use of CLists. Maybe I should do that to the other settings as well. Oh well.

Now that we have an up-to-date history, and the list starts out well sorted, we need to keep it that way, once items change. Merely a matter of hooking all of the m_SortProc calls to something like this:
MuleListCtrl.cpp
int CMuleListCtrl::UpdateLocation(int iItem) {
	int iItemCount = GetItemCount();
	if(iItem >= iItemCount || iItem < 0)
  return iItem;

	BOOL notLast = iItem + 1 < iItemCount;
	BOOL notFirst = iItem > 0;

	DWORD_PTR dwpItemData = GetItemData(iItem);
	if(dwpItemData == NULL)
  return iItem;

	if(notFirst) {
  int iNewIndex = iItem - 1;
  POSITION pos = m_Params.FindIndex(iNewIndex);
  int iResult = MultiSortProc(dwpItemData, GetParamAt(pos, iNewIndex));	// SLUGFILLER: multiSort
  if(iResult < 0) {
  	POSITION posPrev = pos;
  	int iDist = iNewIndex / 2;
  	while(iDist > 1) {
    for(int i = 0; i < iDist; i++)
    	m_Params.GetPrev(posPrev);

    if(MultiSortProc(dwpItemData, GetParamAt(posPrev, iNewIndex - iDist)) < 0) {	// SLUGFILLER: multiSort
    	iNewIndex = iNewIndex - iDist;
    	pos = posPrev;
    } else {
    	posPrev = pos;
    }
    iDist /= 2;
  	}
  	while(--iNewIndex >= 0) {
    m_Params.GetPrev(pos);
    if(MultiSortProc(dwpItemData, GetParamAt(pos, iNewIndex)) >= 0)	// SLUGFILLER: multiSort
    	break;
  	}
  	MoveItem(iItem, iNewIndex + 1);
  	return iNewIndex + 1;
  }
	}

	if(notLast) {
  int iNewIndex = iItem + 1;
  POSITION pos = m_Params.FindIndex(iNewIndex);
  int iResult = MultiSortProc(dwpItemData, GetParamAt(pos, iNewIndex));	// SLUGFILLER: multiSort
  if(iResult > 0) {
  	POSITION posNext = pos;
  	int iDist = (GetItemCount() - iNewIndex) / 2;
  	while(iDist > 1) {
    for(int i = 0; i < iDist; i++)
    	m_Params.GetNext(posNext);

    if(MultiSortProc(dwpItemData, GetParamAt(posNext, iNewIndex + iDist)) > 0) {	// SLUGFILLER: multiSort
    	iNewIndex = iNewIndex + iDist;
    	pos = posNext;
    } else {
    	posNext = pos;
    }
    iDist /= 2;
  	}
  	while(++iNewIndex < iItemCount) {
    m_Params.GetNext(pos);
    if(MultiSortProc(dwpItemData, GetParamAt(pos, iNewIndex)) <= 0)	// SLUGFILLER: multiSort
    	break;
  	}
  	MoveItem(iItem, iNewIndex);
  	return iNewIndex;
  }
	}

	return iItem;
}

MuleListCtrl.cpp
	case LVM_INSERTITEMA:
	case LVM_INSERTITEMW:
  //try to fix position of inserted items
  {
  	LPLVITEM pItem = (LPLVITEM)lParam;
  	int iItem = pItem->iItem;
  	int iItemCount = GetItemCount();
  	BOOL notLast = iItem < iItemCount;
  	BOOL notFirst = iItem > 0;

  	if(notFirst) {
    int iNewIndex = iItem - 1;
    POSITION pos = m_Params.FindIndex(iNewIndex);
    int iResult = MultiSortProc(pItem->lParam, GetParamAt(pos, iNewIndex));	// SLUGFILLER: multiSort
    if(iResult < 0) {
    	POSITION posPrev = pos;
    	int iDist = iNewIndex / 2;
    	while(iDist > 1) {
      for(int i = 0; i < iDist; i++)
      	m_Params.GetPrev(posPrev);

      if(MultiSortProc(pItem->lParam, GetParamAt(posPrev, iNewIndex - iDist)) < 0) {	// SLUGFILLER: multiSort
      	iNewIndex = iNewIndex - iDist;
      	pos = posPrev;
      } else {
      	posPrev = pos;
      }
      iDist /= 2;
    	}
    	while(--iNewIndex >= 0) {
      m_Params.GetPrev(pos);
      if(MultiSortProc(pItem->lParam, GetParamAt(pos, iNewIndex)) >= 0)	// SLUGFILLER: multiSort
      	break;
    	}
    	pItem->iItem = iNewIndex + 1;
    	notLast = false;
    }
  	}

  	if(notLast) {
    int iNewIndex = iItem;
    POSITION pos = m_Params.FindIndex(iNewIndex);
    int iResult = MultiSortProc(pItem->lParam, GetParamAt(pos, iNewIndex));	// SLUGFILLER: multiSort
    if(iResult > 0) {
    	POSITION posNext = pos;
    	int iDist = (GetItemCount() - iNewIndex) / 2;
    	while(iDist > 1) {
      for(int i = 0; i < iDist; i++)
      	m_Params.GetNext(posNext);

      if(MultiSortProc(pItem->lParam, GetParamAt(posNext, iNewIndex + iDist)) > 0) {	// SLUGFILLER: multiSort
      	iNewIndex = iNewIndex + iDist;
      	pos = posNext;
      } else {
      	posNext = pos;
      }
      iDist /= 2;
    	}
    	while(++iNewIndex < iItemCount) {
      m_Params.GetNext(pos);
      if(MultiSortProc(pItem->lParam, GetParamAt(pos, iNewIndex)) <= 0)	// SLUGFILLER: multiSort
      	break;
    	}
    	pItem->iItem = iNewIndex;
    }
  	}

It may seem like alot of work, but it's actually just a little search and replace.

Now just a tiny fix:
MuleListCtrl.cpp
	int dwInverse = (dwNewOrder >= dwInverseValue) ? (dwNewOrder-dwInverseValue) : (dwNewOrder+dwInverseValue);	// SLUGFILLER: multiSort - changed to >= for sort #0

Not really an issue, and not the only bug of this type, but if you're going to optimize, might as well do it right.
And to make all of this worthwhile:
MuleListCtrl.cpp
void CMuleListCtrl::UpdateSortHistory(int dwNewOrder, int dwInverseValue){
	int dwInverse = (dwNewOrder >= dwInverseValue) ? (dwNewOrder-dwInverseValue) : (dwNewOrder+dwInverseValue);	// SLUGFILLER: multiSort - changed to >= for sort #0
	// delete the value (or its inverse sorting value) if it appears already in the list
	POSITION pos1, pos2;
	for (pos1 = m_liSortHistory.GetHeadPosition();( pos2 = pos1 ) != NULL;)
	{
  m_liSortHistory.GetNext(pos1);
  if (m_liSortHistory.GetAt(pos2) == dwNewOrder || m_liSortHistory.GetAt(pos2) == dwInverse)
  	m_liSortHistory.RemoveAt(pos2);
	}
	m_liSortHistory.AddHead(dwNewOrder);
	// SLUGFILLER: multiSort remove - do not limit, unlimited saving and loading available
}


Now that we have the parent support, we need to remove the "client-side" support:
*ListCtrl.cpp and SharedFilesCtrl.cpp
  default: 
  	iResult=0;
  	break;
	}

	// SLUGFILLER: multiSort remove - handled in parent class

	return iResult;


There are also a couple of:
FileDetailDialogName.cpp
  m_sortorder = !m_sortorder;
	m_sortindex = pNMLV->iSubItem;

	m_listFileNames.UpdateSortHistory(m_sortindex + (m_sortorder ? 0 : 10), 10);	// SLUGFILLER: multiSort - forgot something?
	m_listFileNames.SetSortArrow(m_sortindex, m_sortorder);
	m_listFileNames.SortItems(&CompareListNameItems, m_sortindex + (m_sortorder ? 0 : 10));

But with the fail-safes in the parent, this is just an optimization that prevents 1 and 11 from both being saved in the preferences.ini, etc. Not really necessary. There are other places where I left it as is, since I know the end result will work the same anyway, no need to be nitpicky.

To make things really rule, here's how we add support for the CSearchListCtrl sort snapshot thingy:
SearchListCtrl.h
class CSortSelectionState{
public:
	uint32	m_nSortItem;
	bool	m_bSortAscending;
	uint32	m_nScrollPosition;
	CArray<int, int>	m_aSelectedItems;
	CList<int, int>	m_liSortHistory;	// SLUGFILLER: multiSort
};

SearchListCtrl.cpp
  pCurState->m_nScrollPosition = GetTopIndex();
  // SLUGFILLER: multiSort - save sort history
  pos = m_liSortHistory.GetHeadPosition();
  while (pos != NULL){
  	pCurState->m_liSortHistory.AddTail(m_liSortHistory.GetNext(pos));
  }
  // SLUGFILLER: multiSort
  m_mapSortSelectionStates.SetAt(m_nResultsID, pCurState);

SearchListCtrl.cpp
  // sort order
//  thePrefs.SetColumnSortItem(CPreferences::tableSearch, pNewState->m_nSortItem);
//  thePrefs.SetColumnSortAscending(CPreferences::tableSearch, pNewState->m_bSortAscending);

  // SLUGFILLER: multiSort - load sort history
  m_liSortHistory.RemoveAll();
  for (POSITION pos = pNewState->m_liSortHistory.GetHeadPosition(); pos != NULL; )
  	m_liSortHistory.AddTail(pNewState->m_liSortHistory.GetNext(pos));
  // SLUGFILLER: multiSort
  SetSortArrow(pNewState->m_nSortItem, pNewState->m_bSortAscending);
  SortItems(SortProc, pNewState->m_nSortItem + (pNewState->m_bSortAscending ? 0:100));

Now instead of merely saving the sort of every search tab, it saves the multi-sort of every search tab. Go ahead, tell me that ain't cool.

Well, have fun using this patch. It sure as hell gives you alot more sorts to play with.

This post has been edited by SlugFiller: 23 July 2005 - 12:20 PM

Why haven't you clicked yet?

SlugFiller rule #1: Unsolicited PMs is the second most efficient method to piss me off.
SlugFiller rule #2: The first most efficient method is unsolicited eMails.
SlugFiller rule #3: If it started in a thread, it should end in the same thread.
SlugFiller rule #4: There is absolutely no reason to perform the same discussion twice in parallel, especially if one side is done via PM.
SlugFiller rule #5: Does it say "Group: Moderators" under my name? No? Then stop telling me about who you want to ban! I really don't care! Go bother a moderator.
SlugFiller rule #6: I can understand English, Hebrew, and a bit of Japanese(standard) and Chinese(mandarin), but if you speak to me in anything but English, do expect to be utterly ignored, at best.
0

#2 User is offline   Some Support 

  • Last eMule
  • PipPipPipPipPipPipPip
  • Group: Yes
  • Posts: 3667
  • Joined: 27-June 03

Posted 22 July 2005 - 11:19 PM

So this patch essentially features more than 4-way sorting for those who need to sort by more than 4 rows at once?

There would be an easier way to implement this

change
#define MAX_SORTORDERHISTORY 4

to
#define MAX_SORTORDERHISTORY 0xFFFF


#3 User is offline   SlugFiller 

  • The one and only master slug
  • PipPipPipPipPipPipPip
  • Group: Members
  • Posts: 6988
  • Joined: 15-September 02

Posted 22 July 2005 - 11:32 PM

@Some Support: Your patch would dynamically allocate an array of 65535 ints every time the sort is stored. Can you say "memory fragmentation"?

Besides, unlimited layers isn't the only thing the patch does, if you read through it. It also adds multi-sort to the lists you(and by "you" I mean the devs in general, not you in specific) forgot, and I've also given an example to one. Not to mention, if you look down, you'll see it adds snap-shot support for CSearchListCtrl, which previously only saved the latest sort, but now saves the entire multisort.

And, unlike the current solution, aside from being faster, it's OO proper, so you won't get problems like the one with the list skins. Must I mention that one again?
And If you weigh everything, it actually saves code in the overall, not adds.
Why haven't you clicked yet?

SlugFiller rule #1: Unsolicited PMs is the second most efficient method to piss me off.
SlugFiller rule #2: The first most efficient method is unsolicited eMails.
SlugFiller rule #3: If it started in a thread, it should end in the same thread.
SlugFiller rule #4: There is absolutely no reason to perform the same discussion twice in parallel, especially if one side is done via PM.
SlugFiller rule #5: Does it say "Group: Moderators" under my name? No? Then stop telling me about who you want to ban! I really don't care! Go bother a moderator.
SlugFiller rule #6: I can understand English, Hebrew, and a bit of Japanese(standard) and Chinese(mandarin), but if you speak to me in anything but English, do expect to be utterly ignored, at best.
0

#4 User is offline   Some Support 

  • Last eMule
  • PipPipPipPipPipPipPip
  • Group: Yes
  • Posts: 3667
  • Joined: 27-June 03

Posted 22 July 2005 - 11:45 PM

Quote

@Some Support: Your patch would dynamically allocate an array of 65535 ints every time the sort is stored. Can you say "memory fragmentation"?

Well good news in this case: We dont have any lists with 65535 columns yet, and it is somewhat unlikely that we will ever implement them. So you could ignore the example 0xFFFF and set it to an apprioriate value like 20 (even tho I want to see the person who sorts by 20 coloums at a time).

But nice patch. Im sure you will have lots of fun with it for sorting experiments :)

#5 User is offline   Torni 

  • Stulle-Rider
  • PipPipPipPip
  • Group: Members
  • Posts: 163
  • Joined: 09-April 05

Posted 23 July 2005 - 05:46 AM

thx slug....
Why was i deleted in ~April 2005 from this board?

Answer isn't here....
------------------------------
<--- leech-user (for you Stulle *g*)
<--- emule-user since 0.02
------------------------------
user posted image
0

#6 User is offline   SlugFiller 

  • The one and only master slug
  • PipPipPipPipPipPipPip
  • Group: Members
  • Posts: 6988
  • Joined: 15-September 02

Posted 23 July 2005 - 10:46 AM

Quote

We dont have any lists with 65535 columns yet

Quote

So you could ignore the example 0xFFFF and set it to an apprioriate value like 20 (even tho I want to see the person who sorts by 20 coloums at a time).

You really don't see the problem with that, even after you have a related bug in the official eMule release?
And mind you, that with 4-way sorts, it does pass the 20, so your code would still not work.

And like I said, it does more than just increase the column count on your little hack-job. Among other things, it even removes bugs.

You should read the code and try to understand what it does before making another comment. You're only making yourself look bad, not that you had the reputation of a linux-level coder before.

To make a point:

Official DownloadListCtrl.cpp(as of two versions ago) said:

int dwNextSort;
//call secondary sortorder, if this one results in equal
//(Note: yes I know this call is evil OO wise, but better than changing a lot more code, while we have only one instance anyway - might be fixed later)
if (comp == 0 && (dwNextSort = theApp.emuledlg->transferwnd->downloadlistctrl.GetNextSortOrder(dwOrgSort)) != (-1)){
  return SortProc(lParam1, lParam2, dwNextSort);
}
else
  return sortMod * comp;

Every other ListCtrl.cpp(as of 46b) said:

  default:
  iResult=0;
}

int dwNextSort;
//call secondary sortorder, if this one results in equal
//(Note: yes I know this call is evil OO wise, but better than changing a lot more code, while we have only one instance anyway - might be fixed later)
if (iResult == 0 && (dwNextSort = theApp.emuledlg->transferwnd->clientlistctrl.GetNextSortOrder(lParamSort)) != (-1)){
  iResult= SortProc(lParam1, lParam2, dwNextSort);
}

return iResult;

This is unmodified official code, which this feature removes. My question is: What part of "only one instance" was missed by whoever copied this over and over?

And you know what, Some Support, I would love to hear that it was you that did this, it would simply make my day.

P.S. How do I fix the quote thing in my first post? The code is much easier to read WITH the quotes.
Why haven't you clicked yet?

SlugFiller rule #1: Unsolicited PMs is the second most efficient method to piss me off.
SlugFiller rule #2: The first most efficient method is unsolicited eMails.
SlugFiller rule #3: If it started in a thread, it should end in the same thread.
SlugFiller rule #4: There is absolutely no reason to perform the same discussion twice in parallel, especially if one side is done via PM.
SlugFiller rule #5: Does it say "Group: Moderators" under my name? No? Then stop telling me about who you want to ban! I really don't care! Go bother a moderator.
SlugFiller rule #6: I can understand English, Hebrew, and a bit of Japanese(standard) and Chinese(mandarin), but if you speak to me in anything but English, do expect to be utterly ignored, at best.
0

#7 User is offline   Some Support 

  • Last eMule
  • PipPipPipPipPipPipPip
  • Group: Yes
  • Posts: 3667
  • Joined: 27-June 03

Posted 23 July 2005 - 10:50 AM

Quote

You really don't see the problem with that, even after you have a related bug in the official eMule release?


Not at all :)

Quote

P.S. How do I fix the quote thing in my first post? The code is much easier to read WITH the quotes.


Yes, the board demands quite some skill to use, but im sure a elite-code like you will figure out :P

PS: Oh and if you feel like flaming me more, go ahead, I would love to finally ban your account (but well nothing new here ;) ) :)

#8 User is offline   tHeWiZaRdOfDoS 

  • Man, what a bunch of jokers...
  • PipPipPipPipPipPipPip
  • Group: Members
  • Posts: 5630
  • Joined: 28-December 02

Posted 23 July 2005 - 10:52 AM

Change the

FileName said:

...
to
FileName

Quote

...



BTW: I changed your code on updating to 0.46, too, as I don't like that cheap official solution which does require more code, is buggy and even restricted - thx for that major code improvement :)


@SomeSupport: Are you a relative of bluecows'? Since I am on this board, SlugFiller has present GREAT code improvements which you consequently refuse to accept... you rather change 10% of all code to have something working *similar* but with more bugs and flaws just to avoid giving credit to SlugFiller or to just say "That's a good idea"
You can increase my warning level for that but thats CHILDISH and kindergarden level...

This post has been edited by tHeWiZaRdOfDoS: 23 July 2005 - 10:55 AM

0

#9 User is offline   OwenBurnett 

  • Splendid Member
  • PipPipPipPip
  • Group: Members
  • Posts: 121
  • Joined: 04-October 04

Posted 23 July 2005 - 10:56 AM

@SlugFiller
I totaly Agree,
but their is some more that can be improved:
Implement a separated sort order for the clients in the download files list,
than you would be able to sort files by names but at the same times have clients sorted by queue, or some think like this

PS: I'm sure S S does not know C++ he can only repeat the stuff the dev's tolled to him without thinking...

EDIT:
@SlugFiller
Is there also some done mod with this code to download, i meen the sources not the binary...

Owen

This post has been edited by OwenBurnett: 23 July 2005 - 11:10 AM

God's in his haven. All's right with the world.
0

#10 User is offline   Some Support 

  • Last eMule
  • PipPipPipPipPipPipPip
  • Group: Yes
  • Posts: 3667
  • Joined: 27-June 03

Posted 23 July 2005 - 11:00 AM

Quote

@SomeSupport: Are you a relative of bluecows'?

Not at all, but I guess we devs are all the same ;)

#11 User is offline   PluG 

  • Golden eMule
  • PipPipPipPipPipPipPip
  • Group: Members
  • Posts: 1585
  • Joined: 27-November 02

Posted 23 July 2005 - 11:21 AM

tHeWiZaRdOfDoS, on Jul 23 2005, 10:52 AM, said:

Change the

FileName said:

...
to
FileName

Quote

...


Actually it's too many quotes, only 10 per post seem to be allowed :angelnot:

This post has been edited by PluG: 23 July 2005 - 11:22 AM

0

#12 User is offline   SlugFiller 

  • The one and only master slug
  • PipPipPipPipPipPipPip
  • Group: Members
  • Posts: 6988
  • Joined: 15-September 02

Posted 23 July 2005 - 12:21 PM

Quote

Implement a separated sort order for the clients in the download files list,

It's called "DLsortFix" which does this and a couple of bug-fixes as well. However, while relying on multi-sort, it is a seperate patch, and I'd rather push 'em one at a time. Besides, "DLsortFix" is now no longer "DL" as at least one aspect of it now applies to CSearchListCtrl(parent item sorting fix, and last-chance sorting). It may go through some revision before I try to push it as well.

Quote

Not at all, but I guess we devs are all the same

Hardly, you are nothing like Ornis+ or Unk1, just bluecow. But I'm not gonna further OT for a ;) (fixme: or perhaps "an"?)

Quote

Actually it's too many quotes, only 10 per post seem to be allowed

Silly limitation, but I managed to fix it with the use of code tags. It looks much better and more readable now. Not like I was using colors anyway.

This post has been edited by SlugFiller: 24 July 2005 - 09:42 AM

Why haven't you clicked yet?

SlugFiller rule #1: Unsolicited PMs is the second most efficient method to piss me off.
SlugFiller rule #2: The first most efficient method is unsolicited eMails.
SlugFiller rule #3: If it started in a thread, it should end in the same thread.
SlugFiller rule #4: There is absolutely no reason to perform the same discussion twice in parallel, especially if one side is done via PM.
SlugFiller rule #5: Does it say "Group: Moderators" under my name? No? Then stop telling me about who you want to ban! I really don't care! Go bother a moderator.
SlugFiller rule #6: I can understand English, Hebrew, and a bit of Japanese(standard) and Chinese(mandarin), but if you speak to me in anything but English, do expect to be utterly ignored, at best.
0

#13 User is offline   Andu 

  • Morph Team
  • PipPipPipPipPipPipPip
  • Group: Members
  • Posts: 13015
  • Joined: 04-December 02

Posted 23 July 2005 - 12:38 PM

Seriously you both need to change your attitude. SlugFiller you should consider doing this less aggressively. There is no need to attack the devs. You can just provide your solution and tell it's advantages. On the other side Some Support should start considering looking into the code and ignore SlugFiller's overbearing nature and obviously give credit if the code SF provides is actually good or better than current code.

I'm really sick of this bickering that never leads anywhere because SF thinks he can do everything better and needs to show that while SomeSupport seems to be focused on ignoring or badmouthing the code.

Disclaimer: I might have got some things a bit wrong or exaggerated them but this is how I perceive them.
Three Rings for the Elven-kings under the sky,
Seven for the Dwarf-lords in their halls of stone,
Nine for Mortal Men doomed to die,
One for the Dark Lord on his dark throne
In the Land of Mordor where the Shadows lie.
One Ring to rule them all, One Ring to find them,
One Ring to bring them all and in the darkness bind them
In the Land of Mordor where the Shadows lie.


Dark Lord of the Forum


Morph your Mule

Need a little help with your MorphXT? Click here

0

#14 User is offline   FAQ 

  • Member Goofy
  • PipPipPipPipPipPipPip
  • Group: Banned
  • Posts: 1384
  • Joined: 05-May 05

Posted 23 July 2005 - 12:48 PM

Well said Andu. :+1:

If the devs refuse to use Slugfillers code, then they must provide better code by themselves and that is fine by me. :thumbup:
0

#15 User is offline   niRRity 

  • Avid Post Editor
  • PipPipPipPipPipPipPip
  • Group: Members
  • Posts: 1229
  • Joined: 28-January 03

Posted 23 July 2005 - 01:40 PM

Andu, on Jul 23 2005, 12:38 PM, said:

Seriously you both need to change your attitude. SlugFiller you should consider doing this less aggressively. There is no need to attack the devs. You can just provide your solution and tell it's advantages. On the other side Some Support should start considering looking into the code and ignore SlugFiller's overbearing nature and obviously give credit if the code SF provides is actually good or better than current code.

I'm really sick of this bickering that never leads anywhere because SF thinks he can do everything better and needs to show that while SomeSupport seems to be focused on ignoring or badmouthing the code.

Disclaimer: I might have got some things a bit wrong or exaggerated them but this is how I perceive them.
View Post


:+1:
0

#16 User is offline   Torni 

  • Stulle-Rider
  • PipPipPipPip
  • Group: Members
  • Posts: 163
  • Joined: 09-April 05

Posted 23 July 2005 - 04:52 PM

sorry for OT: but nice wizard....
Why was i deleted in ~April 2005 from this board?

Answer isn't here....
------------------------------
<--- leech-user (for you Stulle *g*)
<--- emule-user since 0.02
------------------------------
user posted image
0

#17 User is offline   SlugFiller 

  • The one and only master slug
  • PipPipPipPipPipPipPip
  • Group: Members
  • Posts: 6988
  • Joined: 15-September 02

Posted 24 July 2005 - 09:46 AM

Quote

SlugFiller you should consider doing this less aggressively.

Doing what less aggressively? Replying to Some Support's deliberately insulting comments?

Quote

You can just provide your solution and tell it's advantages.

First post said:

It features:
...

Why haven't you clicked yet?

SlugFiller rule #1: Unsolicited PMs is the second most efficient method to piss me off.
SlugFiller rule #2: The first most efficient method is unsolicited eMails.
SlugFiller rule #3: If it started in a thread, it should end in the same thread.
SlugFiller rule #4: There is absolutely no reason to perform the same discussion twice in parallel, especially if one side is done via PM.
SlugFiller rule #5: Does it say "Group: Moderators" under my name? No? Then stop telling me about who you want to ban! I really don't care! Go bother a moderator.
SlugFiller rule #6: I can understand English, Hebrew, and a bit of Japanese(standard) and Chinese(mandarin), but if you speak to me in anything but English, do expect to be utterly ignored, at best.
0

#18 User is offline   tHeWiZaRdOfDoS 

  • Man, what a bunch of jokers...
  • PipPipPipPipPipPipPip
  • Group: Members
  • Posts: 5630
  • Joined: 28-December 02

Posted 24 July 2005 - 09:52 AM

@OwenBurnett: check out new SF-IOM Beta3 in Slugs section :)
0

#19 User is offline   FAQ 

  • Member Goofy
  • PipPipPipPipPipPipPip
  • Group: Banned
  • Posts: 1384
  • Joined: 05-May 05

Posted 24 July 2005 - 10:01 AM

SlugFiller, on Jul 24 2005, 10:46 AM, said:

Quote

SlugFiller you should consider doing this less aggressively.

Doing what less aggressively? Replying to Some Support's deliberately insulting comments?
View Post

I think me meant both of you. Well, I did, but IMHO it's always entertaining to follow both of your posts. :D
0

#20 User is offline   Andu 

  • Morph Team
  • PipPipPipPipPipPipPip
  • Group: Members
  • Posts: 13015
  • Joined: 04-December 02

Posted 24 July 2005 - 09:40 PM

SlugFiller, on Jul 23 2005, 12:31 AM, said:

After a recent shrinking of the multi-sort code, thanks to the efforts of the official devs, I present to you the new, trimmer, slimmer, multi-sort.
View Post


Hm maybe I misunderstood that sentence? After reading it again it could be a compliment or a not so nice comment. If I misinterpreted the meaning then you can ignore the part of my post stating that you were being rude.
Three Rings for the Elven-kings under the sky,
Seven for the Dwarf-lords in their halls of stone,
Nine for Mortal Men doomed to die,
One for the Dark Lord on his dark throne
In the Land of Mordor where the Shadows lie.
One Ring to rule them all, One Ring to find them,
One Ring to bring them all and in the darkness bind them
In the Land of Mordor where the Shadows lie.


Dark Lord of the Forum


Morph your Mule

Need a little help with your MorphXT? Click here

0

  • Member Options

  • (2 Pages)
  • +
  • 1
  • 2

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users