Switch to side-by-side view

--- a/dirbrowser/cdbrowser.h
+++ b/dirbrowser/cdbrowser.h
@@ -25,6 +25,7 @@
 #include <vector>
 #include <iostream>
 #include <unordered_set>
+#include <unordered_map>
 
 #ifdef USING_WEBENGINE
 #include <QWebEngineView>
@@ -46,6 +47,7 @@
 #include "libupnpp/control/description.hxx"
 #include "libupnpp/control/mediaserver.hxx"
 #include "libupnpp/control/cdirectory.hxx"
+#include "libupnpp/control/cdircontent.hxx"
 
 #include "HelperStructs/MetaData.h"
 #include "HelperStructs/globals.h"
@@ -129,6 +131,17 @@
     void waitForPage();
     void mySetHtml(const QString&);
     void doCreatePopupMenu();
+
+    static const std::string CTTitleStartMarker;
+    void init_HTML();
+    static QString CTToHtml(unsigned int idx,
+                            const UPnPClient::UPnPDirObject& e);
+    static QString ItemToHtml(unsigned int idx,
+                              const UPnPClient::UPnPDirObject&, int maxartlen);
+    static QString DSToHtml(unsigned int idx,
+                            const UPnPClient::UPnPDeviceDesc& dev);
+    static QString initialServersPage();
+    static QString emptyServersPage();
     
     // When displaying the servers list, we periodically check the
     // server pool state. The last seen Media Server descriptions are
@@ -147,6 +160,9 @@
 
     std::vector<CtPathElt> m_curpath;
 
+    std::unordered_map<std::string, std::string> m_alphamap;
+    char m_curinitial{0};
+    
     // Threaded objects to perform directory reads and recursive walks
     CDBrowseQO *m_reader;
     RecursiveReaper    *m_reaper;