Index: scribus/scribus.cpp =================================================================== --- scribus/scribus.cpp (wersja 16619) +++ scribus/scribus.cpp (kopia robocza) @@ -212,6 +212,7 @@ #include "util_ghostscript.h" #include "util_icon.h" #include "util_math.h" +#include "util_text.h" #include "vruler.h" #include "loadsaveplugin.h" @@ -7447,6 +7448,60 @@ } } +void ScribusMainWindow::setPStyleCPos() +{ + PageItem *currItem = doc->m_Selection->itemAt(0); + if (!currItem->isTextFrame()) + return; + if (currItem->CPos >= currItem->itemText.length()) + return; + + StyleSet tmpStyles_; + ParagraphStyle newStyle; + newStyle.setStyle(doc->currentStyle); + newStyle.setName(getUniquePStyleName(doc, newStyle.parent())); + bool ok=false; + while (!ok) + { + QString newPSname = QInputDialog::getText(this, tr("Set name for new Paragraph Style"), + tr("Name:"), QLineEdit::Normal, + newStyle.name(), &ok); + if (ok) + { + QString uniqueName = getUniquePStyleName(doc, newPSname); + newStyle.setName(uniqueName); + if (uniqueName != newPSname) + ok = false; + } + else + return; + } + tmpStyles_.create(newStyle); + doc->redefineStyles(tmpStyles_); + doc->changed(); + styleMgr()->setDoc(doc); + propertiesPalette->paraStyleCombo->updateFormatList(); +} + +void ScribusMainWindow::updatePStyleCPos() +{ + PageItem *currItem = doc->m_Selection->itemAt(0); + if (!currItem->isTextFrame()) + return; + if (currItem->CPos >= currItem->itemText.length()) + return; + + StyleSet tmpStyles_; + ParagraphStyle newStyle; + newStyle.setStyle(doc->currentStyle); + newStyle.setName(newStyle.parent()); + tmpStyles_.create(newStyle); + doc->redefineStyles(tmpStyles_); + doc->changed(); + doc->view()->DrawNew(); + styleMgr()->setDoc(doc); +} + void ScribusMainWindow::setNewCharStyle(const QString& name) { if (HaveDoc) @@ -7466,7 +7521,66 @@ setTBvals(currItem); } } +void ScribusMainWindow::setChStyleCPos() +{ + PageItem *currItem = doc->m_Selection->itemAt(0); + if (!currItem->isTextFrame()) + return; + if (currItem->CPos >= currItem->itemText.length()) + return; + StyleSet tmpStyles_; + CharStyle newStyle; + newStyle.setStyle(doc->currentStyle.charStyle()); + newStyle.setName(getUniqueChStyleName(doc, newStyle.parent())); + bool ok=false; + while (!ok) + { + QString newChSname = QInputDialog::getText(this, tr("Set name for new Paragraph Style"), + tr("Name:"), QLineEdit::Normal, + newStyle.name(), &ok); + if (ok) + { + QString uniqueName = getUniqueChStyleName(doc, newChSname); + newStyle.setName(uniqueName); + if (uniqueName != newChSname) + ok = false; + } + else + return; + } + tmpStyles_.create(newStyle); + doc->redefineCharStyles(tmpStyles_); + doc->changed(); + styleMgr()->setDoc(doc); + propertiesPalette->charStyleCombo->updateFormatList(); +} + +void ScribusMainWindow::updateChStyleCPos() +{ + PageItem *currItem = doc->m_Selection->itemAt(0); + if (!currItem->isTextFrame()) + return; + if (currItem->CPos >= currItem->itemText.length()) + return; + + CharStyle newStyle; + newStyle.setStyle(doc->currentStyle.charStyle()); + newStyle.setName(newStyle.parent()); + + if (findCharStyle(doc, newStyle.name()) == -1) + setChStyleCPos(); + else + { + StyleSet tmpStyles_; + tmpStyles_.create(newStyle); + doc->redefineCharStyles(tmpStyles_); + doc->changed(); + doc->view()->DrawNew(); + styleMgr()->setDoc(doc); + } +} + void ScribusMainWindow::setAbsValue(int a) { // doc->currentStyle = doc->docParagraphStyles[a]; Index: scribus/util_text.cpp =================================================================== --- scribus/util_text.cpp (wersja 16619) +++ scribus/util_text.cpp (kopia robocza) @@ -50,3 +50,63 @@ assert(false); return -1; } + +int findCharStyle(ScribusDoc* doc, const QString &name) +{ + for (int i=0; i < doc->charStyles().count(); ++i) + { + if (name == doc->charStyles()[i].name()) { + return i; + } + } + assert(false); + return -1; +} + +QString getUniquePStyleName(ScribusDoc* doc, const QString &name) +{ + int id = 0; + bool done = false; + QString s(name); + + while (!done) + { +start: + ++id; + for (int i = 0; i < doc->paragraphStyles().count(); ++i) + { + if (doc->paragraphStyles()[i].name() == s) + { + s = name + " (" + QString::number(id) + ")"; + goto start; + } + } + done = true; + } + + return s; +} + +QString getUniqueChStyleName(ScribusDoc* doc, const QString &name) +{ + int id = 0; + bool done = false; + QString s(name); + + while (!done) + { +start: + ++id; + for (int i = 0; i < doc->charStyles().count(); ++i) + { + if (doc->charStyles()[i].name() == s) + { + s = name + " (" + QString::number(id) + ")"; + goto start; + } + } + done = true; + } + + return s; +} Index: scribus/util_text.h =================================================================== --- scribus/util_text.h (wersja 16619) +++ scribus/util_text.h (kopia robocza) @@ -13,12 +13,16 @@ #include "styles/charstyle.h" #include "styles/paragraphstyle.h" #include "scribusapi.h" +#include class ScribusDoc; #ifndef NLS_CONFORMANCE int SCRIBUS_API findParagraphStyle(ScribusDoc* doc, const ParagraphStyle& parStyle); int SCRIBUS_API findParagraphStyle(ScribusDoc* doc, const QString &name); +int SCRIBUS_API findCharStyle(ScribusDoc* doc, const QString &name); +QString SCRIBUS_API getUniquePStyleName(ScribusDoc* doc, const QString &name); +QString SCRIBUS_API getUniqueChStyleName(ScribusDoc* doc, const QString &name); #endif Index: scribus/actionmanager.cpp =================================================================== --- scribus/actionmanager.cpp (wersja 16619) +++ scribus/actionmanager.cpp (kopia robocza) @@ -474,6 +474,15 @@ name="itemConvertToTextFrame"; scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow)); + name="itemPStyleFromTextNew"; + scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow)); + name="itemPStyleFromTextUpdate"; + scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow)); + name="itemChStyleFromTextNew"; + scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow)); + name="itemChStyleFromTextUpdate"; + scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow)); + connect( (*scrActions)["itemDuplicate"], SIGNAL(triggered()), mainWindow, SLOT(duplicateItem()) ); connect( (*scrActions)["itemMulDuplicate"], SIGNAL(triggered()), mainWindow, SLOT(duplicateItemMulti()) ); connect( (*scrActions)["itemGroup"], SIGNAL(triggered()), mainWindow, SLOT(GroupObj()) ); @@ -485,6 +494,11 @@ connect( (*scrActions)["itemAttributes"], SIGNAL(triggered()), mainWindow, SLOT(objectAttributes()) ); connect( (*scrActions)["itemShapeEdit"], SIGNAL(triggered()), mainWindow, SLOT(toggleNodeEdit()) ); connect( (*scrActions)["itemImageInfo"], SIGNAL(triggered()), mainWindow, SLOT(getImageInfo()) ); + + connect( (*scrActions)["itemPStyleFromTextNew"], SIGNAL(triggered()), mainWindow, SLOT(setPStyleCPos()) ); + connect( (*scrActions)["itemPStyleFromTextUpdate"], SIGNAL(triggered()), mainWindow, SLOT(updatePStyleCPos()) ); + connect( (*scrActions)["itemChStyleFromTextNew"], SIGNAL(triggered()), mainWindow, SLOT(setChStyleCPos()) ); + connect( (*scrActions)["itemChStyleFromTextUpdate"], SIGNAL(triggered()), mainWindow, SLOT(updateChStyleCPos()) ); } void ActionManager::initInsertMenuActions() @@ -1383,6 +1397,10 @@ (*scrActions)["itemConvertToOutlines"]->setTexts( tr("&Outlines", "Convert to oulines")); (*scrActions)["itemConvertToPolygon"]->setTexts( tr("&Polygon")); (*scrActions)["itemConvertToTextFrame"]->setTexts( tr("&Text Frame")); + (*scrActions)["itemPStyleFromTextNew"]->setTexts( tr("Create paragraph style with style at cursor position")); + (*scrActions)["itemPStyleFromTextUpdate"]->setTexts( tr("Update paragraph style with style at cursor position")); + (*scrActions)["itemChStyleFromTextNew"]->setTexts( tr("Create character style with style at cursor position")); + (*scrActions)["itemChStyleFromTextUpdate"]->setTexts( tr("Update character style with style at cursor position")); //Insert Menu (*scrActions)["insertFrame"]->setTexts( tr("&Frame...")); @@ -1764,7 +1782,7 @@ itmenu->second << "typeEffectNormal" << "typeEffectUnderline" << "typeEffectUnderlineWords" << "typeEffectStrikeThrough" << "typeEffectAllCaps" << "typeEffectSmallCaps" << "typeEffectSuperscript" << "typeEffectSubscript" << "typeEffectOutline" << "typeEffectShadow" << "styleImageEffects" << "styleTabulators"; //Item ++itmenu; - itmenu->second << "itemDuplicate" << "itemMulDuplicate" << "itemDelete" << "itemGroup" << "itemUngroup" << "itemLock" << "itemLockSize" << "itemImageIsVisible" << "itemUpdateImage" << "itemAdjustFrameToImage" << "itemAdjustImageToFrame" << "itemExtendedImageProperties" << "itemPreviewLow" << "itemPreviewNormal" << "itemPreviewFull" << "itemRaise" << "itemLower" << "itemRaiseToTop" << "itemLowerToBottom" << "itemSendToPattern" << "itemAttributes" << "itemPDFIsAnnotation" << "itemPDFIsBookmark" << "itemPDFAnnotationProps" << "itemPDFFieldProps" << "itemShapeEdit" << "itemConvertToBezierCurve" << "itemConvertToImageFrame" << "itemConvertToOutlines" << "itemConvertToPolygon" << "itemConvertToTextFrame" << "itemAttachTextToPath" << "itemDetachTextFromPath" << "itemCombinePolygons" << "itemSplitPolygons"; + itmenu->second << "itemDuplicate" << "itemMulDuplicate" << "itemDelete" << "itemGroup" << "itemUngroup" << "itemLock" << "itemLockSize" << "itemImageIsVisible" << "itemUpdateImage" << "itemAdjustFrameToImage" << "itemAdjustImageToFrame" << "itemExtendedImageProperties" << "itemPreviewLow" << "itemPreviewNormal" << "itemPreviewFull" << "itemRaise" << "itemLower" << "itemRaiseToTop" << "itemLowerToBottom" << "itemSendToPattern" << "itemAttributes" << "itemPDFIsAnnotation" << "itemPDFIsBookmark" << "itemPDFAnnotationProps" << "itemPDFFieldProps" << "itemShapeEdit" << "itemConvertToBezierCurve" << "itemConvertToImageFrame" << "itemConvertToOutlines" << "itemConvertToPolygon" << "itemConvertToTextFrame" << "itemAttachTextToPath" << "itemDetachTextFromPath" << "itemCombinePolygons" << "itemSplitPolygons" << "itemPStyleFromTextNew" << "itemPStyleFromTextUpdate" << "itemChStyleFromTextNew" << "itemChStyleFromTextUpdate"; //Insert ++itmenu; itmenu->second Index: scribus/scribus.h =================================================================== --- scribus/scribus.h (wersja 16619) +++ scribus/scribus.h (kopia robocza) @@ -485,7 +485,11 @@ // void saveStyles(StilFormate *dia); //still required for style save from SE void setNewAlignment(int a); void setNewParStyle(const QString& name); + void setPStyleCPos(); + void updatePStyleCPos(); void setNewCharStyle(const QString& name); + void setChStyleCPos(); + void updateChStyleCPos(); void setAbsValue(int a); void selectItemsFromOutlines(PageItem *ite); void selectItemsFromOutlines(int Page, int Item, bool single = false); Index: scribus/contextmenu.cpp =================================================================== --- scribus/contextmenu.cpp (wersja 16619) +++ scribus/contextmenu.cpp (kopia robocza) @@ -174,6 +174,13 @@ addSeparator(); addAction(m_AP->scrActions["toolsEditWithStoryEditor"]); } + if (currItem->asTextFrame()) + { + addAction(m_AP->scrActions["itemPStyleFromTextNew"]); + addAction(m_AP->scrActions["itemPStyleFromTextUpdate"]); + addAction(m_AP->scrActions["itemChStyleFromTextNew"]); + addAction(m_AP->scrActions["itemChStyleFromTextUpdate"]); + } addSeparator(); if (m_actionList.contains("fileImportImage")) addAction(m_AP->scrActions["fileImportImage"]);