diff --git a/dist/changes-4.10.1.md b/dist/changes-4.10.1.md new file mode 100644 index 00000000000..6e5d0db956d --- /dev/null +++ b/dist/changes-4.10.1.md @@ -0,0 +1,57 @@ +# Qt Creator 4.10.1 + +Qt Creator version 4.10.1 contains bug fixes. + +The most important changes are listed in this document. For a complete +list of changes, see the Git log for the Qt Creator sources that +you can check out from the public Git repository. For example: + + git clone git://code.qt.io/qt-creator/qt-creator.git + git log --cherry-pick --pretty=oneline origin/v4.10.0..v4.10.1 + +## Editing + +* Fixed file saving with some text encodings +* Fixed `Preserve case` in advanced search and replace (QTCREATORBUG-19696) +* Fixed crash when changing editor font (QTCREATORBUG-22933) + +## Help + +* Fixed that text moved around when resizing and zooming (QTCREATORBUG-4756) + +## Debugging + +* Fixed more layout restoration issues (QTCREATORBUG-22286, QTCREATORBUG-22938) + +### LLDB + +* Fixed wrong empty command line argument when debugging (QTCREATORBUG-22975) + +## Qt Quick Designer + +* Removed transformations from list of unsupported types +* Fixed update of animation curve editor + +## Platform Specific + +### macOS + +* Fixed window stacking order after closing file dialog (QTCREATORBUG-22906) + +## Credits for these changes go to: + +Aleksei German +Alexander Akulich +Andre Hartmann +André Pönitz +Christian Stenger +David Schulz +Eike Ziller +Knud Dollereder +Leena Miettinen +Lisandro Damián Nicanor Pérez Meyer +Nikolai Kosjar +Orgad Shaneh +Richard Weickelt +Thomas Hartmann + diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 34589e0dd84..689753a8003 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -83,6 +83,7 @@ class Dumper(DumperBase): # 'communication', 'unwind', 'commands']) #self.debugger.EnableLog('lldb', ['all']) self.debugger.Initialize() + self.debugger.SetAsync(True) self.debugger.HandleCommand('settings set auto-confirm on') # FIXME: warn('DISABLING DEFAULT FORMATTERS') @@ -863,10 +864,7 @@ class Dumper(DumperBase): pass else: if self.useTerminal_: - self.ignoreStops = 2 - else: - if self.useTerminal_: - self.ignoreStops = 1 + self.ignoreStops = 1 if self.platform_: self.debugger.SetCurrentPlatform(self.platform_) @@ -895,7 +893,6 @@ class Dumper(DumperBase): def prepare(self, args): error = lldb.SBError() - listener = self.debugger.GetListener() if self.attachPid_ > 0: attachInfo = lldb.SBAttachInfo(self.attachPid_) @@ -948,18 +945,23 @@ class Dumper(DumperBase): if self.target is not None: broadcaster = self.target.GetBroadcaster() listener = self.debugger.GetListener() + broadcaster.AddListener(listener, lldb.SBProcess.eBroadcastBitStateChanged) + listener.StartListeningForEvents(broadcaster, lldb.SBProcess.eBroadcastBitStateChanged) broadcaster.AddListener(listener, lldb.SBTarget.eBroadcastBitBreakpointChanged) listener.StartListeningForEvents(broadcaster, lldb.SBTarget.eBroadcastBitBreakpointChanged) def loop(self): event = lldb.SBEvent() + broadcaster = self.target.GetBroadcaster() listener = self.debugger.GetListener() while True: - if listener.WaitForEvent(10000000, event): + sys.stdout.flush() # IMPORTANT! to receive process state changes with lldb 1100 + while listener.GetNextEvent(event): self.handleEvent(event) - else: - warn('TIMEOUT') + if listener.WaitForEventForBroadcaster(0, broadcaster, event): + self.handleEvent(event) + def describeError(self, error): desc = lldb.SBStream() @@ -1301,6 +1303,10 @@ class Dumper(DumperBase): if lldb.SBBreakpoint.EventIsBreakpointEvent(event): self.handleBreakpointEvent(event) return + if not lldb.SBProcess.EventIsProcessEvent(event): + warn("UNEXPECTED event (%s)" % event.GetType()) + return + out = lldb.SBStream() event.GetDescription(out) #warn("EVENT: %s" % event) @@ -1793,7 +1799,7 @@ class Dumper(DumperBase): expr = self.parseAndEvaluate(expr) self.qqEditable[typeName](self, expr, value) else: - lhs.SetValueFromCString(value, error) + self.parseAndEvaluate(expr + '=' + value) self.reportResult(self.describeError(error), args) def watchPoint(self, args): diff --git a/share/qtcreator/templates/wizards/qtcreatorplugin/MyPlugin.json.in b/share/qtcreator/templates/wizards/qtcreatorplugin/MyPlugin.json.in index 910746c9fb9..68bedd40704 100644 --- a/share/qtcreator/templates/wizards/qtcreatorplugin/MyPlugin.json.in +++ b/share/qtcreator/templates/wizards/qtcreatorplugin/MyPlugin.json.in @@ -1,11 +1,11 @@ { - \"Name\" : \"%PluginName%\", - \"Version\" : \"0.0.1\", - \"CompatVersion\" : \"0.0.1\", - \"Vendor\" : \"%VendorName%\", - \"Copyright\" : \"%Copyright%\", - \"License\" : \"%License%\", - \"Description\" : \"%Description%\", - \"Url\" : \"%URL%\", + \\"Name\\" : \\"%PluginName%\\", + \\"Version\\" : \\"0.0.1\\", + \\"CompatVersion\\" : \\"0.0.1\\", + \\"Vendor\\" : \\"%VendorName%\\", + \\"Copyright\\" : \\"%Copyright%\\", + \\"License\\" : \\"%License%\\", + \\"Description\\" : \\"%Description%\\", + \\"Url\\" : \\"%URL%\\", $$dependencyList } diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index caa145b0f7c..b77a2536a6b 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -553,6 +553,7 @@ void PerspectivePrivate::resetPerspective() } else { op.setupLayout(); op.dock->setVisible(op.visibleByDefault); + theMainWindow->d->m_persistentChangedDocks.remove(op.name()); qCDebug(perspectivesLog) << "SETTING " << op.name() << " TO ACTIVE: " << op.visibleByDefault; } @@ -937,12 +938,10 @@ void PerspectivePrivate::restoreLayout() qCDebug(perspectivesLog) << "PERSPECTIVE STATE AVAILABLE BY FULL ID."; } - if (state.isEmpty()) { - qCDebug(perspectivesLog) << "PERSPECTIVE " << m_id << "RESTORE NOT POSSIBLE, NO STORED STATE"; - } else { - bool result = theMainWindow->restoreState(state); - qCDebug(perspectivesLog) << "PERSPECTIVE " << m_id << "RESTORED. SUCCESS: " << result; - } + // The order is important here: While QMainWindow can restore layouts with + // not-existing docks (some placeholders are used internally), later + // replacements with restoreDockWidget(dock) trigger a re-layout, resulting + // in different sizes. So make sure all docks exist first before restoring state. qCDebug(perspectivesLog) << "PERSPECTIVE" << m_id << "RESTORING LAYOUT FROM " << settingsId(); for (DockOperation &op : m_dockOperations) { @@ -955,6 +954,13 @@ void PerspectivePrivate::restoreLayout() << (active == op.visibleByDefault ? "DEFAULT USER" : "*** NON-DEFAULT USER"); } } + + if (state.isEmpty()) { + qCDebug(perspectivesLog) << "PERSPECTIVE " << m_id << "RESTORE NOT POSSIBLE, NO STORED STATE"; + } else { + bool result = theMainWindow->restoreState(state); + qCDebug(perspectivesLog) << "PERSPECTIVE " << m_id << "RESTORED, SUCCESS: " << result; + } } void PerspectivePrivate::saveLayout() diff --git a/src/plugins/help/helpwidget.cpp b/src/plugins/help/helpwidget.cpp index 9766b2f3b4b..9a66c0a6f59 100644 --- a/src/plugins/help/helpwidget.cpp +++ b/src/plugins/help/helpwidget.cpp @@ -117,7 +117,7 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget { m_viewerStack = new QStackedWidget; - if (style == ModeWidget) + if (supportsPages()) m_openPagesManager = new OpenPagesManager(this); auto topLayout = new QVBoxLayout; @@ -250,13 +250,10 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget connect(m_openOnlineDocumentationAction, &QAction::triggered, this, &HelpWidget::openOnlineDocumentation); layout->addWidget(Core::Command::toolButtonWithAppendedShortcut(m_openOnlineDocumentationAction, cmd)); - if (style == ModeWidget) { + if (supportsPages()) { layout->addWidget(new Utils::StyledSeparator(toolBar)); layout->addWidget(m_openPagesManager->openPagesComboBox(), 10); - } else { - layout->addWidget(new QLabel(), 10); - } - if (style != SideBarWidget) { + m_filterComboBox = new QComboBox; m_filterComboBox->setMinimumContentsLength(15); m_filterComboBox->setModel(LocalHelpManager::filterModel()); @@ -266,6 +263,8 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget LocalHelpManager::instance(), &LocalHelpManager::setFilterIndex); connect(LocalHelpManager::instance(), &LocalHelpManager::filterIndexChanged, m_filterComboBox, &QComboBox::setCurrentIndex); + } else { + layout->addWidget(new QLabel(), 10); } layout->addStretch(); @@ -308,16 +307,16 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget auto openMenu = new QMenu(openButton); openButton->setMenu(openMenu); + if (m_switchToHelp) + openMenu->addAction(m_switchToHelp); + if (supportsPages()) { + QAction *openPage = openMenu->addAction(tr("Open in New Page")); + connect(openPage, &QAction::triggered, this, [this]() { + if (HelpViewer *viewer = currentViewer()) + openNewPage(viewer->source()); + }); + } if (style != ExternalWindow) { - if (m_switchToHelp) - openMenu->addAction(m_switchToHelp); - if (style == ModeWidget) { - QAction *openPage = openMenu->addAction(tr("Open in New Page")); - connect(openPage, &QAction::triggered, this, [this]() { - if (HelpViewer *viewer = currentViewer()) - openNewPage(viewer->source()); - }); - } QAction *openExternal = openMenu->addAction(tr("Open in Window")); connect(openExternal, &QAction::triggered, this, [this]() { if (HelpViewer *viewer = currentViewer()) { @@ -326,20 +325,20 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget emit closeButtonClicked(); } }); - openMenu->addSeparator(); - - const Utils::Icon &icon = style == ModeWidget ? Utils::Icons::CLOSE_TOOLBAR - : Utils::Icons::CLOSE_SPLIT_RIGHT; - m_closeAction = new QAction(icon.icon(), QString(), toolBar); - connect(m_closeAction, &QAction::triggered, this, &HelpWidget::closeButtonClicked); - connect(m_closeAction, &QAction::triggered, this, [this] { - if (viewerCount() > 1) - closeCurrentPage(); - }); - button = new QToolButton; - button->setDefaultAction(m_closeAction); - layout->addWidget(button); } + openMenu->addSeparator(); + + const Utils::Icon &icon = style == SideBarWidget ? Utils::Icons::CLOSE_SPLIT_RIGHT + : Utils::Icons::CLOSE_TOOLBAR; + m_closeAction = new QAction(icon.icon(), QString(), toolBar); + connect(m_closeAction, &QAction::triggered, this, &HelpWidget::closeButtonClicked); + connect(m_closeAction, &QAction::triggered, this, [this] { + if (viewerCount() > 1) + closeCurrentPage(); + }); + button = new QToolButton; + button->setDefaultAction(m_closeAction); + layout->addWidget(button); QAction *reload = openMenu->addAction(tr("Reload")); connect(reload, &QAction::triggered, this, [this]() { @@ -402,11 +401,10 @@ void HelpWidget::addSideBar() { QMap shortcutMap; Core::Command *cmd; - bool supportsNewPages = (m_style == ModeWidget); auto contentWindow = new ContentWindow; auto contentItem = new Core::SideBarItem(contentWindow, Constants::HELP_CONTENTS); - contentWindow->setOpenInNewPageActionVisible(supportsNewPages); + contentWindow->setOpenInNewPageActionVisible(supportsPages()); contentWindow->setWindowTitle(HelpPlugin::tr(Constants::SB_CONTENTS)); connect(contentWindow, &ContentWindow::linkActivated, this, &HelpWidget::open); @@ -418,7 +416,7 @@ void HelpWidget::addSideBar() auto indexWindow = new IndexWindow(); auto indexItem = new Core::SideBarItem(indexWindow, Constants::HELP_INDEX); - indexWindow->setOpenInNewPageActionVisible(supportsNewPages); + indexWindow->setOpenInNewPageActionVisible(supportsPages()); indexWindow->setWindowTitle(HelpPlugin::tr(Constants::SB_INDEX)); connect(indexWindow, &IndexWindow::linksActivated, this, &HelpWidget::showLinks); @@ -430,7 +428,7 @@ void HelpWidget::addSideBar() auto bookmarkWidget = new BookmarkWidget(&LocalHelpManager::bookmarkManager()); bookmarkWidget->setWindowTitle(HelpPlugin::tr(Constants::SB_BOOKMARKS)); - bookmarkWidget->setOpenInNewPageActionVisible(supportsNewPages); + bookmarkWidget->setOpenInNewPageActionVisible(supportsPages()); auto bookmarkItem = new Core::SideBarItem(bookmarkWidget, Constants::HELP_BOOKMARKS); connect(bookmarkWidget, &BookmarkWidget::linkActivated, this, &HelpWidget::setSource); m_bookmarkAction = new QAction(tr("Activate Help Bookmarks View"), this); @@ -450,17 +448,16 @@ void HelpWidget::addSideBar() shortcutMap.insert(Constants::HELP_SEARCH, cmd); Core::SideBarItem *openPagesItem = nullptr; - if (m_style == ModeWidget) { - QWidget *openPagesWidget = m_openPagesManager->openPagesWidget(); - openPagesWidget->setWindowTitle(HelpPlugin::tr(Constants::SB_OPENPAGES)); - openPagesItem = new Core::SideBarItem(openPagesWidget, Constants::HELP_OPENPAGES); - m_openPagesAction = new QAction(tr("Activate Open Help Pages View"), this); - cmd = Core::ActionManager::registerAction(m_openPagesAction, Constants::HELP_OPENPAGES, - m_context->context()); - cmd->setDefaultKeySequence(QKeySequence(Core::useMacShortcuts ? tr("Meta+O") - : tr("Ctrl+Shift+O"))); - shortcutMap.insert(Constants::HELP_OPENPAGES, cmd); - } + QWidget *openPagesWidget = m_openPagesManager->openPagesWidget(); + openPagesWidget->setWindowTitle(HelpPlugin::tr(Constants::SB_OPENPAGES)); + openPagesItem = new Core::SideBarItem(openPagesWidget, Constants::HELP_OPENPAGES); + m_openPagesAction = new QAction(tr("Activate Open Help Pages View"), this); + cmd = Core::ActionManager::registerAction(m_openPagesAction, + Constants::HELP_OPENPAGES, + m_context->context()); + cmd->setDefaultKeySequence( + QKeySequence(Core::useMacShortcuts ? tr("Meta+O") : tr("Ctrl+Shift+O"))); + shortcutMap.insert(Constants::HELP_OPENPAGES, cmd); QList itemList = {contentItem, indexItem, bookmarkItem, searchItem}; if (openPagesItem) @@ -546,7 +543,7 @@ HelpViewer *HelpWidget::insertViewer(int index, const QUrl &url, qreal zoom) HelpViewer *viewer = HelpPlugin::createHelpViewer(zoom); m_viewerStack->insertWidget(index, viewer); viewer->setFocus(Qt::OtherFocusReason); - viewer->setActionVisible(HelpViewer::Action::NewPage, m_style == ModeWidget); + viewer->setActionVisible(HelpViewer::Action::NewPage, supportsPages()); viewer->setActionVisible(HelpViewer::Action::ExternalWindow, m_style != ExternalWindow); connect(viewer, &HelpViewer::sourceChanged, this, [viewer, this](const QUrl &url) { if (currentViewer() == viewer) { @@ -741,10 +738,15 @@ void HelpWidget::saveState() const } } +bool HelpWidget::supportsPages() const +{ + return m_style != SideBarWidget; +} + void HelpWidget::updateCloseButton() { - if (m_style == ModeWidget) { - const bool closeOnReturn = LocalHelpManager::returnOnClose(); + if (supportsPages()) { + const bool closeOnReturn = LocalHelpManager::returnOnClose() && m_style == ModeWidget; m_closeAction->setEnabled(closeOnReturn || m_viewerStack->count() > 1); } } diff --git a/src/plugins/help/helpwidget.h b/src/plugins/help/helpwidget.h index 603e333876d..53df93153e9 100644 --- a/src/plugins/help/helpwidget.h +++ b/src/plugins/help/helpwidget.h @@ -125,6 +125,7 @@ private: void helpModeButtonClicked(); void closeCurrentPage(); void saveState() const; + bool supportsPages() const; void goHome(); void addBookmark(); diff --git a/src/shared/qbs b/src/shared/qbs index 8c290c624d3..94fe404a5a6 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 8c290c624d343406442b87121ccb2e4eab0e6e51 +Subproject commit 94fe404a5a6d7cf91926bcfbd026953994b25815