Subversion Repositories Scribus

Rev

Rev 24931 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
For general Scribus (>=1.3.2) copyright and licensing information please refer
to the COPYING file provided with the program. Following this notice may exist
a copyright and/or license notice that predates the release of Scribus 1.3.2
for which a new license (GPL+exception) is in place.
*/


#include "propertywidget_optmargins.h"

#include "appmodehelper.h"
#include "appmodes.h"
#include "pageitem_table.h"
#include "scribus.h"
#include "scribusdoc.h"
#include "selection.h"


PropertyWidget_OptMargins::PropertyWidget_OptMargins(QWidget* parent) : QFrame(parent)
{
        setupUi(this);

        layout()->setAlignment(Qt::AlignTop);

        languageChange();
}

void PropertyWidget_OptMargins::setMainWindow(ScribusMainWindow* mw)
{
        m_ScMW = mw;

        connect(m_ScMW->appModeHelper, SIGNAL(AppModeChanged(int,int)), this, SLOT(handleAppModeChanged(int,int)));
        connect(m_ScMW, SIGNAL(UpdateRequest(int)), this  , SLOT(handleUpdateRequest(int)));
}

void PropertyWidget_OptMargins::setDoc(ScribusDoc *d)
{
        if((d == (ScribusDoc*) m_doc) || (m_ScMW && m_ScMW->scriptIsRunning()))
                return;

        if (m_doc)
        {
                disconnect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
                disconnect(m_doc             , SIGNAL(docChanged())      , this, SLOT(handleSelectionChanged()));
        }

        m_doc  = d;
        m_item = nullptr;

        if (m_doc.isNull())
        {
                disconnectSignals();
                return;
        }

        connect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
        connect(m_doc             , SIGNAL(docChanged())      , this, SLOT(handleSelectionChanged()));
}

void PropertyWidget_OptMargins::setCurrentItem(PageItem *item)
{
        if (!m_ScMW || m_ScMW->scriptIsRunning())
                return;
        //CB We shouldn't really need to process this if our item is the same one
        //maybe we do if the item has been changed by scripter.. but that should probably
        //set some status if so.
        //FIXME: This won't work until when a canvas deselect happens, m_item must be nullptr.
        //if (m_item == i)
        //      return;

        if (item && m_doc.isNull())
                setDoc(item->doc());

        m_item = item;

        disconnectSignals();
        configureWidgets();

        if (m_item)
        {
                if (m_item->isTextFrame() || m_item->isPathText())
                {
                        ParagraphStyle parStyle =  m_item->itemText.defaultStyle();
                        if (m_doc->appMode == modeEdit || m_doc->appMode == modeEditTable)
                                m_item->currentTextProps(parStyle);
                        showOpticalMargins(parStyle);
                }

                connectSignals();
        }
}

void PropertyWidget_OptMargins::connectSignals()
{
        connect(optMarginRadioNone  , SIGNAL(clicked()), this, SLOT(handleOpticalMargins()) );
        connect(optMarginRadioBoth  , SIGNAL(clicked()), this, SLOT(handleOpticalMargins()) );
        connect(optMarginRadioLeft  , SIGNAL(clicked()), this, SLOT(handleOpticalMargins()) );
        connect(optMarginRadioRight , SIGNAL(clicked()), this, SLOT(handleOpticalMargins()) );
        connect(optMarginResetButton, SIGNAL(clicked()), this, SLOT(resetOpticalMargins()) );
}

void PropertyWidget_OptMargins::disconnectSignals()
{
        disconnect(optMarginRadioNone  , SIGNAL(clicked()), this, SLOT(handleOpticalMargins()) );
        disconnect(optMarginRadioBoth  , SIGNAL(clicked()), this, SLOT(handleOpticalMargins()) );
        disconnect(optMarginRadioLeft  , SIGNAL(clicked()), this, SLOT(handleOpticalMargins()) );
        disconnect(optMarginRadioRight , SIGNAL(clicked()), this, SLOT(handleOpticalMargins()) );
        disconnect(optMarginResetButton, SIGNAL(clicked()), this, SLOT(resetOpticalMargins()) );
}

