30 #include <KPushButton>
31 #include <KTextBrowser>
35 #include <QStringListModel>
36 #include <QVBoxLayout>
37 #include <QFormLayout>
38 #include <QApplication>
42 #include <QAbstractListModel>
44 #include <QStackedLayout>
49 enum PhasesModelColumns
61 QModelIndex addPhase(
const Phase& phase);
62 QModelIndex activePhaseIndex()
const{
return index(m_activePhase);}
63 QList<Phase> addedPhases()
const;
65 int rowCount(
const QModelIndex& parent=QModelIndex())
const;
66 int columnCount(
const QModelIndex& parent=QModelIndex())
const{Q_UNUSED(parent);
return ColumnCount;}
67 QVariant data(
const QModelIndex&,
int role=Qt::DisplayRole)
const;
68 QVariant headerData(
int section, Qt::Orientation,
int role=Qt::DisplayRole)
const;
73 QList<Phase> m_phases;
74 QMap<QString,Tool> m_tools;
81 , m_phases(catalog->allPhases())
82 , m_tools(catalog->allTools())
84 m_activePhase=m_phases.size();
85 while (--m_activePhase>=0 && m_phases.at(m_activePhase).name!=catalog->
activePhase())
89 QModelIndex PhasesModel::addPhase(
const Phase& phase)
91 m_activePhase=m_phases.size();
92 beginInsertRows(QModelIndex(),m_activePhase,m_activePhase);
93 m_phases.append(phase);
95 return index(m_activePhase);
98 QList<Phase> PhasesModel::addedPhases()
const
101 for (
int i=m_catalog->allPhases().size();i<m_phases.size();++i)
102 result.append(m_phases.at(i));
107 int PhasesModel::rowCount(
const QModelIndex& parent)
const
109 if (parent.isValid())
111 return m_phases.size();
114 QVariant PhasesModel::data(
const QModelIndex& index,
int role)
const
116 if (role==Qt::FontRole && index.row()==m_activePhase)
118 QFont font=QApplication::font();
122 if (role==Qt::UserRole)
123 return m_phases.at(index.row()).name;
124 if (role!=Qt::DisplayRole)
127 const Phase& phase=m_phases.at(index.row());
128 switch (index.column())
130 case Date:
return phase.
date.toString();
131 case Process:
return phase.
process;
132 case Company:
return phase.
company;
133 case Contact:
return QString(phase.
contact
134 +(phase.
email.isEmpty()?
"":QString(
" <%1> ").arg(phase.
email))
135 +(phase.
phone.isEmpty()?
"":QString(
", %1").arg(phase.
phone)));
136 case ToolName:
return m_tools.value(phase.
tool).name;
141 QVariant PhasesModel::headerData(
int section, Qt::Orientation,
int role)
const
143 if (role!=Qt::DisplayRole)
148 case Date:
return i18nc(
"@title:column",
"Date");
149 case Process:
return i18nc(
"@title:column",
"Process");
150 case Company:
return i18nc(
"@title:column",
"Company");
151 case Contact:
return i18nc(
"@title:column",
"Person");
152 case ToolName:
return i18nc(
"@title:column",
"Tool");
160 class PhaseEditDialog:
public KDialog
163 PhaseEditDialog(
QWidget *parent);
168 KComboBox* m_process;
172 PhaseEditDialog::PhaseEditDialog(
QWidget *parent)
174 , m_process(new KComboBox(this))
177 processes<<i18n(
"Translation")<<i18n(
"Review")<<i18n(
"Approval");
180 QFormLayout* l=
new QFormLayout(mainWidget());
181 l->addRow(i18n(
"Process"), m_process);
184 Phase PhaseEditDialog::phase()
const
194 , m_model(new PhasesModel(catalog, this))
199 connect(
this, SIGNAL(accepted()), SLOT(handleResult()));
201 QVBoxLayout* l=
new QVBoxLayout(mainWidget());
202 QHBoxLayout* btns=
new QHBoxLayout;
205 KPushButton* add=
new KPushButton(KStandardGuiItem::add(),
this);
206 connect(add, SIGNAL(clicked()),
this,SLOT(addPhase()));
207 btns->addWidget(add);
214 l->addWidget(splitter);
216 m_view->setRootIsDecorated(
false);
217 m_view->setModel(m_model);
218 splitter->addWidget(m_view);
219 int column=m_model->columnCount();
221 m_view->resizeColumnToContents(column);
222 if (m_model->rowCount())
223 m_view->setCurrentIndex(m_model->activePhaseIndex());
224 connect(m_view, SIGNAL(currentIndexChanged(QModelIndex)), SLOT(displayPhaseNotes(QModelIndex)));
229 splitter->addWidget(m_noteView);
230 m_stackedLayout =
new QStackedLayout(m_noteView);
231 m_stackedLayout->addWidget(m_browser);
233 m_browser->viewport()->setBackgroundRole(QPalette::Background);
234 m_browser->setOpenLinks(
false);
235 connect(m_browser,SIGNAL(anchorClicked(QUrl)),
this,SLOT(anchorClicked(QUrl)));
237 splitter->setStretchFactor(0,15);
238 splitter->setStretchFactor(1,5);
239 setInitialSize(QSize(700,400));
242 void PhasesWindow::handleResult()
244 m_catalog->beginMacro(i18nc(
"@item Undo action item",
"Edit phases"));
247 foreach(
const Phase& phase, m_model->addedPhases())
248 static_cast<QUndoStack*>(m_catalog)->push(
new UpdatePhaseCmd(m_catalog, last=phase));
251 QMapIterator<QString, QVector<Note> > i(m_phaseNotes);
258 m_catalog->endMacro();
261 void PhasesWindow::addPhase()
263 PhaseEditDialog d(
this);
267 Phase phase=d.phase();
269 m_view->setCurrentIndex(m_model->addPhase(phase));
270 m_phaseNotes.insert(phase.
name, QVector<Note>());
275 return view->currentIndex().data(Qt::UserRole).toString();
278 void PhasesWindow::anchorClicked(QUrl link)
280 QString path=link.path().mid(1);
282 if (link.scheme()==
"note")
287 m_stackedLayout->addWidget(m_editor);
288 connect(m_editor,SIGNAL(accepted()),
this,SLOT(noteEditAccepted()));
289 connect(m_editor,SIGNAL(rejected()),
this,SLOT(noteEditRejected()));
292 if (path.endsWith(
"add"))
296 int pos=path.toInt();
298 QVector<Note> notes=m_phaseNotes.contains(phaseName)?
299 m_phaseNotes.value(phaseName)
301 m_editor->
setNote(notes.at(pos),pos);
303 m_stackedLayout->setCurrentIndex(1);
307 void PhasesWindow::noteEditAccepted()
310 if (!m_phaseNotes.contains(phaseName))
311 m_phaseNotes.insert(phaseName, m_catalog->
phaseNotes(phaseName));
313 QVector<Note> notes=m_phaseNotes.value(phaseName);
315 m_phaseNotes[phaseName].append(m_editor->
note());
317 m_phaseNotes[phaseName][m_editor->
noteIndex()]=m_editor->
note();
319 m_stackedLayout->setCurrentIndex(0);
320 displayPhaseNotes(m_view->currentIndex());
323 void PhasesWindow::noteEditRejected()
325 m_stackedLayout->setCurrentIndex(0);
328 void PhasesWindow::displayPhaseNotes(
const QModelIndex& current)
331 QString phaseName=current.data(Qt::UserRole).toString();
332 QVector<Note> notes=m_phaseNotes.contains(phaseName)?
333 m_phaseNotes.value(phaseName)
335 kWarning()<<notes.size();
338 m_stackedLayout->setCurrentIndex(0);
static QString phaseNameFromView(QTreeView *view)
QVector< Note > phaseNotes(const QString &phase) const
ProjectLocal::PersonRole roleForProcess(const QString &process)
void setActivePhase(const QString &phase, ProjectLocal::PersonRole role=ProjectLocal::Approver)
QString activePhase() const
bool initPhaseForCatalog(Catalog *catalog, Phase &phase, int options)
PhasesWindow(Catalog *catalog, QWidget *parent)
QStringList noteAuthors() const
const char *const * processes()
QVector< Note > setPhaseNotes(const QString &phase, QVector< Note >)
int displayNotes(KTextBrowser *browser, const QVector< Note > ¬es, int active, bool multiple)
void setNoteAuthors(const QStringList &)
This class represents a catalog It uses CatalogStorage interface to work with catalogs in different f...
void setNote(const Note &, int idx)
Add or remove (if content is empty) a phase.