View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0003542 | Scribus | Text Frames / Story Editor | public | 2006-04-02 16:19 | 2006-04-04 20:14 |
| Reporter | louisdesjardins | Assigned To | subik | ||
| Priority | normal | Severity | major | Reproducibility | always |
| Status | closed | Resolution | fixed | ||
| Platform | linux | OS | ubuntu | ||
| Product Version | 1.3.4cvs | ||||
| Fixed in Version | 1.3.3.1cvs | ||||
| Summary | 0003542: Guide manager miscalculates columns | ||||
| Description | When using the Guide manager to automatically create column guides, columns are made unequal making this nice feature hardly usable as such! | ||||
| Steps To Reproduce | Create a new document. In this case, letter size. Units = picas. Page width is 51 picas. Set left and right margins at 3 picas (one half inch). Go to the Guide manager and go to the Rows and Columns section. Put 3 in the columns field and Check the Column Gap. Set it to 1,5 picas. Check the Refer to > Margins and Click Update. To have 3 identical columns of 14 picas width each, which is what user expect, the 4 expected guide values should read: 17.00 18.50 32.50 34.00 Instead, Scribus gives: 17.25 18.75 32.25 33.75 This results in 3 columns that have the following width: Col. 1 = 14.25 picas Col. 2 = 13.50 picas Col. 3 = 14.25 picas | ||||
| Tags | No tags attached. | ||||
| Attached Files | guidemanager.cpp (22,175 bytes)
/*
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.
*/
/***************************************************************************
guidemanager.cpp
-------------------
begin : Fri Jan 30 2004
copyright : (C) 2004 by Alessandro Rimoldi
copyright : (C) by Franz Schmid
e-mail : http://www.ideale.ch/contact
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "scribus.h"
#include "selection.h"
#include "guidemanager.h"
#include "guidemanager.moc"
#include "page.h"
#include "units.h"
#include "commonstrings.h"
#include "pagestructs.h"
#include <qradiobutton.h>
#include <qlayout.h>
#include <qcursor.h>
#include <qlistview.h>
#include <qdialog.h>
#include <qvaluelist.h>
#include <qgroupbox.h>
#include <qlabel.h>
#include <qlistview.h>
#include <qpushbutton.h>
#include <qcheckbox.h>
#include <qtooltip.h>
#include <qhbuttongroup.h>
extern QPixmap loadIcon(QString nam);
int GuideListItem::compare(QListViewItem *i, int col, bool asc) const
{
if (col == 0)
{
double d;
d = text(col).toDouble() - i->text(col).toDouble();
if (d > 0.0)
return 1;
return -1;
}
else
return QListViewItem::compare(i, col, asc);
}
GuideManager::GuideManager(QWidget* parent) : QDialog(parent, "GuideManager", true, 0)
{
setCaption( tr("Manage Guides"));
setIcon(loadIcon("AppIcon.png"));
/* Initialise the global variables */
resetMarginsForPage();
docUnitIndex = ScMW->doc->unitIndex();
docUnitPrecision = unitGetPrecisionFromIndex(docUnitIndex);
docUnitRatio = unitGetRatioFromIndex(docUnitIndex);
docUnitDecimals = unitGetDecimalsFromIndex(docUnitIndex);
suffix = unitGetSuffixFromIndex(docUnitIndex);
/* Create the dialog elements */
QHBoxLayout *guideManagerLayout = new QHBoxLayout(this, 11, 6, "guideManagerLayout");
QVBoxLayout *mainWidgetsLayout = new QVBoxLayout(0, 11, 6, "mainWidgetsLayout");
QHBoxLayout *Layout6 = new QHBoxLayout(0, 0, 6, "Layout6");
QGroupBox *horGroup = new QGroupBox(this, "horGroup");
horGroup->setTitle( tr("Horizontal Guides"));
horGroup->setColumnLayout(0, Qt::Vertical);
horGroup->layout()->setSpacing(6);
horGroup->layout()->setMargin(11);
QVBoxLayout *horGroupLayout = new QVBoxLayout(horGroup->layout());
horGroupLayout->setAlignment(Qt::AlignTop);
horList = new QListView(horGroup, "horList");
horList->addColumn(tr("Guide"));
horList->addColumn(tr("Unit"));
horList->setMinimumSize(QSize(0, 150));
horList->setSelectionMode(QListView::Extended);
horList->setAllColumnsShowFocus(true);
horList->setSorting(0);
horGroupLayout->addWidget(horList);
QHBoxLayout *Layout4 = new QHBoxLayout(0, 0, 6, "Layout4");
TextLabel2 = new QLabel( tr("&Y-Pos:"), horGroup, "TextLabel2");
Layout4->addWidget(TextLabel2);
horSpin = new MSpinBox(0, locPageHeight, horGroup, 4);
TextLabel2->setBuddy(horSpin);
Layout4->addWidget(horSpin);
horGroupLayout->addLayout(Layout4);
QHBoxLayout *Layout3 = new QHBoxLayout(0, 0, 6, "Layout3");
horSet = new QPushButton( tr( "&Add" ), horGroup, "horSet");
horSet->setAutoDefault(false);
Layout3->addWidget(horSet);
horDel = new QPushButton( tr( "D&elete" ), horGroup, "horDel");
horDel->setAutoDefault(false);
Layout3->addWidget(horDel);
horGroupLayout->addLayout(Layout3);
Layout6->addWidget(horGroup);
verGroup = new QGroupBox(this, "verGroup");
verGroup->setTitle( tr("Vertical Guides"));
verGroup->setColumnLayout(0, Qt::Vertical);
verGroup->layout()->setSpacing(6);
verGroup->layout()->setMargin(11);
QVBoxLayout *verGroupLayout = new QVBoxLayout(verGroup->layout());
verGroupLayout->setAlignment(Qt::AlignTop);
verList = new QListView(verGroup, "verList");
verList->addColumn(tr("Guide"));
verList->addColumn(tr("Unit"));
verList->setMinimumSize(QSize(0, 150));
verList->setSorting(0);
verList->setSelectionMode(QListView::Extended);
verList->setAllColumnsShowFocus(true);
verGroupLayout->addWidget(verList);
QHBoxLayout *Layout2 = new QHBoxLayout(0, 0, 6, "Layout2");
TextLabel1 = new QLabel( tr("&X-Pos:"), verGroup, "TextLabel1");
Layout2->addWidget(TextLabel1);
verSpin = new MSpinBox(0, locPageWidth, verGroup, 4);
TextLabel1->setBuddy(verSpin);
Layout2->addWidget(verSpin);
verGroupLayout->addLayout(Layout2);
QHBoxLayout *Layout1 = new QHBoxLayout(0, 0, 6, "Layout1");
verSet = new QPushButton( tr( "A&dd" ), verGroup, "verSet");
verSet->setAutoDefault(false);
Layout1->addWidget(verSet);
verDel = new QPushButton( tr( "De&lete" ), verGroup, "verDel");
verDel->setAutoDefault(false);
Layout1->addWidget(verDel);
verGroupLayout->addLayout(Layout1);
Layout6->addWidget(verGroup);
mainWidgetsLayout->addLayout(Layout6);
QHBoxLayout *Layout7 = new QHBoxLayout(0, 0, 6, "Layout7");
// auto guides
QGroupBox *horGroup2 = new QGroupBox(this, "horGroup");
horGroup2->setTitle( tr("Rows and Columns - Automatic Guides"));
horGroup2->setColumnLayout(0, Qt::Vertical);
horGroup2->layout()->setSpacing(6);
horGroup2->layout()->setMargin(11);
QVBoxLayout *horGroupLayout2 = new QVBoxLayout(horGroup2->layout());
horGroupLayout2->setAlignment(Qt::AlignTop);
// auto guides basic
QLabel *TextLabel8 = new QLabel( tr("&Rows:"), horGroup2, "TextLabel8");
rowSpin = new QSpinBox(1, 100, 1, horGroup2, "rowSpin");
TextLabel8->setBuddy(rowSpin);
QLabel *TextLabel9 = new QLabel( tr("C&olumns:"), horGroup2, "TextLabel9");
colSpin = new QSpinBox(1, 100, 1, horGroup2, "colSpin");
TextLabel9->setBuddy(colSpin);
QVBoxLayout *rcLayout = new QVBoxLayout(0, 0, 6, "rcLayout");
rcLayout->addWidget(TextLabel8);
rcLayout->addWidget(rowSpin);
rcLayout->addWidget(TextLabel9);
rcLayout->addWidget(colSpin);
// auto guides gaps
useRowGap = new QCheckBox( tr("Row &Gap"), horGroup2, "useRowGap");
useRowGap->setChecked(false);
rowGap = new MSpinBox(0, 100, horGroup2, 4);
rowGap->setValue(0);
rowGap->setEnabled(false);
useColGap = new QCheckBox( tr("Colum&n Gap"), horGroup2, "useColGap");
useColGap->setChecked(false);
colGap = new MSpinBox(0, 100, horGroup2, 4);
colGap->setValue(0);
colGap->setEnabled(false);
QVBoxLayout *rcGapLayout = new QVBoxLayout(0, 0, 6, "rcGapLayout");
rcGapLayout->addWidget(useRowGap);
rcGapLayout->addWidget(rowGap);
rcGapLayout->addWidget(useColGap);
rcGapLayout->addWidget(colGap);
// auto guides formating
QHBoxLayout *autoGuidesLayout = new QHBoxLayout(0, 0, 6, "autoGuidesLayout");
autoGuidesLayout->addLayout(rcLayout);
autoGuidesLayout->addLayout(rcGapLayout);
QHBoxLayout *Layout10 = new QHBoxLayout(0, 0, 6, "Layout10");
bGroup = new QHButtonGroup(horGroup2, "bGroup");
bGroup->setFrameStyle(QFrame::NoFrame);
QLabel *TextLabel10 = new QLabel( tr("Refer to:"), horGroup2, "TextLabel10");
Layout10->addWidget(TextLabel10);
QRadioButton *fPage = new QRadioButton( tr( "&Page" ), bGroup, "fpage");
fPage->setChecked(true);
(void) new QRadioButton( tr( "&Margins" ), bGroup, "fmargin");
QRadioButton *fSelect = new QRadioButton( tr( "&Selection" ), bGroup, "fselect");
fSelect->setEnabled(selected);
Layout10->addWidget(bGroup);
QSpacerItem* spacer2 = new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
Layout10->addItem(spacer2);
Layout7->addWidget(horGroup2);
horGroupLayout2->addLayout(autoGuidesLayout);
horGroupLayout2->addLayout(Layout10);
mainWidgetsLayout->addLayout(Layout7);
QHBoxLayout *buttonLayout = new QHBoxLayout(0, 0, 6, "buttonLayout");
QSpacerItem* spacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
buttonLayout->addItem(spacer);
okButton = new QPushButton( CommonStrings::tr_OK, this, "okButton");
okButton->setAutoDefault(false);
cancelButton = new QPushButton( tr( "&Close" ), this, "cancelButton");
cancelButton->setAutoDefault(false);
cancelButton->setAccel(QKeySequence("Esc"));
setButton = new QPushButton( tr("&Update"), this, "setButton");
setButton->setAutoDefault(false);
buttonLayout->addWidget(setButton);
buttonLayout->addWidget(okButton);
buttonLayout->addWidget(cancelButton);
//mainWidgetsLayout->addLayout(Layout5);
mainWidgetsLayout->addLayout(buttonLayout);
// preview pixmap
// prevMainLayout is here due the aligning with the others widgets
QVBoxLayout *prevMainLayout = new QVBoxLayout(0, 11, 6, "prevMainLayout");
QGroupBox *previewGBox = new QGroupBox(this, "previewGBox");
previewGBox->setTitle(tr("Preview"));
previewGBox->setColumnLayout(0, Qt::Vertical);
previewGBox->layout()->setSpacing(6);
previewGBox->layout()->setMargin(11);
QVBoxLayout *previewGBoxLayout = new QVBoxLayout(previewGBox->layout());
previewGBoxLayout->setAlignment(Qt::AlignTop);
previewLabel = new QLabel(previewGBox, "previewLabel");
previewGBoxLayout->addWidget(previewLabel);
prevMainLayout->addWidget(previewGBox);
//QHBoxLayout *Layout5 = new QHBoxLayout(0, 0, 6, "Layout5");
lockedCheckBox = new QCheckBox( tr( "&Lock Guides" ), this, "lockedCheckBox");
lockedCheckBox->setChecked(ScMW->doc->GuideLock);
prevMainLayout->addWidget(lockedCheckBox);
allPages = new QCheckBox(tr("&Apply to All Pages"), this, "allPages");
allPages->setChecked(false);
prevMainLayout->addWidget(allPages);
QSpacerItem* spacer3 = new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
prevMainLayout->addItem(spacer3);
guideManagerLayout->addLayout(mainWidgetsLayout);
guideManagerLayout->addLayout(prevMainLayout);
// set current guides
setGuidesFromList(horList, ScMW->doc->currentPage->YGuides);
setGuidesFromList(verList, ScMW->doc->currentPage->XGuides);
unitChange();
slotDrawPreview();
//tooltips
QToolTip::add( setButton, "<qt>" + tr("Set the guides in document. Guide manager is still opened but the changes are persistant", "guide manager") + "</qt>");
// Create signals and slots connections
connect(okButton, SIGNAL(clicked()), this, SLOT(commitChanges()));
connect(setButton, SIGNAL(clicked()), this, SLOT(commitEditChanges()));
connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
connect(horSet, SIGNAL(clicked()), this, SLOT(AddHorVal()));
connect(horDel, SIGNAL(clicked()), this, SLOT(DelHorVal()));
connect(horSpin, SIGNAL(valueChanged(int)), this, SLOT(ChangeHorVal()));
connect(horList, SIGNAL(currentChanged(QListViewItem*)), this, SLOT(horList_currentChanged(QListViewItem*)));
connect(verSet, SIGNAL(clicked()), this, SLOT(AddVerVal()));
connect(verDel, SIGNAL(clicked()), this, SLOT(DelVerVal()));
connect(verSpin, SIGNAL(valueChanged(int)), this, SLOT(ChangeVerVal()));
connect(verList, SIGNAL(currentChanged(QListViewItem*)), this, SLOT(verList_currentChanged(QListViewItem*)));
connect(useRowGap, SIGNAL(toggled(bool)), this, SLOT(useRowGap_clicked(bool)));
connect(useColGap, SIGNAL(toggled(bool)), this, SLOT(useColGap_clicked(bool)));
connect(this, SIGNAL(guidesChanged()), this, SLOT(slotDrawPreview()));
connect(rowSpin, SIGNAL(valueChanged(int)), this, SLOT(slotDrawPreview()));
connect(colSpin, SIGNAL(valueChanged(int)), this, SLOT(slotDrawPreview()));
connect(rowGap, SIGNAL(valueChanged(int)), this, SLOT(slotDrawPreview()));
connect(colGap, SIGNAL(valueChanged(int)), this, SLOT(slotDrawPreview()));
connect(bGroup, SIGNAL(clicked(int)), this, SLOT(slotDrawPreview()));
}
GuideManager::~GuideManager()
{
ScMW->mainWindowStatusLabel->setText(QString::null);
}
bool GuideManager::deleteValueFormList(QListView *list)
{
/* previous item pointer to ensure that ++it
runs before item goes deleted */
QListViewItem *itemToDelete;
QListViewItemIterator it(list, QListViewItemIterator::Selected);
while (it.current())
{
itemToDelete = it.current();
++it;
if (itemToDelete)
{
list->takeItem(itemToDelete);
delete itemToDelete;
}
}
emit guidesChanged();
return true;
}
void GuideManager::DelHorVal()
{
deleteValueFormList(horList);
}
void GuideManager::DelVerVal()
{
deleteValueFormList(verList);
}
bool GuideManager::addValueToList(QListView *list, MSpinBox *spin)
{
QString tmp;
tmp = tmp.setNum(0.0, 'f', docUnitPrecision);
// no duplications
if (list->findItem(tmp, 0) != 0)
{
ScMW->mainWindowStatusLabel->setText(tr("There is empty (0.0) guide already"));
return false;
}
QListViewItem *item = new GuideListItem(list, tmp, suffix);
list->insertItem(item);
list->setCurrentItem(item);
list->clearSelection();
list->setSelected(item, true);
spin->setFocus();
spin->selectAll();
emit guidesChanged();
return true;
}
void GuideManager::AddHorVal()
{
addValueToList(horList, horSpin);
}
void GuideManager::AddVerVal()
{
addValueToList(verList, verSpin);
}
void GuideManager::resetMarginsForPage()
{
locPageWidth = ScMW->doc->currentPage->width();
locPageHeight = ScMW->doc->currentPage->height();
// whatif selection settings
FPoint selectionTopLeft = FPoint(0, 0);
FPoint selectionBottomRight = FPoint(0, 0);
int docSelectionCount = ScMW->doc->m_Selection->count();
// multiselection
if (docSelectionCount > 1)
{
selectionTopLeft.setXY(ScMW->view->GroupX - ScMW->doc->currentPage->xOffset(),
ScMW->view->GroupY - ScMW->doc->currentPage->yOffset());
selectionBottomRight.setXY(ScMW->view->GroupW,
ScMW->view->GroupH);
}
// only one item selected
else if (docSelectionCount == 1)
{
PageItem *currItem = ScMW->doc->m_Selection->itemAt(0);
selectionTopLeft.setXY(currItem->xPos() - ScMW->doc->currentPage->xOffset(),
currItem->yPos() - ScMW->doc->currentPage->yOffset());
selectionBottomRight.setXY(currItem->width(), currItem->height());
}
selected = true;
if (selectionBottomRight != FPoint(0, 0))
{
gy = selectionTopLeft.y();
gx = selectionTopLeft.x();
gw = selectionBottomRight.x();
gh = selectionBottomRight.y();
}
else selected = false;
locTop = ScMW->doc->pageMargins.Top;
locBottom = ScMW->doc->pageMargins.Bottom;
PageLocation pageLocation = ScMW->doc->locationOfPage(ScMW->doc->currentPageNumber());
switch (pageLocation)
{
case MiddlePage :
locLeft = ScMW->doc->pageMargins.Left;
locRight = ScMW->doc->pageMargins.Left;
break;
case LeftPage:
locLeft = ScMW->doc->pageMargins.Right;
locRight = ScMW->doc->pageMargins.Left;
break;
case RightPage:
locRight = ScMW->doc->pageMargins.Right;
locLeft = ScMW->doc->pageMargins.Left;
break;
default:
locRight = 0;
locLeft = 0;
}
}
void GuideManager::addRows()
{
if (allPages->isChecked() && rowSpin->value() > 0)
horList->clear();
setGuidesFromList(horList, getAutoRows());
}
QValueList<double> GuideManager::getAutoRows()
{
resetMarginsForPage();
int n = QString(rowSpin->text()).toInt();
double offset = 0;
double newPageHeight = locPageHeight;
if (bGroup->selectedId() == 1)
{
newPageHeight = locPageHeight - locTop - locBottom;
offset = locTop;
}
else if (bGroup->selectedId() == 2)
{
offset = gy;
newPageHeight = gh;
}
QValueList<double> values;
double gapValue;
double rowSize;
if (useRowGap->isChecked())
{
gapValue = value2pts(rowGap->value(), ScMW->doc->unitIndex());
rowSize = (newPageHeight - (n - 1) * gapValue) / n;
}
else
rowSize = newPageHeight / n;
for (int i = 1, gapCount = 0; i < n; ++i)
{
if (useRowGap->isChecked())
{
values.append(offset + i * rowSize + gapCount * gapValue);
++gapCount;
values.append(offset + i * rowSize + gapCount * gapValue);
}
else
values.append(offset + rowSize * i);
}
return values;
}
void GuideManager::addCols()
{
if (allPages->isChecked() && colSpin->value() > 0)
verList->clear();
setGuidesFromList(verList, getAutoCols());
}
QValueList<double> GuideManager::getAutoCols()
{
resetMarginsForPage();
int n = QString(colSpin->text()).toInt();
double offset = 0;
double newPageWidth = locPageWidth;
if (bGroup->selectedId() == 1)
{
newPageWidth = locPageWidth - locLeft - locRight;
offset = locLeft;
}
else if (bGroup->selectedId() == 2)
{
offset = gx;
newPageWidth = gw;
}
QValueList<double> values;
double gapValue;
double columnSize;
if (useColGap->isChecked())
{
gapValue = value2pts(colGap->value(), ScMW->doc->unitIndex());
columnSize = (newPageWidth - (n - 1) * gapValue) / n;
}
else
columnSize = newPageWidth / n;
for (int i = 1, gapCount = 0; i < n; ++i)
{
if (useColGap->isChecked())
{
values.append(offset + i * columnSize + gapCount * gapValue);
++gapCount;
values.append(offset + i * columnSize + gapCount * gapValue);
}
else
values.append(offset + columnSize * i);
}
return values;
}
void GuideManager::ChangeHorVal()
{
QListViewItem *item = horList->currentItem();
if (item == 0)
return;
QString tmp;
tmp = tmp.setNum(horSpin->value(), 'f', docUnitPrecision);
item->setText(0, tmp);
emit guidesChanged();
}
void GuideManager::ChangeVerVal()
{
QListViewItem *item = verList->currentItem();
if (item == 0)
return;
QString tmp;
tmp = tmp.setNum(verSpin->value(), 'f', docUnitPrecision);
item->setText(0, tmp);
emit guidesChanged();
}
void GuideManager::unitChange()
{
horSpin->setSuffix(suffix);
verSpin->setSuffix(suffix);
rowGap->setSuffix(suffix);
colGap->setSuffix(suffix);
horSpin->setDecimals(docUnitDecimals);
verSpin->setDecimals(docUnitDecimals);
rowGap->setDecimals(docUnitDecimals);
colGap->setDecimals(docUnitDecimals);
}
void GuideManager::refreshDoc()
{
if (rowSpin->value() > 1)
addRows();
if (colSpin->value() > 1)
addCols();
QValueList<double> tmp = getValuesFromList(verList);
ScMW->doc->currentPage->addXGuides(tmp);
tmp = getValuesFromList(horList);
ScMW->doc->currentPage->addYGuides(tmp);
ScMW->doc->lockGuides(lockedCheckBox->isChecked());
ScMW->view->DrawNew();
}
void GuideManager::refreshWholeDoc()
{
int origPage = ScMW->doc->currentPage->pageNr();
for (uint i = 0; i < ScMW->doc->Pages->count(); ++i)
{
ScMW->view->GotoPage(i);
refreshDoc();
}
ScMW->view->GotoPage(origPage);
ScMW->view->DrawNew();
}
void GuideManager::useRowGap_clicked(bool state)
{
rowGap->setEnabled(state);
if (state)
rowGap->setFocus();
}
void GuideManager::useColGap_clicked(bool state)
{
colGap->setEnabled(state);
if (state)
colGap->setFocus();
}
void GuideManager::commitChanges()
{
commitEditChanges();
return accept();
}
void GuideManager::commitEditChanges()
{
qApp->setOverrideCursor(QCursor(waitCursor), true);
if (allPages->isChecked())
refreshWholeDoc();
else
refreshDoc();
QApplication::restoreOverrideCursor();
}
void GuideManager::setGuidesFromList(QListView *w, QValueList<double> guides)
{
QValueList<double>::iterator it;
QString tmp;
for (it = guides.begin(); it != guides.end(); ++it)
{
tmp = tmp.setNum((*it) * docUnitRatio , 'f', docUnitPrecision);
// no insert for duplicates
if (w->findItem(tmp, 0) != 0)
continue;
QListViewItem *item = new GuideListItem(w, tmp, suffix);
w->insertItem(item);
}
w->setCurrentItem(w->firstChild());
w->setSelected(w->firstChild(), true);
emit guidesChanged();
}
QValueList<double> GuideManager::getValuesFromList(QListView *w)
{
QValueList<double> ret;
QListViewItemIterator it(w);
while (it.current())
{
ret.append(it.current()->text(0).toDouble() / docUnitRatio);
++it;
}
return ret;
}
void GuideManager::verList_currentChanged(QListViewItem *item)
{
double val;
if (!item)
val = 0.0;
else
val = item->text(0).toDouble();
verSpin->setValue(val);
emit guidesChanged();
}
void GuideManager::horList_currentChanged(QListViewItem *item)
{
double val;
if (!item)
val = 0.0;
else
val = item->text(0).toDouble();
horSpin->setValue(val);
emit guidesChanged();
}
void GuideManager::slotDrawPreview()
{
int size = 200; // height of the preview pixmap
int x, y; // helper values. original guide size to smaller one
double val; // position of the current guide (red one)
QPixmap pm; // paint device for preview
QPainter *p = new QPainter();
QValueList<double> vg = getValuesFromList(verList); // vert. g.
QValueList<double> hg = getValuesFromList(horList); // hor. g.
QValueList<double>::iterator it; // iterator for guides lists
// page size on pts
double pagew = ScMW->doc->currentPage->width() * docUnitRatio;
double pageh = ScMW->doc->currentPage->height() * docUnitRatio;
vg += getAutoCols();
hg += getAutoRows();
//! \note Sorting is a must here for GUI
horList->sort();
verList->sort();
// load the page only at the first time
if (previewPixmap.isNull())
previewPixmap = ScMW->view->PageToPixmap(ScMW->doc->currentPageNumber(), size);
pm = previewPixmap;
p->begin(&pm);
p->setPen(QPen(ScMW->doc->guidesSettings.guideColor, 1, Qt::SolidLine));
// all guides - paint it standard
for (it = vg.begin(); it != vg.end(); ++it)
{
x = (int)(pm.width() * (*it) * docUnitRatio / pagew);
p->drawLine(x, 0, x, pm.height());
}
for (it = hg.begin(); it != hg.end(); ++it)
{
y = (int)(pm.height() * (*it) * docUnitRatio / pageh);
p->drawLine(0, y, pm.width(), y);
}
// current guide - paint it bold and red...
p->setPen(QPen(QColor(200, 0, 0), 2, Qt::SolidLine));
val = verSpin->value(); // val is docUnitRatio'ned already
if (val > 0.0)
{
x = (int)(pm.width() * val / pagew);
p->drawLine(x, 0, x, pm.height());
}
val = horSpin->value();
if (val > 0.0)
{
y = (int)(pm.height() * val / pageh);
p->drawLine(0, y, pm.width(), y);
}
p->end();
previewLabel->setPixmap(pm);
delete p;
}
| ||||
| Patch | |||||
|
|
Subik is this fixable before Wednesday? |
|
|
I'm afraid I cannot see it. Let's count with me. USER INPUT size: 51p left margin: 3p right margin: 3p user defined gap: 1.5p requested columns: 3 CALCULATION size without margin: 45p size of the column: 45/3 = 15p half of the gap to compute with: 1.5/2 = 0.75p 1st guide: column size + left margin - half gap: 15 + 3 - 0.75 = 17.25p 2nd guide: column size + left margin + half gap: 15 + 3 + 0.75 = 18.75p 3rd guide: 2*column size + left margin - half gap: 2*15 + 3 - 0.75 = 32.25p 4th guide: 2*column size + left margin + half gap: 2*15 + 3 + 0.75 = 33.75p Where is the bug? |
|
|
CALCULATION size without margin: 45p Size of the 3 columns = 45p - 2 gaps = 45 - 3 = 42 picas Size of one column = 42/3 = 14p 1st guide: left margin + column width: 3 + 14 = 17p 2nd guide: left margin + column width + gap: 3 + 14 + 1.5 = 18.5p 3rd guide: left margin + column width + gap + column width: 3 + 14 + 1.5 + 14 = 32.5p 4th guide: left margin + column width + gap + column width + gap = 3 + 14 + 1.5 + 14 + 1.5 = 34p |
|
|
as i said :) [20:36] <MrB> subik: how about.. 51-3x2= 45.. then 45-((cols-1)*1.5) = 42. 42/3=14 |
|
|
should be fixed in devel CVS. Except it needs some testing. Please, don't close this bug because I need to promote these changes into new guide system too. |
|
|
Louis, please test this if you have time, let us know if you do. Subik, we need this resolved to be in the changelog for 1.3.3.1 which is due this week. |
|
|
craig, I'll merge these changes into my devel-tree this afternoon. I'll resolve it after this merge and after Luis's (and mine) tests. |
|
|
Hi Craig and Subik, All is OK now. Today's CVS reflects the changes and the guides are fine. Footnote : But the date is wrong, still showing April 1st :) I did not test further but will be able to do so tonight, if needed. Please let me know. |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2006-04-02 16:19 | louisdesjardins | New Issue | |
| 2006-04-02 20:29 | cbradney | Status | new => assigned |
| 2006-04-02 20:29 | cbradney | Assigned To | => subik |
| 2006-04-02 22:48 | cbradney | Note Added: 0009602 | |
| 2006-04-03 18:19 | subik | Note Added: 0009605 | |
| 2006-04-03 18:37 | louisdesjardins | Note Added: 0009606 | |
| 2006-04-03 18:38 | louisdesjardins | Note Edited: 0009606 | |
| 2006-04-03 18:47 | cbradney | Note Added: 0009607 | |
| 2006-04-04 06:10 | subik | File Added: guidemanager.cpp | |
| 2006-04-04 06:11 | subik | Note Added: 0009615 | |
| 2006-04-04 06:40 | cbradney | Note Added: 0009617 | |
| 2006-04-04 07:30 | subik | Note Added: 0009620 | |
| 2006-04-04 14:20 | louisdesjardins | Note Added: 0009628 | |
| 2006-04-04 14:34 | subik | Status | assigned => resolved |
| 2006-04-04 14:34 | subik | Fixed in Version | => 1.3.3.1cvs |
| 2006-04-04 14:34 | subik | Resolution | open => fixed |
| 2006-04-04 20:14 | cbradney | Status | resolved => closed |
| 2015-09-17 20:08 | Kunda | Category | Story Editor / Text Frames => Story Ed/Txt Frames |
| 2015-09-17 20:12 | Kunda | Category | Story Ed/Txt Frames => Story Editor / Text Frames |
| 2025-04-27 19:16 | cbradney | Category | Story Editor / Text Frames => Text Frames / Story Editor |