From 3db7b94bade759fd922d0ddeede72e8e5123ad32 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Tue, 13 Oct 2015 19:33:46 +0200 Subject: [PATCH 01/74] [#242] Make order of HTML Preview/Source toggle more sensible --- app/mainwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 52d06008..cb967437 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -735,7 +735,7 @@ void MainWindow::toggleHtmlView() if (viewLabel->text() == tr("HTML preview")) { ui->stackedWidget->setCurrentWidget(ui->htmlSourcePage); - ui->actionHtmlPreview->setText(tr("HTML source")); + ui->actionHtmlPreview->setText(tr("HTML preview")); viewLabel->setText(tr("HTML source")); // activate HTML highlighter @@ -744,7 +744,7 @@ void MainWindow::toggleHtmlView() } else { ui->stackedWidget->setCurrentWidget(ui->webViewPage); - ui->actionHtmlPreview->setText(tr("HTML preview")); + ui->actionHtmlPreview->setText(tr("HTML source")); viewLabel->setText(tr("HTML preview")); // deactivate HTML highlighter From 1b1bbccebb0f3cbfa989e19f8104d366ab212b5c Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Tue, 13 Oct 2015 19:35:53 +0200 Subject: [PATCH 02/74] [#241] Add missing mermaid.css to improve mermaid output --- app-static/template/htmltemplate.cpp | 1 + app/resources.qrc | 1 + app/scripts/mermaid/mermaid.css | 256 +++++++++++++++++++++++++++ 3 files changed, 258 insertions(+) create mode 100644 app/scripts/mermaid/mermaid.css diff --git a/app-static/template/htmltemplate.cpp b/app-static/template/htmltemplate.cpp index f7a2d67e..1781ce68 100644 --- a/app-static/template/htmltemplate.cpp +++ b/app-static/template/htmltemplate.cpp @@ -108,6 +108,7 @@ QString HtmlTemplate::buildHtmlHeader(RenderOptions options) const // add mermaid.js script to HTML header if (options.testFlag(Template::DiagramSupport)) { + header += "\n"; header += "\n"; } diff --git a/app/resources.qrc b/app/resources.qrc index 508dfc21..9f1c91bc 100644 --- a/app/resources.qrc +++ b/app/resources.qrc @@ -45,5 +45,6 @@ scripts/highlight.js/styles/github.css scripts/highlight.js/styles/solarized_dark.css scripts/mermaid/mermaid.full.min.js + scripts/mermaid/mermaid.css diff --git a/app/scripts/mermaid/mermaid.css b/app/scripts/mermaid/mermaid.css new file mode 100644 index 00000000..92802a46 --- /dev/null +++ b/app/scripts/mermaid/mermaid.css @@ -0,0 +1,256 @@ +/* Flowchart variables */ +/* Sequence Diagram variables */ +/* Gantt chart variables */ +.mermaid .label { + color: #333333; +} +.node rect, +.node circle, +.node polygon { + fill: #ececff; + stroke: #ccccff; + stroke-width: 1px; +} +.edgePath .path { + stroke: #333333; +} +.cluster rect { + fill: #ffffde; + rx: 40; + stroke: #aaaa33; + stroke-width: 1px; +} +.cluster text { + fill: #333333; +} +.actor { + stroke: #ccccff; + fill: #ececff; +} +text.actor { + fill: black; + stroke: none; +} +.actor-line { + stroke: grey; +} +.messageLine0 { + stroke-width: 1.5; + stroke-dasharray: "2 2"; + marker-end: "url(#arrowhead)"; + stroke: #333333; +} +.messageLine1 { + stroke-width: 1.5; + stroke-dasharray: "2 2"; + stroke: #333333; +} +#arrowhead { + fill: #333333; +} +#crosshead path { + fill: #333333 !important; + stroke: #333333 !important; +} +.messageText { + fill: #333333; + stroke: none; +} +.labelBox { + stroke: #ccccff; + fill: #ececff; +} +.labelText { + fill: black; + stroke: none; +} +.loopText { + fill: black; + stroke: none; +} +.loopLine { + stroke-width: 2; + stroke-dasharray: "2 2"; + marker-end: "url(#arrowhead)"; + stroke: #ccccff; +} +.note { + stroke: #aaaa33; + fill: #fff5ad; +} +.noteText { + fill: black; + stroke: none; + font-family: 'trebuchet ms', verdana, arial; + font-size: 14px; +} +/** Section styling */ +.section { + stroke: none; + opacity: 0.2; +} +.section0 { + fill: rgba(102, 102, 255, 0.49); +} +.section2 { + fill: #fff400; +} +.section1, +.section3 { + fill: white; + opacity: 0.2; +} +.sectionTitle0 { + fill: #333333; +} +.sectionTitle1 { + fill: #333333; +} +.sectionTitle2 { + fill: #333333; +} +.sectionTitle3 { + fill: #333333; +} +.sectionTitle { + text-anchor: start; + font-size: 11px; + text-height: 14px; +} +/* Grid and axis */ +.grid .tick { + stroke: lightgrey; + opacity: 0.3; + shape-rendering: crispEdges; +} +.grid path { + stroke-width: 0; +} +/* Today line */ +.today { + fill: none; + stroke: red; + stroke-width: 2px; +} +/* Task styling */ +/* Default task */ +.task { + stroke-width: 2; +} +.taskText { + text-anchor: middle; + font-size: 11px; +} +.taskTextOutsideRight { + fill: black; + text-anchor: start; + font-size: 11px; +} +.taskTextOutsideLeft { + fill: black; + text-anchor: end; + font-size: 11px; +} +/* Specific task settings for the sections*/ +.taskText0, +.taskText1, +.taskText2, +.taskText3 { + fill: white; +} +.task0, +.task1, +.task2, +.task3 { + fill: #8a90dd; + stroke: #534fbc; +} +.taskTextOutside0, +.taskTextOutside2 { + fill: black; +} +.taskTextOutside1, +.taskTextOutside3 { + fill: black; +} +/* Active task */ +.active0, +.active1, +.active2, +.active3 { + fill: #bfc7ff; + stroke: #534fbc; +} +.activeText0, +.activeText1, +.activeText2, +.activeText3 { + fill: black !important; +} +/* Completed task */ +.done0, +.done1, +.done2, +.done3 { + stroke: grey; + fill: lightgrey; + stroke-width: 2; +} +.doneText0, +.doneText1, +.doneText2, +.doneText3 { + fill: black !important; +} +/* Tasks on the critical line */ +.crit0, +.crit1, +.crit2, +.crit3 { + stroke: #ff8888; + fill: red; + stroke-width: 2; +} +.activeCrit0, +.activeCrit1, +.activeCrit2, +.activeCrit3 { + stroke: #ff8888; + fill: #bfc7ff; + stroke-width: 2; +} +.doneCrit0, +.doneCrit1, +.doneCrit2, +.doneCrit3 { + stroke: #ff8888; + fill: lightgrey; + stroke-width: 2; + cursor: pointer; + shape-rendering: crispEdges; +} +.doneCritText0, +.doneCritText1, +.doneCritText2, +.doneCritText3 { + fill: black !important; +} +.activeCritText0, +.activeCritText1, +.activeCritText2, +.activeCritText3 { + fill: black !important; +} +.titleText { + text-anchor: middle; + font-size: 18px; + fill: black; +} +/* + + +*/ +text { + font-family: 'trebuchet ms', verdana, arial; + font-size: 14px; +} From 90e21e2aecb49a549d0d262e58f950dda0d93d2f Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Wed, 28 Oct 2015 15:52:13 +0100 Subject: [PATCH 03/74] Reindent file --- test/integration/htmltemplatetest.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/test/integration/htmltemplatetest.cpp b/test/integration/htmltemplatetest.cpp index 59065be3..13e26b49 100644 --- a/test/integration/htmltemplatetest.cpp +++ b/test/integration/htmltemplatetest.cpp @@ -28,33 +28,33 @@ static const QString HIGHLIGHT_JS = QStringLiteral("TEST

", 0); + QString html = htmlTemplate.render("

TEST

", 0); const QString expected = QStringLiteral("%1\n

TEST

") - .arg(SCROLL_SCRIPT); - QCOMPARE(html, expected); + .arg(SCROLL_SCRIPT); + QCOMPARE(html, expected); } void HtmlTemplateTest::rendersMermaidGraphInsideCodeTags() { - HtmlTemplate htmlTemplate(HTML_TEMPLATE); + HtmlTemplate htmlTemplate(HTML_TEMPLATE); - QString html = htmlTemplate.render("
TEST
", HtmlTemplate::DiagramSupport); + QString html = htmlTemplate.render("
TEST
", HtmlTemplate::DiagramSupport); const QString expected = QStringLiteral("%1\n%2\n
TEST
") - .arg(SCROLL_SCRIPT).arg(MERMAID_JS); - QCOMPARE(html, expected); + .arg(SCROLL_SCRIPT).arg(MERMAID_JS); + QCOMPARE(html, expected); } void HtmlTemplateTest::replacesMermaidCodeTagsByDivTagsIfCodeHighlightingEnabled() { - HtmlTemplate htmlTemplate(HTML_TEMPLATE); + HtmlTemplate htmlTemplate(HTML_TEMPLATE); - QString html = htmlTemplate.render("
TEST
", HtmlTemplate::DiagramSupport | HtmlTemplate::CodeHighlighting); + QString html = htmlTemplate.render("
TEST
", HtmlTemplate::DiagramSupport | HtmlTemplate::CodeHighlighting); const QString expected = QStringLiteral("%1\n%2\n%3\n
\nTEST
") - .arg(SCROLL_SCRIPT).arg(HIGHLIGHT_JS).arg(MERMAID_JS); - QCOMPARE(html, expected); + .arg(SCROLL_SCRIPT).arg(HIGHLIGHT_JS).arg(MERMAID_JS); + QCOMPARE(html, expected); } From 7dc7d7f6b00c25982be09bb00a8ef3ed66748ad1 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Wed, 28 Oct 2015 18:35:29 +0100 Subject: [PATCH 04/74] Fix integration tests after changes to HtmlTemplate class --- test/integration/htmltemplatetest.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/integration/htmltemplatetest.cpp b/test/integration/htmltemplatetest.cpp index 13e26b49..750d7941 100644 --- a/test/integration/htmltemplatetest.cpp +++ b/test/integration/htmltemplatetest.cpp @@ -23,6 +23,7 @@ static const QString HTML_TEMPLATE = QStringLiteral(""); static const QString SCROLL_SCRIPT = QStringLiteral(""); +static const QString MERMAID_CSS = QStringLiteral(""); static const QString MERMAID_JS = QStringLiteral(""); static const QString HIGHLIGHT_JS = QStringLiteral("\n\n"); @@ -43,8 +44,8 @@ void HtmlTemplateTest::rendersMermaidGraphInsideCodeTags() QString html = htmlTemplate.render("
TEST
", HtmlTemplate::DiagramSupport); - const QString expected = QStringLiteral("%1\n%2\n
TEST
") - .arg(SCROLL_SCRIPT).arg(MERMAID_JS); + const QString expected = QStringLiteral("%1\n%2\n%3\n
TEST
") + .arg(SCROLL_SCRIPT).arg(MERMAID_CSS).arg(MERMAID_JS); QCOMPARE(html, expected); } @@ -54,7 +55,7 @@ void HtmlTemplateTest::replacesMermaidCodeTagsByDivTagsIfCodeHighlightingEnabled QString html = htmlTemplate.render("
TEST
", HtmlTemplate::DiagramSupport | HtmlTemplate::CodeHighlighting); - const QString expected = QStringLiteral("%1\n%2\n%3\n
\nTEST
") - .arg(SCROLL_SCRIPT).arg(HIGHLIGHT_JS).arg(MERMAID_JS); + const QString expected = QStringLiteral("%1\n%2\n%3\n%4\n
\nTEST
") + .arg(SCROLL_SCRIPT).arg(HIGHLIGHT_JS).arg(MERMAID_CSS).arg(MERMAID_JS); QCOMPARE(html, expected); } From 7218d8b85fff8471bd1f93f5be1ecd47960973e6 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Fri, 20 Nov 2015 19:46:48 +0100 Subject: [PATCH 05/74] [#232] Remember scrollbar position after synchronization Remember vertical scrollbar position of the editor after it has been changed. This should prevent the jumping of the editor pane during editing of the markdown text. --- app-static/htmlviewsynchronizer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app-static/htmlviewsynchronizer.cpp b/app-static/htmlviewsynchronizer.cpp index 87905e02..3ef6061c 100644 --- a/app-static/htmlviewsynchronizer.cpp +++ b/app-static/htmlviewsynchronizer.cpp @@ -46,6 +46,9 @@ void HtmlViewSynchronizer::webViewScrolled() int value = m_webView->page()->mainFrame()->scrollBarValue(Qt::Vertical); m_editor->verticalScrollBar()->setValue(qRound(value * factor)); + + // remember new vertical scrollbar position of markdown editor + rememberScrollBarPos(); } void HtmlViewSynchronizer::scrollValueChanged(int value) From 93673ad21551c635babd52da0d5e21974706204e Mon Sep 17 00:00:00 2001 From: Matthias Pohl Date: Mon, 30 Nov 2015 11:05:43 +0100 Subject: [PATCH 06/74] Ensure that document is of correct type --- app-static/converter/revealmarkdownconverter.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app-static/converter/revealmarkdownconverter.cpp b/app-static/converter/revealmarkdownconverter.cpp index ff911468..f20bf2b7 100644 --- a/app-static/converter/revealmarkdownconverter.cpp +++ b/app-static/converter/revealmarkdownconverter.cpp @@ -30,7 +30,8 @@ QString RevealMarkdownConverter::renderAsHtml(MarkdownDocument *document) if (document) { RevealMarkdownDocument *doc = dynamic_cast(document); - html = doc->markdownText; + if(doc) + html = doc->markdownText; } return html; From 92ca3786161dc7b3fc7af2fbc3a6bee3fd968b27 Mon Sep 17 00:00:00 2001 From: Matthias Pohl Date: Mon, 30 Nov 2015 13:11:56 +0100 Subject: [PATCH 07/74] fix for hoedown converter as well and code styling --- app-static/converter/hoedownmarkdownconverter.cpp | 2 +- app-static/converter/revealmarkdownconverter.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app-static/converter/hoedownmarkdownconverter.cpp b/app-static/converter/hoedownmarkdownconverter.cpp index 46392fe6..97808bee 100644 --- a/app-static/converter/hoedownmarkdownconverter.cpp +++ b/app-static/converter/hoedownmarkdownconverter.cpp @@ -88,7 +88,7 @@ QString HoedownMarkdownConverter::renderAsHtml(MarkdownDocument *document) if (document) { HoedownMarkdownDocument *doc = dynamic_cast(document); - if (doc->document()) { + if (doc && doc->document()) { hoedown_buffer *in = doc->document(); hoedown_buffer *out = hoedown_buffer_new(64); diff --git a/app-static/converter/revealmarkdownconverter.cpp b/app-static/converter/revealmarkdownconverter.cpp index f20bf2b7..72489a14 100644 --- a/app-static/converter/revealmarkdownconverter.cpp +++ b/app-static/converter/revealmarkdownconverter.cpp @@ -30,8 +30,9 @@ QString RevealMarkdownConverter::renderAsHtml(MarkdownDocument *document) if (document) { RevealMarkdownDocument *doc = dynamic_cast(document); - if(doc) + if (doc) { html = doc->markdownText; + } } return html; From 2ac71ccc455df411471269d9a5ec1e52c11bb40a Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Wed, 9 Dec 2015 09:43:57 +0100 Subject: [PATCH 08/74] Introduce Theme class A theme represents the combination of markdown, code and preview styles. --- app-static/app-static.pro | 2 + app-static/themes/theme.cpp | 45 ++++++++++++++++++++ app-static/themes/theme.h | 60 ++++++++++++++++++++++++++ test/unit/main.cpp | 6 ++- test/unit/themetest.cpp | 84 +++++++++++++++++++++++++++++++++++++ test/unit/themetest.h | 36 ++++++++++++++++ test/unit/unit.pro | 6 ++- 7 files changed, 236 insertions(+), 3 deletions(-) create mode 100644 app-static/themes/theme.cpp create mode 100644 app-static/themes/theme.h create mode 100644 test/unit/themetest.cpp create mode 100644 test/unit/themetest.h diff --git a/app-static/app-static.pro b/app-static/app-static.pro index 1e760ff5..07ba25e2 100644 --- a/app-static/app-static.pro +++ b/app-static/app-static.pro @@ -21,6 +21,7 @@ SOURCES += \ converter/revealmarkdownconverter.cpp \ template/htmltemplate.cpp \ template/presentationtemplate.cpp \ + themes/theme.cpp \ completionlistmodel.cpp \ datalocation.cpp \ slidelinemapping.cpp \ @@ -43,6 +44,7 @@ HEADERS += \ template/template.h \ template/htmltemplate.h \ template/presentationtemplate.h \ + themes/theme.h \ completionlistmodel.h \ datalocation.h \ slidelinemapping.h \ diff --git a/app-static/themes/theme.cpp b/app-static/themes/theme.cpp new file mode 100644 index 00000000..7a88d417 --- /dev/null +++ b/app-static/themes/theme.cpp @@ -0,0 +1,45 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "theme.h" + +Theme::Theme(const QString &name, + const QString &markdownHighlighting, + const QString &codeHighlighting, + const QString &previewStylesheet) : + m_name(name), + m_markdownHighlighting(markdownHighlighting), + m_codeHighlighting(codeHighlighting), + m_previewStylesheet(previewStylesheet) +{ + checkInvariants(); +} + +void Theme::checkInvariants() const +{ + if (m_name.isEmpty()) { + throw std::runtime_error("theme name must not be empty"); + } + if (m_markdownHighlighting.isEmpty()) { + throw std::runtime_error("markdown highlighting style must not be empty"); + } + if (m_codeHighlighting.isEmpty()) { + throw std::runtime_error("code highlighting style must not be empty"); + } + if (m_previewStylesheet.isEmpty()) { + throw std::runtime_error("preview stylesheet must not be empty"); + } +} diff --git a/app-static/themes/theme.h b/app-static/themes/theme.h new file mode 100644 index 00000000..94b4c5c2 --- /dev/null +++ b/app-static/themes/theme.h @@ -0,0 +1,60 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef THEME_H +#define THEME_H + +#include +#include + + +class Theme +{ +public: + Theme(const QString &name, + const QString &markdownHighlighting, + const QString &codeHighlighting, + const QString &previewStylesheet); + + QString name() const { return m_name; } + + QString markdownHighlighting() const { return m_markdownHighlighting; } + + QString codeHighlighting() const { return m_codeHighlighting; } + + QString previewStylesheet() const { return m_previewStylesheet; } + + bool operator<(const Theme &rhs) const + { + return m_name < rhs.name(); + } + + bool operator ==(const Theme &rhs) const + { + return m_name == rhs.name(); + } + +private: + void checkInvariants() const; + +private: + QString m_name; + QString m_markdownHighlighting; + QString m_codeHighlighting; + QString m_previewStylesheet; +}; + +#endif // THEME_H diff --git a/test/unit/main.cpp b/test/unit/main.cpp index 155b2995..2b0c98ea 100644 --- a/test/unit/main.cpp +++ b/test/unit/main.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2013-2014 Christian Loose + * Copyright 2013-2015 Christian Loose * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ #include "snippetcollectiontest.h" #include "completionlistmodeltest.h" #include "snippettest.h" +#include "themetest.h" #include "yamlheadercheckertest.h" int main(int argc, char *argv[]) @@ -53,5 +54,8 @@ int main(int argc, char *argv[]) YamlHeaderCheckerTest test8; ret += QTest::qExec(&test8, argc, argv); + ThemeTest test9; + ret += QTest::qExec(&test9, argc, argv); + return ret; } diff --git a/test/unit/themetest.cpp b/test/unit/themetest.cpp new file mode 100644 index 00000000..5d97e36b --- /dev/null +++ b/test/unit/themetest.cpp @@ -0,0 +1,84 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "themetest.h" + +#include + +#include + +static const QLatin1String A_THEME_NAME("name"); +static const QLatin1String A_MARKDOWN_HIGHLIGHTING("markdown"); +static const QLatin1String A_CODE_HIGHLIGHTING("code"); +static const QLatin1String A_PREVIEW_STYLESHEET("preview"); + +void ThemeTest::isLessThanComparable() +{ + Theme theme1("abc", A_MARKDOWN_HIGHLIGHTING, A_CODE_HIGHLIGHTING, A_PREVIEW_STYLESHEET); + + Theme theme2("xyz", A_MARKDOWN_HIGHLIGHTING, A_CODE_HIGHLIGHTING, A_PREVIEW_STYLESHEET); + + QCOMPARE(theme1 < theme2, true); + QCOMPARE(theme2 < theme1, false); + QCOMPARE(theme1 < theme1, false); +} + +void ThemeTest::isEqualComparable() +{ + Theme theme1("abc", A_MARKDOWN_HIGHLIGHTING, A_CODE_HIGHLIGHTING, A_PREVIEW_STYLESHEET); + + Theme theme2("abc", A_MARKDOWN_HIGHLIGHTING, A_CODE_HIGHLIGHTING, A_PREVIEW_STYLESHEET); + + Theme theme3("xyz", A_MARKDOWN_HIGHLIGHTING, A_CODE_HIGHLIGHTING, A_PREVIEW_STYLESHEET); + + QCOMPARE(theme1 == theme1, true); + QCOMPARE(theme1 == theme2, true); + QCOMPARE(theme1 == theme3, false); +} + +void ThemeTest::throwsIfNameIsEmpty() +{ + try { + Theme theme("", A_MARKDOWN_HIGHLIGHTING, A_CODE_HIGHLIGHTING, A_PREVIEW_STYLESHEET); + QFAIL("Expected exception of type runtime_error not thrown"); + } catch(const std::runtime_error &) {} +} + +void ThemeTest::throwsIfMarkdownHighlightingIsEmpty() +{ + try { + Theme theme(A_THEME_NAME, "", A_CODE_HIGHLIGHTING, A_PREVIEW_STYLESHEET); + QFAIL("Expected exception of type runtime_error not thrown"); + } catch(const std::runtime_error &) {} +} + +void ThemeTest::throwsIfCodeHighlightingIsEmpty() +{ + try { + Theme theme(A_THEME_NAME, A_MARKDOWN_HIGHLIGHTING, "", A_PREVIEW_STYLESHEET); + QFAIL("Expected exception of type runtime_error not thrown"); + } catch(const std::runtime_error &) {} +} + +void ThemeTest::throwsIfPreviewStylesheetIsEmpty() +{ + try { + Theme theme(A_THEME_NAME, A_MARKDOWN_HIGHLIGHTING, A_CODE_HIGHLIGHTING, ""); + QFAIL("Expected exception of type runtime_error not thrown"); + } catch(const std::runtime_error &) {} +} + + diff --git a/test/unit/themetest.h b/test/unit/themetest.h new file mode 100644 index 00000000..9e567742 --- /dev/null +++ b/test/unit/themetest.h @@ -0,0 +1,36 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef THEMETEST_H +#define THEMETEST_H + +#include + +class ThemeTest : public QObject +{ + Q_OBJECT + +private slots: + void isLessThanComparable(); + void isEqualComparable(); + void throwsIfNameIsEmpty(); + void throwsIfMarkdownHighlightingIsEmpty(); + void throwsIfCodeHighlightingIsEmpty(); + void throwsIfPreviewStylesheetIsEmpty(); +}; + +#endif // THEMETEST_H + diff --git a/test/unit/unit.pro b/test/unit/unit.pro index ac004fe8..4742605f 100644 --- a/test/unit/unit.pro +++ b/test/unit/unit.pro @@ -18,7 +18,8 @@ SOURCES += \ slidelinemappingtest.cpp \ snippetcollectiontest.cpp \ dictionarytest.cpp \ - yamlheadercheckertest.cpp + yamlheadercheckertest.cpp \ + themetest.cpp HEADERS += \ completionlistmodeltest.h \ @@ -28,7 +29,8 @@ HEADERS += \ slidelinemappingtest.h \ snippetcollectiontest.h \ dictionarytest.h \ - yamlheadercheckertest.h + yamlheadercheckertest.h \ + themetest.h target.CONFIG += no_default_install From 8b227fd2db508336b1662db9fce438b9ec47bd1a Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Wed, 9 Dec 2015 11:42:22 +0100 Subject: [PATCH 09/74] Introduce ThemeCollection class A collection of themes that can be loaded from a JSON file. --- app-static/app-static.pro | 2 ++ app-static/themes/themecollection.cpp | 40 ++++++++++++++++++++++ app-static/themes/themecollection.h | 42 +++++++++++++++++++++++ test/unit/main.cpp | 4 +++ test/unit/themecollectiontest.cpp | 49 +++++++++++++++++++++++++++ test/unit/themecollectiontest.h | 34 +++++++++++++++++++ test/unit/unit.pro | 6 ++-- 7 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 app-static/themes/themecollection.cpp create mode 100644 app-static/themes/themecollection.h create mode 100644 test/unit/themecollectiontest.cpp create mode 100644 test/unit/themecollectiontest.h diff --git a/app-static/app-static.pro b/app-static/app-static.pro index 07ba25e2..5a2c9eac 100644 --- a/app-static/app-static.pro +++ b/app-static/app-static.pro @@ -22,6 +22,7 @@ SOURCES += \ template/htmltemplate.cpp \ template/presentationtemplate.cpp \ themes/theme.cpp \ + themes/themecollection.cpp \ completionlistmodel.cpp \ datalocation.cpp \ slidelinemapping.cpp \ @@ -45,6 +46,7 @@ HEADERS += \ template/htmltemplate.h \ template/presentationtemplate.h \ themes/theme.h \ + themes/themecollection.h \ completionlistmodel.h \ datalocation.h \ slidelinemapping.h \ diff --git a/app-static/themes/themecollection.cpp b/app-static/themes/themecollection.cpp new file mode 100644 index 00000000..e9f86c1a --- /dev/null +++ b/app-static/themes/themecollection.cpp @@ -0,0 +1,40 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "themecollection.h" + + +int ThemeCollection::insert(const Theme &theme) +{ + themesIndex << theme.name(); + themes << theme; + return 0; +} + +int ThemeCollection::count() const +{ + return themes.count(); +} + +const Theme &ThemeCollection::at(int offset) const +{ + return themes.at(offset); +} + +const QString ThemeCollection::name() const +{ + return QStringLiteral("themes"); +} diff --git a/app-static/themes/themecollection.h b/app-static/themes/themecollection.h new file mode 100644 index 00000000..ca7a18e0 --- /dev/null +++ b/app-static/themes/themecollection.h @@ -0,0 +1,42 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef THEMECOLLECTION_H +#define THEMECOLLECTION_H + +#include +#include +#include +#include "theme.h" + + +class ThemeCollection : public JsonCollection +{ +public: + int insert(const Theme &theme); + + int count() const; + const Theme &at(int offset) const; + + const QString name() const; + +private: + QStringList themesIndex; + QList themes; +}; + +#endif // THEMECOLLECTION_H + diff --git a/test/unit/main.cpp b/test/unit/main.cpp index 2b0c98ea..9b247d73 100644 --- a/test/unit/main.cpp +++ b/test/unit/main.cpp @@ -23,6 +23,7 @@ #include "snippetcollectiontest.h" #include "completionlistmodeltest.h" #include "snippettest.h" +#include "themecollectiontest.h" #include "themetest.h" #include "yamlheadercheckertest.h" @@ -57,5 +58,8 @@ int main(int argc, char *argv[]) ThemeTest test9; ret += QTest::qExec(&test9, argc, argv); + ThemeCollectionTest test10; + ret += QTest::qExec(&test10, argc, argv); + return ret; } diff --git a/test/unit/themecollectiontest.cpp b/test/unit/themecollectiontest.cpp new file mode 100644 index 00000000..6a157495 --- /dev/null +++ b/test/unit/themecollectiontest.cpp @@ -0,0 +1,49 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "themecollectiontest.h" + +#include + +#include + + +void ThemeCollectionTest::returnsConstantNameOfJsonArray() +{ + ThemeCollection collection; + QCOMPARE(collection.name(), QStringLiteral("themes")); +} + +void ThemeCollectionTest::returnsNumberOfThemesInCollection() +{ + ThemeCollection collection; + Theme theme("name", "markdown", "code", "preview"); + collection.insert(theme); + + QCOMPARE(collection.count(), 1); +} + +void ThemeCollectionTest::returnsThemeAtIndexPosition() +{ + ThemeCollection collection; + Theme theme("name", "markdown", "code", "preview"); + collection.insert(theme); + + Theme actual = collection.at(0); + + QCOMPARE(actual, theme); +} + diff --git a/test/unit/themecollectiontest.h b/test/unit/themecollectiontest.h new file mode 100644 index 00000000..df274fdd --- /dev/null +++ b/test/unit/themecollectiontest.h @@ -0,0 +1,34 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef THEMECOLLECTIONTEST_H +#define THEMECOLLECTIONTEST_H + +#include + +class ThemeCollectionTest : public QObject +{ + Q_OBJECT + +private slots: + void returnsConstantNameOfJsonArray(); + void returnsNumberOfThemesInCollection(); + void returnsThemeAtIndexPosition(); +}; + +#endif // THEMECOLLECTIONTEST_H + + diff --git a/test/unit/unit.pro b/test/unit/unit.pro index 4742605f..336f9284 100644 --- a/test/unit/unit.pro +++ b/test/unit/unit.pro @@ -19,7 +19,8 @@ SOURCES += \ snippetcollectiontest.cpp \ dictionarytest.cpp \ yamlheadercheckertest.cpp \ - themetest.cpp + themetest.cpp \ + themecollectiontest.cpp HEADERS += \ completionlistmodeltest.h \ @@ -30,7 +31,8 @@ HEADERS += \ snippetcollectiontest.h \ dictionarytest.h \ yamlheadercheckertest.h \ - themetest.h + themetest.h \ + themecollectiontest.h target.CONFIG += no_default_install From cd8ea26f63d9a2c32570c12a59eb8ce3ff91ca1a Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Wed, 9 Dec 2015 12:47:21 +0100 Subject: [PATCH 10/74] Add JSON translator for themes Add JsonThemeTranslator class to translate between JSON and Theme objects. --- app-static/app-static.pro | 2 + app-static/themes/jsonthemetranslator.cpp | 48 +++++++++ app-static/themes/jsonthemetranslator.h | 34 +++++++ test/unit/jsonthemetranslatortest.cpp | 117 ++++++++++++++++++++++ test/unit/jsonthemetranslatortest.h | 44 ++++++++ test/unit/main.cpp | 4 + test/unit/unit.pro | 2 + 7 files changed, 251 insertions(+) create mode 100644 app-static/themes/jsonthemetranslator.cpp create mode 100644 app-static/themes/jsonthemetranslator.h create mode 100644 test/unit/jsonthemetranslatortest.cpp create mode 100644 test/unit/jsonthemetranslatortest.h diff --git a/app-static/app-static.pro b/app-static/app-static.pro index 5a2c9eac..ec4f8a97 100644 --- a/app-static/app-static.pro +++ b/app-static/app-static.pro @@ -21,6 +21,7 @@ SOURCES += \ converter/revealmarkdownconverter.cpp \ template/htmltemplate.cpp \ template/presentationtemplate.cpp \ + themes/jsonthemetranslator.cpp \ themes/theme.cpp \ themes/themecollection.cpp \ completionlistmodel.cpp \ @@ -45,6 +46,7 @@ HEADERS += \ template/template.h \ template/htmltemplate.h \ template/presentationtemplate.h \ + themes/jsonthemetranslator.h \ themes/theme.h \ themes/themecollection.h \ completionlistmodel.h \ diff --git a/app-static/themes/jsonthemetranslator.cpp b/app-static/themes/jsonthemetranslator.cpp new file mode 100644 index 00000000..fb671b7d --- /dev/null +++ b/app-static/themes/jsonthemetranslator.cpp @@ -0,0 +1,48 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "jsonthemetranslator.h" + +namespace { + +static const QLatin1String NAME("name"); +static const QLatin1String MARKDOWN_HIGHLIGHTING("markdownHighlighting"); +static const QLatin1String CODE_HIGHLIGHTING("codeHighlighting"); +static const QLatin1String PREVIEW_STYLESHEET("previewStylesheet"); + +} + +Theme JsonThemeTranslator::fromJsonObject(const QJsonObject &object) +{ + QString name = object.value(NAME).toString(); + QString markdownHighlighting = object.value(MARKDOWN_HIGHLIGHTING).toString(); + QString codeHighlighting = object.value(CODE_HIGHLIGHTING).toString(); + QString previewStylesheet = object.value(PREVIEW_STYLESHEET).toString(); + + return { name, markdownHighlighting, codeHighlighting, previewStylesheet }; +} + +QJsonObject JsonThemeTranslator::toJsonObject(const Theme &theme) +{ + QJsonObject object; + object.insert(NAME, theme.name()); + object.insert(MARKDOWN_HIGHLIGHTING, theme.markdownHighlighting()); + object.insert(CODE_HIGHLIGHTING, theme.codeHighlighting()); + object.insert(PREVIEW_STYLESHEET, theme.previewStylesheet()); + + return object; +} + diff --git a/app-static/themes/jsonthemetranslator.h b/app-static/themes/jsonthemetranslator.h new file mode 100644 index 00000000..de13f0d8 --- /dev/null +++ b/app-static/themes/jsonthemetranslator.h @@ -0,0 +1,34 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef JSONTHEMETRANSLATOR_H +#define JSONTHEMETRANSLATOR_H + +#include +#include +#include "theme.h" + + +class JsonThemeTranslator : public JsonTranslator +{ +private: + Theme fromJsonObject(const QJsonObject &object); + QJsonObject toJsonObject(const Theme &theme); +}; + +#endif // JSONTHEMETRANSLATOR_H + + diff --git a/test/unit/jsonthemetranslatortest.cpp b/test/unit/jsonthemetranslatortest.cpp new file mode 100644 index 00000000..8731f018 --- /dev/null +++ b/test/unit/jsonthemetranslatortest.cpp @@ -0,0 +1,117 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "jsonthemetranslatortest.h" + +#include + +#include +#include +#include + +static const QLatin1String A_THEME_NAME("mytheme"); +static const QLatin1String A_MARKDOWN_HIGHLIGHTING("default"); +static const QLatin1String A_CODE_HIGHLIGHTING("monokai"); +static const QLatin1String A_PREVIEW_STYLESHEET("github"); + + +QJsonDocument NewJsonDocumentWithObject(const QJsonObject &jsonObject) +{ + QJsonArray themeArray; + themeArray.append(jsonObject); + + QJsonObject object; + object.insert("themes", themeArray); + + return QJsonDocument(object); +} + +QJsonObject NewJsonThemeObject() +{ + QJsonObject jsonObject; + jsonObject.insert("name", A_THEME_NAME); + jsonObject.insert("markdownHighlighting", A_MARKDOWN_HIGHLIGHTING); + jsonObject.insert("codeHighlighting", A_CODE_HIGHLIGHTING); + jsonObject.insert("previewStylesheet", A_PREVIEW_STYLESHEET); + + return jsonObject; +} + +void JsonThemeTranslatorTest::initTestCase() +{ + translator = new JsonThemeTranslator(); +} + +void JsonThemeTranslatorTest::cleanupTestCase() +{ + delete translator; +} + +void JsonThemeTranslatorTest::doesNotProcessInvalidJsonDocument() +{ + QJsonDocument doc; + + ThemeCollection collection; + bool success = translator->processDocument(doc, &collection); + + QVERIFY(!success); + QCOMPARE(collection.count(), 0); +} + +void JsonThemeTranslatorTest::translatesEmptyJsonDocumentToEmptyThemes() +{ + QJsonObject themesObject; + themesObject.insert("themes", QJsonArray()); + + QJsonDocument doc(themesObject); + + ThemeCollection collection; + bool success = translator->processDocument(doc, &collection); + + QVERIFY(success); + QCOMPARE(collection.count(), 0); +} + +void JsonThemeTranslatorTest::translatesJsonDocumentToThemes() +{ + QJsonDocument doc = NewJsonDocumentWithObject(NewJsonThemeObject()); + + ThemeCollection collection; + bool success = translator->processDocument(doc, &collection); + + QVERIFY(success); + QCOMPARE(collection.count(), 1); + QCOMPARE(collection.at(0).name(), A_THEME_NAME); + QCOMPARE(collection.at(0).markdownHighlighting(), A_MARKDOWN_HIGHLIGHTING); + QCOMPARE(collection.at(0).codeHighlighting(), A_CODE_HIGHLIGHTING); + QCOMPARE(collection.at(0).previewStylesheet(), A_PREVIEW_STYLESHEET); +} + +void JsonThemeTranslatorTest::translatesThemesToJsonDocument() +{ + Theme theme(A_THEME_NAME, A_MARKDOWN_HIGHLIGHTING, A_CODE_HIGHLIGHTING, A_PREVIEW_STYLESHEET); + ThemeCollection collection; + collection.insert(theme); + + QJsonDocument doc = translator->createDocument(&collection); + + QJsonObject actual = doc.object().value("themes").toArray().first().toObject(); + QCOMPARE(actual["name"].toString(), A_THEME_NAME); + QCOMPARE(actual["markdownHighlighting"].toString(), A_MARKDOWN_HIGHLIGHTING); + QCOMPARE(actual["codeHighlighting"].toString(), A_CODE_HIGHLIGHTING); + QCOMPARE(actual["previewStylesheet"].toString(), A_PREVIEW_STYLESHEET); +} + diff --git a/test/unit/jsonthemetranslatortest.h b/test/unit/jsonthemetranslatortest.h new file mode 100644 index 00000000..ab44d4de --- /dev/null +++ b/test/unit/jsonthemetranslatortest.h @@ -0,0 +1,44 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef JSONTHEMETRANSLATORTEST_H +#define JSONTHEMETRANSLATORTEST_H + +#include +class JsonThemeTranslator; + + +class JsonThemeTranslatorTest : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + void cleanupTestCase(); + + void doesNotProcessInvalidJsonDocument(); + void translatesEmptyJsonDocumentToEmptyThemes(); + void translatesJsonDocumentToThemes(); + void translatesThemesToJsonDocument(); + +private: + JsonThemeTranslator *translator; +}; + +#endif // JSONTHEMETRANSLATORTEST_H + + + diff --git a/test/unit/main.cpp b/test/unit/main.cpp index 9b247d73..c271ee57 100644 --- a/test/unit/main.cpp +++ b/test/unit/main.cpp @@ -18,6 +18,7 @@ #include "dictionarytest.h" #include "jsonsnippettranslatortest.h" +#include "jsonthemetranslatortest.h" #include "jsontranslatorfactorytest.h" #include "slidelinemappingtest.h" #include "snippetcollectiontest.h" @@ -61,5 +62,8 @@ int main(int argc, char *argv[]) ThemeCollectionTest test10; ret += QTest::qExec(&test10, argc, argv); + JsonThemeTranslatorTest test11; + ret += QTest::qExec(&test11, argc, argv); + return ret; } diff --git a/test/unit/unit.pro b/test/unit/unit.pro index 336f9284..ca584408 100644 --- a/test/unit/unit.pro +++ b/test/unit/unit.pro @@ -14,6 +14,7 @@ SOURCES += \ completionlistmodeltest.cpp \ snippettest.cpp \ jsonsnippettranslatortest.cpp \ + jsonthemetranslatortest.cpp \ jsontranslatorfactorytest.cpp \ slidelinemappingtest.cpp \ snippetcollectiontest.cpp \ @@ -26,6 +27,7 @@ HEADERS += \ completionlistmodeltest.h \ snippettest.h \ jsonsnippettranslatortest.h \ + jsonthemetranslatortest.h \ jsontranslatorfactorytest.h \ slidelinemappingtest.h \ snippetcollectiontest.h \ From b7c73d071a9b5316be24901a335f6d0b0a0bd9a9 Mon Sep 17 00:00:00 2001 From: Matthias Pohl Date: Mon, 30 Nov 2015 11:05:43 +0100 Subject: [PATCH 11/74] Ensure that document is of correct type --- app-static/converter/revealmarkdownconverter.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app-static/converter/revealmarkdownconverter.cpp b/app-static/converter/revealmarkdownconverter.cpp index ff911468..f20bf2b7 100644 --- a/app-static/converter/revealmarkdownconverter.cpp +++ b/app-static/converter/revealmarkdownconverter.cpp @@ -30,7 +30,8 @@ QString RevealMarkdownConverter::renderAsHtml(MarkdownDocument *document) if (document) { RevealMarkdownDocument *doc = dynamic_cast(document); - html = doc->markdownText; + if(doc) + html = doc->markdownText; } return html; From 52fdfb8d06342902cb89663e419b382975bf4d93 Mon Sep 17 00:00:00 2001 From: Matthias Pohl Date: Mon, 30 Nov 2015 13:11:56 +0100 Subject: [PATCH 12/74] fix for hoedown converter as well and code styling --- app-static/converter/hoedownmarkdownconverter.cpp | 2 +- app-static/converter/revealmarkdownconverter.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app-static/converter/hoedownmarkdownconverter.cpp b/app-static/converter/hoedownmarkdownconverter.cpp index 46392fe6..97808bee 100644 --- a/app-static/converter/hoedownmarkdownconverter.cpp +++ b/app-static/converter/hoedownmarkdownconverter.cpp @@ -88,7 +88,7 @@ QString HoedownMarkdownConverter::renderAsHtml(MarkdownDocument *document) if (document) { HoedownMarkdownDocument *doc = dynamic_cast(document); - if (doc->document()) { + if (doc && doc->document()) { hoedown_buffer *in = doc->document(); hoedown_buffer *out = hoedown_buffer_new(64); diff --git a/app-static/converter/revealmarkdownconverter.cpp b/app-static/converter/revealmarkdownconverter.cpp index f20bf2b7..72489a14 100644 --- a/app-static/converter/revealmarkdownconverter.cpp +++ b/app-static/converter/revealmarkdownconverter.cpp @@ -30,8 +30,9 @@ QString RevealMarkdownConverter::renderAsHtml(MarkdownDocument *document) if (document) { RevealMarkdownDocument *doc = dynamic_cast(document); - if(doc) + if (doc) { html = doc->markdownText; + } } return html; From aa2e2da925239711823d98db8c6f7891cfa83c77 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Wed, 9 Dec 2015 15:15:08 +0100 Subject: [PATCH 13/74] Add integration test for reading themes from JSON file --- app-static/app-static.pro | 1 + .../themes/jsonthemetranslatorfactory.h | 37 +++++ test/integration/integration.pro | 2 + test/integration/jsonthemefiletest.cpp | 153 ++++++++++++++++++ test/integration/jsonthemefiletest.h | 36 +++++ test/integration/main.cpp | 8 +- 6 files changed, 235 insertions(+), 2 deletions(-) create mode 100644 app-static/themes/jsonthemetranslatorfactory.h create mode 100644 test/integration/jsonthemefiletest.cpp create mode 100644 test/integration/jsonthemefiletest.h diff --git a/app-static/app-static.pro b/app-static/app-static.pro index ec4f8a97..4fd70850 100644 --- a/app-static/app-static.pro +++ b/app-static/app-static.pro @@ -47,6 +47,7 @@ HEADERS += \ template/htmltemplate.h \ template/presentationtemplate.h \ themes/jsonthemetranslator.h \ + themes/jsonthemetranslatorfactory.h \ themes/theme.h \ themes/themecollection.h \ completionlistmodel.h \ diff --git a/app-static/themes/jsonthemetranslatorfactory.h b/app-static/themes/jsonthemetranslatorfactory.h new file mode 100644 index 00000000..5d4994b7 --- /dev/null +++ b/app-static/themes/jsonthemetranslatorfactory.h @@ -0,0 +1,37 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef JSONTHEMETRANSLATORFACTORY_H +#define JSONTHEMETRANSLATORFACTORY_H + +#include +#include + +#include "themes/theme.h" +#include "themes/jsonthemetranslator.h" + + +template <> class JsonTranslatorFactory +{ +public: + static JsonTranslator *create() + { + return new JsonThemeTranslator(); + } +}; + +#endif // JSONTHEMETRANSLATORFACTORY_H + diff --git a/test/integration/integration.pro b/test/integration/integration.pro index 786f4aeb..7936f8ba 100644 --- a/test/integration/integration.pro +++ b/test/integration/integration.pro @@ -15,6 +15,7 @@ SOURCES += \ htmlpreviewcontrollertest.cpp \ htmltemplatetest.cpp \ jsonsnippetfiletest.cpp \ + jsonthemefiletest.cpp \ main.cpp \ pmhmarkdownparsertest.cpp \ revealmarkdownconvertertest.cpp @@ -24,6 +25,7 @@ HEADERS += \ htmlpreviewcontrollertest.h \ htmltemplatetest.h \ jsonsnippetfiletest.h \ + jsonthemefiletest.h \ pmhmarkdownparsertest.h \ revealmarkdownconvertertest.h diff --git a/test/integration/jsonthemefiletest.cpp b/test/integration/jsonthemefiletest.cpp new file mode 100644 index 00000000..effe6888 --- /dev/null +++ b/test/integration/jsonthemefiletest.cpp @@ -0,0 +1,153 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "jsonthemefiletest.h" + + +#include +#include +#include + +#include +#include +#include + + +void JsonThemeFileTest::loadsEmptyThemeCollectionFromFile() +{ + QTemporaryFile themeFile(this); + if (!themeFile.open()) + QFAIL("Failed to create temporary theme file"); + + QTextStream out(&themeFile); out << "{ \"themes\": [] }"; + + themeFile.close(); + + ThemeCollection collection; + bool success = JsonFile::load(themeFile.fileName(), &collection); + + QVERIFY(success); + QCOMPARE(collection.count(), 0); +} + +void JsonThemeFileTest::loadsThemesCollectionFromFile() +{ + QTemporaryFile themeFile(this); + if (!themeFile.open()) + QFAIL("Failed to create temporary theme file"); + + QTextStream out(&themeFile); + out << "{ \"themes\": [" + << " { \"name\": \"default\"," + << " \"markdownHighlighting\": \"default\"," + << " \"codeHighlighting\": \"default\"," + << " \"previewStylesheet\": \"default\" }," + << " { \"name\": \"dark\"," + << " \"markdownHighlighting\": \"dark\"," + << " \"codeHighlighting\": \"black\"," + << " \"previewStylesheet\": \"dark\" } ] }"; + + themeFile.close(); + + ThemeCollection collection; + bool success = JsonFile::load(themeFile.fileName(), &collection); + + QVERIFY(success); + QCOMPARE(collection.count(), 2); + QCOMPARE(collection.at(0).name(), QLatin1String("default")); + QCOMPARE(collection.at(1).name(), QLatin1String("dark")); +} + +void JsonThemeFileTest::savesEmptyThemesCollectionToFile() +{ + QTemporaryFile themeFile(this); + if (!themeFile.open()) + QFAIL("Failed to create temporary theme file"); + + ThemeCollection collection; + bool success = JsonFile::save(themeFile.fileName(), &collection); + + QVERIFY(success); + + QTextStream in(&themeFile); + QString fileContent = in.readAll().trimmed(); + + QVERIFY(fileContent.startsWith("{")); + QVERIFY(fileContent.contains("\"themes\": [")); + QVERIFY(fileContent.endsWith("}")); +} + +void JsonThemeFileTest::savesThemesCollectionToFile() +{ + QTemporaryFile themeFile(this); + if (!themeFile.open()) + QFAIL("Failed to create temporary theme file"); + + Theme theme1("default", "default", "default", "default"); + + Theme theme2("dark", "dark", "black", "dark"); + + ThemeCollection collection; + collection.insert(theme1); + collection.insert(theme2); + + bool success = JsonFile::save(themeFile.fileName(), &collection); + + QVERIFY(success); + + QTextStream in(&themeFile); + QString fileContent = in.readAll().trimmed(); + + QVERIFY(fileContent.startsWith("{")); + QVERIFY(fileContent.contains("\"themes\": [")); + QVERIFY(fileContent.contains("\"name\": \"default\"")); + QVERIFY(fileContent.contains("\"name\": \"dark\"")); + QVERIFY(fileContent.endsWith("}")); +} + +void JsonThemeFileTest::roundtripTest() +{ + QTemporaryFile themeFile(this); + if (!themeFile.open()) + QFAIL("Failed to create temporary theme file"); + + Theme theme1("default", "default", "default", "default"); + + Theme theme2("dark", "dark", "black", "dark"); + + ThemeCollection collection1; + collection1.insert(theme1); + collection1.insert(theme2); + + bool saveSuccess = JsonFile::save(themeFile.fileName(), &collection1); + QVERIFY(saveSuccess); + + ThemeCollection collection2; + bool loadSuccess = JsonFile::load(themeFile.fileName(), &collection2); + QVERIFY(loadSuccess); + + QCOMPARE(collection2.count(), 2); + + QCOMPARE(collection2.at(0).name(), theme1.name()); + QCOMPARE(collection2.at(0).markdownHighlighting(), theme1.markdownHighlighting()); + QCOMPARE(collection2.at(0).codeHighlighting(), theme1.codeHighlighting()); + QCOMPARE(collection2.at(0).previewStylesheet(), theme1.previewStylesheet()); + + QCOMPARE(collection2.at(1).name(), theme2.name()); + QCOMPARE(collection2.at(1).markdownHighlighting(), theme2.markdownHighlighting()); + QCOMPARE(collection2.at(1).codeHighlighting(), theme2.codeHighlighting()); + QCOMPARE(collection2.at(1).previewStylesheet(), theme2.previewStylesheet()); +} diff --git a/test/integration/jsonthemefiletest.h b/test/integration/jsonthemefiletest.h new file mode 100644 index 00000000..f2898303 --- /dev/null +++ b/test/integration/jsonthemefiletest.h @@ -0,0 +1,36 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef JSONTHEMEFILETEST_H +#define JSONTHEMEFILETEST_H + +#include + +class JsonThemeFileTest : public QObject +{ + Q_OBJECT + +private slots: + void loadsEmptyThemeCollectionFromFile(); + void loadsThemesCollectionFromFile(); + + void savesEmptyThemesCollectionToFile(); + void savesThemesCollectionToFile(); + + void roundtripTest(); +}; + +#endif // JSONTHEMEFILETEST_H diff --git a/test/integration/main.cpp b/test/integration/main.cpp index 48f5d183..477668f4 100644 --- a/test/integration/main.cpp +++ b/test/integration/main.cpp @@ -22,6 +22,7 @@ #include "htmlpreviewcontrollertest.h" #include "htmltemplatetest.h" #include "jsonsnippetfiletest.h" +#include "jsonthemefiletest.h" #include "pmhmarkdownparsertest.h" #include "revealmarkdownconvertertest.h" @@ -55,8 +56,11 @@ int main(int argc, char *argv[]) HtmlPreviewControllerTest test6; ret += QTest::qExec(&test6, argc, argv); - HtmlTemplateTest test7; - ret += QTest::qExec(&test7, argc, argv); + HtmlTemplateTest test7; + ret += QTest::qExec(&test7, argc, argv); + + JsonThemeFileTest test8; + ret += QTest::qExec(&test8, argc, argv); return ret; } From 7eb3e01cb386e941670708ca60976892e79e55d4 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Wed, 9 Dec 2015 19:40:00 +0100 Subject: [PATCH 14/74] Add contains() method to ThemeCollection class --- app-static/themes/themecollection.cpp | 5 +++++ app-static/themes/themecollection.h | 1 + test/unit/themecollectiontest.cpp | 9 +++++++++ test/unit/themecollectiontest.h | 1 + 4 files changed, 16 insertions(+) diff --git a/app-static/themes/themecollection.cpp b/app-static/themes/themecollection.cpp index e9f86c1a..dc39cdb5 100644 --- a/app-static/themes/themecollection.cpp +++ b/app-static/themes/themecollection.cpp @@ -34,6 +34,11 @@ const Theme &ThemeCollection::at(int offset) const return themes.at(offset); } +bool ThemeCollection::contains(const QString &name) const +{ + return themesIndex.contains(name); +} + const QString ThemeCollection::name() const { return QStringLiteral("themes"); diff --git a/app-static/themes/themecollection.h b/app-static/themes/themecollection.h index ca7a18e0..82191d96 100644 --- a/app-static/themes/themecollection.h +++ b/app-static/themes/themecollection.h @@ -30,6 +30,7 @@ class ThemeCollection : public JsonCollection int count() const; const Theme &at(int offset) const; + bool contains(const QString &name) const; const QString name() const; diff --git a/test/unit/themecollectiontest.cpp b/test/unit/themecollectiontest.cpp index 6a157495..de7333df 100644 --- a/test/unit/themecollectiontest.cpp +++ b/test/unit/themecollectiontest.cpp @@ -47,3 +47,12 @@ void ThemeCollectionTest::returnsThemeAtIndexPosition() QCOMPARE(actual, theme); } +void ThemeCollectionTest::returnsIfCollectionContainsTheme() +{ + ThemeCollection collection; + Theme theme("name", "markdown", "code", "preview"); + collection.insert(theme); + + QCOMPARE(collection.contains("name"), true); + QCOMPARE(collection.contains("missing"), false); +} diff --git a/test/unit/themecollectiontest.h b/test/unit/themecollectiontest.h index df274fdd..28128ed6 100644 --- a/test/unit/themecollectiontest.h +++ b/test/unit/themecollectiontest.h @@ -27,6 +27,7 @@ private slots: void returnsConstantNameOfJsonArray(); void returnsNumberOfThemesInCollection(); void returnsThemeAtIndexPosition(); + void returnsIfCollectionContainsTheme(); }; #endif // THEMECOLLECTIONTEST_H From 65f55c76d2c5aaa18ccc7793bd9af7a46fcb9699 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Thu, 10 Dec 2015 19:38:32 +0100 Subject: [PATCH 15/74] Add theme() and themeNames() to ThemeCollection class Add methods to retrieve a theme by name or the names of all themes to the ThemeCollection class. --- app-static/themes/themecollection.cpp | 10 ++++++++++ app-static/themes/themecollection.h | 2 ++ test/unit/themecollectiontest.cpp | 27 +++++++++++++++++++++++++++ test/unit/themecollectiontest.h | 2 ++ 4 files changed, 41 insertions(+) diff --git a/app-static/themes/themecollection.cpp b/app-static/themes/themecollection.cpp index dc39cdb5..981767d8 100644 --- a/app-static/themes/themecollection.cpp +++ b/app-static/themes/themecollection.cpp @@ -39,6 +39,16 @@ bool ThemeCollection::contains(const QString &name) const return themesIndex.contains(name); } +const Theme ThemeCollection::theme(const QString &name) const +{ + return at(themesIndex.indexOf(name)); +} + +QStringList ThemeCollection::themeNames() const +{ + return themesIndex; +} + const QString ThemeCollection::name() const { return QStringLiteral("themes"); diff --git a/app-static/themes/themecollection.h b/app-static/themes/themecollection.h index 82191d96..6c2c6ae5 100644 --- a/app-static/themes/themecollection.h +++ b/app-static/themes/themecollection.h @@ -31,6 +31,8 @@ class ThemeCollection : public JsonCollection int count() const; const Theme &at(int offset) const; bool contains(const QString &name) const; + const Theme theme(const QString &name) const; + QStringList themeNames() const; const QString name() const; diff --git a/test/unit/themecollectiontest.cpp b/test/unit/themecollectiontest.cpp index de7333df..3fbf9511 100644 --- a/test/unit/themecollectiontest.cpp +++ b/test/unit/themecollectiontest.cpp @@ -56,3 +56,30 @@ void ThemeCollectionTest::returnsIfCollectionContainsTheme() QCOMPARE(collection.contains("name"), true); QCOMPARE(collection.contains("missing"), false); } + +void ThemeCollectionTest::returnsThemeByName() +{ + ThemeCollection collection; + Theme theme("name", "markdown", "code", "preview"); + collection.insert(theme); + + Theme actual = collection.theme("name"); + + QCOMPARE(actual, theme); +} + +void ThemeCollectionTest::returnsNameOfAllThemes() +{ + Theme theme1("name 1", "markdown", "code", "preview"); + Theme theme2("name 2", "markdown", "code", "preview"); + ThemeCollection collection; + collection.insert(theme1); + collection.insert(theme2); + + QStringList themeNames = collection.themeNames(); + + QCOMPARE(themeNames.count(), 2); + QCOMPARE(themeNames.at(0), theme1.name()); + QCOMPARE(themeNames.at(1), theme2.name()); +} + diff --git a/test/unit/themecollectiontest.h b/test/unit/themecollectiontest.h index 28128ed6..3fc8d15b 100644 --- a/test/unit/themecollectiontest.h +++ b/test/unit/themecollectiontest.h @@ -28,6 +28,8 @@ private slots: void returnsNumberOfThemesInCollection(); void returnsThemeAtIndexPosition(); void returnsIfCollectionContainsTheme(); + void returnsThemeByName(); + void returnsNameOfAllThemes(); }; #endif // THEMECOLLECTIONTEST_H From b37ed38574624517a384edb4de193e082c4aa90c Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Thu, 10 Dec 2015 19:48:16 +0100 Subject: [PATCH 16/74] Add JSON file with builtin HTML preview themes --- app/builtin-htmlpreview-themes.json | 46 +++++++++++++++++++++++++++++ app/resources.qrc | 1 + 2 files changed, 47 insertions(+) create mode 100644 app/builtin-htmlpreview-themes.json diff --git a/app/builtin-htmlpreview-themes.json b/app/builtin-htmlpreview-themes.json new file mode 100644 index 00000000..20beadda --- /dev/null +++ b/app/builtin-htmlpreview-themes.json @@ -0,0 +1,46 @@ +{ + "themes": [ + { + "name": "Default", + "markdownHighlighting": "Default", + "codeHighlighting": "Default", + "previewStylesheet": "Default" + }, + { + "name": "Github", + "markdownHighlighting": "Default", + "codeHighlighting": "Github", + "previewStylesheet": "Github" + }, + { + "name": "Solarized Light", + "markdownHighlighting": "Solarized Light", + "codeHighlighting": "Solarized Light", + "previewStylesheet": "Solarized Light" + }, + { + "name": "Solarized Dark", + "markdownHighlighting": "Solarized Dark", + "codeHighlighting": "Solarized Dark", + "previewStylesheet": "Solarized Dark" + }, + { + "name": "Clearness", + "markdownHighlighting": "Default", + "codeHighlighting": "Default", + "previewStylesheet": "Clearness" + }, + { + "name": "Clearness Dark", + "markdownHighlighting": "Clearness Dark", + "codeHighlighting": "Default", + "previewStylesheet": "Clearness Dark" + }, + { + "name": "Byword Dark", + "markdownHighlighting": "Byword Dark", + "codeHighlighting": "Default", + "previewStylesheet": "Byword Dark" + } + ] +} diff --git a/app/resources.qrc b/app/resources.qrc index c364e28d..b492a939 100644 --- a/app/resources.qrc +++ b/app/resources.qrc @@ -34,6 +34,7 @@ syntax_id.html syntax_da.html template_presentation.html + builtin-htmlpreview-themes.json images/icon-close.png From 58797e5bf4bac4bb980d097f299cf5edfc4a3926 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Thu, 10 Dec 2015 19:50:20 +0100 Subject: [PATCH 17/74] Introduce ThemeManager class It manages a theme collection and the association to the builtin markdown, code and preview styles --- app-static/app-static.pro | 2 + app-static/themes/thememanager.cpp | 84 +++++++++++++++++++++++++++ app-static/themes/thememanager.h | 44 ++++++++++++++ test/integration/integration.pro | 6 +- test/integration/main.cpp | 4 ++ test/integration/thememanagertest.cpp | 68 ++++++++++++++++++++++ test/integration/thememanagertest.h | 41 +++++++++++++ test/unit/main.cpp | 6 +- test/unit/thememanagertest.cpp | 64 ++++++++++++++++++++ test/unit/thememanagertest.h | 34 +++++++++++ test/unit/unit.pro | 6 +- 11 files changed, 354 insertions(+), 5 deletions(-) create mode 100644 app-static/themes/thememanager.cpp create mode 100644 app-static/themes/thememanager.h create mode 100644 test/integration/thememanagertest.cpp create mode 100644 test/integration/thememanagertest.h create mode 100644 test/unit/thememanagertest.cpp create mode 100644 test/unit/thememanagertest.h diff --git a/app-static/app-static.pro b/app-static/app-static.pro index 4fd70850..7a1a16cc 100644 --- a/app-static/app-static.pro +++ b/app-static/app-static.pro @@ -24,6 +24,7 @@ SOURCES += \ themes/jsonthemetranslator.cpp \ themes/theme.cpp \ themes/themecollection.cpp \ + themes/thememanager.cpp \ completionlistmodel.cpp \ datalocation.cpp \ slidelinemapping.cpp \ @@ -50,6 +51,7 @@ HEADERS += \ themes/jsonthemetranslatorfactory.h \ themes/theme.h \ themes/themecollection.h \ + themes/thememanager.h \ completionlistmodel.h \ datalocation.h \ slidelinemapping.h \ diff --git a/app-static/themes/thememanager.cpp b/app-static/themes/thememanager.cpp new file mode 100644 index 00000000..4f8ef6b4 --- /dev/null +++ b/app-static/themes/thememanager.cpp @@ -0,0 +1,84 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "thememanager.h" + +#include +#include + + +static const QMap BUILTIN_MARKDOWN_HIGHLIGHTINGS = { + { "Default", "default" }, + { "Solarized Light", "solarized-light" }, + { "Solarized Dark", "solarized-dark" }, + { "Clearness Dark", "clearness-dark" }, + { "Byword Dark", "byword-dark" } +}; + +static const QMap BUILTIN_CODE_HIGHLIGHTINGS = { + { "Default", "default" }, + { "Github", "github" }, + { "Solarized Light", "solarized_light" }, + { "Solarized Dark", "solarized_dark" } +}; + +static const QMap BUILTIN_PREVIEW_STYLESHEETS = { + { "Default", "qrc:/css/markdown.css" }, + { "Github", "qrc:/css/github.css" }, + { "Solarized Light", "qrc:/css/solarized-light.css" }, + { "Solarized Dark", "qrc:/css/solarized-dark.css" }, + { "Clearness", "qrc:/css/clearness.css" }, + { "Clearness Dark", "qrc:/css/clearness-dark.css" }, + { "Byword Dark", "qrc:/css/byword-dark.css" } +}; + +ThemeCollection ThemeManager::m_htmlPreviewThemes; + + +ThemeManager::ThemeManager() : + ThemeManager(":/builtin-htmlpreview-themes.json") +{ +} + +ThemeManager::ThemeManager(const QString &themeFileName) +{ + JsonFile::load(themeFileName, &m_htmlPreviewThemes); +} + +Theme ThemeManager::themeByName(const QString &name) const +{ + return m_htmlPreviewThemes.theme(name); +} + +QStringList ThemeManager::themeNames() const +{ + return m_htmlPreviewThemes.themeNames(); +} + +QString ThemeManager::markdownHighlightingPath(const Theme &theme) +{ + return BUILTIN_MARKDOWN_HIGHLIGHTINGS[theme.markdownHighlighting()]; +} + +QString ThemeManager::codeHighlightingPath(const Theme &theme) +{ + return BUILTIN_CODE_HIGHLIGHTINGS[theme.codeHighlighting()]; +} + +QString ThemeManager::previewStylesheetPath(const Theme &theme) +{ + return BUILTIN_PREVIEW_STYLESHEETS[theme.previewStylesheet()]; +} diff --git a/app-static/themes/thememanager.h b/app-static/themes/thememanager.h new file mode 100644 index 00000000..1c2ab4da --- /dev/null +++ b/app-static/themes/thememanager.h @@ -0,0 +1,44 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef THEMEMANAGER_H +#define THEMEMANAGER_H + +#include +#include +#include "theme.h" +#include "themecollection.h" + + +class ThemeManager +{ +public: + ThemeManager(); + explicit ThemeManager(const QString &themeFileName); + + Theme themeByName(const QString &name) const; + QStringList themeNames() const; + + static QString markdownHighlightingPath(const Theme &theme); + static QString codeHighlightingPath(const Theme &theme); + static QString previewStylesheetPath(const Theme &theme); + +private: + static ThemeCollection m_htmlPreviewThemes; +}; + +#endif // THEMEMANAGER_H + diff --git a/test/integration/integration.pro b/test/integration/integration.pro index 7936f8ba..5e0a0f35 100644 --- a/test/integration/integration.pro +++ b/test/integration/integration.pro @@ -18,7 +18,8 @@ SOURCES += \ jsonthemefiletest.cpp \ main.cpp \ pmhmarkdownparsertest.cpp \ - revealmarkdownconvertertest.cpp + revealmarkdownconvertertest.cpp \ + thememanagertest.cpp HEADERS += \ discountmarkdownconvertertest.h \ @@ -27,7 +28,8 @@ HEADERS += \ jsonsnippetfiletest.h \ jsonthemefiletest.h \ pmhmarkdownparsertest.h \ - revealmarkdownconvertertest.h + revealmarkdownconvertertest.h \ + thememanagertest.h target.CONFIG += no_default_install diff --git a/test/integration/main.cpp b/test/integration/main.cpp index 477668f4..0ce05c39 100644 --- a/test/integration/main.cpp +++ b/test/integration/main.cpp @@ -25,6 +25,7 @@ #include "jsonthemefiletest.h" #include "pmhmarkdownparsertest.h" #include "revealmarkdownconvertertest.h" +#include "thememanagertest.h" #ifdef ENABLE_HOEDOWN #include "hoedownmarkdownconvertertest.h" @@ -62,6 +63,9 @@ int main(int argc, char *argv[]) JsonThemeFileTest test8; ret += QTest::qExec(&test8, argc, argv); + ThemeManagerTest test9; + ret += QTest::qExec(&test9, argc, argv); + return ret; } diff --git a/test/integration/thememanagertest.cpp b/test/integration/thememanagertest.cpp new file mode 100644 index 00000000..26828b74 --- /dev/null +++ b/test/integration/thememanagertest.cpp @@ -0,0 +1,68 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "thememanagertest.h" + +#include + +#include + +void ThemeManagerTest::initTestCase() +{ + QTemporaryFile themeFile(this); + if (!themeFile.open()) + QFAIL("Failed to create temporary theme file"); + + QTextStream out(&themeFile); + out << "{ \"themes\": [" + << " { \"name\": \"default\"," + << " \"markdownHighlighting\": \"default\"," + << " \"codeHighlighting\": \"default\"," + << " \"previewStylesheet\": \"default\" }," + << " { \"name\": \"dark\"," + << " \"markdownHighlighting\": \"dark\"," + << " \"codeHighlighting\": \"black\"," + << " \"previewStylesheet\": \"dark\" } ] }"; + + themeFile.close(); + + themeManager = new ThemeManager(themeFile.fileName()); +} + +void ThemeManagerTest::cleanupTestCase() +{ + delete themeManager; +} + +void ThemeManagerTest::returnsBuiltinThemeByName() +{ + Theme actual = themeManager->themeByName("dark"); + + QCOMPARE(actual.name(), QLatin1String("dark")); + QCOMPARE(actual.markdownHighlighting(), QLatin1String("dark")); + QCOMPARE(actual.codeHighlighting(), QLatin1String("black")); + QCOMPARE(actual.previewStylesheet(), QLatin1String("dark")); +} + +void ThemeManagerTest::returnsNameOfAllBuiltinThemes() +{ + QStringList themeNames = themeManager->themeNames(); + + QCOMPARE(themeNames.count(), 2); + QCOMPARE(themeNames.at(0), QLatin1String("default")); + QCOMPARE(themeNames.at(1), QLatin1String("dark")); +} + diff --git a/test/integration/thememanagertest.h b/test/integration/thememanagertest.h new file mode 100644 index 00000000..0485acbc --- /dev/null +++ b/test/integration/thememanagertest.h @@ -0,0 +1,41 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef THEMEMANAGERTEST_H +#define THEMEMANAGERTEST_H + +#include +class ThemeManager; + + +class ThemeManagerTest : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + void cleanupTestCase(); + + void returnsBuiltinThemeByName(); + void returnsNameOfAllBuiltinThemes(); + +private: + ThemeManager *themeManager; +}; + +#endif // THEMEMANAGERTEST_H + + diff --git a/test/unit/main.cpp b/test/unit/main.cpp index c271ee57..8e29a615 100644 --- a/test/unit/main.cpp +++ b/test/unit/main.cpp @@ -25,6 +25,7 @@ #include "completionlistmodeltest.h" #include "snippettest.h" #include "themecollectiontest.h" +#include "thememanagertest.h" #include "themetest.h" #include "yamlheadercheckertest.h" @@ -62,8 +63,11 @@ int main(int argc, char *argv[]) ThemeCollectionTest test10; ret += QTest::qExec(&test10, argc, argv); - JsonThemeTranslatorTest test11; + ThemeManagerTest test11; ret += QTest::qExec(&test11, argc, argv); + JsonThemeTranslatorTest test12; + ret += QTest::qExec(&test12, argc, argv); + return ret; } diff --git a/test/unit/thememanagertest.cpp b/test/unit/thememanagertest.cpp new file mode 100644 index 00000000..fdcc0046 --- /dev/null +++ b/test/unit/thememanagertest.cpp @@ -0,0 +1,64 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "thememanagertest.h" + +#include + +#include + +static const Theme defaultTheme("Default", "Default", "Default", "Default"); +static const Theme githubTheme("Github", "Github", "Github", "Github"); +static const Theme solarizedLightTheme("Solarized Light", "Solarized Light", "Solarized Light", "Solarized Light"); +static const Theme solarizedDarkTheme("Solarized Dark", "Solarized Dark", "Solarized Dark", "Solarized Dark"); +static const Theme clearnessTheme("Clearness", "Clearness", "Clearness", "Clearness"); +static const Theme clearnessDarkTheme("Clearness Dark", "Clearness Dark", "Clearness Dark", "Clearness Dark"); +static const Theme bywordDarkTheme("Byword Dark", "Byword Dark", "Byword Dark", "Byword Dark"); + +void ThemeManagerTest::returnsPathForMarkdownHighlighting() +{ + ThemeManager themeManager; + + QCOMPARE(themeManager.markdownHighlightingPath(defaultTheme), QLatin1String("default")); + QCOMPARE(themeManager.markdownHighlightingPath(solarizedLightTheme), QLatin1String("solarized-light")); + QCOMPARE(themeManager.markdownHighlightingPath(solarizedDarkTheme), QLatin1String("solarized-dark")); + QCOMPARE(themeManager.markdownHighlightingPath(clearnessDarkTheme), QLatin1String("clearness-dark")); + QCOMPARE(themeManager.markdownHighlightingPath(bywordDarkTheme), QLatin1String("byword-dark")); +} + +void ThemeManagerTest::returnsPathForCodeHighlighting() +{ + ThemeManager themeManager; + + QCOMPARE(themeManager.codeHighlightingPath(defaultTheme), QLatin1String("default")); + QCOMPARE(themeManager.codeHighlightingPath(githubTheme), QLatin1String("github")); + QCOMPARE(themeManager.codeHighlightingPath(solarizedLightTheme), QLatin1String("solarized_light")); + QCOMPARE(themeManager.codeHighlightingPath(solarizedDarkTheme), QLatin1String("solarized_dark")); +} + +void ThemeManagerTest::returnsPathForPreviewStylesheet() +{ + ThemeManager themeManager; + + QCOMPARE(themeManager.previewStylesheetPath(defaultTheme), QLatin1String("qrc:/css/markdown.css")); + QCOMPARE(themeManager.previewStylesheetPath(githubTheme), QLatin1String("qrc:/css/github.css")); + QCOMPARE(themeManager.previewStylesheetPath(solarizedLightTheme), QLatin1String("qrc:/css/solarized-light.css")); + QCOMPARE(themeManager.previewStylesheetPath(solarizedDarkTheme), QLatin1String("qrc:/css/solarized-dark.css")); + QCOMPARE(themeManager.previewStylesheetPath(clearnessTheme), QLatin1String("qrc:/css/clearness.css")); + QCOMPARE(themeManager.previewStylesheetPath(clearnessDarkTheme), QLatin1String("qrc:/css/clearness-dark.css")); + QCOMPARE(themeManager.previewStylesheetPath(bywordDarkTheme), QLatin1String("qrc:/css/byword-dark.css")); +} + diff --git a/test/unit/thememanagertest.h b/test/unit/thememanagertest.h new file mode 100644 index 00000000..72d9e8fa --- /dev/null +++ b/test/unit/thememanagertest.h @@ -0,0 +1,34 @@ +/* + * Copyright 2015 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef THEMEMANAGERTEST_H +#define THEMEMANAGERTEST_H + +#include + +class ThemeManagerTest : public QObject +{ + Q_OBJECT + +private slots: + void returnsPathForMarkdownHighlighting(); + void returnsPathForCodeHighlighting(); + void returnsPathForPreviewStylesheet(); +}; + +#endif // THEMEMANAGERTEST_H + + diff --git a/test/unit/unit.pro b/test/unit/unit.pro index ca584408..7f436e33 100644 --- a/test/unit/unit.pro +++ b/test/unit/unit.pro @@ -21,7 +21,8 @@ SOURCES += \ dictionarytest.cpp \ yamlheadercheckertest.cpp \ themetest.cpp \ - themecollectiontest.cpp + themecollectiontest.cpp \ + thememanagertest.cpp HEADERS += \ completionlistmodeltest.h \ @@ -34,7 +35,8 @@ HEADERS += \ dictionarytest.h \ yamlheadercheckertest.h \ themetest.h \ - themecollectiontest.h + themecollectiontest.h \ + thememanagertest.h target.CONFIG += no_default_install From 10d74301b0adec063f7fc73331080d00357468ea Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Thu, 10 Dec 2015 19:52:28 +0100 Subject: [PATCH 18/74] Remove specific style actions and use ThemeManager instead Remove the specific style actions from the main window and use the ThemeManager instead to fill the Styles submenu. Also rename option lastUsedStyle to lastUsedTheme. --- app/mainwindow.cpp | 132 ++++++++++++++++++++------------------------- app/mainwindow.h | 17 +++--- app/mainwindow.ui | 7 --- app/options.cpp | 45 ++++++++++++---- app/options.h | 11 ++-- 5 files changed, 110 insertions(+), 102 deletions(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index a4d79707..5b7fc4e0 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include #include "controls/activelabel.h" #include "controls/findreplacewidget.h" @@ -78,6 +79,7 @@ MainWindow::MainWindow(const QString &fileName, QWidget *parent) : snippetCollection(new SnippetCollection(this)), viewSynchronizer(0), htmlPreviewController(0), + themeManager(new ThemeManager()), splitFactor(0.5), rightViewCollapsed(false) { @@ -124,8 +126,10 @@ void MainWindow::initializeApp() ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); ui->tocWebView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); - // set last used style - lastUsedStyle(); + setupHtmlPreviewThemes(); + + // apply last used theme + lastUsedTheme(); ui->plainTextEdit->tabWidthChanged(options->tabWidth()); @@ -464,97 +468,61 @@ void MainWindow::viewChangeSplit() } } -void MainWindow::lastUsedStyle() +void MainWindow::lastUsedTheme() { - if (stylesGroup) { - foreach(QAction *action, stylesGroup->actions()) { - if (action->objectName() == options->lastUsedStyle()) { - action->trigger(); - } - } - } -} + QString themeName = options->lastUsedTheme(); -void MainWindow::styleDefault() -{ - generator->setCodeHighlightingStyle("default"); - ui->plainTextEdit->loadStyleFromStylesheet(stylePath("default")); - ui->webView->page()->settings()->setUserStyleSheetUrl(QUrl("qrc:/css/markdown.css")); + currentTheme = themeManager->themeByName(themeName); + applyCurrentTheme(); - styleLabel->setText(ui->actionDefault->text()); - options->setLastUsedStyle(ui->actionDefault->objectName()); + styleLabel->setText(themeName); } -void MainWindow::styleGithub() +void MainWindow::themeChanged() { - generator->setCodeHighlightingStyle("github"); - ui->plainTextEdit->loadStyleFromStylesheet(stylePath("default")); - ui->webView->page()->settings()->setUserStyleSheetUrl(QUrl("qrc:/css/github.css")); - - styleLabel->setText(ui->actionGithub->text()); - options->setLastUsedStyle(ui->actionGithub->objectName()); -} + QAction *action = qobject_cast(sender()); + QString themeName = action->text(); -void MainWindow::styleSolarizedLight() -{ - generator->setCodeHighlightingStyle("solarized_light"); - ui->plainTextEdit->loadStyleFromStylesheet(stylePath("solarized-light")); - ui->webView->page()->settings()->setUserStyleSheetUrl(QUrl("qrc:/css/solarized-light.css")); + currentTheme = themeManager->themeByName(themeName); + applyCurrentTheme(); - styleLabel->setText(ui->actionSolarizedLight->text()); - options->setLastUsedStyle(ui->actionSolarizedLight->objectName()); + styleLabel->setText(themeName); + options->setLastUsedTheme(themeName); } -void MainWindow::styleSolarizedDark() +void MainWindow::editorStyleChanged() { - generator->setCodeHighlightingStyle("solarized_dark"); - ui->plainTextEdit->loadStyleFromStylesheet(stylePath("solarized-dark")); - ui->webView->page()->settings()->setUserStyleSheetUrl(QUrl("qrc:/css/solarized-dark.css")); - - styleLabel->setText(ui->actionSolarizedDark->text()); - options->setLastUsedStyle(ui->actionSolarizedDark->objectName()); + QString markdownHighlighting = ThemeManager::markdownHighlightingPath(currentTheme); + ui->plainTextEdit->loadStyleFromStylesheet(stylePath(markdownHighlighting)); } -void MainWindow::styleClearness() +void MainWindow::styleCustomStyle() { - generator->setCodeHighlightingStyle("default"); - ui->plainTextEdit->loadStyleFromStylesheet(stylePath("default")); - ui->webView->page()->settings()->setUserStyleSheetUrl(QUrl("qrc:/css/clearness.css")); + QAction *action = qobject_cast(sender()); - styleLabel->setText(ui->actionClearness->text()); - options->setLastUsedStyle(ui->actionClearness->objectName()); -} + currentTheme = { action->text(), "Default", "Default", action->data().toString() }; -void MainWindow::styleClearnessDark() -{ - generator->setCodeHighlightingStyle("default"); - ui->plainTextEdit->loadStyleFromStylesheet(stylePath("clearness-dark")); - ui->webView->page()->settings()->setUserStyleSheetUrl(QUrl("qrc:/css/clearness-dark.css")); + QString markdownHighlighting = ThemeManager::markdownHighlightingPath(currentTheme); + QString codeHighlighting = ThemeManager::codeHighlightingPath(currentTheme); + QString previewStylesheet = ThemeManager::previewStylesheetPath(currentTheme); - styleLabel->setText(ui->actionClearnessDark->text()); - options->setLastUsedStyle(ui->actionClearnessDark->objectName()); -} + generator->setCodeHighlightingStyle(codeHighlighting); + ui->plainTextEdit->loadStyleFromStylesheet(stylePath(markdownHighlighting)); + ui->webView->page()->settings()->setUserStyleSheetUrl(QUrl::fromLocalFile(previewStylesheet)); -void MainWindow::styleBywordDark() -{ - generator->setCodeHighlightingStyle("default"); - ui->plainTextEdit->loadStyleFromStylesheet(stylePath("byword-dark")); - ui->webView->page()->settings()->setUserStyleSheetUrl(QUrl("qrc:/css/byword-dark.css")); - - styleLabel->setText(ui->actionBywordDark->text()); - options->setLastUsedStyle(ui->actionBywordDark->objectName()); + styleLabel->setText(action->text()); + options->setLastUsedTheme(action->objectName()); } -void MainWindow::styleCustomStyle() +void MainWindow::applyCurrentTheme() { - QAction *action = qobject_cast(sender()); - - generator->setCodeHighlightingStyle("default"); - ui->plainTextEdit->loadStyleFromStylesheet(stylePath("default")); - ui->webView->page()->settings()->setUserStyleSheetUrl(QUrl::fromLocalFile(action->data().toString())); + QString markdownHighlighting = ThemeManager::markdownHighlightingPath(currentTheme); + QString codeHighlighting = ThemeManager::codeHighlightingPath(currentTheme); + QString previewStylesheet = ThemeManager::previewStylesheetPath(currentTheme); - styleLabel->setText(action->text()); - options->setLastUsedStyle(action->objectName()); + generator->setCodeHighlightingStyle(codeHighlighting); + ui->plainTextEdit->loadStyleFromStylesheet(stylePath(markdownHighlighting)); + ui->webView->page()->settings()->setUserStyleSheetUrl(QUrl(previewStylesheet)); } void MainWindow::viewFullScreenMode() @@ -949,8 +917,8 @@ void MainWindow::setupUi() this, SLOT(proxyConfigurationChanged())); connect(options, SIGNAL(markdownConverterChanged()), this, SLOT(markdownConverterChanged())); - connect(options, SIGNAL(editorFontChanged(QFont)), - this, SLOT(lastUsedStyle())); + connect(options, &Options::editorStyleChanged, + this, &MainWindow::editorStyleChanged); readSettings(); setupCustomShortcuts(); @@ -1231,6 +1199,24 @@ void MainWindow::updateSplitter() ui->splitter->setSizes(childSizes); } +void MainWindow::setupHtmlPreviewThemes() +{ + ui->menuStyles->clear(); + + delete stylesGroup; + stylesGroup = new QActionGroup(this); + + int key = 1; + foreach(const QString &themeName, themeManager->themeNames()) { + QAction *action = ui->menuStyles->addAction(themeName); + action->setShortcut(QKeySequence(tr("Ctrl+%1").arg(key++))); + action->setCheckable(true); + action->setActionGroup(stylesGroup); + connect(action, &QAction::triggered, + this, &MainWindow::themeChanged); + } +} + void MainWindow::loadCustomStyles() { QStringList paths = DataLocation::standardLocations(); diff --git a/app/mainwindow.h b/app/mainwindow.h index 9e001a71..23f15b68 100644 --- a/app/mainwindow.h +++ b/app/mainwindow.h @@ -20,6 +20,7 @@ #include #include #include +#include namespace Ui { class MainWindow; @@ -37,6 +38,7 @@ class RecentFilesMenu; class Options; class SlideLineMapping; class SnippetCollection; +class ThemeManager; class ViewSynchronizer; @@ -83,14 +85,9 @@ private slots: void editInsertImage(); void viewChangeSplit(); - void lastUsedStyle(); - void styleDefault(); - void styleGithub(); - void styleSolarizedLight(); - void styleSolarizedDark(); - void styleClearness(); - void styleClearnessDark(); - void styleBywordDark(); + void lastUsedTheme(); + void themeChanged(); + void editorStyleChanged(); void styleCustomStyle(); void viewFullScreenMode(); void viewHorizontalLayout(bool checked); @@ -143,9 +140,11 @@ private slots: bool maybeSave(); void setFileName(const QString &fileName); void updateSplitter(); + void setupHtmlPreviewThemes(); void loadCustomStyles(); void readSettings(); void writeSettings(); + void applyCurrentTheme(); QString stylePath(const QString &styleName); private: @@ -161,6 +160,8 @@ private slots: SnippetCollection *snippetCollection; ViewSynchronizer *viewSynchronizer; HtmlPreviewController *htmlPreviewController; + ThemeManager *themeManager; + Theme currentTheme { "Default", "Default", "Default", "Default" }; QString fileName; float splitFactor; bool rightViewCollapsed; diff --git a/app/mainwindow.ui b/app/mainwindow.ui index 0de78cd1..a2a30a71 100644 --- a/app/mainwindow.ui +++ b/app/mainwindow.ui @@ -258,13 +258,6 @@ St&yles - - - - - - - diff --git a/app/options.cpp b/app/options.cpp index d708acd8..602a25e1 100644 --- a/app/options.cpp +++ b/app/options.cpp @@ -16,13 +16,12 @@ */ #include "options.h" -#include #include static const char* MARKDOWN_CONVERTER = "general/converter"; -static const char* LAST_USED_STYLE = "general/lastusedstyle"; -static const char* STYLE_DEFAULT = "actionDefault"; +static const char* LAST_USED_THEME = "general/lastusedtheme"; +static const char* THEME_DEFAULT = "Default"; static const char* FONT_FAMILY_DEFAULT = "Monospace"; static const char* FONT_FAMILY = "editor/font/family"; static const char* FONT_SIZE = "editor/font/size"; @@ -56,6 +55,7 @@ static const char* DICTIONARY_LANGUAGE = "spelling/language"; static const char* YAMLHEADERSUPPORT_ENABLED = "yamlheadersupport/enabled"; static const char* DIAGRAMSUPPORT_ENABLED = "diagramsupport/enabled"; +static const char* DEPRECATED__LAST_USED_STYLE = "general/lastusedstyle"; Options::Options(QObject *parent) : QObject(parent), @@ -78,7 +78,7 @@ Options::Options(QObject *parent) : m_spellingCheckEnabled(true), m_diagramSupportEnabled(false), m_markdownConverter(DiscountMarkdownConverter), - m_lastUsedStyle(STYLE_DEFAULT) + m_lastUsedTheme(THEME_DEFAULT) { } @@ -94,7 +94,6 @@ void Options::apply() emit proxyConfigurationChanged(); emit markdownConverterChanged(); - emit editorFontChanged(editorFont()); } QFont Options::editorFont() const @@ -373,6 +372,7 @@ bool Options::isSourceAtSingleSizeEnabled() const void Options::setSourceAtSingleSizeEnabled(bool enabled) { m_sourceAtSingleSizeEnabled = enabled; + emit editorStyleChanged(); } bool Options::isSpellingCheckEnabled() const @@ -428,14 +428,14 @@ void Options::setMarkdownConverter(Options::MarkdownConverter converter) } } -QString Options::lastUsedStyle() const +QString Options::lastUsedTheme() const { - return m_lastUsedStyle; + return m_lastUsedTheme; } -void Options::setLastUsedStyle(const QString &style) +void Options::setLastUsedTheme(const QString &theme) { - m_lastUsedStyle = style; + m_lastUsedTheme = theme; } void Options::readSettings() @@ -444,7 +444,7 @@ void Options::readSettings() // general settings m_markdownConverter = (Options::MarkdownConverter)settings.value(MARKDOWN_CONVERTER, 0).toInt(); - m_lastUsedStyle = settings.value(LAST_USED_STYLE, STYLE_DEFAULT).toString(); + m_lastUsedTheme = settings.value(LAST_USED_THEME, THEME_DEFAULT).toString(); // editor settings QString fontFamily = settings.value(FONT_FAMILY, FONT_FAMILY_DEFAULT).toString(); @@ -502,6 +502,11 @@ void Options::readSettings() m_spellingCheckEnabled = settings.value(SPELLINGCHECK_ENABLED, true).toBool(); m_dictionaryLanguage = settings.value(DICTIONARY_LANGUAGE, "en_US").toString(); + // migrate deprecated lastUsedStyle option + if (settings.contains(DEPRECATED__LAST_USED_STYLE)) { + migrateLastUsedStyleOption(settings); + } + apply(); } @@ -511,7 +516,7 @@ void Options::writeSettings() // general settings settings.setValue(MARKDOWN_CONVERTER, m_markdownConverter); - settings.setValue(LAST_USED_STYLE, m_lastUsedStyle); + settings.setValue(LAST_USED_THEME, m_lastUsedTheme); // editor settings settings.setValue(FONT_FAMILY, font.family()); @@ -564,3 +569,21 @@ void Options::writeSettings() settings.setValue(SPELLINGCHECK_ENABLED, m_spellingCheckEnabled); settings.setValue(DICTIONARY_LANGUAGE, m_dictionaryLanguage); } + +void Options::migrateLastUsedStyleOption(QSettings &settings) +{ + static const QMap migrations { + { "actionDefault", "Default" }, + { "actionGithub", "Github" }, + { "actionSolarizedLight", "Solarized Light" }, + { "actionSolarizedDark", "Solarized Dark" }, + { "actionClearness", "Clearness" }, + { "actionClearnessDark", "Clearness Dark" }, + { "actionBywordDark", "Byword Dark" } + }; + + QString lastUsedStyle = settings.value(DEPRECATED__LAST_USED_STYLE).toString(); + m_lastUsedTheme = migrations[lastUsedStyle]; + + settings.remove(DEPRECATED__LAST_USED_STYLE); +} diff --git a/app/options.h b/app/options.h index 8cc2c809..c281c6a3 100644 --- a/app/options.h +++ b/app/options.h @@ -21,6 +21,7 @@ #include #include #include +#include class Options : public QObject { @@ -139,18 +140,22 @@ class Options : public QObject MarkdownConverter markdownConverter() const; void setMarkdownConverter(MarkdownConverter converter); - QString lastUsedStyle() const; - void setLastUsedStyle(const QString &style); + QString lastUsedTheme() const; + void setLastUsedTheme(const QString &theme); void readSettings(); void writeSettings(); signals: void editorFontChanged(const QFont &font); + void editorStyleChanged(); void tabWidthChanged(int tabWidth); void proxyConfigurationChanged(); void markdownConverterChanged(); +private: + void migrateLastUsedStyleOption(QSettings &settings); + private: QFont font; int m_tabWidth; @@ -177,7 +182,7 @@ class Options : public QObject bool m_diagramSupportEnabled; QString m_dictionaryLanguage; MarkdownConverter m_markdownConverter; - QString m_lastUsedStyle; + QString m_lastUsedTheme; QString m_standardFontFamily; QString m_fixedFontFamily; QString m_serifFontFamily; From 103dcda5c26c55325ef623e4654869d961103067 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Fri, 11 Dec 2015 15:57:25 +0100 Subject: [PATCH 19/74] Fix build on Travis CI by upgrading g++ to 4.8 --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 06654b9c..6626679f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,10 @@ compiler: - gcc - clang before_install: + - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test # for g++ 4.8 - sudo add-apt-repository -y ppa:beineri/opt-qt521 # for Qt 5.2 - sudo apt-get update -qq + - sudo apt-get install -qq g++-4.8 - "export DISPLAY=:99.0" - "sh -e /etc/init.d/xvfb start" install: From 0f93a402dc75913250c1b174dc66723f0c0f8c4d Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Fri, 11 Dec 2015 19:10:21 +0100 Subject: [PATCH 20/74] Fix build on Travis CI by upgrading g++ to 4.8 --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6626679f..9c22a3ce 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,15 @@ language: cpp compiler: - - gcc + - g++ - clang before_install: - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test # for g++ 4.8 - sudo add-apt-repository -y ppa:beineri/opt-qt521 # for Qt 5.2 - sudo apt-get update -qq - - sudo apt-get install -qq g++-4.8 - "export DISPLAY=:99.0" - "sh -e /etc/init.d/xvfb start" install: + - if [ "$CXX" == "g++" ]; then sudo apt-get install -qq g++-4.8; sudo update-alternatives --install /usr/bin/g++ /usr/bin/g++-4.8 90; fi - sudo apt-get install -qq qt52base qt52declarative qt52webkit qt52tools libhunspell-dev - sudo apt-get install -qq libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev before_script: From a0d8c84c11f498d4a025401b6b101be36d45e697 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Fri, 11 Dec 2015 19:15:40 +0100 Subject: [PATCH 21/74] Fix build on Travis CI by upgrading g++ to 4.8 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9c22a3ce..23de3ef6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ before_install: - "export DISPLAY=:99.0" - "sh -e /etc/init.d/xvfb start" install: - - if [ "$CXX" == "g++" ]; then sudo apt-get install -qq g++-4.8; sudo update-alternatives --install /usr/bin/g++ /usr/bin/g++-4.8 90; fi + - if [ "$CXX" == "g++" ]; then sudo apt-get install -qq g++-4.8; sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90; fi - sudo apt-get install -qq qt52base qt52declarative qt52webkit qt52tools libhunspell-dev - sudo apt-get install -qq libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev before_script: From e91a1d03734c50e04cbc8e93491635e5cd29130e Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Tue, 15 Dec 2015 17:21:01 +0100 Subject: [PATCH 22/74] Move theme handling fully to ThemeCollection class * Remove theme collection management from ThemeManager * Rename ThemeManager to StyleManager. The class is now responsible for mapping style names in themes to paths to style file. --- app-static/app-static.pro | 4 +- .../{thememanager.cpp => stylemanager.cpp} | 34 ++----------- .../themes/{thememanager.h => stylemanager.h} | 19 ++------ app-static/themes/themecollection.cpp | 7 +++ app-static/themes/themecollection.h | 2 + app/mainwindow.cpp | 27 ++++++----- app/mainwindow.h | 4 +- test/integration/integration.pro | 4 +- test/integration/main.cpp | 4 +- ...anagertest.cpp => themecollectiontest.cpp} | 36 +++++--------- ...ememanagertest.h => themecollectiontest.h} | 10 ++-- test/unit/main.cpp | 4 +- ...memanagertest.cpp => stylemanagertest.cpp} | 48 +++++++++---------- ...{thememanagertest.h => stylemanagertest.h} | 8 ++-- test/unit/unit.pro | 4 +- 15 files changed, 90 insertions(+), 125 deletions(-) rename app-static/themes/{thememanager.cpp => stylemanager.cpp} (71%) rename app-static/themes/{thememanager.h => stylemanager.h} (72%) rename test/integration/{thememanagertest.cpp => themecollectiontest.cpp} (63%) rename test/integration/{thememanagertest.h => themecollectiontest.h} (84%) rename test/unit/{thememanagertest.cpp => stylemanagertest.cpp} (60%) rename test/unit/{thememanagertest.h => stylemanagertest.h} (88%) diff --git a/app-static/app-static.pro b/app-static/app-static.pro index 7a1a16cc..d697818d 100644 --- a/app-static/app-static.pro +++ b/app-static/app-static.pro @@ -22,9 +22,9 @@ SOURCES += \ template/htmltemplate.cpp \ template/presentationtemplate.cpp \ themes/jsonthemetranslator.cpp \ + themes/stylemanager.cpp \ themes/theme.cpp \ themes/themecollection.cpp \ - themes/thememanager.cpp \ completionlistmodel.cpp \ datalocation.cpp \ slidelinemapping.cpp \ @@ -49,9 +49,9 @@ HEADERS += \ template/presentationtemplate.h \ themes/jsonthemetranslator.h \ themes/jsonthemetranslatorfactory.h \ + themes/stylemanager.h \ themes/theme.h \ themes/themecollection.h \ - themes/thememanager.h \ completionlistmodel.h \ datalocation.h \ slidelinemapping.h \ diff --git a/app-static/themes/thememanager.cpp b/app-static/themes/stylemanager.cpp similarity index 71% rename from app-static/themes/thememanager.cpp rename to app-static/themes/stylemanager.cpp index 4f8ef6b4..f3eb187c 100644 --- a/app-static/themes/thememanager.cpp +++ b/app-static/themes/stylemanager.cpp @@ -14,10 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "thememanager.h" +#include "stylemanager.h" -#include -#include +#include static const QMap BUILTIN_MARKDOWN_HIGHLIGHTINGS = { @@ -45,40 +44,17 @@ static const QMap BUILTIN_PREVIEW_STYLESHEETS = { { "Byword Dark", "qrc:/css/byword-dark.css" } }; -ThemeCollection ThemeManager::m_htmlPreviewThemes; - - -ThemeManager::ThemeManager() : - ThemeManager(":/builtin-htmlpreview-themes.json") -{ -} - -ThemeManager::ThemeManager(const QString &themeFileName) -{ - JsonFile::load(themeFileName, &m_htmlPreviewThemes); -} - -Theme ThemeManager::themeByName(const QString &name) const -{ - return m_htmlPreviewThemes.theme(name); -} - -QStringList ThemeManager::themeNames() const -{ - return m_htmlPreviewThemes.themeNames(); -} - -QString ThemeManager::markdownHighlightingPath(const Theme &theme) +QString StyleManager::markdownHighlightingPath(const Theme &theme) { return BUILTIN_MARKDOWN_HIGHLIGHTINGS[theme.markdownHighlighting()]; } -QString ThemeManager::codeHighlightingPath(const Theme &theme) +QString StyleManager::codeHighlightingPath(const Theme &theme) { return BUILTIN_CODE_HIGHLIGHTINGS[theme.codeHighlighting()]; } -QString ThemeManager::previewStylesheetPath(const Theme &theme) +QString StyleManager::previewStylesheetPath(const Theme &theme) { return BUILTIN_PREVIEW_STYLESHEETS[theme.previewStylesheet()]; } diff --git a/app-static/themes/thememanager.h b/app-static/themes/stylemanager.h similarity index 72% rename from app-static/themes/thememanager.h rename to app-static/themes/stylemanager.h index 1c2ab4da..0b4fed56 100644 --- a/app-static/themes/thememanager.h +++ b/app-static/themes/stylemanager.h @@ -14,31 +14,20 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef THEMEMANAGER_H -#define THEMEMANAGER_H +#ifndef STYLEMANAGER_H +#define STYLEMANAGER_H -#include #include #include "theme.h" -#include "themecollection.h" -class ThemeManager +class StyleManager { public: - ThemeManager(); - explicit ThemeManager(const QString &themeFileName); - - Theme themeByName(const QString &name) const; - QStringList themeNames() const; - static QString markdownHighlightingPath(const Theme &theme); static QString codeHighlightingPath(const Theme &theme); static QString previewStylesheetPath(const Theme &theme); - -private: - static ThemeCollection m_htmlPreviewThemes; }; -#endif // THEMEMANAGER_H +#endif // STYLEMANAGER_H diff --git a/app-static/themes/themecollection.cpp b/app-static/themes/themecollection.cpp index 981767d8..4f4fe52f 100644 --- a/app-static/themes/themecollection.cpp +++ b/app-static/themes/themecollection.cpp @@ -16,6 +16,13 @@ */ #include "themecollection.h" +#include +#include + +bool ThemeCollection::load(const QString &fileName) +{ + return JsonFile::load(fileName, this); +} int ThemeCollection::insert(const Theme &theme) { diff --git a/app-static/themes/themecollection.h b/app-static/themes/themecollection.h index 6c2c6ae5..30cd0113 100644 --- a/app-static/themes/themecollection.h +++ b/app-static/themes/themecollection.h @@ -26,6 +26,8 @@ class ThemeCollection : public JsonCollection { public: + bool load(const QString &fileName); + int insert(const Theme &theme); int count() const; diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 5b7fc4e0..b85bab21 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -47,7 +47,8 @@ #include #include #include -#include +#include +#include #include #include "controls/activelabel.h" #include "controls/findreplacewidget.h" @@ -79,7 +80,7 @@ MainWindow::MainWindow(const QString &fileName, QWidget *parent) : snippetCollection(new SnippetCollection(this)), viewSynchronizer(0), htmlPreviewController(0), - themeManager(new ThemeManager()), + themeCollection(new ThemeCollection()), splitFactor(0.5), rightViewCollapsed(false) { @@ -472,7 +473,7 @@ void MainWindow::lastUsedTheme() { QString themeName = options->lastUsedTheme(); - currentTheme = themeManager->themeByName(themeName); + currentTheme = themeCollection->theme(themeName); applyCurrentTheme(); styleLabel->setText(themeName); @@ -483,7 +484,7 @@ void MainWindow::themeChanged() QAction *action = qobject_cast(sender()); QString themeName = action->text(); - currentTheme = themeManager->themeByName(themeName); + currentTheme = themeCollection->theme(themeName); applyCurrentTheme(); styleLabel->setText(themeName); @@ -492,7 +493,7 @@ void MainWindow::themeChanged() void MainWindow::editorStyleChanged() { - QString markdownHighlighting = ThemeManager::markdownHighlightingPath(currentTheme); + QString markdownHighlighting = StyleManager::markdownHighlightingPath(currentTheme); ui->plainTextEdit->loadStyleFromStylesheet(stylePath(markdownHighlighting)); } @@ -502,9 +503,9 @@ void MainWindow::styleCustomStyle() currentTheme = { action->text(), "Default", "Default", action->data().toString() }; - QString markdownHighlighting = ThemeManager::markdownHighlightingPath(currentTheme); - QString codeHighlighting = ThemeManager::codeHighlightingPath(currentTheme); - QString previewStylesheet = ThemeManager::previewStylesheetPath(currentTheme); + QString markdownHighlighting = StyleManager::markdownHighlightingPath(currentTheme); + QString codeHighlighting = StyleManager::codeHighlightingPath(currentTheme); + QString previewStylesheet = StyleManager::previewStylesheetPath(currentTheme); generator->setCodeHighlightingStyle(codeHighlighting); ui->plainTextEdit->loadStyleFromStylesheet(stylePath(markdownHighlighting)); @@ -516,9 +517,9 @@ void MainWindow::styleCustomStyle() void MainWindow::applyCurrentTheme() { - QString markdownHighlighting = ThemeManager::markdownHighlightingPath(currentTheme); - QString codeHighlighting = ThemeManager::codeHighlightingPath(currentTheme); - QString previewStylesheet = ThemeManager::previewStylesheetPath(currentTheme); + QString markdownHighlighting = StyleManager::markdownHighlightingPath(currentTheme); + QString codeHighlighting = StyleManager::codeHighlightingPath(currentTheme); + QString previewStylesheet = StyleManager::previewStylesheetPath(currentTheme); generator->setCodeHighlightingStyle(codeHighlighting); ui->plainTextEdit->loadStyleFromStylesheet(stylePath(markdownHighlighting)); @@ -1201,13 +1202,15 @@ void MainWindow::updateSplitter() void MainWindow::setupHtmlPreviewThemes() { + themeCollection->load(":/builtin-htmlpreview-themes.json"); + ui->menuStyles->clear(); delete stylesGroup; stylesGroup = new QActionGroup(this); int key = 1; - foreach(const QString &themeName, themeManager->themeNames()) { + foreach(const QString &themeName, themeCollection->themeNames()) { QAction *action = ui->menuStyles->addAction(themeName); action->setShortcut(QKeySequence(tr("Ctrl+%1").arg(key++))); action->setCheckable(true); diff --git a/app/mainwindow.h b/app/mainwindow.h index 23f15b68..da354759 100644 --- a/app/mainwindow.h +++ b/app/mainwindow.h @@ -38,7 +38,7 @@ class RecentFilesMenu; class Options; class SlideLineMapping; class SnippetCollection; -class ThemeManager; +class ThemeCollection; class ViewSynchronizer; @@ -160,7 +160,7 @@ private slots: SnippetCollection *snippetCollection; ViewSynchronizer *viewSynchronizer; HtmlPreviewController *htmlPreviewController; - ThemeManager *themeManager; + ThemeCollection *themeCollection; Theme currentTheme { "Default", "Default", "Default", "Default" }; QString fileName; float splitFactor; diff --git a/test/integration/integration.pro b/test/integration/integration.pro index 5e0a0f35..9618d74e 100644 --- a/test/integration/integration.pro +++ b/test/integration/integration.pro @@ -19,7 +19,7 @@ SOURCES += \ main.cpp \ pmhmarkdownparsertest.cpp \ revealmarkdownconvertertest.cpp \ - thememanagertest.cpp + themecollectiontest.cpp HEADERS += \ discountmarkdownconvertertest.h \ @@ -29,7 +29,7 @@ HEADERS += \ jsonthemefiletest.h \ pmhmarkdownparsertest.h \ revealmarkdownconvertertest.h \ - thememanagertest.h + themecollectiontest.h target.CONFIG += no_default_install diff --git a/test/integration/main.cpp b/test/integration/main.cpp index 0ce05c39..a670e1c6 100644 --- a/test/integration/main.cpp +++ b/test/integration/main.cpp @@ -25,7 +25,7 @@ #include "jsonthemefiletest.h" #include "pmhmarkdownparsertest.h" #include "revealmarkdownconvertertest.h" -#include "thememanagertest.h" +#include "themecollectiontest.h" #ifdef ENABLE_HOEDOWN #include "hoedownmarkdownconvertertest.h" @@ -63,7 +63,7 @@ int main(int argc, char *argv[]) JsonThemeFileTest test8; ret += QTest::qExec(&test8, argc, argv); - ThemeManagerTest test9; + ThemeCollectionTest test9; ret += QTest::qExec(&test9, argc, argv); return ret; diff --git a/test/integration/thememanagertest.cpp b/test/integration/themecollectiontest.cpp similarity index 63% rename from test/integration/thememanagertest.cpp rename to test/integration/themecollectiontest.cpp index 26828b74..f97e78ff 100644 --- a/test/integration/thememanagertest.cpp +++ b/test/integration/themecollectiontest.cpp @@ -14,19 +14,19 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "thememanagertest.h" +#include "themecollectiontest.h" #include -#include +#include -void ThemeManagerTest::initTestCase() +void ThemeCollectionTest::initTestCase() { - QTemporaryFile themeFile(this); - if (!themeFile.open()) + themeFile = new QTemporaryFile(this); + if (!themeFile->open()) QFAIL("Failed to create temporary theme file"); - QTextStream out(&themeFile); + QTextStream out(themeFile); out << "{ \"themes\": [" << " { \"name\": \"default\"," << " \"markdownHighlighting\": \"default\"," @@ -36,33 +36,21 @@ void ThemeManagerTest::initTestCase() << " \"markdownHighlighting\": \"dark\"," << " \"codeHighlighting\": \"black\"," << " \"previewStylesheet\": \"dark\" } ] }"; - - themeFile.close(); - - themeManager = new ThemeManager(themeFile.fileName()); } -void ThemeManagerTest::cleanupTestCase() +void ThemeCollectionTest::cleanupTestCase() { - delete themeManager; + themeFile->close(); } -void ThemeManagerTest::returnsBuiltinThemeByName() +void ThemeCollectionTest::loadsThemesFromFileIntoCollection() { - Theme actual = themeManager->themeByName("dark"); - - QCOMPARE(actual.name(), QLatin1String("dark")); - QCOMPARE(actual.markdownHighlighting(), QLatin1String("dark")); - QCOMPARE(actual.codeHighlighting(), QLatin1String("black")); - QCOMPARE(actual.previewStylesheet(), QLatin1String("dark")); -} + ThemeCollection themeCollection; -void ThemeManagerTest::returnsNameOfAllBuiltinThemes() -{ - QStringList themeNames = themeManager->themeNames(); + themeCollection.load(themeFile->fileName()); + QStringList themeNames = themeCollection.themeNames(); QCOMPARE(themeNames.count(), 2); QCOMPARE(themeNames.at(0), QLatin1String("default")); QCOMPARE(themeNames.at(1), QLatin1String("dark")); } - diff --git a/test/integration/thememanagertest.h b/test/integration/themecollectiontest.h similarity index 84% rename from test/integration/thememanagertest.h rename to test/integration/themecollectiontest.h index 0485acbc..80f2c3d3 100644 --- a/test/integration/thememanagertest.h +++ b/test/integration/themecollectiontest.h @@ -18,10 +18,11 @@ #define THEMEMANAGERTEST_H #include -class ThemeManager; +class QTemporaryFile; +class ThemeCollection; -class ThemeManagerTest : public QObject +class ThemeCollectionTest : public QObject { Q_OBJECT @@ -29,11 +30,10 @@ private slots: void initTestCase(); void cleanupTestCase(); - void returnsBuiltinThemeByName(); - void returnsNameOfAllBuiltinThemes(); + void loadsThemesFromFileIntoCollection(); private: - ThemeManager *themeManager; + QTemporaryFile *themeFile; }; #endif // THEMEMANAGERTEST_H diff --git a/test/unit/main.cpp b/test/unit/main.cpp index 8e29a615..768e25cb 100644 --- a/test/unit/main.cpp +++ b/test/unit/main.cpp @@ -24,8 +24,8 @@ #include "snippetcollectiontest.h" #include "completionlistmodeltest.h" #include "snippettest.h" +#include "stylemanagertest.h" #include "themecollectiontest.h" -#include "thememanagertest.h" #include "themetest.h" #include "yamlheadercheckertest.h" @@ -63,7 +63,7 @@ int main(int argc, char *argv[]) ThemeCollectionTest test10; ret += QTest::qExec(&test10, argc, argv); - ThemeManagerTest test11; + StyleManagerTest test11; ret += QTest::qExec(&test11, argc, argv); JsonThemeTranslatorTest test12; diff --git a/test/unit/thememanagertest.cpp b/test/unit/stylemanagertest.cpp similarity index 60% rename from test/unit/thememanagertest.cpp rename to test/unit/stylemanagertest.cpp index fdcc0046..8e0a9434 100644 --- a/test/unit/thememanagertest.cpp +++ b/test/unit/stylemanagertest.cpp @@ -14,11 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "thememanagertest.h" +#include "stylemanagertest.h" #include -#include +#include static const Theme defaultTheme("Default", "Default", "Default", "Default"); static const Theme githubTheme("Github", "Github", "Github", "Github"); @@ -28,37 +28,37 @@ static const Theme clearnessTheme("Clearness", "Clearness", "Clearness", "Clearn static const Theme clearnessDarkTheme("Clearness Dark", "Clearness Dark", "Clearness Dark", "Clearness Dark"); static const Theme bywordDarkTheme("Byword Dark", "Byword Dark", "Byword Dark", "Byword Dark"); -void ThemeManagerTest::returnsPathForMarkdownHighlighting() +void StyleManagerTest::returnsPathForMarkdownHighlighting() { - ThemeManager themeManager; + StyleManager styleManager; - QCOMPARE(themeManager.markdownHighlightingPath(defaultTheme), QLatin1String("default")); - QCOMPARE(themeManager.markdownHighlightingPath(solarizedLightTheme), QLatin1String("solarized-light")); - QCOMPARE(themeManager.markdownHighlightingPath(solarizedDarkTheme), QLatin1String("solarized-dark")); - QCOMPARE(themeManager.markdownHighlightingPath(clearnessDarkTheme), QLatin1String("clearness-dark")); - QCOMPARE(themeManager.markdownHighlightingPath(bywordDarkTheme), QLatin1String("byword-dark")); + QCOMPARE(styleManager.markdownHighlightingPath(defaultTheme), QLatin1String("default")); + QCOMPARE(styleManager.markdownHighlightingPath(solarizedLightTheme), QLatin1String("solarized-light")); + QCOMPARE(styleManager.markdownHighlightingPath(solarizedDarkTheme), QLatin1String("solarized-dark")); + QCOMPARE(styleManager.markdownHighlightingPath(clearnessDarkTheme), QLatin1String("clearness-dark")); + QCOMPARE(styleManager.markdownHighlightingPath(bywordDarkTheme), QLatin1String("byword-dark")); } -void ThemeManagerTest::returnsPathForCodeHighlighting() +void StyleManagerTest::returnsPathForCodeHighlighting() { - ThemeManager themeManager; + StyleManager styleManager; - QCOMPARE(themeManager.codeHighlightingPath(defaultTheme), QLatin1String("default")); - QCOMPARE(themeManager.codeHighlightingPath(githubTheme), QLatin1String("github")); - QCOMPARE(themeManager.codeHighlightingPath(solarizedLightTheme), QLatin1String("solarized_light")); - QCOMPARE(themeManager.codeHighlightingPath(solarizedDarkTheme), QLatin1String("solarized_dark")); + QCOMPARE(styleManager.codeHighlightingPath(defaultTheme), QLatin1String("default")); + QCOMPARE(styleManager.codeHighlightingPath(githubTheme), QLatin1String("github")); + QCOMPARE(styleManager.codeHighlightingPath(solarizedLightTheme), QLatin1String("solarized_light")); + QCOMPARE(styleManager.codeHighlightingPath(solarizedDarkTheme), QLatin1String("solarized_dark")); } -void ThemeManagerTest::returnsPathForPreviewStylesheet() +void StyleManagerTest::returnsPathForPreviewStylesheet() { - ThemeManager themeManager; + StyleManager styleManager; - QCOMPARE(themeManager.previewStylesheetPath(defaultTheme), QLatin1String("qrc:/css/markdown.css")); - QCOMPARE(themeManager.previewStylesheetPath(githubTheme), QLatin1String("qrc:/css/github.css")); - QCOMPARE(themeManager.previewStylesheetPath(solarizedLightTheme), QLatin1String("qrc:/css/solarized-light.css")); - QCOMPARE(themeManager.previewStylesheetPath(solarizedDarkTheme), QLatin1String("qrc:/css/solarized-dark.css")); - QCOMPARE(themeManager.previewStylesheetPath(clearnessTheme), QLatin1String("qrc:/css/clearness.css")); - QCOMPARE(themeManager.previewStylesheetPath(clearnessDarkTheme), QLatin1String("qrc:/css/clearness-dark.css")); - QCOMPARE(themeManager.previewStylesheetPath(bywordDarkTheme), QLatin1String("qrc:/css/byword-dark.css")); + QCOMPARE(styleManager.previewStylesheetPath(defaultTheme), QLatin1String("qrc:/css/markdown.css")); + QCOMPARE(styleManager.previewStylesheetPath(githubTheme), QLatin1String("qrc:/css/github.css")); + QCOMPARE(styleManager.previewStylesheetPath(solarizedLightTheme), QLatin1String("qrc:/css/solarized-light.css")); + QCOMPARE(styleManager.previewStylesheetPath(solarizedDarkTheme), QLatin1String("qrc:/css/solarized-dark.css")); + QCOMPARE(styleManager.previewStylesheetPath(clearnessTheme), QLatin1String("qrc:/css/clearness.css")); + QCOMPARE(styleManager.previewStylesheetPath(clearnessDarkTheme), QLatin1String("qrc:/css/clearness-dark.css")); + QCOMPARE(styleManager.previewStylesheetPath(bywordDarkTheme), QLatin1String("qrc:/css/byword-dark.css")); } diff --git a/test/unit/thememanagertest.h b/test/unit/stylemanagertest.h similarity index 88% rename from test/unit/thememanagertest.h rename to test/unit/stylemanagertest.h index 72d9e8fa..cf1308e7 100644 --- a/test/unit/thememanagertest.h +++ b/test/unit/stylemanagertest.h @@ -14,12 +14,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef THEMEMANAGERTEST_H -#define THEMEMANAGERTEST_H +#ifndef STYLEMANAGERTEST_H +#define STYLEMANAGERTEST_H #include -class ThemeManagerTest : public QObject +class StyleManagerTest : public QObject { Q_OBJECT @@ -29,6 +29,6 @@ private slots: void returnsPathForPreviewStylesheet(); }; -#endif // THEMEMANAGERTEST_H +#endif // STYLEMANAGERTEST_H diff --git a/test/unit/unit.pro b/test/unit/unit.pro index 7f436e33..fe6d6d20 100644 --- a/test/unit/unit.pro +++ b/test/unit/unit.pro @@ -22,7 +22,7 @@ SOURCES += \ yamlheadercheckertest.cpp \ themetest.cpp \ themecollectiontest.cpp \ - thememanagertest.cpp + stylemanagertest.cpp HEADERS += \ completionlistmodeltest.h \ @@ -36,7 +36,7 @@ HEADERS += \ yamlheadercheckertest.h \ themetest.h \ themecollectiontest.h \ - thememanagertest.h + stylemanagertest.h target.CONFIG += no_default_install From 942b1ad5d00e53a9dbb768070e1d6f774a549f9b Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Sat, 19 Dec 2015 14:26:59 +0100 Subject: [PATCH 23/74] Restore custom preview style functionality --- app-static/themes/stylemanager.cpp | 12 ++++++++++++ app-static/themes/stylemanager.h | 6 ++++++ app/mainwindow.cpp | 19 +++++++++---------- test/unit/stylemanagertest.cpp | 10 ++++++++++ test/unit/stylemanagertest.h | 1 + 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/app-static/themes/stylemanager.cpp b/app-static/themes/stylemanager.cpp index f3eb187c..36185d97 100644 --- a/app-static/themes/stylemanager.cpp +++ b/app-static/themes/stylemanager.cpp @@ -44,6 +44,14 @@ static const QMap BUILTIN_PREVIEW_STYLESHEETS = { { "Byword Dark", "qrc:/css/byword-dark.css" } }; +QMap StyleManager::customPreviewStylesheets; + + +void StyleManager::insertCustomPreviewStylesheet(const QString &styleName, const QString &stylePath) +{ + customPreviewStylesheets.insert(styleName, stylePath); +} + QString StyleManager::markdownHighlightingPath(const Theme &theme) { return BUILTIN_MARKDOWN_HIGHLIGHTINGS[theme.markdownHighlighting()]; @@ -56,5 +64,9 @@ QString StyleManager::codeHighlightingPath(const Theme &theme) QString StyleManager::previewStylesheetPath(const Theme &theme) { + if (customPreviewStylesheets.contains(theme.previewStylesheet())) { + return customPreviewStylesheets[theme.previewStylesheet()]; + } + return BUILTIN_PREVIEW_STYLESHEETS[theme.previewStylesheet()]; } diff --git a/app-static/themes/stylemanager.h b/app-static/themes/stylemanager.h index 0b4fed56..ba4b7fd8 100644 --- a/app-static/themes/stylemanager.h +++ b/app-static/themes/stylemanager.h @@ -17,6 +17,7 @@ #ifndef STYLEMANAGER_H #define STYLEMANAGER_H +#include #include #include "theme.h" @@ -24,9 +25,14 @@ class StyleManager { public: + void insertCustomPreviewStylesheet(const QString &styleName, const QString &stylePath); + static QString markdownHighlightingPath(const Theme &theme); static QString codeHighlightingPath(const Theme &theme); static QString previewStylesheetPath(const Theme &theme); + +private: + static QMap customPreviewStylesheets; }; #endif // STYLEMANAGER_H diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index b85bab21..bf795716 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -127,6 +127,8 @@ void MainWindow::initializeApp() ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); ui->tocWebView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); + themeCollection->load(":/builtin-htmlpreview-themes.json"); + loadCustomStyles(); setupHtmlPreviewThemes(); // apply last used theme @@ -163,7 +165,6 @@ void MainWindow::initializeApp() QWebInspector *inspector = new QWebInspector(); inspector->setPage(ui->webView->page()); - loadCustomStyles(); ui->menuLanguages->loadDictionaries(options->dictionaryLanguage()); //: path to built-in snippets resource. @@ -1202,7 +1203,6 @@ void MainWindow::updateSplitter() void MainWindow::setupHtmlPreviewThemes() { - themeCollection->load(":/builtin-htmlpreview-themes.json"); ui->menuStyles->clear(); @@ -1227,21 +1227,20 @@ void MainWindow::loadCustomStyles() QDir dataPath(paths.first() + QDir::separator() + "styles"); dataPath.setFilter(QDir::Files); if (dataPath.exists()) { - ui->menuStyles->addSeparator(); - // iterate over all files in the styles subdirectory QDirIterator it(dataPath); while (it.hasNext()) { it.next(); QString fileName = it.fileName(); - QAction *action = ui->menuStyles->addAction(QFileInfo(fileName).baseName()); - action->setCheckable(true); - action->setActionGroup(stylesGroup); - action->setData(it.filePath()); + QString styleName = QFileInfo(fileName).baseName(); + QString stylePath = QUrl::fromLocalFile(it.filePath()).toString(); + + Theme customTheme { styleName, "Default", "Default", styleName }; + themeCollection->insert(customTheme); - connect(action, SIGNAL(triggered()), - this, SLOT(styleCustomStyle())); + StyleManager styleManager; + styleManager.insertCustomPreviewStylesheet(styleName, stylePath); } } } diff --git a/test/unit/stylemanagertest.cpp b/test/unit/stylemanagertest.cpp index 8e0a9434..c6de8913 100644 --- a/test/unit/stylemanagertest.cpp +++ b/test/unit/stylemanagertest.cpp @@ -62,3 +62,13 @@ void StyleManagerTest::returnsPathForPreviewStylesheet() QCOMPARE(styleManager.previewStylesheetPath(bywordDarkTheme), QLatin1String("qrc:/css/byword-dark.css")); } +void StyleManagerTest::returnsPathForCustomPreviewStylesheet() +{ + QString expectedPath = "file:///C:/User/Test/custom.css"; + Theme customTheme("Custom", "Default", "Default", "Custom"); + StyleManager styleManager; + + styleManager.insertCustomPreviewStylesheet("Custom", expectedPath); + + QCOMPARE(styleManager.previewStylesheetPath(customTheme), expectedPath); +} diff --git a/test/unit/stylemanagertest.h b/test/unit/stylemanagertest.h index cf1308e7..af1fe57d 100644 --- a/test/unit/stylemanagertest.h +++ b/test/unit/stylemanagertest.h @@ -27,6 +27,7 @@ private slots: void returnsPathForMarkdownHighlighting(); void returnsPathForCodeHighlighting(); void returnsPathForPreviewStylesheet(); + void returnsPathForCustomPreviewStylesheet(); }; #endif // STYLEMANAGERTEST_H From 48b6509814a703cb65fa2709d21506fe79512fb7 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Mon, 21 Dec 2015 12:01:26 +0100 Subject: [PATCH 24/74] Additional test for custom overwriting builtins --- test/unit/stylemanagertest.cpp | 11 +++++++++++ test/unit/stylemanagertest.h | 1 + 2 files changed, 12 insertions(+) diff --git a/test/unit/stylemanagertest.cpp b/test/unit/stylemanagertest.cpp index c6de8913..87161278 100644 --- a/test/unit/stylemanagertest.cpp +++ b/test/unit/stylemanagertest.cpp @@ -72,3 +72,14 @@ void StyleManagerTest::returnsPathForCustomPreviewStylesheet() QCOMPARE(styleManager.previewStylesheetPath(customTheme), expectedPath); } + +void StyleManagerTest::customPreviewStylesheetOverwritesBuiltin() +{ + QString expectedPath = "file:///C:/User/Test/custom.css"; + Theme customTheme("Custom", "Default", "Default", "Github"); + StyleManager styleManager; + + styleManager.insertCustomPreviewStylesheet("Github", expectedPath); + + QCOMPARE(styleManager.previewStylesheetPath(customTheme), expectedPath); +} diff --git a/test/unit/stylemanagertest.h b/test/unit/stylemanagertest.h index af1fe57d..773c9460 100644 --- a/test/unit/stylemanagertest.h +++ b/test/unit/stylemanagertest.h @@ -28,6 +28,7 @@ private slots: void returnsPathForCodeHighlighting(); void returnsPathForPreviewStylesheet(); void returnsPathForCustomPreviewStylesheet(); + void customPreviewStylesheetOverwritesBuiltin(); }; #endif // STYLEMANAGERTEST_H From c3d94b37d4b0863809411f5d393c2ce1afdac572 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Mon, 21 Dec 2015 12:47:58 +0100 Subject: [PATCH 25/74] Remove unused styleCustomStlye() method --- app/mainwindow.cpp | 18 ------------------ app/mainwindow.h | 1 - 2 files changed, 19 deletions(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index bf795716..94379274 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -498,24 +498,6 @@ void MainWindow::editorStyleChanged() ui->plainTextEdit->loadStyleFromStylesheet(stylePath(markdownHighlighting)); } -void MainWindow::styleCustomStyle() -{ - QAction *action = qobject_cast(sender()); - - currentTheme = { action->text(), "Default", "Default", action->data().toString() }; - - QString markdownHighlighting = StyleManager::markdownHighlightingPath(currentTheme); - QString codeHighlighting = StyleManager::codeHighlightingPath(currentTheme); - QString previewStylesheet = StyleManager::previewStylesheetPath(currentTheme); - - generator->setCodeHighlightingStyle(codeHighlighting); - ui->plainTextEdit->loadStyleFromStylesheet(stylePath(markdownHighlighting)); - ui->webView->page()->settings()->setUserStyleSheetUrl(QUrl::fromLocalFile(previewStylesheet)); - - styleLabel->setText(action->text()); - options->setLastUsedTheme(action->objectName()); -} - void MainWindow::applyCurrentTheme() { QString markdownHighlighting = StyleManager::markdownHighlightingPath(currentTheme); diff --git a/app/mainwindow.h b/app/mainwindow.h index da354759..c8a5439a 100644 --- a/app/mainwindow.h +++ b/app/mainwindow.h @@ -88,7 +88,6 @@ private slots: void lastUsedTheme(); void themeChanged(); void editorStyleChanged(); - void styleCustomStyle(); void viewFullScreenMode(); void viewHorizontalLayout(bool checked); From 8b4d8681b6b351dbd8fb22eda4431b17bee0acaf Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Mon, 21 Dec 2015 13:08:54 +0100 Subject: [PATCH 26/74] Remove unused style actions --- app/mainwindow.cpp | 13 +--- app/mainwindow.ui | 189 --------------------------------------------- 2 files changed, 2 insertions(+), 200 deletions(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 94379274..42f7536f 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -73,6 +73,7 @@ MainWindow::MainWindow(const QString &fileName, QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), options(new Options(this)), + stylesGroup(new QActionGroup(this)), styleLabel(0), wordCountLabel(0), viewLabel(0), @@ -988,16 +989,6 @@ void MainWindow::setupActions() connect(ui->menuLanguages, SIGNAL(languageTriggered(Dictionary)), this, SLOT(languageChanged(Dictionary))); - // put style actions in a group - stylesGroup = new QActionGroup(this); - ui->actionDefault->setActionGroup(stylesGroup); - ui->actionGithub->setActionGroup(stylesGroup); - ui->actionSolarizedLight->setActionGroup(stylesGroup); - ui->actionSolarizedDark->setActionGroup(stylesGroup); - ui->actionClearness->setActionGroup(stylesGroup); - ui->actionClearnessDark->setActionGroup(stylesGroup); - ui->actionBywordDark->setActionGroup(stylesGroup); - // help menu ui->actionMarkdownSyntax->setShortcut(QKeySequence::HelpContents); @@ -1025,7 +1016,7 @@ void MainWindow::setupStatusBar() statusBar()->setStyleSheet("QStatusBar::item { border: 0px solid black }; "); // add style label to statusbar - styleLabel = new QLabel(ui->actionDefault->text(), this); + styleLabel = new QLabel("Default", this); styleLabel->setToolTip(tr("Change Preview Style")); statusBar()->addPermanentWidget(styleLabel, 1); diff --git a/app/mainwindow.ui b/app/mainwindow.ui index a2a30a71..0456ea92 100644 --- a/app/mainwindow.ui +++ b/app/mainwindow.ui @@ -417,53 +417,6 @@ &Redo - - - true - - - true - - - Default - - - Ctrl+1 - - - - - true - - - Github - - - Ctrl+2 - - - - - true - - - Solarized Light - - - Ctrl+3 - - - - - true - - - Solarized Dark - - - Ctrl+4 - - &About CuteMarkEd... @@ -565,28 +518,6 @@ Code &Highlighting - - - true - - - Clearness - - - Ctrl+5 - - - - - true - - - Clearness Dark - - - Ctrl+6 - - Find/Replace @@ -742,14 +673,6 @@ Ctrl+T - - - Byword Dark - - - Ctrl+7 - - Insert &Image... @@ -972,70 +895,6 @@ - - actionDefault - triggered() - MainWindow - styleDefault() - - - -1 - -1 - - - 399 - 249 - - - - - actionGithub - triggered() - MainWindow - styleGithub() - - - -1 - -1 - - - 399 - 249 - - - - - actionSolarizedLight - triggered() - MainWindow - styleSolarizedLight() - - - -1 - -1 - - - 399 - 249 - - - - - actionSolarizedDark - triggered() - MainWindow - styleSolarizedDark() - - - -1 - -1 - - - 399 - 249 - - - actionAbout triggered() @@ -1356,38 +1215,6 @@ - - actionClearness - triggered() - MainWindow - styleClearness() - - - -1 - -1 - - - 399 - 249 - - - - - actionClearnessDark - triggered() - MainWindow - styleClearnessDark() - - - -1 - -1 - - - 399 - 249 - - - actionFindReplace triggered() @@ -1692,22 +1519,6 @@ - - actionBywordDark - triggered() - MainWindow - styleBywordDark() - - - -1 - -1 - - - 424 - 266 - - - actionInsertImage triggered() From 348b0791fb09ba7923cbc5c87b51f6154de8403c Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Tue, 22 Dec 2015 16:33:00 +0100 Subject: [PATCH 27/74] Add built-in attribute to Theme class --- app-static/themes/theme.cpp | 6 ++++-- app-static/themes/theme.h | 6 +++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app-static/themes/theme.cpp b/app-static/themes/theme.cpp index 7a88d417..3204f16d 100644 --- a/app-static/themes/theme.cpp +++ b/app-static/themes/theme.cpp @@ -19,11 +19,13 @@ Theme::Theme(const QString &name, const QString &markdownHighlighting, const QString &codeHighlighting, - const QString &previewStylesheet) : + const QString &previewStylesheet, + bool builtIn) : m_name(name), m_markdownHighlighting(markdownHighlighting), m_codeHighlighting(codeHighlighting), - m_previewStylesheet(previewStylesheet) + m_previewStylesheet(previewStylesheet), + m_builtIn(builtIn) { checkInvariants(); } diff --git a/app-static/themes/theme.h b/app-static/themes/theme.h index 94b4c5c2..227a1a75 100644 --- a/app-static/themes/theme.h +++ b/app-static/themes/theme.h @@ -27,7 +27,8 @@ class Theme Theme(const QString &name, const QString &markdownHighlighting, const QString &codeHighlighting, - const QString &previewStylesheet); + const QString &previewStylesheet, + bool builtIn = false); QString name() const { return m_name; } @@ -37,6 +38,8 @@ class Theme QString previewStylesheet() const { return m_previewStylesheet; } + bool isBuiltIn() const { return m_builtIn; } + bool operator<(const Theme &rhs) const { return m_name < rhs.name(); @@ -55,6 +58,7 @@ class Theme QString m_markdownHighlighting; QString m_codeHighlighting; QString m_previewStylesheet; + bool m_builtIn; }; #endif // THEME_H From 488f42b133bd95dc59b80c40707ec4b5818808e8 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Tue, 22 Dec 2015 16:33:38 +0100 Subject: [PATCH 28/74] Read built-in attribute from JSON file --- app-static/themes/jsonthemetranslator.cpp | 5 ++++- app/app.pro | 3 ++- app/builtin-htmlpreview-themes.json | 21 ++++++++++++++------- test/integration/jsonthemefiletest.cpp | 7 +++++-- test/unit/jsonthemetranslatortest.cpp | 5 ++++- 5 files changed, 29 insertions(+), 12 deletions(-) diff --git a/app-static/themes/jsonthemetranslator.cpp b/app-static/themes/jsonthemetranslator.cpp index fb671b7d..eeb36d7e 100644 --- a/app-static/themes/jsonthemetranslator.cpp +++ b/app-static/themes/jsonthemetranslator.cpp @@ -22,6 +22,7 @@ static const QLatin1String NAME("name"); static const QLatin1String MARKDOWN_HIGHLIGHTING("markdownHighlighting"); static const QLatin1String CODE_HIGHLIGHTING("codeHighlighting"); static const QLatin1String PREVIEW_STYLESHEET("previewStylesheet"); +static const QLatin1String BUILT_IN("builtIn"); } @@ -31,8 +32,9 @@ Theme JsonThemeTranslator::fromJsonObject(const QJsonObject &object) QString markdownHighlighting = object.value(MARKDOWN_HIGHLIGHTING).toString(); QString codeHighlighting = object.value(CODE_HIGHLIGHTING).toString(); QString previewStylesheet = object.value(PREVIEW_STYLESHEET).toString(); + bool builtIn = object.value(BUILT_IN).toBool(); - return { name, markdownHighlighting, codeHighlighting, previewStylesheet }; + return { name, markdownHighlighting, codeHighlighting, previewStylesheet, builtIn }; } QJsonObject JsonThemeTranslator::toJsonObject(const Theme &theme) @@ -42,6 +44,7 @@ QJsonObject JsonThemeTranslator::toJsonObject(const Theme &theme) object.insert(MARKDOWN_HIGHLIGHTING, theme.markdownHighlighting()); object.insert(CODE_HIGHLIGHTING, theme.codeHighlighting()); object.insert(PREVIEW_STYLESHEET, theme.previewStylesheet()); + object.insert(BUILT_IN, theme.isBuiltIn()); return object; } diff --git a/app/app.pro b/app/app.pro index 3f3197b1..a7faa183 100644 --- a/app/app.pro +++ b/app/app.pro @@ -131,7 +131,8 @@ OTHER_FILES += \ styles/clearness.css \ styles/byword-dark.css \ styles/solarized-light.css \ - markdown-snippets.json + markdown-snippets.json \ + builtin-htmlpreview-themes.json # translations lrelease.input = TRANSLATIONS diff --git a/app/builtin-htmlpreview-themes.json b/app/builtin-htmlpreview-themes.json index 20beadda..49f2334f 100644 --- a/app/builtin-htmlpreview-themes.json +++ b/app/builtin-htmlpreview-themes.json @@ -4,43 +4,50 @@ "name": "Default", "markdownHighlighting": "Default", "codeHighlighting": "Default", - "previewStylesheet": "Default" + "previewStylesheet": "Default", + "builtIn": true }, { "name": "Github", "markdownHighlighting": "Default", "codeHighlighting": "Github", - "previewStylesheet": "Github" + "previewStylesheet": "Github", + "builtIn": true }, { "name": "Solarized Light", "markdownHighlighting": "Solarized Light", "codeHighlighting": "Solarized Light", - "previewStylesheet": "Solarized Light" + "previewStylesheet": "Solarized Light", + "builtIn": true }, { "name": "Solarized Dark", "markdownHighlighting": "Solarized Dark", "codeHighlighting": "Solarized Dark", - "previewStylesheet": "Solarized Dark" + "previewStylesheet": "Solarized Dark", + "builtIn": true }, { "name": "Clearness", "markdownHighlighting": "Default", "codeHighlighting": "Default", - "previewStylesheet": "Clearness" + "previewStylesheet": "Clearness", + "builtIn": true }, { "name": "Clearness Dark", "markdownHighlighting": "Clearness Dark", "codeHighlighting": "Default", - "previewStylesheet": "Clearness Dark" + "previewStylesheet": "Clearness Dark", + "builtIn": true }, { "name": "Byword Dark", "markdownHighlighting": "Byword Dark", "codeHighlighting": "Default", - "previewStylesheet": "Byword Dark" + "previewStylesheet": "Byword Dark", + "builtIn": true } ] } diff --git a/test/integration/jsonthemefiletest.cpp b/test/integration/jsonthemefiletest.cpp index effe6888..016d7c92 100644 --- a/test/integration/jsonthemefiletest.cpp +++ b/test/integration/jsonthemefiletest.cpp @@ -54,7 +54,8 @@ void JsonThemeFileTest::loadsThemesCollectionFromFile() << " { \"name\": \"default\"," << " \"markdownHighlighting\": \"default\"," << " \"codeHighlighting\": \"default\"," - << " \"previewStylesheet\": \"default\" }," + << " \"previewStylesheet\": \"default\"," + << " \"builtIn\": true }," << " { \"name\": \"dark\"," << " \"markdownHighlighting\": \"dark\"," << " \"codeHighlighting\": \"black\"," @@ -124,7 +125,7 @@ void JsonThemeFileTest::roundtripTest() if (!themeFile.open()) QFAIL("Failed to create temporary theme file"); - Theme theme1("default", "default", "default", "default"); + Theme theme1("default", "default", "default", "default", true); Theme theme2("dark", "dark", "black", "dark"); @@ -145,9 +146,11 @@ void JsonThemeFileTest::roundtripTest() QCOMPARE(collection2.at(0).markdownHighlighting(), theme1.markdownHighlighting()); QCOMPARE(collection2.at(0).codeHighlighting(), theme1.codeHighlighting()); QCOMPARE(collection2.at(0).previewStylesheet(), theme1.previewStylesheet()); + QCOMPARE(collection2.at(0).isBuiltIn(), theme1.isBuiltIn()); QCOMPARE(collection2.at(1).name(), theme2.name()); QCOMPARE(collection2.at(1).markdownHighlighting(), theme2.markdownHighlighting()); QCOMPARE(collection2.at(1).codeHighlighting(), theme2.codeHighlighting()); QCOMPARE(collection2.at(1).previewStylesheet(), theme2.previewStylesheet()); + QCOMPARE(collection2.at(0).isBuiltIn(), theme1.isBuiltIn()); } diff --git a/test/unit/jsonthemetranslatortest.cpp b/test/unit/jsonthemetranslatortest.cpp index 8731f018..a100bc9a 100644 --- a/test/unit/jsonthemetranslatortest.cpp +++ b/test/unit/jsonthemetranslatortest.cpp @@ -46,6 +46,7 @@ QJsonObject NewJsonThemeObject() jsonObject.insert("markdownHighlighting", A_MARKDOWN_HIGHLIGHTING); jsonObject.insert("codeHighlighting", A_CODE_HIGHLIGHTING); jsonObject.insert("previewStylesheet", A_PREVIEW_STYLESHEET); + jsonObject.insert("builtIn", true); return jsonObject; } @@ -98,11 +99,12 @@ void JsonThemeTranslatorTest::translatesJsonDocumentToThemes() QCOMPARE(collection.at(0).markdownHighlighting(), A_MARKDOWN_HIGHLIGHTING); QCOMPARE(collection.at(0).codeHighlighting(), A_CODE_HIGHLIGHTING); QCOMPARE(collection.at(0).previewStylesheet(), A_PREVIEW_STYLESHEET); + QCOMPARE(collection.at(0).isBuiltIn(), true); } void JsonThemeTranslatorTest::translatesThemesToJsonDocument() { - Theme theme(A_THEME_NAME, A_MARKDOWN_HIGHLIGHTING, A_CODE_HIGHLIGHTING, A_PREVIEW_STYLESHEET); + Theme theme(A_THEME_NAME, A_MARKDOWN_HIGHLIGHTING, A_CODE_HIGHLIGHTING, A_PREVIEW_STYLESHEET, true); ThemeCollection collection; collection.insert(theme); @@ -113,5 +115,6 @@ void JsonThemeTranslatorTest::translatesThemesToJsonDocument() QCOMPARE(actual["markdownHighlighting"].toString(), A_MARKDOWN_HIGHLIGHTING); QCOMPARE(actual["codeHighlighting"].toString(), A_CODE_HIGHLIGHTING); QCOMPARE(actual["previewStylesheet"].toString(), A_PREVIEW_STYLESHEET); + QCOMPARE(actual["builtIn"].toBool(), true); } From 2a53e0130bb410b608b5e0df22cda4fcd61695f2 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Tue, 22 Dec 2015 16:34:07 +0100 Subject: [PATCH 29/74] Use built-in attribute to add separator between built-in and custom themes --- app/mainwindow.cpp | 16 +++++++++++++++- app/mainwindow.h | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 42f7536f..f385909f 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -1176,13 +1176,13 @@ void MainWindow::updateSplitter() void MainWindow::setupHtmlPreviewThemes() { - ui->menuStyles->clear(); delete stylesGroup; stylesGroup = new QActionGroup(this); int key = 1; + bool separatorAdded = false; foreach(const QString &themeName, themeCollection->themeNames()) { QAction *action = ui->menuStyles->addAction(themeName); action->setShortcut(QKeySequence(tr("Ctrl+%1").arg(key++))); @@ -1190,9 +1190,23 @@ void MainWindow::setupHtmlPreviewThemes() action->setActionGroup(stylesGroup); connect(action, &QAction::triggered, this, &MainWindow::themeChanged); + + if (!separatorAdded && !themeCollection->theme(themeName).isBuiltIn()) { + addSeparatorAfterBuiltInThemes(); + separatorAdded = true; + } } } +void MainWindow::addSeparatorAfterBuiltInThemes() +{ + ui->menuStyles->addSeparator(); + + QAction *separator = new QAction(stylesGroup); + separator->setSeparator(true); + stylesGroup->addAction(separator); +} + void MainWindow::loadCustomStyles() { QStringList paths = DataLocation::standardLocations(); diff --git a/app/mainwindow.h b/app/mainwindow.h index c8a5439a..dc3b2aba 100644 --- a/app/mainwindow.h +++ b/app/mainwindow.h @@ -140,6 +140,7 @@ private slots: void setFileName(const QString &fileName); void updateSplitter(); void setupHtmlPreviewThemes(); + void addSeparatorAfterBuiltInThemes(); void loadCustomStyles(); void readSettings(); void writeSettings(); From fc546787fc3f759b5f0c8ed3d365c29390754169 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Fri, 1 Jan 2016 13:43:14 +0100 Subject: [PATCH 30/74] Update RPM spec to current version on build.opensuse.org --- rpm/cutemarked.spec | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/rpm/cutemarked.spec b/rpm/cutemarked.spec index 73073280..7a8d5b96 100644 --- a/rpm/cutemarked.spec +++ b/rpm/cutemarked.spec @@ -31,18 +31,14 @@ BuildRequires: pkgconfig(hunspell) %if 0%{?suse_version} BuildRequires: update-desktop-files BuildRequires: pkgconfig(Qt5Test) +BuildRequires: pkgconfig(Qt5PrintSupport) BuildRequires: libqt5-qttools-devel %endif -%if 0%{?fedora_version} <= 19 -BuildRequires: libqt5-qttools-devel -%endif -%if 0%{?fedora_version} >= 20 -BuildRequires: qt5-qttools-devel -%endif %if 0%{?fedora_version} BuildRequires: desktop-file-utils BuildRequires: pkgconfig(gstreamer-0.10) pkgconfig(gstreamer-app-0.10) BuildRequires: pkgconfig(sqlite3) +BuildRequires: qt5-qttools-devel %endif From aeed0958db1c1eccc427ebb2c587802aeed12b54 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Fri, 1 Jan 2016 15:42:14 +0100 Subject: [PATCH 31/74] Bump version to v0.11.2 --- CuteMarkEd.wxs | 2 +- app/main.cpp | 2 +- rpm/cutemarked.spec | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CuteMarkEd.wxs b/CuteMarkEd.wxs index 8d1fe38c..037c3c51 100644 --- a/CuteMarkEd.wxs +++ b/CuteMarkEd.wxs @@ -2,7 +2,7 @@ - + 0.11.2-1 +- New patch version 0.11.2 released + * Mon Jul 06 2015 Christian Loose 0.11.1-1 - New patch version 0.11.1 released From 71a2ff81b224742f8557e85d23334bf54519a4e7 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Fri, 1 Jan 2016 17:41:48 +0100 Subject: [PATCH 32/74] Add Hungarian translations Thanks naren93! --- app/app.pro | 5 + app/syntax_hu_HU.html | 236 +++++ app/translations.qrc | 12 +- app/translations/cutemarked_hu_HU.ts | 1241 ++++++++++++++++++++++++++ 4 files changed, 1489 insertions(+), 5 deletions(-) create mode 100644 app/syntax_hu_HU.html create mode 100644 app/translations/cutemarked_hu_HU.ts diff --git a/app/app.pro b/app/app.pro index 3f3197b1..a6859114 100644 --- a/app/app.pro +++ b/app/app.pro @@ -25,8 +25,10 @@ TRANSLATIONS += \ translations/cutemarked_el.ts \ translations/cutemarked_es.ts \ translations/cutemarked_fr.ts \ + translations/cutemarked_hu_HU.ts \ translations/cutemarked_id.ts \ translations/cutemarked_ja.ts \ + translations/cutemarked_pl.ts \ translations/cutemarked_pt_BR.ts \ translations/cutemarked_ru.ts \ translations/cutemarked_zh_CN.ts @@ -121,8 +123,11 @@ OTHER_FILES += \ syntax_da.html \ syntax_de.html \ syntax_el.html \ + syntax_es.html \ + syntax_hu_HU.html \ syntax_id.html \ syntax_ja.html \ + syntax_pt_BR.html \ syntax_zh_CN.html \ styles/solarized-dark.css \ styles/markdown.css \ diff --git a/app/syntax_hu_HU.html b/app/syntax_hu_HU.html new file mode 100644 index 00000000..83623238 --- /dev/null +++ b/app/syntax_hu_HU.html @@ -0,0 +1,236 @@ + + + + +Markdown szintaxis + + + +

CÍMSOROK

+ + + + + + + + + + + + + + + + +
Markdown bemenetKimenet
+
# Címsor 1
+
+## Címsor 2
+
+### Címsor 3
+
+#### Címsor 4
+
+##### Címsor 5
+
+###### Címsor 6
+
+

Címsor 1

+

Címsor 2

+

Címsor 3

+

Címsor 4

+
Címsor 5
+
Címsor 6
+
+
Címsor 1
+===========
+
+Címsor 2
+-----------
+
+

Címsor 1

+

Címsor 2

+
+

BEKEZDÉSEK

+ + + + + + + + + + + + + + + + +
Markdown bemenetKimenet
+
Egy bekezdés egyszerűen egy
+ vagy több egymás utáni sor
+ szöveg, egy vagy több üres
+ vonallal elválasztva.
+
+Ez egy másik bekezdés.
+
+

Egy bekezdés egyszerűen egy vagy több egymás utáni sor szöveg, egy vagy több üres vonallal elválasztva.

+

Ez egy másik bekezdés.

+
+
Hogy sortörést
+hozz létre, fejez be
+a sort kettő vagy több
+szóközzel.
+
+

Hogy sortörést
hozz létre, fejez be
a sort kettő vagy több
szóközzel.

+
+

LISTÁK

+ + + + + + + + + + + + + + + + + + + + + + + + +
Markdown bemenetKimenet
+
* Elem 1
+* Elem 2
+* Elem 3
+
++ Elem 1
++ Elem 2
++ Elem 3
+
+- Elem 1
+- Elem 2
+- Elem 3
+
+
    +
  • Elem 1
  • +
  • Elem 2
  • +
  • Elem 3
  • +
+
    +
  • Elem 1
  • +
  • Elem 2
  • +
  • Elem 3
  • +
+
    +
  • Elem 1
  • +
  • Elem 2
  • +
  • Elem 3
  • +
+
+
1. Elem 1
+2. Elem 2
+3. Elem 3 
+
+
    +
  1. Elem 1
  2. +
  3. Elem 2
  4. +
  5. Elem 3
  6. +
+
+
* Elem 1
+1. Elem 2
++ Elem 3
+2. Elem 4
+
+
    +
  • Elem 1
      +
    1. Elem 2
        +
      • Elem 3
      • +
      +
    2. +
    3. Elem 4
    4. +
    +
  • +
+
+
Kifejezés
+: Definíció
+
+
+
Kifejezés
+
+ +
Definíció
+
+
+

KIEMELÉS

+ + + + + + + + + + + + + + + + +
Markdown bemenetKimenet
+
*Kiemelt* vagyok
+
+__Kiemelt_ vagyok
+
+

Kiemelt vagyok

+ +

Kiemelt vagyok

+
+
**Félkövér** vagyok
+
+__Félkövér__ vagyok
+
+

Félkövér vagyok

+ +

Félkövér vagyok

+
+ + diff --git a/app/translations.qrc b/app/translations.qrc index 752092d6..457c283f 100644 --- a/app/translations.qrc +++ b/app/translations.qrc @@ -1,15 +1,17 @@ - translations/cutemarked_de.qm translations/cutemarked_cs.qm + translations/cutemarked_da.qm + translations/cutemarked_de.qm translations/cutemarked_el.qm - translations/cutemarked_zh_CN.qm + translations/cutemarked_es.qm translations/cutemarked_fr.qm + translations/cutemarked_hu_HU.qm + translations/cutemarked_id.qm translations/cutemarked_ja.qm - translations/cutemarked_es.qm + translations/cutemarked_pl.qm translations/cutemarked_pt_BR.qm translations/cutemarked_ru.qm - translations/cutemarked_id.qm - translations/cutemarked_da.qm + translations/cutemarked_zh_CN.qm diff --git a/app/translations/cutemarked_hu_HU.ts b/app/translations/cutemarked_hu_HU.ts new file mode 100644 index 00000000..3d5b23ca --- /dev/null +++ b/app/translations/cutemarked_hu_HU.ts @@ -0,0 +1,1241 @@ + + + AboutDialog + + + About CuteMarkEd + CuteMarkEd névjegye + + + + &About + &Névjegy + + + + A&uthors + &Közreműködők + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Christian Loose (cloose)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and maintainer</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Jörg Preiß (Slesa)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Andreas Reischuck (arBmind)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Aetf (Aetf)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Pavel Fric (Fri)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Czech translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Hu Junqing (LearnShare)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Chinese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Γιάννης Ανθυμίδης (Evropi)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Greek translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Etienne Gauvin (Etn)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">French translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Rémi Verschelde (akien-mga)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">French translation and Mageia package</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Kota Ouchi (kOtaOuchi)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Norihide Sugohara (touyou)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Eai</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Javier (moguman)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Spanish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Cassio Cardoso (cassiocardoso)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Portuguese (Brazil) translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Victor Nogueira (felladrin)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Portuguese (Brazil) translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Maxim Efremov (maxbart)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Russian translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Bedouin</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Indonesian translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Mljjlm</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Danish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Christian Loose (cloose)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and maintainer</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Jörg Preiß (Slesa)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Andreas Reischuck (arBmind)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Aetf (Aetf)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Pavel Fric (Fri)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Czech translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Hu Junqing (LearnShare)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Chinese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Γιάννης Ανθυμίδης (Evropi)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Greek translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Etienne Gauvin (Etn)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">French translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Rémi Verschelde (akien-mga)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">French translation and Mageia package</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Kota Ouchi (kOtaOuchi)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Norihide Sugohara (touyou)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Eai</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Javier (moguman)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Spanish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Cassio Cardoso (cassiocardoso)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Portuguese (Brazil) translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Victor Nogueira (felladrin)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Portuguese (Brazil) translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Maxim Efremov (maxbart)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Russian translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Bedouin</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Indonesian translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Mljjlm</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Danish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> + + + + &Thanks To + Kö&szönet + + + + Qt-based, free and open source markdown editor with live HTML preview + Qt alapú, ingyenes és nyílt forráskódú markdown szerkesztő, élő HTML előnézettel + + + + ExportHtmlDialog + + + Export to HTML + Exportálás HTML-be + + + + Export to: + Exportálás: + + + + ... + ... + + + + <html><head/><body><p>embed the current CSS style into the exported HTML</p></body></html> + <html><head/><body><p>jelenlegi CSS beágyazása az exportált HTML-be</p></body></html> + + + + Include CSS style + CSS stílusok beágyazása + + + + Include Code Highlighting Javascript + Szintaxis kiemelő szkript beágyazása + + + + Export to HTML... + Exportálás HTML formátumba... + + + + HTML Files (*.html *.htm);;All Files (*) + HTML fájlok (*html *.htm);;Minden fájl (*) + + + + ExportPdfDialog + + + Export to PDF + Exportálás PDF formátumba + + + + Export to: + Exportálás: + + + + ... + ... + + + + Paper Size: + Papír mérete: + + + + Orientation: + Tájolás: + + + + Portrait + Állítva + + + + Landscape + Fektetve + + + + A4 (210 x 297 mm, 8.26 x 11.69 inches) + A4 (210 x 297 mm, 8.26 x 11.69 col) + + + + Letter (8.5 x 11 inches, 215.9 x 279.4 mm) + Letter (8.5 x 11 col, 215.9 x 279.4 mm) + + + + Legal (8.5 x 14 inches, 215.9 x 355.6 mm) + Legal (8.5 x 14 col, 215.9 x 355.6 mm) + + + + A3 (297 x 420 mm) + A3 (297 x 420 mm) + + + + A5 (148 x 210 mm) + A5 (148 x 210 mm) + + + + A6 (105 x 148 mm) + A6 (105 x 148 mm) + + + + B4 (250 x 353 mm) + B4 (250 x 353 mm) + + + + B5 (176 x 250 mm, 6.93 x 9.84 inches) + B5 (176 x 250 mm, 6.93 x 9.84 col) + + + + Export to PDF... + Exportálás PDF formátumba... + + + + PDF Files (*.pdf);;All Files (*) + PDF fájlok(*.pdf);;Minden fájl (*) + + + + FindReplaceWidget + + + Find + Keresés + + + + Find: + Keresés: + + + + Replace with: + Csere erre: + + + + Replace + Csere + + + + Replace All + Összes cseréje + + + + ... + ... + + + + Case Sensitive + Kisbetű-nagybetű érzékenység + + + + Whole Words Only + Csak egész szóra + + + + Use Regular Expressions + Reguláris kifejezés használata + + + + Find Options + Kereső beállítása + + + + ImageToolDialog + + + Insert Image + Kép beillesztése + + + + Image Link: + Kép link: + + + + http://example.com/image.jpg + http://példa.hu/kép.jpg + + + + ... + ... + + + + Alternate Text: + Alternatív szöveg: + + + + Optional Title: + Opcionális cím: + + + + Open File + Fájl megnyitása + + + + Images (*.bmp *.gif *.jpg *.jpe *.jpeg *.png *.tif *.tiff *.xpm);;All Files (*) + Képek (*.bmp *.gif *.jpg *.jpe *.jpeg *.png *.tif *.tiff *.xpm);;Minden fájl (*) + + + + LanguageMenu + + + Languages + Nyelvek + + + + MainWindow + + + + about:blank + about:blank + + + + &File + &Fájl + + + + &Edit + S&zerkesztés + + + + F&ormat + Verb "to format". sub menu title to choose a formatting like bold, italic. + F&ormátum + + + + &Find/Replace + Ke&resés és csere + + + + &Help + &Súgó + + + + &View + &Nézet + + + + E&xtras + E&xtrák + + + + St&yles + Stí&lusok + + + + Markdown E&xtensions + Markdown ki&terjesztések + + + + &Languages + &Nyelvek + + + + Table of contents + Tartalomjegyzék + + + + Markdown Syntax + Markdown szintaxis + + + + + qrc:/syntax.html + qrc:/syntax_hu.html + + + + File Explorer + Fájl kezelő + + + + E&xit + &Bezárás + + + + &New + Ú&j + + + + &Open... + &Megnyitás + + + + &Save + M&entés + + + + Save &As... + Me&ntés másként + + + + &Undo + &Visszavonás + + + + &Redo + &Ismét + + + + Default + Alapértelmezett + + + + Ctrl+1 + Ctrl+1 + + + + Github + Github + + + + Ctrl+2 + Ctrl+2 + + + + Solarized Light + Solarized Light + + + + Ctrl+3 + Ctrl+3 + + + + Solarized Dark + Solarized Dark + + + + Ctrl+4 + Ctrl+4 + + + + &About CuteMarkEd... + &A CuteMarkEd-ről + + + + Export to &HTML... + Exportálás &HTML-be + + + + &Export to PDF... + Exportálás &PDF-be + + + + Split 1:1 + Felosztás: 1:1 + + + + Split 2:1 + Felosztás: 2:1 + + + + Split 1:2 + Felosztás: 1:2 + + + + Split 3:1 + Felosztás: 3:1 + + + + Split 1:3 + Felosztás: 1:3 + + + + Copy &HTML to Clipboard + &HTML másolása vágólapra + + + + Cu&t + &Kivágás + + + + &Copy + &Másolás + + + + &Paste + &Beillesztés + + + + Strong + Félkövér + + + + Emphasize + Dőlt + + + + &Print... + &Nyomtatás + + + + + Strikethrough + Áthúzás + + + + Inline Code + Beágyazott kód + + + + &Math Support + &Matematikai formulák támogatása + + + + Code &Highlighting + Szintaxis &kiemelés + + + + Clearness + Clearness + + + + Ctrl+5 + Ctrl+5 + + + + Clearness Dark + Clearness Dark + + + + Ctrl+6 + Ctrl+6 + + + + Find/Replace + Keresés/Csere + + + + Go to &Line + &Ugrás sorra + + + + Ctrl+L + Ctrl+L + + + + Center Paragraph + Középre igazítás + + + + Hard Linebreak + Kemény sortörés + + + + Ctrl+Return + Ctrl+Enter + + + + Find Next + Következő + + + + Find Previous + Előző + + + + &Full Screen Mode + &Teljes képernyő + + + + Blockquote + Idézet + + + + Ctrl+Shift+Q + Ctrl+Shift+Q + + + + &Markdown Syntax + &Markdown szintaxis + + + + HTML &Preview + HTML &előnézet + + + + F5 + F5 + + + + &Show Special Characters + Option to show characters like line feed or tabs + &Speciális karakterek megjelenítése + + + + &Options... + &Opciók... + + + + Autolink + Automata linkké alakítás + + + + Alphabetic Lists + Betűrendes lista + + + + Definition Lists + Definíciós lista + + + + SmartyPants + SmartyPants + + + + Language + Nyelv + + + + &Check Spelling + Nyelvtani &ellenőrzés + + + + Increase Header Level + Címsor szint növelése + + + + Alt+Right + Alt+Jobbra + + + + Decrease Header Level + Címsor szint csökkentése + + + + Alt+Left + Alt+Balra + + + + Insert Table... + Táblázat beillesztése + + + + Ctrl+T + Ctrl+T + + + + Byword Dark + Byword Dark + + + + Ctrl+7 + Ctrl+7 + + + + Insert &Image... + Kép be&szúrása + + + + Ctrl+Shift+I + Ctrl+Shift+I + + + + &Horizontal Layout + &Fekvő elrendezés + + + + Footnotes + Lábjegyzet + + + + Superscript + Felső index + + + + &Word Wrap + &Hosszú sorok törése + + + + Ignore Y&AML Header + Y&AML fejléc figyelmen kívül hagyása + + + + &Diagram Support + Diagram támogatás + + + + Open File... + Fájl megnyitása + + + + + Markdown Files (*.markdown *.md *.mdown);;All Files (*) + Markdown fájlok (*.markdown *md *.mdown);;Minden fájl (*) + + + + Save as... + Mentés másként + + + + Print Document + Nyomtatás + + + + Go to... + Menj... + + + + Line: + Line number in the Markdown editor + Sor: + + + + + + HTML preview + HTML előnézet + + + + + HTML source + HTML forráskód + + + + %1 words + %1 szó + + + + Lines: %1 Words: %2 Characters: %3 + Sor:%1 Szó: %2 Karakter: %3 + + + + Change Preview Style + Előnézet stílusának módosítása + + + + Save Changes + Módosítások mentése + + + + The document has been modified.<br>Do you want to save your changes? + A dokumentum módosítva lett.<br>Mented a módosításokat? + + + + untitled.md + default file name for new markdown documents + névtelen.md + + + + MarkdownEditor + + + Snippet Complete + Kódrészlet befejezve + + + + Suggestions + Ajánlás + + + + Add to User Dictionary + Hozzáadás a felhasználói szótárhoz + + + + OptionsDialog + + + Options... + Beállítások... + + + + &General + &Általános + + + + Markdown Converter + Markdown konvertáló + + + + Converter &Library: + Konvertáló &program + + + + Discount (Default) + Name of a Markdown to HTML converter library + Discount (Alapértelmezett) + + + + Hoedown + Name of a Markdown to HTML converter library + Hoedown + + + + Reveal.js (Presentation) + Reveal.js (Prezentáció) + + + + &Editor + &Szerkesztő + + + + Font + Betűtípus + + + + &Family: + &Család: + + + + Si&ze: + &Méret: + + + + Tabs + Tabulátor + + + + &Tab width: + &Tabulátor szélessége + + + + &HTML Preview + &HTML előnézet + + + + Fonts + Betűtípus + + + + S&tandard Font: + &Hagyományos: + + + + + Size: + Méret: + + + + Se&rif Font: + Se&rif + + + + S&ans Serif Font: + S&ans Serif + + + + &Fixed Font: + &Rögzített szélességű + + + + &Internet + &Internet + + + + Configure Proxy to Access the Internet + Proxy konfigurálása + + + + No prox&y + Nincs prox&y + + + + &Use system proxy settings + &Rendszer proxy beállításainak használata + + + + &Manual proxy configuration: + &Kézi konfigurálás: + + + + H&ost: + H&oszt: + + + + &Port: + &Port: + + + + User &Name: + Felhasználó &név + + + + Pass&word: + &Jelszó: + + + + &Snippets + &Kódrészletek + + + + &Add + Hozzá&adás + + + + &Remove + El&távolítás + + + + Short&cuts + &Billentyűparancsok + + + + Action + Esemény + + + + Shortcut + Billentyűparancs + + + + Default + Alapértelmezett + + + + Error + Title of error message box + Hiba + + + + No snippet selected. + Nincs kódrészlet kiválasztva + + + + Conflict + Ütközés + + + + This shortcut is already used for "%1" + A billentyűparancs már használatban: "%1" + + + + RecentFilesMenu + + + Recent &Files + Le&gutóbbi fájlok + + + + Clear Menu + Menü törlése + + + + SnippetsTableModel + + + Error + Title of error message box + Hiba + + + + Not a valid trigger. + Nem érvényes trigger + + + + Trigger + Trigger + + + + Description + Leírás + + + + TableToolDialog + + + Insert Table + Táblázat beillesztése + + + + Rows: + Sor: + + + + Columns: + Oszlop: + + + + Table: + Táblázat: + + + + Headers + Címsorok + + + + Alignment + Igazítás + + + + Left + Balra + + + + Center + Középre + + + + Right + Jobbra + + + + main + + + The file to open. + A fájl megnyitásához. + + + \ No newline at end of file From 6591218a1bec11775a8226c5d1f4b0d4671477b2 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Fri, 1 Jan 2016 17:42:29 +0100 Subject: [PATCH 33/74] Update translations --- app/translations/cutemarked_da.ts | 579 +++++++++++++++--------- app/translations/cutemarked_pt_BR.ts | 650 +++++++++++++++++---------- 2 files changed, 777 insertions(+), 452 deletions(-) diff --git a/app/translations/cutemarked_da.ts b/app/translations/cutemarked_da.ts index 95b3d111..3d549a3d 100644 --- a/app/translations/cutemarked_da.ts +++ b/app/translations/cutemarked_da.ts @@ -9,23 +9,82 @@ &About - Tab with information about the application &Om A&uthors - Tab with information about the authors of the application &Forfattere - + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Christian Loose (cloose)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and maintainer</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Jörg Preiß (Slesa)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Andreas Reischuck (arBmind)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Aetf (Aetf)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Pavel Fric (Fri)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Czech translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Hu Junqing (LearnShare)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Chinese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Γιάννης Ανθυμίδης (Evropi)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Greek translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Etienne Gauvin (Etn)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">French translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Rémi Verschelde (akien-mga)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">French translation and Mageia package</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Kota Ouchi (kOtaOuchi)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Norihide Sugohara (touyou)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Eai</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Javier (moguman)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Spanish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Cassio Cardoso (cassiocardoso)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Portuguese (Brazil) translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Victor Nogueira (felladrin)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Portuguese (Brazil) translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Maxim Efremov (maxbart)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Russian translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Bedouin</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Indonesian translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Mljjlm</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Danish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> + + + + &Thanks To - Tab with information about 3rd party libraries &Tak Til - + Qt-based, free and open source markdown editor with live HTML preview Qt-baseret, gratis og open source markdown editor med HTML forhåndsvisning @@ -194,22 +253,22 @@ ... - + Case Sensitive Forskel på små og store bogstaver - + Whole Words Only Kun hele ord - + Use Regular Expressions Brug Regulære Udtryk - + Find Options Søgeindstillinger @@ -269,7 +328,7 @@ MainWindow - + about:blank about:blank @@ -285,14 +344,14 @@ - Format - Formater + F&ormat + Verb "to format". sub menu title to choose a formatting like bold, italic. + - - Find/Replace - Søg/Erstat + &Find/Replace + @@ -311,477 +370,494 @@ - Styles - Typografier + St&yles + - Markdown Extensions - Markdown Udvidelser + Markdown E&xtensions + - Languages - Sprog + &Languages + - + Table of contents Indholdsfortegnelse - - + Markdown Syntax Markdown Syntaks - - + + qrc:/syntax.html qrc:/syntax_da.html - + File Explorer Stifinder - + E&xit &Afslut - + &New &Ny - + &Open... Å&bn... - + &Save &Gem - + Save &As... Gem &som... - + &Undo Fo&rtryd - + &Redo &Gentag - + Default Standard - + Ctrl+1 Ctrl+1 - + Github Github - + Ctrl+2 Ctrl+2 - + Solarized Light Solarized Light - + Ctrl+3 Ctrl+3 - + Solarized Dark Solarized Dark - + Ctrl+4 Ctrl+4 - + &About CuteMarkEd... &Om CuteMarkEd... - - Export to HTML... - Eksportér til HTML... + + Export to &HTML... + - - Export to PDF... - Eksportér til PDF... + + &Export to PDF... + - + Split 1:1 Opdel 1:1 - + Split 2:1 Opdel 2:1 - + Split 1:2 Opdel 1:2 - + Split 3:1 Opdel 3:1 - + Split 1:3 Opdel 1:3 - - Copy HTML to Clipboard - Kopiér HTML til Udklipsholder + + Copy &HTML to Clipboard + - + Cu&t &Klip - + &Copy K&opiér - + &Paste Sæt i&nd - + Strong Fed - + Emphasize Kursiv - + &Print... &Udskriv... - - + + Strikethrough Gennemstreget - + Inline Code Indlejret Kode - - Math Support - Understøttelse for Matematik + + &Math Support + - - Code Highlighting - Fremhævning af kode + + Code &Highlighting + - + Clearness Clearness - + Ctrl+5 Ctrl+5 - + Clearness Dark Clearness Dark - + Ctrl+6 Ctrl+6 - - Go to Line - Gå til linje + + Find/Replace + Søg/Erstat - + + Go to &Line + + + + Ctrl+L Ctrl+L - + Center Paragraph Centrér afsnit - + Hard Linebreak Linjeskift - + Ctrl+Return Ctrl+Enter - + Find Next Find næste - + Find Previous Find forrige - - Full Screen Mode - Fuldskærmstilstand + + &Full Screen Mode + - + Blockquote Citat - + Ctrl+Shift+Q Ctrl+Shift+Q - - - - - HTML preview - HTML forhåndsvisning + + &Markdown Syntax + - + + HTML &Preview + + + + F5 F5 - - Show Special Characters + + &Show Special Characters Option to show characters like line feed or tabs - Vis specielle tegn + - - Options... - Indstillinger... + + &Options... + - + Autolink Autolink - + Alphabetic Lists Alfabetisk ordnede lister - + Definition Lists Definitionslister - + SmartyPants SmartyPants - + Language Sprog - - Check Spelling - Kontrollér stavning + + &Check Spelling + - + Increase Header Level Forøg Overskriftsniveau - + Alt+Right Alt+Højre piletast - + Decrease Header Level Formindsk Overskriftsniveau - + Alt+Left Alt+Venstre piletast - + Insert Table... Indsæt Tabel... - + Ctrl+T Ctrl+T - + Byword Dark Byword Dark - + Ctrl+7 Ctrl+7 - - Insert Image... - Indsæt Billede... + + Insert &Image... + - + Ctrl+Shift+I Ctrl+Shift+I - - Horizontal Layout - Vandret Layout + + &Horizontal Layout + - + Footnotes Fodnoter - + Superscript Hævet skrift - - Word Wrap - Tekstombrydning + + &Word Wrap + - - :/markdown-snippets.json - path to built-in snippets resource. - :/markdown-snippets.json + + Ignore Y&AML Header + - + + &Diagram Support + + + + Open File... Åbn Fil... - - - Markdown Files (*.markdown *.md);;All Files (*) - Markdown Filer (*.markdown *.md);;Alle Filer (*) + + + Markdown Files (*.markdown *.md *.mdown);;All Files (*) + - + Save as... Gem som... - + Print Document Udskriv dokument - + Go to... Gå til... - + Line: Line number in the Markdown editor Linje: - - + + + + HTML preview + HTML forhåndsvisning + + + + HTML source HTML kildekode - + %1 words %1 ord - + Lines: %1 Words: %2 Characters: %3 Linjer: %1 Ord: %2 Tegn: %3 - + Change Preview Style Skift forhåndsvisningstypografi - + Save Changes Gem ændringer - + The document has been modified.<br>Do you want to save your changes? Dokumentet er blevet ændret.<br>Vil du gemme dine ændringer? - + untitled.md default file name for new markdown documents unavngivet.md @@ -790,18 +866,17 @@ MarkdownEditor - - Ctrl+Space - Complete - Ctrl+Mellemrum + + Snippet Complete + - + Suggestions Forslag - + Add to User Dictionary Tilføj til brugerordbog @@ -815,8 +890,8 @@ - General - Generelt + &General + @@ -825,127 +900,193 @@ - Converter Library: - Converterbibliotek: + Converter &Library: + - + Discount (Default) Name of a Markdown to HTML converter library Discount (Standard) - + Hoedown Name of a Markdown to HTML converter library Hoedown - + Reveal.js (Presentation) Reveal.js (Præsentation) - - Editor - Editor + + &Editor + - + Font Skrifttype - - Family: - Familie: + + &Family: + - - Size: - Størrelse: + + Si&ze: + - + Tabs Tabs - - Tab width: - Tab bredde: + + &Tab width: + + + + + &HTML Preview + + + + + Fonts + + + + + S&tandard Font: + + + + + + Size: + Størrelse: + + + + Se&rif Font: + + + + + S&ans Serif Font: + + + + + &Fixed Font: + - - Internet - Internet + + &Internet + - + Configure Proxy to Access the Internet Konfigurér Proxy for Tilgang til Internettet - - No proxy - Ingen proxy + + No prox&y + + + + + &Use system proxy settings + + + + + &Manual proxy configuration: + + + + + H&ost: + - - Use system proxy settings - Brug systemindstillinger for proxy + + &Port: + - - Manual proxy configuration: - Manuel proxy konfiguration: + + User &Name: + - - Host: - Host: + + Pass&word: + - - Port: - Port: + + &Snippets + - - User Name: - Brugernavn: + + &Add + - - Password: - Password: + + &Remove + - - Snippets - Tilføjelser + + Short&cuts + - - Add - Tilføj + + Action + - - Remove - Fjern + + Shortcut + - + + Default + + + + Error Title of error message box Fejl - + No snippet selected. Ingen tilføjelse valgt. + + + Conflict + + + + + This shortcut is already used for "%1" + + RecentFilesMenu @@ -963,23 +1104,23 @@ SnippetsTableModel - + Error Title of error message box Fejl - + Not a valid trigger. Den valgte udløser er ikke gyldig - + Trigger Udløser - + Description Beskrivelse diff --git a/app/translations/cutemarked_pt_BR.ts b/app/translations/cutemarked_pt_BR.ts index d5b2bb2c..f5b3081b 100644 --- a/app/translations/cutemarked_pt_BR.ts +++ b/app/translations/cutemarked_pt_BR.ts @@ -1,4 +1,94 @@ + + AboutDialog + + + About CuteMarkEd + Sobre o CuteMarkEd + + + + &About + &Sobre + + + + A&uthors + A&utores + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Christian Loose (cloose)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and maintainer</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Jörg Preiß (Slesa)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Andreas Reischuck (arBmind)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Aetf (Aetf)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Pavel Fric (Fri)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Czech translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Hu Junqing (LearnShare)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Chinese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Γιάννης Ανθυμίδης (Evropi)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Greek translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Etienne Gauvin (Etn)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">French translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Rémi Verschelde (akien-mga)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">French translation and Mageia package</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Kota Ouchi (kOtaOuchi)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Norihide Sugohara (touyou)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Eai</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Javier (moguman)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Spanish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Cassio Cardoso (cassiocardoso)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Portuguese (Brazil) translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Victor Nogueira (felladrin)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Portuguese (Brazil) translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Maxim Efremov (maxbart)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Russian translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Bedouin</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Indonesian translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Mljjlm</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Danish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> + + + + + &Thanks To + &Agradecimentos + + + + Qt-based, free and open source markdown editor with live HTML preview + Editor de Markdown com pré-visualização em tempo-real, feito em Qt, gratuito e open source + + ExportHtmlDialog @@ -138,46 +228,50 @@ Procurar - + Find: Procurar: - - - ... - ... - - - + Replace with: Substituir por: - + Replace Substituir - + Replace All Substituir Todos - + + ... + ... + + + Case Sensitive Case Sensitive - + Whole Words Only Só Palavras Inteiras - + Use Regular Expressions Usar Expressões Regulares + + + Find Options + Encontrar Opções + ImageToolDialog @@ -234,7 +328,7 @@ MainWindow - + about:blank about:blank @@ -250,14 +344,14 @@ - Format - Formato + F&ormat + Verb "to format". sub menu title to choose a formatting like bold, italic. + - - Find/Replace - Procurar/Substituir + &Find/Replace + @@ -276,482 +370,494 @@ - Styles - Estilos + St&yles + - Markdown Extensions - Extensões Markdown + Markdown E&xtensions + - Languages - Linguagens + &Languages + - + Table of contents Tabela de conteúdo - - + Markdown Syntax Síntaxe Markdown - - + + qrc:/syntax.html qrc:/syntax_pt_BR.html - + + File Explorer + Gerenciador de Arquivos + + + E&xit S&air - + &New &Novo - + &Open... &Abrir... - + &Save &Salvar - + Save &As... Salvar &Como... - + &Undo &Desfazer - + &Redo &Refazer - + Default Padrão - + Ctrl+1 Ctrl+1 - + Github Github - + Ctrl+2 Ctrl+2 - + Solarized Light Solarized Light - + Ctrl+3 Ctrl+3 - + Solarized Dark Solarized Dark - + Ctrl+4 Ctrl+4 - + &About CuteMarkEd... &Sobre CuteMarkEd... - - Export to HTML... - Exportar para HTML... + + Export to &HTML... + - - Export to PDF... - Exportar para PDF... + + &Export to PDF... + - + Split 1:1 Dividir 1:1 - + Split 2:1 Dividir 2:1 - + Split 1:2 Dividir 1:2 - + Split 3:1 Dividir 3:1 - + Split 1:3 Dividir 1:3 - - Copy HTML to Clipboard - Copiar HTML para Área de Transferência + + Copy &HTML to Clipboard + - + Cu&t Cor&tar - + &Copy &Copiar - + &Paste &Colar - + Strong Negrito - + Emphasize Enfatizar - + &Print... &Imprimir... - - + + Strikethrough Rasura - + Inline Code Código Inline - - Math Support - Suporte a Matemática + + &Math Support + - - Code Highlighting - Destaque de Código + + Code &Highlighting + - + Clearness Clearness - + Ctrl+5 Ctrl+5 - + Clearness Dark Clearness Dark - + Ctrl+6 Ctrl+6 - - Go to Line - Ir para a Linha + + Find/Replace + Procurar/Substituir - + + Go to &Line + + + + Ctrl+L Ctrl+L - + Center Paragraph Centralizar Parágrafo - + Hard Linebreak Quebra de Linha - + Ctrl+Return Ctrl+Return - + Find Next Encontrar o Próximo - + Find Previous Encontrar o Anterior - - Full Screen Mode - Modo Tela Cheia + + &Full Screen Mode + - + Blockquote Citação - - Ctrl+Q - Ctrl+Q + + Ctrl+Shift+Q + Ctrl+Shift+Q - - - - - HTML preview - Prever HTML + + &Markdown Syntax + - + + HTML &Preview + + + + F5 F5 - - Show Special Characters + + &Show Special Characters Option to show characters like line feed or tabs - Mostrar Caracteres Especiais + - - Options... - Opções... + + &Options... + - + Autolink Autolink - + Alphabetic Lists Listas Alfabéticas - + Definition Lists Listas de Definição - + SmartyPants SmartyPants - + Language Linguagens - - Check Spelling - Checar a Ortografia + + &Check Spelling + - + Increase Header Level Aumentar Nível do Título - + Alt+Right Alt+Right - + Decrease Header Level Diminuir Nível do Título - + Alt+Left Alt+Left - + Insert Table... Inserir Tabela... - + Ctrl+T Ctrl+T - + Byword Dark Byword Dark - + Ctrl+7 Ctrl+7 - - Insert Image... - Inserir Imagem... + + Insert &Image... + - - Ctrl+G - Ctrl+G + + Ctrl+Shift+I + Ctrl+Shift+I - - Horizontal Layout - Layout Horizontal + + &Horizontal Layout + - + Footnotes Notas de Rodapé - + Superscript Superscript - - Word Wrap - Quebra de Linha + + &Word Wrap + + + + + Ignore Y&AML Header + - - :/markdown-snippets.json - path to built-in snippets resource. - :/markdown-snippets.json + + &Diagram Support + - + Open File... Abrir Arquivo... - - - Markdown Files (*.markdown *.md);;All Files (*) - Arquivos Markdown (*.markdown *.md);;Todos os Arquivos (*) + + + Markdown Files (*.markdown *.md *.mdown);;All Files (*) + - + Save as... Salvar como... - + Print Document Imprimir Documento - + Go to... Ir para... - + Line: Line number in the Markdown editor Linha: - - About CuteMarkEd - Sobre CuteMarkEd - - - - <p><b>CuteMarkEd %1</b><br>Qt-based, free and open source markdown editor with live HTML preview<br>Copyright 2013 Christian Loose</p><p><a href="http://cloose.github.io/CuteMarkEd">http://cloose.github.io/CuteMarkEd</a></p> - <p><b>CuteMarkEd %1</b><br>Editor de Markdown com pré-visualizador de HTML, baseado em Qt, grátis e de código aberto.<br>Copyright 2013 Christian Loose</p><p><a href="http://cloose.github.io/CuteMarkEd">http://cloose.github.io/CuteMarkEd</a></p> + + + + HTML preview + Prever HTML - - + + HTML source Código HTML - + %1 words %1 palavras - + Lines: %1 Words: %2 Characters: %3 Linhas: %1 Palavras: %2 Caracteres: %3 - + Change Preview Style Mudar Estilo do Pré-Visualizador - + Save Changes Salvar Alterações - + The document has been modified.<br>Do you want to save your changes? Este documento foi modificado.<br>Você gostaria de salvar suas modificações? - + untitled.md default file name for new markdown documents untitled.md @@ -760,18 +866,17 @@ MarkdownEditor - - Ctrl+Space - Complete - Ctrl+Espaço + + Snippet Complete + - + Suggestions Sugestões - + Add to User Dictionary Adicionar Usuário ao Dicinário @@ -785,8 +890,8 @@ - General - Geral + &General + @@ -795,122 +900,193 @@ - Converter Library: - Biblioteca de Conversores: + Converter &Library: + - + Discount (Default) Name of a Markdown to HTML converter library Desconto (Padrão) - + Hoedown Name of a Markdown to HTML converter library Hoedown - - Editor - Editor + + Reveal.js (Presentation) + Reveal.js (Apresentação) + + + + &Editor + - + Font Fonte - - Family: - Família: + + &Family: + - - Size: - Tamanho: + + Si&ze: + - + Tabs Abas - - Tab width: - Largura da aba: + + &Tab width: + + + + + &HTML Preview + + + + + Fonts + + + + + S&tandard Font: + + + + + + Size: + Tamanho: + + + + Se&rif Font: + + + + + S&ans Serif Font: + - - Internet - Internet + + &Fixed Font: + - + + &Internet + + + + Configure Proxy to Access the Internet Configurar Proxy para Acessar a Internet - - No proxy - Sem proxy + + No prox&y + - - Use system proxy settings - Usar configurações de proxy do sistema + + &Use system proxy settings + - - Manual proxy configuration: - Configuração de proxy manual: + + &Manual proxy configuration: + - - Host: - Servidor: + + H&ost: + - - Port: - Porta: + + &Port: + - - User Name: - Nome de Usuário: + + User &Name: + - - Password: - Senha: + + Pass&word: + - - Snippets - Snippets + + &Snippets + - - Add - Adicionar + + &Add + - - Remove - Remover + + &Remove + - + + Short&cuts + + + + + Action + + + + + Shortcut + + + + + Default + + + + Error Title of error message box Erro - + No snippet selected. Nenhum snippet selecionado. + + + Conflict + + + + + This shortcut is already used for "%1" + + RecentFilesMenu @@ -928,23 +1104,23 @@ SnippetsTableModel - + Error Title of error message box Erro - + Not a valid trigger. Não é um trigger válido. - + Trigger Trigger - + Description Descrição @@ -997,4 +1173,12 @@ Direita + + main + + + The file to open. + O arquivo para abrir. + + \ No newline at end of file From a4d9abcea0c35e6e3a9f70bc2e796de3a43d3c10 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Fri, 1 Jan 2016 17:48:35 +0100 Subject: [PATCH 34/74] Add translation credits and update copyright years --- app/aboutdialog.cpp | 2 +- app/aboutdialog.ui | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/aboutdialog.cpp b/app/aboutdialog.cpp index 961af75d..31c0a0b5 100644 --- a/app/aboutdialog.cpp +++ b/app/aboutdialog.cpp @@ -17,7 +17,7 @@ #include "aboutdialog.h" #include "ui_aboutdialog.h" -static const QString COPYRIGHT = QStringLiteral("Copyright 2013-2015 Christian Loose"); +static const QString COPYRIGHT = QStringLiteral("Copyright 2013-2016 Christian Loose"); static const QString HOMEPAGE = QStringLiteral("http://cloose.github.io/CuteMarkEd"); AboutDialog::AboutDialog(QWidget *parent) : diff --git a/app/aboutdialog.ui b/app/aboutdialog.ui index a54f5dfa..930fd8c8 100644 --- a/app/aboutdialog.ui +++ b/app/aboutdialog.ui @@ -109,7 +109,7 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Christian Loose (cloose)</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and maintainer</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> @@ -163,6 +163,12 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Mljjlm</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Danish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Napcok</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Polish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Neran93</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Hungarian translation</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html>
@@ -180,7 +186,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Qt</span><span style=" font-size:8pt;"> (LGPL v2.1)</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://qt-project.org/"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">http://qt.io/</span></a></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> From 5f7292e38a7152950c137c3ab2fa6f10e4e1886f Mon Sep 17 00:00:00 2001 From: "Walter.Liu" Date: Tue, 1 Dec 2015 23:02:52 +0800 Subject: [PATCH 35/74] [#257] Adopt "General/foo" instead of "general/foo". It may be the Qt5 bug that stores "general" section as "[%General]",not "[%general]" in NativeFormat on Linux. It will not bother windows user(s) anyhow, since the Windows registry use case-insensitive keys. This should fix #257 and #249. --- app/options.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/options.cpp b/app/options.cpp index b772be01..9f4ad6ca 100644 --- a/app/options.cpp +++ b/app/options.cpp @@ -20,8 +20,8 @@ #include -static const char* MARKDOWN_CONVERTER = "general/converter"; -static const char* LAST_USED_STYLE = "general/lastusedstyle"; +static const char* MARKDOWN_CONVERTER = "General/converter"; +static const char* LAST_USED_STYLE = "General/lastusedstyle"; static const char* STYLE_DEFAULT = "actionDefault"; static const char* FONT_FAMILY_DEFAULT = "Monospace"; static const char* FONT_FAMILY = "editor/font/family"; From 43146ac63c27e7c2282652bee7c7effd9a5c04db Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Fri, 1 Jan 2016 18:58:30 +0100 Subject: [PATCH 36/74] Update README for v0.11.2 --- README.md | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 75c3bfbf..6cd17385 100644 --- a/README.md +++ b/README.md @@ -8,15 +8,31 @@ A Qt-based, free and open source markdown editor with live HTML preview, math ex ### DOWNLOAD -[Sources](https://github.com/cloose/CuteMarkEd/archive/v0.11.1.tar.gz) -[MS Windows (Installer)](http://dl.bintray.com/cloose/CuteMarkEd/cutemarked-0.11.1.msi) -[MS Windows (ZIP file)](http://dl.bintray.com/cloose/CuteMarkEd/cutemarked-0.11.1.zip) -[OpenSUSE 13.1 (RPM)](https://build.opensuse.org/project/show?project=home%3Acloose1974) +[Sources](https://github.com/cloose/CuteMarkEd/archive/v0.11.2.tar.gz) +[MS Windows (Installer)](http://dl.bintray.com/cloose/CuteMarkEd/cutemarked-0.11.2.msi) +[MS Windows (ZIP file)](http://dl.bintray.com/cloose/CuteMarkEd/cutemarked-0.11.2.zip) +[OpenSUSE 13.2 (RPM)](https://build.opensuse.org/project/show?project=home%3Acloose1974) [Fedora 20 (RPM)](https://build.opensuse.org/project/show?project=home%3Acloose1974) [Fedora 21 (RPM)](https://build.opensuse.org/project/show?project=home%3Acloose1974) +[Fedora 22 (RPM)](https://build.opensuse.org/project/show?project=home%3Acloose1974) +[Fedora 23 (RPM)](https://build.opensuse.org/project/show?project=home%3Acloose1974) ### NEWS +#### Version 0.11.2 + +Improvements: + +* `IMPROVED` Added Hungarian translation + +Fixes: + +* `FIXED` Editor pane jumping up and down during editing (#232) +* `FIXED` Missing mermaid CSS for styling in preview (#241) +* `FIXED` Correct order of HTML Preview/Source menu item (#242) +* `FIXED` Retrieval of last used style on application start on Linux (#257) +* `FIXED` Crash when switching between markdown converters (#260) + #### Version 0.11.1 Improvements: From 918bb4819833cd3d4af15a522fbe97135c1b4ee6 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Mon, 4 Jan 2016 09:16:51 +0100 Subject: [PATCH 37/74] Fix build error after merge of hotfix/v0.11.2 --- app/options.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/options.cpp b/app/options.cpp index ca6d44ae..2237ed1d 100644 --- a/app/options.cpp +++ b/app/options.cpp @@ -20,7 +20,7 @@ static const char* MARKDOWN_CONVERTER = "General/converter"; -static const char* LAST_USED_STYLE = "General/lastusedstyle"; +static const char* LAST_USED_THEME = "General/lastusedstyle"; static const char* THEME_DEFAULT = "Default"; static const char* FONT_FAMILY_DEFAULT = "Monospace"; static const char* FONT_FAMILY = "editor/font/family"; From 4b4202779107a8cb79e8a009b0bd9600b84c04c6 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Sun, 10 Jan 2016 13:04:37 +0100 Subject: [PATCH 38/74] New option is called lastusedtheme not lastusedstyle --- app/options.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/options.cpp b/app/options.cpp index 2237ed1d..a9e9f5a3 100644 --- a/app/options.cpp +++ b/app/options.cpp @@ -20,7 +20,7 @@ static const char* MARKDOWN_CONVERTER = "General/converter"; -static const char* LAST_USED_THEME = "General/lastusedstyle"; +static const char* LAST_USED_THEME = "General/lastusedtheme"; static const char* THEME_DEFAULT = "Default"; static const char* FONT_FAMILY_DEFAULT = "Monospace"; static const char* FONT_FAMILY = "editor/font/family"; From c2d9c8df87ed5417ffee839c1488bc65a443dc39 Mon Sep 17 00:00:00 2001 From: Kolcha Date: Fri, 29 Jan 2016 12:43:10 +0300 Subject: [PATCH 39/74] added OS X specific resources --- app/Info.plist | 26 ++++++++++++++++++++++++++ app/app-icon.icns | Bin 0 -> 499032 bytes app/app.pro | 6 +++++- app/hunspell/spellchecker_unix.cpp | 7 +++++-- 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 app/Info.plist create mode 100644 app/app-icon.icns diff --git a/app/Info.plist b/app/Info.plist new file mode 100644 index 00000000..b5e472f2 --- /dev/null +++ b/app/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleName + CuteMarkEd + CFBundleIconFile + app-icon.icns + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.11.2 + CFBundleSignature + CMDE + CFBundleExecutable + cutemarked + CFBundleIdentifier + io.github.cloose.CuteMarkEd + NSPrincipalClass + NSApplication + NSHighResolutionCapable + True + NSHumanReadableCopyright + © 2013-2016 Christian Loose + + diff --git a/app/app-icon.icns b/app/app-icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..58cabb79138f442224c01e0c096c30e1708799ce GIT binary patch literal 499032 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

Sa#H@ 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

70`hX4%Jyf}1)IkHq2d+%<`1av;(9VBdOoV= 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

j)wX$Fj10GHAjln%OH=Jn0MK3Zzz)`G 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

~ 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 literal 0 HcmV?d00001 diff --git a/app/app.pro b/app/app.pro index b7ff531f..0a0c9d16 100644 --- a/app/app.pro +++ b/app/app.pro @@ -33,7 +33,11 @@ TRANSLATIONS += \ translations/cutemarked_ru.ts \ translations/cutemarked_zh_CN.ts -RC_FILE = cutemarked.rc +win32:RC_FILE = cutemarked.rc +macx { + ICON = app-icon.icns + QMAKE_INFO_PLIST = Info.plist +} INCLUDEPATH += $$PWD diff --git a/app/hunspell/spellchecker_unix.cpp b/app/hunspell/spellchecker_unix.cpp index 59806c58..189e029f 100644 --- a/app/hunspell/spellchecker_unix.cpp +++ b/app/hunspell/spellchecker_unix.cpp @@ -29,7 +29,7 @@ QMap SpellChecker::availableDictionaries() QMap dictionaries; QStringList paths; - +#ifdef Q_OS_LINUX // Debian paths << QStringLiteral("/usr/local/share/myspell/dicts") << QStringLiteral("/usr/share/myspell/dicts"); @@ -40,7 +40,10 @@ QMap SpellChecker::availableDictionaries() // Fedora paths << QStringLiteral("/usr/local/share/myspell") << QStringLiteral("/usr/share/myspell"); - +#endif +#ifdef Q_OS_OSX + paths << (qApp->applicationDirPath() + "/../Resources/dictionaries"); +#endif foreach (const QString &path, paths) { QDir dictPath(path); dictPath.setFilter(QDir::Files); From aed9861f150899af1908705636b9413d4854b724 Mon Sep 17 00:00:00 2001 From: Kolcha Date: Sat, 30 Jan 2016 00:56:20 +0300 Subject: [PATCH 40/74] disabled menu icons on OS X --- app/mainwindow.cpp | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 2f44b1e2..aab1c804 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -21,7 +21,9 @@ #include #include #include +#ifndef Q_OS_OSX #include +#endif #include #include #include @@ -599,8 +601,8 @@ void MainWindow::extrasOptions() { QList actions; // file menu - actions << ui->actionNew - << ui->actionOpen + actions << ui->actionNew + << ui->actionOpen << ui->actionSave << ui->actionSaveAs << ui->actionExportToHTML @@ -923,12 +925,14 @@ void MainWindow::setupActions() SetActionShortcut(ui->actionNew, QKeySequence::New); SetActionShortcut(ui->actionOpen, QKeySequence::Open); SetActionShortcut(ui->actionSave, QKeySequence::Save); - ui->actionSave->setIcon(QIcon("fa-floppy-o.fontawesome")); SetActionShortcut(ui->actionSaveAs, QKeySequence::SaveAs); - ui->actionExportToPDF->setIcon(QIcon("fa-file-pdf-o.fontawesome")); SetActionShortcut(ui->action_Print, QKeySequence::Print); - ui->action_Print->setIcon(QIcon("fa-print.fontawesome")); SetActionShortcut(ui->actionExit, QKeySequence::Quit); +#ifndef Q_OS_OSX + ui->actionSave->setIcon(QIcon("fa-floppy-o.fontawesome")); + ui->actionExportToPDF->setIcon(QIcon("fa-file-pdf-o.fontawesome")); + ui->action_Print->setIcon(QIcon("fa-print.fontawesome")); +#endif recentFilesMenu = new RecentFilesMenu(ui->menuFile); ui->menuFile->insertMenu(ui->actionSave, recentFilesMenu); @@ -938,19 +942,23 @@ void MainWindow::setupActions() // edit menu SetActionShortcut(ui->actionUndo, QKeySequence::Undo); - ui->actionUndo->setIcon(QIcon("fa-undo.fontawesome")); SetActionShortcut(ui->actionRedo, QKeySequence::Redo); - ui->actionRedo->setIcon(QIcon("fa-repeat.fontawesome")); SetActionShortcut(ui->actionCut, QKeySequence::Cut); - ui->actionCut->setIcon(QIcon("fa-scissors.fontawesome")); SetActionShortcut(ui->actionCopy, QKeySequence::Copy); - ui->actionCopy->setIcon(QIcon("fa-files-o.fontawesome")); SetActionShortcut(ui->actionPaste, QKeySequence::Paste); - ui->actionPaste->setIcon(QIcon("fa-clipboard.fontawesome")); + SetActionShortcut(ui->actionStrong, QKeySequence::Bold); - ui->actionStrong->setIcon(QIcon("fa-bold.fontawesome")); SetActionShortcut(ui->actionEmphasize, QKeySequence::Italic); +#ifndef Q_OS_OSX + ui->actionUndo->setIcon(QIcon("fa-undo.fontawesome")); + ui->actionRedo->setIcon(QIcon("fa-repeat.fontawesome")); + + ui->actionCut->setIcon(QIcon("fa-scissors.fontawesome")); + ui->actionCopy->setIcon(QIcon("fa-files-o.fontawesome")); + ui->actionPaste->setIcon(QIcon("fa-clipboard.fontawesome")); + + ui->actionStrong->setIcon(QIcon("fa-bold.fontawesome")); ui->actionEmphasize->setIcon(QIcon("fa-italic.fontawesome")); ui->actionStrikethrough->setIcon(QIcon("fa-strikethrough.fontawesome")); ui->actionCenterParagraph->setIcon(QIcon("fa-align-center.fontawesome")); @@ -961,8 +969,10 @@ void MainWindow::setupActions() ui->actionInsertTable->setIcon(QIcon("fa-table.fontawesome")); ui->actionInsertImage->setIcon(QIcon("fa-picture-o.fontawesome")); - SetActionShortcut(ui->actionFindReplace, QKeySequence::Find); ui->actionFindReplace->setIcon(QIcon("fa-search.fontawesome")); +#endif + + SetActionShortcut(ui->actionFindReplace, QKeySequence::Find); SetActionShortcut(ui->actionFindNext, QKeySequence::FindNext); SetActionShortcut(ui->actionFindPrevious, QKeySequence::FindPrevious); @@ -977,7 +987,9 @@ void MainWindow::setupActions() ui->menuView->insertAction(ui->menuView->actions()[1], ui->fileExplorerDockWidget->toggleViewAction()); SetActionShortcut(ui->fileExplorerDockWidget->toggleViewAction(), QKeySequence(Qt::ALT + Qt::Key_E)); SetActionShortcut(ui->actionFullScreenMode, QKeySequence::FullScreen); +#ifndef Q_OS_OSX ui->actionFullScreenMode->setIcon(QIcon("fa-arrows-alt.fontawesome")); +#endif // extras menu connect(ui->actionMathSupport, SIGNAL(triggered(bool)), @@ -991,9 +1003,9 @@ void MainWindow::setupActions() // help menu ui->actionMarkdownSyntax->setShortcut(QKeySequence::HelpContents); - +#ifndef Q_OS_OSX ui->webView->pageAction(QWebPage::Copy)->setIcon(QIcon("fa-copy.fontawesome")); - +#endif // set names for dock widget actions ui->dockWidget->toggleViewAction()->setObjectName("actionTableOfContents"); ui->fileExplorerDockWidget->toggleViewAction()->setObjectName("actionFileExplorer"); From 9f1c47d21e2b17ec00f65f7d4e9c2b5760b3fce7 Mon Sep 17 00:00:00 2001 From: Kolcha Date: Sat, 30 Jan 2016 10:03:46 +0300 Subject: [PATCH 41/74] fixed build on OS X --- test/integration/integration.pro | 1 + test/unit/unit.pro | 1 + 2 files changed, 2 insertions(+) diff --git a/test/integration/integration.pro b/test/integration/integration.pro index 9618d74e..f4bf57d7 100644 --- a/test/integration/integration.pro +++ b/test/integration/integration.pro @@ -9,6 +9,7 @@ QT += gui webkitwidgets TARGET = integrationtest CONFIG += console testcase +CONFIG += c++11 SOURCES += \ discountmarkdownconvertertest.cpp \ diff --git a/test/unit/unit.pro b/test/unit/unit.pro index fe6d6d20..801dba6a 100644 --- a/test/unit/unit.pro +++ b/test/unit/unit.pro @@ -8,6 +8,7 @@ QT += testlib TARGET = unittest CONFIG += console testcase +CONFIG += c++11 SOURCES += \ main.cpp \ From 1f44b6a47e5b33bf11f5215223becfdef8cc27ff Mon Sep 17 00:00:00 2001 From: Kolcha Date: Sat, 30 Jan 2016 11:49:55 +0300 Subject: [PATCH 42/74] cleanup project files --- .../peg-markdown-highlight.pro | 2 +- app-static/app-static.pro | 23 +++---------------- app/app.pro | 4 ++-- .../peg-markdown-highlight.pro | 17 +++----------- 4 files changed, 9 insertions(+), 37 deletions(-) diff --git a/3rdparty/peg-markdown-highlight/peg-markdown-highlight.pro b/3rdparty/peg-markdown-highlight/peg-markdown-highlight.pro index f3968bfc..88e78156 100644 --- a/3rdparty/peg-markdown-highlight/peg-markdown-highlight.pro +++ b/3rdparty/peg-markdown-highlight/peg-markdown-highlight.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -QT -= core gui +CONFIG -= qt TARGET = pmh TEMPLATE = lib diff --git a/app-static/app-static.pro b/app-static/app-static.pro index d697818d..98b75277 100644 --- a/app-static/app-static.pro +++ b/app-static/app-static.pro @@ -8,7 +8,7 @@ QT += gui webkitwidgets TARGET = app-static TEMPLATE = lib -CONFIG += staticlib +CONFIG += staticlib CONFIG += c++11 INCLUDEPATH += $$PWD @@ -77,10 +77,7 @@ HEADERS += \ # # Add search paths below /usr/local for Mac OSX # -macx { - LIBS += -L/usr/local/lib - INCLUDEPATH += /usr/local/include -} +macx:INCLUDEPATH += /usr/local/include # # JSON configuration library @@ -90,14 +87,7 @@ INCLUDEPATH += $$PWD/../libs/jsonconfig # # Discount library # -win32-g++:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../3rdparty/discount/release/ -ldiscount -else:win32-g++:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../3rdparty/discount/debug/ -ldiscount -else:win32-msvc*:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../3rdparty/discount/release/ -llibdiscount -else:win32-msvc*:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../3rdparty/discount/debug/ -llibdiscount -else:unix: LIBS += -L/usr/lib -lmarkdown - win32:INCLUDEPATH += $$PWD/../3rdparty/discount -win32:DEPENDPATH += $$PWD/../3rdparty/discount # # Hoedown library @@ -109,12 +99,5 @@ with_hoedown { SOURCES += converter/hoedownmarkdownconverter.cpp HEADERS += converter/hoedownmarkdownconverter.h - win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../3rdparty/hoedown/release/ -lhoedown - else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../3rdparty/hoedown/debug/ -lhoedown - else:unix: LIBS += -L/usr/lib -lhoedown - - win32 { - INCLUDEPATH += $$PWD/../3rdparty/hoedown - DEPENDPATH += $$PWD/../3rdparty/hoedown - } + win32:INCLUDEPATH += $$PWD/../3rdparty/hoedown } diff --git a/app/app.pro b/app/app.pro index b7ff531f..436e97e9 100644 --- a/app/app.pro +++ b/app/app.pro @@ -14,7 +14,7 @@ TARGET = cutemarked TEMPLATE = app CONFIG += c++11 -unix { +unix:!macx { CONFIG += link_pkgconfig } @@ -248,7 +248,7 @@ message("Using LIBS=$$LIBS") ## INSTALLATION -unix { +unix:!macx { isEmpty(PREFIX): PREFIX = /usr DATADIR = $${PREFIX}/share diff --git a/libs/peg-markdown-highlight/peg-markdown-highlight.pro b/libs/peg-markdown-highlight/peg-markdown-highlight.pro index 4a9814d0..32988e03 100644 --- a/libs/peg-markdown-highlight/peg-markdown-highlight.pro +++ b/libs/peg-markdown-highlight/peg-markdown-highlight.pro @@ -8,17 +8,17 @@ QT += core gui widgets TARGET = pmh-adapter TEMPLATE = lib -CONFIG += staticlib +CONFIG += staticlib CONFIG += c++11 SOURCES += \ pmhmarkdownparser.cpp \ - styleparser.cpp + styleparser.cpp HEADERS += \ pmhmarkdownparser.h \ styleparser.h \ - definitions.h + definitions.h ################################################################################################### ## DEPENDENCIES @@ -27,16 +27,5 @@ HEADERS += \ # # peg-markdown-highlight # -win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../../3rdparty/peg-markdown-highlight/release/ -lpmh -else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../../3rdparty/peg-markdown-highlight/debug/ -lpmh -else:unix: LIBS += -L$$OUT_PWD/../../3rdparty/peg-markdown-highlight/ -lpmh INCLUDEPATH += $$PWD/../../3rdparty/peg-markdown-highlight -DEPENDPATH += $$PWD/../../3rdparty/peg-markdown-highlight - -win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../../3rdparty/peg-markdown-highlight/release/libpmh.a -else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../../3rdparty/peg-markdown-highlight/debug/libpmh.a -else:win32-msvc*:CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../../3rdparty/peg-markdown-highlight/release/pmh.lib -else:win32-msvc*:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../../3rdparty/peg-markdown-highlight/debug/pmh.lib -else:unix: PRE_TARGETDEPS += $$OUT_PWD/../../3rdparty/peg-markdown-highlight/libpmh.a - From 3a705910e4d0bba5aaac01d1cf8379170dd5e3a9 Mon Sep 17 00:00:00 2001 From: Kolcha Date: Sat, 30 Jan 2016 11:51:57 +0300 Subject: [PATCH 43/74] mark last used theme in menu --- app/mainwindow.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 2f44b1e2..f38f5543 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -478,6 +478,12 @@ void MainWindow::lastUsedTheme() currentTheme = themeCollection->theme(themeName); applyCurrentTheme(); + auto actionIter = std::find_if( + stylesGroup->actions().begin(), stylesGroup->actions().end(), + [&] (const QAction* action) -> bool { return action->text() == themeName; }); + Q_ASSERT(actionIter != stylesGroup->actions().end()); + (*actionIter)->setChecked(true); + styleLabel->setText(themeName); } From f6ac7206cb7402d7236b4f7ac5195014bc5eb836 Mon Sep 17 00:00:00 2001 From: Kolcha Date: Sun, 31 Jan 2016 19:43:08 +0300 Subject: [PATCH 44/74] moved all setIcon into private method --- app/mainwindow.cpp | 72 +++++++++++++++++++++++++--------------------- app/mainwindow.h | 1 + 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index aab1c804..d03c1472 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -928,11 +928,6 @@ void MainWindow::setupActions() SetActionShortcut(ui->actionSaveAs, QKeySequence::SaveAs); SetActionShortcut(ui->action_Print, QKeySequence::Print); SetActionShortcut(ui->actionExit, QKeySequence::Quit); -#ifndef Q_OS_OSX - ui->actionSave->setIcon(QIcon("fa-floppy-o.fontawesome")); - ui->actionExportToPDF->setIcon(QIcon("fa-file-pdf-o.fontawesome")); - ui->action_Print->setIcon(QIcon("fa-print.fontawesome")); -#endif recentFilesMenu = new RecentFilesMenu(ui->menuFile); ui->menuFile->insertMenu(ui->actionSave, recentFilesMenu); @@ -950,27 +945,6 @@ void MainWindow::setupActions() SetActionShortcut(ui->actionStrong, QKeySequence::Bold); SetActionShortcut(ui->actionEmphasize, QKeySequence::Italic); -#ifndef Q_OS_OSX - ui->actionUndo->setIcon(QIcon("fa-undo.fontawesome")); - ui->actionRedo->setIcon(QIcon("fa-repeat.fontawesome")); - - ui->actionCut->setIcon(QIcon("fa-scissors.fontawesome")); - ui->actionCopy->setIcon(QIcon("fa-files-o.fontawesome")); - ui->actionPaste->setIcon(QIcon("fa-clipboard.fontawesome")); - - ui->actionStrong->setIcon(QIcon("fa-bold.fontawesome")); - ui->actionEmphasize->setIcon(QIcon("fa-italic.fontawesome")); - ui->actionStrikethrough->setIcon(QIcon("fa-strikethrough.fontawesome")); - ui->actionCenterParagraph->setIcon(QIcon("fa-align-center.fontawesome")); - ui->actionIncreaseHeaderLevel->setIcon(QIcon("fa-level-up.fontawesome")); - ui->actionBlockquote->setIcon(QIcon("fa-quote-left.fontawesome")); - ui->actionDecreaseHeaderLevel->setIcon(QIcon("fa-level-down.fontawesome")); - - ui->actionInsertTable->setIcon(QIcon("fa-table.fontawesome")); - ui->actionInsertImage->setIcon(QIcon("fa-picture-o.fontawesome")); - - ui->actionFindReplace->setIcon(QIcon("fa-search.fontawesome")); -#endif SetActionShortcut(ui->actionFindReplace, QKeySequence::Find); SetActionShortcut(ui->actionFindNext, QKeySequence::FindNext); @@ -987,9 +961,6 @@ void MainWindow::setupActions() ui->menuView->insertAction(ui->menuView->actions()[1], ui->fileExplorerDockWidget->toggleViewAction()); SetActionShortcut(ui->fileExplorerDockWidget->toggleViewAction(), QKeySequence(Qt::ALT + Qt::Key_E)); SetActionShortcut(ui->actionFullScreenMode, QKeySequence::FullScreen); -#ifndef Q_OS_OSX - ui->actionFullScreenMode->setIcon(QIcon("fa-arrows-alt.fontawesome")); -#endif // extras menu connect(ui->actionMathSupport, SIGNAL(triggered(bool)), @@ -1003,9 +974,10 @@ void MainWindow::setupActions() // help menu ui->actionMarkdownSyntax->setShortcut(QKeySequence::HelpContents); -#ifndef Q_OS_OSX - ui->webView->pageAction(QWebPage::Copy)->setIcon(QIcon("fa-copy.fontawesome")); -#endif + + // set actions icons + setActionsIcons(); + // set names for dock widget actions ui->dockWidget->toggleViewAction()->setObjectName("actionTableOfContents"); ui->fileExplorerDockWidget->toggleViewAction()->setObjectName("actionFileExplorer"); @@ -1022,6 +994,42 @@ void MainWindow::setupActions() ui->actionHtmlPreview->setProperty("defaultshortcut", ui->actionHtmlPreview->shortcut()); } +void MainWindow::setActionsIcons() +{ +#ifndef Q_OS_OSX + // file menu + ui->actionSave->setIcon(QIcon("fa-floppy-o.fontawesome")); + ui->actionExportToPDF->setIcon(QIcon("fa-file-pdf-o.fontawesome")); + ui->action_Print->setIcon(QIcon("fa-print.fontawesome")); + + // edit menu + ui->actionUndo->setIcon(QIcon("fa-undo.fontawesome")); + ui->actionRedo->setIcon(QIcon("fa-repeat.fontawesome")); + + ui->actionCut->setIcon(QIcon("fa-scissors.fontawesome")); + ui->actionCopy->setIcon(QIcon("fa-files-o.fontawesome")); + ui->actionPaste->setIcon(QIcon("fa-clipboard.fontawesome")); + + ui->actionStrong->setIcon(QIcon("fa-bold.fontawesome")); + ui->actionEmphasize->setIcon(QIcon("fa-italic.fontawesome")); + ui->actionStrikethrough->setIcon(QIcon("fa-strikethrough.fontawesome")); + ui->actionCenterParagraph->setIcon(QIcon("fa-align-center.fontawesome")); + ui->actionIncreaseHeaderLevel->setIcon(QIcon("fa-level-up.fontawesome")); + ui->actionBlockquote->setIcon(QIcon("fa-quote-left.fontawesome")); + ui->actionDecreaseHeaderLevel->setIcon(QIcon("fa-level-down.fontawesome")); + + ui->actionInsertTable->setIcon(QIcon("fa-table.fontawesome")); + ui->actionInsertImage->setIcon(QIcon("fa-picture-o.fontawesome")); + + ui->actionFindReplace->setIcon(QIcon("fa-search.fontawesome")); + + // view menu + ui->actionFullScreenMode->setIcon(QIcon("fa-arrows-alt.fontawesome")); + + ui->webView->pageAction(QWebPage::Copy)->setIcon(QIcon("fa-copy.fontawesome")); +#endif +} + void MainWindow::setupStatusBar() { // remove border around statusbar widgets diff --git a/app/mainwindow.h b/app/mainwindow.h index dc3b2aba..2c91aee9 100644 --- a/app/mainwindow.h +++ b/app/mainwindow.h @@ -127,6 +127,7 @@ private slots: private: void setupUi(); void setupActions(); + void setActionsIcons(); void setupStatusBar(); void setupMarkdownEditor(); void setupHtmlPreview(); From 6583eaa13fb968e200a6400c5d1398de0f5e8c25 Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Sun, 21 Feb 2016 10:35:02 +0100 Subject: [PATCH 45/74] fixed app info string in about dialog to be fully translatable --- app/aboutdialog.cpp | 5 ++++- app/aboutdialog.ui | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/aboutdialog.cpp b/app/aboutdialog.cpp index 31c0a0b5..1a3aff92 100644 --- a/app/aboutdialog.cpp +++ b/app/aboutdialog.cpp @@ -26,7 +26,10 @@ AboutDialog::AboutDialog(QWidget *parent) : { ui->setupUi(this); - ui->messageLabel->setText(QString("

CuteMarkEd
Version %1

").arg(qApp->applicationVersion())); + const QString appInfo = QString(ui->messageLabel->text()) + .arg(qApp->applicationDisplayName()) + .arg(qApp->applicationVersion()); + ui->messageLabel->setText(appInfo); const QString description = QString("

%1
%2

%3

") .arg(tr("Qt-based, free and open source markdown editor with live HTML preview")) diff --git a/app/aboutdialog.ui b/app/aboutdialog.ui index 5f2166bd..fb7e52a9 100644 --- a/app/aboutdialog.ui +++ b/app/aboutdialog.ui @@ -32,7 +32,7 @@ - <p><b><font size="5">Program Name</font></b><br>Version 0.1</p> + <p><b><font size="5">%1</font></b><br>Version %2</p> false From 517167abf9c6a3c9e3bba5806b224331f062d560 Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Mon, 22 Feb 2016 09:07:47 +0100 Subject: [PATCH 46/74] fixed disappearing links when exporting to PDF format --- app/mainwindow.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 78d83c5e..eea38b7a 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -313,10 +313,12 @@ void MainWindow::fileExportToHtml() void MainWindow::fileExportToPdf() { - ExportPdfDialog dialog(fileName); - if (dialog.exec() == QDialog::Accepted) { - ui->webView->print(dialog.printer()); - } + ExportPdfDialog dialog(fileName); + if (dialog.exec() == QDialog::Accepted) { + QTextDocument doc; + doc.setHtml(ui->webView->page()->currentFrame()->toHtml()); + doc.print(dialog.printer()); + } } void MainWindow::filePrint() From 9225e51ae24984f1ad0d17356f57582bac88785f Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Mon, 22 Feb 2016 17:11:12 +0100 Subject: [PATCH 47/74] added comment explaining workaround with QTextDocument --- app/mainwindow.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index eea38b7a..2422235c 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -313,6 +313,11 @@ void MainWindow::fileExportToHtml() void MainWindow::fileExportToPdf() { + // using temporary QTextDocument instance to get links exported\printed correctly, + // as links will dissappear when printing directly from QWebView in current Qt implementation + // of QWebView::print() method (possible bug in Qt?) + // more info here: http://stackoverflow.com/questions/11629093/add-working-url-into-pdf-using-qt-qprinter + ExportPdfDialog dialog(fileName); if (dialog.exec() == QDialog::Accepted) { QTextDocument doc; From 2d1601b4dea6ac1a37630da30d98b8ce777057da Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Wed, 24 Feb 2016 21:47:12 +0100 Subject: [PATCH 48/74] replace std:find_if by for-loop The std::find_if crashes or triggers the assert on Windows 10 with Qt 5.2 mingw for unkown reasons. So we replace it with a handwritten for loop. --- app/mainwindow.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 78d83c5e..1bbf57c2 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -480,11 +480,12 @@ void MainWindow::lastUsedTheme() currentTheme = themeCollection->theme(themeName); applyCurrentTheme(); - auto actionIter = std::find_if( - stylesGroup->actions().begin(), stylesGroup->actions().end(), - [&] (const QAction* action) -> bool { return action->text() == themeName; }); - Q_ASSERT(actionIter != stylesGroup->actions().end()); - (*actionIter)->setChecked(true); + for (auto action : stylesGroup->actions()) { + if (action->text() == themeName) { + action->setChecked(true); + break; + } + } styleLabel->setText(themeName); } From 37ecdbf8fb5dfab09cf525626c83305aefbf7f97 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Wed, 24 Feb 2016 21:47:33 +0100 Subject: [PATCH 49/74] Add separator before first custom theme --- app/mainwindow.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 1bbf57c2..adc912b0 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -1211,17 +1211,17 @@ void MainWindow::setupHtmlPreviewThemes() int key = 1; bool separatorAdded = false; foreach(const QString &themeName, themeCollection->themeNames()) { + if (!separatorAdded && !themeCollection->theme(themeName).isBuiltIn()) { + addSeparatorAfterBuiltInThemes(); + separatorAdded = true; + } + QAction *action = ui->menuStyles->addAction(themeName); action->setShortcut(QKeySequence(tr("Ctrl+%1").arg(key++))); action->setCheckable(true); action->setActionGroup(stylesGroup); connect(action, &QAction::triggered, this, &MainWindow::themeChanged); - - if (!separatorAdded && !themeCollection->theme(themeName).isBuiltIn()) { - addSeparatorAfterBuiltInThemes(); - separatorAdded = true; - } } } From bb610e0ad895558440fd8a4d19df5af1f85c68e6 Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Tue, 8 Mar 2016 08:34:22 +0100 Subject: [PATCH 50/74] moved editor's status bar into separate widget and called it StatusBarWidget added ActionLabel class (inherits from ActiveLabel) that is using QAction (useful to sync menu action and widgets in status bar) added Editor options to show\hide column\rows in status bar (save\load for them too) added Editor options to show\hide column\rows in status bar (save\load for them too) better look for current style and current "html source" switches in status bar added drawing vertical ruler in editor widget options to enable\desible vertical ruler drawing in editor window at defined column posiiton (save\load for them too) fixed layout for font\size settins a littl in options dialog to get rid of not flexible gaps --- app/app.pro | 8 +- app/controls/actionlabel.cpp | 51 +++++++ app/controls/actionlabel.h | 24 ++++ app/mainwindow.cpp | 141 ++++++++----------- app/mainwindow.h | 8 +- app/mainwindow.ui | 20 ++- app/markdowneditor.cpp | 38 +++++ app/markdowneditor.h | 8 +- app/options.cpp | 50 ++++++- app/options.h | 16 +++ app/optionsdialog.cpp | 6 + app/optionsdialog.ui | 262 ++++++++++++++++++++++++++++------- app/statusbarwidget.cpp | 141 +++++++++++++++++++ app/statusbarwidget.h | 47 +++++++ 14 files changed, 667 insertions(+), 153 deletions(-) create mode 100644 app/controls/actionlabel.cpp create mode 100644 app/controls/actionlabel.h create mode 100644 app/statusbarwidget.cpp create mode 100644 app/statusbarwidget.h diff --git a/app/app.pro b/app/app.pro index a9629e56..4398bd92 100644 --- a/app/app.pro +++ b/app/app.pro @@ -50,6 +50,7 @@ SOURCES += \ controls/fileexplorerwidget.cpp \ controls/findreplacewidget.cpp \ controls/recentfilesmenu.cpp \ + controls/actionlabel.cpp \ htmlpreviewgenerator.cpp \ markdownhighlighter.cpp \ highlightworkerthread.cpp \ @@ -65,7 +66,8 @@ SOURCES += \ imagetooldialog.cpp \ snippetcompleter.cpp \ snippetstablemodel.cpp \ - aboutdialog.cpp + aboutdialog.cpp \ + statusbarwidget.cpp win32 { SOURCES += \ @@ -85,6 +87,7 @@ HEADERS += \ controls/fileexplorerwidget.h \ controls/findreplacewidget.h \ controls/recentfilesmenu.h \ + controls/actionlabel.h \ htmlpreviewgenerator.h \ markdownhighlighter.h \ highlightworkerthread.h \ @@ -100,7 +103,8 @@ HEADERS += \ imagetooldialog.h \ snippetcompleter.h \ snippetstablemodel.h \ - aboutdialog.h + aboutdialog.h \ + statusbarwidget.h FORMS += \ mainwindow.ui \ diff --git a/app/controls/actionlabel.cpp b/app/controls/actionlabel.cpp new file mode 100644 index 00000000..a2ebefcd --- /dev/null +++ b/app/controls/actionlabel.cpp @@ -0,0 +1,51 @@ +#include "actionlabel.h" + +#include + +ActionLabel::ActionLabel(QWidget *parent) : + ActiveLabel(parent), + m_action(0) +{ +} + +void ActionLabel::setAction(QAction *action) +{ + // if was previously defined, disconnect + if(m_action != NULL) { + disconnect(m_action, &QAction::changed, this, &ActionLabel::updateFromAction); + disconnect(this, &ActionLabel::doubleClicked, m_action, &QAction::trigger); + } + + // set new action + m_action = action; + + // update label using action's data + updateFromAction(); + + // action action and label to have them synced + // whenever one of them is triggered + connect(m_action, &QAction::changed, this, &ActionLabel::updateFromAction); + connect(this, &ActionLabel::doubleClicked, m_action, &QAction::trigger); +} + +void ActionLabel::updateFromAction() +{ + setStatusTip(m_action->statusTip()); + setToolTip(m_action->toolTip()); + setEnabled(m_action->isEnabled()); + + // update text based on QAction data + QString actionText = m_action->text(); + actionText.remove("&"); + + if(m_action->isCheckable()) { + if(m_action->isChecked()) + setText(QString("%1: %2").arg(actionText).arg(tr("on"))); + else + setText(QString("%1: %2").arg(actionText).arg(tr("off"))); + } else { + setText(actionText); + } +} + + diff --git a/app/controls/actionlabel.h b/app/controls/actionlabel.h new file mode 100644 index 00000000..34f4ab2c --- /dev/null +++ b/app/controls/actionlabel.h @@ -0,0 +1,24 @@ +#ifndef ACTIONLABEL_H +#define ACTIONLABEL_H + +#include "controls/activelabel.h" + +class QAction; + +class ActionLabel : public ActiveLabel +{ + Q_OBJECT + +public: + explicit ActionLabel(QWidget *parent=0); + + void setAction(QAction *action); + +public slots: + void updateFromAction(); + +private: + QAction *m_action; +}; + +#endif // ACTIONLABEL_H diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index adc912b0..f60b9865 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -70,15 +70,14 @@ #include "revealviewsynchronizer.h" #include "snippetcompleter.h" #include "tabletooldialog.h" +#include "statusbarwidget.h" MainWindow::MainWindow(const QString &fileName, QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), options(new Options(this)), stylesGroup(new QActionGroup(this)), - styleLabel(0), - wordCountLabel(0), - viewLabel(0), + statusBarWidget(0), generator(new HtmlPreviewGenerator(options, this)), snippetCollection(new SnippetCollection(this)), viewSynchronizer(0), @@ -138,6 +137,8 @@ void MainWindow::initializeApp() lastUsedTheme(); ui->plainTextEdit->tabWidthChanged(options->tabWidth()); + ui->plainTextEdit->rulerEnabledChanged(options->isRulerEnabled()); + ui->plainTextEdit->rulerPosChanged(options->rulerPos()); // init extension flags ui->actionAutolink->setChecked(options->isAutolinkEnabled()); @@ -207,8 +208,6 @@ void MainWindow::languageChanged(const Dictionary &dictionary) void MainWindow::fileNew() { if (maybeSave()) { - wordCountLabel->setText(""); - wordCountLabel->setToolTip(""); ui->plainTextEdit->clear(); ui->plainTextEdit->resetHighlighting(); ui->webView->setHtml(QString()); @@ -480,14 +479,12 @@ void MainWindow::lastUsedTheme() currentTheme = themeCollection->theme(themeName); applyCurrentTheme(); - for (auto action : stylesGroup->actions()) { - if (action->text() == themeName) { - action->setChecked(true); - break; - } - } - - styleLabel->setText(themeName); + foreach(QAction* a, stylesGroup->actions()) { + if(QString::compare(a->text(), themeName) == 0) { + a->setChecked(true); + stylesGroup->triggered(a); + } + } } void MainWindow::themeChanged() @@ -498,7 +495,6 @@ void MainWindow::themeChanged() currentTheme = themeCollection->theme(themeName); applyCurrentTheme(); - styleLabel->setText(themeName); options->setLastUsedTheme(themeName); } @@ -640,7 +636,7 @@ void MainWindow::extrasOptions() // view menu actions << ui->dockWidget->toggleViewAction() << ui->fileExplorerDockWidget->toggleViewAction() - << ui->actionHtmlPreview + << ui->actionHtmlSource << ui->actionSplit_1_1 << ui->actionSplit_2_1 << ui->actionSplit_1_2 @@ -676,54 +672,35 @@ void MainWindow::helpAbout() dialog.exec(); } -void MainWindow::styleContextMenu(const QPoint &pos) -{ - QMenu *menu = new QMenu(); - menu->addActions(stylesGroup->actions()); - - menu->exec(styleLabel->mapToGlobal(pos)); -} - -void MainWindow::toggleHtmlView() +void MainWindow::setHtmlSource(bool enabled) { - if (viewLabel->text() == tr("HTML preview")) { - ui->stackedWidget->setCurrentWidget(ui->htmlSourcePage); + if(enabled) { + ui->stackedWidget->setCurrentWidget(ui->htmlSourcePage); - ui->actionHtmlPreview->setText(tr("HTML preview")); - viewLabel->setText(tr("HTML source")); + // activate HTML highlighter + htmlHighlighter->setEnabled(true); + htmlHighlighter->rehighlight(); + } else { + ui->stackedWidget->setCurrentWidget(ui->webViewPage); - // activate HTML highlighter - htmlHighlighter->setEnabled(true); - htmlHighlighter->rehighlight(); - } else { - ui->stackedWidget->setCurrentWidget(ui->webViewPage); - - ui->actionHtmlPreview->setText(tr("HTML source")); - viewLabel->setText(tr("HTML preview")); + // deactivate HTML highlighter + htmlHighlighter->setEnabled(false); - // deactivate HTML highlighter - htmlHighlighter->setEnabled(false); + // update webView now since it was not updated while hidden + syncWebViewToHtmlSource(); + } - // update webView now since it was not updated while hidden - syncWebViewToHtmlSource(); - } + // sync view menu action + if(ui->actionHtmlSource->isChecked() != enabled) + ui->actionHtmlSource->setChecked(enabled); - updateSplitter(); + updateSplitter(); } void MainWindow::plainTextChanged() { QString code = ui->plainTextEdit->toPlainText(); - // update statistics - if (wordCountLabel) { - int words = ui->plainTextEdit->countWords(); - int lines = ui->plainTextEdit->document()->lineCount(); - int chars = ui->plainTextEdit->document()->characterCount(); - wordCountLabel->setText(tr("%1 words").arg(words)); - wordCountLabel->setToolTip(tr("Lines: %1 Words: %2 Characters: %3").arg(lines).arg(words).arg(chars)); - } - // generate HTML from markdown generator->markdownTextChanged(code); @@ -886,10 +863,10 @@ void MainWindow::setupUi() htmlPreviewController = new HtmlPreviewController(ui->webView, this); setupActions(); - setupStatusBar(); setupMarkdownEditor(); setupHtmlPreview(); setupHtmlSourceView(); + setupStatusBar(); // hide find/replace widget on startup ui->findReplaceWidget->hide(); @@ -902,10 +879,10 @@ void MainWindow::setupUi() // hide markdown syntax help dockwidget ui->dockWidget_2->hide(); ui->dockWidget_2->setFloating(true); - ui->dockWidget_2->resize(550, 400); + ui->dockWidget_2->resize(550, 400); // show HTML preview on right panel - toggleHtmlView(); + setHtmlSource(ui->actionHtmlSource->isChecked()); connect(options, SIGNAL(proxyConfigurationChanged()), this, SLOT(proxyConfigurationChanged())); @@ -998,7 +975,7 @@ void MainWindow::setupActions() ui->actionInsertImage->setProperty("defaultshortcut", ui->actionInsertImage->shortcut()); ui->dockWidget->toggleViewAction()->setProperty("defaultshortcut", ui->dockWidget->toggleViewAction()->shortcut()); ui->fileExplorerDockWidget->toggleViewAction()->setProperty("defaultshortcut", ui->fileExplorerDockWidget->toggleViewAction()->shortcut()); - ui->actionHtmlPreview->setProperty("defaultshortcut", ui->actionHtmlPreview->shortcut()); + ui->actionHtmlSource->setProperty("defaultshortcut", ui->actionHtmlSource->shortcut()); } void MainWindow::setActionsIcons() @@ -1039,30 +1016,17 @@ void MainWindow::setActionsIcons() void MainWindow::setupStatusBar() { - // remove border around statusbar widgets - statusBar()->setStyleSheet("QStatusBar::item { border: 0px solid black }; "); + statusBarWidget = new StatusBarWidget(ui->plainTextEdit); + statusBarWidget->setHtmlAction(ui->actionHtmlSource); - // add style label to statusbar - styleLabel = new QLabel("Default", this); - styleLabel->setToolTip(tr("Change Preview Style")); - statusBar()->addPermanentWidget(styleLabel, 1); + connect(options, &Options::lineColumnEnabledChanged, + statusBarWidget, &StatusBarWidget::showLineColumn); - styleLabel->setContextMenuPolicy(Qt::CustomContextMenu); - connect(styleLabel, SIGNAL(customContextMenuRequested(QPoint)), - this, SLOT(styleContextMenu(QPoint))); + statusBarWidget->update(); - // add word count label to statusbar - wordCountLabel = new QLabel(this); - wordCountLabel->setAlignment(Qt::AlignHCenter); - statusBar()->addPermanentWidget(wordCountLabel, 1); - - // add view label to statusbar - viewLabel = new ActiveLabel(this); - viewLabel->setAlignment(Qt::AlignRight); - statusBar()->addPermanentWidget(viewLabel, 1); - - connect(viewLabel, SIGNAL(doubleClicked()), - this, SLOT(toggleHtmlView())); + // remove border around statusbar widgets + statusBar()->setStyleSheet("QStatusBar::item { border: 0px solid black }; "); + statusBar()->addPermanentWidget(statusBarWidget, 1); } void MainWindow::setupMarkdownEditor() @@ -1073,10 +1037,14 @@ void MainWindow::setupMarkdownEditor() connect(ui->plainTextEdit, SIGNAL(loadDroppedFile(QString)), this, SLOT(load(QString))); - connect(options, SIGNAL(editorFontChanged(QFont)), - ui->plainTextEdit, SLOT(editorFontChanged(QFont))); - connect(options, SIGNAL(tabWidthChanged(int)), - ui->plainTextEdit, SLOT(tabWidthChanged(int))); + connect(options, &Options::editorFontChanged, + ui->plainTextEdit, &MarkdownEditor::editorFontChanged); + connect(options, &Options::tabWidthChanged, + ui->plainTextEdit, &MarkdownEditor::tabWidthChanged); + connect(options, &Options::rulerEnabledChanged, + ui->plainTextEdit, &MarkdownEditor::rulerEnabledChanged); + connect(options, &Options::rulerPosChanged, + ui->plainTextEdit, &MarkdownEditor::rulerPosChanged); } void MainWindow::setupHtmlPreview() @@ -1211,18 +1179,21 @@ void MainWindow::setupHtmlPreviewThemes() int key = 1; bool separatorAdded = false; foreach(const QString &themeName, themeCollection->themeNames()) { - if (!separatorAdded && !themeCollection->theme(themeName).isBuiltIn()) { - addSeparatorAfterBuiltInThemes(); - separatorAdded = true; - } - QAction *action = ui->menuStyles->addAction(themeName); action->setShortcut(QKeySequence(tr("Ctrl+%1").arg(key++))); action->setCheckable(true); action->setActionGroup(stylesGroup); connect(action, &QAction::triggered, this, &MainWindow::themeChanged); + + if (!separatorAdded && !themeCollection->theme(themeName).isBuiltIn()) { + addSeparatorAfterBuiltInThemes(); + separatorAdded = true; + } } + + if(statusBarWidget != NULL) + statusBarWidget->setStyleActions(stylesGroup); } void MainWindow::addSeparatorAfterBuiltInThemes() diff --git a/app/mainwindow.h b/app/mainwindow.h index 2c91aee9..f5bc11ae 100644 --- a/app/mainwindow.h +++ b/app/mainwindow.h @@ -40,6 +40,7 @@ class SlideLineMapping; class SnippetCollection; class ThemeCollection; class ViewSynchronizer; +class StatusBarWidget; class MainWindow : public QMainWindow @@ -107,8 +108,7 @@ private slots: void helpMarkdownSyntax(); void helpAbout(); - void styleContextMenu(const QPoint &pos); - void toggleHtmlView(); + void setHtmlSource(bool enabled); void plainTextChanged(); void htmlResultReady(const QString &html); @@ -153,9 +153,7 @@ private slots: RecentFilesMenu *recentFilesMenu; Options *options; QActionGroup *stylesGroup; - QLabel *styleLabel; - QLabel *wordCountLabel; - ActiveLabel *viewLabel; + StatusBarWidget* statusBarWidget; HtmlPreviewGenerator* generator; HtmlHighlighter *htmlHighlighter; SnippetCollection *snippetCollection; diff --git a/app/mainwindow.ui b/app/mainwindow.ui index 0456ea92..597807bf 100644 --- a/app/mainwindow.ui +++ b/app/mainwindow.ui @@ -167,7 +167,7 @@ 0 0 850 - 18 + 21 @@ -239,7 +239,7 @@ &View - + @@ -575,9 +575,15 @@ &Markdown Syntax - + + + true + - HTML &Preview + HTML &Source + + + Show HTML source code in HTML preivew window F5 @@ -1328,10 +1334,10 @@ - actionHtmlPreview - triggered() + actionHtmlSource + triggered(bool) MainWindow - toggleHtmlView() + setHtmlSource(bool) -1 diff --git a/app/markdowneditor.cpp b/app/markdowneditor.cpp index aaf9c088..e9b88c0a 100644 --- a/app/markdowneditor.cpp +++ b/app/markdowneditor.cpp @@ -170,6 +170,11 @@ void MarkdownEditor::paintEvent(QPaintEvent *e) if (showHardLinebreaks) { drawLineEndMarker(e); } + + // draw column ruler + if(rulerEnabled) { + drawRuler(e); + } } void MarkdownEditor::resizeEvent(QResizeEvent *event) @@ -252,6 +257,18 @@ void MarkdownEditor::tabWidthChanged(int tabWidth) setTabStopWidth(tabWidth*fm.width(' ')); } +void MarkdownEditor::rulerEnabledChanged(bool enabled) +{ + rulerEnabled = enabled; + viewport()->update(); +} + +void MarkdownEditor::rulerPosChanged(int pos) +{ + rulerPos = pos; + viewport()->update(); +} + void MarkdownEditor::showContextMenu(const QPoint &pos) { QMenu *contextMenu = createStandardContextMenu(); @@ -500,6 +517,27 @@ void MarkdownEditor::drawLineEndMarker(QPaintEvent *e) } } +void MarkdownEditor::drawRuler(QPaintEvent *e) +{ + const QRect rect = e->rect(); + const QFont font = currentCharFormat().font(); + + // calculate vertical offset corresponding given + // column margin in font metrics + int verticalOffset = round(QFontMetricsF(font).averageCharWidth() * rulerPos) + + contentOffset().x() + + document()->documentMargin(); + + // draw a ruler with color invert to background color (better readability) + // and with 20% opacity + QPainter p(viewport()); + p.setCompositionMode(QPainter::RasterOp_SourceXorDestination); + p.setPen(QColor(0xff, 0xff, 0xff)); + p.setOpacity(0.2); + + p.drawLine(verticalOffset, rect.top(), verticalOffset, rect.bottom()); +} + QString MarkdownEditor::textUnderCursor() const { QTextCursor cursor = this->textCursor(); diff --git a/app/markdowneditor.h b/app/markdowneditor.h index ce730dc7..88d5b513 100644 --- a/app/markdowneditor.h +++ b/app/markdowneditor.h @@ -63,11 +63,14 @@ class MarkdownEditor : public QPlainTextEdit public slots: void tabWidthChanged(int tabWidth); + void editorFontChanged(const QFont &font); + void rulerEnabledChanged(bool enabled); + void rulerPosChanged(int pos); private slots: void updateLineNumberAreaWidth(int newBlockCount); void updateLineNumberArea(const QRect &rect, int dy); - void editorFontChanged(const QFont &font); + void showContextMenu(const QPoint &pos); void replaceWithSuggestion(); void performCompletion(); @@ -77,6 +80,7 @@ private slots: private: bool isUrlToLocalFile(const QMimeData *source) const; void drawLineEndMarker(QPaintEvent *e); + void drawRuler(QPaintEvent *e); QString textUnderCursor() const; QStringList extractDistinctWordsFromDocument() const; QStringList retrieveAllWordsFromDocument() const; @@ -89,6 +93,8 @@ private slots: hunspell::SpellChecker *spellChecker; SnippetCompleter *completer; bool showHardLinebreaks; + bool rulerEnabled; + int rulerPos; }; #endif // MARKDOWNEDITOR_H diff --git a/app/options.cpp b/app/options.cpp index a9e9f5a3..95ae9d69 100644 --- a/app/options.cpp +++ b/app/options.cpp @@ -26,6 +26,9 @@ static const char* FONT_FAMILY_DEFAULT = "Monospace"; static const char* FONT_FAMILY = "editor/font/family"; static const char* FONT_SIZE = "editor/font/size"; static const char* TAB_WIDTH = "editor/tabwidth"; +static const char* LINECOLUMN_ENABLED = "editor/linecolumn/enabled"; +static const char* RULER_ENABLED = "editor/ruler/enabled"; +static const char* RULER_POS = "editor/ruler/pos"; static const char* PREVIEW_STANDARD_FONT = "preview/standardfont"; static const char* PREVIEW_FIXED_FONT = "preview/fixedfont"; static const char* PREVIEW_SERIF_FONT = "preview/seriffont"; @@ -60,6 +63,9 @@ static const char* DEPRECATED__LAST_USED_STYLE = "general/lastusedstyle"; Options::Options(QObject *parent) : QObject(parent), m_tabWidth(8), + m_lineColumnEnabled(true), + m_rulerEnabled(false), + m_rulerPos(80), m_proxyMode(NoProxy), m_proxyPort(0), m_autolinkEnabled(true), @@ -93,7 +99,10 @@ void Options::apply() globalWebSettings->setFontSize(QWebSettings::DefaultFixedFontSize, m_defaultFixedFontSize); emit proxyConfigurationChanged(); - emit markdownConverterChanged(); + emit markdownConverterChanged(); + emit lineColumnEnabledChanged(m_lineColumnEnabled); + emit rulerEnabledChanged(m_rulerEnabled); + emit rulerPosChanged(m_rulerPos); } QFont Options::editorFont() const @@ -118,6 +127,39 @@ void Options::setTabWidth(int width) emit tabWidthChanged(width); } +bool Options::isLineColumnEnabled() const +{ + return m_lineColumnEnabled; +} + +void Options::setLineColumnEnabled(bool enabled) +{ + m_lineColumnEnabled = enabled; + emit lineColumnEnabledChanged(enabled); +} + +bool Options::isRulerEnabled() const +{ + return m_rulerEnabled; +} + +void Options::setRulerEnabled(bool enabled) +{ + m_rulerEnabled = enabled; + emit rulerEnabledChanged(enabled); +} + +int Options::rulerPos() const +{ + return m_rulerPos; +} + +void Options::setRulerPos(int pos) +{ + m_rulerPos = pos; + emit rulerPosChanged(pos); +} + QFont Options::standardFont() const { return QFont(m_standardFontFamily); @@ -451,6 +493,9 @@ void Options::readSettings() int fontSize = settings.value(FONT_SIZE, 10).toInt(); m_tabWidth = settings.value(TAB_WIDTH, 8).toInt(); + m_lineColumnEnabled = settings.value(LINECOLUMN_ENABLED, false).toBool(); + m_rulerEnabled = settings.value(RULER_ENABLED, false).toBool(); + m_rulerPos = settings.value(RULER_POS, 80).toInt(); QFont f(fontFamily, fontSize); f.setStyleHint(QFont::TypeWriter); @@ -522,6 +567,9 @@ void Options::writeSettings() settings.setValue(FONT_FAMILY, font.family()); settings.setValue(FONT_SIZE, font.pointSize()); settings.setValue(TAB_WIDTH, m_tabWidth); + settings.setValue(LINECOLUMN_ENABLED, m_lineColumnEnabled); + settings.setValue(RULER_ENABLED, m_rulerEnabled); + settings.setValue(RULER_POS, m_rulerPos); // html preview settings settings.setValue(PREVIEW_STANDARD_FONT, m_standardFontFamily); diff --git a/app/options.h b/app/options.h index c281c6a3..be9cb6e0 100644 --- a/app/options.h +++ b/app/options.h @@ -45,6 +45,15 @@ class Options : public QObject int tabWidth() const; void setTabWidth(int width); + bool isLineColumnEnabled() const; + void setLineColumnEnabled(bool enabled); + + bool isRulerEnabled() const; + void setRulerEnabled(bool enabled); + + int rulerPos() const; + void setRulerPos(int pos); + /* HTML preview options */ QFont standardFont() const; void setStandardFont(const QFont &font); @@ -150,6 +159,10 @@ class Options : public QObject void editorFontChanged(const QFont &font); void editorStyleChanged(); void tabWidthChanged(int tabWidth); + void lineColumnEnabledChanged(bool enabled); + void rulerEnabledChanged(bool enabled); + void rulerPosChanged(int pos); + void proxyConfigurationChanged(); void markdownConverterChanged(); @@ -180,6 +193,9 @@ class Options : public QObject bool m_spellingCheckEnabled; bool m_yamlHeaderSupportEnabled; bool m_diagramSupportEnabled; + bool m_lineColumnEnabled; + bool m_rulerEnabled; + int m_rulerPos; QString m_dictionaryLanguage; MarkdownConverter m_markdownConverter; QString m_lastUsedTheme; diff --git a/app/optionsdialog.cpp b/app/optionsdialog.cpp index ebcb0dad..67bdb03e 100644 --- a/app/optionsdialog.cpp +++ b/app/optionsdialog.cpp @@ -287,6 +287,9 @@ void OptionsDialog::readState() ui->sizeComboBox->setCurrentText(QString().setNum(font.pointSize())); ui->sourceSingleSizedCheckBox->setChecked(options->isSourceAtSingleSizeEnabled()); ui->tabWidthSpinBox->setValue(options->tabWidth()); + ui->lineColumnCheckBox->setChecked(options->isLineColumnEnabled()); + ui->rulerEnableCheckBox->setChecked(options->isRulerEnabled()); + ui->rulerPosSpinBox->setValue(options->rulerPos()); // html preview settings ui->standardFontComboBox->setCurrentFont(options->standardFont()); @@ -334,6 +337,9 @@ void OptionsDialog::saveState() options->setEditorFont(font); options->setSourceAtSingleSizeEnabled(ui->sourceSingleSizedCheckBox->isChecked()); options->setTabWidth(ui->tabWidthSpinBox->value()); + options->setLineColumnEnabled(ui->lineColumnCheckBox->isChecked()); + options->setRulerEnabled(ui->rulerEnableCheckBox->isChecked()); + options->setRulerPos(ui->rulerPosSpinBox->value()); options->setMathInlineSupportEnabled(ui->mathInlineCheckBox->isChecked()); options->setMathSupportEnabled(ui->mathSupportCheckBox->isChecked()); diff --git a/app/optionsdialog.ui b/app/optionsdialog.ui index ece773ac..c95be62d 100644 --- a/app/optionsdialog.ui +++ b/app/optionsdialog.ui @@ -87,34 +87,74 @@ Font - - - - - - - - Si&ze: - - - sizeComboBox - - - - - - - - - - &Family: - - - fontComboBox - - + + + + + + + &Family: + + + fontComboBox + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 40 + 6 + + + + + + + + Si&ze: + + + sizeComboBox + + + + + + + + 0 + 0 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + - + Markdown Source at Single Size @@ -169,11 +209,70 @@ + + + + Other + + + + + + + + Display right margin at column: + + + + + + + false + + + 1 + + + 999 + + + 80 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Show cursor position in status bar + + + + + + Qt::Vertical + + QSizePolicy::Expanding + 20 @@ -195,6 +294,35 @@ Fonts + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + S&ans Serif Font: + + + sansSerifFontComboBox + + + + + + + + + @@ -205,19 +333,16 @@ - - + + - - + + Size: - - - @@ -228,19 +353,30 @@ - - - - - + + + + + 0 + 0 + + + - - + + - S&ans Serif Font: + Size: - - sansSerifFontComboBox + + + + + + + 0 + 0 + @@ -257,15 +393,21 @@ - - - - - - - Size: + + + + Qt::Horizontal - + + QSizePolicy::Minimum + + + + 40 + 6 + + + @@ -648,6 +790,22 @@ + + rulerEnableCheckBox + toggled(bool) + rulerPosSpinBox + setEnabled(bool) + + + 115 + 214 + + + 228 + 214 + + + addSnippetButtonClicked() diff --git a/app/statusbarwidget.cpp b/app/statusbarwidget.cpp new file mode 100644 index 00000000..4a12a753 --- /dev/null +++ b/app/statusbarwidget.cpp @@ -0,0 +1,141 @@ +#include "statusbarwidget.h" + +#include +#include +#include +#include +#include +#include + +#include "controls/actionlabel.h" +#include "markdowneditor.h" + +StatusBarWidget::StatusBarWidget(MarkdownEditor* editor) : + m_editor(editor), + m_lineColLabel(0), + m_wordCountLabel(0), + m_styleLabel(0), + m_styleActions(0), + m_htmlLabel(0) + +{ + // main layout + QHBoxLayout *topLayout = new QHBoxLayout(this); + topLayout->setContentsMargins(4,0,4,0); + topLayout->setSpacing(4); + + // line&column label + m_lineColLabel = new QLabel; + topLayout->addWidget(m_lineColLabel, 0); + m_lineColLabel->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); + + // word count label + m_wordCountLabel = new QLabel; + m_wordCountLabel->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); + topLayout->addWidget(m_wordCountLabel, 0); + + // add spacer + topLayout->addItem(new QSpacerItem(0,10, QSizePolicy::Expanding, QSizePolicy::Expanding)); + + // styles label + m_styleLabel = new QLabel; + m_styleLabel->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); + topLayout->addWidget(m_styleLabel, 0); + + m_styleLabel->setContextMenuPolicy(Qt::CustomContextMenu); + connect(m_styleLabel, &QLabel::customContextMenuRequested, this, &StatusBarWidget::styleContextMenu); + + // separator label + topLayout->addWidget(new QLabel("|"), 0); + + // html preview label + m_htmlLabel = new ActionLabel; + m_htmlLabel->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); + topLayout->addWidget(m_htmlLabel, 0); + + connect(m_editor, &MarkdownEditor::cursorPositionChanged, this, &StatusBarWidget::cursorPositionChanged); + connect(m_editor, &MarkdownEditor::textChanged, this, &StatusBarWidget::textChanged); +} + +StatusBarWidget::~StatusBarWidget() +{ +} + +void StatusBarWidget::update() +{ + cursorPositionChanged(); + textChanged(); +} + +void StatusBarWidget::showLineColumn(bool enabled) +{ + if(enabled) + m_lineColLabel->show(); + else + m_lineColLabel->hide(); +} + +void StatusBarWidget::setHtmlAction(QAction *action) +{ + m_htmlLabel->setAction(action); +} + +void StatusBarWidget::setStyleActions(QActionGroup *actionGroup) +{ + // if was previously defined, disconnect + if(m_styleActions != NULL) { + disconnect(m_styleActions, &QActionGroup::triggered, this, &StatusBarWidget::updateStyleLabel); + } + + // set new actions group + m_styleActions = actionGroup; + updateStyleLabel(); + + connect(m_styleActions, &QActionGroup::triggered, this, &StatusBarWidget::updateStyleLabel); +} + +void StatusBarWidget::cursorPositionChanged() +{ + QTextCursor cursor = m_editor->textCursor(); + + // TODO Fix it, when line wraps to multiline (too narrow window for example + // then this line count will be wrong. + // possible solution: http://stackoverflow.com/questions/15814776/how-do-i-get-the-actual-visible-cursors-line-number + int line = cursor.blockNumber(); + int column = cursor.columnNumber(); + + m_lineColLabel->setText(tr("Line %1, Column %2 %3") + .arg(QLocale().toString(line + 1)) + .arg(QLocale().toString(column + 1)) + .arg("|") + ); +} + +void StatusBarWidget::textChanged() +{ + // update statistics + if (m_wordCountLabel) { + int words = m_editor->countWords(); + int lines = m_editor->document()->lineCount(); + int chars = m_editor->document()->characterCount(); + + m_wordCountLabel->setText(tr("%1 words").arg(words)); + m_wordCountLabel->setToolTip(tr("Lines: %1 Words: %2 Characters: %3").arg(lines).arg(words).arg(chars)); + } +} + +void StatusBarWidget::styleContextMenu(const QPoint &pos) +{ + if(m_styleActions != NULL) { + QMenu menu; + menu.addActions(m_styleActions->actions()); + menu.exec(m_styleLabel->mapToGlobal(pos)); + } +} + +void StatusBarWidget::updateStyleLabel() +{ + QAction* action = m_styleActions->checkedAction(); + if(action) + m_styleLabel->setText(tr("Style: %1").arg(action->text())); +} diff --git a/app/statusbarwidget.h b/app/statusbarwidget.h new file mode 100644 index 00000000..d46c88bf --- /dev/null +++ b/app/statusbarwidget.h @@ -0,0 +1,47 @@ +#ifndef STATUSBARWIDGET_H +#define STATUSBARWIDGET_H + +#include + +class QLabel; +class QActionGroup; + +class MarkdownEditor; +class ActionLabel; + +class StatusBarWidget : public QWidget +{ + Q_OBJECT + +public: + explicit StatusBarWidget(MarkdownEditor* editor); + ~StatusBarWidget(); + +public slots: + void update(); + void showLineColumn(bool enabled); + + void setHtmlAction(QAction *action); + void setStyleActions(QActionGroup *actionGroup); + +private slots: + void cursorPositionChanged(); + void textChanged(); + + void styleContextMenu(const QPoint &pos); + void updateStyleLabel(); + +private: + MarkdownEditor* m_editor; + + QLabel *m_lineColLabel; + QLabel *m_wordCountLabel; + + QLabel *m_styleLabel; + + QActionGroup *m_styleActions; + + ActionLabel *m_htmlLabel; +}; + +#endif // STATUSBARWIDGET_H From 286680e35fd5621a2551acefc19eba1a9d431bfb Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Tue, 8 Mar 2016 10:29:07 +0100 Subject: [PATCH 51/74] changed vertical ruler opacity to 50% as it looks better when using dark themes --- app/markdowneditor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/markdowneditor.cpp b/app/markdowneditor.cpp index e9b88c0a..fece1e1d 100644 --- a/app/markdowneditor.cpp +++ b/app/markdowneditor.cpp @@ -529,11 +529,11 @@ void MarkdownEditor::drawRuler(QPaintEvent *e) + document()->documentMargin(); // draw a ruler with color invert to background color (better readability) - // and with 20% opacity + // and with 50% opacity QPainter p(viewport()); p.setCompositionMode(QPainter::RasterOp_SourceXorDestination); p.setPen(QColor(0xff, 0xff, 0xff)); - p.setOpacity(0.2); + p.setOpacity(0.5); p.drawLine(verticalOffset, rect.top(), verticalOffset, rect.bottom()); } From 0362354ca1df2dbf6a1a8300bb06ddc98d39f22c Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Mon, 22 Feb 2016 09:07:47 +0100 Subject: [PATCH 52/74] fixed disappearing links when exporting to PDF format --- app/mainwindow.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index cb967437..06601605 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -304,10 +304,12 @@ void MainWindow::fileExportToHtml() void MainWindow::fileExportToPdf() { - ExportPdfDialog dialog(fileName); - if (dialog.exec() == QDialog::Accepted) { - ui->webView->print(dialog.printer()); - } + ExportPdfDialog dialog(fileName); + if (dialog.exec() == QDialog::Accepted) { + QTextDocument doc; + doc.setHtml(ui->webView->page()->currentFrame()->toHtml()); + doc.print(dialog.printer()); + } } void MainWindow::filePrint() From 52d41c71731dc8bd466ca1fc6c23ba3328700779 Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Mon, 22 Feb 2016 17:11:12 +0100 Subject: [PATCH 53/74] added comment explaining workaround with QTextDocument --- app/mainwindow.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 06601605..f8e31c34 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -304,6 +304,11 @@ void MainWindow::fileExportToHtml() void MainWindow::fileExportToPdf() { + // using temporary QTextDocument instance to get links exported\printed correctly, + // as links will dissappear when printing directly from QWebView in current Qt implementation + // of QWebView::print() method (possible bug in Qt?) + // more info here: http://stackoverflow.com/questions/11629093/add-working-url-into-pdf-using-qt-qprinter + ExportPdfDialog dialog(fileName); if (dialog.exec() == QDialog::Accepted) { QTextDocument doc; From c3d56c5b6da19135bc9eeced352e50dd3401e316 Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Wed, 9 Mar 2016 21:25:42 +0100 Subject: [PATCH 54/74] merged ActionLabel class into ActiveLabel class --- app/app.pro | 2 -- app/controls/actionlabel.cpp | 51 ------------------------------------ app/controls/actionlabel.h | 24 ----------------- app/controls/activelabel.cpp | 47 +++++++++++++++++++++++++++++++-- app/controls/activelabel.h | 10 +++++++ app/statusbarwidget.cpp | 8 +++--- app/statusbarwidget.h | 4 +-- 7 files changed, 61 insertions(+), 85 deletions(-) delete mode 100644 app/controls/actionlabel.cpp delete mode 100644 app/controls/actionlabel.h diff --git a/app/app.pro b/app/app.pro index 4398bd92..e6719be4 100644 --- a/app/app.pro +++ b/app/app.pro @@ -50,7 +50,6 @@ SOURCES += \ controls/fileexplorerwidget.cpp \ controls/findreplacewidget.cpp \ controls/recentfilesmenu.cpp \ - controls/actionlabel.cpp \ htmlpreviewgenerator.cpp \ markdownhighlighter.cpp \ highlightworkerthread.cpp \ @@ -87,7 +86,6 @@ HEADERS += \ controls/fileexplorerwidget.h \ controls/findreplacewidget.h \ controls/recentfilesmenu.h \ - controls/actionlabel.h \ htmlpreviewgenerator.h \ markdownhighlighter.h \ highlightworkerthread.h \ diff --git a/app/controls/actionlabel.cpp b/app/controls/actionlabel.cpp deleted file mode 100644 index a2ebefcd..00000000 --- a/app/controls/actionlabel.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include "actionlabel.h" - -#include - -ActionLabel::ActionLabel(QWidget *parent) : - ActiveLabel(parent), - m_action(0) -{ -} - -void ActionLabel::setAction(QAction *action) -{ - // if was previously defined, disconnect - if(m_action != NULL) { - disconnect(m_action, &QAction::changed, this, &ActionLabel::updateFromAction); - disconnect(this, &ActionLabel::doubleClicked, m_action, &QAction::trigger); - } - - // set new action - m_action = action; - - // update label using action's data - updateFromAction(); - - // action action and label to have them synced - // whenever one of them is triggered - connect(m_action, &QAction::changed, this, &ActionLabel::updateFromAction); - connect(this, &ActionLabel::doubleClicked, m_action, &QAction::trigger); -} - -void ActionLabel::updateFromAction() -{ - setStatusTip(m_action->statusTip()); - setToolTip(m_action->toolTip()); - setEnabled(m_action->isEnabled()); - - // update text based on QAction data - QString actionText = m_action->text(); - actionText.remove("&"); - - if(m_action->isCheckable()) { - if(m_action->isChecked()) - setText(QString("%1: %2").arg(actionText).arg(tr("on"))); - else - setText(QString("%1: %2").arg(actionText).arg(tr("off"))); - } else { - setText(actionText); - } -} - - diff --git a/app/controls/actionlabel.h b/app/controls/actionlabel.h deleted file mode 100644 index 34f4ab2c..00000000 --- a/app/controls/actionlabel.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef ACTIONLABEL_H -#define ACTIONLABEL_H - -#include "controls/activelabel.h" - -class QAction; - -class ActionLabel : public ActiveLabel -{ - Q_OBJECT - -public: - explicit ActionLabel(QWidget *parent=0); - - void setAction(QAction *action); - -public slots: - void updateFromAction(); - -private: - QAction *m_action; -}; - -#endif // ACTIONLABEL_H diff --git a/app/controls/activelabel.cpp b/app/controls/activelabel.cpp index 59b974f1..fceaf2fb 100644 --- a/app/controls/activelabel.cpp +++ b/app/controls/activelabel.cpp @@ -16,15 +16,18 @@ */ #include "activelabel.h" +#include #include ActiveLabel::ActiveLabel(QWidget *parent) : - QLabel(parent) + QLabel(parent), + m_action(0) { } ActiveLabel::ActiveLabel(const QString &text, QWidget *parent) : - QLabel(text, parent) + QLabel(text, parent), + m_action(0) { } @@ -37,3 +40,43 @@ void ActiveLabel::mouseDoubleClickEvent(QMouseEvent *e) QLabel::mouseDoubleClickEvent(e); } + +void ActiveLabel::setAction(QAction *action) +{ + // if was previously defined, disconnect + if (m_action != NULL) { + disconnect(m_action, &QAction::changed, this, &ActiveLabel::updateFromAction); + disconnect(this, &ActiveLabel::doubleClicked, m_action, &QAction::trigger); + } + + // set new action + m_action = action; + + // update label using action's data + updateFromAction(); + + // action action and label to have them synced + // whenever one of them is triggered + connect(m_action, &QAction::changed, this, &ActiveLabel::updateFromAction); + connect(this, &ActiveLabel::doubleClicked, m_action, &QAction::trigger); +} + +void ActiveLabel::updateFromAction() +{ + setStatusTip(m_action->statusTip()); + setToolTip(m_action->toolTip()); + setEnabled(m_action->isEnabled()); + + // update text based on QAction data + QString actionText = m_action->text(); + actionText.remove("&"); + + if (m_action->isCheckable()) { + if (m_action->isChecked()) + setText(QString("%1: %2").arg(actionText).arg(tr("on"))); + else + setText(QString("%1: %2").arg(actionText).arg(tr("off"))); + } else { + setText(actionText); + } +} diff --git a/app/controls/activelabel.h b/app/controls/activelabel.h index f7a63ab3..02d88804 100644 --- a/app/controls/activelabel.h +++ b/app/controls/activelabel.h @@ -19,6 +19,8 @@ #include +class QAction; + class ActiveLabel : public QLabel { Q_OBJECT @@ -26,11 +28,19 @@ class ActiveLabel : public QLabel explicit ActiveLabel(QWidget *parent = 0); explicit ActiveLabel(const QString &text, QWidget *parent = 0); + void setAction(QAction *action); + +public slots: + void updateFromAction(); + signals: void doubleClicked(); protected: void mouseDoubleClickEvent(QMouseEvent *e) Q_DECL_OVERRIDE; + +private: + QAction *m_action; }; #endif // ACTIVELABEL_H diff --git a/app/statusbarwidget.cpp b/app/statusbarwidget.cpp index 4a12a753..1aefd5b7 100644 --- a/app/statusbarwidget.cpp +++ b/app/statusbarwidget.cpp @@ -7,7 +7,7 @@ #include #include -#include "controls/actionlabel.h" +#include "controls/activelabel.h" #include "markdowneditor.h" StatusBarWidget::StatusBarWidget(MarkdownEditor* editor) : @@ -49,7 +49,7 @@ StatusBarWidget::StatusBarWidget(MarkdownEditor* editor) : topLayout->addWidget(new QLabel("|"), 0); // html preview label - m_htmlLabel = new ActionLabel; + m_htmlLabel = new ActiveLabel; m_htmlLabel->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); topLayout->addWidget(m_htmlLabel, 0); @@ -69,7 +69,7 @@ void StatusBarWidget::update() void StatusBarWidget::showLineColumn(bool enabled) { - if(enabled) + if(enabled) m_lineColLabel->show(); else m_lineColLabel->hide(); @@ -83,7 +83,7 @@ void StatusBarWidget::setHtmlAction(QAction *action) void StatusBarWidget::setStyleActions(QActionGroup *actionGroup) { // if was previously defined, disconnect - if(m_styleActions != NULL) { + if(m_styleActions != NULL) { disconnect(m_styleActions, &QActionGroup::triggered, this, &StatusBarWidget::updateStyleLabel); } diff --git a/app/statusbarwidget.h b/app/statusbarwidget.h index d46c88bf..efbb3228 100644 --- a/app/statusbarwidget.h +++ b/app/statusbarwidget.h @@ -7,7 +7,7 @@ class QLabel; class QActionGroup; class MarkdownEditor; -class ActionLabel; +class ActiveLabel; class StatusBarWidget : public QWidget { @@ -41,7 +41,7 @@ private slots: QActionGroup *m_styleActions; - ActionLabel *m_htmlLabel; + ActiveLabel *m_htmlLabel; }; #endif // STATUSBARWIDGET_H From d02920b161b7c521be2e88021411be66b455421c Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Wed, 9 Mar 2016 21:36:20 +0100 Subject: [PATCH 55/74] returned back commit 37ecdbf by cloose --- app/mainwindow.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 918e7e0c..e82ada9b 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -1186,17 +1186,17 @@ void MainWindow::setupHtmlPreviewThemes() int key = 1; bool separatorAdded = false; foreach(const QString &themeName, themeCollection->themeNames()) { + if (!separatorAdded && !themeCollection->theme(themeName).isBuiltIn()) { + addSeparatorAfterBuiltInThemes(); + separatorAdded = true; + } + QAction *action = ui->menuStyles->addAction(themeName); action->setShortcut(QKeySequence(tr("Ctrl+%1").arg(key++))); action->setCheckable(true); action->setActionGroup(stylesGroup); connect(action, &QAction::triggered, this, &MainWindow::themeChanged); - - if (!separatorAdded && !themeCollection->theme(themeName).isBuiltIn()) { - addSeparatorAfterBuiltInThemes(); - separatorAdded = true; - } } if(statusBarWidget != NULL) From 45b9784a70f20a0e662d009fe5ac20c27d700c7c Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Wed, 9 Mar 2016 21:45:55 +0100 Subject: [PATCH 56/74] using c++11 to iterate trought array instead of old foreach syntax --- app/mainwindow.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index e82ada9b..50c06b41 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -486,12 +486,13 @@ void MainWindow::lastUsedTheme() currentTheme = themeCollection->theme(themeName); applyCurrentTheme(); - foreach(QAction* a, stylesGroup->actions()) { - if(QString::compare(a->text(), themeName) == 0) { - a->setChecked(true); - stylesGroup->triggered(a); - } - } + for (auto action : stylesGroup->actions()) { + if (action->text() == themeName) { + action->setChecked(true); + stylesGroup->triggered(action); + break; + } + } } void MainWindow::themeChanged() From fcf4678c2d9718b2e226509b602f4e6d55c3635d Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Wed, 9 Mar 2016 21:48:29 +0100 Subject: [PATCH 57/74] removed redundant check for NULL while testing pointers --- app/controls/activelabel.cpp | 2 +- app/mainwindow.cpp | 2 +- app/statusbarwidget.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controls/activelabel.cpp b/app/controls/activelabel.cpp index fceaf2fb..5237bacb 100644 --- a/app/controls/activelabel.cpp +++ b/app/controls/activelabel.cpp @@ -44,7 +44,7 @@ void ActiveLabel::mouseDoubleClickEvent(QMouseEvent *e) void ActiveLabel::setAction(QAction *action) { // if was previously defined, disconnect - if (m_action != NULL) { + if (m_action) { disconnect(m_action, &QAction::changed, this, &ActiveLabel::updateFromAction); disconnect(this, &ActiveLabel::doubleClicked, m_action, &QAction::trigger); } diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 50c06b41..abe054b9 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -1200,7 +1200,7 @@ void MainWindow::setupHtmlPreviewThemes() this, &MainWindow::themeChanged); } - if(statusBarWidget != NULL) + if(statusBarWidget) statusBarWidget->setStyleActions(stylesGroup); } diff --git a/app/statusbarwidget.cpp b/app/statusbarwidget.cpp index 1aefd5b7..89e2835c 100644 --- a/app/statusbarwidget.cpp +++ b/app/statusbarwidget.cpp @@ -83,7 +83,7 @@ void StatusBarWidget::setHtmlAction(QAction *action) void StatusBarWidget::setStyleActions(QActionGroup *actionGroup) { // if was previously defined, disconnect - if(m_styleActions != NULL) { + if(m_styleActions) { disconnect(m_styleActions, &QActionGroup::triggered, this, &StatusBarWidget::updateStyleLabel); } @@ -126,7 +126,7 @@ void StatusBarWidget::textChanged() void StatusBarWidget::styleContextMenu(const QPoint &pos) { - if(m_styleActions != NULL) { + if(m_styleActions) { QMenu menu; menu.addActions(m_styleActions->actions()); menu.exec(m_styleLabel->mapToGlobal(pos)); From 193afd04abfe30c44fbfe3a0ed57074a822f6d3a Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Wed, 9 Mar 2016 21:50:18 +0100 Subject: [PATCH 58/74] fixed typo --- app/mainwindow.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/mainwindow.ui b/app/mainwindow.ui index 597807bf..a4f0741a 100644 --- a/app/mainwindow.ui +++ b/app/mainwindow.ui @@ -583,7 +583,7 @@ HTML &Source - Show HTML source code in HTML preivew window + Show HTML source code in HTML preview window F5 From 7110791ad5f13f27ac761ecb611cc242eb80488a Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Wed, 9 Mar 2016 22:10:03 +0100 Subject: [PATCH 59/74] Qt coding style applied tabs to spaces if and parenteses separated with space --- app/controls/activelabel.h | 1 + app/mainwindow.cpp | 90 +++++++++++++------------ app/mainwindow.h | 4 +- app/markdowneditor.cpp | 16 ++--- app/options.cpp | 14 ++-- app/options.h | 8 +-- app/optionsdialog.cpp | 4 +- app/statusbarwidget.cpp | 130 ++++++++++++++++++------------------- app/statusbarwidget.h | 24 +++---- 9 files changed, 145 insertions(+), 146 deletions(-) diff --git a/app/controls/activelabel.h b/app/controls/activelabel.h index 02d88804..d9aec758 100644 --- a/app/controls/activelabel.h +++ b/app/controls/activelabel.h @@ -24,6 +24,7 @@ class QAction; class ActiveLabel : public QLabel { Q_OBJECT + public: explicit ActiveLabel(QWidget *parent = 0); explicit ActiveLabel(const QString &text, QWidget *parent = 0); diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index abe054b9..71205398 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -77,7 +77,7 @@ MainWindow::MainWindow(const QString &fileName, QWidget *parent) : ui(new Ui::MainWindow), options(new Options(this)), stylesGroup(new QActionGroup(this)), - statusBarWidget(0), + statusBarWidget(0), generator(new HtmlPreviewGenerator(options, this)), snippetCollection(new SnippetCollection(this)), viewSynchronizer(0), @@ -312,17 +312,17 @@ void MainWindow::fileExportToHtml() void MainWindow::fileExportToPdf() { - // using temporary QTextDocument instance to get links exported\printed correctly, - // as links will dissappear when printing directly from QWebView in current Qt implementation - // of QWebView::print() method (possible bug in Qt?) - // more info here: http://stackoverflow.com/questions/11629093/add-working-url-into-pdf-using-qt-qprinter + // using temporary QTextDocument instance to get links exported\printed correctly, + // as links will dissappear when printing directly from QWebView in current Qt implementation + // of QWebView::print() method (possible bug in Qt?) + // more info here: http://stackoverflow.com/questions/11629093/add-working-url-into-pdf-using-qt-qprinter - ExportPdfDialog dialog(fileName); - if (dialog.exec() == QDialog::Accepted) { - QTextDocument doc; - doc.setHtml(ui->webView->page()->currentFrame()->toHtml()); - doc.print(dialog.printer()); - } + ExportPdfDialog dialog(fileName); + if (dialog.exec() == QDialog::Accepted) { + QTextDocument doc; + doc.setHtml(ui->webView->page()->currentFrame()->toHtml()); + doc.print(dialog.printer()); + } } void MainWindow::filePrint() @@ -644,7 +644,7 @@ void MainWindow::extrasOptions() // view menu actions << ui->dockWidget->toggleViewAction() << ui->fileExplorerDockWidget->toggleViewAction() - << ui->actionHtmlSource + << ui->actionHtmlSource << ui->actionSplit_1_1 << ui->actionSplit_2_1 << ui->actionSplit_1_2 @@ -682,27 +682,27 @@ void MainWindow::helpAbout() void MainWindow::setHtmlSource(bool enabled) { - if(enabled) { - ui->stackedWidget->setCurrentWidget(ui->htmlSourcePage); + if (enabled) { + ui->stackedWidget->setCurrentWidget(ui->htmlSourcePage); - // activate HTML highlighter - htmlHighlighter->setEnabled(true); - htmlHighlighter->rehighlight(); - } else { - ui->stackedWidget->setCurrentWidget(ui->webViewPage); + // activate HTML highlighter + htmlHighlighter->setEnabled(true); + htmlHighlighter->rehighlight(); + } else { + ui->stackedWidget->setCurrentWidget(ui->webViewPage); - // deactivate HTML highlighter - htmlHighlighter->setEnabled(false); + // deactivate HTML highlighter + htmlHighlighter->setEnabled(false); - // update webView now since it was not updated while hidden - syncWebViewToHtmlSource(); - } + // update webView now since it was not updated while hidden + syncWebViewToHtmlSource(); + } - // sync view menu action - if(ui->actionHtmlSource->isChecked() != enabled) - ui->actionHtmlSource->setChecked(enabled); + // sync view menu action + if (ui->actionHtmlSource->isChecked() != enabled) + ui->actionHtmlSource->setChecked(enabled); - updateSplitter(); + updateSplitter(); } void MainWindow::plainTextChanged() @@ -742,15 +742,13 @@ void MainWindow::tocResultReady(const QString &toc) void MainWindow::previewLinkClicked(const QUrl &url) { - if(url.isLocalFile()) - { + if (url.isLocalFile()) { // directories are not supported - if(QFileInfo(url.toLocalFile()).isDir()) return; + if (QFileInfo(url.toLocalFile()).isDir()) return; QString filePath = url.toLocalFile(); // Links to markdown files open new instance - if(filePath.endsWith(".md") || filePath.endsWith(".markdown") || filePath.endsWith(".mdown")) - { + if (filePath.endsWith(".md") || filePath.endsWith(".markdown") || filePath.endsWith(".mdown")) { QProcess::startDetached(qApp->applicationFilePath(), QStringList() << filePath); return; } @@ -874,7 +872,7 @@ void MainWindow::setupUi() setupMarkdownEditor(); setupHtmlPreview(); setupHtmlSourceView(); - setupStatusBar(); + setupStatusBar(); // hide find/replace widget on startup ui->findReplaceWidget->hide(); @@ -887,7 +885,7 @@ void MainWindow::setupUi() // hide markdown syntax help dockwidget ui->dockWidget_2->hide(); ui->dockWidget_2->setFloating(true); - ui->dockWidget_2->resize(550, 400); + ui->dockWidget_2->resize(550, 400); // show HTML preview on right panel setHtmlSource(ui->actionHtmlSource->isChecked()); @@ -983,7 +981,7 @@ void MainWindow::setupActions() ui->actionInsertImage->setProperty("defaultshortcut", ui->actionInsertImage->shortcut()); ui->dockWidget->toggleViewAction()->setProperty("defaultshortcut", ui->dockWidget->toggleViewAction()->shortcut()); ui->fileExplorerDockWidget->toggleViewAction()->setProperty("defaultshortcut", ui->fileExplorerDockWidget->toggleViewAction()->shortcut()); - ui->actionHtmlSource->setProperty("defaultshortcut", ui->actionHtmlSource->shortcut()); + ui->actionHtmlSource->setProperty("defaultshortcut", ui->actionHtmlSource->shortcut()); } void MainWindow::setActionsIcons() @@ -1024,17 +1022,17 @@ void MainWindow::setActionsIcons() void MainWindow::setupStatusBar() { - statusBarWidget = new StatusBarWidget(ui->plainTextEdit); - statusBarWidget->setHtmlAction(ui->actionHtmlSource); + statusBarWidget = new StatusBarWidget(ui->plainTextEdit); + statusBarWidget->setHtmlAction(ui->actionHtmlSource); - connect(options, &Options::lineColumnEnabledChanged, - statusBarWidget, &StatusBarWidget::showLineColumn); + connect(options, &Options::lineColumnEnabledChanged, + statusBarWidget, &StatusBarWidget::showLineColumn); - statusBarWidget->update(); + statusBarWidget->update(); - // remove border around statusbar widgets - statusBar()->setStyleSheet("QStatusBar::item { border: 0px solid black }; "); - statusBar()->addPermanentWidget(statusBarWidget, 1); + // remove border around statusbar widgets + statusBar()->setStyleSheet("QStatusBar::item { border: 0px solid black }; "); + statusBar()->addPermanentWidget(statusBarWidget, 1); } void MainWindow::setupMarkdownEditor() @@ -1200,8 +1198,8 @@ void MainWindow::setupHtmlPreviewThemes() this, &MainWindow::themeChanged); } - if(statusBarWidget) - statusBarWidget->setStyleActions(stylesGroup); + if (statusBarWidget) + statusBarWidget->setStyleActions(stylesGroup); } void MainWindow::addSeparatorAfterBuiltInThemes() diff --git a/app/mainwindow.h b/app/mainwindow.h index f5bc11ae..bae34ff7 100644 --- a/app/mainwindow.h +++ b/app/mainwindow.h @@ -108,7 +108,7 @@ private slots: void helpMarkdownSyntax(); void helpAbout(); - void setHtmlSource(bool enabled); + void setHtmlSource(bool enabled); void plainTextChanged(); void htmlResultReady(const QString &html); @@ -153,7 +153,7 @@ private slots: RecentFilesMenu *recentFilesMenu; Options *options; QActionGroup *stylesGroup; - StatusBarWidget* statusBarWidget; + StatusBarWidget* statusBarWidget; HtmlPreviewGenerator* generator; HtmlHighlighter *htmlHighlighter; SnippetCollection *snippetCollection; diff --git a/app/markdowneditor.cpp b/app/markdowneditor.cpp index fece1e1d..dc5b2927 100644 --- a/app/markdowneditor.cpp +++ b/app/markdowneditor.cpp @@ -172,7 +172,7 @@ void MarkdownEditor::paintEvent(QPaintEvent *e) } // draw column ruler - if(rulerEnabled) { + if (rulerEnabled) { drawRuler(e); } } @@ -522,18 +522,18 @@ void MarkdownEditor::drawRuler(QPaintEvent *e) const QRect rect = e->rect(); const QFont font = currentCharFormat().font(); - // calculate vertical offset corresponding given + // calculate vertical offset corresponding given // column margin in font metrics int verticalOffset = round(QFontMetricsF(font).averageCharWidth() * rulerPos) + contentOffset().x() + document()->documentMargin(); - // draw a ruler with color invert to background color (better readability) - // and with 50% opacity - QPainter p(viewport()); - p.setCompositionMode(QPainter::RasterOp_SourceXorDestination); - p.setPen(QColor(0xff, 0xff, 0xff)); - p.setOpacity(0.5); + // draw a ruler with color invert to background color (better readability) + // and with 50% opacity + QPainter p(viewport()); + p.setCompositionMode(QPainter::RasterOp_SourceXorDestination); + p.setPen(QColor(0xff, 0xff, 0xff)); + p.setOpacity(0.5); p.drawLine(verticalOffset, rect.top(), verticalOffset, rect.bottom()); } diff --git a/app/options.cpp b/app/options.cpp index 95ae9d69..3c04b24d 100644 --- a/app/options.cpp +++ b/app/options.cpp @@ -63,7 +63,7 @@ static const char* DEPRECATED__LAST_USED_STYLE = "general/lastusedstyle"; Options::Options(QObject *parent) : QObject(parent), m_tabWidth(8), - m_lineColumnEnabled(true), + m_lineColumnEnabled(true), m_rulerEnabled(false), m_rulerPos(80), m_proxyMode(NoProxy), @@ -99,8 +99,8 @@ void Options::apply() globalWebSettings->setFontSize(QWebSettings::DefaultFixedFontSize, m_defaultFixedFontSize); emit proxyConfigurationChanged(); - emit markdownConverterChanged(); - emit lineColumnEnabledChanged(m_lineColumnEnabled); + emit markdownConverterChanged(); + emit lineColumnEnabledChanged(m_lineColumnEnabled); emit rulerEnabledChanged(m_rulerEnabled); emit rulerPosChanged(m_rulerPos); } @@ -129,12 +129,12 @@ void Options::setTabWidth(int width) bool Options::isLineColumnEnabled() const { - return m_lineColumnEnabled; + return m_lineColumnEnabled; } void Options::setLineColumnEnabled(bool enabled) { - m_lineColumnEnabled = enabled; + m_lineColumnEnabled = enabled; emit lineColumnEnabledChanged(enabled); } @@ -493,7 +493,7 @@ void Options::readSettings() int fontSize = settings.value(FONT_SIZE, 10).toInt(); m_tabWidth = settings.value(TAB_WIDTH, 8).toInt(); - m_lineColumnEnabled = settings.value(LINECOLUMN_ENABLED, false).toBool(); + m_lineColumnEnabled = settings.value(LINECOLUMN_ENABLED, false).toBool(); m_rulerEnabled = settings.value(RULER_ENABLED, false).toBool(); m_rulerPos = settings.value(RULER_POS, 80).toInt(); @@ -567,7 +567,7 @@ void Options::writeSettings() settings.setValue(FONT_FAMILY, font.family()); settings.setValue(FONT_SIZE, font.pointSize()); settings.setValue(TAB_WIDTH, m_tabWidth); - settings.setValue(LINECOLUMN_ENABLED, m_lineColumnEnabled); + settings.setValue(LINECOLUMN_ENABLED, m_lineColumnEnabled); settings.setValue(RULER_ENABLED, m_rulerEnabled); settings.setValue(RULER_POS, m_rulerPos); diff --git a/app/options.h b/app/options.h index be9cb6e0..68d26307 100644 --- a/app/options.h +++ b/app/options.h @@ -45,8 +45,8 @@ class Options : public QObject int tabWidth() const; void setTabWidth(int width); - bool isLineColumnEnabled() const; - void setLineColumnEnabled(bool enabled); + bool isLineColumnEnabled() const; + void setLineColumnEnabled(bool enabled); bool isRulerEnabled() const; void setRulerEnabled(bool enabled); @@ -159,7 +159,7 @@ class Options : public QObject void editorFontChanged(const QFont &font); void editorStyleChanged(); void tabWidthChanged(int tabWidth); - void lineColumnEnabledChanged(bool enabled); + void lineColumnEnabledChanged(bool enabled); void rulerEnabledChanged(bool enabled); void rulerPosChanged(int pos); @@ -193,7 +193,7 @@ class Options : public QObject bool m_spellingCheckEnabled; bool m_yamlHeaderSupportEnabled; bool m_diagramSupportEnabled; - bool m_lineColumnEnabled; + bool m_lineColumnEnabled; bool m_rulerEnabled; int m_rulerPos; QString m_dictionaryLanguage; diff --git a/app/optionsdialog.cpp b/app/optionsdialog.cpp index 67bdb03e..21508aa2 100644 --- a/app/optionsdialog.cpp +++ b/app/optionsdialog.cpp @@ -287,7 +287,7 @@ void OptionsDialog::readState() ui->sizeComboBox->setCurrentText(QString().setNum(font.pointSize())); ui->sourceSingleSizedCheckBox->setChecked(options->isSourceAtSingleSizeEnabled()); ui->tabWidthSpinBox->setValue(options->tabWidth()); - ui->lineColumnCheckBox->setChecked(options->isLineColumnEnabled()); + ui->lineColumnCheckBox->setChecked(options->isLineColumnEnabled()); ui->rulerEnableCheckBox->setChecked(options->isRulerEnabled()); ui->rulerPosSpinBox->setValue(options->rulerPos()); @@ -337,7 +337,7 @@ void OptionsDialog::saveState() options->setEditorFont(font); options->setSourceAtSingleSizeEnabled(ui->sourceSingleSizedCheckBox->isChecked()); options->setTabWidth(ui->tabWidthSpinBox->value()); - options->setLineColumnEnabled(ui->lineColumnCheckBox->isChecked()); + options->setLineColumnEnabled(ui->lineColumnCheckBox->isChecked()); options->setRulerEnabled(ui->rulerEnableCheckBox->isChecked()); options->setRulerPos(ui->rulerPosSpinBox->value()); options->setMathInlineSupportEnabled(ui->mathInlineCheckBox->isChecked()); diff --git a/app/statusbarwidget.cpp b/app/statusbarwidget.cpp index 89e2835c..2b53586b 100644 --- a/app/statusbarwidget.cpp +++ b/app/statusbarwidget.cpp @@ -12,49 +12,49 @@ StatusBarWidget::StatusBarWidget(MarkdownEditor* editor) : m_editor(editor), - m_lineColLabel(0), - m_wordCountLabel(0), - m_styleLabel(0), - m_styleActions(0), - m_htmlLabel(0) + m_lineColLabel(0), + m_wordCountLabel(0), + m_styleLabel(0), + m_styleActions(0), + m_htmlLabel(0) { - // main layout + // main layout QHBoxLayout *topLayout = new QHBoxLayout(this); topLayout->setContentsMargins(4,0,4,0); topLayout->setSpacing(4); // line&column label - m_lineColLabel = new QLabel; - topLayout->addWidget(m_lineColLabel, 0); - m_lineColLabel->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); + m_lineColLabel = new QLabel; + topLayout->addWidget(m_lineColLabel, 0); + m_lineColLabel->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); - // word count label - m_wordCountLabel = new QLabel; - m_wordCountLabel->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); - topLayout->addWidget(m_wordCountLabel, 0); + // word count label + m_wordCountLabel = new QLabel; + m_wordCountLabel->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); + topLayout->addWidget(m_wordCountLabel, 0); - // add spacer - topLayout->addItem(new QSpacerItem(0,10, QSizePolicy::Expanding, QSizePolicy::Expanding)); + // add spacer + topLayout->addItem(new QSpacerItem(0,10, QSizePolicy::Expanding, QSizePolicy::Expanding)); - // styles label - m_styleLabel = new QLabel; - m_styleLabel->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); - topLayout->addWidget(m_styleLabel, 0); + // styles label + m_styleLabel = new QLabel; + m_styleLabel->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); + topLayout->addWidget(m_styleLabel, 0); - m_styleLabel->setContextMenuPolicy(Qt::CustomContextMenu); - connect(m_styleLabel, &QLabel::customContextMenuRequested, this, &StatusBarWidget::styleContextMenu); + m_styleLabel->setContextMenuPolicy(Qt::CustomContextMenu); + connect(m_styleLabel, &QLabel::customContextMenuRequested, this, &StatusBarWidget::styleContextMenu); - // separator label - topLayout->addWidget(new QLabel("|"), 0); + // separator label + topLayout->addWidget(new QLabel("|"), 0); - // html preview label + // html preview label m_htmlLabel = new ActiveLabel; - m_htmlLabel->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); - topLayout->addWidget(m_htmlLabel, 0); + m_htmlLabel->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); + topLayout->addWidget(m_htmlLabel, 0); - connect(m_editor, &MarkdownEditor::cursorPositionChanged, this, &StatusBarWidget::cursorPositionChanged); - connect(m_editor, &MarkdownEditor::textChanged, this, &StatusBarWidget::textChanged); + connect(m_editor, &MarkdownEditor::cursorPositionChanged, this, &StatusBarWidget::cursorPositionChanged); + connect(m_editor, &MarkdownEditor::textChanged, this, &StatusBarWidget::textChanged); } StatusBarWidget::~StatusBarWidget() @@ -63,46 +63,46 @@ StatusBarWidget::~StatusBarWidget() void StatusBarWidget::update() { - cursorPositionChanged(); - textChanged(); + cursorPositionChanged(); + textChanged(); } void StatusBarWidget::showLineColumn(bool enabled) { - if(enabled) + if (enabled) m_lineColLabel->show(); - else + else m_lineColLabel->hide(); } void StatusBarWidget::setHtmlAction(QAction *action) -{ - m_htmlLabel->setAction(action); +{ + m_htmlLabel->setAction(action); } void StatusBarWidget::setStyleActions(QActionGroup *actionGroup) { - // if was previously defined, disconnect - if(m_styleActions) { - disconnect(m_styleActions, &QActionGroup::triggered, this, &StatusBarWidget::updateStyleLabel); - } + // if was previously defined, disconnect + if (m_styleActions) { + disconnect(m_styleActions, &QActionGroup::triggered, this, &StatusBarWidget::updateStyleLabel); + } - // set new actions group - m_styleActions = actionGroup; - updateStyleLabel(); + // set new actions group + m_styleActions = actionGroup; + updateStyleLabel(); - connect(m_styleActions, &QActionGroup::triggered, this, &StatusBarWidget::updateStyleLabel); + connect(m_styleActions, &QActionGroup::triggered, this, &StatusBarWidget::updateStyleLabel); } void StatusBarWidget::cursorPositionChanged() { - QTextCursor cursor = m_editor->textCursor(); + QTextCursor cursor = m_editor->textCursor(); - // TODO Fix it, when line wraps to multiline (too narrow window for example - // then this line count will be wrong. - // possible solution: http://stackoverflow.com/questions/15814776/how-do-i-get-the-actual-visible-cursors-line-number - int line = cursor.blockNumber(); - int column = cursor.columnNumber(); + // TODO Fix it, when line wraps to multiline (too narrow window for example + // then this line count will be wrong. + // possible solution: http://stackoverflow.com/questions/15814776/how-do-i-get-the-actual-visible-cursors-line-number + int line = cursor.blockNumber(); + int column = cursor.columnNumber(); m_lineColLabel->setText(tr("Line %1, Column %2 %3") .arg(QLocale().toString(line + 1)) @@ -113,29 +113,29 @@ void StatusBarWidget::cursorPositionChanged() void StatusBarWidget::textChanged() { - // update statistics - if (m_wordCountLabel) { - int words = m_editor->countWords(); - int lines = m_editor->document()->lineCount(); - int chars = m_editor->document()->characterCount(); - - m_wordCountLabel->setText(tr("%1 words").arg(words)); - m_wordCountLabel->setToolTip(tr("Lines: %1 Words: %2 Characters: %3").arg(lines).arg(words).arg(chars)); - } + // update statistics + if (m_wordCountLabel) { + int words = m_editor->countWords(); + int lines = m_editor->document()->lineCount(); + int chars = m_editor->document()->characterCount(); + + m_wordCountLabel->setText(tr("%1 words").arg(words)); + m_wordCountLabel->setToolTip(tr("Lines: %1 Words: %2 Characters: %3").arg(lines).arg(words).arg(chars)); + } } void StatusBarWidget::styleContextMenu(const QPoint &pos) { - if(m_styleActions) { - QMenu menu; - menu.addActions(m_styleActions->actions()); - menu.exec(m_styleLabel->mapToGlobal(pos)); - } + if (m_styleActions) { + QMenu menu; + menu.addActions(m_styleActions->actions()); + menu.exec(m_styleLabel->mapToGlobal(pos)); + } } void StatusBarWidget::updateStyleLabel() { - QAction* action = m_styleActions->checkedAction(); - if(action) - m_styleLabel->setText(tr("Style: %1").arg(action->text())); + QAction* action = m_styleActions->checkedAction(); + if (action) + m_styleLabel->setText(tr("Style: %1").arg(action->text())); } diff --git a/app/statusbarwidget.h b/app/statusbarwidget.h index efbb3228..573e0542 100644 --- a/app/statusbarwidget.h +++ b/app/statusbarwidget.h @@ -14,32 +14,32 @@ class StatusBarWidget : public QWidget Q_OBJECT public: - explicit StatusBarWidget(MarkdownEditor* editor); - ~StatusBarWidget(); + explicit StatusBarWidget(MarkdownEditor* editor); + ~StatusBarWidget(); public slots: - void update(); - void showLineColumn(bool enabled); + void update(); + void showLineColumn(bool enabled); - void setHtmlAction(QAction *action); - void setStyleActions(QActionGroup *actionGroup); + void setHtmlAction(QAction *action); + void setStyleActions(QActionGroup *actionGroup); private slots: void cursorPositionChanged(); - void textChanged(); + void textChanged(); - void styleContextMenu(const QPoint &pos); - void updateStyleLabel(); + void styleContextMenu(const QPoint &pos); + void updateStyleLabel(); private: MarkdownEditor* m_editor; QLabel *m_lineColLabel; - QLabel *m_wordCountLabel; + QLabel *m_wordCountLabel; - QLabel *m_styleLabel; + QLabel *m_styleLabel; - QActionGroup *m_styleActions; + QActionGroup *m_styleActions; ActiveLabel *m_htmlLabel; }; From 372d1b108e60d2123305107b1d4ea5693d19ea5f Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Wed, 9 Mar 2016 22:21:32 +0100 Subject: [PATCH 60/74] correct column position in multi-line (wrapped line) as suggested by cloose --- app/statusbarwidget.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/statusbarwidget.cpp b/app/statusbarwidget.cpp index 2b53586b..6591af32 100644 --- a/app/statusbarwidget.cpp +++ b/app/statusbarwidget.cpp @@ -98,11 +98,8 @@ void StatusBarWidget::cursorPositionChanged() { QTextCursor cursor = m_editor->textCursor(); - // TODO Fix it, when line wraps to multiline (too narrow window for example - // then this line count will be wrong. - // possible solution: http://stackoverflow.com/questions/15814776/how-do-i-get-the-actual-visible-cursors-line-number int line = cursor.blockNumber(); - int column = cursor.columnNumber(); + int column = cursor.positionInBlock(); m_lineColLabel->setText(tr("Line %1, Column %2 %3") .arg(QLocale().toString(line + 1)) From 084e72ffa3b634f9a5453361655525cab4f44aa8 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Thu, 10 Mar 2016 12:05:25 +0100 Subject: [PATCH 61/74] RecentFiles: Always use absolute path Fixes: #256 Signed-off-by: Jason A. Donenfeld --- app/controls/recentfilesmenu.cpp | 8 ++++++-- app/mainwindow.cpp | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/controls/recentfilesmenu.cpp b/app/controls/recentfilesmenu.cpp index 32233add..50d79f83 100644 --- a/app/controls/recentfilesmenu.cpp +++ b/app/controls/recentfilesmenu.cpp @@ -17,6 +17,7 @@ #include "recentfilesmenu.h" #include +#include #include RecentFilesMenu::RecentFilesMenu(QWidget *parent) : @@ -52,9 +53,12 @@ void RecentFilesMenu::saveState() const void RecentFilesMenu::addFile(const QString &fileName) { + QFileInfo fileInfo(fileName); + QString absoluteNativeFileName(QDir::toNativeSeparators(fileInfo.absoluteFilePath())); + // add file to top of list - recentFiles.removeAll(fileName); - recentFiles.prepend(fileName); + recentFiles.removeAll(absoluteNativeFileName); + recentFiles.prepend(absoluteNativeFileName); // remove last entry if list contains more than 10 entries if (recentFiles.size() > 10) { diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 71205398..1c21dacf 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -242,7 +242,7 @@ bool MainWindow::fileSave() setWindowModified(false); // add to recent file list - recentFilesMenu->addFile(QDir::toNativeSeparators(fileName)); + recentFilesMenu->addFile(fileName); } return success; @@ -806,7 +806,7 @@ bool MainWindow::load(const QString &fileName) setFileName(fileName); // add to recent files - recentFilesMenu->addFile(QDir::toNativeSeparators(fileName)); + recentFilesMenu->addFile(fileName); return true; } From 9df29cfe1c762379e2ee0db3e074967fa4e6acaa Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Thu, 10 Mar 2016 13:07:39 +0100 Subject: [PATCH 62/74] Fix compile warnings by changing init order --- app/options.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/options.cpp b/app/options.cpp index 3c04b24d..14ba8da0 100644 --- a/app/options.cpp +++ b/app/options.cpp @@ -63,9 +63,6 @@ static const char* DEPRECATED__LAST_USED_STYLE = "general/lastusedstyle"; Options::Options(QObject *parent) : QObject(parent), m_tabWidth(8), - m_lineColumnEnabled(true), - m_rulerEnabled(false), - m_rulerPos(80), m_proxyMode(NoProxy), m_proxyPort(0), m_autolinkEnabled(true), @@ -83,6 +80,9 @@ Options::Options(QObject *parent) : m_sourceAtSingleSizeEnabled(true), m_spellingCheckEnabled(true), m_diagramSupportEnabled(false), + m_lineColumnEnabled(true), + m_rulerEnabled(false), + m_rulerPos(80), m_markdownConverter(DiscountMarkdownConverter), m_lastUsedTheme(THEME_DEFAULT) { From 2269cefcc2e9a2cf58f1685016f97e38a9163e56 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Thu, 10 Mar 2016 14:21:41 +0100 Subject: [PATCH 63/74] [#273] only initialize model if file explorer dock is visible Only initialize the file system model if the file explorer dock is visible. Should fix #273. --- app/controls/fileexplorerwidget.cpp | 11 +++++++++-- app/controls/fileexplorerwidget.h | 4 ++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/controls/fileexplorerwidget.cpp b/app/controls/fileexplorerwidget.cpp index 22704ce0..c83439a3 100644 --- a/app/controls/fileexplorerwidget.cpp +++ b/app/controls/fileexplorerwidget.cpp @@ -27,14 +27,13 @@ class FileSortFilterProxyModel : public QSortFilterProxyModel FileExplorerWidget::FileExplorerWidget(QWidget *parent) : QWidget(parent), + initialized(false), ui(new Ui::FileExplorerWidget), model(new QFileSystemModel(this)), sortModel(new FileSortFilterProxyModel(this)) { ui->setupUi(this); - model->setRootPath(""); - sortModel->setDynamicSortFilter(true); sortModel->setSourceModel(model); @@ -51,6 +50,14 @@ FileExplorerWidget::~FileExplorerWidget() delete ui; } +void FileExplorerWidget::showEvent(QShowEvent *event) +{ + if (!initialized) { + model->setRootPath(""); + initialized = true; + } +} + void FileExplorerWidget::fileOpen(const QModelIndex &index) { QFileInfo info = model->fileInfo(sortModel->mapToSource(index)); diff --git a/app/controls/fileexplorerwidget.h b/app/controls/fileexplorerwidget.h index 4d931781..345b04af 100644 --- a/app/controls/fileexplorerwidget.h +++ b/app/controls/fileexplorerwidget.h @@ -21,10 +21,14 @@ class FileExplorerWidget : public QWidget signals: void fileSelected(const QString &filePath); +protected: + void showEvent(QShowEvent *event); + private slots: void fileOpen(const QModelIndex &index); private: + bool initialized; Ui::FileExplorerWidget *ui; QFileSystemModel *model; QSortFilterProxyModel *sortModel; From 432e0484836b146a92b7bd2e5eb39a8894be41c2 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Fri, 11 Mar 2016 18:21:12 +0100 Subject: [PATCH 64/74] [#97] Use native line ending during file saving Use QUIDevice::Text to enforce the native line ending during the file saving. Fixes #97 --- app/mainwindow.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index f8e31c34..1a4f8adf 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -226,7 +226,12 @@ bool MainWindow::fileSave() return fileSaveAs(); } - QTextDocumentWriter writer(fileName, "plaintext"); + QFile file(fileName); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + return false; + } + + QTextDocumentWriter writer(&file, "plaintext"); bool success = writer.write(ui->plainTextEdit->document()); if (success) { // set status to unmodified @@ -861,7 +866,7 @@ bool MainWindow::load(const QString &fileName) // open file QFile file(fileName); - if (!file.open(QFile::ReadOnly)) { + if (!file.open(QFile::ReadOnly | QIODevice::Text)) { return false; } From ce37b3845b9de8b3c6cade160e08cbb46c427b83 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Fri, 11 Mar 2016 19:22:33 +0100 Subject: [PATCH 65/74] [#285] safely write files Use QSaveFile to safely write the file to disk. Fixes #285 --- app/app.pro | 3 ++- app/mainwindow.cpp | 5 ++++- app/savefileadapter.h | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 app/savefileadapter.h diff --git a/app/app.pro b/app/app.pro index a6859114..32e6eb70 100644 --- a/app/app.pro +++ b/app/app.pro @@ -96,7 +96,8 @@ HEADERS += \ imagetooldialog.h \ snippetcompleter.h \ snippetstablemodel.h \ - aboutdialog.h + aboutdialog.h \ + savefileadapter.h FORMS += \ mainwindow.ui \ diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index 1a4f8adf..e633a084 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -64,6 +64,7 @@ #include "options.h" #include "optionsdialog.h" #include "revealviewsynchronizer.h" +#include "savefileadapter.h" #include "snippetcompleter.h" #include "tabletooldialog.h" @@ -226,7 +227,7 @@ bool MainWindow::fileSave() return fileSaveAs(); } - QFile file(fileName); + SaveFileAdapter file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { return false; } @@ -234,6 +235,8 @@ bool MainWindow::fileSave() QTextDocumentWriter writer(&file, "plaintext"); bool success = writer.write(ui->plainTextEdit->document()); if (success) { + file.commit(); + // set status to unmodified ui->plainTextEdit->document()->setModified(false); setWindowModified(false); diff --git a/app/savefileadapter.h b/app/savefileadapter.h new file mode 100644 index 00000000..0fbb7e89 --- /dev/null +++ b/app/savefileadapter.h @@ -0,0 +1,38 @@ +/* + * Copyright 2016 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef SAVEFILEADAPTER_H +#define SAVEFILEADAPTER_H + +#include + + +class SaveFileAdapter : public QSaveFile +{ +public: + SaveFileAdapter(const QString &name) : + QSaveFile(name) + { + } + + void close() { + // IGNORE - work-around for the problem that QTextDocumentWriter::write() + // calls close() on the device + } + +}; + +#endif // SAVEFILEADAPTER_H From 9682d7235eb00d2e35ef336cd8ea25858e94059d Mon Sep 17 00:00:00 2001 From: Kolcha Date: Sat, 19 Mar 2016 20:09:59 +0300 Subject: [PATCH 66/74] fixed build --- app/markdowneditor.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/markdowneditor.cpp b/app/markdowneditor.cpp index dc5b2927..3ea9e4bd 100644 --- a/app/markdowneditor.cpp +++ b/app/markdowneditor.cpp @@ -524,13 +524,13 @@ void MarkdownEditor::drawRuler(QPaintEvent *e) // calculate vertical offset corresponding given // column margin in font metrics - int verticalOffset = round(QFontMetricsF(font).averageCharWidth() * rulerPos) + int verticalOffset = qRound(QFontMetricsF(font).averageCharWidth() * rulerPos) + contentOffset().x() + document()->documentMargin(); // draw a ruler with color invert to background color (better readability) // and with 50% opacity - QPainter p(viewport()); + QPainter p(viewport()); p.setCompositionMode(QPainter::RasterOp_SourceXorDestination); p.setPen(QColor(0xff, 0xff, 0xff)); p.setOpacity(0.5); @@ -589,7 +589,7 @@ QStringList MarkdownEditor::filterWordList(const QStringList &words, UnaryPredic foreach (const QString &word, words) { if (predicate(word)) { - filteredWordList << word; + filteredWordList << word; } } From 3d41060993dcdfedbf19e880ceae869795c46c26 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Mon, 28 Mar 2016 11:02:35 +0200 Subject: [PATCH 67/74] Bump version to v0.11.3 --- CuteMarkEd.wxs | 2 +- app/main.cpp | 2 +- rpm/cutemarked.spec | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CuteMarkEd.wxs b/CuteMarkEd.wxs index 037c3c51..8143ae75 100644 --- a/CuteMarkEd.wxs +++ b/CuteMarkEd.wxs @@ -2,7 +2,7 @@ - + 0.11.3-1 +- New patch version 0.11.3 released + * Fri Jan 01 2016 Christian Loose 0.11.2-1 - New patch version 0.11.2 released From f9faab38bebcfd83085a64f63f58d22a3843d4cd Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Thu, 10 Mar 2016 12:05:25 +0100 Subject: [PATCH 68/74] RecentFiles: Always use absolute path Fixes: #256 Signed-off-by: Jason A. Donenfeld --- app/controls/recentfilesmenu.cpp | 8 ++++++-- app/mainwindow.cpp | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/controls/recentfilesmenu.cpp b/app/controls/recentfilesmenu.cpp index 32233add..50d79f83 100644 --- a/app/controls/recentfilesmenu.cpp +++ b/app/controls/recentfilesmenu.cpp @@ -17,6 +17,7 @@ #include "recentfilesmenu.h" #include +#include #include RecentFilesMenu::RecentFilesMenu(QWidget *parent) : @@ -52,9 +53,12 @@ void RecentFilesMenu::saveState() const void RecentFilesMenu::addFile(const QString &fileName) { + QFileInfo fileInfo(fileName); + QString absoluteNativeFileName(QDir::toNativeSeparators(fileInfo.absoluteFilePath())); + // add file to top of list - recentFiles.removeAll(fileName); - recentFiles.prepend(fileName); + recentFiles.removeAll(absoluteNativeFileName); + recentFiles.prepend(absoluteNativeFileName); // remove last entry if list contains more than 10 entries if (recentFiles.size() > 10) { diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index e633a084..3234c968 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -242,7 +242,7 @@ bool MainWindow::fileSave() setWindowModified(false); // add to recent file list - recentFilesMenu->addFile(QDir::toNativeSeparators(fileName)); + recentFilesMenu->addFile(fileName); } return success; @@ -884,7 +884,7 @@ bool MainWindow::load(const QString &fileName) setFileName(fileName); // add to recent files - recentFilesMenu->addFile(QDir::toNativeSeparators(fileName)); + recentFilesMenu->addFile(fileName); return true; } From d091c22e2a2848a5a7110e8d88efeab142f53617 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Mon, 28 Mar 2016 11:15:05 +0200 Subject: [PATCH 69/74] Update Russian translations --- app/translations/cutemarked_ru.ts | 743 ++++++++++++++++++++---------- 1 file changed, 492 insertions(+), 251 deletions(-) diff --git a/app/translations/cutemarked_ru.ts b/app/translations/cutemarked_ru.ts index 1c4e307d..e55cc45e 100644 --- a/app/translations/cutemarked_ru.ts +++ b/app/translations/cutemarked_ru.ts @@ -1,4 +1,151 @@ + + AboutDialog + + + About CuteMarkEd + О CuteMarkEd + + + + &About + &О программе + + + + A&uthors + &Авторы + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Christian Loose (cloose)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and maintainer</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Jörg Preiß (Slesa)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Andreas Reischuck (arBmind)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Aetf (Aetf)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Pavel Fric (Fri)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Czech translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Hu Junqing (LearnShare)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Chinese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Γιάννης Ανθυμίδης (Evropi)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Greek translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Etienne Gauvin (Etn)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">French translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Rémi Verschelde (akien-mga)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">French translation and Mageia package</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Kota Ouchi (kOtaOuchi)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Norihide Sugohara (touyou)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Eai</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Javier (moguman)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Spanish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Cassio Cardoso (cassiocardoso)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Portuguese (Brazil) translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Victor Nogueira (felladrin)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Portuguese (Brazil) translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Maxim Efremov (maxbart)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Russian translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Bedouin</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Indonesian translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Mljjlm</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Danish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Christian Loose (cloose)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and maintainer</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Jörg Preiß (Slesa)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Andreas Reischuck (arBmind)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Aetf (Aetf)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Code contributor</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Pavel Fric (Fri)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Czech translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Hu Junqing (LearnShare)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Chinese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Γιάννης Ανθυμίδης (Evropi)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Greek translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Etienne Gauvin (Etn)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">French translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Rémi Verschelde (akien-mga)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">French translation and Mageia package</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Kota Ouchi (kOtaOuchi)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Norihide Sugohara (touyou)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Eai</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Japanese translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Javier (moguman)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Spanish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Cassio Cardoso (cassiocardoso)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Portuguese (Brazil) translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Victor Nogueira (felladrin)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Portuguese (Brazil) translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Maxim Efremov (maxbart)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Russian translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Bedouin</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Indonesian translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Mljjlm</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Danish translation</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> + + + + &Thanks To + &Благодарности + + + + Qt-based, free and open source markdown editor with live HTML preview + Бесплатный редактор синтаксиса Markdown с предпросмотром в HTML, написанный на Qt и с открытым исходным кодом + + ExportHtmlDialog @@ -19,7 +166,7 @@ <html><head/><body><p>embed the current CSS style into the exported HTML</p></body></html> - <html><head/><body><p>вставить текущий стиль CSS в экспортируемый HTML</p></body></html> + <html><head/><body><p>встроить текущий стиль CSS в экспортируемый HTML</p></body></html> @@ -62,12 +209,12 @@ Paper Size: - Размер бумаги + Размер бумаги: Orientation: - Положение + Ориентация: @@ -87,12 +234,12 @@ Letter (8.5 x 11 inches, 215.9 x 279.4 mm) - Письмо (8.5 x 11 дюймов, 215.9 x 279.4 мм) + Letter (8.5 x 11 дюймов, 215.9 x 279.4 мм) Legal (8.5 x 14 inches, 215.9 x 355.6 mm) - Legal (8.5 x 14 дюймов, 215.9 x 355.6 мм) + Legal (8.5 x 14 дюймов, 215.9 x 355.6 mm) @@ -138,45 +285,49 @@ Найти - + Find: Найти: - - - ... - ... - - - + Replace with: Заменить на: - + Replace Заменить - + Replace All Заменить всё - + + ... + ... + + + Case Sensitive С учётом регистра - + Whole Words Only Только слова целиком - + Use Regular Expressions - Использование регулярных выражений + Использовать регулярные выражения + + + + Find Options + Найти опции @@ -204,12 +355,12 @@ Alternate Text: - Другой текст: + Альтернативный текст: Optional Title: - Дополнительное описание: + Дополнительный заголовок: @@ -234,7 +385,7 @@ MainWindow - + about:blank about:blank @@ -250,14 +401,14 @@ - Format - Формат + F&ormat + Verb "to format". sub menu title to choose a formatting like bold, italic. + &Формат - - Find/Replace - Найти/Заменить + &Find/Replace + &Найти/Заменить @@ -272,486 +423,498 @@ E&xtras - Дополнительно + &Дополнительно - Styles - Стили + St&yles + С&тили - Markdown Extensions + Markdown E&xtensions Расширения Markdown - Languages - Языки + &Languages + &Языки - + Table of contents Оглавление - - + Markdown Syntax - Синтаксис Markdown + Markdown синтаксис - - + + qrc:/syntax.html qrc:/syntax.html - + + File Explorer + Навигация по файлам + + + E&xit Вы&ход - + &New &Новый - + &Open... &Открыть... - + &Save &Сохранить - + Save &As... Сохранить &как... - + &Undo &Отменить - + &Redo &Повторить - + Default Стандартный - + Ctrl+1 Ctrl+1 - + Github Гитхаб - + Ctrl+2 Ctrl+2 - + Solarized Light Ясный Светлый - + Ctrl+3 Ctrl+3 - + Solarized Dark Ясный Тёмный - + Ctrl+4 Ctrl+4 - + &About CuteMarkEd... &О CuteMarkEd... - - Export to HTML... - Экспорт в HTML... + + Export to &HTML... + Экспо&рт в HTML... - - Export to PDF... - Экспорт в PDF... + + &Export to PDF... + Экспор&т в PDF... - + Split 1:1 Размер 1:1 - + Split 2:1 Размер 2:1 - + Split 1:2 Размер 1:2 - + Split 3:1 Размер 3:1 - + Split 1:3 Размер 1:3 - - Copy HTML to Clipboard - Копировать HTML в буфер + + Copy &HTML to Clipboard + Коп&ировать HTML код - + Cu&t Вырез&ать - + &Copy &Копировать - + &Paste &Вставить - + Strong - Изысканный + Жирный - + Emphasize - Подчеркнутый + Курсив - + &Print... &Печать - - + + Strikethrough Зачёркнутый - + Inline Code Инлайн код - - Math Support - Поддержка формул + + &Math Support + Поддержка &формул - - Code Highlighting - Подсветка кода + + Code &Highlighting + Подсветка &кода - + Clearness Ясный - + Ctrl+5 Ctrl+5 - + Clearness Dark Ясный Тёмный - + Ctrl+6 Ctrl+6 - - Go to Line + + Find/Replace + Найти/Заменить + + + + Go to &Line Перейти к строке - + Ctrl+L Ctrl+L - + Center Paragraph - Центр параграфа + Центрировать параграф - + Hard Linebreak - Жесткий разрыв линий + Жёсткий разрыв линий - + Ctrl+Return Ctrl+Enter - + Find Next Найти далее - + Find Previous Найти до - - Full Screen Mode + + &Full Screen Mode Полноэкранный режим - + Blockquote - Цитирование + Цитата - - Ctrl+Q - Ctrl+Q + + Ctrl+Shift+Q + Ctrl+Shift+Q - - - - - HTML preview - Предпросмотр HTML + + &Markdown Syntax + Markdown &синтаксис - + + HTML &Preview + &Предпросмотр HTML + + + F5 F5 - - Show Special Characters + + &Show Special Characters Option to show characters like line feed or tabs - Показать специальные символы + &Показывать специальные символы - - Options... - Опции... + + &Options... + &Опции... - + Autolink Автоссылка - + Alphabetic Lists По алфавиту - + Definition Lists По определению - + SmartyPants SmartyPants - + Language Язык - - Check Spelling - Проверка орфографии + + &Check Spelling + Проверка &орфографии - + Increase Header Level Увеличить уровень заголовка - + Alt+Right Alt+Вправо - + Decrease Header Level Понизить уровень заголовка - + Alt+Left Alt+Влево - + Insert Table... Вставить таблицу... - + Ctrl+T Ctrl+T - + Byword Dark Byword Dark - + Ctrl+7 Ctrl+7 - - Insert Image... - Вставить изображение... + + Insert &Image... + Вставить &изображение... - - Ctrl+G - Ctrl+G + + Ctrl+Shift+I + Ctrl+Shift+I - - Horizontal Layout - Горизонтальный слой + + &Horizontal Layout + &Горизонтальный вид - + Footnotes Примечания - + Superscript Верхний индекс - - Word Wrap - Перенос по словам + + &Word Wrap + Перенос по &словам - - :/markdown-snippets.json - path to built-in snippets resource. - :/markdown-snippets.json + + Ignore Y&AML Header + &Игнорировать YAML заголовок - + + &Diagram Support + Поддержка &диаграмм + + + Open File... Открыть файл... - - - Markdown Files (*.markdown *.md);;All Files (*) + + + Markdown Files (*.markdown *.md *.mdown);;All Files (*) Файлы Markdown (*.markdown *.md);;Все файлы (*) - + Save as... Сохранить как... - + Print Document Печать документа - + Go to... Перейти... - + Line: Line number in the Markdown editor Строка: - - About CuteMarkEd - О CuteMarkEd - - - - <p><b>CuteMarkEd %1</b><br>Qt-based, free and open source markdown editor with live HTML preview<br>Copyright 2013 Christian Loose</p><p><a href="http://cloose.github.io/CuteMarkEd">http://cloose.github.io/CuteMarkEd</a></p> - <p><b>CuteMarkEd %1</b><br>Бесплатный редактор с подсветкой исходного кода и с живым просмотром HTML, написанный на QT<br>Авторские права 2013 Christian Loose</p><p><a href="http://cloose.github.io/CuteMarkEd">http://cloose.github.io/CuteMarkEd</a></p> + + + + HTML preview + Предпросмотр HTML - - + + HTML source Исходный код HTML - + %1 words %1 слов - + Lines: %1 Words: %2 Characters: %3 Линий: %1 Слов: %2 Символов: %3 - + Change Preview Style Сменить стиль предпросмотра - + Save Changes Сохранить изменения - + The document has been modified.<br>Do you want to save your changes? Документ был изменён.<br>Вы хотите сохранить изменения? - + untitled.md default file name for new markdown documents untitled.md @@ -760,20 +923,19 @@ MarkdownEditor - - Ctrl+Space - Complete - Ctrl+Пробел + + Snippet Complete + Шаблон завершен - + Suggestions Предложения - + Add to User Dictionary - Добавить в словарь + Добавить в словарь пользователя @@ -785,131 +947,202 @@ - General - Основные + &General + &Основные Markdown Converter - Конвертер Markdown + Markdown конвертер - Converter Library: - Конвертер Библиотеки: + Converter &Library: + &Библиотека конвертера: - + Discount (Default) Name of a Markdown to HTML converter library - Скидка (по умолчанию) + Discount (по-умолчанию) - + Hoedown Name of a Markdown to HTML converter library Hoedown - - Editor - Редактор + + Reveal.js (Presentation) + Reveal.js (Презентация) - + + &Editor + &Редактор + + + Font Шрифт - - Family: + + &Family: Гарнитура: - - Size: - Размер + + Si&ze: + Размер: - + Tabs - Отступ + Отступы - - Tab width: - Ширина отступа: + + &Tab width: + &Ширина отступа: - - Internet - Интернет + + &HTML Preview + &Предпросмотр HTML - + + Fonts + Шрифт + + + + S&tandard Font: + &Стандартный: + + + + + Size: + Размер: + + + + Se&rif Font: + С &засечками: + + + + S&ans Serif Font: + &Без засечек: + + + + &Fixed Font: + &Фиксированный: + + + + &Internet + &Интернет + + + Configure Proxy to Access the Internet - Настроить Прокси для доступа к интернету + Настройки прокси для доступа к интернет - - No proxy - Без прокси + + No prox&y + &Без прокси - - Use system proxy settings - Использвать системные настройки прокси + + &Use system proxy settings + Испо&льзовать системные настройки прокси - - Manual proxy configuration: - Указать прокси вручную: + + &Manual proxy configuration: + &Указать прокси вручную: - - Host: - Хост: + + H&ost: + &Хост: - - Port: - Порт: + + &Port: + П&орт: - - User Name: - Имя пользователя: + + User &Name: + &Имя пользователя: - - Password: - Пароль: + + Pass&word: + &Пароль: - - Snippets - Сниппеты + + &Snippets + &Шаблоны - - Add - Добавить + + &Add + &Добавить - - Remove - Удалить + + &Remove + &Удалить - + + Short&cuts + Сочетания &клавиш + + + + Action + Действие + + + + Shortcut + Сочетание клавиш + + + + Default + По-умолчанию + + + Error Title of error message box Ошибка - + No snippet selected. - Не выбраны сниппеты + Шаблон не выбран + + + + Conflict + Конфликт + + + + This shortcut is already used for "%1" + Это сочетание клавиш уже используется для "%1" @@ -928,23 +1161,23 @@ SnippetsTableModel - + Error Title of error message box Ошибка - + Not a valid trigger. Недопустимый триггер. - + Trigger Триггер - + Description Описание @@ -959,12 +1192,12 @@ Rows: - Строк: + Строки: Columns: - Столбцов: + Столбцы: @@ -997,4 +1230,12 @@ Справа + + main + + + The file to open. + Файл для чтения. + + \ No newline at end of file From 55e7bf1c301e3919ef08ed51ac76f094e6fbc404 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Mon, 28 Mar 2016 12:20:53 +0200 Subject: [PATCH 70/74] Update README for v0.11.3 --- README.md | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6cd17385..ca2b81c1 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ A Qt-based, free and open source markdown editor with live HTML preview, math ex ### DOWNLOAD -[Sources](https://github.com/cloose/CuteMarkEd/archive/v0.11.2.tar.gz) -[MS Windows (Installer)](http://dl.bintray.com/cloose/CuteMarkEd/cutemarked-0.11.2.msi) -[MS Windows (ZIP file)](http://dl.bintray.com/cloose/CuteMarkEd/cutemarked-0.11.2.zip) +[Sources](https://github.com/cloose/CuteMarkEd/archive/v0.11.3.tar.gz) +[MS Windows (Installer)](http://dl.bintray.com/cloose/CuteMarkEd/cutemarked-0.11.3.msi) +[MS Windows (ZIP file)](http://dl.bintray.com/cloose/CuteMarkEd/cutemarked-0.11.3.zip) [OpenSUSE 13.2 (RPM)](https://build.opensuse.org/project/show?project=home%3Acloose1974) [Fedora 20 (RPM)](https://build.opensuse.org/project/show?project=home%3Acloose1974) [Fedora 21 (RPM)](https://build.opensuse.org/project/show?project=home%3Acloose1974) @@ -19,6 +19,20 @@ A Qt-based, free and open source markdown editor with live HTML preview, math ex ### NEWS +#### Version 0.11.3 + +Improvements: + +* `IMPROVED` Update Russian translation + +Fixes: + +* `FIXED` Missing links in exported PDF file (#275) +* `FIXED` Use of non-native line endings when a file is saved (#97) +* `FIXED` Corrupt files on system crashes or running out of disk space (#285) +* `FIXED` Accessing all drives although the file explorer is not visible (#273) +* `FIXED` Relative paths in recently used files menu (#256) + #### Version 0.11.2 Improvements: @@ -81,7 +95,7 @@ Fixes: ### DEPENDENCIES -* [Qt 5.2](http://qt-project.org) (LGPL v2.1) +* [Qt 5.4](http://qt-project.org) (LGPL v2.1) * [Discount 2.1.7](http://www.pell.portland.or.us/~orc/Code/discount/) (3-clause BSD) * [PEG Markdown Highlight](http://hasseg.org/peg-markdown-highlight/) (MIT License) * [hunspell 1.3.2](http://hunspell.sourceforge.net/) (LGPL v2.1) From a6fa7b0a0f330a6ca79fc3267cd46c96f0401b34 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Mon, 28 Mar 2016 13:18:15 +0200 Subject: [PATCH 71/74] Update WiX configuration for Qt 5.4 --- CuteMarkEd.wxs | 51 +++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/CuteMarkEd.wxs b/CuteMarkEd.wxs index 8143ae75..48e2ac3a 100644 --- a/CuteMarkEd.wxs +++ b/CuteMarkEd.wxs @@ -3,22 +3,22 @@ - - @@ -26,11 +26,10 @@ DowngradeErrorMessage="CuteMarkEd is already installed with a higher version." AllowSameVersionUpgrades="yes" /> - - + + - @@ -39,7 +38,7 @@ - + @@ -80,13 +79,14 @@ + - - - + + + @@ -110,12 +110,6 @@ - - - - - - @@ -132,7 +126,7 @@ - + @@ -142,14 +136,17 @@ + + + @@ -168,10 +165,15 @@ + + + + + @@ -179,11 +181,10 @@ - + - @@ -201,7 +202,7 @@ - + 1 - + From 1988b0bb4cb7d84ef35dac770118b1cc8b02f2d5 Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Mon, 28 Mar 2016 15:19:18 +0200 Subject: [PATCH 72/74] Replace #ifdefs with custom spellchecker.cpp for OSX --- app/app.pro | 5 +++ app/hunspell/spellchecker_macx.cpp | 54 ++++++++++++++++++++++++++++++ app/hunspell/spellchecker_unix.cpp | 6 +--- 3 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 app/hunspell/spellchecker_macx.cpp diff --git a/app/app.pro b/app/app.pro index 9d85cdf8..fcc8524a 100644 --- a/app/app.pro +++ b/app/app.pro @@ -73,6 +73,11 @@ win32 { hunspell/spellchecker_win.cpp } +macx { + SOURCES += \ + hunspell/spellchecker_macx.cpp +} + unix { SOURCES += \ hunspell/spellchecker_unix.cpp diff --git a/app/hunspell/spellchecker_macx.cpp b/app/hunspell/spellchecker_macx.cpp new file mode 100644 index 00000000..18e8e753 --- /dev/null +++ b/app/hunspell/spellchecker_macx.cpp @@ -0,0 +1,54 @@ +/* + * Copyright 2016 Christian Loose + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "spellchecker.h" +using hunspell::SpellChecker; + +#include +#include +#include +#include + +#include + +QMap SpellChecker::availableDictionaries() +{ + QMap dictionaries; + + QStringList paths; + paths << (qApp->applicationDirPath() + "/../Resources/dictionaries"); + + foreach (const QString &path, paths) { + QDir dictPath(path); + dictPath.setFilter(QDir::Files); + dictPath.setNameFilters(QStringList() << "*.dic"); + if (dictPath.exists()) { + // loop over all dictionaries in directory + QDirIterator it(dictPath); + while (it.hasNext()) { + it.next(); + + QString language = it.fileName().remove(".dic"); + language.truncate(5); // just language and country code + + Dictionary dict(it.fileName(), it.filePath()); + dictionaries.insert(language, dict); + } + } + } + + return dictionaries; +} diff --git a/app/hunspell/spellchecker_unix.cpp b/app/hunspell/spellchecker_unix.cpp index 189e029f..3f521135 100644 --- a/app/hunspell/spellchecker_unix.cpp +++ b/app/hunspell/spellchecker_unix.cpp @@ -29,7 +29,6 @@ QMap SpellChecker::availableDictionaries() QMap dictionaries; QStringList paths; -#ifdef Q_OS_LINUX // Debian paths << QStringLiteral("/usr/local/share/myspell/dicts") << QStringLiteral("/usr/share/myspell/dicts"); @@ -40,10 +39,7 @@ QMap SpellChecker::availableDictionaries() // Fedora paths << QStringLiteral("/usr/local/share/myspell") << QStringLiteral("/usr/share/myspell"); -#endif -#ifdef Q_OS_OSX - paths << (qApp->applicationDirPath() + "/../Resources/dictionaries"); -#endif + foreach (const QString &path, paths) { QDir dictPath(path); dictPath.setFilter(QDir::Files); From 571636caf87710d92e4e5c0cc8ba734c297b87df Mon Sep 17 00:00:00 2001 From: Christian Loose Date: Fri, 29 Apr 2016 21:32:37 +0200 Subject: [PATCH 73/74] Fix CI build on Appveyor --- appveyor.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index f97d735b..8915dab1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,3 @@ -os: MinGW - branches: except: - gh-pages @@ -9,7 +7,7 @@ environment: MINGW_DIR: C:\Qt\Tools\mingw491_32 install: - - set PATH=%PATH%;%QTDIR%\bin;%MINGW_DIR%\bin + - set PATH=%QTDIR%\bin;%MINGW_DIR%\bin;%PATH% - git submodule update --init --recursive before_build: From d33ad9b4819c3d91161b4349b4ec19b1ce775cc9 Mon Sep 17 00:00:00 2001 From: Kolcha Date: Thu, 18 Aug 2016 04:56:12 +0300 Subject: [PATCH 74/74] -2 warnings about unused variables --- app-static/completionlistmodel.cpp | 1 + app/controls/fileexplorerwidget.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/app-static/completionlistmodel.cpp b/app-static/completionlistmodel.cpp index 5d990017..770c38b6 100644 --- a/app-static/completionlistmodel.cpp +++ b/app-static/completionlistmodel.cpp @@ -27,6 +27,7 @@ CompletionListModel::CompletionListModel(QObject *parent) : int CompletionListModel::rowCount(const QModelIndex &parent) const { + Q_UNUSED(parent); return snippets.count() + words.count(); } diff --git a/app/controls/fileexplorerwidget.cpp b/app/controls/fileexplorerwidget.cpp index c83439a3..ebfd5a70 100644 --- a/app/controls/fileexplorerwidget.cpp +++ b/app/controls/fileexplorerwidget.cpp @@ -56,6 +56,7 @@ void FileExplorerWidget::showEvent(QShowEvent *event) model->setRootPath(""); initialized = true; } + QWidget::showEvent(event); } void FileExplorerWidget::fileOpen(const QModelIndex &index)