Krita Source Code Documentation
Loading...
Searching...
No Matches
KisOpenPane Class Reference

#include <KisOpenPane.h>

+ Inheritance diagram for KisOpenPane:

Signals

void alwaysUseChanged (KisTemplatesPane *sender, const QString &alwaysUse)
 Emitted when the always use template has changed.
 
void cancelButton ()
 
void documentSelected (KisDocument *)
 this signal is emitted (as defined by KisDocument) the moment the document is 'ready'
 
void openExistingFile (const QUrl &)
 
void openTemplate (const QUrl &)
 
void splitterResized (KisDetailsPane *sender, const QList< int > &sizes)
 Emitted when one of the detail panes have changed it's splitter.
 

Public Member Functions

void addCustomDocumentWidget (QWidget *widget, const QString &title, const QString &untranslatedName, const QString &icon=QString())
 
QTreeWidgetItem * addPane (const QString &title, const QString &untranslatedName, const QPixmap &icon, QWidget *widget, int sortWeight)
 
QTreeWidgetItem * addPane (const QString &title, const QString &untranslatedName, const QString &iconName, QWidget *widget, int sortWeight)
 
 KisOpenPane (QWidget *parent, const QStringList &mimeFilter, const QString &templatesResourcePath=QString())
 
bool selectItem (const QString &name)
 Selects an option out of the dialog based on its untranslated name.
 
 ~KisOpenPane () override
 

Protected Slots

void itemClicked (QTreeWidgetItem *item)
 
void saveSplitterSizes (KisDetailsPane *sender, const QList< int > &sizes)
 Saves the splitter sizes for KisDetailsPaneBase based panes.
 
void updateSelectedWidget ()
 

Protected Member Functions

void dragEnterEvent (QDragEnterEvent *event) override
 
void dropEvent (QDropEvent *event) override
 
void initTemplates (const QString &templatesResourcePath)
 

Private Slots

void openFileDialog ()
 when clicked "Open Existing Document" button
 
void slotOpenTemplate (const QUrl &url)
 

Private Attributes

KisOpenPanePrivate *const d
 
QStringList m_mimeFilter
 

Detailed Description

Definition at line 25 of file KisOpenPane.h.

Constructor & Destructor Documentation

◆ KisOpenPane()

KisOpenPane::KisOpenPane ( QWidget * parent,
const QStringList & mimeFilter,
const QString & templatesResourcePath = QString() )

Constructor

Parameters
parentthe parent widget.
mimeFilterthe template-type (group) that should be selected on creation.
templatesResourcePaththe path to the templates.

Definition at line 111 of file KisOpenPane.cpp.

