Открыть боковую панель
Aurora OS
Libraries
AmberPDF QML Plugin
Коммиты
b407073c
Коммит
b407073c
создал
Окт 17, 2023
по автору
OMP Education
Зафиксировано автором
k.sagalakova
Фев 15, 2024
Просмотр файлов
[View] Add the option to change the order of pages.
Co-Authored-By:
Kira Sagalakova
<
k.sagalakova@omp.ru
>
владелец
1e31b078
Изменения
6
Скрыть пробелы
Построчно
Рядом
plugin/PdfView.qml
Просмотр файла @
b407073c
...
...
@@ -29,6 +29,7 @@ Rectangle {
property
alias
pageNumberComponent
:
pdfView
.
pageNumberComponent
property
alias
grayScaleRendering
:
pdfView
.
grayScaleRendering
property
alias
pageAspectRatio
:
pdfView
.
pageAspectRatio
property
alias
reverse
:
pdfView
.
reverse
signal
clicked
()
signal
clickedUrl
(
string
url
)
...
...
plugin/plugins.qmltypes
Просмотр файла @
b407073c
...
...
@@ -96,6 +96,7 @@ Module {
Property { name: "pageNumberComponent"; type: "QQmlComponent"; isPointer: true }
Property { name: "grayScaleRendering"; type: "bool" }
Property { name: "pageAspectRatio"; type: "float" }
Property { name: "reverse"; type: "bool" }
Property { name: "status"; type: "BaseDocument::DocumentStatus"; isReadonly: true }
Property { name: "contentTopMargin"; type: "float"; isReadonly: true }
Property { name: "bookmarksModel"; type: "BookmarksModel"; isReadonly: true; isPointer: true }
...
...
@@ -193,6 +194,10 @@ Module {
name: "pageAspectRatioChanged"
Parameter { name: "pageAspectRatio"; type: "float" }
}
Signal {
name: "reverseChanged"
Parameter { name: "reverse"; type: "bool" }
}
Signal {
name: "statusChanged"
Parameter { name: "status"; type: "BaseDocument::DocumentStatus" }
...
...
@@ -284,6 +289,10 @@ Module {
name: "setPageAspectRatio"
Parameter { name: "pageAspectRatio"; type: "float" }
}
Method {
name: "setReverse"
Parameter { name: "reverse"; type: "bool" }
}
Method {
name: "saveDocumentAs"
Parameter { name: "path"; type: "string" }
...
...
plugin/src/documentmapper.cpp
Просмотр файла @
b407073c
...
...
@@ -15,7 +15,8 @@ DocumentMapper::DocumentMapper(QQuickItem *parent) : QQuickItem(parent),
m_contentWidth
(
0.0
),
m_lastPageActualSize
(
0.0
),
m_pagesNumberVisible
(
false
),
m_pageAspectRatio
(
1.0
)
m_pageAspectRatio
(
1.0
),
m_reverse
(
false
)
{
connect
(
this
,
&
DocumentMapper
::
widthChanged
,
this
,
&
DocumentMapper
::
_mapPages
);
connect
(
this
,
&
DocumentMapper
::
heightChanged
,
this
,
&
DocumentMapper
::
_mapPages
);
...
...
@@ -147,6 +148,15 @@ void DocumentMapper::setPageAspectRatio(qreal pageAspectRatio)
_mapPages
();
}
void
DocumentMapper
::
setReverse
(
bool
reverse
)
{
if
(
m_reverse
==
reverse
)
return
;
m_reverse
=
reverse
;
_mapPages
();
}
void
DocumentMapper
::
_mapPages
()
{
if
(
width
()
<=
0
||
height
()
<=
0
)
...
...
@@ -170,13 +180,14 @@ void DocumentMapper::_mapPages()
switch
(
m_orientation
)
{
case
Qt
::
Vertical
:
{
for
(
auto
&
page
:
m_originalPagesMap
.
pages
)
{
if
(
isHasSpecial
()
&&
!
isIndexSpecal
(
pageIndex
))
{
auto
inverseIndex
=
m_reverse
?
m_originalPagesMap
.
pages
.
size
()
-
1
-
pageIndex
:
pageIndex
;
if
(
isHasSpecial
()
&&
!
isIndexSpecal
(
inverseIndex
))
{
++
pageIndex
;
continue
;
}
position
.
end
+=
width
()
*
page
.
heightToWidthRatio
()
+
m_spacing
;
m_actualPagesCoordinates
.
insert
(
pag
eIndex
,
position
);
m_actualPagesCoordinates
.
insert
(
invers
eIndex
,
position
);
m_lastPageActualSize
=
position
.
end
-
position
.
start
-
m_spacing
;
position
.
start
=
position
.
end
;
++
pageIndex
;
...
...
@@ -188,14 +199,15 @@ void DocumentMapper::_mapPages()
}
case
Qt
::
Horizontal
:
{
for
(
auto
&
page
:
m_originalPagesMap
.
pages
)
{
if
(
isHasSpecial
()
&&
!
isIndexSpecal
(
pageIndex
))
{
auto
inverseIndex
=
m_reverse
?
m_originalPagesMap
.
pages
.
size
()
-
1
-
pageIndex
:
pageIndex
;
if
(
isHasSpecial
()
&&
!
isIndexSpecal
(
inverseIndex
))
{
++
pageIndex
;
continue
;
}
auto
fitHeight
=
qMin
(
width
()
*
page
.
heightToWidthRatio
(),
height
());
position
.
end
+=
fitHeight
/
page
.
heightToWidthRatio
()
+
m_spacing
;
m_actualPagesCoordinates
.
insert
(
pag
eIndex
,
position
);
m_actualPagesCoordinates
.
insert
(
invers
eIndex
,
position
);
m_lastPageActualSize
=
position
.
end
-
position
.
start
-
m_spacing
;
position
.
start
=
position
.
end
;
++
pageIndex
;
...
...
plugin/src/documentmapper.h
Просмотр файла @
b407073c
...
...
@@ -45,6 +45,7 @@ public slots:
const
std
::
set
<
int
>
&
specialIndexes
);
void
setPagesNumberVisible
(
bool
visible
);
void
setPageAspectRatio
(
qreal
pageAspectRatio
);
void
setReverse
(
bool
reverse
);
signals:
void
contentWidthChanged
(
qreal
);
...
...
@@ -68,6 +69,7 @@ private:
std
::
map
<
int
,
int
>
m_spacialRangeIndexes
;
bool
m_pagesNumberVisible
;
qreal
m_pageAspectRatio
;
bool
m_reverse
;
};
#endif // DOCUMENTMAPPER_H
plugin/src/pdfview.cpp
Просмотр файла @
b407073c
...
...
@@ -33,7 +33,8 @@ PdfView::PdfView(QQuickItem *parent) : QQuickItem(parent),
m_pagesWithNotesModel
(
nullptr
),
m_pageNumberComponent
(
nullptr
),
m_grayScaleRendering
(
false
),
m_pageAspectRatio
(
1.0
)
m_pageAspectRatio
(
1.0
),
m_reverse
(
false
)
{
setFlag
(
QQuickItem
::
ItemHasContents
,
true
);
setFlag
(
QQuickItem
::
ItemAcceptsInputMethod
,
true
);
...
...
@@ -43,6 +44,7 @@ PdfView::PdfView(QQuickItem *parent) : QQuickItem(parent),
connect
(
m_mapper
,
&
DocumentMapper
::
contentWidthChanged
,
this
,
&
PdfView
::
_updateContentSize
);
connect
(
m_mapper
,
&
DocumentMapper
::
contentHeightChanged
,
this
,
&
PdfView
::
_updateContentSize
);
connect
(
m_mapper
,
&
DocumentMapper
::
mapEnd
,
this
,
&
PdfView
::
_calculateVisible
);
connect
(
this
,
&
PdfView
::
reverseChanged
,
m_mapper
,
&
DocumentMapper
::
setReverse
);
connect
(
this
,
&
PdfView
::
loadPages
,
this
,
&
PdfView
::
_preparePages
);
connect
(
this
,
&
QQuickItem
::
windowChanged
,
this
,
[
this
]()
{
...
...
@@ -106,7 +108,8 @@ void PdfView::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeomet
newContentY
+=
(
oldGeometry
.
height
()
-
newGeometry
.
height
())
/
2.0
f
;
if
(
m_currentIndex
==
m_count
-
1
)
{
auto
pagePosition
=
m_mapper
->
actualPagePosition
(
m_mapper
->
isHasSpecial
()
?
m_mapper
->
maxSpecialIndex
()
:
m_count
-
1
);
auto
index
=
m_mapper
->
isHasSpecial
()
?
(
m_reverse
?
m_mapper
->
minSpecialIndex
()
:
m_mapper
->
maxSpecialIndex
())
:
m_count
-
1
;
auto
pagePosition
=
m_mapper
->
actualPagePosition
(
index
);
newContentY
=
pagePosition
.
start
*
m_itemScale
-
m_catchBound
+
1
;
}
...
...
@@ -117,7 +120,8 @@ void PdfView::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeomet
newContentX
+=
(
oldGeometry
.
width
()
-
newGeometry
.
width
())
/
2.0
f
;
if
(
m_currentIndex
==
m_count
-
1
)
{
auto
pagePosition
=
m_mapper
->
actualPagePosition
(
m_mapper
->
isHasSpecial
()
?
m_mapper
->
maxSpecialIndex
()
:
m_count
-
1
);
auto
index
=
m_mapper
->
isHasSpecial
()
?
(
m_reverse
?
m_mapper
->
minSpecialIndex
()
:
m_mapper
->
maxSpecialIndex
())
:
m_count
-
1
;
auto
pagePosition
=
m_mapper
->
actualPagePosition
(
index
);
newContentX
=
pagePosition
.
start
*
m_itemScale
-
m_catchBound
-
1
;
}
...
...
@@ -309,6 +313,11 @@ QQmlComponent *PdfView::pageNumberComponent() const
return
m_pageNumberComponent
;
}
bool
PdfView
::
reverse
()
const
{
return
m_reverse
;
}
QString
PdfView
::
pdfPath
()
const
{
return
m_pdfPath
;
...
...
@@ -375,6 +384,9 @@ void PdfView::positionViewAtIndex(int index)
if
(
index
<
0
||
index
>
m_count
)
return
;
if
(
m_reverse
&&
(
index
==
0
||
index
==
m_count
-
1
))
return
;
if
(
m_mapper
->
isHasSpecial
())
{
if
(
index
==
0
)
index
=
m_mapper
->
minSpecialIndex
();
...
...
@@ -606,6 +618,16 @@ void PdfView::setPageAspectRatio(qreal pageAspectRatio)
emit
pageAspectRatioChanged
(
m_pageAspectRatio
);
}
void
PdfView
::
setReverse
(
bool
reverse
)
{
if
(
m_reverse
==
reverse
)
return
;
m_reverse
=
reverse
;
emit
reverseChanged
(
m_reverse
);
}
void
PdfView
::
_updateContentSize
()
{
if
(
!
qFuzzyCompare
(
double
(
m_contentWidth
),
double
(
m_mapper
->
contentWidth
()))
&&
m_mapper
->
contentWidth
()
>
0.0
f
)
{
...
...
@@ -726,19 +748,30 @@ void PdfView::_restoreAbsolutePosition()
void
PdfView
::
_calculateVisible
()
{
auto
minPageIndex
=
0
;
if
(
m_count
<
0
)
return
;
auto
minPageIndex
=
m_reverse
?
(
m_mapper
->
isHasSpecial
()
?
m_mapper
->
maxSpecialIndex
()
:
m_count
-
1
)
:
(
m_mapper
->
isHasSpecial
()
?
m_mapper
->
minSpecialIndex
()
:
0
);
auto
startVisibleArea
=
qMax
(
0.0
f
,
float
(
m_orientation
==
Qt
::
Vertical
?
m_contentY
:
m_contentX
));
auto
endVisibleArea
=
startVisibleArea
+
(
m_orientation
==
Qt
::
Vertical
?
height
()
:
width
());
auto
startPaintedPage
=
-
1
;
auto
endPaintedPage
=
-
1
;
auto
maxPageIndex
=
m_mapper
->
isHasSpecial
()
?
m_mapper
->
maxSpecialIndex
()
:
m_count
-
1
;
auto
maxPageIndex
=
m_reverse
?
(
m_mapper
->
isHasSpecial
()
?
m_mapper
->
minSpecialIndex
()
:
0
)
:
(
m_mapper
->
isHasSpecial
()
?
m_mapper
->
maxSpecialIndex
()
:
m_count
-
1
);
if
(
m_moveDirection
<=
0
)
{
if
(
!
m_paintedPages
.
isEmpty
())
minPageIndex
=
qMax
(
0
,
*
std
::
min_element
(
m_paintedPages
.
begin
(),
m_paintedPages
.
end
()));
for
(
int
i
=
minPageIndex
;
i
<
m_count
;
++
i
)
{
minPageIndex
=
m_reverse
?
qMin
(
m_count
-
1
,
*
std
::
max_element
(
m_paintedPages
.
begin
(),
m_paintedPages
.
end
()))
:
qMax
(
0
,
*
std
::
min_element
(
m_paintedPages
.
begin
(),
m_paintedPages
.
end
()));
for
(
int
i
=
minPageIndex
;
(
m_reverse
?
i
>=
0
:
i
<
m_count
);
(
m_reverse
?
--
i
:
++
i
))
{
if
(
m_mapper
->
isHasSpecial
()
&&
!
m_mapper
->
isIndexSpecal
(
i
))
{
continue
;
}
...
...
@@ -757,10 +790,14 @@ void PdfView::_calculateVisible()
}
}
else
{
if
(
!
m_paintedPages
.
isEmpty
())
minPageIndex
=
qMax
(
maxPageIndex
,
*
std
::
max_element
(
m_paintedPages
.
begin
(),
m_paintedPages
.
end
()));
for
(
int
i
=
minPageIndex
;
i
>=
0
;
--
i
)
{
minPageIndex
=
m_reverse
?
qMin
(
maxPageIndex
,
*
std
::
min_element
(
m_paintedPages
.
begin
(),
m_paintedPages
.
end
()))
:
qMax
(
maxPageIndex
,
*
std
::
max_element
(
m_paintedPages
.
begin
(),
m_paintedPages
.
end
()));
for
(
int
i
=
minPageIndex
;
(
m_reverse
?
i
<
m_count
:
i
>=
0
);
(
m_reverse
?
++
i
:
--
i
))
{
if
(
m_mapper
->
isHasSpecial
()
&&
!
m_mapper
->
isIndexSpecal
(
i
))
{
continue
;
}
...
...
@@ -774,7 +811,7 @@ void PdfView::_calculateVisible()
}
}
for
(
int
i
=
startPaintedPage
;
i
<
m_count
;
++
i
)
{
for
(
int
i
=
startPaintedPage
;
(
m_reverse
?
i
>=
0
:
i
<
m_count
)
;
(
m_reverse
?
--
i
:
++
i
)
)
{
if
(
m_mapper
->
isHasSpecial
()
&&
!
m_mapper
->
isIndexSpecal
(
i
))
{
continue
;
}
...
...
@@ -789,19 +826,25 @@ void PdfView::_calculateVisible()
}
}
if
(
startPaintedPage
==
maxPageIndex
)
endPaintedPage
=
startPaintedPage
;
if
(
!
m_reverse
)
{
if
(
startPaintedPage
==
maxPageIndex
)
endPaintedPage
=
startPaintedPage
;
if
(
startPaintedPage
<
0
)
startPaintedPage
=
minPageIndex
;
if
(
startPaintedPage
<
0
)
startPaintedPage
=
minPageIndex
;
}
endPaintedPage
=
qMin
(
endPaintedPage
+
1
,
maxPageIndex
);
endPaintedPage
=
m_reverse
?
qMax
(
endPaintedPage
+
1
,
maxPageIndex
)
:
qMin
(
endPaintedPage
+
1
,
maxPageIndex
);
m_paintedPages
.
clear
();
for
(
int
i
=
qMax
(
0
,
startPaintedPage
-
1
);
i
<=
endPaintedPage
;
++
i
)
for
(
int
i
=
qMax
(
0
,
(
m_reverse
?
endPaintedPage
-
1
:
startPaintedPage
-
1
)
)
;
i
<=
(
m_reverse
?
startPaintedPage
:
endPaintedPage
)
;
++
i
)
m_paintedPages
.
append
(
i
);
std
::
sort
(
m_paintedPages
.
begin
(),
m_paintedPages
.
end
());
if
(
m_reverse
)
std
::
sort
(
m_paintedPages
.
rbegin
(),
m_paintedPages
.
rend
());
else
std
::
sort
(
m_paintedPages
.
begin
(),
m_paintedPages
.
end
());
QMutableHashIterator
<
int
,
QQuickItem
*>
pagesIt
(
m_pages
);
while
(
pagesIt
.
hasNext
())
{
...
...
plugin/src/pdfview.h
Просмотр файла @
b407073c
...
...
@@ -42,6 +42,7 @@ class PdfView : public QQuickItem
Q_PROPERTY
(
QQmlComponent
*
pageNumberComponent
READ
pageNumberComponent
WRITE
setPageNumberComponent
NOTIFY
pageNumberComponentChanged
)
Q_PROPERTY
(
bool
grayScaleRendering
READ
grayScaleRendering
WRITE
setGrayScaleRendering
NOTIFY
grayScaleRenderingChanged
)
Q_PROPERTY
(
qreal
pageAspectRatio
READ
pageAspectRatio
WRITE
setPageAspectRatio
NOTIFY
pageAspectRatioChanged
)
Q_PROPERTY
(
bool
reverse
READ
reverse
WRITE
setReverse
NOTIFY
reverseChanged
)
public:
explicit
PdfView
(
QQuickItem
*
parent
=
nullptr
);
...
...
@@ -82,6 +83,7 @@ public:
Q_INVOKABLE
void
editNote
(
int
pageId
,
int
noteId
,
const
QString
&
newContent
,
const
QColor
&
newColor
);
PagesWithNotesModel
*
pagesWithNotesModel
()
const
;
QQmlComponent
*
pageNumberComponent
()
const
;
bool
reverse
()
const
;
public
slots
:
void
setContentY
(
qreal
contentY
);
...
...
@@ -99,6 +101,7 @@ public slots:
void
setPageNumberComponent
(
QQmlComponent
*
pageNumberComponent
);
void
setGrayScaleRendering
(
bool
grayScaleRendering
);
void
setPageAspectRatio
(
qreal
pageAspectRatio
);
void
setReverse
(
bool
reverse
);
signals:
void
modelChanged
(
QObject
*
model
);
...
...
@@ -134,6 +137,7 @@ signals:
void
pageNumberComponentChanged
(
QQmlComponent
*
pageNumberComponent
);
void
grayScaleRenderingChanged
(
bool
grayScaleRendering
);
void
pageAspectRatioChanged
(
qreal
pageAspectRatio
);
void
reverseChanged
(
bool
reverse
);
private
slots
:
void
_updateContentSize
();
...
...
@@ -178,6 +182,7 @@ private:
QQmlComponent
*
m_pageNumberComponent
;
bool
m_grayScaleRendering
;
qreal
m_pageAspectRatio
;
bool
m_reverse
;
};
#endif // PDFVIEW_H
Редактирование
Предварительный просмотр
Поддерживает Markdown
0%
Попробовать снова
или
прикрепить новый файл
.
Отмена
You are about to add
0
people
to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Отмена
Пожалуйста,
зарегистрируйтесь
или
войдите
чтобы прокомментировать