This is the heart of the whole thing, and until we solve this, everything else is completely irrelevant. I have a decent roadmap to follow rearranging the GUI, thanks to Luis Garrido, but it seems completely pointless to me to fix the GUI while the whole configuration dialog itself remains broken. One way or another, this problem needs to be solved up front.

I'm completely stuck, and have no idea how to make further progress from here.

The configuration pages aren't working because their individual apply() methods are never called by: src/gui/dialogs/ConfigureDialogBase.cpp

void ConfigureDialogBase::slotApply() {

  for (configurationpages::iterator i = m_configurationPages.begin();
          i != m_configurationPages.end(); ++i)
      (*i)->apply();

}

configurationpages is: src/gui/dialogs/ConfigureDialogBase.h

  typedef std::vector<ConfigurationPage*> configurationpages;

ConfigurationPage is: src/gui/configuration/ConfigurationPage.h

class ConfigurationPage : public QWidget {

  Q_OBJECT

So the std::vector is supposed to contain a list of pointers to ConfigurationPage objects, and this code in slotApply() is supposed to iterate through that list and call each object's apply() method.

The list is empty, because all the code is broken with comments: src/gui/dialogs/ConfigureDialog.cpp

  pageWidget = addPage(GeneralConfigurationPage::iconLabel(),
                       GeneralConfigurationPage::title(),
                       il.load( GeneralConfigurationPage::iconName()) );
  vlay = new QVBoxLayout(pageWidget); //, 0, spacingHint());
  page = new GeneralConfigurationPage(doc, pageWidget);
  vlay->addWidget(page);
  //page->setPageIndex(pageIndex(pageWidget));
  m_tabWidget->setCurrentIndex( m_tabWidget->indexOf(pageWidget) );
  //m_configurationPages.push_back(page);

I'm not sure what page→setPageIndex(blah); used to do, but the new m_tabWidget→setCurrentIndex(blah) only serves to make sure the configuration dialog always opens on the Notation tab, as far as I can tell. No matter. I only mention that in passing.

The real problem is the m_configurationPages.push_back(page) has been commented out, because it fails with:

src/gui/dialogs/ConfigureDialog.cpp:75: error: invalid conversion from ‘QWidget*’ to ‘Rosegarden::ConfigurationPage*’ src/gui/dialogs/ConfigureDialog.cpp:75: error: initializing argument 1 of ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Rosegarden::ConfigurationPage*, _Alloc = std::allocator<Rosegarden::ConfigurationPage*>]’

m_configurationPages is a std::vector<ConfigurationPage*>

and page is used as a pointer to GeneralConfigurationPage, MIDIConfigurationPage, etc… which are TabbedConfigurationPage

and TabbedConfigurationPage is a ConfigurationPage.

So replacing the new declaration

  QWidget* page = 0;

with the old one

  ConfigurationPage* page = 0;

should fix the issue.

That said, at first glance, I don't think

  page->setPageIndex(pageIndex(pageWidget));

will compile as pageIndex() doesn't seem to be a member of ConfigureDialog.

(–yg)

This is where a completely fruitless evening ends. I can make no further progress until someone who understands this problem explains what I have to do to fix it.