Warning, /graphics/peruse/src/creator/qml/BookMetainfoPage.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * Copyright (C) 2015 Dan Leinir Turthra Jensen <admin@leinir.dk>
0003 *
0004 * This library is free software; you can redistribute it and/or
0005 * modify it under the terms of the GNU Lesser General Public
0006 * License as published by the Free Software Foundation; either
0007 * version 2.1 of the License, or (at your option) version 3, or any
0008 * later version accepted by the membership of KDE e.V. (or its
0009 * successor approved by the membership of KDE e.V.), which shall
0010 * act as a proxy defined in Section 6 of version 3 of the license.
0011 *
0012 * This library is distributed in the hope that it will be useful,
0013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0015 * Lesser General Public License for more details.
0016 *
0017 * You should have received a copy of the GNU Lesser General Public
0018 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
0019 *
0020 */
0021
0022 import QtQuick 2.12
0023 import QtQuick.Controls 2.12 as QtControls
0024 import QtQuick.Dialogs 1.3
0025
0026 import org.kde.kirigami 2.1 as Kirigami
0027
0028 import "metainfoeditors"
0029 /**
0030 * @brief Page with form to edit the comic metadata.
0031 *
0032 * Most metadata entries are quite simple.
0033 *
0034 * Others, like Author, need a dedicated entry editor (AuthorEntryEditor).
0035 */
0036 Kirigami.ScrollablePage {
0037 id: root;
0038 property string categoryName: "bookMetaInfo";
0039 title: i18nc("title text for the book meta information editor sheet", "Edit Meta Information");
0040 property QtObject model;
0041
0042 actions {
0043 main: saveAction;
0044 }
0045 Kirigami.Action {
0046 id: saveAction;
0047 text: i18nc("Saves the book to a file on disk", "Save Book");
0048 iconName: "document-save";
0049 onTriggered: {
0050 // Ensure there's a default language entry.
0051 if (root.model.acbfData.metaData.bookInfo.languageEntryList.indexOf("") === -1) {
0052 root.model.acbfData.metaData.bookInfo.addLanguage("");
0053 }
0054 root.model.saveBook();
0055 }
0056 }
0057
0058 Column {
0059 id: contentColumn;
0060 width: root.width - (root.leftPadding + root.rightPadding);
0061 height: childrenRect.height;
0062 spacing: Kirigami.Units.smallSpacing;
0063
0064 Kirigami.Heading {
0065 width: parent.width;
0066 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0067 text: i18nc("label text for the edit field for the book title", "Title");
0068 }
0069
0070 Item { width: parent.width; height: Kirigami.Units.smallSpacing; }
0071 QtControls.TextField {
0072 id: defaultTitle;
0073 width: parent.width;
0074 placeholderText: i18nc("placeholder text for default title text-input", "Write to add default title");
0075 text:root.model.acbfData ? root.model.acbfData.metaData.bookInfo.title("") : "";
0076 onTextChanged: {
0077 root.model.acbfData.metaData.bookInfo.setTitle(defaultTitle.text, "");
0078 root.model.setDirty();
0079 }
0080 }
0081
0082 Kirigami.Heading {
0083 width: parent.width;
0084 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0085 text: i18nc("label text for the edit field for the default annotation", "Annotation");
0086 }
0087 Item { width: parent.width; height: Kirigami.Units.smallSpacing; }
0088 QtControls.TextArea {
0089 id: defaultAnnotation;
0090 width: parent.width;
0091 placeholderText: i18nc("placeholder text for default annotation text-area", "Write to add default annotation");
0092 wrapMode: TextEdit.Wrap
0093 text: root.model.acbfData ? root.model.acbfData.metaData.bookInfo.annotation("").join("\n\n") : "";
0094 onTextChanged: {
0095 root.model.acbfData.metaData.bookInfo.setAnnotation(defaultAnnotation.text.split("\n\n"), "");
0096 root.model.setDirty();
0097 }
0098 }
0099 Kirigami.Heading {
0100 width: parent.width;
0101 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0102 text: i18nc("label text for the edit field for the keyword list", "Keywords");
0103 }
0104 Item { width: parent.width; height: Kirigami.Units.smallSpacing; }
0105 QtControls.TextField {
0106 id: defaultKeywords;
0107 width: parent.width;
0108 placeholderText: i18nc("placeholder text for the add new keyword text entry", "Write a comma separated list of keywords.");
0109 text:root.model.acbfData ? root.model.acbfData.metaData.bookInfo.keywords("").join(", ") : "";
0110 onTextChanged: {
0111 var keywords = defaultKeywords.text.split(",")
0112 for (var i in keywords) {
0113 keywords[i] = keywords[i].trim();
0114 }
0115 root.model.acbfData.metaData.bookInfo.setKeywords(keywords, "");
0116 root.model.setDirty();
0117 }
0118 }
0119
0120 Kirigami.Heading {
0121 width: parent.width;
0122 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0123 text: i18nc("label text for the edit field for the author list", "Authors (%1)", authorRepeater.count);
0124 }
0125 Repeater {
0126 id: authorRepeater;
0127 model: root.model.acbfData ? root.model.acbfData.metaData.bookInfo.authorNames : 0;
0128 delegate: QtControls.Label {
0129 width: parent.width - removeAuthorButton.width - Kirigami.Units.smallSpacing;
0130 text: modelData.length > 0 ? modelData : i18nc("The text used in place of an author's name if one has not been set", "(unnamed)");
0131 QtControls.Button {
0132 id: editAuthorButton;
0133 anchors {
0134 right: removeAuthorButton.left;
0135 leftMargin: Kirigami.Units.smallSpacing;
0136 }
0137 contentItem: Kirigami.Icon {
0138 source: "document-edit";
0139 }
0140 height: parent.height;
0141 width: height;
0142 onClicked: {
0143 authorEditor.index = model.index;
0144 authorEditor.open();
0145 }
0146 }
0147 QtControls.Button {
0148 id: removeAuthorButton;
0149 anchors {
0150 left: parent.right;
0151 leftMargin: Kirigami.Units.smallSpacing;
0152 }
0153 contentItem: Kirigami.Icon {
0154 source: "list-remove";
0155 }
0156 height: parent.height;
0157 width: height;
0158 onClicked: {
0159 // When removing, set the model dirty first, and then remove the entry to avoid reference errors.
0160 root.model.setDirty();
0161 root.model.acbfData.metaData.bookInfo.removeAuthor(index);
0162 }
0163 }
0164 }
0165 }
0166 Item { width: parent.width; height: Kirigami.Units.smallSpacing; }
0167 QtControls.TextField {
0168 width: parent.width - addAuthorButton.width - Kirigami.Units.smallSpacing;
0169 placeholderText: i18nc("placeholder text for the add new author text entry", "Write to add new author (nickname)");
0170 Keys.onReturnPressed: addAuthor();
0171 function addAuthor() {
0172 if(text !== "") {
0173 // Just add an author where only the nickname is defined
0174 root.model.acbfData.metaData.bookInfo.addAuthor("", "", "", "", "", text, [""], [""]);
0175 root.model.setDirty();
0176 text = "";
0177 }
0178 }
0179
0180 QtControls.Button {
0181 id: addAuthorButton;
0182 anchors {
0183 left: parent.right;
0184 leftMargin: Kirigami.Units.smallSpacing;
0185 }
0186 contentItem: Kirigami.Icon {
0187 source: "list-add";
0188 }
0189 height: parent.height;
0190 width: height;
0191 onClicked: parent.addAuthor();
0192 }
0193 }
0194
0195 Kirigami.Heading {
0196 width: parent.width;
0197 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0198 text: i18nc("label text for the edit field for the genre list", "Genres");
0199 }
0200 Repeater {
0201 model: root.model.acbfData ? root.model.acbfData.metaData.bookInfo.genres : 0;
0202 delegate: Item {
0203 width: parent.width;
0204 height: childrenRect.height;
0205 QtControls.Label {
0206 id: genreText;
0207 width: parent.width - removeGenreButton.width - Kirigami.Units.smallSpacing;
0208 text: modelData;
0209 QtControls.Button {
0210 id: removeGenreButton;
0211 anchors {
0212 left: parent.right;
0213 leftMargin: Kirigami.Units.smallSpacing;
0214 }
0215 contentItem: Kirigami.Icon {
0216 source: "list-remove";
0217 }
0218 height: parent.height;
0219 width: height;
0220 onClicked: {
0221 root.model.setDirty();
0222 root.model.acbfData.metaData.bookInfo.removeGenre(modelData);
0223 }
0224 }
0225 }
0226 QtControls.Slider {
0227 anchors {
0228 top: genreText.bottom;
0229 topMargin: Kirigami.Units.smallSpacing;
0230 }
0231 from: 0;
0232 to: 100;
0233 stepSize: 1.0;
0234 width: genreText.width;
0235 value: root.model.acbfData.metaData.bookInfo.genrePercentage(modelData);
0236 onValueChanged: {
0237 if(value > 0 && value !== root.model.acbfData.metaData.bookInfo.genrePercentage(modelData)) {
0238 root.model.acbfData.metaData.bookInfo.setGenre(modelData, value);
0239 root.model.setDirty();
0240 }
0241 }
0242 }
0243 }
0244 }
0245 Item { width: parent.width; height: Kirigami.Units.smallSpacing; }
0246 QtControls.ComboBox {
0247 width: parent.width - addGenreButton.width - Kirigami.Units.smallSpacing;
0248 model: root.model.acbfData ? root.model.acbfData.metaData.bookInfo.availableGenres().filter(checkGenreInUse) : 0;
0249 Keys.onReturnPressed: addGenre();
0250 function addGenre() {
0251 root.model.acbfData.metaData.bookInfo.setGenre(currentText);
0252 root.model.setDirty();
0253 currentIndex=0;
0254 }
0255 function checkGenreInUse (genre) {
0256 return root.model.acbfData.metaData.bookInfo.genres.indexOf(genre) === -1;
0257 }
0258
0259 QtControls.Button {
0260 id: addGenreButton;
0261 anchors {
0262 left: parent.right;
0263 leftMargin: Kirigami.Units.smallSpacing;
0264 }
0265 contentItem: Kirigami.Icon {
0266 source: "list-add";
0267 }
0268 height: parent.height;
0269 width: height;
0270 onClicked: parent.addGenre();
0271 }
0272 }
0273
0274 Kirigami.Heading {
0275 width: parent.width;
0276 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0277 text: i18nc("label text for the edit field for the character list", "Characters");
0278 }
0279 Repeater {
0280 model: root.model.acbfData ? root.model.acbfData.metaData.bookInfo.characters : 0;
0281 delegate: QtControls.TextField {
0282 width: parent.width - removeCharacterButton.width - Kirigami.Units.smallSpacing;
0283 text: modelData;
0284 onEditingFinished: root.model.acbfData.metaData.bookInfo.characters[index] = text;
0285 QtControls.Button {
0286 id: removeCharacterButton;
0287 anchors {
0288 left: parent.right;
0289 leftMargin: Kirigami.Units.smallSpacing;
0290 }
0291 contentItem: Kirigami.Icon {
0292 source: "list-remove";
0293 }
0294 height: parent.height;
0295 width: height;
0296 onClicked: {
0297 root.model.setDirty();
0298 root.model.acbfData.metaData.bookInfo.removeCharacter(modelData);
0299 }
0300 }
0301 }
0302 }
0303 Item { width: parent.width; height: Kirigami.Units.smallSpacing; }
0304 QtControls.TextField {
0305 width: parent.width - addCharacterButton.width - Kirigami.Units.smallSpacing;
0306 placeholderText: i18nc("placeholder text for the add new character text entry", "Write to add new character");
0307 Keys.onReturnPressed: addCharacter();
0308 function addCharacter() {
0309 if(text !== "") {
0310 root.model.acbfData.metaData.bookInfo.addCharacter(text);
0311 root.model.setDirty();
0312 text = "";
0313 }
0314 }
0315
0316 QtControls.Button {
0317 id: addCharacterButton;
0318 anchors {
0319 left: parent.right;
0320 leftMargin: Kirigami.Units.smallSpacing;
0321 }
0322 contentItem: Kirigami.Icon {
0323 source: "list-add";
0324 }
0325 height: parent.height;
0326 width: height;
0327 onClicked: parent.addCharacter();
0328 }
0329 }
0330
0331 Kirigami.Heading {
0332 width: parent.width;
0333 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0334 text: i18nc("label text for the edit field for the sequence list", "Sequence");
0335 }
0336 Repeater {
0337 id: sequenceListRepeater;
0338 model: root.model.acbfData ? root.model.acbfData.metaData.bookInfo.sequenceCount : 0;
0339 delegate: Item {
0340 width: parent.width;
0341 height: childrenRect.height;
0342
0343 function updateSeries() {
0344 root.model.acbfData.metaData.bookInfo.sequence(modelData).title = seriesTextField.text;
0345 if (numberField.value !== root.model.acbfData.metaData.bookInfo.sequence(modelData).number) {
0346 root.model.acbfData.metaData.bookInfo.sequence(modelData).number = numberField.value;
0347 }
0348 if (volumeField.value !== root.model.acbfData.metaData.bookInfo.sequence(modelData).volume) {
0349 root.model.acbfData.metaData.bookInfo.sequence(modelData).volume = volumeField.value;
0350 }
0351 root.model.setDirty();
0352 }
0353
0354 QtControls.TextField {
0355 id: seriesTextField;
0356 width: parent.width - removeSequenceButton.width - Kirigami.Units.smallSpacing;
0357 text: root.model.acbfData.metaData.bookInfo.sequence(modelData).title;
0358 onEditingFinished: parent.updateSeries();
0359 }
0360
0361 QtControls.Label {
0362 text: i18nc("Label for sequence number","Number:");
0363 id: sequenceNumberLabel;
0364 height:numberField.height;
0365 anchors {
0366 top: seriesTextField.bottom;
0367 topMargin: Kirigami.Units.smallSpacing;
0368 }
0369 }
0370 QtControls.SpinBox {
0371 anchors {
0372 top: seriesTextField.bottom;
0373 topMargin: Kirigami.Units.smallSpacing;
0374 left: sequenceNumberLabel.right;
0375 leftMargin: Kirigami.Units.smallSpacing;
0376 }
0377 value : root.model.acbfData.metaData.bookInfo.sequence(modelData).number;
0378 width : ((seriesTextField.width+Kirigami.Units.smallSpacing)/2)-(sequenceNumberLabel.width+Kirigami.Units.smallSpacing);
0379 id: numberField;
0380 onValueChanged: parent.updateSeries();
0381 from: 0;
0382 to: 99999;
0383 editable: true;
0384 }
0385 QtControls.Label {
0386 text: i18nc("Label for sequence volume","Volume:");
0387 id: sequenceVolumeLabel;
0388 height:volumeField.height;
0389 anchors {
0390 left: numberField.right;
0391 leftMargin: Kirigami.Units.smallSpacing;
0392 top: seriesTextField.bottom;
0393 topMargin: Kirigami.Units.smallSpacing;
0394 }
0395
0396 }
0397 QtControls.SpinBox {
0398 anchors {
0399 left: sequenceVolumeLabel.right;
0400 leftMargin: Kirigami.Units.smallSpacing;
0401 top: seriesTextField.bottom;
0402 topMargin: Kirigami.Units.smallSpacing;
0403 }
0404 value : root.model.acbfData.metaData.bookInfo.sequence(modelData).volume;
0405 width : (seriesTextField.width/2)-(Kirigami.Units.smallSpacing*1.5)-(sequenceVolumeLabel.width+Kirigami.Units.smallSpacing);
0406 id: volumeField;
0407 onValueChanged: parent.updateSeries();
0408 from: 0;
0409 to: 99999;
0410 editable: true;
0411 }
0412 QtControls.Button {
0413 id: removeSequenceButton;
0414 anchors {
0415 left: seriesTextField.right;
0416 leftMargin: Kirigami.Units.smallSpacing;
0417 }
0418 contentItem: Kirigami.Icon {
0419 source: "list-remove";
0420 }
0421 height: seriesTextField.height;
0422 width: height;
0423 onClicked: {
0424 root.model.setDirty();
0425 root.model.acbfData.metaData.bookInfo.removeSequence(index);
0426 }
0427 }
0428 }
0429 }
0430 Item { width: parent.width; height: Kirigami.Units.smallSpacing; }
0431 QtControls.TextField {
0432 width: parent.width - addSequenceButton.width - Kirigami.Units.smallSpacing;
0433 placeholderText: i18nc("placeholder text for the add new series text entry", "Write to add new series");
0434 Keys.onReturnPressed:addSequence();
0435 function addSequence() {
0436 if(text !== "") {
0437 root.model.acbfData.metaData.bookInfo.addSequence(0, text);
0438 root.model.setDirty();
0439 text = "";
0440 }
0441 }
0442
0443 QtControls.Button {
0444 id: addSequenceButton;
0445 anchors {
0446 left: parent.right;
0447 leftMargin: Kirigami.Units.smallSpacing;
0448 }
0449 contentItem: Kirigami.Icon {
0450 source: "list-add";
0451 }
0452 height: parent.height;
0453 width: height;
0454 onClicked: parent.addSequence();
0455 }
0456 }
0457
0458 Kirigami.Heading {
0459 width: parent.width;
0460 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0461 text: i18nc("label text for the edit field for the database reference list", "Database References");
0462 }
0463 Repeater {
0464 model: root.model.acbfData ? root.model.acbfData.metaData.bookInfo.databaseRefCount : 0;
0465 delegate: Item {
0466 width: parent.width;
0467 height: childrenRect.height;
0468
0469 function updateDatabaseRef() {
0470 root.model.acbfData.metaData.bookInfo.databaseRef(modelData).reference = referenceTextField.text
0471 root.model.acbfData.metaData.bookInfo.databaseRef(modelData).dbname = databaseNameField.text
0472 root.model.acbfData.metaData.bookInfo.databaseRef(modelData).type = referenceTypeField.text
0473 root.model.setDirty();
0474 }
0475
0476 QtControls.TextField {
0477 id: referenceTextField;
0478 width: parent.width - removeReferenceButton.width - Kirigami.Units.smallSpacing;
0479 text: root.model.acbfData.metaData.bookInfo.databaseRef(modelData).reference;
0480 onEditingFinished: parent.updateDatabaseRef();
0481 }
0482 QtControls.TextField {
0483 anchors {
0484 top: referenceTextField.bottom;
0485 topMargin: Kirigami.Units.smallSpacing;
0486 }
0487 width : (referenceTextField.width+Kirigami.Units.smallSpacing)/2;
0488 id: databaseNameField;
0489 text: root.model.acbfData.metaData.bookInfo.databaseRef(modelData).dbname;
0490 onEditingFinished: parent.updateDatabaseRef();
0491 }
0492 QtControls.TextField {
0493 anchors {
0494 left: databaseNameField.right;
0495 leftMargin: Kirigami.Units.smallSpacing;
0496 top: referenceTextField.bottom;
0497 topMargin: Kirigami.Units.smallSpacing;
0498 }
0499 width : (referenceTextField.width/2)-(Kirigami.Units.smallSpacing*1.5);
0500 id: referenceTypeField;
0501 text: root.model.acbfData.metaData.bookInfo.databaseRef(modelData).type;
0502 placeholderText: i18nc("placeholder text for the add reference type text entry", "Write to add reference type");
0503 onEditingFinished: parent.updateDatabaseRef();
0504 }
0505 QtControls.Button {
0506 id: removeReferenceButton;
0507 anchors {
0508 left: referenceTextField.right;
0509 leftMargin: Kirigami.Units.smallSpacing;
0510 }
0511 contentItem: Kirigami.Icon {
0512 source: "list-remove";
0513 }
0514 height: referenceTextField.height;
0515 width: height;
0516 onClicked: {
0517 root.model.setDirty();
0518 root.model.acbfData.metaData.bookInfo.removeDatabaseRef(index);
0519 }
0520 }
0521 }
0522 }
0523 Item { width: parent.width; height: Kirigami.Units.smallSpacing; }
0524 Item {
0525 width: parent.width;
0526 height: childrenRect.height;
0527 function addReference() {
0528 if(addReferenceField.text !== "" && addDatabaseNameField.text !== "") {
0529 root.model.acbfData.metaData.bookInfo.addDatabaseRef(addReferenceField.text, addDatabaseNameField.text);
0530 root.model.setDirty();
0531 addReferenceField.text = "";
0532 addDatabaseNameField.text = "";
0533 }
0534 }
0535
0536 QtControls.TextField {
0537 id: addReferenceField
0538 width: parent.width - addReferenceButton.width - Kirigami.Units.smallSpacing;
0539 placeholderText: i18nc("placeholder text for the add new reference text entry", "Write to add new reference");
0540 Keys.onReturnPressed: parent.addReference();
0541 }
0542 QtControls.TextField {
0543 id: addDatabaseNameField
0544 anchors {
0545 top: addReferenceField.bottom;
0546 topMargin: Kirigami.Units.smallSpacing;
0547 }
0548 width: parent.width - addReferenceButton.width - Kirigami.Units.smallSpacing;
0549 placeholderText: i18nc("placeholder text for the add databasename text entry", "Write to add database name for new reference.");
0550 Keys.onReturnPressed: parent.addReference();
0551 }
0552 QtControls.Button {
0553 id: addReferenceButton;
0554 anchors {
0555 left: addReferenceField.right;
0556 leftMargin: Kirigami.Units.smallSpacing;
0557 }
0558 contentItem: Kirigami.Icon {
0559 source: "list-add";
0560 }
0561 height: addReferenceField.height;
0562 width: height;
0563 onClicked: parent.addReference();
0564 }
0565 }
0566
0567 Kirigami.Heading {
0568 width: parent.width;
0569 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0570 text: i18nc("label text for the edit field for the content rating list", "Content Ratings");
0571 }
0572 Repeater {
0573 model: root.model.acbfData ? root.model.acbfData.metaData.bookInfo.contentRatingCount : 0;
0574 delegate: Item {
0575 width: parent.width;
0576 height: childrenRect.height;
0577
0578 function updateRating() {
0579 root.model.acbfData.metaData.bookInfo.contentRating(modelData).rating = ratingNameField.text
0580 root.model.acbfData.metaData.bookInfo.contentRating(modelData).type = systemNameField.text
0581 root.model.setDirty();
0582 }
0583
0584 QtControls.TextField {
0585 width : (parent.width-removeRatingButton.width+Kirigami.Units.smallSpacing)/2;
0586 id: ratingNameField;
0587 text: root.model.acbfData.metaData.bookInfo.contentRating(modelData).rating;
0588 placeholderText: i18nc("placeholder text for the add content rating text entry", "Write to add rating label.");
0589 onEditingFinished: parent.updateRating();
0590 }
0591 QtControls.TextField {
0592 anchors {
0593 left: ratingNameField.right;
0594 leftMargin: Kirigami.Units.smallSpacing;
0595 }
0596 width : ((parent.width-removeRatingButton.width)/2)-(Kirigami.Units.smallSpacing*1.5);
0597 id: systemNameField;
0598 text: root.model.acbfData.metaData.bookInfo.contentRating(modelData).type;
0599 placeholderText: i18nc("placeholder text for the add content rating system text entry", "Write to add rating system.");
0600 onEditingFinished: parent.updateRating();
0601 }
0602 QtControls.Button {
0603 id: removeRatingButton;
0604 anchors {
0605 left: systemNameField.right;
0606 leftMargin: Kirigami.Units.smallSpacing;
0607 }
0608 contentItem: Kirigami.Icon {
0609 source: "list-remove";
0610 }
0611 height: systemNameField.height;
0612 width: height;
0613 onClicked: {
0614 root.model.setDirty();
0615 root.model.acbfData.metaData.bookInfo.removeContentRating(index);
0616 }
0617 }
0618 }
0619 }
0620 Item {
0621 width: parent.width;
0622 height: childrenRect.height;
0623 function addRating() {
0624 if(addRatingField.text !== "" && addSystemField.text !== "") {
0625 root.model.acbfData.metaData.bookInfo.addContentRating(addRatingField.text, addSystemField.text);
0626 root.model.setDirty();
0627 addRatingField.text = "";
0628 addSystemField.text = "";
0629 }
0630 }
0631 QtControls.TextField {
0632 width : (parent.width-addRatingButton.width+Kirigami.Units.smallSpacing)/2;
0633 id: addRatingField;
0634 placeholderText: i18nc("placeholder text for the add content rating text entry", "Write to add rating label.");
0635 onEditingFinished: parent.addRating();
0636 }
0637 QtControls.TextField {
0638 anchors {
0639 left: addRatingField.right;
0640 leftMargin: Kirigami.Units.smallSpacing;
0641 }
0642 width : ((parent.width-addRatingButton.width)/2)-(Kirigami.Units.smallSpacing*1.5);
0643 id: addSystemField;
0644 placeholderText: i18nc("placeholder text for the add content rating system text entry", "Write to add rating system.");
0645 onEditingFinished: parent.addRating();
0646 }
0647 QtControls.Button {
0648 id: addRatingButton;
0649 anchors {
0650 left: addSystemField.right;
0651 leftMargin: Kirigami.Units.smallSpacing;
0652 }
0653 contentItem: Kirigami.Icon {
0654 source: "list-add";
0655 }
0656 height: addSystemField.height;
0657 width: height;
0658 onClicked: parent.addRating();
0659 }
0660 }
0661 Kirigami.Heading {
0662 width: parent.width;
0663 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0664 text: i18nc("label text for the form for reading direction.", "Reading Direction");
0665 }
0666 QtControls.CheckBox {
0667 width: parent.width;
0668 text: i18nc("label text for right to left checkbox.", "Right to left.");
0669 checked: root.model.acbfData.metaData.bookInfo.rightToLeft;
0670 onCheckStateChanged: root.model.acbfData.metaData.bookInfo.rightToLeft = checked;
0671 }
0672
0673 Kirigami.Heading {
0674 width: parent.width;
0675 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0676 text: i18nc("label text for the form for the publishing info list", "Publisher Info");
0677 }
0678 QtControls.Label {
0679 text: i18nc("Label for publisher", "Publisher:");
0680 }
0681 QtControls.TextField {
0682 width : parent.width;
0683 id: publisher;
0684 placeholderText: i18nc("placeholder text for the publisher entry", "Write to add publisher");
0685 text: root.model.acbfData? root.model.acbfData.metaData.publishInfo.publisher: "";
0686 onEditingFinished: {
0687 if (root.model.acbfData && text !=="") {
0688 root.model.acbfData.metaData.publishInfo.publisher = text
0689 root.model.setDirty();
0690 }
0691 }
0692 }
0693 QtControls.Label {
0694 text: i18nc("Label for publishing date", "Publishing Date:");
0695 }
0696 Item {
0697 width : parent.width;
0698 id: publishingDate;
0699 height: childrenRect.height;
0700 property date publishingDate: root.model.acbfData.metaData.publishInfo.publishDate;
0701 function changePublishDate() {
0702 root.model.acbfData.metaData.publishInfo.setPublishDateFromInts(pdYear.text, (pdMonth.currentIndex+1), pdDate.value);
0703 root.model.setDirty();
0704 }
0705 QtControls.TextField {
0706 id: pdYear
0707 width: (parent.width-(Kirigami.Units.smallSpacing*2))/3;
0708 text: parent.publishingDate.getFullYear();
0709 onEditingFinished: parent.changePublishDate();
0710 inputMask: "9999"
0711 inputMethodHints: Qt.ImhFormattedNumbersOnly;
0712 }
0713 QtControls.ComboBox {
0714 id: pdMonth
0715 anchors {
0716 left: pdYear.right;
0717 margins: Kirigami.Units.smallSpacing;
0718 }
0719 model: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
0720 width: (parent.width-(Kirigami.Units.smallSpacing*2))/3;
0721 currentIndex: parent.publishingDate.getMonth();
0722 displayText: Qt.locale().monthName(currentText, Locale.LongFormat);
0723 onActivated: parent.changePublishDate();
0724 delegate: QtControls.ItemDelegate {
0725 text:Qt.locale().monthName(modelData, Locale.LongFormat);
0726 }
0727 }
0728 QtControls.SpinBox {
0729 id: pdDate
0730 anchors {
0731 left: pdMonth.right;
0732 margins: Kirigami.Units.smallSpacing;
0733 }
0734 width: (parent.width-(Kirigami.Units.smallSpacing*2))/3;
0735 height: pdMonth.height;
0736 from: 1;
0737 to: 31;
0738 editable: true;
0739 value: parent.publishingDate.getDate();
0740 onValueChanged: parent.changePublishDate();
0741 }
0742 }
0743 QtControls.Label {
0744 text: i18nc("Label for city", "City:");
0745 }
0746 QtControls.TextField {
0747 width : parent.width;
0748 id: city;
0749 placeholderText: i18nc("placeholder text for the publishing city entry", "Write to add city");
0750 text: root.model.acbfData? root.model.acbfData.metaData.publishInfo.city: "";
0751 onEditingFinished: {
0752 if (root.model.acbfData && text !=="") {
0753 root.model.acbfData.metaData.publishInfo.city = text ;
0754 root.model.setDirty();
0755 }
0756 }
0757 }
0758 QtControls.Label {
0759 text: i18nc("Label for ISBN", "ISBN:");
0760 }
0761
0762 QtControls.TextField {
0763 width : parent.width;
0764 id: isbn;
0765 placeholderText: i18nc("placeholder text for the publishing ISBN entry", "Write to add ISBN");
0766 text: root.model.acbfData? root.model.acbfData.metaData.publishInfo.isbn: "";
0767 onEditingFinished: {
0768 if (root.model.acbfData && text !=="") {
0769 root.model.acbfData.metaData.publishInfo.isbn = text
0770 root.model.setDirty();
0771 }
0772 }
0773 }
0774 QtControls.Label {
0775 text: i18nc("Label for license", "License:");
0776 }
0777 QtControls.TextField {
0778 width : parent.width;
0779 id: license;
0780 placeholderText: i18nc("placeholder text for the publishing license entry", "Write to add license");
0781 text: root.model.acbfData? root.model.acbfData.metaData.publishInfo.license: "";
0782 onEditingFinished: {
0783 if (root.model.acbfData && text !=="") {
0784 root.model.acbfData.metaData.publishInfo.license = text
0785 root.model.setDirty();
0786 }
0787 }
0788 }
0789 Kirigami.Heading {
0790 width: parent.width;
0791 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0792 text: i18nc("label text for the form for the document info list", "Document Authors");
0793 }
0794
0795 Repeater {
0796 id: docAuthorRepeater;
0797 model: root.model.acbfData ? root.model.acbfData.metaData.documentInfo.authorNames : 0;
0798 delegate: QtControls.Label {
0799 width: parent.width - removeDocAuthorButton.width - Kirigami.Units.smallSpacing;
0800 text: modelData.length > 0 ? modelData : i18nc("The text used in place of an author's name if one has not been set", "(unnamed)");
0801 QtControls.Button {
0802 id: editDocAuthorButton;
0803 anchors {
0804 right: removeDocAuthorButton.left;
0805 leftMargin: Kirigami.Units.smallSpacing;
0806 }
0807 contentItem: Kirigami.Icon {
0808 source: "document-edit";
0809 }
0810 height: parent.height;
0811 width: height;
0812 onClicked: {
0813 docAuthorEditor.index = model.index;
0814 docAuthorEditor.open();
0815 }
0816 }
0817 QtControls.Button {
0818 id: removeDocAuthorButton;
0819 anchors {
0820 left: parent.right;
0821 leftMargin: Kirigami.Units.smallSpacing;
0822 }
0823 contentItem: Kirigami.Icon {
0824 source: "list-remove";
0825 }
0826 height: parent.height;
0827 width: height;
0828 onClicked: {
0829 // When removing, set the model dirty first, and then remove the entry to avoid reference errors.
0830 root.model.setDirty();
0831 root.model.acbfData.metaData.documentInfo.removeAuthor(index);
0832 }
0833 }
0834 }
0835 }
0836 Item { width: parent.width; height: Kirigami.Units.smallSpacing; }
0837 QtControls.TextField {
0838 width: parent.width - addDocAuthorButton.width - Kirigami.Units.smallSpacing;
0839 placeholderText: i18nc("placeholder text for the add new author text entry", "Write to add new author (nickname)");
0840 Keys.onReturnPressed: addAuthor();
0841 function addAuthor() {
0842 if(text !== "") {
0843 // Just add an author where only the nickname is defined
0844 root.model.acbfData.metaData.documentInfo.addAuthor("", "", "", "", "", text, [""], [""]);
0845 root.model.setDirty();
0846 text = "";
0847 }
0848 }
0849
0850 QtControls.Button {
0851 id: addDocAuthorButton;
0852 anchors {
0853 left: parent.right;
0854 leftMargin: Kirigami.Units.smallSpacing;
0855 }
0856 contentItem: Kirigami.Icon {
0857 source: "list-add";
0858 }
0859 height: parent.height;
0860 width: height;
0861 onClicked: parent.addAuthor();
0862 }
0863 }
0864
0865 Kirigami.Heading {
0866 width: parent.width;
0867 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0868 text: i18nc("label text for the form for the sources list", "Document Sources");
0869 }
0870
0871 Repeater {
0872 model: root.model.acbfData ? root.model.acbfData.metaData.documentInfo.source : 0;
0873 delegate: Item {
0874 width: parent.width;
0875 height: childrenRect.height;
0876 QtControls.TextField {
0877 id: sourceText;
0878 width: parent.width - removeSourceButton.width - Kirigami.Units.smallSpacing;
0879 text: modelData;
0880 onEditingFinished: root.model.acbfData.metaData.documentInfo.sources[index] = text;
0881 QtControls.Button {
0882 id: removeSourceButton;
0883 anchors {
0884 left: parent.right;
0885 leftMargin: Kirigami.Units.smallSpacing;
0886 }
0887 contentItem: Kirigami.Icon {
0888 source: "list-remove";
0889 }
0890 height: parent.height;
0891 width: height;
0892 onClicked: {
0893 root.model.setDirty();
0894 root.model.acbfData.metaData.documentInfo.removeSource(index);
0895 }
0896 }
0897 }
0898 }
0899 }
0900 Item { width: parent.width; height: Kirigami.Units.smallSpacing; }
0901 QtControls.TextField {
0902 width: parent.width - addSourceButton.width - Kirigami.Units.smallSpacing;
0903 Keys.onReturnPressed: addEntry();
0904 function addEntry() {
0905 if (text !== "") {
0906 root.model.acbfData.metaData.documentInfo.source.push(text);
0907 root.model.setDirty();
0908 text = "";
0909 }
0910 }
0911
0912 QtControls.Button {
0913 id: addSourceButton;
0914 anchors {
0915 left: parent.right;
0916 leftMargin: Kirigami.Units.smallSpacing;
0917 }
0918 contentItem: Kirigami.Icon {
0919 source: "list-add";
0920 }
0921 height: parent.height;
0922 width: height;
0923 onClicked: parent.addEntry();
0924 }
0925 }
0926
0927 Kirigami.Heading {
0928 width: parent.width;
0929 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
0930 text: i18nc("label text for the form for the history list", "Document History");
0931 }
0932
0933 Repeater {
0934 model: root.model.acbfData ? root.model.acbfData.metaData.documentInfo.history : 0;
0935 delegate: Item {
0936 width: parent.width;
0937 height: childrenRect.height;
0938 QtControls.TextField {
0939 id: historyText;
0940 width: parent.width - removeHistoryButton.width - Kirigami.Units.smallSpacing;
0941 text: modelData;
0942 onEditingFinished: root.model.acbfData.metaData.documentInfo.history[index] = text;
0943 QtControls.Button {
0944 id: removeHistoryButton;
0945 anchors {
0946 left: parent.right;
0947 leftMargin: Kirigami.Units.smallSpacing;
0948 }
0949 contentItem: Kirigami.Icon {
0950 source: "list-remove";
0951 }
0952 height: parent.height;
0953 width: height;
0954 onClicked: {
0955 root.model.setDirty();
0956 root.model.acbfData.metaData.documentInfo.removeHistoryLine(index);
0957 }
0958 }
0959 }
0960 }
0961 }
0962 Item { width: parent.width; height: Kirigami.Units.smallSpacing; }
0963 QtControls.TextField {
0964 width: parent.width - addHistoryButton.width - Kirigami.Units.smallSpacing;
0965 Keys.onReturnPressed: addEntry();
0966 function addEntry() {
0967 if (text !== "") {
0968 root.model.acbfData.metaData.documentInfo.history.push(text);
0969 root.model.setDirty();
0970 text = "";
0971 }
0972 }
0973
0974 QtControls.Button {
0975 id: addHistoryButton;
0976 anchors {
0977 left: parent.right;
0978 leftMargin: Kirigami.Units.smallSpacing;
0979 }
0980 contentItem: Kirigami.Icon {
0981 source: "list-add";
0982 }
0983 height: parent.height;
0984 width: height;
0985 onClicked: parent.addEntry();
0986 }
0987 }
0988 Item { width: parent.width; height: Kirigami.Units.smallSpacing; }
0989 Item {
0990 width: parent.width;
0991 height: childrenRect.height;
0992 QtControls.Label {
0993 id: versionLabel;
0994 height: versionSpinBox.height;
0995 text: i18nc("Label for the document version spinbox","Document Version:");
0996 }
0997 QtControls.SpinBox {
0998 id: versionSpinBox;
0999 anchors {
1000 top: versionLabel.top;
1001 left: versionLabel.right;
1002 leftMargin: Kirigami.Units.smallSpacing;
1003 }
1004 width: parent.width - (Kirigami.Units.smallSpacing*2) - versionLabel.width - addHistoryButton.width;
1005 from:0;
1006 to: 100 * 100;
1007 stepSize: 100;
1008 editable: true;
1009
1010 property int decimals: 2;
1011 property real realValue: value / 100;
1012
1013 validator: DoubleValidator {
1014 bottom: Math.min(versionSpinBox.from, versionSpinBox.to)
1015 top: Math.max(versionSpinBox.from, versionSpinBox.to)
1016 }
1017
1018 textFromValue: function(value, locale) {
1019 return Number(value / 100).toLocaleString(locale, 'f', decimals)
1020 }
1021
1022 valueFromText: function(text, locale) {
1023 return Number.fromLocaleString(locale, text) * 100
1024 }
1025 value: root.model.acbfData.metaData.documentInfo.version * 100;
1026
1027 onFocusChanged: {
1028 if (root.model.acbfData.metaData.documentInfo.version*100!==value) {
1029 root.model.acbfData.metaData.documentInfo.version = value/100;
1030 }
1031 }
1032 }
1033 }
1034 Kirigami.Heading {
1035 width: parent.width;
1036 height: paintedHeight + Kirigami.Units.smallSpacing * 2;
1037 text: i18nc("label text for the form for the body background color.", "General Page Background Color");
1038 }
1039 Rectangle {
1040 height: addHistoryButton.height;
1041 width: parent.width - height;
1042 radius: 3;
1043 border.color: Kirigami.Theme.disabledTextColor;
1044 border.width: 1;
1045 color: root.model.acbfData.body.bgcolor !== ""? root.model.acbfData.body.bgcolor: "#ffffff";
1046 MouseArea {
1047 anchors.fill: parent;
1048 onClicked: bodyBackgroundColorDialog.open();
1049 hoverEnabled: true;
1050 onEntered: parent.border.color = Kirigami.Theme.buttonHoverColor;
1051 onExited: parent.border.color = Kirigami.Theme.disabledTextColor;
1052 }
1053 }
1054
1055
1056 AuthorEntryEditor {
1057 id: authorEditor;
1058 bookinfo: root.model.acbfData.metaData.bookInfo;
1059 onSave: {
1060 root.model.acbfData.metaData.bookInfo.setAuthor(index, activity, language, firstName, middleName, lastName, nickName, homePage, email);
1061 root.model.setDirty();
1062 }
1063 }
1064 AuthorEntryEditor {
1065 id: docAuthorEditor;
1066 bookinfo: root.model.acbfData.metaData.documentInfo;
1067 onSave: {
1068 root.model.acbfData.metaData.documentInfo.setAuthor(index, activity, language, firstName, middleName, lastName, nickName, homePage, email);
1069 root.model.setDirty();
1070 }
1071 }
1072 ColorDialog {
1073 id: bodyBackgroundColorDialog
1074 title: i18nc("@title color choosing dialog","Choose the general background color for this comic");
1075 color: root.model.acbfData.body.bgcolor !==""? root.model.acbfData.body.bgcolor: "#ffffff";
1076 onAccepted: {
1077 root.model.acbfData.body.bgcolor = color;
1078 }
1079 }
1080 }
1081 }