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())
 
 ~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 103 of file KisOpenPane.cpp.

104 : QDialog(parent)
105 , d(new KisOpenPanePrivate)
106{
107 d->setupUi(this);
108
109 m_mimeFilter = mimeFilter;
110
111 QStyledItemDelegate* delegate = new QStyledItemDelegate(d->m_sectionList);
112 d->m_sectionList->setItemDelegate(delegate);
113 QScroller *scroller = KisKineticScroller::createPreconfiguredScroller(d->m_sectionList);
114 if (scroller) {
115 connect(scroller, &QScroller::stateChanged, this, [&](QScroller::State state) {
117 });
118 }
119
120 connect(d->m_sectionList, SIGNAL(itemSelectionChanged()),
121 this, SLOT(updateSelectedWidget()));
122 connect(d->m_sectionList, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
123 this, SLOT(itemClicked(QTreeWidgetItem*)));
124 connect(d->m_sectionList, SIGNAL(itemActivated(QTreeWidgetItem*,int)),
125 this, SLOT(itemClicked(QTreeWidgetItem*)));
126
127 initTemplates(templatesResourcePath);
128
130
131 if (!d->m_sectionList->selectedItems().isEmpty())
132 {
133 KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(d->m_sectionList->selectedItems().first());
134
135 if (selectedItem) {
136 d->m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
137 }
138 }
139
140 QList<int> sizes;
141
142 // Set the sizes of the details pane splitters
143 KConfigGroup cfgGrp( KSharedConfig::openConfig(), "TemplateChooserDialog"); sizes = cfgGrp.readEntry("DetailsPaneSplitterSizes", sizes);
144
145 if (!sizes.isEmpty())
146 Q_EMIT splitterResized(0, sizes);
147
150
151 setAcceptDrops(true);
152}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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:92
void updateSelectedWidget()
KisOpenPanePrivate *const d
Definition KisOpenPane.h:94
void itemClicked(QTreeWidgetItem *item)
int widgetIndex() const
KRITAWIDGETUTILS_EXPORT void updateCursor(QWidget *source, QScroller::State state)
KRITAWIDGETUTILS_EXPORT QScroller * createPreconfiguredScroller(QAbstractScrollArea *target)

References connect(), 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 154 of file KisOpenPane.cpp.

155{
156 if (!d->m_sectionList->selectedItems().isEmpty()) {
157 KoSectionListItem* item = dynamic_cast<KoSectionListItem*>(d->m_sectionList->selectedItems().first());
158
159 if (item) {
160 if (!qobject_cast<KisDetailsPane*>(d->m_widgetStack->widget(item->widgetIndex()))) {
161 KConfigGroup cfgGrp( KSharedConfig::openConfig(), "TemplateChooserDialog");
162 cfgGrp.writeEntry("LastReturnType", item->untranslatedName());
163 }
164 }
165 }
166
167 delete d;
168}
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 268 of file KisOpenPane.cpp.

269{
270 Q_ASSERT(widget);
271
272 QTreeWidgetItem* item = addPane(title, untranslatedName, icon, widget, d->m_freeCustomWidgetIndex);
274 KConfigGroup cfgGrp( KSharedConfig::openConfig(), "TemplateChooserDialog");
275
276 QString lastActiveItem = cfgGrp.readEntry("LastReturnType");
277 bool showCustomItemByDefault = cfgGrp.readEntry("ShowCustomDocumentWidgetByDefault", false);
278 if (lastActiveItem == untranslatedName || (lastActiveItem.isEmpty() && showCustomItemByDefault)) {
279 d->m_sectionList->setCurrentItem(item, 0, QItemSelectionModel::ClearAndSelect);
280 KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(item);
281 d->m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
282 }
283}
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 305 of file KisOpenPane.cpp.