112 : QDialog(parent)
113 , d(new KisOpenPanePrivate)
114{
115 d->setupUi(this);
116
117 m_mimeFilter = mimeFilter;
118
119 QStyledItemDelegate* delegate = new QStyledItemDelegate(d->m_sectionList);
120 d->m_sectionList->setItemDelegate(delegate);
121 QScroller *scroller = KisKineticScroller::createPreconfiguredScroller(d->m_sectionList);
122 if (scroller) {
123 connect(scroller, &QScroller::stateChanged, this, [&](QScroller::State state) {
125 });
126 }
127
128 connect(d->m_sectionList, SIGNAL(itemSelectionChanged()),
129 this, SLOT(updateSelectedWidget()));
130 connect(d->m_sectionList, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
131 this, SLOT(itemClicked(QTreeWidgetItem*)));
132 connect(d->m_sectionList, SIGNAL(itemActivated(QTreeWidgetItem*,int)),
133 this, SLOT(itemClicked(QTreeWidgetItem*)));
134
135 initTemplates(templatesResourcePath);
136
138
139 if (!d->m_sectionList->selectedItems().isEmpty())
140 {
141 KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(d->m_sectionList->selectedItems().first());
142
143 if (selectedItem) {
144 d->m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
145 }
146 }
147
148 QList<int> sizes;
149
150 // Set the sizes of the details pane splitters
151 KConfigGroup cfgGrp( KSharedConfig::openConfig(), "TemplateChooserDialog"); sizes = cfgGrp.readEntry("DetailsPaneSplitterSizes", sizes);
152
153 if (!sizes.isEmpty())
154 Q_EMIT splitterResized(0, sizes);
155
156 connect(this, SIGNAL(splitterResized(KisDetailsPane*,QList<int>)),
158
159 setAcceptDrops(true);
160}
void splitterResized(KisDetailsPane *sender, const QList< int > &sizes)
Emitted when one of the detail panes have changed it's splitter.
void initTemplates(const QString &templatesResourcePath)
void saveSplitterSizes(KisDetailsPane *sender, const QList< int > &sizes)
Saves the splitter sizes for KisDetailsPaneBase based panes.
QStringList m_mimeFilter
Definition KisOpenPane.h:95
void updateSelectedWidget()
KisOpenPanePrivate *const d
Definition KisOpenPane.h:97
void itemClicked(QTreeWidgetItem *item)
int widgetIndex() const
KRITAWIDGETUTILS_EXPORT void updateCursor(QWidget *source, QScroller::State state)
KRITAWIDGETUTILS_EXPORT QScroller * createPreconfiguredScroller(QAbstractScrollArea *target)

References KisKineticScroller::createPreconfiguredScroller(), d, initTemplates(), itemClicked(), KisOpenPanePrivate::m_freeCustomWidgetIndex, m_mimeFilter, saveSplitterSizes(), splitterResized(), KisKineticScroller::updateCursor(), updateSelectedWidget(), and KoSectionListItem::widgetIndex().

◆ ~KisOpenPane()

KisOpenPane::~KisOpenPane ( )
override

Definition at line 162 of file KisOpenPane.cpp.

163{
164 if (!d->m_sectionList->selectedItems().isEmpty()) {
165 KoSectionListItem* item = dynamic_cast<KoSectionListItem*>(d->m_sectionList->selectedItems().first());
166
167 if (item) {
168 if (!qobject_cast<KisDetailsPane*>(d->m_widgetStack->widget(item->widgetIndex()))) {
169 KConfigGroup cfgGrp( KSharedConfig::openConfig(), "TemplateChooserDialog");
170 cfgGrp.writeEntry("LastReturnType", item->untranslatedName());
171 }
172 }
173 }
174
175 delete d;
176}
QString untranslatedName() const

References d, KoSectionListItem::untranslatedName(), and KoSectionListItem::widgetIndex().

Member Function Documentation

◆ addCustomDocumentWidget()

void KisOpenPane::addCustomDocumentWidget ( QWidget * widget,
const QString & title,
const QString & untranslatedName,
const QString & icon = QString() )

If the application has a way to create a document not based on a template, but on user provided settings, the widget showing these gets set here.

See also
KisDocument::createCustomDocumentWidget()
Parameters
widgetthe widget.
titlethe title shown in the sidebar
iconthe icon shown in the sidebar

Definition at line 276 of file KisOpenPane.cpp.

277{
278 Q_ASSERT(widget);
279
280 QTreeWidgetItem* item = addPane(title, untranslatedName, icon, widget, d->m_freeCustomWidgetIndex);
282 KConfigGroup cfgGrp( KSharedConfig::openConfig(), "TemplateChooserDialog");
283
284 QString lastActiveItem = cfgGrp.readEntry("LastReturnType");
285 bool showCustomItemByDefault = cfgGrp.readEntry("ShowCustomDocumentWidgetByDefault", false);
286 if (lastActiveItem == untranslatedName || (lastActiveItem.isEmpty() && showCustomItemByDefault)) {
287 d->m_sectionList->setCurrentItem(item, 0, QItemSelectionModel::ClearAndSelect);
288 KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(item);
289 d->m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
290 }
291}
QTreeWidgetItem * addPane(const QString &title, const QString &untranslatedName, const QString &iconName, QWidget *widget, int sortWeight)

References addPane(), d, KisOpenPanePrivate::m_freeCustomWidgetIndex, and KoSectionListItem::widgetIndex().

◆ addPane() [1/2]

QTreeWidgetItem * KisOpenPane::addPane ( const QString & title,
const QString & untranslatedName,
const QPixmap & icon,
QWidget * widget,
int sortWeight )

Definition at line 324 of file KisOpenPane.cpp.

325{
326 if (!widget) {
327 return 0;
328 }
329
330 int id = d->m_widgetStack->addWidget(widget);
331
332 int iconSize = 32;
333
334 KoSectionListItem* listItem = new KoSectionListItem(d->m_sectionList, title, untranslatedName, sortWeight, id);
335
336 d->m_itemMap->insert(untranslatedName, listItem);
337
338 if (!icon.isNull()) {
339 QImage image = icon.toImage();
340
341 if (!image.isNull() && ((image.width() > iconSize) || (image.height() > iconSize))) {
342 image = image.scaled(iconSize, iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
343 }
344
345 image.convertTo(QImage::Format_ARGB32);
346 image = image.copy((image.width() - iconSize) / 2, (image.height() - iconSize) / 2, iconSize, iconSize);
347 listItem->setIcon(0, QIcon(QPixmap::fromImage(image)));
348 }
349
350 return listItem;
351}
int iconSize(qreal width, qreal height)
QMap< QString, QTreeWidgetItem * > * m_itemMap

References d, iconSize(), and KisOpenPanePrivate::m_itemMap.

◆ addPane() [2/2]

QTreeWidgetItem * KisOpenPane::addPane ( const QString & title,
const QString & untranslatedName,
const QString & iconName,
QWidget * widget,
int sortWeight )

Definition at line 303 of file KisOpenPane.cpp.

304{
305 if (!widget) {
306 return 0;
307 }
308
309 int id = d->m_widgetStack->addWidget(widget);
310 KoSectionListItem* listItem = new KoSectionListItem(d->m_sectionList, title, untranslatedName, sortWeight, id);
311
312 d->m_itemMap->insert(untranslatedName, (QTreeWidgetItem*)listItem);
313
314 // resizes icons so they are a bit smaller
315 QIcon icon = KisIconUtils::loadIcon(iconName);
316 QPixmap iconPixmap = icon.pixmap(32, 32);
317
318 QIcon finalIcon(iconPixmap);
319 listItem->setIcon(0, finalIcon);
320
321 return listItem;
322}
QIcon loadIcon(const QString &name)

References d, KisIconUtils::loadIcon(), and KisOpenPanePrivate::m_itemMap.

◆ alwaysUseChanged

void KisOpenPane::alwaysUseChanged ( KisTemplatesPane * sender,
const QString & alwaysUse )
signal

Emitted when the always use template has changed.

◆ cancelButton

void KisOpenPane::cancelButton ( )
signal

◆ documentSelected

void KisOpenPane::documentSelected ( KisDocument * )
signal

this signal is emitted (as defined by KisDocument) the moment the document is 'ready'

◆ dragEnterEvent()

void KisOpenPane::dragEnterEvent ( QDragEnterEvent * event)
overrideprotected

Definition at line 258 of file KisOpenPane.cpp.

259{
260 if (event->mimeData()->hasUrls()) {
261 event->accept();
262 }
263}

◆ dropEvent()

void KisOpenPane::dropEvent ( QDropEvent * event)
overrideprotected

Definition at line 265 of file KisOpenPane.cpp.

266{
267 if (event->mimeData()->hasUrls() && event->mimeData()->urls().size() > 0) {
268 // XXX: when the MVC refactoring is done, this can open a bunch of
269 // urls, but since the part/document combination is still 1:1
270 // that won't work for now.
271 Q_EMIT openExistingFile(event->mimeData()->urls().first());
272
273 }
274}
void openExistingFile(const QUrl &)

References openExistingFile().

◆ initTemplates()

void KisOpenPane::initTemplates ( const QString & templatesResourcePath)
protected

Populate the list with all templates the user can choose.

Parameters
templatesResourcePaththe template-type (group) that should be selected on creation.

Definition at line 198 of file KisOpenPane.cpp.

199{
200 QTreeWidgetItem* selectItem = 0;
201 QTreeWidgetItem* firstItem = 0;
202 const int templateOffset = 1000;
203
204 if (!templatesResourcePath.isEmpty()) {
205 KisTemplateTree templateTree(templatesResourcePath, true);
206
207 Q_FOREACH (KisTemplateGroup *group, templateTree.groups()) {
208 if (group->isHidden()) {
209 continue;
210 }
211
212 if (!d->m_templatesSeparator) {
213 d->m_templatesSeparator = new KoSectionListItem(d->m_sectionList, "", "", 999);
214 }
215
216 KisTemplatesPane* pane = new KisTemplatesPane(this, group->name(),
217 group, templateTree.defaultTemplate());
218 connect(pane, SIGNAL(openUrl(QUrl)), this, SLOT(slotOpenTemplate(QUrl)));
219 connect(pane, SIGNAL(alwaysUseChanged(KisTemplatesPane*,QString)),
220 this, SIGNAL(alwaysUseChanged(KisTemplatesPane*,QString)));
221 connect(this, SIGNAL(alwaysUseChanged(KisTemplatesPane*,QString)),
222 pane, SLOT(changeAlwaysUseTemplate(KisTemplatesPane*,QString)));
223 connect(pane, SIGNAL(splitterResized(KisDetailsPane*,QList<int>)),
225 connect(this, SIGNAL(splitterResized(KisDetailsPane*,QList<int>)),
226 pane, SLOT(resizeSplitter(KisDetailsPane*,QList<int>)));
227 QTreeWidgetItem* item = addPane(group->name(), "Template", group->templates().first()->loadPicture(),
228 pane, group->sortingWeight() + templateOffset);
229
230
231
232 if (!firstItem) {
233 firstItem = item;
234 }
235
236 if (group == templateTree.defaultGroup()) {
237 firstItem = item;
238 }
239
240 if (pane->isSelected()) {
241 selectItem = item;
242 }
243 }
244 } else {
245 firstItem = d->m_sectionList->topLevelItem(0);
246 }
247
248 KConfigGroup cfgGrp( KSharedConfig::openConfig(), "TemplateChooserDialog");
249
250 if (selectItem && (cfgGrp.readEntry("LastReturnType") == "Template")) {
251 d->m_sectionList->setCurrentItem(selectItem, 0, QItemSelectionModel::ClearAndSelect);
252 }
253 else if (d->m_sectionList->selectedItems().isEmpty() && firstItem) {
254 d->m_sectionList->setCurrentItem(firstItem, 0, QItemSelectionModel::ClearAndSelect);
255 }
256}
KoSectionListItem * m_templatesSeparator
bool selectItem(const QString &name)
Selects an option out of the dialog based on its untranslated name.
void slotOpenTemplate(const QUrl &url)
void alwaysUseChanged(KisTemplatesPane *sender, const QString &alwaysUse)
Emitted when the always use template has changed.
QString name() const
int sortingWeight() const
QList< KisTemplate * > templates() const
bool isHidden() const
If all children are hidden, we are hidden too.
bool isSelected()
Returns true if a template in this group was the last one selected.

References addPane(), alwaysUseChanged(), d, KisTemplateTree::defaultGroup(), KisTemplateTree::defaultTemplate(), KisTemplateTree::groups(), KisTemplateGroup::isHidden(), KisTemplatesPane::isSelected(), KisOpenPanePrivate::m_templatesSeparator, KisTemplateGroup::name(), selectItem(), slotOpenTemplate(), KisTemplateGroup::sortingWeight(), splitterResized(), and KisTemplateGroup::templates().

◆ itemClicked

void KisOpenPane::itemClicked ( QTreeWidgetItem * item)
protectedslot

Definition at line 373 of file KisOpenPane.cpp.

374{
375 KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(item);
376
377 if (selectedItem && selectedItem->widgetIndex() >= 0) {
378 d->m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
379 }
380}

References d, and KoSectionListItem::widgetIndex().

◆ openExistingFile

void KisOpenPane::openExistingFile ( const QUrl & )
signal

◆ openFileDialog

void KisOpenPane::openFileDialog ( )
privateslot

when clicked "Open Existing Document" button

Definition at line 180 of file KisOpenPane.cpp.

181{
182
183 KoFileDialog dialog(this, KoFileDialog::OpenFiles, "OpenDocument");
184 dialog.setCaption(i18n("Open Existing Document"));
185 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
186 dialog.setMimeTypeFilters(m_mimeFilter);
187 Q_FOREACH (const QString &filename, dialog.filenames()) {
188 Q_EMIT openExistingFile(QUrl::fromUserInput(filename));
189 }
190}

References m_mimeFilter, openExistingFile(), and KoFileDialog::OpenFiles.

◆ openTemplate

void KisOpenPane::openTemplate ( const QUrl & )
signal

◆ saveSplitterSizes

void KisOpenPane::saveSplitterSizes ( KisDetailsPane * sender,
const QList< int > & sizes )
protectedslot

Saves the splitter sizes for KisDetailsPaneBase based panes.

Definition at line 366 of file KisOpenPane.cpp.

367{
368 Q_UNUSED(sender);
369 KConfigGroup cfgGrp( KSharedConfig::openConfig(), "TemplateChooserDialog");
370 cfgGrp.writeEntry("DetailsPaneSplitterSizes", sizes);
371}

◆ selectItem()

bool KisOpenPane::selectItem ( const QString & name)

Selects an option out of the dialog based on its untranslated name.

Definition at line 293 of file KisOpenPane.cpp.

294{
295 QTreeWidgetItem* item = d->m_itemMap->value(name, nullptr);
296 if (!item) return false;
297
298 d->m_sectionList->setCurrentItem(item);
299 return true;
300}

References d, and KisOpenPanePrivate::m_itemMap.

◆ slotOpenTemplate

void KisOpenPane::slotOpenTemplate ( const QUrl & url)
privateslot

Definition at line 192 of file KisOpenPane.cpp.

193{
194 Q_EMIT openTemplate(url);
195 accept();
196}
void openTemplate(const QUrl &)

References openTemplate().

◆ splitterResized

void KisOpenPane::splitterResized ( KisDetailsPane * sender,
const QList< int > & sizes )
signal

Emitted when one of the detail panes have changed it's splitter.

◆ updateSelectedWidget

void KisOpenPane::updateSelectedWidget ( )
protectedslot

Definition at line 353 of file KisOpenPane.cpp.

354{
355 if(!d->m_sectionList->selectedItems().isEmpty())
356 {
357 KoSectionListItem* section = dynamic_cast<KoSectionListItem*>(d->m_sectionList->selectedItems().first());
358
359 if (!section)
360 return;
361
362 d->m_widgetStack->setCurrentIndex(section->widgetIndex());
363 }
364}

References d, and KoSectionListItem::widgetIndex().

Member Data Documentation

◆ d

KisOpenPanePrivate* const KisOpenPane::d
private

Definition at line 97 of file KisOpenPane.h.

◆ m_mimeFilter

QStringList KisOpenPane::m_mimeFilter
private

Definition at line 95 of file KisOpenPane.h.


The documentation for this class was generated from the following files: