void KateViewManager::restoreSplitter( const KConfigBase* configBase, const QString &group, QSplitter* parent, const QString& viewConfGrp) { KConfigGroup config( configBase, group ); parent->setOrientation((Qt::Orientation)config.readEntry("Orientation", int(Qt::Horizontal))); QStringList children = config.readEntry( "Children", QStringList() ); for (QStringList::Iterator it = children.begin(); it != children.end(); ++it) { // for a viewspace, create it and open all documents therein. if ( (*it).startsWith(viewConfGrp + "-ViewSpace") ) { KateViewSpace* vs = new KateViewSpace( this, 0 ); m_viewSpaceList.append( vs ); // make active so that the view created in restoreConfig has this // new view space as parent. setActiveSpace( vs ); parent->addWidget( vs ); vs->restoreConfig (this, configBase, *it); vs->show(); } else { // for a splitter, recurse. restoreSplitter( configBase, *it, new QSplitter( parent ), viewConfGrp ); } } // set sizes parent->setSizes( config.readEntry("Sizes", QList<int>()) ); parent->show(); }
KateViewManager::KateViewManager (QWidget *parentW, KateMainWindow *parent) : QSplitter (parentW) , m_mainWindow(parent) , m_blockViewCreationAndActivation (false) , m_activeViewRunning (false) { // while init m_init = true; // important, set them up, as we use them in other methodes setupActions (); guiMergedView = 0; // resize mode setOpaqueResize( KGlobalSettings::opaqueResize() ); KateViewSpace* vs = new KateViewSpace( this, 0 ); addWidget (vs); vs->setActive( true ); m_viewSpaceList.append(vs); connect( this, SIGNAL(viewChanged()), this, SLOT(slotViewChanged()) ); connect(KateDocManager::self(), SIGNAL(initialDocumentReplaced()), this, SIGNAL(viewChanged())); connect(KateDocManager::self(), SIGNAL(documentCreated(KTextEditor::Document *)), this, SLOT(documentCreated(KTextEditor::Document *))); connect(KateDocManager::self(), SIGNAL(documentDeleted(KTextEditor::Document *)), this, SLOT(documentDeleted(KTextEditor::Document *))); // init done m_init = false; }
void KateViewManager::splitViewSpace( KateViewSpace* vs, // = 0 Qt::Orientation o )// = Qt::Horizontal { // emergency: fallback to activeViewSpace, and if still invalid, abort if (!vs) vs = activeViewSpace(); if (!vs) return; // get current splitter, and abort if null QSplitter *currentSplitter = qobject_cast<QSplitter*>(vs->parentWidget()); if (!currentSplitter) return; // index where to insert new splitter/viewspace const int index = currentSplitter->indexOf( vs ); // create new viewspace KateViewSpace* vsNew = new KateViewSpace( this ); // only 1 children -> we are the root container. So simply set the orientation // and add the new view space, then correct the sizes to 50%:50% if (currentSplitter->count() == 1) { if( currentSplitter->orientation() != o ) currentSplitter->setOrientation( o ); QList<int> sizes = currentSplitter->sizes(); sizes << (sizes.first() - currentSplitter->handleWidth() ) / 2; sizes[0] = sizes[1]; currentSplitter->insertWidget( index, vsNew ); currentSplitter->setSizes( sizes ); } else { // create a new QSplitter and replace vs with the splitter. vs and newVS are // the new children of the new QSplitter QSplitter* newContainer = new QSplitter( o ); newContainer->setOpaqueResize( KGlobalSettings::opaqueResize() ); QList<int> currentSizes = currentSplitter->sizes(); newContainer->addWidget( vs ); newContainer->addWidget( vsNew ); currentSplitter->insertWidget( index, newContainer ); newContainer->show(); // fix sizes of children of old and new splitter currentSplitter->setSizes( currentSizes ); QList<int> newSizes = newContainer->sizes(); newSizes[0] = (newSizes[0] + newSizes[1] - newContainer->handleWidth()) / 2; newSizes[1] = newSizes[0]; newContainer->setSizes( newSizes ); } m_viewSpaceList.append( vsNew ); activeViewSpace()->setActive( false ); vsNew->setActive( true, true ); vsNew->show(); createView ((KTextEditor::Document*)activeView()->document()); updateViewSpaceActions (); }
void KateViewManager::activateSpace (KTextEditor::View* v) { if (!v) return; KateViewSpace* vs = (KateViewSpace*)v->parentWidget()->parentWidget(); if (!vs->isActiveSpace()) { setActiveSpace (vs); activateView(v); } }
KateViewManager::KateViewManager(QWidget *parentW, KateMainWindow *parent) : QSplitter(parentW) , m_mainWindow(parent) , m_blockViewCreationAndActivation(false) , m_activeViewRunning(false) , m_minAge(0) , m_guiMergedView(nullptr) { // while init m_init = true; // important, set them up, as we use them in other methodes setupActions(); // resize mode setOpaqueResize(style()->styleHint(QStyle::SH_Splitter_OpaqueResize, 0, this)); KateViewSpace *vs = new KateViewSpace(this, 0); addWidget(vs); vs->setActive(true); m_viewSpaceList.append(vs); connect(this, SIGNAL(viewChanged(KTextEditor::View*)), this, SLOT(slotViewChanged())); connect(KateApp::self()->documentManager(), SIGNAL(documentCreatedViewManager(KTextEditor::Document*)), this, SLOT(documentCreated(KTextEditor::Document*))); /** * before document is really deleted: cleanup all views! */ connect(KateApp::self()->documentManager(), SIGNAL(documentWillBeDeleted(KTextEditor::Document*)) , this, SLOT(documentWillBeDeleted(KTextEditor::Document*))); /** * handle document deletion transactions * disable view creation in between * afterwards ensure we have views ;) */ connect(KateApp::self()->documentManager(), SIGNAL(aboutToDeleteDocuments(const QList<KTextEditor::Document *> &)) , this, SLOT(aboutToDeleteDocuments(const QList<KTextEditor::Document *> &))); connect(KateApp::self()->documentManager(), SIGNAL(documentsDeleted(const QList<KTextEditor::Document *> &)) , this, SLOT(documentsDeleted(const QList<KTextEditor::Document *> &))); // register all already existing documents m_blockViewCreationAndActivation = true; const QList<KTextEditor::Document *> &docs = KateApp::self()->documentManager()->documentList(); foreach(KTextEditor::Document * doc, docs) { documentCreated(doc); }
void KateViewManager::saveSplitterConfig( QSplitter* s, KConfigBase* configBase, const QString& viewConfGrp ) { QString grp = QString(viewConfGrp + "-Splitter %1").arg(m_splitterIndex); KConfigGroup config( configBase, grp ); // Save sizes, orient, children for this splitter config.writeEntry( "Sizes", s->sizes() ); config.writeEntry( "Orientation", int(s->orientation()) ); QStringList childList; // a QSplitter has two children, either QSplitters and/or KateViewSpaces // special case: root splitter might have only one child (just for info) for (int it = 0; it < s->count(); ++it) { QWidget *obj = s->widget(it); KateViewSpace* kvs = qobject_cast<KateViewSpace*>(obj); QString n; // name for child list, see below // For KateViewSpaces, ask them to save the file list. if ( kvs ) { n = QString(viewConfGrp + "-ViewSpace %1").arg( m_viewSpaceList.indexOf(kvs) ); kvs->saveConfig ( configBase, m_viewSpaceList.indexOf(kvs), viewConfGrp); // save active viewspace if ( kvs->isActiveSpace() ) { KConfigGroup viewConfGroup(configBase, viewConfGrp); viewConfGroup.writeEntry("Active ViewSpace", m_viewSpaceList.indexOf(kvs) ); } } // for QSplitters, recurse else if ( QSplitter* splitter = qobject_cast<QSplitter*>(obj) ) { ++m_splitterIndex; n = QString(viewConfGrp + "-Splitter %1").arg( m_splitterIndex ); saveSplitterConfig( splitter, configBase, viewConfGrp); } childList.append( n ); } config.writeEntry("Children", childList); }
void KateViewManager::restoreViewConfiguration (const KConfigGroup& config) { // remove all views and viewspaces + remove their xml gui clients for (int i = 0; i < m_viewList.count(); ++i) mainWindow()->guiFactory ()->removeClient (m_viewList.at(i)); qDeleteAll( m_viewList ); m_viewList.clear(); qDeleteAll( m_viewSpaceList ); m_viewSpaceList.clear(); m_activeStates.clear(); // start recursion for the root splitter (Splitter 0) restoreSplitter( config.config(), config.name() + "-Splitter 0", this, config.name() ); // finally, make the correct view from the last session active int lastViewSpace = config.readEntry("Active ViewSpace", 0); if( lastViewSpace > m_viewSpaceList.size() ) lastViewSpace = 0; if( lastViewSpace >= 0 && lastViewSpace < m_viewSpaceList.size()) { setActiveSpace( m_viewSpaceList.at( lastViewSpace ) ); setActiveView( m_viewSpaceList.at( lastViewSpace )->currentView() ); m_viewSpaceList.at( lastViewSpace )->currentView()->setFocus(); } // emergency if (m_viewSpaceList.empty()) { // kill bad children while (count()) delete widget (0); KateViewSpace* vs = new KateViewSpace( this, 0 ); addWidget (vs); vs->setActive( true ); m_viewSpaceList.append(vs); } updateViewSpaceActions(); // the view has (maybe) changed - promote it to the world emit viewChanged(); }
KTextEditor::View* KateViewManager::activeView () { if (m_activeViewRunning) return 0L; m_activeViewRunning = true; for ( QList<KTextEditor::View*>::const_iterator it = m_viewList.constBegin(); it != m_viewList.constEnd(); ++it ) { if ( m_activeStates[*it] ) { m_activeViewRunning = false; return *it; } } // if we get to here, no view isActive() // first, try to get one from activeViewSpace() KateViewSpace* vs = activeViewSpace(); if ( vs && vs->currentView() ) { activateView (vs->currentView()); m_activeViewRunning = false; return vs->currentView(); } // last attempt: just pick first if ( !m_viewList.isEmpty() ) { activateView (m_viewList.first()); m_activeViewRunning = false; return m_viewList.first(); } m_activeViewRunning = false; // no views exists! return 0L; }
bool KateViewManager::deleteView (KTextEditor::View *view, bool delViewSpace) { if (!view) return true; KateViewSpace *viewspace = (KateViewSpace *)view->parentWidget()->parentWidget(); viewspace->removeView (view); mainWindow()->guiFactory ()->removeClient (view); // remove view from list and memory !! m_viewList.removeAt ( m_viewList.indexOf (view) ); m_activeStates.remove (view); delete view; view = 0L; if (delViewSpace) if ( viewspace->viewCount() == 0 ) removeViewSpace( viewspace ); return true; }