306{
307 if (!widget) {
308 return 0;
309 }
310
311 int id = d->m_widgetStack->addWidget(widget);
312
313 int iconSize = 32;
314
315 KoSectionListItem* listItem = new KoSectionListItem(d->m_sectionList, title, untranslatedName, sortWeight, id);
316
317 if (!icon.isNull()) {
318 QImage image = icon.toImage();
319
320 if (!image.isNull() && ((image.width() > iconSize) || (image.height() > iconSize))) {
321 image = image.scaled(iconSize, iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
322 }
323
324 image.convertTo(QImage::Format_ARGB32);
325 image = image.copy((image.width() - iconSize) / 2, (image.height() - iconSize) / 2, iconSize, iconSize);
326 listItem->setIcon(0, QIcon(QPixmap::fromImage(image)));
327 }
328
329 return listItem;
330}
int iconSize(qreal width, qreal height)

References d, and iconSize().

◆ addPane() [2/2]

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

Definition at line 286 of file KisOpenPane.cpp.

287{
288 if (!widget) {
289 return 0;
290 }
291
292 int id = d->m_widgetStack->addWidget(widget);
293 KoSectionListItem* listItem = new KoSectionListItem(d->m_sectionList, title, untranslatedName, sortWeight, id);
294
295 // resizes icons so they are a bit smaller
296 QIcon icon = KisIconUtils::loadIcon(iconName);
297 QPixmap iconPixmap = icon.pixmap(32, 32);
298
299 QIcon finalIcon(iconPixmap);
300 listItem->setIcon(0, finalIcon);
301
302 return listItem;
303}
QIcon loadIcon(const QString &name)

References d, and KisIconUtils::loadIcon().

◆ 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 250 of file KisOpenPane.cpp.

251{
252 if (event->mimeData()->hasUrls()) {
253 event->accept();
254 }
255}

◆ dropEvent()

void KisOpenPane::dropEvent ( QDropEvent * event)
overrideprotected

Definition at line 257 of file KisOpenPane.cpp.

258{
259 if (event->mimeData()->hasUrls() && event->mimeData()->urls().size() > 0) {
260 // XXX: when the MVC refactoring is done, this can open a bunch of
261 // urls, but since the part/document combination is still 1:1
262 // that won't work for now.
263 Q_EMIT openExistingFile(event->mimeData()->urls().first());
264
265 }
266}
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 190 of file KisOpenPane.cpp.

191{
192 QTreeWidgetItem* selectItem = 0;
193 QTreeWidgetItem* firstItem = 0;
194 const int templateOffset = 1000;
195
196 if (!templatesResourcePath.isEmpty()) {
197 KisTemplateTree templateTree(templatesResourcePath, true);
198
199 Q_FOREACH (KisTemplateGroup *group, templateTree.groups()) {
200 if (group->isHidden()) {
201 continue;
202 }
203
204 if (!d->m_templatesSeparator) {
205 d->m_templatesSeparator = new KoSectionListItem(d->m_sectionList, "", "", 999);
206 }
207
208 KisTemplatesPane* pane = new KisTemplatesPane(this, group->name(),
209 group, templateTree.defaultTemplate());
210 connect(pane, SIGNAL(openUrl(QUrl)), this, SLOT(slotOpenTemplate(QUrl)));
211 connect(pane, SIGNAL(alwaysUseChanged(KisTemplatesPane*,QString)),
212 this, SIGNAL(alwaysUseChanged(KisTemplatesPane*,QString)));
213 connect(this, SIGNAL(alwaysUseChanged(KisTemplatesPane*,QString)),
214 pane, SLOT(changeAlwaysUseTemplate(KisTemplatesPane*,QString)));
218 pane, SLOT(resizeSplitter(KisDetailsPane*,QList<int>)));
219 QTreeWidgetItem* item = addPane(group->name(), "Template", group->templates().first()->loadPicture(),
220 pane, group->sortingWeight() + templateOffset);
221
222
223
224 if (!firstItem) {
225 firstItem = item;
226 }
227
228 if (group == templateTree.defaultGroup()) {
229 firstItem = item;
230 }
231
232 if (pane->isSelected()) {
233 selectItem = item;
234 }
235 }
236 } else {
237 firstItem = d->m_sectionList->topLevelItem(0);
238 }
239
240 KConfigGroup cfgGrp( KSharedConfig::openConfig(), "TemplateChooserDialog");
241
242 if (selectItem && (cfgGrp.readEntry("LastReturnType") == "Template")) {
243 d->m_sectionList->setCurrentItem(selectItem, 0, QItemSelectionModel::ClearAndSelect);
244 }
245 else if (d->m_sectionList->selectedItems().isEmpty() && firstItem) {
246 d->m_sectionList->setCurrentItem(firstItem, 0, QItemSelectionModel::ClearAndSelect);
247 }
248}
KoSectionListItem * m_templatesSeparator
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(), connect(), d, KisTemplateTree::defaultGroup(), KisTemplateTree::defaultTemplate(), KisTemplateTree::groups(), KisTemplateGroup::isHidden(), KisTemplatesPane::isSelected(), KisOpenPanePrivate::m_templatesSeparator, KisTemplateGroup::name(), slotOpenTemplate(), KisTemplateGroup::sortingWeight(), splitterResized(), and KisTemplateGroup::templates().

◆ itemClicked

void KisOpenPane::itemClicked ( QTreeWidgetItem * item)
protectedslot

Definition at line 352 of file KisOpenPane.cpp.

353{
354 KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(item);
355
356 if (selectedItem && selectedItem->widgetIndex() >= 0) {
357 d->m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
358 }
359}

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 172 of file KisOpenPane.cpp.

173{
174
175 KoFileDialog dialog(this, KoFileDialog::OpenFiles, "OpenDocument");
176 dialog.setCaption(i18n("Open Existing Document"));
177 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
178 dialog.setMimeTypeFilters(m_mimeFilter);
179 Q_FOREACH (const QString &filename, dialog.filenames()) {
180 Q_EMIT openExistingFile(QUrl::fromUserInput(filename));
181 }
182}

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 345 of file KisOpenPane.cpp.

346{
347 Q_UNUSED(sender);
348 KConfigGroup cfgGrp( KSharedConfig::openConfig(), "TemplateChooserDialog");
349 cfgGrp.writeEntry("DetailsPaneSplitterSizes", sizes);
350}

◆ slotOpenTemplate

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

Definition at line 184 of file KisOpenPane.cpp.

185{
186 Q_EMIT openTemplate(url);
187 accept();
188}
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 332 of file KisOpenPane.cpp.

333{
334 if(!d->m_sectionList->selectedItems().isEmpty())
335 {
336 KoSectionListItem* section = dynamic_cast<KoSectionListItem*>(d->m_sectionList->selectedItems().first());
337
338 if (!section)
339 return;
340
341 d->m_widgetStack->setCurrentIndex(section->widgetIndex());
342 }
343}

References d, and KoSectionListItem::widgetIndex().

Member Data Documentation

◆ d

KisOpenPanePrivate* const KisOpenPane::d
private

Definition at line 94 of file KisOpenPane.h.

◆ m_mimeFilter

QStringList KisOpenPane::m_mimeFilter
private

Definition at line 92 of file KisOpenPane.h.


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