From 60e22558862a786c8ac3295ac9ed50227abace09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 12 Sep 2022 19:24:41 +0200 Subject: [PATCH 01/78] Fix infinite loop when propagateFolderUpdatesToParent is invoked using the root folder --- YACReaderLibrary/db_helper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index c5e99ada..1323abad 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -731,7 +731,7 @@ void DBHelper::propagateFolderUpdatesToParent(const Folder &folder, QSqlDatabase { auto currentParentId = folder.parentId; auto currentId = folder.id; - while (currentParentId != 1) { + while (currentParentId != 1 && currentParentId != 0) { // currentParentId is 0 if `folder` is the root folder auto f = loadFolder(currentParentId, db); currentParentId = f.parentId; currentId = f.id; From bc35b5d65f4c005db58ba3f47f48586892c8284c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Wed, 7 Sep 2022 16:53:52 +0200 Subject: [PATCH 02/78] Fix QML in Qt6 This means having two versions of everything, the idea is to migrate to Qt6, test that everything works fine and drop Qt5 as soon as possible. --- YACReaderLibrary/YACReaderLibrary.pro | 6 +- YACReaderLibrary/qml/FlowView6.qml | 221 ++++++ YACReaderLibrary/qml/GridComicsView6.qml | 895 +++++++++++++++++++++++ YACReaderLibrary/qml/InfoFavorites6.qml | 32 + YACReaderLibrary/qml/InfoRating6.qml | 48 ++ YACReaderLibrary/qml/InfoTick6.qml | 28 + YACReaderLibrary/qml6.qrc | 30 + config.pri | 2 +- 8 files changed, 1260 insertions(+), 2 deletions(-) create mode 100644 YACReaderLibrary/qml/FlowView6.qml create mode 100644 YACReaderLibrary/qml/GridComicsView6.qml create mode 100644 YACReaderLibrary/qml/InfoFavorites6.qml create mode 100644 YACReaderLibrary/qml/InfoRating6.qml create mode 100644 YACReaderLibrary/qml/InfoTick6.qml create mode 100644 YACReaderLibrary/qml6.qrc diff --git a/YACReaderLibrary/YACReaderLibrary.pro b/YACReaderLibrary/YACReaderLibrary.pro index 29329c79..ba626f04 100644 --- a/YACReaderLibrary/YACReaderLibrary.pro +++ b/YACReaderLibrary/YACReaderLibrary.pro @@ -294,7 +294,11 @@ HEADERS += grid_comics_view.h \ SOURCES += grid_comics_view.cpp \ comics_view_transition.cpp -RESOURCES += qml.qrc +greaterThan(QT_MAJOR_VERSION, 5) { + RESOURCES += qml6.qrc +} else { + RESOURCES += qml.qrc +} win32:RESOURCES += qml_win.qrc unix:!macx:RESOURCES += qml_win.qrc macx:RESOURCES += qml_osx.qrc diff --git a/YACReaderLibrary/qml/FlowView6.qml b/YACReaderLibrary/qml/FlowView6.qml new file mode 100644 index 00000000..ff8f82f6 --- /dev/null +++ b/YACReaderLibrary/qml/FlowView6.qml @@ -0,0 +1,221 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import Qt5Compat.GraphicalEffects + +import com.yacreader.ComicModel 1.0 + +Rectangle { + id: mainFlowContainer + + property url backgroundImageURL; + + property real backgroundBlurRadius : 100; //85; + property real backgroundBlurOpacity : 0.25; //0.35; + property bool backgroundBlurVisible : true; + + property real additionalBottomSpace : 0; + + property real verticalPadding: 12 + + property real itemsSpacing: 17 + + signal currentCoverChanged(int index) + + Rectangle { + id: background + color: "#2A2A2A" + anchors.fill: backgroundImg + } + + Image { + id: backgroundImg + width: parent.width + height: parent.height + additionalBottomSpace + source: backgroundImage + fillMode: Image.PreserveAspectCrop + smooth: true + mipmap: true + asynchronous : true + cache: false //TODO clear cache only when it is needed + opacity: 0 + visible: false + } + + FastBlur { + anchors.fill: backgroundImg + source: backgroundImg + radius: backgroundBlurRadius + opacity: backgroundBlurOpacity + visible: backgroundBlurVisible + } + + anchors.margins: 0 + + MouseArea { + anchors.fill : list + onWheel: wheel => { + + if(list.moving) + return; + + var ci + if(wheel.angleDelta.y < 0) { + ci = Math.min(list.currentIndex+1, list.count - 1); + } + else if(wheel.angleDelta.y > 0) { + ci = Math.max(0,list.currentIndex-1); + } else { + return; + } + + list.currentIndex = ci; + } + } + + ListView { + id: list + objectName: "list" + anchors.fill: parent + + property int previousIndex; + + orientation: Qt.Horizontal + pixelAligned: true + + model: comicsList + + spacing: itemsSpacing + anchors.leftMargin: Math.floor(verticalPadding * 1.1) + + snapMode: ListView.SnapToItem + + highlightFollowsCurrentItem: true + highlightRangeMode: ListView.StrictlyEnforceRange + preferredHighlightEnd: 50 + + highlightMoveDuration: 250 + + onCurrentIndexChanged: currentIndex => { + if (list.currentIndex !== -1) { + mainFlowContainer.currentCoverChanged(list.currentIndex); + } + } + + delegate: Component { + + //cover + Rectangle { + width: Math.floor((list.height - (verticalPadding * 2)) * 0.65); + height: list.height - (verticalPadding * 2); + anchors.verticalCenter: parent.verticalCenter + + color:"transparent" + + scale: mouseArea.containsMouse ? 1.025 : 1 + + Behavior on scale { + NumberAnimation { duration: 90 } + } + + BusyIndicator { + scale: 0.5 + anchors.centerIn: parent + running: coverElement.status === Image.Loading + } + + DropShadow { + transparentBorder: true + anchors.fill: coverElement + horizontalOffset: 0 + verticalOffset: 0 + radius: 6 + //samples: 17 + color: "#BB000000" + source: coverElement + visible: (Qt.platform.os === "osx") ? false : true; + } + + Image { + id: coverElement + anchors.fill: parent + source: cover_path + fillMode: Image.PreserveAspectCrop + smooth: true + mipmap: true + asynchronous : true + cache: false + } + + + //mark + Image { + id: mark + width: 23 + height: 23 + source: read_column&&show_marks?"tick.png":has_been_opened&&show_marks?"reading.png":"" + anchors {right: coverElement.right; top: coverElement.top; topMargin: 9; rightMargin: 9} + asynchronous : true + } + + //border + Rectangle { + width: coverElement.width + height: coverElement.height + anchors.centerIn: coverElement + color: "transparent" + border { + color: "#30FFFFFF" + width: 1 + } + } + + MouseArea { + id: mouseArea + anchors.fill: parent + acceptedButtons: Qt.LeftButton | Qt.RightButton + + hoverEnabled: true + + onDoubleClicked: { + list.currentIndex = index; + currentIndexHelper.selectedItem(index); + } + + onReleased: mouse => { + list.currentIndex = index; + + if(mouse.button === Qt.RightButton) // context menu is requested + { + var coordinates = mainFlowContainer.mapFromItem(coverElement,mouseX,mouseY) + contextMenuHelper.requestedContextMenu(Qt.point(coordinates.x,coordinates.y)); + } + + mouse.accepted = true; + } + } + } + } + + focus: true + Keys.onPressed: event => { + + if (event.modifiers & Qt.ControlModifier || event.modifiers & Qt.ShiftModifier) + return; + var ci + if (event.key === Qt.Key_Right || event.key === Qt.Key_Down) { + ci = Math.min(list.currentIndex+1, list.count - 1); + } + else if (event.key === Qt.Key_Left || event.key === Qt.Key_Up) { + ci = Math.max(0,list.currentIndex-1); + } else { + return; + } + + list.currentIndex = ci; + + event.accepted = true; + } + + } +} diff --git a/YACReaderLibrary/qml/GridComicsView6.qml b/YACReaderLibrary/qml/GridComicsView6.qml new file mode 100644 index 00000000..316da945 --- /dev/null +++ b/YACReaderLibrary/qml/GridComicsView6.qml @@ -0,0 +1,895 @@ +import QtQuick 2.15 + +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.12 + +import Qt5Compat.GraphicalEffects + +import com.yacreader.ComicModel 1.0 + +import com.yacreader.ComicInfo 1.0 +import com.yacreader.ComicDB 1.0 + +import QtQuick.Controls.Basic + +SplitView { + orientation: Qt.Horizontal + handle: Rectangle { + border.width : 0 + implicitWidth: 10 + color: info_container.color + } + +Rectangle { + id: main + clip: true + + Image { + id: backgroundImg + anchors.fill: parent + source: backgroundImage + fillMode: Image.PreserveAspectCrop + smooth: true + mipmap: true + asynchronous : true + cache: false //TODO clear cache only when it is needed + opacity: 0 + visible: false + } + + FastBlur { + anchors.fill: backgroundImg + source: backgroundImg + radius: backgroundBlurRadius + opacity: backgroundBlurOpacity + visible: backgroundBlurVisible + } + + color: backgroundColor + width: parent.width - (info_container.visible ? info_container.width : 0) + SplitView.fillWidth: true + SplitView.minimumWidth: coverWidth + 100 + height: parent.height + anchors.margins: 0 + + Component { + id: appDelegate + Rectangle + { + id: cell + width: grid.cellWidth + height: grid.cellHeight + color: "#00000000" + + scale: mouseArea.containsMouse ? 1.025 : 1 + + Behavior on scale { + NumberAnimation { duration: 90 } + } + + DropShadow { + anchors.fill: realCell + transparentBorder: true + horizontalOffset: 0 + verticalOffset: 0 + radius: 10.0 + //samples: 17 + color: "#FF000000" + source: realCell + visible: (Qt.platform.os === "osx") ? false : true; + } + + Rectangle { + id: realCell + + property int position : 0 + property bool dragging: false; + Drag.active: mouseArea.drag.active + Drag.hotSpot.x: 32 + Drag.hotSpot.y: 32 + Drag.dragType: Drag.Automatic + //Drag.mimeData: { "x": 1 } + Drag.proposedAction: Qt.CopyAction + Drag.onActiveChanged: { + if(!dragging) + { + dragManager.startDrag(); + dragging = true; + }else + dragging = false; + } + + width: itemWidth + height: itemHeight + + color: ((dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index))?selectedColor:cellColor; + //border.color: ((dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index))?selectedBorderColor:borderColor; + //border.width: ?1:0; + anchors.horizontalCenter: parent.horizontalCenter + + Rectangle + { + id: mouseOverBorder + + property bool commonBorder : false + + property int lBorderwidth : 2 + property int rBorderwidth : 2 + property int tBorderwidth : 2 + property int bBorderwidth : 2 + + property int commonBorderWidth : 1 + + z : -1 + + color: "#00000000" + + anchors + { + left: parent.left + right: parent.right + top: parent.top + bottom: parent.bottom + + topMargin : commonBorder ? -commonBorderWidth : -tBorderwidth + bottomMargin : commonBorder ? -commonBorderWidth : -bBorderwidth + leftMargin : commonBorder ? -commonBorderWidth : -lBorderwidth + rightMargin : commonBorder ? -commonBorderWidth : -rBorderwidth + } + + border.color: (Qt.platform.os === "osx") ? selectedBorderColor : "#ffcc00" + border.width: 3 + + opacity: (dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index) ? 1 : 0 + + Behavior on opacity { + NumberAnimation { duration: 300 } + } + + radius : 2 + } + + + MouseArea { + id: mouseArea + drag.target: realCell + + drag.minimumX: 0 + drag.maximumX: 0 + drag.minimumY: 0 + drag.maximumY: 0 + + anchors.fill: parent + acceptedButtons: Qt.LeftButton | Qt.RightButton + + hoverEnabled: true + + onDoubleClicked: { + comicsSelectionHelper.clear(); + + comicsSelectionHelper.selectIndex(index); + grid.currentIndex = index; + currentIndexHelper.selectedItem(index); + } + + function selectAll(from,to) + { + for(var i = from;i<=to;i++) + { + comicsSelectionHelper.selectIndex(i); + } + } + + onPressed: mouse => { + var ci = grid.currentIndex; //save current index + + /*if(mouse.button != Qt.RightButton && !(mouse.modifiers & Qt.ControlModifier || mouse.modifiers & Qt.ShiftModifier)) + { + if(!comicsSelectionHelper.isSelectedIndex(index)) + comicsSelectionHelper.clear(); + }*/ + + if(mouse.modifiers & Qt.ShiftModifier) + if(index < ci) + { + selectAll(index,ci); + grid.currentIndex = index; + } + else if (index > ci) + { + selectAll(ci,index); + grid.currentIndex = index; + } + + mouse.accepted = true; + + if(mouse.button === Qt.RightButton) // context menu is requested + { + if(!comicsSelectionHelper.isSelectedIndex(index)) //the context menu is requested outside the current selection, the selection will be + { + currentIndexHelper.setCurrentIndex(index) + grid.currentIndex = index; + } + + var coordinates = main.mapFromItem(realCell,mouseX,mouseY) + contextMenuHelper.requestedContextMenu(Qt.point(coordinates.x,coordinates.y)); + mouse.accepted = false; + + } else //left button + { + + if(mouse.modifiers & Qt.ControlModifier) + { + if(comicsSelectionHelper.isSelectedIndex(index)) + { + if(comicsSelectionHelper.numItemsSelected()>1) + { + comicsSelectionHelper.deselectIndex(index); + if(grid.currentIndex === index) + grid.currentIndex = comicsSelectionHelper.lastSelectedIndex(); + } + } + else + { + comicsSelectionHelper.selectIndex(index); + grid.currentIndex = index; + } + } + + if(mouse.button !== Qt.RightButton && !(mouse.modifiers & Qt.ControlModifier || mouse.modifiers & Qt.ShiftModifier)) //just left button click + { + if(comicsSelectionHelper.isSelectedIndex(index)) //the context menu is requested outside the current selection, the selection will be + { + + } + else + { + currentIndexHelper.setCurrentIndex(index) + } + + grid.currentIndex = index; + } + } + + } + + onReleased: mouse => { + if(mouse.button === Qt.LeftButton && !(mouse.modifiers & Qt.ControlModifier || mouse.modifiers & Qt.ShiftModifier)) + { + if(comicsSelectionHelper.isSelectedIndex(index)) + { + currentIndexHelper.setCurrentIndex(index) + grid.currentIndex = index; + } + } + } + } + } + + /**/ + + //cover + Image { + id: coverElement + width: coverWidth + height: coverHeight + anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0} + source: cover_path + fillMode: Image.PreserveAspectCrop + smooth: true + mipmap: true + asynchronous : true + cache: false //TODO clear cache only when it is needed + + } + + //border + Rectangle { + width: coverElement.width + height: coverElement.height + anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0} + color: "transparent" + border { + color: "#20FFFFFF" + width: 1 + } + } + + //mark + Image { + id: mark + width: 23 + height: 23 + source: read_column&&show_marks?"tick.png":has_been_opened&&show_marks?"reading.png":"" + anchors {right: coverElement.right; top: coverElement.top; topMargin: 9; rightMargin: 9} + asynchronous : true + } + + //title + Text { + id : titleText + anchors { top: coverElement.bottom; left: realCell.left; leftMargin: 4; rightMargin: 4; topMargin: 4; } + width: itemWidth - 8 + maximumLineCount: 2 + wrapMode: Text.WordWrap + text: title + elide: Text.ElideRight + color: titleColor + clip: true + font.letterSpacing: fontSpacing + font.pointSize: fontSize + font.family: fontFamily + } + + //number + Text { + anchors {bottom: realCell.bottom; left: realCell.left; margins: 4} + text: number?"#"+number:"" + color: textColor + font.letterSpacing: fontSpacing + font.pointSize: fontSize + font.family: fontFamily + } + + //page icon + Image { + id: pageImage + anchors {bottom: realCell.bottom; right: realCell.right; bottomMargin: 5; rightMargin: 4; leftMargin: 4} + source: "page.png" + width: 8 + height: 10 + } + + //numPages + Text { + id: pages + anchors {bottom: realCell.bottom; right: pageImage.left; margins: 4} + text: has_been_opened?current_page+"/"+num_pages:num_pages + color: textColor + font.letterSpacing: fontSpacing + font.pointSize: fontSize + font.family: fontFamily + } + + //rating icon + Image { + id: ratingImage + anchors {bottom: realCell.bottom; right: pageImage.left; bottomMargin: 5; rightMargin: Math.floor(pages.width)+12} + source: "star.png" + width: 13 + height: 11 + + MouseArea { + anchors.fill: parent + onPressed: { + console.log("rating"); + comicsSelectionHelper.clear(); + comicsSelectionHelper.selectIndex(index); + grid.currentIndex = index; + ratingConextMenu.popup(); + } + } + + Menu { + background: Rectangle { + implicitWidth: 42 + implicitHeight: 100 + //border.color: "#222" + //color: "#444" + } + + id: ratingConextMenu + + Action { text: "1"; enabled: true; onTriggered: comicRatingHelper.rate(index,1) } + Action { text: "2"; enabled: true; onTriggered: comicRatingHelper.rate(index,2) } + Action { text: "3"; enabled: true; onTriggered: comicRatingHelper.rate(index,3) } + Action { text: "4"; enabled: true; onTriggered: comicRatingHelper.rate(index,4) } + Action { text: "5"; enabled: true; onTriggered: comicRatingHelper.rate(index,5) } + + delegate: MenuItem { + implicitHeight: 30 + } + } + } + + //comic rating + Text { + id: comicRating + anchors {bottom: realCell.bottom; right: ratingImage.left; margins: 4} + text: rating>0?rating:"-" + color: textColor + } + } + } + + Rectangle { + id: scrollView + objectName: "topScrollView" + anchors.fill: parent + anchors.margins: 0 + children: grid + + color: "transparent" + + function scrollToOrigin() { + grid.contentY = grid.originY + grid.contentX = grid.originX + } + + DropArea { + anchors.fill: parent + + onEntered: { + if(drag.hasUrls) + { + if(dropManager.canDropUrls(drag.urls, drag.action)) + { + drag.accepted = true; + }else + drag.accepted = false; + } + else if (dropManager.canDropFormats(drag.formats)) { + drag.accepted = true; + } else + drag.accepted = false; + } + + onDropped: { + if(drop.hasUrls && dropManager.canDropUrls(drop.urls, drop.action)) + { + dropManager.droppedFiles(drop.urls, drop.action); + } + else{ + if (dropManager.canDropFormats(drop.formats)) + { + var destItem = grid.itemAt(drop.x,drop.y + grid.contentY); + var destLocalX = grid.mapToItem(destItem,drop.x,drop.y + grid.contentY).x + var realIndex = grid.indexAt(drop.x,drop.y + grid.contentY); + + if(realIndex === -1) + realIndex = grid.count - 1; + + var destIndex = destLocalX < (grid.cellWidth / 2) ? realIndex : realIndex + 1; + dropManager.droppedComicsForResortingAt(drop.getDataAsString(), destIndex); + } + } + } + } + + property Component currentComicView: Component { + id: currentComicView + Rectangle { + id: currentComicViewTopView + color: "#00000000" + + height: showCurrentComic ? 270 : 20 + + Rectangle { + color: (Qt.platform.os === "osx") ? "#88FFFFFF" : "#88000000" + + id: currentComicVisualView + + width: main.width + height: 250 + + visible: showCurrentComic + + //cover + Image { + id: currentCoverElement + anchors.fill: parent + + anchors.leftMargin: 15 + anchors.topMargin: 15 + anchors.bottomMargin: 15 + anchors.rightMargin: 15 + horizontalAlignment: Image.AlignLeft + anchors {horizontalCenter: parent.horizontalCenter; top: parent.top; topMargin: 0} + source: comicsList.getCoverUrlPathForComicHash(currentComicInfo.hash.toString()) + fillMode: Image.PreserveAspectFit + smooth: true + mipmap: true + asynchronous : true + cache: false //TODO clear cache only when it is needed + } + + DropShadow { + anchors.fill: currentCoverElement + horizontalOffset: 0 + verticalOffset: 0 + radius: 8.0 + transparentBorder: true + //samples: 17 + color: "#FF000000" + source: currentCoverElement + visible: (Qt.platform.os === "osx") ? false : true; + } + + ColumnLayout + { + id: currentComicInfoView + + x: currentCoverElement.anchors.rightMargin + currentCoverElement.paintedWidth + currentCoverElement.anchors.rightMargin + //y: currentCoverElement.anchors.topMargin + + anchors.top: currentCoverElement.top + anchors.right: parent.right + anchors.left: readButton.left + + spacing: 9 + + Text { + Layout.topMargin: 7 + Layout.fillWidth: true + Layout.rightMargin: 20 + + Layout.alignment: Qt.AlignTop | Qt.AlignLeft + + id: currentComicInfoTitleView + + color: infoTitleColor + font.family: "Arial" + font.bold: true + font.pixelSize: 21 + wrapMode: Text.WordWrap + + text: currentComic.getTitleIncludingNumber() + } + + Flow { + spacing: 0 + Layout.alignment: Qt.AlignTop | Qt.AlignLeft + Layout.fillWidth: true + Layout.fillHeight: false + + id: currentComicDetailsFlowView + property font infoFont: Qt.font({ + family: "Arial", + pixelSize: 14 + }); + property string infoFlowTextColor: infoTextColor + + Text { + id: currentComicInfoVolume + color: currentComicDetailsFlowView.infoFlowTextColor + font: currentComicDetailsFlowView.infoFont + text: currentComicInfo.volume ? currentComicInfo.volume : "" + rightPadding: 20 + visible: currentComicInfo.volume ? true : false + } + + Text { + id: currentComicInfoNumbering + color: currentComicDetailsFlowView.infoFlowTextColor + font: currentComicDetailsFlowView.infoFont + text: currentComicInfo.number + "/" + currentComicInfo.count + rightPadding: 20 + visible : currentComicInfo.number ? true : false + } + + Text { + id: currentComicInfoGenre + color: currentComicDetailsFlowView.infoFlowTextColor + font: currentComicDetailsFlowView.infoFont + text: currentComicInfo.genere ? currentComicInfo.genere : "" + rightPadding: 20 + visible: currentComicInfo.genere ? true : false + } + + Text { + id: currentComicInfoDate + color: currentComicDetailsFlowView.infoFlowTextColor + font: currentComicDetailsFlowView.infoFont + text: currentComicInfo.date ? currentComicInfo.date : "" + rightPadding: 20 + visible: currentComicInfo.date ? true : false + } + + Text { + id: currentComicInfoPages + color: currentComicDetailsFlowView.infoFlowTextColor + font: currentComicDetailsFlowView.infoFont + text: (currentComicInfo.numPages ? currentComicInfo.numPages : "") + " pages" + rightPadding: 20 + visible: currentComicInfo.numPages ? true : false + } + + Text { + id: currentComicInfoShowInComicVine + font: currentComicDetailsFlowView.infoFont + color: "#ffcc00" + text: "Show in Comic Vine" + visible: currentComicInfo.comicVineID ? true : false + MouseArea { + anchors.fill: parent + onClicked: { + Qt.openUrlExternally("http://www.comicvine.com/comic/4000-%1/".arg(comicInfo.comicVineID)); + } + } + } + } + + ScrollView { + Layout.topMargin: 6 + Layout.rightMargin: 30 + Layout.bottomMargin: 5 + Layout.fillWidth: true + Layout.maximumHeight: (currentComicVisualView.height * 0.32) + Layout.maximumWidth: 960 + + ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + + ScrollBar.vertical: ScrollBar { + visible: true + contentItem: Item { + implicitWidth: 12 + implicitHeight: 26 + Rectangle { + color: "#424246" + anchors.fill: parent + anchors.topMargin: 6 + anchors.leftMargin: 5 + anchors.rightMargin: 4 + anchors.bottomMargin: 6 + radius: 2 + } + } + } + + contentItem: currentComicInfoSinopsis + + id: synopsisScroller + + clip: true + + Text { + Layout.maximumWidth: 960 + + width: synopsisScroller.width + + id: currentComicInfoSinopsis + color: infoTitleColor + font.family: "Arial" + font.pixelSize: 14 + wrapMode: Text.WordWrap + + text: '' + currentComicInfo.synopsis ?? "" + '' + visible: currentComicInfo.synopsis ?? false + textFormat: Text.RichText + } + } + } + + Button { + containmentMask: null + text: "Read" + id: readButton + x: currentCoverElement.anchors.rightMargin + currentCoverElement.paintedWidth + currentCoverElement.anchors.rightMargin + anchors.bottom: currentCoverElement.bottom + anchors.bottomMargin: 15 + + onClicked: comicOpener.triggerOpenCurrentComic() + background: Rectangle { + implicitWidth: 100 + implicitHeight: 30 + border.width: readButton.activeFocus ? 2 : 1 + border.color: "#FFCC00" + radius: height / 2 + color: "#FFCC00" + } + + contentItem: Text { + renderType: Text.NativeRendering + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + font.family: "Arial" + font.pointSize: 12 + font.bold: true + color: "white" + text: readButton.text + } + } + + + DropShadow { + anchors.fill: readButton + transparentBorder: true + horizontalOffset: 0 + verticalOffset: 0 + radius: 8.0 + //samples: 17 + color: "#AA000000" + source: readButton + visible: ((Qt.platform.os === "osx") ? false : true) && !readButton.pressed + } + } + } + } + + GridView { + id:grid + objectName: "grid" + anchors.fill: parent + cellHeight: cellCustomHeight + header: currentComicView + focus: true + model: comicsList + delegate: appDelegate + anchors.topMargin: 0 + anchors.bottomMargin: 10 + anchors.leftMargin: 0 + anchors.rightMargin: 0 + pixelAligned: true + highlightFollowsCurrentItem: true + + currentIndex: 0 + cacheBuffer: 0 + + interactive: true + + move: Transition { + NumberAnimation { properties: "x,y"; duration: 250 } + } + + moveDisplaced: Transition { + NumberAnimation { properties: "x,y"; duration: 250 } + } + + remove: Transition { + ParallelAnimation { + NumberAnimation { property: "opacity"; to: 0; duration: 250 } + + } + } + + removeDisplaced: Transition { + NumberAnimation { properties: "x,y"; duration: 250 } + } + + + + displaced: Transition { + NumberAnimation { properties: "x,y"; duration: 250 } + } + + function numCellsPerRow() { + return Math.floor(width / cellCustomWidth); + } + + onWidthChanged: { + calculateCellWidths(cellCustomWidth); + } + + function calculateCellWidths(cWidth) { + var wholeCells = Math.floor(width / cWidth); + var rest = width - (cWidth * wholeCells) + + grid.cellWidth = cWidth + Math.floor(rest / wholeCells); + } + + WheelHandler { + onWheel: { + if (grid.contentHeight <= grid.height) { + return; + } + + var newValue = Math.min((grid.contentHeight - grid.height - (showCurrentComic ? 270 : 20)), (Math.max(grid.originY , grid.contentY - event.angleDelta.y))); + grid.contentY = newValue; + } + } + + ScrollBar.vertical: ScrollBar { + visible: grid.contentHeight > grid.height + + contentItem: Item { + implicitWidth: 12 + implicitHeight: 26 + Rectangle { + color: "#88424242" + anchors.fill: parent + anchors.topMargin: 6 + anchors.leftMargin: 3 + anchors.rightMargin: 2 + anchors.bottomMargin: 6 + border.color: "#AA313131" + border.width: 1 + radius: 3.5 + } + } + } + + Keys.onPressed: { + if (event.modifiers & Qt.ControlModifier || event.modifiers & Qt.ShiftModifier) { + event.accepted = true + return; + } + + var numCells = grid.numCellsPerRow(); + var ci = 0; + if (event.key === Qt.Key_Right) { + ci = Math.min(grid.currentIndex+1,grid.count - 1); + } + else if (event.key === Qt.Key_Left) { + ci = Math.max(0,grid.currentIndex-1); + } + else if (event.key === Qt.Key_Up) { + ci = Math.max(0,grid.currentIndex-numCells); + } + else if (event.key === Qt.Key_Down) { + ci = Math.min(grid.currentIndex+numCells,grid.count - 1); + } else { + return; + } + + event.accepted = true; + grid.currentIndex = -1 + comicsSelectionHelper.clear(); + currentIndexHelper.setCurrentIndex(ci); + grid.currentIndex = ci; + } + } + } +} + +Rectangle { + id: info_container + objectName: "infoContainer" + SplitView.preferredWidth: 350 + SplitView.minimumWidth: 350 + SplitView.maximumWidth: 960 + height: parent.height + + color: infoBackgroundColor + + visible: showInfo + + Flickable{ + id: infoFlickable + anchors.fill: parent + anchors.margins: 0 + + contentWidth: infoView.width + contentHeight: infoView.height + + ComicInfoView { + id: infoView + width: info_container.width + } + + WheelHandler { + onWheel: { + if (infoFlickable.contentHeight <= infoFlickable.height) { + return; + } + + var newValue = Math.min((infoFlickable.contentHeight - infoFlickable.height), (Math.max(infoFlickable.originY , infoFlickable.contentY - event.angleDelta.y))); + infoFlickable.contentY = newValue; + } + } + + ScrollBar.vertical: ScrollBar { + visible: infoFlickable.contentHeight > infoFlickable.height + + contentItem: Item { + implicitWidth: 12 + implicitHeight: 26 + Rectangle { + color: "#424246" + anchors.fill: parent + anchors.topMargin: 6 + anchors.leftMargin: 5 + anchors.rightMargin: 4 + anchors.bottomMargin: 6 + radius: 2 + } + } + } + } + +} +} diff --git a/YACReaderLibrary/qml/InfoFavorites6.qml b/YACReaderLibrary/qml/InfoFavorites6.qml new file mode 100644 index 00000000..11ca790d --- /dev/null +++ b/YACReaderLibrary/qml/InfoFavorites6.qml @@ -0,0 +1,32 @@ +import QtQuick 2.15 + +import Qt5Compat.GraphicalEffects + +Item { + width: 20 + height: 20 + + property bool active + + signal activeChangedByUser(bool active) + + MouseArea { + anchors.fill: favorites_button_compact + onClicked: { + activeChangedByUser(!active); + } + } + + Image { + anchors.centerIn: parent + id: favorites_button_compact + source: "info-favorites.png" + } + + ColorOverlay { + anchors.fill: favorites_button_compact + source: favorites_button_compact + color: active ? favCheckedColor : favUncheckedColor + } +} + diff --git a/YACReaderLibrary/qml/InfoRating6.qml b/YACReaderLibrary/qml/InfoRating6.qml new file mode 100644 index 00000000..8892f0a9 --- /dev/null +++ b/YACReaderLibrary/qml/InfoRating6.qml @@ -0,0 +1,48 @@ +import QtQuick 2.15 + +import Qt5Compat.GraphicalEffects + +Row { + spacing: 0 + property int rating : 0 + property int mouseIndex : 0 + + signal ratingChangedByUser(int rating) + + Repeater { + id: rating_compact + model: 5 + Item { + width: 25 + height: 20 + + Image { + id: star + source: "info-rating.png" + } + + ColorOverlay { + anchors.fill: star + source: star + color: index < (mouseIndex > 0 ? mouseIndex : rating) ? ratingSelectedColor : ratingUnselectedColor + } + + MouseArea { + anchors.fill: parent + hoverEnabled: true + + onPositionChanged: { + mouseIndex = index + 1; + } + + onClicked: { + ratingChangedByUser(mouseIndex); + } + + onExited: { + mouseIndex = 0; + } + } + } + } +} diff --git a/YACReaderLibrary/qml/InfoTick6.qml b/YACReaderLibrary/qml/InfoTick6.qml new file mode 100644 index 00000000..d9037141 --- /dev/null +++ b/YACReaderLibrary/qml/InfoTick6.qml @@ -0,0 +1,28 @@ +import QtQuick 2.15 + +import Qt5Compat.GraphicalEffects + +Item { + + property bool read + + signal readChangedByUser(bool read) + + MouseArea { + anchors.fill: read_compact + onClicked: { + readChangedByUser(!read); + } + } + + Image { + id: read_compact + source: "info-tick.png" + } + + ColorOverlay { + anchors.fill: read_compact + source: read_compact + color: read ? readTickCheckedColor : readTickUncheckedColor + } +} diff --git a/YACReaderLibrary/qml6.qrc b/YACReaderLibrary/qml6.qrc new file mode 100644 index 00000000..2fee5923 --- /dev/null +++ b/YACReaderLibrary/qml6.qrc @@ -0,0 +1,30 @@ + + + qml/GridComicsView6.qml + qml/FlowView6.qml + qml/InfoTick6.qml + qml/InfoFavorites6.qml + qml/InfoRating6.qml + qml/InfoComicsView.qml + qml/tick.png + qml/reading.png + qml/star_menu.png + qml/star_menu@2x.png + qml/info-indicator.png + qml/info-shadow.png + qml/info-indicator-light.png + qml/info-shadow-light.png + qml/info-indicator-light@2x.png + qml/info-shadow-light@2x.png + qml/info-top-shadow.png + qml/ComicInfoView.qml + qml/info-favorites.png + qml/info-favorites@2x.png + qml/info-rating.png + qml/info-rating@2x.png + qml/info-tag.png + qml/info-tag@2x.png + qml/info-tick.png + qml/info-tick@2x.png + + diff --git a/config.pri b/config.pri index 711b3781..f4f40f2f 100644 --- a/config.pri +++ b/config.pri @@ -3,7 +3,7 @@ # for a more detailed description, see INSTALL.TXT CONFIG += c++17 -win32:QMAKE_CXXFLAGS += /std:c++17 #enable c++17 explicitly in msvc +win32:QMAKE_CXXFLAGS += /std:c++17 /Zc:__cplusplus /permissive- #enable c++17 explicitly in msvc DEFINES += NOMINMAX From 48bc72250cb0545a72206fc61470ce47b8c6e6ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 11:04:09 +0200 Subject: [PATCH 03/78] Use qt 6.3.1 in windows qt6 azure job --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c2ee3223..28f810fe 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -155,7 +155,7 @@ jobs: parameters: name: Windows_x64_qt6 architecture: 'x64' - qt_version: '6.2.2' + qt_version: '6.3.1' qt_spec: 'msvc2019_64' qt_aqt_spec: 'win64_msvc2019_64' vc_redist_url: 'https://aka.ms/vs/16/release/vc_redist.x64.exe' From 3b01e993c0d6b99053f57e5c71f360fb329bb44e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 11:04:29 +0200 Subject: [PATCH 04/78] macextras is not available in qt6 --- YACReaderLibrary/YACReaderLibrary.pro | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/YACReaderLibrary/YACReaderLibrary.pro b/YACReaderLibrary/YACReaderLibrary.pro index ba626f04..72f314f0 100644 --- a/YACReaderLibrary/YACReaderLibrary.pro +++ b/YACReaderLibrary/YACReaderLibrary.pro @@ -66,7 +66,8 @@ CONFIG(force_angle) { macx { LIBS += -framework Foundation -framework ApplicationServices -framework AppKit CONFIG += objective_c - QT += macextras gui-private + QT += gui-private + lessThan(QT_MAJOR_VERSION, 6): QT += macextras } #CONFIG += release From bbe79cc27a99e4d1c8f1550edc214a1fc9dfe21a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 11:04:45 +0200 Subject: [PATCH 05/78] Apple silicon supports opengl --- config.pri | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config.pri b/config.pri index f4f40f2f..f5438863 100644 --- a/config.pri +++ b/config.pri @@ -46,8 +46,10 @@ isEmpty(QMAKE_TARGET.arch) { QMAKE_TARGET.arch = $$QMAKE_HOST.arch } contains(QMAKE_TARGET.arch, arm.*)|contains(QMAKE_TARGET.arch, aarch.*) { - message("Building for ARM architecture. Disabling OpenGL coverflow ...") - CONFIG += no_opengl + !macx { # Apple silicon supports opengl + CONFIG += no_opengl + message("Building for ARM architecture. Disabling OpenGL coverflow. If you know that your ARM arquitecture supports opengl, please edit config.pri to enable it.") + } } # build without opengl widget support From 52fe8683bbf2cca042d761f4c7d138c6b01440f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 11:04:57 +0200 Subject: [PATCH 06/78] macextras is not available in qt6 --- YACReader/YACReader.pro | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/YACReader/YACReader.pro b/YACReader/YACReader.pro index 7e909ae3..556e0585 100644 --- a/YACReader/YACReader.pro +++ b/YACReader/YACReader.pro @@ -65,9 +65,11 @@ win32 { } macx { - QT += macextras gui-private + QT += gui-private CONFIG += objective_c LIBS += -framework Foundation -framework ApplicationServices -framework AppKit + + lessThan(QT_MAJOR_VERSION, 6): QT += macextras } QT += network widgets core multimedia svg From 894ba18ffd795cd97f849235b7feca9661900388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 11:05:29 +0200 Subject: [PATCH 07/78] Add an azure pipelines job to compile the macos version with qt6 --- azure-pipelines.yml | 49 ++++++++++++++++++++++++++++++++++++++++++++- compileOSX.sh | 6 ++++-- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 28f810fe..735a7496 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -86,7 +86,53 @@ jobs: # MacOS # -- job: MacOS +- job: MacOS_qt6 + dependsOn: CodeFormatValidation + variables: + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - group: macos-codesign + pool: + vmImage: 'macOS-latest' + steps: + - script: | + brew install qt + brew link qt --force + brew install create-dmg + brew install node + brew link --overwrite node + npm install -g appdmg + mkdir $(Build.SourcesDirectory)\compressed_archive + wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/p7zip_16.02_src_all.tar.bz2?raw=true" -O $(Build.SourcesDirectory)/compressed_archive/p7zip_16.02_src_all.tar.bz2 + tar xjf $(Build.SourcesDirectory)/compressed_archive/p7zip_16.02_src_all.tar.bz2 -C $(Build.SourcesDirectory)/compressed_archive + mv $(Build.SourcesDirectory)/compressed_archive/p7zip_16.02 $(Build.SourcesDirectory)/compressed_archive/libp7zip + displayName: 'Install dependencies' + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - task: InstallAppleCertificate@2 + inputs: + certSecureFile: 'developerID_application.p12' + certPwd: $(P12Password) + - script: | + cd $(Build.SourcesDirectory) + VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" + echo "Trying to know if we are in a forked repo: $IS_FORK" + SKIP_CODESIGN="$(tr [A-Z] [a-z] <<< "$IS_FORK")" + ./compileOSX.sh $VERSION $(Build.BuildNumber) $SKIP_CODESIGN Qt6 + displayName: 'Build' + - script: | + cd $(Build.SourcesDirectory)/tests + qmake + make check TESTARGS="-maxwarnings 100000" + displayName: 'Build and run tests' + - task: CopyFiles@2 + inputs: + contents: '*.dmg' + targetFolder: $(Build.ArtifactStagingDirectory) + - task: PublishPipelineArtifact@1 + inputs: + path: $(Build.ArtifactStagingDirectory) + artifactName: Macos qt6 $(Build.BuildNumber) dmg + + - job: MacOS dependsOn: CodeFormatValidation variables: - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: @@ -186,6 +232,7 @@ jobs: dependsOn: - Linux - MacOS + - MacOS_qt6 - Windows_x86 - Windows_x64 - Windows_x64_qt6 diff --git a/compileOSX.sh b/compileOSX.sh index f9cc029e..ce976a67 100755 --- a/compileOSX.sh +++ b/compileOSX.sh @@ -1,12 +1,14 @@ #! /bin/bash set -e -VERSION=${1:-"9.5.0"} +VERSION=${1:-"9.9.1"} BUILD_NUMBER=${2:-"0"} SKIP_CODESIGN=${3:-false} +QT_VERSION=${4:-""} + if [ "$4" == "clean" ]; then ./cleanOSX.sh fi @@ -74,7 +76,7 @@ fi echo "Preparing apps for release, Done." echo "Copying to destination folder" -dest="YACReader-$VERSION.$BUILD_NUMBER MacOSX-Intel" +dest="YACReader-$VERSION.$BUILD_NUMBER MacOSX-Intel$QT_VERSION" mkdir -p "$dest" cp -R YACReader.app "${dest}/YACReader.app" cp -R YACReaderLibrary.app "${dest}/YACReaderLibrary.app" From 450d3c18b2b2f9c3653161ac6aadfbc943fbc7d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 11:06:41 +0200 Subject: [PATCH 08/78] Fix compile error on macos qt6 due to __OBJC_BOOL_IS_BOOL macro --- YACReaderLibrary/trayhandler.mm | 8 +++++++- common/pdf_comic.mm | 4 ++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/YACReaderLibrary/trayhandler.mm b/YACReaderLibrary/trayhandler.mm index 9c3cce37..c53f0897 100644 --- a/YACReaderLibrary/trayhandler.mm +++ b/YACReaderLibrary/trayhandler.mm @@ -1,3 +1,9 @@ + +#include +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +#undef __OBJC_BOOL_IS_BOOL +#endif + #import #include "trayhandler.h" @@ -8,4 +14,4 @@ void OSXShowDockIcon() void OSXHideDockIcon() { [NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory]; -} \ No newline at end of file +} diff --git a/common/pdf_comic.mm b/common/pdf_comic.mm index 5cef6e7c..18d3571b 100644 --- a/common/pdf_comic.mm +++ b/common/pdf_comic.mm @@ -1,5 +1,9 @@ #include "pdf_comic.h" +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +#undef __OBJC_BOOL_IS_BOOL +#endif + #import #import #import From e026f256170ce6d9e2e6150727ad15e412ec1e63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 11:07:50 +0200 Subject: [PATCH 09/78] QMacToolBar is not available in Qt6 This commit adds new qt pure versions of the mac toolbar to be used in qt6. --- YACReader/main_window_viewer.cpp | 2 +- YACReaderLibrary/library_window.cpp | 5 +- YACReaderLibrary/yacreader_main_toolbar.cpp | 2 + custom_widgets/yacreader_macosx_toolbar.h | 48 ++++++++ custom_widgets/yacreader_macosx_toolbar.mm | 115 ++++++++++++++++++++ 5 files changed, 167 insertions(+), 5 deletions(-) diff --git a/YACReader/main_window_viewer.cpp b/YACReader/main_window_viewer.cpp index b2147a26..5f67d446 100644 --- a/YACReader/main_window_viewer.cpp +++ b/YACReader/main_window_viewer.cpp @@ -731,7 +731,7 @@ void MainWindowViewer::createToolBars() // attach toolbar - comicToolBar->attachToWindow(this->windowHandle()); + comicToolBar->attachToWindow(this); #endif } diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index bdb3006f..f389372b 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -922,9 +922,6 @@ void LibraryWindow::createToolBars() libraryToolBar->addSpace(10); libraryToolBar->addAction(toggleComicsViewAction); -#ifndef Q_OS_MAC - libraryToolBar->addAction(toggleFullScreenAction); -#endif libraryToolBar->addStretch(); @@ -935,7 +932,7 @@ void LibraryWindow::createToolBars() // libraryToolBar->setMovable(false); - libraryToolBar->attachToWindow(this->windowHandle()); + libraryToolBar->attachToWindow(this); #else libraryToolBar->backButton->setDefaultAction(backAction); diff --git a/YACReaderLibrary/yacreader_main_toolbar.cpp b/YACReaderLibrary/yacreader_main_toolbar.cpp index a6732193..7ddc2997 100644 --- a/YACReaderLibrary/yacreader_main_toolbar.cpp +++ b/YACReaderLibrary/yacreader_main_toolbar.cpp @@ -68,8 +68,10 @@ YACReaderMainToolBar::YACReaderMainToolBar(QWidget *parent) mainLayout->addStretch(); mainLayout->addWidget(toggleComicsViewButton, 0, Qt::AlignVCenter); +#ifndef Q_OS_MAC addWideDivider(); mainLayout->addWidget(fullscreenButton, 0, Qt::AlignVCenter); +#endif setLayout(mainLayout); diff --git a/custom_widgets/yacreader_macosx_toolbar.h b/custom_widgets/yacreader_macosx_toolbar.h index 35b69f18..7ee40cca 100644 --- a/custom_widgets/yacreader_macosx_toolbar.h +++ b/custom_widgets/yacreader_macosx_toolbar.h @@ -1,8 +1,11 @@ #ifndef YACREADER_MACOSX_TOOLBAR_H #define YACREADER_MACOSX_TOOLBAR_H +#include +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) #include #include +#include #include "yacreader_global.h" @@ -70,6 +73,8 @@ public: // convenience method for switching the icon of the view selector void updateViewSelectorIcon(const QIcon &icon); + void attachToWindow(QMainWindow *window); + signals: public slots: @@ -80,5 +85,48 @@ protected: bool yosemite; QMacToolBarItem *viewSelector; }; +#else + +#ifdef YACREADER_LIBRARY + +#include "yacreader_main_toolbar.h" +#include "yacreader_search_line_edit.h" +#include + +class YACReaderMacOSXSearchLineEdit : public YACReaderSearchLineEdit +{ +}; + +class YACReaderMacOSXToolbar : public YACReaderMainToolBar +{ +public: + explicit YACReaderMacOSXToolbar(QWidget *parent = 0); + QSize sizeHint() const override; + void addAction(QAction *action); + void addSpace(int size); // size in points + void addStretch(); + YACReaderMacOSXSearchLineEdit *addSearchEdit(); + void updateViewSelectorIcon(const QIcon &icon); + void attachToWindow(QMainWindow *window); + +private: + void paintEvent(QPaintEvent *) override; +}; + +#else + +#include + +class YACReaderMacOSXToolbar : public QToolBar +{ +public: + explicit YACReaderMacOSXToolbar(QWidget *parent = 0); + void attachToWindow(QMainWindow *window); + void addStretch(); +}; + +#endif + +#endif #endif // YACREADER_MACOSX_TOOLBAR_H diff --git a/custom_widgets/yacreader_macosx_toolbar.mm b/custom_widgets/yacreader_macosx_toolbar.mm index e5008868..7f3d6137 100644 --- a/custom_widgets/yacreader_macosx_toolbar.mm +++ b/custom_widgets/yacreader_macosx_toolbar.mm @@ -1,5 +1,10 @@ #include "yacreader_macosx_toolbar.h" +#include "QtWidgets/qmainwindow.h" +#include +#include + +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) #include #include #include @@ -298,6 +303,11 @@ void YACReaderMacOSXToolbar::updateViewSelectorIcon(const QIcon &icon) viewSelector->setIcon(icon); } +void YACReaderMacOSXToolbar::attachToWindow(QMainWindow *window) +{ + QMacToolBar::attachToWindow(window->windowHandle()); +} + YACReaderMacOSXSearchLineEdit::YACReaderMacOSXSearchLineEdit() : QObject() { @@ -386,3 +396,108 @@ void MacToolBarItemWrapper::updateIcon(bool enabled) } else toolbaritem->setIcon(action->icon()); } +#else + +#ifdef YACREADER_LIBRARY + +YACReaderMacOSXToolbar::YACReaderMacOSXToolbar(QWidget *parent) + : YACReaderMainToolBar(parent) +{ + backButton->setIconSize(QSize(24, 24)); + forwardButton->setIconSize(QSize(24, 24)); + settingsButton->setIconSize(QSize(24, 24)); + serverButton->setIconSize(QSize(24, 24)); + helpButton->setIconSize(QSize(24, 24)); + toggleComicsViewButton->setIconSize(QSize(24, 24)); +} + +QSize YACReaderMacOSXToolbar::sizeHint() const +{ + return QSize(400, 36); +} + +void YACReaderMacOSXToolbar::addAction(QAction *action) +{ + if (backButton->defaultAction() == nullptr) { + backButton->setDefaultAction(action); + return; + } + if (forwardButton->defaultAction() == nullptr) { + forwardButton->setDefaultAction(action); + return; + } + if (settingsButton->defaultAction() == nullptr) { + settingsButton->setDefaultAction(action); + return; + } + if (serverButton->defaultAction() == nullptr) { + serverButton->setDefaultAction(action); + return; + } + if (helpButton->defaultAction() == nullptr) { + helpButton->setDefaultAction(action); + return; + } + if (toggleComicsViewButton->defaultAction() == nullptr) { + toggleComicsViewButton->setDefaultAction(action); + return; + } +} + +void YACReaderMacOSXToolbar::addSpace(int size) +{ +} + +void YACReaderMacOSXToolbar::addStretch() +{ +} + +YACReaderMacOSXSearchLineEdit *YACReaderMacOSXToolbar::addSearchEdit() +{ + auto search = new YACReaderMacOSXSearchLineEdit(); + + setSearchWidget(search); + + return search; +} + +void YACReaderMacOSXToolbar::updateViewSelectorIcon(const QIcon &icon) +{ +} + +void YACReaderMacOSXToolbar::attachToWindow(QMainWindow *window) +{ + auto toolbar = new QToolBar(); + + toolbar->addWidget(this); + toolbar->setMovable(false); + + window->addToolBar(toolbar); +} + +void YACReaderMacOSXToolbar::paintEvent(QPaintEvent *) +{ +} + +#else + +YACReaderMacOSXToolbar::YACReaderMacOSXToolbar(QWidget *parent) + : QToolBar(parent) +{ + setMovable(false); + setIconSize(QSize(24, 24)); +} + +void YACReaderMacOSXToolbar::attachToWindow(QMainWindow *window) +{ + window->setUnifiedTitleAndToolBarOnMac(true); + window->addToolBar(this); +} + +void YACReaderMacOSXToolbar::addStretch() +{ +} + +#endif + +#endif From 0977eb36a95c09e1f77b34e1240b2e6e749ca4fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 11:36:31 +0200 Subject: [PATCH 10/78] Format --- azure-pipelines.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 735a7496..46657be5 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -83,7 +83,7 @@ jobs: artifactName: src $(Build.BuildNumber) tarball # -# MacOS +# MacOS qt6 # - job: MacOS_qt6 @@ -132,7 +132,11 @@ jobs: path: $(Build.ArtifactStagingDirectory) artifactName: Macos qt6 $(Build.BuildNumber) dmg - - job: MacOS +# +# MacOS +# + +- job: MacOS dependsOn: CodeFormatValidation variables: - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: From e75e1ada1e321f19c860d503d7a9527b7643fb8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 15:00:38 +0200 Subject: [PATCH 11/78] comment brew link on qt, it is showing a warning --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 46657be5..1ca5b54e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -96,7 +96,7 @@ jobs: steps: - script: | brew install qt - brew link qt --force +# brew link qt --force brew install create-dmg brew install node brew link --overwrite node From 095adba3b4d7fad1e2d28fe06de67043cdcb7546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 15:02:02 +0200 Subject: [PATCH 12/78] Format --- azure-pipelines.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1ca5b54e..43f9cae0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -96,7 +96,6 @@ jobs: steps: - script: | brew install qt -# brew link qt --force brew install create-dmg brew install node brew link --overwrite node From 6d851086ef21ad627ef0ba1fe95bc9fbf6e40a0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 16:22:14 +0200 Subject: [PATCH 13/78] try aqtinstall for macos/qt6 --- azure-pipelines.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 43f9cae0..bd26c42c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -95,7 +95,8 @@ jobs: vmImage: 'macOS-latest' steps: - script: | - brew install qt + pip install aqtinstall + python -m aqt install 6.3.1 mac desktop -m qt5compat qtmultimedia brew install create-dmg brew install node brew link --overwrite node From 2c52ad6b4c34b67148908d3a536a5da81285cda4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 16:35:35 +0200 Subject: [PATCH 14/78] use python3 --- azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index bd26c42c..bb22fe4e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -95,8 +95,8 @@ jobs: vmImage: 'macOS-latest' steps: - script: | - pip install aqtinstall - python -m aqt install 6.3.1 mac desktop -m qt5compat qtmultimedia + pip3 install aqtinstall + python3 -m aqt install 6.3.1 mac desktop -m qt5compat qtmultimedia brew install create-dmg brew install node brew link --overwrite node From 7548242a9c3604a05aeaa44bd66ec18352017f64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 16:48:42 +0200 Subject: [PATCH 15/78] Add qt bin to the path --- azure-pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index bb22fe4e..8bc45485 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -112,6 +112,7 @@ jobs: certSecureFile: 'developerID_application.p12' certPwd: $(P12Password) - script: | + export PATH=$PATH:/Users/runner/work/1/s/6.3.1/macos/bin/ cd $(Build.SourcesDirectory) VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" echo "Trying to know if we are in a forked repo: $IS_FORK" From c70d714e00e4edc4d4178d666577ac059922b919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 16:57:10 +0200 Subject: [PATCH 16/78] Add qt bin to the path take 2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 8bc45485..813da3c4 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -112,7 +112,7 @@ jobs: certSecureFile: 'developerID_application.p12' certPwd: $(P12Password) - script: | - export PATH=$PATH:/Users/runner/work/1/s/6.3.1/macos/bin/ + export PATH=$(Build.SourcesDirectory)/6.3.1/macos/bin:$PATH cd $(Build.SourcesDirectory) VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" echo "Trying to know if we are in a forked repo: $IS_FORK" From 879a0fb262340088e8efcb5c8508c85284b33622 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 19:25:14 +0200 Subject: [PATCH 17/78] Add Qt5 param to Qt5 builds in macos --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 813da3c4..04ad1a54 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -167,7 +167,7 @@ jobs: VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" echo "Trying to know if we are in a forked repo: $IS_FORK" SKIP_CODESIGN="$(tr [A-Z] [a-z] <<< "$IS_FORK")" - ./compileOSX.sh $VERSION $(Build.BuildNumber) $SKIP_CODESIGN + ./compileOSX.sh $VERSION $(Build.BuildNumber) $SKIP_CODESIGN Qt5 displayName: 'Build' - script: | cd $(Build.SourcesDirectory)/tests From d5dc5fbecf006d5547c99c00b4749a0b28321136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 19:25:47 +0200 Subject: [PATCH 18/78] Update dmg.json to include the Qt flavor --- compileOSX.sh | 17 ++++++----------- dmg.json | 14 +++++++------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/compileOSX.sh b/compileOSX.sh index ce976a67..6dd091d2 100755 --- a/compileOSX.sh +++ b/compileOSX.sh @@ -9,7 +9,9 @@ SKIP_CODESIGN=${3:-false} QT_VERSION=${4:-""} -if [ "$4" == "clean" ]; then +echo "building macos binaries with these params: ${VERSION} ${BUILD_NUMBER} ${SKIP_CODESIGN} ${QT_VERSION}" + +if [ "$5" == "clean" ]; then ./cleanOSX.sh fi @@ -75,8 +77,8 @@ fi echo "Preparing apps for release, Done." -echo "Copying to destination folder" -dest="YACReader-$VERSION.$BUILD_NUMBER MacOSX-Intel$QT_VERSION" +dest="YACReader-$VERSION.$BUILD_NUMBER MacOSX-Intel ${QT_VERSION}" +echo "Copying to destination folder ${dest}" mkdir -p "$dest" cp -R YACReader.app "${dest}/YACReader.app" cp -R YACReaderLibrary.app "${dest}/YACReaderLibrary.app" @@ -85,18 +87,11 @@ cp -R YACReaderLibraryServer.app "${dest}/YACReaderLibraryServer" cp COPYING.txt "${dest}/" cp README.md "${dest}/" -#mkdir -p "${dest}/icons/" -#cp images/db.png "${dest}/icons/" -#cp images/coversPackage.png "${dest}/icons/" - echo "Creating dmg package" -#tar -czf "${dest}".tar.gz "${dest}" -#hdiutil create "${dest}".dmg -srcfolder "./${dest}" -ov - -#create-dmg --volname "YACReader $VERSION.$BUILD_NUMBER Installer" --volicon icon.icns --window-size 600 403 --icon-size 128 --app-drop-link 485 90 --background background.png --icon YACReader 80 90 --icon YACReaderLibrary 235 90 --eula COPYING.txt --icon YACReaderLibraryServer 470 295 --icon README.md 120 295 --icon COPYING.txt 290 295 "$dest.dmg" "$dest" sed -i'' -e "s/#VERSION#/$VERSION/g" dmg.json sed -i'' -e "s/#BUILD_NUMBER#/$BUILD_NUMBER/g" dmg.json +sed -i'' -e "s/#QT_VERSION#/$QT_VERSION/g" dmg.json appdmg dmg.json "$dest.dmg" if [ "$SKIP_CODESIGN" = false ]; then diff --git a/dmg.json b/dmg.json index 6a56f45d..d5ba3a78 100644 --- a/dmg.json +++ b/dmg.json @@ -1,5 +1,5 @@ { - "title": "YACReader-#VERSION#.#BUILD_NUMBER#", + "title": "YACReader-#VERSION#.#BUILD_NUMBER# #QT_VERSION#", "icon": "icon.icns", "background": "background.png", "window": { @@ -20,31 +20,31 @@ "x": 80, "y": 90, "type": "file", - "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel/YACReader.app" + "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/YACReader.app" }, { "x": 235, "y": 90, "type": "file", - "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel/YACReaderLibrary.app" + "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/YACReaderLibrary.app" }, { "x": 470, "y": 295, "type": "file", - "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel/YACReaderLibraryServer" + "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/YACReaderLibraryServer" }, { "x": 120, "y": 295, "type": "file", - "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel/README.md" + "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/README.md" }, { "x": 290, "y": 295, "type": "file", - "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel/COPYING.txt" + "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/COPYING.txt" } ] -} \ No newline at end of file +} From ed20264eadad96d94b82c0a72f02e7430d7a2fa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 10 Sep 2022 20:27:17 +0200 Subject: [PATCH 19/78] Try to make qt available in PATH for all tasks --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 04ad1a54..2fdd1c51 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -97,6 +97,7 @@ jobs: - script: | pip3 install aqtinstall python3 -m aqt install 6.3.1 mac desktop -m qt5compat qtmultimedia + echo '##vso[task.prependpath]$(Build.SourcesDirectory)/6.3.1/macos/bin' brew install create-dmg brew install node brew link --overwrite node @@ -112,7 +113,6 @@ jobs: certSecureFile: 'developerID_application.p12' certPwd: $(P12Password) - script: | - export PATH=$(Build.SourcesDirectory)/6.3.1/macos/bin:$PATH cd $(Build.SourcesDirectory) VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" echo "Trying to know if we are in a forked repo: $IS_FORK" From 2a493a438fccf20b4650ebd9dd3f9b255e3c66fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 11 Sep 2022 11:30:23 +0200 Subject: [PATCH 20/78] Build a Qt6 installer for win64 --- azure-pipelines-windows-template-qt6.yml | 28 ++-- ci/win/build_installer_qt6.iss | 182 +++++++++++++++++++++++ ci/win/create_installer.cmd | 6 +- 3 files changed, 201 insertions(+), 15 deletions(-) create mode 100644 ci/win/build_installer_qt6.iss diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index 707b0b37..b057ee66 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -38,20 +38,20 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% nmake check TESTARGS="-maxwarnings 100000" displayName: 'Run tests' -# - script: | -# set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% -# cd $(Build.SourcesDirectory)\ci\win -# .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) -# displayName: 'Create installer' -# - task: CopyFiles@2 -# inputs: -# sourceFolder: $(Build.SourcesDirectory)\ci\win\Output\ -# contents: '*' -# targetFolder: $(Build.ArtifactStagingDirectory) -# - task: PublishPipelineArtifact@1 -# inputs: -# path: $(Build.ArtifactStagingDirectory) -# artifactName: Windows ${{ parameters.architecture }} $(Build.BuildNumber) 7z Installer + - script: | + set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% + cd $(Build.SourcesDirectory)\ci\win + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 + displayName: 'Create installer' + - task: CopyFiles@2 + inputs: + sourceFolder: $(Build.SourcesDirectory)\ci\win\Output\ + contents: '*' + targetFolder: $(Build.ArtifactStagingDirectory) + - task: PublishPipelineArtifact@1 + inputs: + path: $(Build.ArtifactStagingDirectory) + artifactName: Windows ${{ parameters.architecture }} $(Build.BuildNumber) 7z Qt6 Installer diff --git a/ci/win/build_installer_qt6.iss b/ci/win/build_installer_qt6.iss new file mode 100644 index 00000000..ad5b01f1 --- /dev/null +++ b/ci/win/build_installer_qt6.iss @@ -0,0 +1,182 @@ +[Setup] +DefaultGroupName=YACReader +LanguageDetectionMethod=locale +AppName=YACReader +AppVerName=YACReader v{#VERSION}.{#BUILD_NUMBER} +AppVersion={#VERSION}.{#BUILD_NUMBER} +VersionInfoVersion={#VERSION} +DefaultDirName={pf}\YACReader +OutputBaseFilename=YACReader-v{#VERSION}.{#BUILD_NUMBER}-win{#PLATFORM}-{#COMPRESSED_ARCHIVE_BACKEND}-qt6 +LicenseFile=COPYING.txt +AlwaysUsePersonalGroup=true +OutputDir=..\Output +ChangesAssociations=true +SetupIconFile=setup.ico +UninstallDisplayIcon=uninstall.ico +ArchitecturesInstallIn64BitMode=x64 +ArchitecturesAllowed=x64 + +[Registry] +Root: HKCR; SubKey: .cbz; ValueType: string; ValueData: Comic Book (zip); Flags: uninsdeletekey; Tasks: File_association +Root: HKCR; SubKey: Comic Book (zip); ValueType: string; ValueData: Comic Book file; Flags: uninsdeletekey; Tasks: File_association +Root: HKCR; SubKey: Comic Book (zip)\Shell\Open\Command; ValueType: string; ValueData: """{app}\YACReader.exe"" ""%1"""; Flags: uninsdeletevalue; Tasks: File_association +Root: HKCR; Subkey: Comic Book (zip)\DefaultIcon; ValueType: string; ValueData: {app}\YACReader.exe,0; Flags: uninsdeletevalue; Tasks: File_association +Root: HKCR; SubKey: .cbr; ValueType: string; ValueData: Comic Book (rar); Flags: uninsdeletekey; Tasks: File_association +Root: HKCR; SubKey: Comic Book (rar); ValueType: string; ValueData: Comic Book file; Flags: uninsdeletekey; Tasks: File_association +Root: HKCR; SubKey: Comic Book (rar)\Shell\Open\Command; ValueType: string; ValueData: """{app}\YACReader.exe"" ""%1"""; Flags: uninsdeletevalue; Tasks: File_association +Root: HKCR; Subkey: Comic Book (rar)\DefaultIcon; ValueType: string; ValueData: {app}\YACReader.exe,0; Flags: uninsdeletevalue; Tasks: File_association +Root: HKCR; Subkey: .clc; ValueType: string; ValueData: Compressed Library Covers (clc); Flags: uninsdeletekey +Root: HKCR; SubKey: Compressed Library Covers (clc); ValueType: string; ValueData: Compressed Library Covers; Flags: uninsdeletekey +Root: HKCR; Subkey: Compressed Library Covers (clc)\DefaultIcon; ValueType: string; ValueData: {app}\YACReaderLibrary.exe,1; Flags: uninsdeletevalue +Root: HKCR; Subkey: .ydb; ValueType: string; ValueData: Compressed Library Covers (clc); Flags: uninsdeletekey +Root: HKCR; SubKey: YACReader Data Base (ydb); ValueType: string; ValueData: Compressed Library Covers; Flags: uninsdeletekey +Root: HKCR; Subkey: YACReader Data Base (ydb)\DefaultIcon; ValueType: string; ValueData: {app}\YACReaderLibrary.exe,1; Flags: uninsdeletevalue + +[Files] +;Qt Frameworks +Source: Qt6Core.dll; DestDir: {app} +Source: Qt6Core5Compat.dll; DestDir: {app} +Source: Qt6Gui.dll; DestDir: {app} +Source: Qt6Multimedia.dll; DestDir: {app} +Source: Qt6Network.dll; DestDir: {app} +Source: Qt6OpenGL.dll; DestDir: {app} +Source: Qt6OpenGLWidgets.dll; DestDir: {app} +Source: Qt6Qml.dll; DestDir: {app} +Source: Qt6QmlLocalStorage.dll; DestDir: {app} +Source: Qt6QmlModels.dll; DestDir: {app} +Source: Qt6QmlWorkerScript.dll; DestDir: {app} +Source: Qt6QmlXmlListModel.dll; DestDir: {app} +Source: Qt6Quick.dll; DestDir: {app} +Source: Qt6QuickControls2.dll; DestDir: {app} +Source: Qt6QuickControls2Impl.dll; DestDir: {app} +Source: Qt6QuickDialogs2.dll; DestDir: {app} +Source: Qt6QuickDialogs2QuickImpl.dll; DestDir: {app} +Source: Qt6QuickDialogs2Utils.dll; DestDir: {app} +Source: Qt6QuickLayouts.dll; DestDir: {app} +Source: Qt6QuickParticles.dll; DestDir: {app} +Source: Qt6QuickShapes.dll; DestDir: {app} +Source: Qt6QuickTemplates2.dll; DestDir: {app} +Source: Qt6QuickWidgets.dll; DestDir: {app} +Source: Qt6Sql.dll; DestDir: {app} +Source: Qt6Svg.dll; DestDir: {app} +Source: Qt6Widgets.dll; DestDir: {app} + +;Qt Angle +Source: D3Dcompiler_47.dll; DestDir: {app} +Source: opengl32sw.dll; DestDir: {app} + +;Qt QML +Source: QtQml\*; DestDir: {app}\QtQml\; Flags: recursesubdirs +Source: QtQuick\*; DestDir: {app}\QtQuick\; Flags: recursesubdirs + +;Qt5 Compat +Source: Qt5Compat\*; DestDir: {app}\Qt5Compat\; Flags: recursesubdirs + +;Qt PlugIns +Source:iconengines\*; DestDir: {app}\iconengines\ +Source:imageformats\*; DestDir: {app}\imageformats\ +Source:networkinformation\*; DestDir: {app}\networkinformation\ +Source:platforms\*; DestDir: {app}\platforms\ +Source:qmltooling\*; DestDir: {app}\qmltooling\ +Source:sqldrivers\qsqlite.dll; DestDir: {app}\sqldrivers\ +Source:styles\*; DestDir: {app}\styles\ +Source:tls\*; DestDir: {app}\tls\ +Source:translations\*; DestDir: {app}\translations\ + + +;Libs +Source: pdfium.dll; DestDir: {app} +Source: qrencode.dll; DestDir: {app} +Source: openssl\*; DestDir: {app} + +;vcredist +Source: "vc_redist.{#PLATFORM}.exe"; DestDir: {tmp}; Flags: deleteafterinstall + +;Utils +;Source: utils\7zip.exe; DestDir: {app}\utils\ +Source: utils\7z.dll; DestDir: {app}\utils\ + +;Bin +Source: YACReader.exe; DestDir: {app}; Permissions: everyone-full +Source: YACReaderLibrary.exe; DestDir: {app}; Permissions: everyone-full; Tasks: +Source: YACReaderLibraryServer.exe; DestDir: {app}; Permissions: everyone-full; Tasks: + +;License +Source: README.md; DestDir: {app}; Flags: isreadme +Source: COPYING.txt; DestDir: {app} + +;Languages +Source: languages\*; DestDir: {app}\languages\; Flags: recursesubdirs +;Server +Source: server\*; DestDir: {app}\server\; Flags: recursesubdirs + +[Dirs] +Name: {app}; Permissions: everyone-full + +[CustomMessages] +App=YACReader +AppLibrary=YACReaderLibrary +LaunchYACReaderLibrary=Start YACreaderLibrary after finishing installation +LaunchYACReader=Start YACreader after finishing installation + +[Run] +Filename: {tmp}\vc_redist.{#PLATFORM}.exe; \ +Parameters: "/uninstall /quiet /norestart"; \ +StatusMsg: "Uninstalling VC++ Redistributables..." + +Filename: {tmp}\vc_redist.{#PLATFORM}.exe; \ +Parameters: "/install /quiet /norestart"; \ +StatusMsg: "Installing VC++ Redistributables..." + +Filename: {app}\{cm:AppLibrary}.exe; Description: {cm:LaunchYACReaderLibrary,{cm:AppLibrary}}; Flags: nowait postinstall skipifsilent +Filename: {app}\{cm:App}.exe; Description: {cm:LaunchYACReader,{cm:App}}; Flags: nowait postinstall skipifsilent + +[Icons] +Name: {group}\YACReader; Filename: {app}\YACReader.exe; WorkingDir: {app}; IconIndex: 0 +Name: {group}\YACReader Library; Filename: {app}\YACReaderLibrary.exe; WorkingDir: {app}; IconIndex: 0 +;Name: {group}\YACReader Library Package; Filename: {app}\YACReaderLibrary.exe; WorkingDir: {app}; IconIndex: 0 +[Tasks] +Name: File_association; Description: Associate .cbz and .cbr files with YACReader +;Name: StartYACReaderAfterInstall; Description: Run YACReader after install +;Name: StartYACReaderLibraryAfterInstall; Description: Run YACReaderLibrary after install + +[ThirdPartySettings] +CompileLogMethod=append + +[Code] +var donationPage: TOutputMsgWizardPage; +var URLLabel: TNewStaticText; + +procedure URLLabelOnClick(Sender: TObject); +var ErrorCode: Integer; +begin +ShellExec('open', 'https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=5TAMNQCDDMVP8&item_name=YACReader¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode); +end; + +procedure InitializeWizard(); + +begin + + URLLabel := TNewStaticText.Create(WizardForm); + URLLabel.Caption:='Make a DONATION/Haz una DONACIÓN'; + URLLabel.Cursor:=crHand; + URLLabel.OnClick:=@URLLabelOnClick; + URLLabel.Parent:=WizardForm; + // Alter Font + URLLabel.Font.Style:=URLLabel.Font.Style + [fsUnderline]; + URLLabel.Font.Color:=clBlue; + URLLabel.Top:=250; + + URLLabel.Left:=35; + +donationPage := CreateOutputMsgPage(wpWelcome, + 'Iformation', 'Please read the following information before continuing.', + 'YACReader is FREE software. If you like it, please, consider to make a DONATION'#13#13 + + 'YACReader es software libre y GRATUITO. Si te gusta, por favor, considera realizar una DONACI�N'#13#13) + +end; + +procedure CurPageChanged(CurPageID: Integer); +begin +if CurPageID=donationPage.ID then URLLabel.Visible:=true else URLLabel.Visible:=false; +end; diff --git a/ci/win/create_installer.cmd b/ci/win/create_installer.cmd index bb0cf09a..c58d066b 100644 --- a/ci/win/create_installer.cmd +++ b/ci/win/create_installer.cmd @@ -58,6 +58,10 @@ if "%1"=="x86" ( type copy_build_installer.iss > build_installer.iss ) -iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer.iss || exit /b +if "%4"=="qt6" ( + iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer_qt6.iss || exit /b +) else ( + iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer.iss || exit /b +) cd .. \ No newline at end of file From f794227902233e77a7a29e9a11a4339c04ad1bab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 11 Sep 2022 13:47:06 +0200 Subject: [PATCH 21/78] Add the Qt version to System info dialog --- custom_widgets/help_about_dialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/custom_widgets/help_about_dialog.cpp b/custom_widgets/help_about_dialog.cpp index 19cd8f00..9c5d97cd 100644 --- a/custom_widgets/help_about_dialog.cpp +++ b/custom_widgets/help_about_dialog.cpp @@ -98,6 +98,7 @@ void HelpAboutDialog::loadSystemInfo() QString text; text.append("SYSTEM INFORMATION\n"); + text.append(QString("Qt version: %1\n").arg(qVersion())); text.append(QString("Build ABI: %1\n").arg(QSysInfo::buildAbi())); text.append(QString("build CPU architecture: %1\n").arg(QSysInfo::buildCpuArchitecture())); text.append(QString("CPU architecture: %1\n").arg(QSysInfo::currentCpuArchitecture())); From cba098b07f48305b648f70b5e849b93df005a72d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 11 Sep 2022 14:44:03 +0200 Subject: [PATCH 22/78] Include the OpenGL version in System Info --- custom_widgets/help_about_dialog.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/custom_widgets/help_about_dialog.cpp b/custom_widgets/help_about_dialog.cpp index 9c5d97cd..818adc80 100644 --- a/custom_widgets/help_about_dialog.cpp +++ b/custom_widgets/help_about_dialog.cpp @@ -1,5 +1,7 @@ #include "help_about_dialog.h" +#include "opengl_checker.h" + #include #include #include @@ -125,8 +127,10 @@ void HelpAboutDialog::loadSystemInfo() // text.append(QString("CPU: %1\n").arg(tempOutput)); // } + auto openGLChecker = OpenGLChecker(); text.append("\nGRAPHIC INFORMATION\n"); text.append(QString("Screen pixel ratio: %1\n").arg(devicePixelRatioF())); + text.append(QString("OpenGL version: %1\n").arg(openGLChecker.textVersionDescription())); // if (QSysInfo::kernelType() == "winnt") { // QString gpu = "wmic PATH Win32_videocontroller get VideoProcessor"; From 91e3d5c07ad4d9cc418ae8d7a8b3510c6cca7c9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 11 Sep 2022 16:29:11 +0200 Subject: [PATCH 23/78] Build linux/qt6 flavor in CI --- azure-pipelines.yml | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2fdd1c51..dc86a96e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -82,6 +82,46 @@ jobs: path: $(Build.ArtifactStagingDirectory) artifactName: src $(Build.BuildNumber) tarball +# +# Linux qt6 +# + +- job: Linux qt6 + dependsOn: CodeFormatValidation + pool: + vmImage: 'ubuntu-22.04' + steps: + - script: | + sudo apt-get update + sudo apt-get install -y qtchooser qt6-base-dev-tools qmake6 \ + qt6-base-dev qt6-multimedia-dev libpoppler-qt6-dev \ + libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev libqt6quickcontrols2-6-dev + displayName: 'Install dependencies' + # - script: | + # cd $(Build.SourcesDirectory) + # VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" + # ./mktarball.sh $VERSION.$(Build.BuildNumber) + # mkdir tarball + # cp yacreader-*-src.tar.xz* tarball\ + # displayName: 'Create tarball' + - script: | + export DEFINES_VAR=DEFINES+\=\"BUILD_NUMBER=\\\\\\\"$(Build.BuildNumber)\\\\\\\"\" + qmake CONFIG+="unarr" $DEFINES_VAR + make + displayName: 'Build' + - script: | + make check TESTARGS="-maxwarnings 100000" + displayName: 'Run tests' + # - task: CopyFiles@2 + # inputs: + # sourceFolder: $(Build.SourcesDirectory)/tarball + # contents: '*' + # targetFolder: $(Build.ArtifactStagingDirectory) + # - task: PublishPipelineArtifact@1 + # inputs: + # path: $(Build.ArtifactStagingDirectory) + # artifactName: src $(Build.BuildNumber) tarball + # # MacOS qt6 # From 1e441768b6bcc8333cf69f30196b9335c007a903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 11 Sep 2022 16:40:24 +0200 Subject: [PATCH 24/78] Remove commented tasks --- azure-pipelines.yml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index dc86a96e..241581eb 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -97,13 +97,6 @@ jobs: qt6-base-dev qt6-multimedia-dev libpoppler-qt6-dev \ libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev libqt6quickcontrols2-6-dev displayName: 'Install dependencies' - # - script: | - # cd $(Build.SourcesDirectory) - # VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" - # ./mktarball.sh $VERSION.$(Build.BuildNumber) - # mkdir tarball - # cp yacreader-*-src.tar.xz* tarball\ - # displayName: 'Create tarball' - script: | export DEFINES_VAR=DEFINES+\=\"BUILD_NUMBER=\\\\\\\"$(Build.BuildNumber)\\\\\\\"\" qmake CONFIG+="unarr" $DEFINES_VAR @@ -112,15 +105,6 @@ jobs: - script: | make check TESTARGS="-maxwarnings 100000" displayName: 'Run tests' - # - task: CopyFiles@2 - # inputs: - # sourceFolder: $(Build.SourcesDirectory)/tarball - # contents: '*' - # targetFolder: $(Build.ArtifactStagingDirectory) - # - task: PublishPipelineArtifact@1 - # inputs: - # path: $(Build.ArtifactStagingDirectory) - # artifactName: src $(Build.BuildNumber) tarball # # MacOS qt6 From 37bbb75b64cbb4839a001d2246aebcaa99d47ee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 11 Sep 2022 16:48:05 +0200 Subject: [PATCH 25/78] Fix job name --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 241581eb..c104afa4 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -86,7 +86,7 @@ jobs: # Linux qt6 # -- job: Linux qt6 +- job: Linux_qt6 dependsOn: CodeFormatValidation pool: vmImage: 'ubuntu-22.04' From 32dfa429e7c33a2b7238b9c74e09529d24dd73d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 12 Sep 2022 16:18:57 +0200 Subject: [PATCH 26/78] Try to compile linux/qt6 with missing packages --- azure-pipelines.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c104afa4..6dc96fcf 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -94,12 +94,12 @@ jobs: - script: | sudo apt-get update sudo apt-get install -y qtchooser qt6-base-dev-tools qmake6 \ - qt6-base-dev qt6-multimedia-dev libpoppler-qt6-dev \ - libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev libqt6quickcontrols2-6-dev + qt6-base-dev qt6-multimedia-dev \ + libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev displayName: 'Install dependencies' - script: | export DEFINES_VAR=DEFINES+\=\"BUILD_NUMBER=\\\\\\\"$(Build.BuildNumber)\\\\\\\"\" - qmake CONFIG+="unarr" $DEFINES_VAR + qmake CONFIG+="unarr no_pdf" $DEFINES_VAR make displayName: 'Build' - script: | From cf74947c17537c6b01acbe7578966afd1ac7b769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 12 Sep 2022 16:31:49 +0200 Subject: [PATCH 27/78] print qmake version --- azure-pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 6dc96fcf..a9ef0005 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -100,6 +100,7 @@ jobs: - script: | export DEFINES_VAR=DEFINES+\=\"BUILD_NUMBER=\\\\\\\"$(Build.BuildNumber)\\\\\\\"\" qmake CONFIG+="unarr no_pdf" $DEFINES_VAR + qmake -v make displayName: 'Build' - script: | From 4fd36643ceb7fb786c714261c7e077ce29a4b954 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 12 Sep 2022 16:38:47 +0200 Subject: [PATCH 28/78] more nonsense --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a9ef0005..b4b3a860 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -93,7 +93,7 @@ jobs: steps: - script: | sudo apt-get update - sudo apt-get install -y qtchooser qt6-base-dev-tools qmake6 \ + sudo apt-get install -y qtchooser qt6-tools-dev qt6-base-dev-tools qmake6 qmake6-bin \ qt6-base-dev qt6-multimedia-dev \ libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev displayName: 'Install dependencies' From c3a2a35a163170dae098284bf3493871c9aae633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 12 Sep 2022 16:51:25 +0200 Subject: [PATCH 29/78] Check if qt6 is properly installed --- azure-pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b4b3a860..4aa40e0a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -98,6 +98,7 @@ jobs: libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev displayName: 'Install dependencies' - script: | + qtchooser -list-versions export DEFINES_VAR=DEFINES+\=\"BUILD_NUMBER=\\\\\\\"$(Build.BuildNumber)\\\\\\\"\" qmake CONFIG+="unarr no_pdf" $DEFINES_VAR qmake -v From 395068d001a4014124aad4d640a1691ced4dd9d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 12 Sep 2022 17:50:23 +0200 Subject: [PATCH 30/78] Install qt6-tools-dev-tools --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 4aa40e0a..2b8b74f0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -94,7 +94,7 @@ jobs: - script: | sudo apt-get update sudo apt-get install -y qtchooser qt6-tools-dev qt6-base-dev-tools qmake6 qmake6-bin \ - qt6-base-dev qt6-multimedia-dev \ + qt6-base-dev qt6-multimedia-dev qt6-tools-dev-tools \ libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev displayName: 'Install dependencies' - script: | From 2c0f46bb181a0ac6a73496cf6f4fdd6561ecbf6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 12 Sep 2022 20:00:15 +0200 Subject: [PATCH 31/78] Use qmake6 --- azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2b8b74f0..0f403ff8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -100,8 +100,8 @@ jobs: - script: | qtchooser -list-versions export DEFINES_VAR=DEFINES+\=\"BUILD_NUMBER=\\\\\\\"$(Build.BuildNumber)\\\\\\\"\" - qmake CONFIG+="unarr no_pdf" $DEFINES_VAR - qmake -v + qmake6 CONFIG+="unarr no_pdf" $DEFINES_VAR + qmake6 -v make displayName: 'Build' - script: | From ad84a458d01a932e41ddc56db5ee02c6133f5546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 12 Sep 2022 20:09:49 +0200 Subject: [PATCH 32/78] Install libqt6core5compat6-dev --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 0f403ff8..98133ed8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -95,7 +95,7 @@ jobs: sudo apt-get update sudo apt-get install -y qtchooser qt6-tools-dev qt6-base-dev-tools qmake6 qmake6-bin \ qt6-base-dev qt6-multimedia-dev qt6-tools-dev-tools \ - libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev + libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev libqt6core5compat6-dev displayName: 'Install dependencies' - script: | qtchooser -list-versions From 8ac5404452c1565a60abb8f203d0894b4e32e011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 12 Sep 2022 20:20:50 +0200 Subject: [PATCH 33/78] Install libgl-dev --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 98133ed8..d3ba0f0f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -94,7 +94,7 @@ jobs: - script: | sudo apt-get update sudo apt-get install -y qtchooser qt6-tools-dev qt6-base-dev-tools qmake6 qmake6-bin \ - qt6-base-dev qt6-multimedia-dev qt6-tools-dev-tools \ + qt6-base-dev qt6-multimedia-dev qt6-tools-dev-tools libgl-dev \ libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev libqt6core5compat6-dev displayName: 'Install dependencies' - script: | From 379c6510f0e30d3254a5cc2f9088730b1d27d1e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 12 Sep 2022 21:10:44 +0200 Subject: [PATCH 34/78] Title can't be more than 27 characters --- dmg.json | 95 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 47 insertions(+), 48 deletions(-) diff --git a/dmg.json b/dmg.json index d5ba3a78..26540e47 100644 --- a/dmg.json +++ b/dmg.json @@ -1,50 +1,49 @@ { - "title": "YACReader-#VERSION#.#BUILD_NUMBER# #QT_VERSION#", - "icon": "icon.icns", - "background": "background.png", - "window": { - "size": { - "width": 600, - "height": 403 - } - }, - "icon-size": 128, - "contents": [ - { - "x": 485, - "y": 90, - "type": "link", - "path": "/Applications" + "title": "YACReader-#VERSION#.#BUILD_NUMBER##QT_VERSION#", + "icon": "icon.icns", + "background": "background.png", + "window": { + "size": { + "width": 600, + "height": 403 + } }, - { - "x": 80, - "y": 90, - "type": "file", - "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/YACReader.app" - }, - { - "x": 235, - "y": 90, - "type": "file", - "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/YACReaderLibrary.app" - }, - { - "x": 470, - "y": 295, - "type": "file", - "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/YACReaderLibraryServer" - }, - { - "x": 120, - "y": 295, - "type": "file", - "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/README.md" - }, - { - "x": 290, - "y": 295, - "type": "file", - "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/COPYING.txt" - } - ] -} + "icon-size": 128, + "contents": [{ + "x": 485, + "y": 90, + "type": "link", + "path": "/Applications" + }, + { + "x": 80, + "y": 90, + "type": "file", + "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/YACReader.app" + }, + { + "x": 235, + "y": 90, + "type": "file", + "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/YACReaderLibrary.app" + }, + { + "x": 470, + "y": 295, + "type": "file", + "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/YACReaderLibraryServer" + }, + { + "x": 120, + "y": 295, + "type": "file", + "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/README.md" + }, + { + "x": 290, + "y": 295, + "type": "file", + "path": "YACReader-#VERSION#.#BUILD_NUMBER# MacOSX-Intel #QT_VERSION#/COPYING.txt" + } + ] +} \ No newline at end of file From 7cf26f6f1d4cb37bd3caad16778ade039088f96c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Tue, 13 Sep 2022 07:55:55 +0200 Subject: [PATCH 35/78] Wait for MacOS_qt6 on releases --- azure-pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d3ba0f0f..ca90f537 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -303,6 +303,7 @@ jobs: dependsOn: - Linux - MacOS + - MacOS_qt6 - Windows_x86 - Windows_x64 - Windows_x64_qt6 From d99683460dcdee987aa62f39f0533818c444debb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Tue, 13 Sep 2022 13:36:54 +0200 Subject: [PATCH 36/78] Try to change the qt6 installer enough to avoid false virus positives --- ci/win/build_installer_qt6.iss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ci/win/build_installer_qt6.iss b/ci/win/build_installer_qt6.iss index ad5b01f1..3db56cf7 100644 --- a/ci/win/build_installer_qt6.iss +++ b/ci/win/build_installer_qt6.iss @@ -34,6 +34,7 @@ Root: HKCR; Subkey: YACReader Data Base (ydb)\DefaultIcon; ValueType: string; Va [Files] ;Qt Frameworks +Source: Qt6Widgets.dll; DestDir: {app} Source: Qt6Core.dll; DestDir: {app} Source: Qt6Core5Compat.dll; DestDir: {app} Source: Qt6Gui.dll; DestDir: {app} @@ -59,11 +60,11 @@ Source: Qt6QuickTemplates2.dll; DestDir: {app} Source: Qt6QuickWidgets.dll; DestDir: {app} Source: Qt6Sql.dll; DestDir: {app} Source: Qt6Svg.dll; DestDir: {app} -Source: Qt6Widgets.dll; DestDir: {app} + ;Qt Angle -Source: D3Dcompiler_47.dll; DestDir: {app} Source: opengl32sw.dll; DestDir: {app} +Source: D3Dcompiler_47.dll; DestDir: {app} ;Qt QML Source: QtQml\*; DestDir: {app}\QtQml\; Flags: recursesubdirs From 177eae4cf77d26b3b48f460c6ebdef9d9b3769c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Wed, 14 Sep 2022 15:31:37 +0200 Subject: [PATCH 37/78] sign all the contents in the dmg --- compileOSX.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/compileOSX.sh b/compileOSX.sh index 6dd091d2..12a8f485 100755 --- a/compileOSX.sh +++ b/compileOSX.sh @@ -87,6 +87,15 @@ cp -R YACReaderLibraryServer.app "${dest}/YACReaderLibraryServer" cp COPYING.txt "${dest}/" cp README.md "${dest}/" +if [ "$SKIP_CODESIGN" = false ]; then + echo "Signing apps" + codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/YACReader.app" + codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/YACReaderLibrary.app" + codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/YACReaderLibraryServer.app" + codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/COPYING.txt" + codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/README.md" +fi + echo "Creating dmg package" sed -i'' -e "s/#VERSION#/$VERSION/g" dmg.json From 09f74607637607ea35386e582387bc6e5c393e3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Wed, 14 Sep 2022 16:19:08 +0200 Subject: [PATCH 38/78] Fix dest folder name --- compileOSX.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compileOSX.sh b/compileOSX.sh index 12a8f485..6cc7a9df 100755 --- a/compileOSX.sh +++ b/compileOSX.sh @@ -91,7 +91,7 @@ if [ "$SKIP_CODESIGN" = false ]; then echo "Signing apps" codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/YACReader.app" codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/YACReaderLibrary.app" - codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/YACReaderLibraryServer.app" + codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/YACReaderLibraryServer" codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/COPYING.txt" codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/README.md" fi From d7eaf970b7b712bc68fd35410a955aff0b1e9ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Wed, 14 Sep 2022 17:34:10 +0200 Subject: [PATCH 39/78] Enable hardened runtime --- compileOSX.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/compileOSX.sh b/compileOSX.sh index 6cc7a9df..151e9f84 100755 --- a/compileOSX.sh +++ b/compileOSX.sh @@ -89,11 +89,11 @@ cp README.md "${dest}/" if [ "$SKIP_CODESIGN" = false ]; then echo "Signing apps" - codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/YACReader.app" - codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/YACReaderLibrary.app" - codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/YACReaderLibraryServer" - codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/COPYING.txt" - codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}/README.md" + codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" --options runtime "./${dest}/YACReader.app" + codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" --options runtime "./${dest}/YACReaderLibrary.app" + codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" --options runtime "./${dest}/YACReaderLibraryServer" + codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" --options runtime "./${dest}/COPYING.txt" + codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" --options runtime "./${dest}/README.md" fi echo "Creating dmg package" @@ -105,7 +105,7 @@ appdmg dmg.json "$dest.dmg" if [ "$SKIP_CODESIGN" = false ]; then echo "Signing dmg" - codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" "./${dest}.dmg" + codesign --force --deep --sign "Developer ID Application: LUIS ANGEL SAN MARTIN ROD (9B6KKVW3WM)" --options runtime "./${dest}.dmg" fi echo "Done!" From 2761a312d767161be1bc25446d04e5ec1b96f8cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Wed, 14 Sep 2022 18:43:20 +0200 Subject: [PATCH 40/78] Notarize macos dmgs --- azure-pipelines.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ca90f537..872227f3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -150,6 +150,13 @@ jobs: qmake make check TESTARGS="-maxwarnings 100000" displayName: 'Build and run tests' + - script: | + SKIP_CODESIGN="$(tr [A-Z] [a-z] <<< "$IS_FORK")" + if [ "$SKIP_CODESIGN" = false ]; then + xcrun notarytool submit *.dmg --apple-id $(AppleId) --team-id $(TeamId) --password $(AppPassword) --wait + xcrun stapler staple *.dmg + fi + displayName: 'Notarize' - task: CopyFiles@2 inputs: contents: '*.dmg' @@ -200,6 +207,13 @@ jobs: qmake make check TESTARGS="-maxwarnings 100000" displayName: 'Build and run tests' + - script: | + SKIP_CODESIGN="$(tr [A-Z] [a-z] <<< "$IS_FORK")" + if [ "$SKIP_CODESIGN" = false ]; then + xcrun notarytool submit *.dmg --apple-id $(AppleId) --team-id $(TeamId) --password $(AppPassword) --wait + xcrun stapler staple *.dmg + fi + displayName: 'Notarize' - task: CopyFiles@2 inputs: contents: '*.dmg' From e6a8e83d2d3c0cf07c0578eb07f6fa253aa0a34e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 15:08:35 +0200 Subject: [PATCH 41/78] Install image formats module in qt6 --- azure-pipelines-windows-template-qt6.yml | 2 +- azure-pipelines.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index b057ee66..cb38fba8 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -17,7 +17,7 @@ jobs: - script: | pip install aqtinstall mkdir C:\Qt - python -m aqt install -O c:\Qt ${{ parameters.qt_version }} windows desktop ${{ parameters.qt_aqt_spec }} -m qt5compat qtmultimedia + python -m aqt install -O c:\Qt ${{ parameters.qt_version }} windows desktop ${{ parameters.qt_aqt_spec }} -m qt5compat qtmultimedia qtimageformats dir C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin choco install -y wget choco install innosetup diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 872227f3..2bc198dc 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -122,7 +122,7 @@ jobs: steps: - script: | pip3 install aqtinstall - python3 -m aqt install 6.3.1 mac desktop -m qt5compat qtmultimedia + python3 -m aqt install 6.3.1 mac desktop -m qt5compat qtmultimedia qtimageformats echo '##vso[task.prependpath]$(Build.SourcesDirectory)/6.3.1/macos/bin' brew install create-dmg brew install node From c801801ac8d086016927fb51848891ee530c1df3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 15:39:18 +0200 Subject: [PATCH 42/78] Try to codesign windows installers --- azure-pipelines-windows-template-qt6.yml | 11 ++++++++++- azure-pipelines-windows-template.yml | 11 ++++++++++- ci/win/create_installer.cmd | 4 ++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index cb38fba8..0a83adf9 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -11,6 +11,9 @@ parameters: jobs: - job: ${{ parameters.name }} dependsOn: CodeFormatValidation + variables: + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - group: windows-codesign pool: vmImage: 'windows-2019' steps: @@ -38,10 +41,16 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% nmake check TESTARGS="-maxwarnings 100000" displayName: 'Run tests' + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - task: DownloadSecureFile@1 + name: pdxFile + displayName: 'Get the pfx file certificate' + inputs: + secureFile: 'certificate.pdx' - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(pdxFile) $(pdxPassword) displayName: 'Create installer' - task: CopyFiles@2 inputs: diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index 23d039d9..8fae23f7 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -11,6 +11,9 @@ parameters: jobs: - job: ${{ parameters.name }} dependsOn: CodeFormatValidation + variables: + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - group: windows-codesign pool: vmImage: 'windows-2019' steps: @@ -38,10 +41,16 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% nmake check TESTARGS="-maxwarnings 100000" displayName: 'Run tests' + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - task: DownloadSecureFile@1 + name: pdxFile + displayName: 'Get the pfx file certificate' + inputs: + secureFile: 'certificate.pdx' - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(pdxFile) $(pdxPassword) displayName: 'Create installer' - task: CopyFiles@2 inputs: diff --git a/ci/win/create_installer.cmd b/ci/win/create_installer.cmd index c58d066b..b3b729e7 100644 --- a/ci/win/create_installer.cmd +++ b/ci/win/create_installer.cmd @@ -59,9 +59,9 @@ if "%1"=="x86" ( ) if "%4"=="qt6" ( - iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer_qt6.iss || exit /b + iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer_qt6.iss "/Ssigntool=signtool.exe sign /f %5 /p %6 $f" || exit /b ) else ( - iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer.iss || exit /b + iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer.iss "/Ssigntool=signtool.exe sign /f %5 /p %6 $f" || exit /b ) cd .. \ No newline at end of file From 2475c876d16ce1f07f0ffbbea0c36780796130ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 16:26:38 +0200 Subject: [PATCH 43/78] Add some debug output to create_installer.cmd --- ci/win/create_installer.cmd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ci/win/create_installer.cmd b/ci/win/create_installer.cmd index b3b729e7..5766b211 100644 --- a/ci/win/create_installer.cmd +++ b/ci/win/create_installer.cmd @@ -58,10 +58,12 @@ if "%1"=="x86" ( type copy_build_installer.iss > build_installer.iss ) +echo "iscc start" if "%4"=="qt6" ( iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer_qt6.iss "/Ssigntool=signtool.exe sign /f %5 /p %6 $f" || exit /b ) else ( iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer.iss "/Ssigntool=signtool.exe sign /f %5 /p %6 $f" || exit /b ) +echo "iscc done!" cd .. \ No newline at end of file From e9a6dc978beb4e6d3a87ea16a57d4e78a0a8553b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 17:55:27 +0200 Subject: [PATCH 44/78] Fix code sign in windows --- azure-pipelines-windows-template-qt6.yml | 6 +++--- azure-pipelines-windows-template.yml | 6 +++--- ci/win/build_installer.iss | 1 + ci/win/build_installer_qt6.iss | 3 ++- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index 0a83adf9..f4623f01 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -43,14 +43,14 @@ jobs: displayName: 'Run tests' - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - task: DownloadSecureFile@1 - name: pdxFile + name: pfxFile displayName: 'Get the pfx file certificate' inputs: - secureFile: 'certificate.pdx' + secureFile: 'certificate.pfx' - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(pdxFile) $(pdxPassword) + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(pfxFile.secureFilePath) $(pdxPassword) displayName: 'Create installer' - task: CopyFiles@2 inputs: diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index 8fae23f7..98ecac22 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -43,14 +43,14 @@ jobs: displayName: 'Run tests' - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - task: DownloadSecureFile@1 - name: pdxFile + name: pfxFile displayName: 'Get the pfx file certificate' inputs: - secureFile: 'certificate.pdx' + secureFile: 'certificate.pfx' - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(pdxFile) $(pdxPassword) + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(pfxFile.secureFilePath) $(pdxPassword) displayName: 'Create installer' - task: CopyFiles@2 inputs: diff --git a/ci/win/build_installer.iss b/ci/win/build_installer.iss index 420ab1d0..7a2e9a83 100644 --- a/ci/win/build_installer.iss +++ b/ci/win/build_installer.iss @@ -15,6 +15,7 @@ SetupIconFile=setup.ico UninstallDisplayIcon=uninstall.ico ArchitecturesInstallIn64BitMode=x64 ArchitecturesAllowed=x64 +SignTool=signtool [Registry] Root: HKCR; SubKey: .cbz; ValueType: string; ValueData: Comic Book (zip); Flags: uninsdeletekey; Tasks: File_association diff --git a/ci/win/build_installer_qt6.iss b/ci/win/build_installer_qt6.iss index 3db56cf7..ec5fe9e9 100644 --- a/ci/win/build_installer_qt6.iss +++ b/ci/win/build_installer_qt6.iss @@ -15,6 +15,7 @@ SetupIconFile=setup.ico UninstallDisplayIcon=uninstall.ico ArchitecturesInstallIn64BitMode=x64 ArchitecturesAllowed=x64 +SignTool=signtool [Registry] Root: HKCR; SubKey: .cbz; ValueType: string; ValueData: Comic Book (zip); Flags: uninsdeletekey; Tasks: File_association @@ -98,7 +99,7 @@ Source: "vc_redist.{#PLATFORM}.exe"; DestDir: {tmp}; Flags: deleteafterinstall Source: utils\7z.dll; DestDir: {app}\utils\ ;Bin -Source: YACReader.exe; DestDir: {app}; Permissions: everyone-full +Source: YACReader.exe; DestDir: {app}; Permissions: everyone-full; Source: YACReaderLibrary.exe; DestDir: {app}; Permissions: everyone-full; Tasks: Source: YACReaderLibraryServer.exe; DestDir: {app}; Permissions: everyone-full; Tasks: From c8e62badcccdedb51995acf4f577272cc433e2e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 18:56:05 +0200 Subject: [PATCH 45/78] Try to solve `The system cannot find the file specified` error --- azure-pipelines-windows-template-qt6.yml | 2 +- azure-pipelines-windows-template.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index f4623f01..d5d65bc6 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -50,7 +50,7 @@ jobs: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(pfxFile.secureFilePath) $(pdxPassword) + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(Agent.TempDirectory)\certificate.pfx $(pdxPassword) displayName: 'Create installer' - task: CopyFiles@2 inputs: diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index 98ecac22..65e17f64 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -50,7 +50,7 @@ jobs: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(pfxFile.secureFilePath) $(pdxPassword) + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(Agent.TempDirectory)\certificate.pfx $(pdxPassword) displayName: 'Create installer' - task: CopyFiles@2 inputs: From 98c3ce93acb6361ccbfdbd685e9bd385157d464b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 19:30:24 +0200 Subject: [PATCH 46/78] Set the code sign password as an env variable --- azure-pipelines-windows-template-qt6.yml | 4 +++- azure-pipelines-windows-template.yml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index d5d65bc6..28cb5659 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -50,7 +50,9 @@ jobs: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(Agent.TempDirectory)\certificate.pfx $(pdxPassword) + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(Agent.TempDirectory)\certificate.pfx $($env:PASSWORD) + env: + PASSWORD: $(pfxPassword) displayName: 'Create installer' - task: CopyFiles@2 inputs: diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index 65e17f64..b343bd55 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -50,7 +50,9 @@ jobs: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(Agent.TempDirectory)\certificate.pfx $(pdxPassword) + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(Agent.TempDirectory)\certificate.pfx $($env:PASSWORD) + env: + PASSWORD: $(pfxPassword) displayName: 'Create installer' - task: CopyFiles@2 inputs: From 60dec5f1cab2324190f0369b7ab1a7c95849239e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 19:35:15 +0200 Subject: [PATCH 47/78] Avoid leaking secrets --- azure-pipelines-windows-template-qt6.yml | 1 + azure-pipelines-windows-template.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index 28cb5659..9f10274a 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -51,6 +51,7 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(Agent.TempDirectory)\certificate.pfx $($env:PASSWORD) + write-output: "##vso[task.setsecret]$(pfxPassword)" env: PASSWORD: $(pfxPassword) displayName: 'Create installer' diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index b343bd55..c49ea3bc 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -51,6 +51,7 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(Agent.TempDirectory)\certificate.pfx $($env:PASSWORD) + write-output: "##vso[task.setsecret]$(pfxPassword)" env: PASSWORD: $(pfxPassword) displayName: 'Create installer' From 4542b3711de1f46ad92294f97cfbf1821e5bf125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 19:42:56 +0200 Subject: [PATCH 48/78] Revert Azure pipelines should hide any secret by default --- azure-pipelines-windows-template-qt6.yml | 1 - azure-pipelines-windows-template.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index 9f10274a..28cb5659 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -51,7 +51,6 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(Agent.TempDirectory)\certificate.pfx $($env:PASSWORD) - write-output: "##vso[task.setsecret]$(pfxPassword)" env: PASSWORD: $(pfxPassword) displayName: 'Create installer' diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index c49ea3bc..b343bd55 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -51,7 +51,6 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(Agent.TempDirectory)\certificate.pfx $($env:PASSWORD) - write-output: "##vso[task.setsecret]$(pfxPassword)" env: PASSWORD: $(pfxPassword) displayName: 'Create installer' From 09cfe3bac4432c9d5fe328943c4908116ca787f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 20:05:02 +0200 Subject: [PATCH 49/78] Try using the variable directly --- azure-pipelines-windows-template-qt6.yml | 2 +- azure-pipelines-windows-template.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index 28cb5659..af5b0b20 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -50,7 +50,7 @@ jobs: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(Agent.TempDirectory)\certificate.pfx $($env:PASSWORD) + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(Agent.TempDirectory)\certificate.pfx %PASSWORD% env: PASSWORD: $(pfxPassword) displayName: 'Create installer' diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index b343bd55..4bdb232b 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -50,7 +50,7 @@ jobs: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(Agent.TempDirectory)\certificate.pfx $($env:PASSWORD) + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(Agent.TempDirectory)\certificate.pfx %PASSWORD% env: PASSWORD: $(pfxPassword) displayName: 'Create installer' From 4f26db8b03bb5dc68fa57b4222547fc0b1fc174d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 20:51:48 +0200 Subject: [PATCH 50/78] Use signtool directly --- azure-pipelines-windows-template-qt6.yml | 4 +--- azure-pipelines-windows-template.yml | 4 +--- ci/win/build_installer.iss | 1 - ci/win/build_installer_qt6.iss | 1 - ci/win/create_installer.cmd | 6 ++++-- 5 files changed, 6 insertions(+), 10 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index af5b0b20..6f480b06 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -50,9 +50,7 @@ jobs: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(Agent.TempDirectory)\certificate.pfx %PASSWORD% - env: - PASSWORD: $(pfxPassword) + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(pfxFile.secureFilePath) $(pfxPassword) displayName: 'Create installer' - task: CopyFiles@2 inputs: diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index 4bdb232b..c1100cfe 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -50,9 +50,7 @@ jobs: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(Agent.TempDirectory)\certificate.pfx %PASSWORD% - env: - PASSWORD: $(pfxPassword) + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(pfxFile.secureFilePath) $(pfxPassword) displayName: 'Create installer' - task: CopyFiles@2 inputs: diff --git a/ci/win/build_installer.iss b/ci/win/build_installer.iss index 7a2e9a83..420ab1d0 100644 --- a/ci/win/build_installer.iss +++ b/ci/win/build_installer.iss @@ -15,7 +15,6 @@ SetupIconFile=setup.ico UninstallDisplayIcon=uninstall.ico ArchitecturesInstallIn64BitMode=x64 ArchitecturesAllowed=x64 -SignTool=signtool [Registry] Root: HKCR; SubKey: .cbz; ValueType: string; ValueData: Comic Book (zip); Flags: uninsdeletekey; Tasks: File_association diff --git a/ci/win/build_installer_qt6.iss b/ci/win/build_installer_qt6.iss index ec5fe9e9..4616286a 100644 --- a/ci/win/build_installer_qt6.iss +++ b/ci/win/build_installer_qt6.iss @@ -15,7 +15,6 @@ SetupIconFile=setup.ico UninstallDisplayIcon=uninstall.ico ArchitecturesInstallIn64BitMode=x64 ArchitecturesAllowed=x64 -SignTool=signtool [Registry] Root: HKCR; SubKey: .cbz; ValueType: string; ValueData: Comic Book (zip); Flags: uninsdeletekey; Tasks: File_association diff --git a/ci/win/create_installer.cmd b/ci/win/create_installer.cmd index 5766b211..977a1134 100644 --- a/ci/win/create_installer.cmd +++ b/ci/win/create_installer.cmd @@ -60,10 +60,12 @@ if "%1"=="x86" ( echo "iscc start" if "%4"=="qt6" ( - iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer_qt6.iss "/Ssigntool=signtool.exe sign /f %5 /p %6 $f" || exit /b + iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer_qt6.iss || exit /b ) else ( - iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer.iss "/Ssigntool=signtool.exe sign /f %5 /p %6 $f" || exit /b + iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer.iss || exit /b ) echo "iscc done!" +signtool.exe sign /f %5 /p %6 ..\Output\*.exe + cd .. \ No newline at end of file From c96bfeaf59e3b35bc0fd736582b01b0dedb57ee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 21:23:25 +0200 Subject: [PATCH 51/78] signtool.exe is not in the path --- ci/win/create_installer.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/win/create_installer.cmd b/ci/win/create_installer.cmd index 977a1134..ae46641f 100644 --- a/ci/win/create_installer.cmd +++ b/ci/win/create_installer.cmd @@ -66,6 +66,6 @@ if "%4"=="qt6" ( ) echo "iscc done!" -signtool.exe sign /f %5 /p %6 ..\Output\*.exe +"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /f %5 /p %6 ..\Output\*.exe || exit /b cd .. \ No newline at end of file From 7d9f46e23a0fce02ff0727a269bb73dce4b3e392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 22:20:11 +0200 Subject: [PATCH 52/78] Try another path for signtool --- ci/win/create_installer.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/win/create_installer.cmd b/ci/win/create_installer.cmd index ae46641f..7cae872b 100644 --- a/ci/win/create_installer.cmd +++ b/ci/win/create_installer.cmd @@ -66,6 +66,6 @@ if "%4"=="qt6" ( ) echo "iscc done!" -"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /f %5 /p %6 ..\Output\*.exe || exit /b +"C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe" sign /f %5 /p %6 ..\Output\*.exe || exit /b cd .. \ No newline at end of file From b46b1411b2b8ac4fd534343b5b59218b514e38b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 22:50:38 +0200 Subject: [PATCH 53/78] Extract code sign --- azure-pipelines-windows-template-qt6.yml | 3 ++- azure-pipelines-windows-template.yml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index 6f480b06..960a983c 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -50,7 +50,8 @@ jobs: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(pfxFile.secureFilePath) $(pfxPassword) + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 + "C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe" sign /f $(pfxFile.secureFilePath) /p $(pfxPassword) ..\Output\*.exe displayName: 'Create installer' - task: CopyFiles@2 inputs: diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index c1100cfe..32a0653f 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -50,7 +50,8 @@ jobs: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(pfxFile.secureFilePath) $(pfxPassword) + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 + "C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe" sign /f $(pfxFile.secureFilePath) /p $(pfxPassword) ..\Output\*.exe displayName: 'Create installer' - task: CopyFiles@2 inputs: From db970ef8cc525f3fb868da1dec0acc9ae933ab45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 15 Sep 2022 23:18:00 +0200 Subject: [PATCH 54/78] Commit missing change --- ci/win/create_installer.cmd | 2 -- 1 file changed, 2 deletions(-) diff --git a/ci/win/create_installer.cmd b/ci/win/create_installer.cmd index 7cae872b..83af562f 100644 --- a/ci/win/create_installer.cmd +++ b/ci/win/create_installer.cmd @@ -66,6 +66,4 @@ if "%4"=="qt6" ( ) echo "iscc done!" -"C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe" sign /f %5 /p %6 ..\Output\*.exe || exit /b - cd .. \ No newline at end of file From 79ac4cf824ff65942454d5f376004bcbe2359c7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Fri, 16 Sep 2022 07:43:32 +0200 Subject: [PATCH 55/78] Remove echo --- azure-pipelines-windows-template-qt6.yml | 2 +- azure-pipelines-windows-template.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index 960a983c..5ab1f0f2 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -51,7 +51,7 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 - "C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe" sign /f $(pfxFile.secureFilePath) /p $(pfxPassword) ..\Output\*.exe + "C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe" sign /f $(Agent.TempDirectory)\certificate.pfx /p $(pfxPassword) ..\Output\*.exe displayName: 'Create installer' - task: CopyFiles@2 inputs: diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index 32a0653f..1f3757d2 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -51,7 +51,7 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 - "C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe" sign /f $(pfxFile.secureFilePath) /p $(pfxPassword) ..\Output\*.exe + "C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe" sign /f $(Agent.TempDirectory)\certificate.pfx /p $(pfxPassword) ..\Output\*.exe displayName: 'Create installer' - task: CopyFiles@2 inputs: From ba52739d2e77de8b5698a0b19d838fc081bf00e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Fri, 16 Sep 2022 08:07:04 +0200 Subject: [PATCH 56/78] Use full signtool.exe path when setting up SignTool in inno setup --- azure-pipelines-windows-template-qt6.yml | 5 +++-- azure-pipelines-windows-template.yml | 5 +++-- ci/win/build_installer.iss | 1 + ci/win/build_installer_qt6.iss | 1 + ci/win/create_installer.cmd | 4 ++-- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index 5ab1f0f2..af5b0b20 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -50,8 +50,9 @@ jobs: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 - "C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe" sign /f $(Agent.TempDirectory)\certificate.pfx /p $(pfxPassword) ..\Output\*.exe + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(Agent.TempDirectory)\certificate.pfx %PASSWORD% + env: + PASSWORD: $(pfxPassword) displayName: 'Create installer' - task: CopyFiles@2 inputs: diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index 1f3757d2..4bdb232b 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -50,8 +50,9 @@ jobs: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 - "C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe" sign /f $(Agent.TempDirectory)\certificate.pfx /p $(pfxPassword) ..\Output\*.exe + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(Agent.TempDirectory)\certificate.pfx %PASSWORD% + env: + PASSWORD: $(pfxPassword) displayName: 'Create installer' - task: CopyFiles@2 inputs: diff --git a/ci/win/build_installer.iss b/ci/win/build_installer.iss index 420ab1d0..7a2e9a83 100644 --- a/ci/win/build_installer.iss +++ b/ci/win/build_installer.iss @@ -15,6 +15,7 @@ SetupIconFile=setup.ico UninstallDisplayIcon=uninstall.ico ArchitecturesInstallIn64BitMode=x64 ArchitecturesAllowed=x64 +SignTool=signtool [Registry] Root: HKCR; SubKey: .cbz; ValueType: string; ValueData: Comic Book (zip); Flags: uninsdeletekey; Tasks: File_association diff --git a/ci/win/build_installer_qt6.iss b/ci/win/build_installer_qt6.iss index 4616286a..ec5fe9e9 100644 --- a/ci/win/build_installer_qt6.iss +++ b/ci/win/build_installer_qt6.iss @@ -15,6 +15,7 @@ SetupIconFile=setup.ico UninstallDisplayIcon=uninstall.ico ArchitecturesInstallIn64BitMode=x64 ArchitecturesAllowed=x64 +SignTool=signtool [Registry] Root: HKCR; SubKey: .cbz; ValueType: string; ValueData: Comic Book (zip); Flags: uninsdeletekey; Tasks: File_association diff --git a/ci/win/create_installer.cmd b/ci/win/create_installer.cmd index 83af562f..82fa97f3 100644 --- a/ci/win/create_installer.cmd +++ b/ci/win/create_installer.cmd @@ -60,9 +60,9 @@ if "%1"=="x86" ( echo "iscc start" if "%4"=="qt6" ( - iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer_qt6.iss || exit /b + iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer_qt6.iss "/Ssigntool=$qC:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe$q sign /f %5 /p %6 $f" || exit /b ) else ( - iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer.iss || exit /b + iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer.iss "/Ssigntool=$qC:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe$q sign /f %5 /p %6 $f" || exit /b ) echo "iscc done!" From 9e95db99e5e184e05b195ca5763a33e5bc82c844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Fri, 16 Sep 2022 08:36:04 +0200 Subject: [PATCH 57/78] Remove conditionals for now --- azure-pipelines-windows-template-qt6.yml | 12 +++++------- azure-pipelines-windows-template.yml | 12 +++++------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index af5b0b20..85b849de 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -12,7 +12,6 @@ jobs: - job: ${{ parameters.name }} dependsOn: CodeFormatValidation variables: - - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - group: windows-codesign pool: vmImage: 'windows-2019' @@ -41,12 +40,11 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% nmake check TESTARGS="-maxwarnings 100000" displayName: 'Run tests' - - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - - task: DownloadSecureFile@1 - name: pfxFile - displayName: 'Get the pfx file certificate' - inputs: - secureFile: 'certificate.pfx' + - task: DownloadSecureFile@1 + name: pfxFile + displayName: 'Get the pfx file certificate' + inputs: + secureFile: 'certificate.pfx' - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index 4bdb232b..56e0d4e1 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -12,7 +12,6 @@ jobs: - job: ${{ parameters.name }} dependsOn: CodeFormatValidation variables: - - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - group: windows-codesign pool: vmImage: 'windows-2019' @@ -41,12 +40,11 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% nmake check TESTARGS="-maxwarnings 100000" displayName: 'Run tests' - - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - - task: DownloadSecureFile@1 - name: pfxFile - displayName: 'Get the pfx file certificate' - inputs: - secureFile: 'certificate.pfx' + - task: DownloadSecureFile@1 + name: pfxFile + displayName: 'Get the pfx file certificate' + inputs: + secureFile: 'certificate.pfx' - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win From 4fad04c441d5e88b4615efd1415f3bb4011655f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Fri, 16 Sep 2022 10:28:20 +0200 Subject: [PATCH 58/78] Codesign only on master/develop and pull requests --- azure-pipelines-windows-template-qt6.yml | 33 +++++++++++++++--------- azure-pipelines-windows-template.yml | 33 +++++++++++++++--------- ci/win/build_installer.iss | 4 ++- ci/win/build_installer_qt6.iss | 4 ++- ci/win/create_installer.cmd | 14 +++++++--- 5 files changed, 59 insertions(+), 29 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index 85b849de..32a1ee98 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -12,6 +12,7 @@ jobs: - job: ${{ parameters.name }} dependsOn: CodeFormatValidation variables: + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(contains(variables['Build.SourceBranch'], 'merge'), eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - group: windows-codesign pool: vmImage: 'windows-2019' @@ -40,18 +41,26 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% nmake check TESTARGS="-maxwarnings 100000" displayName: 'Run tests' - - task: DownloadSecureFile@1 - name: pfxFile - displayName: 'Get the pfx file certificate' - inputs: - secureFile: 'certificate.pfx' - - script: | - set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% - cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(Agent.TempDirectory)\certificate.pfx %PASSWORD% - env: - PASSWORD: $(pfxPassword) - displayName: 'Create installer' + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(contains(variables['Build.SourceBranch'], 'merge'), eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - task: DownloadSecureFile@1 + name: pfxFile + displayName: 'Get the pfx file certificate' + inputs: + secureFile: 'certificate.pfx' + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(contains(variables['Build.SourceBranch'], 'merge'), eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - script: | + set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% + cd $(Build.SourcesDirectory)\ci\win + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 $(pfxFile.secureFilePath) %PASSWORD% + env: + PASSWORD: $(pfxPassword) + displayName: 'Create installer' + - ${{ else }}: + - script: | + set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% + cd $(Build.SourcesDirectory)\ci\win + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt6 + displayName: 'Create installer' - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)\ci\win\Output\ diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index 56e0d4e1..31a9b137 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -12,6 +12,7 @@ jobs: - job: ${{ parameters.name }} dependsOn: CodeFormatValidation variables: + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(contains(variables['Build.SourceBranch'], 'merge'), eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - group: windows-codesign pool: vmImage: 'windows-2019' @@ -40,18 +41,26 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% nmake check TESTARGS="-maxwarnings 100000" displayName: 'Run tests' - - task: DownloadSecureFile@1 - name: pfxFile - displayName: 'Get the pfx file certificate' - inputs: - secureFile: 'certificate.pfx' - - script: | - set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% - cd $(Build.SourcesDirectory)\ci\win - .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(Agent.TempDirectory)\certificate.pfx %PASSWORD% - env: - PASSWORD: $(pfxPassword) - displayName: 'Create installer' + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(contains(variables['Build.SourceBranch'], 'merge'), eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - task: DownloadSecureFile@1 + name: pfxFile + displayName: 'Get the pfx file certificate' + inputs: + secureFile: 'certificate.pfx' + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(contains(variables['Build.SourceBranch'], 'merge'), eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - script: | + set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% + cd $(Build.SourcesDirectory)\ci\win + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 $(pfxFile.secureFilePath) %PASSWORD% + env: + PASSWORD: $(pfxPassword) + displayName: 'Create installer' + - ${{ else }}: + - script: | + set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% + cd $(Build.SourcesDirectory)\ci\win + .\create_installer.cmd ${{ parameters.architecture }} 7z $(Build.BuildNumber) qt5 + displayName: 'Create installer' - task: CopyFiles@2 inputs: sourceFolder: $(Build.SourcesDirectory)\ci\win\Output\ diff --git a/ci/win/build_installer.iss b/ci/win/build_installer.iss index 7a2e9a83..45f60110 100644 --- a/ci/win/build_installer.iss +++ b/ci/win/build_installer.iss @@ -15,7 +15,9 @@ SetupIconFile=setup.ico UninstallDisplayIcon=uninstall.ico ArchitecturesInstallIn64BitMode=x64 ArchitecturesAllowed=x64 -SignTool=signtool +#if CODE_SIGN == "true" + SignTool=signtool +#endif [Registry] Root: HKCR; SubKey: .cbz; ValueType: string; ValueData: Comic Book (zip); Flags: uninsdeletekey; Tasks: File_association diff --git a/ci/win/build_installer_qt6.iss b/ci/win/build_installer_qt6.iss index ec5fe9e9..05534151 100644 --- a/ci/win/build_installer_qt6.iss +++ b/ci/win/build_installer_qt6.iss @@ -15,7 +15,9 @@ SetupIconFile=setup.ico UninstallDisplayIcon=uninstall.ico ArchitecturesInstallIn64BitMode=x64 ArchitecturesAllowed=x64 -SignTool=signtool +#if CODE_SIGN == "true" + SignTool=signtool +#endif [Registry] Root: HKCR; SubKey: .cbz; ValueType: string; ValueData: Comic Book (zip); Flags: uninsdeletekey; Tasks: File_association diff --git a/ci/win/create_installer.cmd b/ci/win/create_installer.cmd index 82fa97f3..a9178dfe 100644 --- a/ci/win/create_installer.cmd +++ b/ci/win/create_installer.cmd @@ -59,10 +59,18 @@ if "%1"=="x86" ( ) echo "iscc start" -if "%4"=="qt6" ( - iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer_qt6.iss "/Ssigntool=$qC:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe$q sign /f %5 /p %6 $f" || exit /b +if "%~5" == "" ( + if "%4"=="qt6" ( + iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 /DCODE_SIGN=false build_installer_qt6.iss || exit /b + ) else ( + iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 /DCODE_SIGN=false build_installer.iss || exit /b + ) ) else ( - iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 build_installer.iss "/Ssigntool=$qC:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe$q sign /f %5 /p %6 $f" || exit /b + if "%4"=="qt6" ( + iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 /DCODE_SIGN=true build_installer_qt6.iss "/Ssigntool=$qC:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe$q sign /f %5 /p %6 $f" || exit /b + ) else ( + iscc /DVERSION=%VERSION% /DPLATFORM=%1 /DCOMPRESSED_ARCHIVE_BACKEND=%2 /DBUILD_NUMBER=%3 /DCODE_SIGN=true build_installer.iss "/Ssigntool=$qC:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\SignTool.exe$q sign /f %5 /p %6 $f" || exit /b + ) ) echo "iscc done!" From aa44ad4143d51beb226438cc37169c8373b96ca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Fri, 16 Sep 2022 19:32:30 +0200 Subject: [PATCH 59/78] Remove old code --- YACReaderLibrary/db/folder_model.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/YACReaderLibrary/db/folder_model.cpp b/YACReaderLibrary/db/folder_model.cpp index f54fd7ea..072be11b 100644 --- a/YACReaderLibrary/db/folder_model.cpp +++ b/YACReaderLibrary/db/folder_model.cpp @@ -606,13 +606,7 @@ void FolderModelProxy::setFilterData(QMap *fil rootItem = root; -#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) - QMap::iterator i; - for (i = filteredItems->begin(); i != filteredItems->end(); ++i) - this->filteredItems.insert(i.key(), i.value()); -#else this->filteredItems.insert(*filteredItems); -#endif endResetModel(); From 2de84f5780f45929496366cf1fbb6423f9665f30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Fri, 16 Sep 2022 19:38:45 +0200 Subject: [PATCH 60/78] Fix connection by registering the types used in the signal --- YACReaderLibrary/library_window.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index f389372b..f8a31f5a 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -1186,6 +1186,8 @@ void LibraryWindow::createConnections() connect(searchEdit, &YACReaderSearchLineEdit::filterChanged, this, &LibraryWindow::setSearchFilter); #endif connect(&comicQueryResultProcessor, &ComicQueryResultProcessor::newData, this, &LibraryWindow::setComicSearchFilterData); + qRegisterMetaType("FolderItem *"); + qRegisterMetaType *>("QMap *"); connect(folderQueryResultProcessor.get(), &FolderQueryResultProcessor::newData, this, &LibraryWindow::setFolderSearchFilterData); // ContextMenus From 3bb8f88e3c948a8823ff27e5845901bb24b8b17a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Fri, 16 Sep 2022 20:27:57 +0200 Subject: [PATCH 61/78] Do not use the folders view select index workaround in Qt6 --- YACReaderLibrary/yacreader_navigation_controller.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/YACReaderLibrary/yacreader_navigation_controller.cpp b/YACReaderLibrary/yacreader_navigation_controller.cpp index 783dedef..834bcdd1 100644 --- a/YACReaderLibrary/yacreader_navigation_controller.cpp +++ b/YACReaderLibrary/yacreader_navigation_controller.cpp @@ -262,7 +262,9 @@ void YACReaderNavigationController::loadPreviousStatus() void YACReaderNavigationController::setupConnections() { +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) connect(libraryWindow->foldersView, &YACReaderTreeView::currentIndexChanged, this, &YACReaderNavigationController::selectedFolder); +#endif connect(libraryWindow->foldersView, &YACReaderTreeView::clicked, this, &YACReaderNavigationController::selectedFolder); connect(libraryWindow->listsView, &QAbstractItemView::clicked, this, &YACReaderNavigationController::selectedList); connect(libraryWindow->historyController, &YACReaderHistoryController::modelIndexSelected, this, &YACReaderNavigationController::selectedIndexFromHistory); From 50ca560f5a60aad109938408bdf7d83f7c212b23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sat, 17 Sep 2022 08:33:06 +0200 Subject: [PATCH 62/78] Fix folder selection on search mode --- YACReaderLibrary/yacreader_navigation_controller.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/YACReaderLibrary/yacreader_navigation_controller.cpp b/YACReaderLibrary/yacreader_navigation_controller.cpp index 834bcdd1..87c2b93f 100644 --- a/YACReaderLibrary/yacreader_navigation_controller.cpp +++ b/YACReaderLibrary/yacreader_navigation_controller.cpp @@ -36,8 +36,8 @@ void YACReaderNavigationController::selectedFolder(const QModelIndex &mi) // when a folder is selected the search mode has to be reset if (libraryWindow->exitSearchMode()) { - libraryWindow->foldersView->scrollTo(mi, QAbstractItemView::PositionAtTop); - libraryWindow->foldersView->setCurrentIndex(mi); + libraryWindow->foldersView->scrollTo(modelIndex, QAbstractItemView::PositionAtTop); + libraryWindow->foldersView->setCurrentIndex(modelIndex); } loadFolderInfo(modelIndex); @@ -262,9 +262,7 @@ void YACReaderNavigationController::loadPreviousStatus() void YACReaderNavigationController::setupConnections() { -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) connect(libraryWindow->foldersView, &YACReaderTreeView::currentIndexChanged, this, &YACReaderNavigationController::selectedFolder); -#endif connect(libraryWindow->foldersView, &YACReaderTreeView::clicked, this, &YACReaderNavigationController::selectedFolder); connect(libraryWindow->listsView, &QAbstractItemView::clicked, this, &YACReaderNavigationController::selectedList); connect(libraryWindow->historyController, &YACReaderHistoryController::modelIndexSelected, this, &YACReaderNavigationController::selectedIndexFromHistory); From 98041fc641bb229fbf16bc8b99d8c84af2a1276b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sat, 17 Sep 2022 08:45:29 +0200 Subject: [PATCH 63/78] Fix search icon background color (qt6) --- YACReaderLibrary/classic_comics_view.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/YACReaderLibrary/classic_comics_view.cpp b/YACReaderLibrary/classic_comics_view.cpp index 78166c23..e772875b 100644 --- a/YACReaderLibrary/classic_comics_view.cpp +++ b/YACReaderLibrary/classic_comics_view.cpp @@ -364,10 +364,7 @@ void ClassicComicsView::setupSearchingIcon() h->addWidget(l, 0, Qt::AlignCenter); searchingIcon->setLayout(h); - QPalette pal(searchingIcon->palette()); - pal.setColor(QPalette::Window, Qt::black); - searchingIcon->setAutoFillBackground(true); - searchingIcon->setPalette(pal); + searchingIcon->setStyleSheet(QString("QWidget {border : none; background-color: #000000;}")); hideSearchingIcon(); } From 3260a1588425694aab94c6581bc128f27310db0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sat, 17 Sep 2022 09:22:28 +0200 Subject: [PATCH 64/78] Add 2x versions of the icons used in the search bar in macos --- YACReaderLibrary/images_osx.qrc | 2 ++ images/clearSearch.png | Bin 1225 -> 296 bytes images/clearSearch@2x.png | Bin 0 -> 538 bytes images/iconSearch.png | Bin 1230 -> 282 bytes images/iconSearch@2x.png | Bin 0 -> 482 bytes 5 files changed, 2 insertions(+) create mode 100644 images/clearSearch@2x.png create mode 100644 images/iconSearch@2x.png diff --git a/YACReaderLibrary/images_osx.qrc b/YACReaderLibrary/images_osx.qrc index 3a48539b..62e7adfb 100644 --- a/YACReaderLibrary/images_osx.qrc +++ b/YACReaderLibrary/images_osx.qrc @@ -20,7 +20,9 @@ ../images/empty_folder_osx.png ../images/empty_search_osx.png ../images/iconSearch.png + ../images/iconSearch@2x.png ../images/clearSearch.png + ../images/clearSearch@2x.png ../images/lists/default_0_osx.png ../images/lists/default_1_osx.png ../images/lists/label_blue_osx.png diff --git a/images/clearSearch.png b/images/clearSearch.png index 1db15e7bfc2e12d0d8f7777aafc8958500b9f58c..f895c564f3994676cb8f0aa2863705a714306d73 100644 GIT binary patch delta 280 zcmV+z0q6e738(^)8Gi-<0019IEztk~010qNS#tmY3labT3lag+-G2N4007!aL_t(2 zk)4vg4TCTcg&)X$B3d_DfR>ilC2YWGY!Eu!G6M^wp+!kWN%X9<ec>*v1=#4Q??;AjCEuDJ+7yQ=_x=}RY7YVAf9RCn~1)hl0i5z>O9XV%QApG)0R}xsAzgl%d!N3 zBIIq6>io}vd`ZckLRR+V%ZoE7StljSt^II36g$$kZCl*u`E{KB0B$()jarFzB)&O_ emvf&Sz#HkDbrDa2E#%Aq0000#3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDi`VqxNJW?=5*VruDZXy|I>Xl7t)>EdkZVrXRK zYV2eI)9aF-T$-DjR|3v4~Pj*wm=R%;iu*SQ+p9GS=S%r&}Cp?wDojx45_%4 zGU;wsvx7kEVveLsVq2s#Gebg(gbm7dYwK%RI-BBVxUh(_epLUc^sOaR^(f=?xwi8k zpNX7VC?j6~@ONFH$n?{!)s6xxof4gt;^hab-SF)?;65?Q0EroSQZ*+ON^2#wlSg-}-AFJNy4z z+m;^Lmit5KxM4=lgU2BiJ7bEv771{zzNld_$x*tkG4Avx7p>DqmrLiq-j%|XA*8WP zq`9uHcC*d-_hr_*?z!iADKb`6#@($w=xW{PEO%C4Y|@uifBrFt6iKj2%uJQM*|Hts5Afo diff --git a/images/clearSearch@2x.png b/images/clearSearch@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..738fc2e779945ad9870168fec9f14402c6579b5c GIT binary patch literal 538 zcmV+#0_FXQP)}3K*MvuHfABFUdI(lS< z3HA(SV+?`~2`Zm_X-Mz5q=fdDP6>(6pG(*GK|OZcq}(>E}PTogza{VZntY3%2j^L za~Ev6T;g~<`hZVKlB^>wRbGh$aa4@7BFt*g2mz6UTEJ*DGS6GBRu!0N5akMSDd^#F zFd$iSUjZiS6c7I06={nJ%6>B&nT<4bWC}_n?Pph2OpwK5VOHqKIJ61^ec9;C-Vo5V zCuUAv4Yo|`S2!L!BFd7+IUe+Sy`ZCFq_W2&!)WNc*i~(kBr#VhSJzVCLIq~`IAm&R z*70u~DMHFdj*Ah4nOAq{iEARts#)>iPjnWk4W>RbT>y39sSD~HqW*tOEI|Km5O% literal 0 HcmV?d00001 diff --git a/images/iconSearch.png b/images/iconSearch.png index 8d6a5f636dc2daeba849f52983e86d2b199afa84..6a238061dd2e2f15d1153620c7b80c08a235a068 100644 GIT binary patch delta 266 zcmV+l0rmdQ37P_s8Gi-<00469#36YXd3C64!{5;QX|b^2DN42FH~Aq*MjZ z+{E}FfdWj%4dKI|^K-~-sHue<-iOJciB??KY z>6v-9O7C~?S5nAKu~iB;^)>Jbs{}UJ3djZt>nkaMm6T-LDnT3-;TxdfoL`ixV5(=Vn`~fcs9E!^lV%s6w~6GOr}DLN~8i8D@e@YH@N=Wx*A$ZZ2GPaY;}r!o64xE)J_=rzZw7nBro3xGDeq!wkCrKY$Q<>xAZy=;|<+bt$I&4cPq z!R;1PoO<w>lZQldOXlL*TJ}F zXM#m{@vOgPW&3WvmoC~Hr@6HK@WE|w6*xE)7hlZS7}0b5@iFcbZ_94yZEs6_aOwT` z)0=!Iv24}o`uuaxwc2-O)*WokjVhjp9|}x)|9jT5m%I3q=RMcH+pfS-D5KqV$iT<7 zba(8u)Y$7s!#Cf2^RnDV?%=gWT$4{Ox%_gDpL$QU;g^pUCifUNUo&lulxPbSnJAu+ z@uXq-tc9na3KfNho_}6^b=Up(=CgUbUY7it?mh2$1n+!^3w{VDF#P9PzaSvU6jX9Cc)I$ztaD0e0sw9PzA^v+ diff --git a/images/iconSearch@2x.png b/images/iconSearch@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1393f10f5fe38ab68e227816e0afd36006a3a6c6 GIT binary patch literal 482 zcmV<80UiE{P)^i@CLE6@7?T4dpa62UY=IhBiO4n> z7||b)0;a(8iP(kpr2>yY#u!_{9Oxzf&>vtdBCBMOLf!+O4Y1bl1E3%9Je`6aK-#X_ ztKbQq6>V+2(a)&|c@dF$C_s~qj4@;2O^S~2{=?DBCoN4 zMrB#nRaHFzcY0J*RkbL~@;l_u^a{J0oPxA?{ai<&!g=1DGau^RI7dayn>oXXbGy!w z8U^{zT8tsK)n3w?n2kXW^U; zbr@Tv9(Ow|+iq-EE6C~#codP~z;?A%8+}?&2=?FCL^AAXj&#)*-hUR;QrqS0-gdwk za~rM5Rm!VeldUy*Yh_VTs#0P929XHsWY=kX2AVXe&X#Hf)@|!tIc>D+?lQE%nkoVK Y1z1?mWQpzy&Hw-a07*qoM6N<$g1MyDga7~l literal 0 HcmV?d00001 From 61c50df384db2274338677ea465076197b7764bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 17 Sep 2022 09:45:39 +0200 Subject: [PATCH 65/78] Fix search edit icons in hdpi screens (at least in macos) --- custom_widgets/yacreader_search_line_edit.cpp | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/custom_widgets/yacreader_search_line_edit.cpp b/custom_widgets/yacreader_search_line_edit.cpp index 35264b28..98b7af56 100644 --- a/custom_widgets/yacreader_search_line_edit.cpp +++ b/custom_widgets/yacreader_search_line_edit.cpp @@ -12,14 +12,25 @@ YACReaderSearchLineEdit::YACReaderSearchLineEdit(QWidget *parent) clearButton = new QToolButton(this); searchLabel = new QLabel(this); - QPixmap pixmap(":/images/clearSearch.png"); - QPixmap pixmapIcon(":/images/iconSearch.png"); + QPixmap clearIcon; + QPixmap searchIcon; + + clearIcon.setDevicePixelRatio(devicePixelRatioF()); + searchIcon.setDevicePixelRatio(devicePixelRatioF()); + + if (devicePixelRatioF() > 1) { + clearIcon.load(":/images/clearSearch@2x.png"); + searchIcon.load(":/images/iconSearch@2x.png"); + } else { + clearIcon.load(":/images/clearSearch.png"); + searchIcon.load(":/images/iconSearch.png"); + } searchLabel->setStyleSheet("QLabel { border: none; padding: 0px; }"); - searchLabel->setPixmap(pixmapIcon); + searchLabel->setPixmap(searchIcon); - clearButton->setIcon(QIcon(pixmap)); - clearButton->setIconSize(pixmap.size()); + clearButton->setIcon(QIcon(clearIcon)); + clearButton->setIconSize(QSize(14, 14)); clearButton->setCursor(Qt::ArrowCursor); clearButton->setStyleSheet("QToolButton { border: none; padding: 0px; }"); clearButton->hide(); From 4ef90ab66071557e1e07e292ef0edf409c43aceb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 17 Sep 2022 09:45:54 +0200 Subject: [PATCH 66/78] Add some padding to the right of the search edit in macos --- YACReaderLibrary/yacreader_main_toolbar.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/YACReaderLibrary/yacreader_main_toolbar.cpp b/YACReaderLibrary/yacreader_main_toolbar.cpp index 7ddc2997..3f774eae 100644 --- a/YACReaderLibrary/yacreader_main_toolbar.cpp +++ b/YACReaderLibrary/yacreader_main_toolbar.cpp @@ -87,6 +87,7 @@ void YACReaderMainToolBar::setSearchWidget(QWidget *w) { addWideDivider(); mainLayout->addWidget(w, 0, Qt::AlignVCenter); + mainLayout->addSpacing(6); } void YACReaderMainToolBar::paintEvent(QPaintEvent *event) From 70a584c7155174fc2b763c363234dee864442f7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sat, 17 Sep 2022 10:04:27 +0200 Subject: [PATCH 67/78] Fix assets loading in search edit (windows/linux) --- custom_widgets/yacreader_search_line_edit.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/custom_widgets/yacreader_search_line_edit.cpp b/custom_widgets/yacreader_search_line_edit.cpp index 98b7af56..269843cc 100644 --- a/custom_widgets/yacreader_search_line_edit.cpp +++ b/custom_widgets/yacreader_search_line_edit.cpp @@ -19,8 +19,12 @@ YACReaderSearchLineEdit::YACReaderSearchLineEdit(QWidget *parent) searchIcon.setDevicePixelRatio(devicePixelRatioF()); if (devicePixelRatioF() > 1) { - clearIcon.load(":/images/clearSearch@2x.png"); - searchIcon.load(":/images/iconSearch@2x.png"); + if (!clearIcon.load(":/images/clearSearch@2x.png")) { + clearIcon.load(":/images/clearSearch.png"); + } + if (!searchIcon.load(":/images/iconSearch@2x.png")) { + searchIcon.load(":/images/iconSearch.png"); + } } else { clearIcon.load(":/images/clearSearch.png"); searchIcon.load(":/images/iconSearch.png"); @@ -30,7 +34,13 @@ YACReaderSearchLineEdit::YACReaderSearchLineEdit(QWidget *parent) searchLabel->setPixmap(searchIcon); clearButton->setIcon(QIcon(clearIcon)); + +#ifdef Q_OS_MAC clearButton->setIconSize(QSize(14, 14)); +#else + clearButton->setIconSize(QSize(12, 12)); +#endif + clearButton->setCursor(Qt::ArrowCursor); clearButton->setStyleSheet("QToolButton { border: none; padding: 0px; }"); clearButton->hide(); From cfc5b5721314f10c6fb35b967b9d592014fd57bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sat, 17 Sep 2022 17:58:45 +0200 Subject: [PATCH 68/78] Do not codesign PRs --- azure-pipelines-windows-template-qt6.yml | 6 +++--- azure-pipelines-windows-template.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index 32a1ee98..c0621956 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -12,7 +12,7 @@ jobs: - job: ${{ parameters.name }} dependsOn: CodeFormatValidation variables: - - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(contains(variables['Build.SourceBranch'], 'merge'), eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - group: windows-codesign pool: vmImage: 'windows-2019' @@ -41,13 +41,13 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% nmake check TESTARGS="-maxwarnings 100000" displayName: 'Run tests' - - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(contains(variables['Build.SourceBranch'], 'merge'), eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - task: DownloadSecureFile@1 name: pfxFile displayName: 'Get the pfx file certificate' inputs: secureFile: 'certificate.pfx' - - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(contains(variables['Build.SourceBranch'], 'merge'), eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index 31a9b137..550eeaec 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -12,7 +12,7 @@ jobs: - job: ${{ parameters.name }} dependsOn: CodeFormatValidation variables: - - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(contains(variables['Build.SourceBranch'], 'merge'), eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - group: windows-codesign pool: vmImage: 'windows-2019' @@ -41,13 +41,13 @@ jobs: set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% nmake check TESTARGS="-maxwarnings 100000" displayName: 'Run tests' - - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(contains(variables['Build.SourceBranch'], 'merge'), eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - task: DownloadSecureFile@1 name: pfxFile displayName: 'Get the pfx file certificate' inputs: secureFile: 'certificate.pfx' - - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(contains(variables['Build.SourceBranch'], 'merge'), eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: + - ${{ if and(eq(variables['System.TeamFoundationCollectionUri'], 'https://dev.azure.com/luisangelsm/'), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))) }}: - script: | set PATH=C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin;%PATH% cd $(Build.SourcesDirectory)\ci\win From 1596aa23479fea24adf01a16d39572343c16740e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 19 Sep 2022 18:07:39 +0200 Subject: [PATCH 69/78] Fix comic properties dialog sizing --- YACReaderLibrary/properties_dialog.cpp | 105 +++++++++---------------- 1 file changed, 39 insertions(+), 66 deletions(-) diff --git a/YACReaderLibrary/properties_dialog.cpp b/YACReaderLibrary/properties_dialog.cpp index df646204..c6df5e49 100644 --- a/YACReaderLibrary/properties_dialog.cpp +++ b/YACReaderLibrary/properties_dialog.cpp @@ -5,7 +5,6 @@ #include "yacreader_field_edit.h" #include "yacreader_field_plain_text_edit.h" #include "db_helper.h" -//#include "yacreader_busy_widget.h" #include #include @@ -26,7 +25,6 @@ using namespace YACReader; PropertiesDialog::PropertiesDialog(QWidget *parent) : QDialog(parent), updated(false) { - createCoverBox(); createGeneralInfoBox(); createAuthorsBox(); @@ -35,43 +33,47 @@ PropertiesDialog::PropertiesDialog(QWidget *parent) createPlotBox(); createTabBar(); + auto rootLayout = new QGridLayout; + + cover = new QLabel(); mainLayout = new QGridLayout; - // mainLayout->addWidget(coverBox,0,0); - mainLayout->addWidget(tabBar, 0, 1); - mainLayout->setColumnStretch(1, 1); - /*mainLayout->addWidget(authorsBox,1,1); - mainLayout->addWidget(publishingBox,2,1);*/ - mainLayout->addWidget(buttonBox, 1, 1, Qt::AlignBottom); + mainLayout->addWidget(tabBar, 0, 0); + mainLayout->addWidget(buttonBox, 1, 0, Qt::AlignBottom); mainWidget = new QWidget(this); mainWidget->setAutoFillBackground(true); - mainWidget->setFixedSize(470, 444); mainWidget->setLayout(mainLayout); - mainLayout->setSizeConstraint(QLayout::SetMinimumSize); + + rootLayout->setHorizontalSpacing(0); + rootLayout->setVerticalSpacing(0); + + rootLayout->addWidget(cover, 0, 0, Qt::AlignTop); + rootLayout->addWidget(mainWidget, 0, 1); + + rootLayout->setColumnStretch(0, 0); + rootLayout->setColumnStretch(1, 1); QScreen *screen = parent != nullptr ? parent->window()->screen() : nullptr; if (screen == nullptr) { screen = QApplication::screens().constFirst(); } - int heightDesktopResolution = screen->geometry().height(); - int widthDesktopResolution = screen->geometry().width(); - int sHeight, sWidth; - sHeight = static_cast(heightDesktopResolution * 0.65); - sWidth = static_cast(sHeight * 1.4); - // setCover(QPixmap(":/images/notCover.png")); + this->setLayout(rootLayout); + + this->setContentsMargins(0, 0, 0, 0); + rootLayout->setContentsMargins(0, 0, 0, 0); + + rootLayout->addWidget(coverBox, 0, 0, Qt::AlignBottom); - this->move(QPoint((widthDesktopResolution - sWidth) / 2, ((heightDesktopResolution - sHeight) - 40) / 2)); setModal(true); - setFixedSize(sizeHint()); - mainWidget->move(280, 0); + setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); } QSize PropertiesDialog::sizeHint() const { - return QSize(750, 444); + return QSize(800, 444); } void PropertiesDialog::createTabBar() @@ -85,13 +87,13 @@ void PropertiesDialog::createTabBar() void PropertiesDialog::createCoverBox() { - coverBox = new QWidget(this); + coverBox = new QWidget; auto layout = new QHBoxLayout; QLabel *label = new QLabel(tr("Cover page")); label->setStyleSheet("QLabel {color: white; font-weight:bold; font-size:14px;}"); - layout->addWidget(label); + layout->addWidget(label, 0, Qt::AlignVCenter); layout->addStretch(); coverPageEdit = new YACReaderFieldEdit(); @@ -107,40 +109,29 @@ void PropertiesDialog::createCoverBox() coverPageNumberLabel->setStyleSheet("QLabel {color: white; font-weight:bold; font-size:14px;}"); - layout->addWidget(showPreviousCoverPageButton); + layout->addWidget(showPreviousCoverPageButton, 0, Qt::AlignVCenter); layout->addSpacing(5); - layout->addWidget(coverPageNumberLabel); + layout->addWidget(coverPageNumberLabel, 0, Qt::AlignVCenter); layout->addSpacing(5); - layout->addWidget(showNextCoverPageButton); + layout->addWidget(showNextCoverPageButton, 0, Qt::AlignVCenter); coverPageEdit->setStyleSheet("QLineEdit {border:none;}"); layout->setSpacing(0); coverBox->setLayout(layout); - coverBox->setFixedWidth(280); - coverBox->move(0, 444 - 28); - layout->setContentsMargins(5, 4, 5, 0); + coverBox->setFixedHeight(28); + layout->setContentsMargins(5, 2, 5, 2); - // busyIndicator = new YACReaderBusyWidget(this); - // busyIndicator->move((280-busyIndicator->width())/2,(444-busyIndicator->height()-28)/2); - // busyIndicator->hide(); + QPalette p(palette()); + p.setColor(QPalette::Window, QColor(0, 0, 0, 200)); + coverBox->setAutoFillBackground(true); + coverBox->setPalette(p); connect(showPreviousCoverPageButton, &QAbstractButton::clicked, this, &PropertiesDialog::loadPreviousCover); connect(showNextCoverPageButton, &QAbstractButton::clicked, this, &PropertiesDialog::loadNextCover); } -QFrame *createLine() -{ - QFrame *line = new QFrame(); - line->setObjectName(QString::fromUtf8("line")); - // line->setGeometry(QRect(320, 150, 118, 3)); - line->setFrameShape(QFrame::HLine); - line->setFrameShadow(QFrame::Sunken); - - return line; -} - void PropertiesDialog::createGeneralInfoBox() { generalInfoBox = new QWidget; @@ -148,7 +139,7 @@ void PropertiesDialog::createGeneralInfoBox() auto generalInfoLayout = new QFormLayout; generalInfoLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); - // generalInfoLayout->setRowWrapPolicy(QFormLayout::WrapAllRows); + generalInfoLayout->setRowWrapPolicy(QFormLayout::WrapAllRows); generalInfoLayout->addRow(tr("Title:"), title = new YACReaderFieldEdit()); auto number = new QHBoxLayout; @@ -185,9 +176,6 @@ void PropertiesDialog::createGeneralInfoBox() generalInfoLayout->addRow(tr("Size:"), size = new QLabel("size")); - // generalInfoLayout->addRow(tr("Comic Vine link:"), comicVineLink = new QLabel("...")); - // generalInfoLayout->addRow(bottom); - auto main = new QVBoxLayout; main->addLayout(generalInfoLayout); main->addStretch(); @@ -203,7 +191,6 @@ void PropertiesDialog::createAuthorsBox() auto authorsLayout = new QVBoxLayout; - // authorsLayout->setRowWrapPolicy(QFormLayout::WrapAllRows); auto h1 = new QHBoxLayout; auto vl1 = new QVBoxLayout; auto vr1 = new QVBoxLayout; @@ -213,8 +200,7 @@ void PropertiesDialog::createAuthorsBox() vr1->addWidget(new QLabel(tr("Penciller(s):"))); vr1->addWidget(penciller = new YACReaderFieldPlainTextEdit()); h1->addLayout(vr1); - // authorsLayout->addRow(tr("Writer(s):"), new YACReaderFieldPlainTextEdit()); - // authorsLayout->addRow(tr("Penciller(s):"), new YACReaderFieldPlainTextEdit()); + auto h2 = new QHBoxLayout; auto vl2 = new QVBoxLayout; auto vr2 = new QVBoxLayout; @@ -225,9 +211,6 @@ void PropertiesDialog::createAuthorsBox() vr2->addWidget(colorist = new YACReaderFieldPlainTextEdit()); h2->addLayout(vr2); - // authorsLayout->addRow(tr("Inker(s):"), new YACReaderFieldPlainTextEdit()); - // authorsLayout->addRow(tr("Colorist(s):"), new YACReaderFieldPlainTextEdit()); - auto h3 = new QHBoxLayout; auto vl3 = new QVBoxLayout; auto vr3 = new QVBoxLayout; @@ -237,8 +220,6 @@ void PropertiesDialog::createAuthorsBox() vr3->addWidget(new QLabel(tr("Cover Artist(s):"))); vr3->addWidget(coverArtist = new YACReaderFieldPlainTextEdit()); h3->addLayout(vr3); - // authorsLayout->addRow(tr("Letterer(es):"), new YACReaderFieldPlainTextEdit()); - // authorsLayout->addRow(tr("Cover Artist(s):"), new YACReaderFieldPlainTextEdit()); authorsLayout->addLayout(h1); authorsLayout->addLayout(h2); @@ -628,11 +609,15 @@ void PropertiesDialog::setMultipleCover() last = last.scaledToHeight(444, Qt::SmoothTransformation); coverImage = QPixmap::fromImage(blurred(last.toImage(), QRect(0, 0, last.width(), last.height()), 15)); + + cover->setPixmap(coverImage); } void PropertiesDialog::setCover(const QPixmap &coverI) { coverImage = coverI.scaledToHeight(444, Qt::SmoothTransformation); + + cover->setPixmap(coverImage); } void PropertiesDialog::setFilename(const QString &nameString) @@ -895,16 +880,6 @@ void PropertiesDialog::closeEvent(QCloseEvent *e) void PropertiesDialog::paintEvent(QPaintEvent *event) { QDialog::paintEvent(event); - - QPainter p(this); - - p.drawPixmap(0, 0, coverImage); - - // QPixmap shadow(":/images/social_dialog/shadow.png"); - // p.drawPixmap(280-shadow.width(),0,shadow.width(),444,shadow); - p.drawLine(279, 0, 279, 444); - if (sequentialEditing) - p.fillRect(0, 444 - 28, 280, 28, QColor(0, 0, 0, 153)); } void PropertiesDialog::updateCoverPageNumberLabel(int n) @@ -929,7 +904,6 @@ void PropertiesDialog::loadNextCover() } showPreviousCoverPageButton->setEnabled(true); - // busyIndicator->show(); if (current + 1 != comics[currentComicIndex].info.coverPage) coverChanged = true; else @@ -952,7 +926,6 @@ void PropertiesDialog::loadPreviousCover() } showNextCoverPageButton->setEnabled(true); - // busyIndicator->show(); if (current - 1 != comics[currentComicIndex].info.coverPage.toInt()) coverChanged = true; else From d4b1913c1c0deeabb95cf583bc875c6c26b28b59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Thu, 29 Sep 2022 21:59:47 +0200 Subject: [PATCH 70/78] Update the search edit style in macos --- custom_widgets/yacreader_search_line_edit.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/custom_widgets/yacreader_search_line_edit.cpp b/custom_widgets/yacreader_search_line_edit.cpp index 269843cc..a7900f6d 100644 --- a/custom_widgets/yacreader_search_line_edit.cpp +++ b/custom_widgets/yacreader_search_line_edit.cpp @@ -48,7 +48,7 @@ YACReaderSearchLineEdit::YACReaderSearchLineEdit(QWidget *parent) connect(this, &QLineEdit::textChanged, this, &YACReaderSearchLineEdit::updateCloseButton); int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); #ifdef Q_OS_MAC - setStyleSheet(QString("QLineEdit {border-top:1px solid #9F9F9F; border-bottom:1px solid #ACACAC; border-right:1px solid #ACACAC; border-left:1px solid #ACACAC; border-radius: 10px; background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #CACACA, stop: 0.15 #FFFFFF); padding-left: %1px; padding-right: %2px; padding-bottom: 1px; margin-bottom: 1px;} ").arg(searchLabel->sizeHint().width() + frameWidth + 6).arg(clearButton->sizeHint().width() + frameWidth + 2)); + setStyleSheet(QString("QLineEdit {border-top:1px solid #9F9F9F; border-bottom:1px solid #ACACAC; border-right:1px solid #ACACAC; border-left:1px solid #ACACAC; border-radius: 4px; background-color:#EEEEEE; padding-left: %1px; padding-right: %2px; padding-bottom: 1px; margin-bottom: 1px;} ").arg(searchLabel->sizeHint().width() + frameWidth + 6).arg(clearButton->sizeHint().width() + frameWidth + 2)); #else setStyleSheet(QString("QLineEdit {color: #ABABAB; border:none; border-radius: 4px; background-color:#404040; padding-left: %1px; padding-right: %2px; padding-bottom: 1px; margin-right: 9px;} ").arg(searchLabel->sizeHint().width() + frameWidth + 6 + 5).arg(clearButton->sizeHint().width() + frameWidth + 2)); #endif @@ -58,6 +58,7 @@ YACReaderSearchLineEdit::YACReaderSearchLineEdit(QWidget *parent) #ifdef Q_OS_MAC setMaximumWidth(212); + setFixedHeight(26); #else setMaximumWidth(255); setFixedHeight(26); From c31895018acd42d5cd698b4f35c280d886f7341a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Thu, 29 Sep 2022 22:01:54 +0200 Subject: [PATCH 71/78] Use points instead of pixels --- common/gl/yacreader_flow_gl.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/common/gl/yacreader_flow_gl.cpp b/common/gl/yacreader_flow_gl.cpp index a2dd76b4..2f039591 100644 --- a/common/gl/yacreader_flow_gl.cpp +++ b/common/gl/yacreader_flow_gl.cpp @@ -331,7 +331,7 @@ void YACReaderFlowGL::paintGL() QFont font = painter.font(); font.setFamily("Arial"); - font.setPixelSize(fontSize); + font.setPointSize(fontSize); painter.setFont(font); painter.setPen(QColor(76, 76, 76)); @@ -342,8 +342,7 @@ void YACReaderFlowGL::paintGL() void YACReaderFlowGL::resizeGL(int width, int height) { - float pixelRatio = devicePixelRatioF(); - fontSize = (width + height) * 0.010 * pixelRatio; + fontSize = (width + height) * 0.010; if (fontSize < 10) fontSize = 10; From c255182b1c0d264604858e52db031548a3e714a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Fri, 30 Sep 2022 23:34:47 +0200 Subject: [PATCH 72/78] Remove custom scroll bar for the synopsis --- YACReaderLibrary/qml/GridComicsView6.qml | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/YACReaderLibrary/qml/GridComicsView6.qml b/YACReaderLibrary/qml/GridComicsView6.qml index 316da945..23895fd7 100644 --- a/YACReaderLibrary/qml/GridComicsView6.qml +++ b/YACReaderLibrary/qml/GridComicsView6.qml @@ -619,23 +619,6 @@ Rectangle { ScrollBar.horizontal.policy: ScrollBar.AlwaysOff - ScrollBar.vertical: ScrollBar { - visible: true - contentItem: Item { - implicitWidth: 12 - implicitHeight: 26 - Rectangle { - color: "#424246" - anchors.fill: parent - anchors.topMargin: 6 - anchors.leftMargin: 5 - anchors.rightMargin: 4 - anchors.bottomMargin: 6 - radius: 2 - } - } - } - contentItem: currentComicInfoSinopsis id: synopsisScroller From 1b36dd7de911e2c19776d57d686acab2ebbabdba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Fri, 30 Sep 2022 23:36:23 +0200 Subject: [PATCH 73/78] Remove hack to keep content inside the grid view content size This seems no longer necessary in Qt6 (maybe it got fixed after bumping QtQuick to 2.15) --- YACReaderLibrary/qml/GridComicsView6.qml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/YACReaderLibrary/qml/GridComicsView6.qml b/YACReaderLibrary/qml/GridComicsView6.qml index 23895fd7..e7fb0f59 100644 --- a/YACReaderLibrary/qml/GridComicsView6.qml +++ b/YACReaderLibrary/qml/GridComicsView6.qml @@ -755,17 +755,6 @@ Rectangle { grid.cellWidth = cWidth + Math.floor(rest / wholeCells); } - WheelHandler { - onWheel: { - if (grid.contentHeight <= grid.height) { - return; - } - - var newValue = Math.min((grid.contentHeight - grid.height - (showCurrentComic ? 270 : 20)), (Math.max(grid.originY , grid.contentY - event.angleDelta.y))); - grid.contentY = newValue; - } - } - ScrollBar.vertical: ScrollBar { visible: grid.contentHeight > grid.height From 7331945eb0fc1e78735e0aa5bac195fd0d7279d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 1 Oct 2022 08:27:29 +0200 Subject: [PATCH 74/78] Disable horizontal scrolling in the synopsis text For some reason the content size is not properly calculated and you can scroll horizontally endlessly. --- YACReaderLibrary/qml/GridComicsView6.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/YACReaderLibrary/qml/GridComicsView6.qml b/YACReaderLibrary/qml/GridComicsView6.qml index e7fb0f59..5741986e 100644 --- a/YACReaderLibrary/qml/GridComicsView6.qml +++ b/YACReaderLibrary/qml/GridComicsView6.qml @@ -619,6 +619,7 @@ Rectangle { ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + contentWidth: -1 contentItem: currentComicInfoSinopsis id: synopsisScroller From 621ee059253ca82fda4dce919cc9c31a3f95382c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 1 Oct 2022 08:34:45 +0200 Subject: [PATCH 75/78] Remove patch no longer needed --- compressed_archive/libp7zip.patch | 305 ------------------------------ compressed_archive/wrapper.pri | 2 - 2 files changed, 307 deletions(-) delete mode 100644 compressed_archive/libp7zip.patch diff --git a/compressed_archive/libp7zip.patch b/compressed_archive/libp7zip.patch deleted file mode 100644 index 872b8d76..00000000 --- a/compressed_archive/libp7zip.patch +++ /dev/null @@ -1,305 +0,0 @@ -previous patch ---- libp7zip/CPP/include_windows/windows.h -+++ libp7zip/CPP/include_windows/windows.h -@@ -36,7 +36,7 @@ - #define WINAPI - - #undef BOOL --typedef int BOOL; -+typedef signed char BOOL; - - - #define CREATE_NEW 1 - -fix linux build ---- libp7zip/CPP/myWindows/StdAfx.h -+++ libp7zip/CPP/myWindows/StdAfx.h -@@ -206,8 +206,6 @@ - - #if defined( __x86_64__ ) - --#define _WIN64 1 -- - #endif - - #endif - -CVE-2016-9296 ---- libp7zip/CPP/7zip/Archive/7z/7zIn.cpp -+++ libp7zip/CPP/7zip/Archive/7z/7zIn.cpp -@@ -1097,7 +1097,8 @@ - if (CrcCalc(data, unpackSize) != folders.FolderCRCs.Vals[i]) - ThrowIncorrect(); - } -- HeadersSize += folders.PackPositions[folders.NumPackStreams]; -+ if (folders.PackPositions) -+ HeadersSize += folders.PackPositions[folders.NumPackStreams]; - return S_OK; - } - -CVE-2017-17969 ---- libp7zip/CPP/7zip/Compress/ShrinkDecoder.cpp -+++ libp7zip/CPP/7zip/Compress/ShrinkDecoder.cpp -@@ -121,8 +121,13 @@ - { - _stack[i++] = _suffixes[cur]; - cur = _parents[cur]; -+ if (cur >= kNumItems || i >= kNumItems) -+ break; - } -- -+ -+ if (cur >= kNumItems || i >= kNumItems) -+ break; -+ - _stack[i++] = (Byte)cur; - lastChar2 = (Byte)cur; - - - - -CVE-2018-5996 ---- libp7zip/CPP/7zip/Compress/Rar1Decoder.cpp -+++ libp7zip/CPP/7zip/Compress/Rar1Decoder.cpp -@@ -29,7 +29,7 @@ public: - }; - */ - --CDecoder::CDecoder(): m_IsSolid(false) { } -+CDecoder::CDecoder(): m_IsSolid(false), _errorMode(false) { } - - void CDecoder::InitStructures() - { -@@ -406,9 +406,14 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * - InitData(); - if (!m_IsSolid) - { -+ _errorMode = false; - InitStructures(); - InitHuff(); - } -+ -+ if (_errorMode) -+ return S_FALSE; -+ - if (m_UnpackSize > 0) - { - GetFlagsBuf(); -@@ -477,9 +482,9 @@ STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) - { - try { return CodeReal(inStream, outStream, inSize, outSize, progress); } -- catch(const CInBufferException &e) { return e.ErrorCode; } -- catch(const CLzOutWindowException &e) { return e.ErrorCode; } -- catch(...) { return S_FALSE; } -+ catch(const CInBufferException &e) { _errorMode = true; return e.ErrorCode; } -+ catch(const CLzOutWindowException &e) { _errorMode = true; return e.ErrorCode; } -+ catch(...) { _errorMode = true; return S_FALSE; } - } - - STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) - -CVE-2018-5996 ---- libp7zip/CPP/7zip/Compress/Rar1Decoder.h -+++ libp7zip/CPP/7zip/Compress/Rar1Decoder.h -@@ -39,6 +39,7 @@ public: - - Int64 m_UnpackSize; - bool m_IsSolid; -+ bool _errorMode; - - UInt32 ReadBits(int numBits); - HRESULT CopyBlock(UInt32 distance, UInt32 len); - -CVE-2018-5996 ---- libp7zip/CPP/7zip/Compress/Rar2Decoder.cpp -+++ blibp7zip/CPP/7zip/Compress/Rar2Decoder.cpp -@@ -80,7 +80,8 @@ static const UInt32 kHistorySize = 1 << 20; - static const UInt32 kWindowReservSize = (1 << 22) + 256; - - CDecoder::CDecoder(): -- m_IsSolid(false) -+ m_IsSolid(false), -+ m_TablesOK(false) - { - } - -@@ -100,6 +101,8 @@ UInt32 CDecoder::ReadBits(unsigned numBits) { return m_InBitStream.ReadBits(numB - - bool CDecoder::ReadTables(void) - { -+ m_TablesOK = false; -+ - Byte levelLevels[kLevelTableSize]; - Byte newLevels[kMaxTableSize]; - m_AudioMode = (ReadBits(1) == 1); -@@ -170,6 +173,8 @@ bool CDecoder::ReadTables(void) - } - - memcpy(m_LastLevels, newLevels, kMaxTableSize); -+ m_TablesOK = true; -+ - return true; - } - -@@ -344,6 +349,9 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * - return S_FALSE; - } - -+ if (!m_TablesOK) -+ return S_FALSE; -+ - UInt64 startPos = m_OutWindowStream.GetProcessedSize(); - while (pos < unPackSize) - { - -CVE-2018-5996 ---- libp7zip/CPP/7zip/Compress/Rar2Decoder.h -+++ libp7zip/CPP/7zip/Compress/Rar2Decoder.h -@@ -139,6 +139,7 @@ class CDecoder : - - UInt64 m_PackSize; - bool m_IsSolid; -+ bool m_TablesOK; - - void InitStructures(); - UInt32 ReadBits(unsigned numBits); - -CVE-2018-5996 ---- libp7zip/CPP/7zip/Compress/Rar3Decoder.cpp -+++ libp7zip/CPP/7zip/Compress/Rar3Decoder.cpp -@@ -92,7 +92,8 @@ CDecoder::CDecoder(): - _writtenFileSize(0), - _vmData(0), - _vmCode(0), -- m_IsSolid(false) -+ m_IsSolid(false), -+ _errorMode(false) - { - Ppmd7_Construct(&_ppmd); - } -@@ -545,6 +546,9 @@ HRESULT CDecoder::ReadTables(bool &keepDecompressing) - return InitPPM(); - } - -+ TablesRead = false; -+ TablesOK = false; -+ - _lzMode = true; - PrevAlignBits = 0; - PrevAlignCount = 0; -@@ -606,6 +610,9 @@ HRESULT CDecoder::ReadTables(bool &keepDecompressing) - } - } - } -+ if (InputEofError()) -+ return S_FALSE; -+ - TablesRead = true; - - // original code has check here: -@@ -623,6 +630,9 @@ HRESULT CDecoder::ReadTables(bool &keepDecompressing) - RIF(m_LenDecoder.Build(&newLevels[kMainTableSize + kDistTableSize + kAlignTableSize])); - - memcpy(m_LastLevels, newLevels, kTablesSizesSum); -+ -+ TablesOK = true; -+ - return S_OK; - } - -@@ -824,7 +834,12 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress) - PpmEscChar = 2; - PpmError = true; - InitFilters(); -+ _errorMode = false; - } -+ -+ if (_errorMode) -+ return S_FALSE; -+ - if (!m_IsSolid || !TablesRead) - { - bool keepDecompressing; -@@ -838,6 +853,8 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress) - bool keepDecompressing; - if (_lzMode) - { -+ if (!TablesOK) -+ return S_FALSE; - RINOK(DecodeLZ(keepDecompressing)) - } - else - - -@@ -901,8 +918,8 @@ STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream - _unpackSize = outSize ? *outSize : (UInt64)(Int64)-1; - return CodeReal(progress); - } -- catch(const CInBufferException &e) { return e.ErrorCode; } -- catch(...) { return S_FALSE; } -+ catch(const CInBufferException &e) { _errorMode = true; return e.ErrorCode; } -+ catch(...) { _errorMode = true; return S_FALSE; } - // CNewException is possible here. But probably CNewException is caused - // by error in data stream. - } - -CVE-2018-5996 ---- libp7zip/CPP/7zip/Compress/Rar3Decoder.h -+++ libp7zip/CPP/7zip/Compress/Rar3Decoder.h -@@ -192,6 +192,7 @@ class CDecoder: - UInt32 _lastFilter; - - bool m_IsSolid; -+ bool _errorMode; - - bool _lzMode; - bool _unsupportedFilter; -@@ -200,6 +201,7 @@ class CDecoder: - UInt32 PrevAlignCount; - - bool TablesRead; -+ bool TablesOK; - - CPpmd7 _ppmd; - int PpmEscChar; - -CVE-2021-3465 ---- libp7zip/CPP/7zip/Common/StreamObjects.cpp -+++ libp7zip/CPP/7zip/Common/StreamObjects.cpp -@@ -157,6 +157,8 @@ STDMETHODIMP CDynBufSeqOutStream::Write( - - STDMETHODIMP CBufPtrSeqOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) - { -+ if(_buffer == nullptr || _size == _pos) -+ return E_FAIL; - size_t rem = _size - _pos; - if (rem > size) - rem = (size_t)size; - -GCC10 warning fix ---- libp7zip/CPP/Windows/ErrorMsg.cpp 2015-01-18 11:20:28.000000000 -0700 -+++ libp7zip/CPP/Windows/ErrorMsg.cpp 2019-09-24 13:01:18.887289152 -0600 -@@ -14,14 +14,14 @@ UString MyFormatMessage(DWORD errorCode) - AString msg; - - switch(errorCode) { -- case ERROR_NO_MORE_FILES : txt = "No more files"; break ; -- case E_NOTIMPL : txt = "E_NOTIMPL"; break ; -- case E_NOINTERFACE : txt = "E_NOINTERFACE"; break ; -- case E_ABORT : txt = "E_ABORT"; break ; -- case E_FAIL : txt = "E_FAIL"; break ; -- case STG_E_INVALIDFUNCTION : txt = "STG_E_INVALIDFUNCTION"; break ; -- case E_OUTOFMEMORY : txt = "E_OUTOFMEMORY"; break ; -- case E_INVALIDARG : txt = "E_INVALIDARG"; break ; -+ case unsigned (ERROR_NO_MORE_FILES) : txt = "No more files"; break ; -+ case unsigned (E_NOTIMPL) : txt = "E_NOTIMPL"; break ; -+ case unsigned (E_NOINTERFACE) : txt = "E_NOINTERFACE"; break ; -+ case unsigned (E_ABORT) : txt = "E_ABORT"; break ; -+ case unsigned (E_FAIL) : txt = "E_FAIL"; break ; -+ case unsigned (STG_E_INVALIDFUNCTION) : txt = "STG_E_INVALIDFUNCTION"; break ; -+ case unsigned (E_OUTOFMEMORY) : txt = "E_OUTOFMEMORY"; break ; -+ case unsigned (E_INVALIDARG) : txt = "E_INVALIDARG"; break ; - case ERROR_DIRECTORY : txt = "Error Directory"; break ; - default: - txt = strerror(errorCode); diff --git a/compressed_archive/wrapper.pri b/compressed_archive/wrapper.pri index e9376921..25694e07 100644 --- a/compressed_archive/wrapper.pri +++ b/compressed_archive/wrapper.pri @@ -13,8 +13,6 @@ exists (../compressed_archive/lib7zip) { unix { exists (../compressed_archive/libp7zip) { message(Found p7zip source code...) - #this is probably only needed in macos - system(patch -N -p0 -i libp7zip.patch) } else { error(You\'ll need 7zip source code to compile YACReader. \ Please check the compressed_archive folder for further instructions.) From f6dc6ac2328c3dc4bf3edb6f8891747ce6ebd27c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 1 Oct 2022 08:35:13 +0200 Subject: [PATCH 76/78] Bump version to 9.9.2 --- common/yacreader_global.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/yacreader_global.h b/common/yacreader_global.h index 306014d7..8e3d3ae9 100644 --- a/common/yacreader_global.h +++ b/common/yacreader_global.h @@ -5,7 +5,7 @@ #include #include -#define VERSION "9.9.1" +#define VERSION "9.9.2" #define REMOTE_BROWSE_PERFORMANCE_WORKAROUND "REMOTE_BROWSE_PERFORMANCE_WORKAROUND" From 065f0456a894287dbd38e4b6ad5c5c0638ddbbd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Sat, 1 Oct 2022 09:53:31 +0200 Subject: [PATCH 77/78] Revert "Remove patch no longer needed" This reverts commit 621ee059253ca82fda4dce919cc9c31a3f95382c. --- compressed_archive/libp7zip.patch | 305 ++++++++++++++++++++++++++++++ compressed_archive/wrapper.pri | 2 + 2 files changed, 307 insertions(+) create mode 100644 compressed_archive/libp7zip.patch diff --git a/compressed_archive/libp7zip.patch b/compressed_archive/libp7zip.patch new file mode 100644 index 00000000..872b8d76 --- /dev/null +++ b/compressed_archive/libp7zip.patch @@ -0,0 +1,305 @@ +previous patch +--- libp7zip/CPP/include_windows/windows.h ++++ libp7zip/CPP/include_windows/windows.h +@@ -36,7 +36,7 @@ + #define WINAPI + + #undef BOOL +-typedef int BOOL; ++typedef signed char BOOL; + + + #define CREATE_NEW 1 + +fix linux build +--- libp7zip/CPP/myWindows/StdAfx.h ++++ libp7zip/CPP/myWindows/StdAfx.h +@@ -206,8 +206,6 @@ + + #if defined( __x86_64__ ) + +-#define _WIN64 1 +- + #endif + + #endif + +CVE-2016-9296 +--- libp7zip/CPP/7zip/Archive/7z/7zIn.cpp ++++ libp7zip/CPP/7zip/Archive/7z/7zIn.cpp +@@ -1097,7 +1097,8 @@ + if (CrcCalc(data, unpackSize) != folders.FolderCRCs.Vals[i]) + ThrowIncorrect(); + } +- HeadersSize += folders.PackPositions[folders.NumPackStreams]; ++ if (folders.PackPositions) ++ HeadersSize += folders.PackPositions[folders.NumPackStreams]; + return S_OK; + } + +CVE-2017-17969 +--- libp7zip/CPP/7zip/Compress/ShrinkDecoder.cpp ++++ libp7zip/CPP/7zip/Compress/ShrinkDecoder.cpp +@@ -121,8 +121,13 @@ + { + _stack[i++] = _suffixes[cur]; + cur = _parents[cur]; ++ if (cur >= kNumItems || i >= kNumItems) ++ break; + } +- ++ ++ if (cur >= kNumItems || i >= kNumItems) ++ break; ++ + _stack[i++] = (Byte)cur; + lastChar2 = (Byte)cur; + + + + +CVE-2018-5996 +--- libp7zip/CPP/7zip/Compress/Rar1Decoder.cpp ++++ libp7zip/CPP/7zip/Compress/Rar1Decoder.cpp +@@ -29,7 +29,7 @@ public: + }; + */ + +-CDecoder::CDecoder(): m_IsSolid(false) { } ++CDecoder::CDecoder(): m_IsSolid(false), _errorMode(false) { } + + void CDecoder::InitStructures() + { +@@ -406,9 +406,14 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * + InitData(); + if (!m_IsSolid) + { ++ _errorMode = false; + InitStructures(); + InitHuff(); + } ++ ++ if (_errorMode) ++ return S_FALSE; ++ + if (m_UnpackSize > 0) + { + GetFlagsBuf(); +@@ -477,9 +482,9 @@ STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream + const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) + { + try { return CodeReal(inStream, outStream, inSize, outSize, progress); } +- catch(const CInBufferException &e) { return e.ErrorCode; } +- catch(const CLzOutWindowException &e) { return e.ErrorCode; } +- catch(...) { return S_FALSE; } ++ catch(const CInBufferException &e) { _errorMode = true; return e.ErrorCode; } ++ catch(const CLzOutWindowException &e) { _errorMode = true; return e.ErrorCode; } ++ catch(...) { _errorMode = true; return S_FALSE; } + } + + STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) + +CVE-2018-5996 +--- libp7zip/CPP/7zip/Compress/Rar1Decoder.h ++++ libp7zip/CPP/7zip/Compress/Rar1Decoder.h +@@ -39,6 +39,7 @@ public: + + Int64 m_UnpackSize; + bool m_IsSolid; ++ bool _errorMode; + + UInt32 ReadBits(int numBits); + HRESULT CopyBlock(UInt32 distance, UInt32 len); + +CVE-2018-5996 +--- libp7zip/CPP/7zip/Compress/Rar2Decoder.cpp ++++ blibp7zip/CPP/7zip/Compress/Rar2Decoder.cpp +@@ -80,7 +80,8 @@ static const UInt32 kHistorySize = 1 << 20; + static const UInt32 kWindowReservSize = (1 << 22) + 256; + + CDecoder::CDecoder(): +- m_IsSolid(false) ++ m_IsSolid(false), ++ m_TablesOK(false) + { + } + +@@ -100,6 +101,8 @@ UInt32 CDecoder::ReadBits(unsigned numBits) { return m_InBitStream.ReadBits(numB + + bool CDecoder::ReadTables(void) + { ++ m_TablesOK = false; ++ + Byte levelLevels[kLevelTableSize]; + Byte newLevels[kMaxTableSize]; + m_AudioMode = (ReadBits(1) == 1); +@@ -170,6 +173,8 @@ bool CDecoder::ReadTables(void) + } + + memcpy(m_LastLevels, newLevels, kMaxTableSize); ++ m_TablesOK = true; ++ + return true; + } + +@@ -344,6 +349,9 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * + return S_FALSE; + } + ++ if (!m_TablesOK) ++ return S_FALSE; ++ + UInt64 startPos = m_OutWindowStream.GetProcessedSize(); + while (pos < unPackSize) + { + +CVE-2018-5996 +--- libp7zip/CPP/7zip/Compress/Rar2Decoder.h ++++ libp7zip/CPP/7zip/Compress/Rar2Decoder.h +@@ -139,6 +139,7 @@ class CDecoder : + + UInt64 m_PackSize; + bool m_IsSolid; ++ bool m_TablesOK; + + void InitStructures(); + UInt32 ReadBits(unsigned numBits); + +CVE-2018-5996 +--- libp7zip/CPP/7zip/Compress/Rar3Decoder.cpp ++++ libp7zip/CPP/7zip/Compress/Rar3Decoder.cpp +@@ -92,7 +92,8 @@ CDecoder::CDecoder(): + _writtenFileSize(0), + _vmData(0), + _vmCode(0), +- m_IsSolid(false) ++ m_IsSolid(false), ++ _errorMode(false) + { + Ppmd7_Construct(&_ppmd); + } +@@ -545,6 +546,9 @@ HRESULT CDecoder::ReadTables(bool &keepDecompressing) + return InitPPM(); + } + ++ TablesRead = false; ++ TablesOK = false; ++ + _lzMode = true; + PrevAlignBits = 0; + PrevAlignCount = 0; +@@ -606,6 +610,9 @@ HRESULT CDecoder::ReadTables(bool &keepDecompressing) + } + } + } ++ if (InputEofError()) ++ return S_FALSE; ++ + TablesRead = true; + + // original code has check here: +@@ -623,6 +630,9 @@ HRESULT CDecoder::ReadTables(bool &keepDecompressing) + RIF(m_LenDecoder.Build(&newLevels[kMainTableSize + kDistTableSize + kAlignTableSize])); + + memcpy(m_LastLevels, newLevels, kTablesSizesSum); ++ ++ TablesOK = true; ++ + return S_OK; + } + +@@ -824,7 +834,12 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress) + PpmEscChar = 2; + PpmError = true; + InitFilters(); ++ _errorMode = false; + } ++ ++ if (_errorMode) ++ return S_FALSE; ++ + if (!m_IsSolid || !TablesRead) + { + bool keepDecompressing; +@@ -838,6 +853,8 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress) + bool keepDecompressing; + if (_lzMode) + { ++ if (!TablesOK) ++ return S_FALSE; + RINOK(DecodeLZ(keepDecompressing)) + } + else + + +@@ -901,8 +918,8 @@ STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream + _unpackSize = outSize ? *outSize : (UInt64)(Int64)-1; + return CodeReal(progress); + } +- catch(const CInBufferException &e) { return e.ErrorCode; } +- catch(...) { return S_FALSE; } ++ catch(const CInBufferException &e) { _errorMode = true; return e.ErrorCode; } ++ catch(...) { _errorMode = true; return S_FALSE; } + // CNewException is possible here. But probably CNewException is caused + // by error in data stream. + } + +CVE-2018-5996 +--- libp7zip/CPP/7zip/Compress/Rar3Decoder.h ++++ libp7zip/CPP/7zip/Compress/Rar3Decoder.h +@@ -192,6 +192,7 @@ class CDecoder: + UInt32 _lastFilter; + + bool m_IsSolid; ++ bool _errorMode; + + bool _lzMode; + bool _unsupportedFilter; +@@ -200,6 +201,7 @@ class CDecoder: + UInt32 PrevAlignCount; + + bool TablesRead; ++ bool TablesOK; + + CPpmd7 _ppmd; + int PpmEscChar; + +CVE-2021-3465 +--- libp7zip/CPP/7zip/Common/StreamObjects.cpp ++++ libp7zip/CPP/7zip/Common/StreamObjects.cpp +@@ -157,6 +157,8 @@ STDMETHODIMP CDynBufSeqOutStream::Write( + + STDMETHODIMP CBufPtrSeqOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) + { ++ if(_buffer == nullptr || _size == _pos) ++ return E_FAIL; + size_t rem = _size - _pos; + if (rem > size) + rem = (size_t)size; + +GCC10 warning fix +--- libp7zip/CPP/Windows/ErrorMsg.cpp 2015-01-18 11:20:28.000000000 -0700 ++++ libp7zip/CPP/Windows/ErrorMsg.cpp 2019-09-24 13:01:18.887289152 -0600 +@@ -14,14 +14,14 @@ UString MyFormatMessage(DWORD errorCode) + AString msg; + + switch(errorCode) { +- case ERROR_NO_MORE_FILES : txt = "No more files"; break ; +- case E_NOTIMPL : txt = "E_NOTIMPL"; break ; +- case E_NOINTERFACE : txt = "E_NOINTERFACE"; break ; +- case E_ABORT : txt = "E_ABORT"; break ; +- case E_FAIL : txt = "E_FAIL"; break ; +- case STG_E_INVALIDFUNCTION : txt = "STG_E_INVALIDFUNCTION"; break ; +- case E_OUTOFMEMORY : txt = "E_OUTOFMEMORY"; break ; +- case E_INVALIDARG : txt = "E_INVALIDARG"; break ; ++ case unsigned (ERROR_NO_MORE_FILES) : txt = "No more files"; break ; ++ case unsigned (E_NOTIMPL) : txt = "E_NOTIMPL"; break ; ++ case unsigned (E_NOINTERFACE) : txt = "E_NOINTERFACE"; break ; ++ case unsigned (E_ABORT) : txt = "E_ABORT"; break ; ++ case unsigned (E_FAIL) : txt = "E_FAIL"; break ; ++ case unsigned (STG_E_INVALIDFUNCTION) : txt = "STG_E_INVALIDFUNCTION"; break ; ++ case unsigned (E_OUTOFMEMORY) : txt = "E_OUTOFMEMORY"; break ; ++ case unsigned (E_INVALIDARG) : txt = "E_INVALIDARG"; break ; + case ERROR_DIRECTORY : txt = "Error Directory"; break ; + default: + txt = strerror(errorCode); diff --git a/compressed_archive/wrapper.pri b/compressed_archive/wrapper.pri index 25694e07..e9376921 100644 --- a/compressed_archive/wrapper.pri +++ b/compressed_archive/wrapper.pri @@ -13,6 +13,8 @@ exists (../compressed_archive/lib7zip) { unix { exists (../compressed_archive/libp7zip) { message(Found p7zip source code...) + #this is probably only needed in macos + system(patch -N -p0 -i libp7zip.patch) } else { error(You\'ll need 7zip source code to compile YACReader. \ Please check the compressed_archive folder for further instructions.) From 67b7c4adc92a03136b3d281cc114858ea450ebcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sat, 1 Oct 2022 11:20:38 +0200 Subject: [PATCH 78/78] Update CHANGELOG/whatsnew --- CHANGELOG.md | 13 +++++++++++++ custom_widgets/whats_new_dialog.cpp | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b6c9a63..b26d5d77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ Version counting is based on semantic versioning (Major.Feature.Patch) +## 9.9.2 + +### General +* New builds using Qt6. +* macos builds are notarized. +* Windows builds are codesigned. + +### YACReaderLibrary +* Fix potential infinite loop/crash on library updates. +* Fix comic properties dialog sizing. +* Fixes and stability improvements. + + ## 9.9.1 ### YACReader diff --git a/custom_widgets/whats_new_dialog.cpp b/custom_widgets/whats_new_dialog.cpp index 6cb2e015..9696727a 100644 --- a/custom_widgets/whats_new_dialog.cpp +++ b/custom_widgets/whats_new_dialog.cpp @@ -47,6 +47,8 @@ YACReader::WhatsNewDialog::WhatsNewDialog(QWidget *parent) auto text = new QLabel(); text->setText("New release with the following updates:
" + "
" + "9.9.2 includes notarized builds for macos and codesigned builds for windows. It also gets new builds using Qt6.
" "
" "YACReader
" " • Show error when opening bad open recent entries.
" @@ -73,6 +75,9 @@ YACReader::WhatsNewDialog::WhatsNewDialog(QWidget *parent) " • Add an edit for filtering series results returned by Comic Vine.
" " • Support editing comics tags sequentially without leaving the edit dialog.
" " • Fix export/import comics info.
" + " • Fix potential infinite loop/crash on library updates (NEW in 9.9.2).
" + " • Fix comic properties dialog sizing (NEW in 9.9.2).
" + " • Fixes and stability improvements, specially in Qt6 builds (NEW in 9.9.2).
" "
" "Server
" " • Always serve a cover image to the iOS client for any folder that has content (requeries a library content update).
"