diff --git a/resources/js/toc.js b/resources/js/toc.js index 95ff7e7b6..73057c1d0 100644 --- a/resources/js/toc.js +++ b/resources/js/toc.js @@ -33,7 +33,7 @@ function recurseChild(elem, recurseData) recurseData.toc += (new Array(prevLevel+ 1)).join(''); recurseData.level = parseInt(level); - recurseData.toc += '
  • ' + headerText + ''; + recurseData.toc += '
  • ' + headerText + ''; } var c = elem.children; @@ -59,20 +59,41 @@ function tocHTMLStr() function openPop() { - var tocElem = document.getElementById("kiwix-toc"); + var tocElem = document.getElementById("kiwix-toc-side"); var isTOCVisible = tocElem.style.display === "block"; - tocElem.style.display = isTOCVisible ? "none" : "block"; + + if (isTOCVisible) + { + tocElem.style.display = "none"; + var c = document.body.children; + for (var i = 0; i < c.length; i++) + { + if (c[i] !== "undefined" && c[i].id !== "kiwix-toc-side" && c[i].style) + { + c[i].style.marginLeft = null; + } + } + } + else + { + tocElem.style.display = "block"; + var c = document.body.children; + for (var i = 0; i < c.length; i++) + { + if (c[i] !== "undefined" && c[i].id !== "kiwix-toc-side" && c[i].style) + { + c[i].style.marginLeft = "31vw"; + } + } + } } function tocPopupButtonElem() { - var tocPopupButton = document.createElement('input'); + var tocPopupButton = document.createElement('button'); tocPopupButton.id = "kiwix-toc-button" tocPopupButton.onclick = openPop; - tocPopupButton.type = "image"; - tocPopupButton.src = "data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' id='toc'%3E%3Cpath fill='none' d='M0 0h24v24H0V0zm0 0h24v24H0V0z'%3E%3C/path%3E%3Cpath d='M4 9h12c.55 0 1-.45 1-1s-.45-1-1-1H4c-.55 0-1 .45-1 1s.45 1 1 1zm0 4h12c.55 0 1-.45 1-1s-.45-1-1-1H4c-.55 0-1 .45-1 1s.45 1 1 1zm0 4h12c.55 0 1-.45 1-1s-.45-1-1-1H4c-.55 0-1 .45-1 1s.45 1 1 1zm15 0h2v-2h-2v2zm0-10v2h2V7h-2zm0 6h2v-2h-2v2z'%3E%3C/path%3E%3C/svg%3E%0A"; - tocPopupButton.width = 40; - tocPopupButton.height = 40; + tocPopupButton.textContent = "Hide"; return tocPopupButton; } @@ -82,9 +103,6 @@ function setupTOC() toc.id = "kiwix-toc"; tocContent = tocHTMLStr(); - if (tocContent.length == 0) - return; - toc.innerHTML += tocContent; var tocTitle = document.createElement('p'); @@ -95,8 +113,14 @@ function setupTOC() var tocDiv = document.createElement('div'); tocDiv.id = "kiwix-toc-div"; tocDiv.prepend(toc); - tocDiv.prepend(tocPopupButtonElem()); - document.body.prepend(tocDiv); + tocDiv.append(tocPopupButtonElem()); + + var tocSideDiv = document.createElement('div'); + tocSideDiv.id = "kiwix-toc-side"; + tocSideDiv.style.display = "none"; + + tocSideDiv.prepend(tocDiv); + document.body.prepend(tocSideDiv); } setupTOC(); \ No newline at end of file diff --git a/resources/js/tocStyle.js b/resources/js/tocStyle.js index c428474c6..adf2f7e0e 100644 --- a/resources/js/tocStyle.js +++ b/resources/js/tocStyle.js @@ -6,15 +6,15 @@ style.innerHTML = ` list-style-type: none; visibility: inherit; - unicode-bidi: plaintext; - text-align: start; - - font-size: 20px; + margin: 10px 30px; + margin-right: 0px; + font-size: 16px; + line-height: 20px; font-family: Arial; - - margin: 5px 20px; } +.kiwix-toc-item:before { content: counters(item, ".") " "; counter-increment: item } + .kiwix-toc-list { all: initial; display: block; @@ -22,6 +22,7 @@ style.innerHTML = ` margin: 0px; padding: 0px; + counter-reset: item; } .kiwix-toc-a { @@ -35,25 +36,31 @@ style.innerHTML = ` text-decoration: none; } -#kiwix-toc { - all: initial; - display: none; +.kiwix-toc-list-a { + color: inherit; + outline: none; + text-decoration: none; position: relative; + left: 10px; +} - max-height: 50vh; - max-width: 50vh; - width: max-content; - overflow-y: auto; +.kiwix-toc-list-a:hover { + color: inherit; + text-decoration: none; +} - padding: 8px; - padding-top: 0px; - background: white; - border: 1px solid #cccccc; - box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); +#kiwix-toc { + all: initial; + display: block; + + max-height: 100vh; + overflow: auto; + padding: 10px; + padding-top: 20px; } #kiwix-toc::-webkit-scrollbar { - width: 5px; + width: 0px; border: none; outline: none; } @@ -69,9 +76,11 @@ style.innerHTML = ` visibility: inherit; font-size: 24px; + line-height: 30px; font-weight: bold; font-family: Arial; - text-align: center; + unicode-bidi: plaintext; + text-align: start; margin-left: auto; margin-right: auto; @@ -80,28 +89,40 @@ style.innerHTML = ` #kiwix-toc-button { all: initial; position: relative; - display: block; + height: max-content; background: white; - margin: 0px; - padding 0px; - outline: none; - border: 1px solid #ccc; - border-radius: 3px; + color: #3366CC; + padding: 0px; + margin: 10px; + margin-top: 30px; + font-size: 12px; + font-family: Arial; + line-height: 16px; + font-weight: bold; } #kiwix-toc-button:hover { - border: 1px solid #3366CC; - background-color: #D9E9FF; + text-decoration: underline; } #kiwix-toc-div { all: initial; - display: block; + display: flex; + justify-content: space-between; + height: 100vh; font-size: 0px; - margin: 8px; + margin: 0px; +} + +#kiwix-toc-side { position: fixed; top: 0px; + min-width: 30vw; + max-width: 30vw; + height: 100%; z-index: 1000; + border-right: 1px solid #ccc; + border-left: 1px solid #ccc; } ` document.head.appendChild(style); diff --git a/src/kiwixapp.cpp b/src/kiwixapp.cpp index 58fe0e556..fe3bdc7d5 100644 --- a/src/kiwixapp.cpp +++ b/src/kiwixapp.cpp @@ -443,8 +443,7 @@ void KiwixApp::createActions() }); mpa_actions[ToggleFullscreenAction]->setCheckable(true); - CREATE_ACTION_SHORTCUT(ToggleTOCAction, gt("table-of-content"), QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_1)); - HIDE_ACTION(ToggleTOCAction); + CREATE_ACTION_ICON_SHORTCUT(ToggleTOCAction, "toc", gt("table-of-content"), QKeySequence(Qt::CTRL | Qt::Key_M)); CREATE_ACTION_ONOFF_ICON_SHORTCUT(ToggleReadingListAction, "reading-list-active", "reading-list", gt("reading-list"), QKeySequence(Qt::CTRL | Qt::Key_B)); diff --git a/src/tabbar.cpp b/src/tabbar.cpp index a3b2d7861..1093d3c12 100644 --- a/src/tabbar.cpp +++ b/src/tabbar.cpp @@ -60,6 +60,39 @@ TabBar::TabBar(QWidget *parent) : // the slot relies the connection will be direct to reverting back the tab connect(this, SIGNAL(tabMoved(int,int)), this, SLOT(onTabMoved(int,int)), Qt::DirectConnection); + + connect(getAction(KiwixApp::ToggleTOCAction), &QAction::triggered, [=](){ + if (ZimView* view = currentZimView()) + { + view->getWebView()->page()->runJavaScript("var tocElem = document.getElementById(\"kiwix-toc-side\");" + "var isTOCVisible = tocElem.style.display === \"block\";" + + "if (isTOCVisible)" + "{" + "tocElem.style.display = \"none\";" + "var c = document.body.children;" + "for (var i = 0; i < c.length; i++)" + "{" + "if (c[i] !== \"undefined\" && c[i].id !== \"kiwix-toc-side\" && c[i].style) " + "{" + "c[i].style.marginLeft = null;" + "}" + "}" + "}" + "else" + "{" + "tocElem.style.display = \"block\";" + "var c = document.body.children;" + "for (var i = 0; i < c.length; i++)" + "{" + "if (c[i] !== \"undefined\" && c[i].id !== \"kiwix-toc-side\" && c[i].style) " + "{" + "c[i].style.marginLeft = \"31vw\"; " + "}" + "}" + "}"); + } + }); } void TabBar::openHomePage() { diff --git a/src/topwidget.cpp b/src/topwidget.cpp index c29d59279..9843b0bf9 100644 --- a/src/topwidget.cpp +++ b/src/topwidget.cpp @@ -30,6 +30,9 @@ TopWidget::TopWidget(QWidget *parent) : QAction *random = app->getAction(KiwixApp::RandomArticleAction); addAction(random); + QAction *toc = app->getAction(KiwixApp::ToggleTOCAction); + addAction(toc); + // For CSS if (QGuiApplication::isLeftToRight()) { widgetForAction(back)->setObjectName("leftHistoryButton"); diff --git a/src/webpage.cpp b/src/webpage.cpp index abba46037..53ee6fd9d 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -34,7 +34,6 @@ WebPage::WebPage(QObject *parent) : auto tocScript = getScript(":/js/toc.js"); auto source = tocScript.sourceCode().prepend("const KIWIX_GT_CONTENT = \"" + gt("table-of-content") + "\";"); tocScript.setSourceCode(source); - qInfo() << source; scripts().insert(tocScript); scripts().insert(getScript(":/js/tocStyle.js")); }