void PropertyWidget_OptMargins::configureWidgets()
{
        bool enabled = false;
        if (m_item && m_doc)
        {
                PageItem_TextFrame* textItem = m_item->asTextFrame();
                if (m_doc->appMode == modeEditTable)
                        textItem = m_item->asTable()->activeCell().textFrame();

                enabled  = (m_item->isPathText() || (textItem != nullptr));
                enabled &= (m_doc->m_Selection->count() == 1);
        }
        setEnabled(enabled);
}

void PropertyWidget_OptMargins::handleAppModeChanged(int oldMode, int mode)
{
        if (oldMode == modeEditTable || mode == modeEditTable)
        {
                setCurrentItem(m_item);
        }
}

void PropertyWidget_OptMargins::handleSelectionChanged()
{
        if (!m_doc || !m_ScMW || m_ScMW->scriptIsRunning())
                return;

        PageItem* currItem = currentItemFromSelection();
        setCurrentItem(currItem);
        updateGeometry();
}

void PropertyWidget_OptMargins::showOpticalMargins(const ParagraphStyle & pStyle)
{
        ParagraphStyle::OpticalMarginType omt(static_cast<ParagraphStyle::OpticalMarginType>(pStyle.opticalMargins()));
        bool blocked = optMarginRadioBoth->blockSignals(true);
        if (omt == ParagraphStyle::OM_Default)
                optMarginRadioBoth->setChecked(true);
        else if (omt == ParagraphStyle::OM_LeftHangingPunct)
                optMarginRadioLeft->setChecked(true);
        else if (omt == ParagraphStyle::OM_RightHangingPunct)
                optMarginRadioRight->setChecked(true);
        else
                optMarginRadioNone->setChecked(true);
        optMarginRadioBoth->blockSignals(blocked);
}

void PropertyWidget_OptMargins::updateStyle(const ParagraphStyle& newCurrent)
{
        showOpticalMargins(newCurrent);
}

void PropertyWidget_OptMargins::handleOpticalMargins()
{
        if (!m_doc || !m_item || !m_ScMW || m_ScMW->scriptIsRunning())
                return;
        int omt(ParagraphStyle::OM_None);
        if (optMarginRadioBoth->isChecked())
                omt = ParagraphStyle::OM_Default;
        else if (optMarginRadioLeft->isChecked())
                omt = ParagraphStyle::OM_LeftHangingPunct;
        else if (optMarginRadioRight->isChecked())
                omt = ParagraphStyle::OM_RightHangingPunct;

        PageItem *item = m_item;
        if (m_doc->appMode == modeEditTable)
                item = m_item->asTable()->activeCell().textFrame();
        if (item != nullptr)
        {
                Selection tempSelection(this, false);
                tempSelection.addItem(item, true);
                m_doc->itemSelection_SetOpticalMargins(omt, &tempSelection);
        }
}

void PropertyWidget_OptMargins::resetOpticalMargins()
{
        if (!m_doc || !m_item || !m_ScMW || m_ScMW->scriptIsRunning())
                return;
        PageItem *item = m_item;
        if (m_doc->appMode == modeEditTable)
                item = m_item->asTable()->activeCell().textFrame();
        if (item != nullptr)
        {
                Selection tempSelection(this, false);
                tempSelection.addItem(item, true);
                m_doc->itemSelection_resetOpticalMargins(&tempSelection);
        }
}

void PropertyWidget_OptMargins::changeEvent(QEvent *e)
{
        if (e->type() == QEvent::LanguageChange)
        {
                languageChange();
                return;
        }
        QWidget::changeEvent(e);
}

void PropertyWidget_OptMargins::languageChange()
{
        retranslateUi(this);
}