Design mode/Qt Designer: Clean up the widget part of it.

- Remove shared subwindow reparenting from EditorWidget, make EditorWidget
  inherit FancyMainWindow. and use just once instance of it instead of
  per-editor ones.
- Embedded FormEditorStack into EditorWidget as a centralwidget.
- Changed FormWindowEditor's base class from IEditor to SharedTools::FormWindowHost
  (Widget) to be embedded into FormEditorStack (no need to be an IEditor),
  Remove Designer::Internal::FormWindowHost which had little functionality.
- Add Design Mode widget to FormEditorW which has FakeToolBar and EditorWidget
  (single instance) in a vertical layout.
- Removed ProxyAction class handling dock view toggle actions of several EditorWidgets
  (no longer necessary since there is just once instance). Moved "View menu" to bottom.
- Started to make FakeToolBar work as a single instance listening on changing
  xml editors
- Include-file/slot connection clean-up.
This commit is contained in:
Friedemann Kleint
2010-03-09 10:26:20 +01:00
parent 9dae168869
commit 1b86bc50c1
19 changed files with 490 additions and 1008 deletions

View File

@@ -29,93 +29,152 @@
#include "formeditorstack.h"
#include "designerxmleditor.h"
#include <QDesignerFormWindowInterface>
#include <texteditor/basetextdocument.h>
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/editormanager/ieditor.h>
#include <coreplugin/icore.h>
#include "formwindoweditor.h"
#include "formeditorw.h"
#include "designerconstants.h"
#include <texteditor/basetextdocument.h>
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/icore.h>
#include <utils/qtcassert.h>
#include <QDesignerFormWindowInterface>
#include <QDesignerFormWindowManagerInterface>
#include <QDesignerFormEditorInterface>
#include "qt_private/formwindowbase_p.h"
#include <QtCore/QStringList>
#include <QtCore/QDebug>
namespace Designer {
namespace Internal {
FormEditorStack::FormEditorStack() : activeEditor(0)
FormEditorStack::FormXmlData::FormXmlData() :
xmlEditor(0), formEditor(0)
{
}
FormEditorStack::~FormEditorStack()
FormEditorStack::FormEditorStack(QWidget *parent) :
QStackedWidget(parent),
m_designerCore(0)
{
qDeleteAll(m_formEditors);
setObjectName(QLatin1String("FormEditorStack"));
}
Designer::FormWindowEditor *FormEditorStack::createFormWindowEditor(DesignerXmlEditorEditable *xmlEditor)
{
FormXmlData *data = new FormXmlData;
data->formEditor = FormEditorW::instance()->createFormWindowEditor(this);
data->formEditor->setFile(xmlEditor->file());
data->xmlEditor = xmlEditor;
data->widgetIndex = addWidget(data->formEditor->widget());
FormEditorW *few = FormEditorW::instance();
if (m_designerCore == 0) { // Initialize first time here
m_designerCore = few->designerEditor();
connect(m_designerCore->formWindowManager(), SIGNAL(activeFormWindowChanged(QDesignerFormWindowInterface*)),
this, SLOT(updateFormWindowSelectionHandles()));
}
FormXmlData data;
data.formEditor = few->createFormWindowEditor(this);
data.formEditor->setFile(xmlEditor->file());
data.xmlEditor = xmlEditor;
addWidget(data.formEditor);
m_formEditors.append(data);
setFormEditorData(data->formEditor, xmlEditor->contents());
setFormEditorData(data.formEditor, xmlEditor->contents());
TextEditor::BaseTextDocument *document = qobject_cast<TextEditor::BaseTextDocument*>(xmlEditor->file());
connect(document, SIGNAL(reloaded()), SLOT(reloadDocument()));
if (Designer::Constants::Internal::debug)
qDebug() << "FormEditorStack::createFormWindowEditor" << data.formEditor;
return data.formEditor;
}
return data->formEditor;
int FormEditorStack::indexOf(const QDesignerFormWindowInterface *fw) const
{
const int count = m_formEditors.size();
for(int i = 0; i < count; ++i)
if (m_formEditors[i].formEditor->formWindow() == fw)
return i;
return -1;
}
int FormEditorStack::indexOf(const Core::IEditor *xmlEditor) const
{
const int count = m_formEditors.size();
for(int i = 0; i < count; ++i)
if (m_formEditors[i].xmlEditor == xmlEditor)
return i;
return -1;
}
FormWindowEditor *FormEditorStack::activeFormWindow() const
{
if (QDesignerFormWindowInterface *afw = m_designerCore->formWindowManager()->activeFormWindow())
if (FormWindowEditor *fwe = formWindowEditorForFormWindow(afw))
return fwe;
return 0;
}
Designer::FormWindowEditor *FormEditorStack::formWindowEditorForFormWindow(const QDesignerFormWindowInterface *fw) const
{
const int i = indexOf(fw);
return i != -1 ? m_formEditors[i].formEditor : static_cast<Designer::FormWindowEditor *>(0);
}
bool FormEditorStack::removeFormWindowEditor(Core::IEditor *xmlEditor)
{
for(int i = 0; i < m_formEditors.length(); ++i) {
if (m_formEditors[i]->xmlEditor == xmlEditor) {
disconnect(m_formEditors[i]->formEditor->formWindow(), SIGNAL(changed()), this, SLOT(formChanged()));
removeWidget(m_formEditors[i]->formEditor->widget());
delete m_formEditors[i]->formEditor;
m_formEditors.removeAt(i);
return true;
}
}
return false;
if (Designer::Constants::Internal::debug)
qDebug() << "FormEditorStack::removeFormWindowEditor" << xmlEditor;
const int i = indexOf(xmlEditor);
if (i == -1) // Fail silently as this is invoked for all editors.
return false;
disconnect(m_formEditors[i].formEditor->formWindow(), SIGNAL(changed()), this, SLOT(formChanged()));
removeWidget(m_formEditors[i].formEditor->widget());
delete m_formEditors[i].formEditor;
m_formEditors.removeAt(i);
return true;
}
bool FormEditorStack::setVisibleEditor(Core::IEditor *xmlEditor)
{
for(int i = 0; i < m_formEditors.length(); ++i) {
if (m_formEditors[i]->xmlEditor == xmlEditor) {
setCurrentIndex(m_formEditors[i]->widgetIndex);
activeEditor = m_formEditors[i];
return true;
}
}
return false;
if (Designer::Constants::Internal::debug)
qDebug() << "FormEditorStack::setVisibleEditor" << xmlEditor;
const int i = indexOf(xmlEditor);
QTC_ASSERT(i != -1, return false);
if (i != currentIndex())
setCurrentIndex(i);
return true;
}
Designer::FormWindowEditor *FormEditorStack::formWindowEditorForXmlEditor(Core::IEditor *xmlEditor)
void FormEditorStack::updateFormWindowSelectionHandles()
{
foreach(FormXmlData *data, m_formEditors) {
if (data->xmlEditor == xmlEditor)
return data->formEditor;
// Display form selection handles only on active window
if (Designer::Constants::Internal::debug)
qDebug() << "updateFormWindowSelectionHandles";
QDesignerFormWindowInterface *activeFormWindow = m_designerCore->formWindowManager()->activeFormWindow();
foreach(const FormXmlData &fdm, m_formEditors) {
const bool active = activeFormWindow == fdm.formEditor->formWindow();
fdm.formEditor->updateFormWindowSelectionHandles(active);
}
return 0;
}
Designer::FormWindowEditor *FormEditorStack::formWindowEditorForXmlEditor(const Core::IEditor *xmlEditor) const
{
const int i = indexOf(xmlEditor);
return i != -1 ? m_formEditors.at(i).formEditor : static_cast<Designer::FormWindowEditor *>(0);
}
void FormEditorStack::reloadDocument()
{
if (activeEditor) {
setFormEditorData(activeEditor->formEditor, activeEditor->xmlEditor->contents());
}
if (Designer::Constants::Internal::debug)
qDebug() << "FormEditorStack::reloadDocument()";
const int index = currentIndex();
if (index >= 0)
setFormEditorData(m_formEditors[index].formEditor, m_formEditors[index].xmlEditor->contents());
}
void FormEditorStack::setFormEditorData(Designer::FormWindowEditor *formEditor, const QString &contents)
{
if (Designer::Constants::Internal::debug)
qDebug() << "FormEditorStack::setFormEditorData()";
disconnect(formEditor->formWindow(), SIGNAL(changed()), this, SLOT(formChanged()));
formEditor->createNew(contents);
connect(formEditor->formWindow(), SIGNAL(changed()), SLOT(formChanged()));
@@ -123,17 +182,17 @@ void FormEditorStack::setFormEditorData(Designer::FormWindowEditor *formEditor,
void FormEditorStack::formChanged()
{
Core::ICore *core = Core::ICore::instance();
if (core->editorManager()->currentEditor() && activeEditor
&& core->editorManager()->currentEditor() == activeEditor->xmlEditor)
{
TextEditor::BaseTextDocument *doc = qobject_cast<TextEditor::BaseTextDocument*>(activeEditor->xmlEditor->file());
Q_ASSERT(doc);
if (doc) {
// Save quietly (without spacer's warning).
if (const qdesigner_internal::FormWindowBase *fwb = qobject_cast<const qdesigner_internal::FormWindowBase *>(activeEditor->formEditor->formWindow()))
doc->document()->setPlainText(fwb->fileContents());
const int index = currentIndex();
if (index < 0)
return;
if (Core::IEditor *currentEditor = Core::EditorManager::instance()->currentEditor()) {
if (m_formEditors[index].xmlEditor == currentEditor) {
FormXmlData &xmlData = m_formEditors[index];
TextEditor::BaseTextDocument *doc = qobject_cast<TextEditor::BaseTextDocument*>(xmlData.xmlEditor->file());
QTC_ASSERT(doc, return);
if (doc) // Save quietly (without spacer's warning).
if (const qdesigner_internal::FormWindowBase *fwb = qobject_cast<const qdesigner_internal::FormWindowBase *>(xmlData.formEditor->formWindow()))
doc->document()->setPlainText(fwb->fileContents());
}
}
}