diff --git a/obs/CMakeLists.txt b/obs/CMakeLists.txt index 746bf0ead8a440f2a8832dd51e6f79fd27b4b935..4206582d2d864f85c33e5f7e46581453d10b6f4d 100644 --- a/obs/CMakeLists.txt +++ b/obs/CMakeLists.txt @@ -114,6 +114,7 @@ set(obs_SOURCES double-slider.cpp volume-control.cpp adv-audio-control.cpp + item-widget-helpers.cpp visibility-checkbox.cpp vertical-scroll-area.cpp visibility-item-widget.cpp @@ -152,6 +153,7 @@ set(obs_HEADERS mute-checkbox.hpp volume-control.hpp adv-audio-control.hpp + item-widget-helpers.hpp visibility-checkbox.hpp vertical-scroll-area.hpp visibility-item-widget.hpp diff --git a/obs/item-widget-helpers.cpp b/obs/item-widget-helpers.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9139ccb40d510e95a5a5ddcc156f82f5e2bc9772 --- /dev/null +++ b/obs/item-widget-helpers.cpp @@ -0,0 +1,46 @@ +/****************************************************************************** + Copyright (C) 2015 by Hugh Bailey + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include + +QListWidgetItem *TakeListItem(QListWidget *widget, int row) +{ + QListWidgetItem *item = widget->item(row); + + if (item) + delete widget->itemWidget(item); + + return widget->takeItem(row); +} + +void DeleteListItem(QListWidget *widget, QListWidgetItem *item) +{ + if (item) { + delete widget->itemWidget(item); + delete item; + } +} + +void ClearListItems(QListWidget *widget) +{ + for (int i = 0; i < widget->count(); i++) + delete widget->itemWidget(widget->item(i)); + + QListWidgetItem *item = nullptr; + while ((item = widget->takeItem(0))) + delete item; +} diff --git a/obs/item-widget-helpers.hpp b/obs/item-widget-helpers.hpp new file mode 100644 index 0000000000000000000000000000000000000000..9a4d43e41acb2e9042df1db0da2c0e41ce05b6d7 --- /dev/null +++ b/obs/item-widget-helpers.hpp @@ -0,0 +1,30 @@ +/****************************************************************************** + Copyright (C) 2015 by Hugh Bailey + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#pragma once + +/* This file exists to prevent ->deleteLater from being called on custom-made + * item widgets in widgets such as list widgets. We do this to prevent things + * such as references to sources/etc from getting stuck in the Qt event queue + * with no way of controlling when they'll be released. */ + +class QListWidget; +class QListWidgetItem; + +QListWidgetItem *TakeListItem(QListWidget *widget, int row); +void DeleteListItem(QListWidget *widget, QListWidgetItem *item); +void ClearListItems(QListWidget *widget);