| File: | builds/wireshark/wireshark/ui/qt/widgets/additional_toolbar.cpp |
| Warning: | line 416, column 13 Potential leak of memory pointed to by 'listvalue' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* additional_toolbar.cpp | |||
| 2 | * | |||
| 3 | * Wireshark - Network traffic analyzer | |||
| 4 | * By Gerald Combs <gerald@wireshark.org> | |||
| 5 | * Copyright 1998 Gerald Combs | |||
| 6 | * | |||
| 7 | * SPDX-License-Identifier: GPL-2.0-or-later | |||
| 8 | */ | |||
| 9 | ||||
| 10 | #include <config.h> | |||
| 11 | ||||
| 12 | #include <ui/qt/widgets/additional_toolbar.h> | |||
| 13 | #include <ui/qt/widgets/apply_line_edit.h> | |||
| 14 | #include <ui/qt/utils/qt_ui_utils.h> | |||
| 15 | #include <ui/qt/utils/variant_pointer.h> | |||
| 16 | #include <ui/qt/main_application.h> | |||
| 17 | ||||
| 18 | #include <QLabel> | |||
| 19 | #include <QLineEdit> | |||
| 20 | #include <QHBoxLayout> | |||
| 21 | #include <QComboBox> | |||
| 22 | #include <QWidget> | |||
| 23 | #include <QCheckBox> | |||
| 24 | #include <QPushButton> | |||
| 25 | #include <QStandardItem> | |||
| 26 | #include <QStandardItemModel> | |||
| 27 | #include <QLayoutItem> | |||
| 28 | ||||
| 29 | const char * AdditionalToolbarWidgetAction::propertyName = "additional_toolbar_item"; | |||
| 30 | ||||
| 31 | AdditionalToolBar::AdditionalToolBar(ext_toolbar_t * exttoolbar, QWidget * parent) | |||
| 32 | : QToolBar(parent), | |||
| 33 | toolbar(exttoolbar) | |||
| 34 | { } | |||
| 35 | ||||
| 36 | AdditionalToolBar::~AdditionalToolBar() | |||
| 37 | { } | |||
| 38 | ||||
| 39 | AdditionalToolBar * AdditionalToolBar::create(QWidget * parent, ext_toolbar_t * toolbar) | |||
| 40 | { | |||
| 41 | if (g_list_length(toolbar->children) == 0) | |||
| 42 | return NULL__null; | |||
| 43 | ||||
| 44 | AdditionalToolBar * result = new AdditionalToolBar(toolbar, parent); | |||
| 45 | result->setMovable(false); | |||
| 46 | result->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); | |||
| 47 | result->layout()->setContentsMargins(0, 0, 0, 0); | |||
| 48 | result->layout()->setSpacing(4); | |||
| 49 | ||||
| 50 | GList * walker = toolbar->children; | |||
| 51 | bool spacerNeeded = true; | |||
| 52 | ||||
| 53 | while (walker && walker->data) | |||
| 54 | { | |||
| 55 | ext_toolbar_t * item = gxx_list_data(ext_toolbar_t *, walker)((walker) ? ((reinterpret_cast<ext_toolbar_t *>(walker-> data))) : nullptr); | |||
| 56 | if (item->type == EXT_TOOLBAR_ITEM) | |||
| 57 | { | |||
| 58 | if (item->item_type == EXT_TOOLBAR_STRING) | |||
| 59 | spacerNeeded = false; | |||
| 60 | ||||
| 61 | QAction * newAction = new AdditionalToolbarWidgetAction(item, result); | |||
| 62 | if (newAction) | |||
| 63 | { | |||
| 64 | result->addAction(newAction); | |||
| 65 | /* Necessary, because enable state is reset upon adding the action */ | |||
| 66 | result->actions()[result->actions().count() - 1]->setEnabled(!item->capture_only); | |||
| 67 | } | |||
| 68 | } | |||
| 69 | ||||
| 70 | walker = gxx_list_next (walker)((walker) ? ((reinterpret_cast<GList *>(walker))->next ) : nullptr); | |||
| 71 | } | |||
| 72 | ||||
| 73 | if (result->children().count() == 0) | |||
| 74 | return Q_NULLPTRnullptr; | |||
| 75 | ||||
| 76 | if (spacerNeeded) | |||
| 77 | { | |||
| 78 | QWidget * empty = new QWidget(); | |||
| 79 | empty->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred); | |||
| 80 | result->addWidget(empty); | |||
| 81 | ||||
| 82 | } | |||
| 83 | ||||
| 84 | return result; | |||
| 85 | } | |||
| 86 | ||||
| 87 | QString AdditionalToolBar::menuName() | |||
| 88 | { | |||
| 89 | return (toolbar && toolbar->name) ? QString(toolbar->name) : QString(); | |||
| 90 | } | |||
| 91 | ||||
| 92 | AdditionalToolbarWidgetAction::AdditionalToolbarWidgetAction(QObject * parent) | |||
| 93 | : QWidgetAction(parent), | |||
| 94 | toolbar_item(0) | |||
| 95 | { } | |||
| 96 | ||||
| 97 | AdditionalToolbarWidgetAction::AdditionalToolbarWidgetAction(ext_toolbar_t * item, QObject * parent) | |||
| 98 | : QWidgetAction(parent), | |||
| 99 | toolbar_item(item) | |||
| 100 | { | |||
| 101 | connect(mainApp, &MainApplication::captureActive, this, &AdditionalToolbarWidgetAction::captureActive); | |||
| 102 | } | |||
| 103 | ||||
| 104 | AdditionalToolbarWidgetAction::AdditionalToolbarWidgetAction(const AdditionalToolbarWidgetAction & copy_object) | |||
| 105 | : QWidgetAction(copy_object.parent()), | |||
| 106 | toolbar_item(copy_object.toolbar_item) | |||
| 107 | { | |||
| 108 | connect(mainApp, &MainApplication::captureActive, this, &AdditionalToolbarWidgetAction::captureActive); | |||
| 109 | } | |||
| 110 | ||||
| 111 | ||||
| 112 | void AdditionalToolbarWidgetAction::captureActive(int activeCaptures) | |||
| 113 | { | |||
| 114 | if (toolbar_item && toolbar_item->capture_only) | |||
| 115 | { | |||
| 116 | setEnabled(activeCaptures != 0); | |||
| 117 | } | |||
| 118 | } | |||
| 119 | ||||
| 120 | /* Exists, so a default deconstructor does not call delete on toolbar_item */ | |||
| 121 | AdditionalToolbarWidgetAction::~AdditionalToolbarWidgetAction() { } | |||
| 122 | ||||
| 123 | QWidget * AdditionalToolbarWidgetAction::createWidget(QWidget * parent) | |||
| 124 | { | |||
| 125 | QWidget * barItem = 0; | |||
| 126 | ||||
| 127 | if (toolbar_item->type != EXT_TOOLBAR_ITEM) | |||
| 128 | return barItem; | |||
| 129 | ||||
| 130 | switch (toolbar_item->item_type) | |||
| 131 | { | |||
| 132 | case EXT_TOOLBAR_BUTTON: | |||
| 133 | barItem = createButton(toolbar_item, parent); | |||
| 134 | break; | |||
| 135 | case EXT_TOOLBAR_BOOLEAN: | |||
| 136 | barItem = createBoolean(toolbar_item, parent); | |||
| 137 | break; | |||
| 138 | case EXT_TOOLBAR_STRING: | |||
| 139 | barItem = createTextEditor(toolbar_item, parent); | |||
| 140 | break; | |||
| 141 | case EXT_TOOLBAR_SELECTOR: | |||
| 142 | barItem = createSelector(toolbar_item, parent); | |||
| 143 | break; | |||
| 144 | } | |||
| 145 | ||||
| 146 | if (! barItem) | |||
| 147 | return 0; | |||
| 148 | ||||
| 149 | barItem->setToolTip(toolbar_item->tooltip); | |||
| 150 | barItem->setProperty(propertyName, VariantPointer<ext_toolbar_t>::asQVariant(toolbar_item)); | |||
| 151 | ||||
| 152 | #ifdef Q_OS_MAC | |||
| 153 | barItem->setAttribute(Qt::WA_MacSmallSize, true); | |||
| 154 | #endif | |||
| 155 | ||||
| 156 | return barItem; | |||
| 157 | } | |||
| 158 | ||||
| 159 | static void | |||
| 160 | toolbar_button_cb(void *item, void *item_data, void *user_data) | |||
| 161 | { | |||
| 162 | if (! item || ! item_data || ! user_data) | |||
| 163 | return; | |||
| 164 | ||||
| 165 | QPushButton * widget = (QPushButton *)(item_data); | |||
| 166 | ext_toolbar_update_t * update_entry = (ext_toolbar_update_t *)user_data; | |||
| 167 | ||||
| 168 | if (widget) | |||
| 169 | { | |||
| 170 | if (update_entry->type == EXT_TOOLBAR_UPDATE_VALUE) | |||
| 171 | widget->setText((char *)update_entry->user_data); | |||
| 172 | else if (update_entry->type == EXT_TOOLBAR_SET_ACTIVE) | |||
| 173 | { | |||
| 174 | bool enableState = GPOINTER_TO_INT(update_entry->user_data)((gint) (glong) (update_entry->user_data)) == 1; | |||
| 175 | widget->setEnabled(enableState); | |||
| 176 | } | |||
| 177 | ||||
| 178 | } | |||
| 179 | } | |||
| 180 | ||||
| 181 | QWidget * AdditionalToolbarWidgetAction::createButton(ext_toolbar_t * item, QWidget * parent) | |||
| 182 | { | |||
| 183 | if (! item || item->type != EXT_TOOLBAR_ITEM || item->item_type != EXT_TOOLBAR_BUTTON) | |||
| 184 | return 0; | |||
| 185 | ||||
| 186 | QPushButton * button = new QPushButton(item->name, parent); | |||
| 187 | button->setText(item->name); | |||
| 188 | connect(button, &QPushButton::clicked, this, &AdditionalToolbarWidgetAction::onButtonClicked); | |||
| 189 | ||||
| 190 | ext_toolbar_register_update_cb(item, (ext_toolbar_action_cb)&toolbar_button_cb, (void *)button); | |||
| 191 | ||||
| 192 | return button; | |||
| 193 | } | |||
| 194 | ||||
| 195 | static void | |||
| 196 | toolbar_boolean_cb(void *item, void *item_data, void *user_data) | |||
| 197 | { | |||
| 198 | if (! item || ! item_data || ! user_data) | |||
| 199 | return; | |||
| 200 | ||||
| 201 | QCheckBox * widget = (QCheckBox *)(item_data); | |||
| 202 | ||||
| 203 | ext_toolbar_update_t * update_entry = (ext_toolbar_update_t *)user_data; | |||
| 204 | ||||
| 205 | if (update_entry->type == EXT_TOOLBAR_UPDATE_VALUE) | |||
| 206 | { | |||
| 207 | bool oldState = false; | |||
| 208 | if (update_entry->silent) | |||
| 209 | oldState = widget->blockSignals(true); | |||
| 210 | ||||
| 211 | widget->setCheckState(GPOINTER_TO_INT(update_entry->user_data)((gint) (glong) (update_entry->user_data)) == 1 ? Qt::Checked : Qt::Unchecked); | |||
| 212 | ||||
| 213 | if (update_entry->silent) | |||
| 214 | widget->blockSignals(oldState); | |||
| 215 | } | |||
| 216 | else if (update_entry->type == EXT_TOOLBAR_SET_ACTIVE) | |||
| 217 | { | |||
| 218 | bool enableState = GPOINTER_TO_INT(update_entry->user_data)((gint) (glong) (update_entry->user_data)) == 1; | |||
| 219 | widget->setEnabled(enableState); | |||
| 220 | } | |||
| 221 | } | |||
| 222 | ||||
| 223 | QWidget * AdditionalToolbarWidgetAction::createBoolean(ext_toolbar_t * item, QWidget * parent) | |||
| 224 | { | |||
| 225 | if (! item || item->type != EXT_TOOLBAR_ITEM || item->item_type != EXT_TOOLBAR_BOOLEAN) | |||
| 226 | return 0; | |||
| 227 | ||||
| 228 | QString defValue = toolbar_item->defvalue; | |||
| 229 | ||||
| 230 | QCheckBox * checkbox = new QCheckBox(item->name, parent); | |||
| 231 | checkbox->setText(item->name); | |||
| 232 | setCheckable(true); | |||
| 233 | checkbox->setCheckState(defValue.compare("true", Qt::CaseInsensitive) == 0 ? Qt::Checked : Qt::Unchecked); | |||
| 234 | #if QT_VERSION((6<<16)|(4<<8)|(2)) >= QT_VERSION_CHECK(6, 7, 0)((6<<16)|(7<<8)|(0)) | |||
| 235 | connect(checkbox, &QCheckBox::checkStateChanged, this, &AdditionalToolbarWidgetAction::onCheckBoxChecked); | |||
| 236 | #else | |||
| 237 | connect(checkbox, &QCheckBox::stateChanged, this, &AdditionalToolbarWidgetAction::onCheckBoxChecked); | |||
| 238 | #endif | |||
| 239 | ||||
| 240 | ext_toolbar_register_update_cb(item, (ext_toolbar_action_cb)&toolbar_boolean_cb, (void *)checkbox); | |||
| 241 | ||||
| 242 | return checkbox; | |||
| 243 | } | |||
| 244 | ||||
| 245 | QWidget * AdditionalToolbarWidgetAction::createLabelFrame(ext_toolbar_t * item, QWidget * parent) | |||
| 246 | { | |||
| 247 | if (! item) | |||
| 248 | return new QWidget(); | |||
| 249 | ||||
| 250 | QWidget * frame = new QWidget(parent); | |||
| 251 | ||||
| 252 | QHBoxLayout * frameLayout = new QHBoxLayout(frame); | |||
| 253 | frameLayout->setContentsMargins(0, 0, 0, 0); | |||
| 254 | frameLayout->setSpacing(0); | |||
| 255 | ||||
| 256 | QLabel * strLabel = new QLabel(item->name, frame); | |||
| 257 | strLabel->setToolTip(item->tooltip); | |||
| 258 | ||||
| 259 | #ifdef Q_OS_MAC | |||
| 260 | frame->setAttribute(Qt::WA_MacSmallSize, true); | |||
| 261 | strLabel->setAttribute(Qt::WA_MacSmallSize, true); | |||
| 262 | #endif | |||
| 263 | ||||
| 264 | frameLayout->addWidget(strLabel); | |||
| 265 | ||||
| 266 | frame->setLayout(frameLayout); | |||
| 267 | ||||
| 268 | return frame; | |||
| 269 | } | |||
| 270 | ||||
| 271 | static void | |||
| 272 | toolbar_string_cb(void *item, void *item_data, void *user_data) | |||
| 273 | { | |||
| 274 | if (! item || ! item_data || ! user_data) | |||
| 275 | return; | |||
| 276 | ||||
| 277 | ApplyLineEdit * edit = (ApplyLineEdit *)(item_data); | |||
| 278 | ||||
| 279 | ext_toolbar_update_t * update_entry = (ext_toolbar_update_t *)user_data; | |||
| 280 | ||||
| 281 | if (update_entry->type == EXT_TOOLBAR_UPDATE_VALUE) | |||
| 282 | { | |||
| 283 | bool oldState = false; | |||
| 284 | if (update_entry->silent) | |||
| 285 | oldState = edit->blockSignals(true); | |||
| 286 | ||||
| 287 | edit->setText((char *)update_entry->user_data); | |||
| 288 | ||||
| 289 | if (update_entry->silent) | |||
| 290 | edit->blockSignals(oldState); | |||
| 291 | } | |||
| 292 | else if (update_entry->type == EXT_TOOLBAR_SET_ACTIVE) | |||
| 293 | { | |||
| 294 | bool enableState = GPOINTER_TO_INT(update_entry->user_data)((gint) (glong) (update_entry->user_data)) == 1; | |||
| 295 | edit->setEnabled(enableState); | |||
| 296 | } | |||
| 297 | } | |||
| 298 | ||||
| 299 | QWidget * AdditionalToolbarWidgetAction::createTextEditor(ext_toolbar_t * item, QWidget * parent) | |||
| 300 | { | |||
| 301 | if (! item || item->type != EXT_TOOLBAR_ITEM || item->item_type != EXT_TOOLBAR_STRING) | |||
| 302 | return 0; | |||
| 303 | ||||
| 304 | QWidget * frame = createLabelFrame(toolbar_item, parent); | |||
| 305 | ||||
| 306 | ApplyLineEdit * strEdit = new ApplyLineEdit(toolbar_item->defvalue, frame); | |||
| 307 | strEdit->setToolTip(toolbar_item->tooltip); | |||
| 308 | strEdit->setRegEx(toolbar_item->regex); | |||
| 309 | strEdit->setEmptyAllowed(toolbar_item->is_required); | |||
| 310 | strEdit->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); | |||
| 311 | ||||
| 312 | #ifdef Q_OS_MAC | |||
| 313 | strEdit->setAttribute(Qt::WA_MacSmallSize, true); | |||
| 314 | #endif | |||
| 315 | ||||
| 316 | frame->layout()->addWidget(strEdit); | |||
| 317 | ||||
| 318 | connect(strEdit, &ApplyLineEdit::textApplied, this, &AdditionalToolbarWidgetAction::sendTextToCallback); | |||
| 319 | ||||
| 320 | ext_toolbar_register_update_cb(item, (ext_toolbar_action_cb)&toolbar_string_cb, (void *)strEdit); | |||
| 321 | ||||
| 322 | return frame; | |||
| 323 | } | |||
| 324 | ||||
| 325 | static void | |||
| 326 | toolbar_selector_cb(void *item, void *item_data, void *user_data) | |||
| 327 | { | |||
| 328 | if (! item || ! item_data || ! user_data) | |||
| ||||
| 329 | return; | |||
| 330 | ||||
| 331 | QComboBox * comboBox = (QComboBox *)(item_data); | |||
| 332 | ext_toolbar_update_t * update_entry = (ext_toolbar_update_t *)user_data; | |||
| 333 | ||||
| 334 | bool oldState = false; | |||
| 335 | ||||
| 336 | if (update_entry->silent) | |||
| 337 | oldState = comboBox->blockSignals(true); | |||
| 338 | ||||
| 339 | QStandardItemModel * sourceModel = (QStandardItemModel *)comboBox->model(); | |||
| 340 | ||||
| 341 | if (update_entry->type == EXT_TOOLBAR_SET_ACTIVE) | |||
| 342 | { | |||
| 343 | bool enableState = GPOINTER_TO_INT(update_entry->user_data)((gint) (glong) (update_entry->user_data)) == 1; | |||
| 344 | comboBox->setEnabled(enableState); | |||
| 345 | } | |||
| 346 | else if (update_entry->type != EXT_TOOLBAR_UPDATE_DATA_REMOVE && ! update_entry->user_data) | |||
| 347 | return; | |||
| 348 | ||||
| 349 | if (update_entry->type == EXT_TOOLBAR_UPDATE_VALUE) | |||
| 350 | { | |||
| 351 | QString data = QString((char *)update_entry->user_data); | |||
| 352 | ||||
| 353 | for (int i = 0; i < sourceModel->rowCount(); i++) | |||
| 354 | { | |||
| 355 | QStandardItem * dataValue = ((QStandardItemModel *)sourceModel)->item(i, 0); | |||
| 356 | ext_toolbar_value_t * tbValue = VariantPointer<ext_toolbar_value_t>::asPtr(dataValue->data(Qt::UserRole)); | |||
| 357 | if (tbValue && data.compare(QString(tbValue->value)) == 0) | |||
| 358 | { | |||
| 359 | comboBox->setCurrentIndex(i); | |||
| 360 | break; | |||
| 361 | } | |||
| 362 | } | |||
| 363 | } | |||
| 364 | else if (update_entry->type == EXT_TOOLBAR_UPDATE_DATA) | |||
| 365 | { | |||
| 366 | GList * walker = (GList *)update_entry->user_data; | |||
| 367 | if (g_list_length(walker) == 0) | |||
| 368 | return; | |||
| 369 | ||||
| 370 | sourceModel->clear(); | |||
| 371 | ||||
| 372 | while (walker && walker->data) | |||
| 373 | { | |||
| 374 | ext_toolbar_value_t * listvalue = gxx_list_data(ext_toolbar_value_t *, walker)((walker) ? ((reinterpret_cast<ext_toolbar_value_t *>(walker ->data))) : nullptr); | |||
| 375 | ||||
| 376 | QStandardItem * si = new QStandardItem(listvalue->display); | |||
| 377 | si->setData(VariantPointer<ext_toolbar_value_t>::asQVariant(listvalue), Qt::UserRole); | |||
| 378 | sourceModel->appendRow(si); | |||
| 379 | ||||
| 380 | walker = gxx_list_next(walker)((walker) ? ((reinterpret_cast<GList *>(walker))->next ) : nullptr); | |||
| 381 | } | |||
| 382 | } | |||
| 383 | else if (update_entry->type == EXT_TOOLBAR_UPDATE_DATABYINDEX || | |||
| 384 | update_entry->type == EXT_TOOLBAR_UPDATE_DATA_ADD || | |||
| 385 | update_entry->type == EXT_TOOLBAR_UPDATE_DATA_REMOVE) | |||
| 386 | { | |||
| 387 | if (! update_entry->data_index) | |||
| 388 | return; | |||
| 389 | ||||
| 390 | char * idx = (char *)update_entry->data_index; | |||
| 391 | char * display = (char *)update_entry->user_data; | |||
| 392 | ||||
| 393 | if (update_entry->type
| |||
| 394 | { | |||
| 395 | for (int i = 0; i < sourceModel->rowCount(); i++) | |||
| 396 | { | |||
| 397 | QStandardItem * dataValue = sourceModel->item(i, 0); | |||
| 398 | ext_toolbar_value_t * entry = VariantPointer<ext_toolbar_value_t>::asPtr(dataValue->data(Qt::UserRole)); | |||
| 399 | if (entry && g_strcmp0(entry->value, idx) == 0) | |||
| 400 | { | |||
| 401 | g_free(entry->display); | |||
| 402 | entry->display = g_strdup(display)g_strdup_inline (display); | |||
| 403 | dataValue->setData(VariantPointer<ext_toolbar_value_t>::asQVariant(entry), Qt::UserRole); | |||
| 404 | dataValue->setText(display); | |||
| 405 | break; | |||
| 406 | } | |||
| 407 | } | |||
| 408 | } | |||
| 409 | else if (update_entry->type
| |||
| 410 | { | |||
| 411 | ext_toolbar_value_t * listvalue = g_new0(ext_toolbar_value_t, 1)((ext_toolbar_value_t *) g_malloc0_n ((1), sizeof (ext_toolbar_value_t ))); | |||
| 412 | listvalue->display = g_strdup(display)g_strdup_inline (display); | |||
| 413 | listvalue->value = g_strdup(idx)g_strdup_inline (idx); | |||
| 414 | ||||
| 415 | QStandardItem * si = new QStandardItem(listvalue->display); | |||
| 416 | si->setData(VariantPointer<ext_toolbar_value_t>::asQVariant(listvalue), Qt::UserRole); | |||
| ||||
| 417 | sourceModel->appendRow(si); | |||
| 418 | } | |||
| 419 | else if (update_entry->type == EXT_TOOLBAR_UPDATE_DATA_REMOVE) | |||
| 420 | { | |||
| 421 | QList<QStandardItem *> entryList = sourceModel->findItems(display); | |||
| 422 | /* Search for index if display did not find anything */ | |||
| 423 | if (entryList.size() == 0) | |||
| 424 | entryList = sourceModel->findItems(idx); | |||
| 425 | ||||
| 426 | foreach(QStandardItem *entry, entryList)for (auto _container_426 = QtPrivate::qMakeForeachContainer(entryList ); _container_426.i != _container_426.e; ++_container_426.i) if (QStandardItem *entry = *_container_426.i; false) {} else | |||
| 427 | { | |||
| 428 | QModelIndex index = sourceModel->indexFromItem(entry); | |||
| 429 | if (index.isValid()) | |||
| 430 | sourceModel->removeRow(index.row()); | |||
| 431 | } | |||
| 432 | } | |||
| 433 | } | |||
| 434 | ||||
| 435 | if (update_entry->silent) | |||
| 436 | comboBox->blockSignals(oldState); | |||
| 437 | ||||
| 438 | } | |||
| 439 | ||||
| 440 | QWidget * AdditionalToolbarWidgetAction::createSelector(ext_toolbar_t * item, QWidget * parent) | |||
| 441 | { | |||
| 442 | if (! item || item->type != EXT_TOOLBAR_ITEM || item->item_type != EXT_TOOLBAR_SELECTOR) | |||
| 443 | return 0; | |||
| 444 | ||||
| 445 | if (g_list_length(item->values) == 0) | |||
| 446 | return 0; | |||
| 447 | ||||
| 448 | QWidget * frame = createLabelFrame(item, parent); | |||
| 449 | ||||
| 450 | QComboBox * myBox = new QComboBox(parent); | |||
| 451 | myBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); | |||
| 452 | ||||
| 453 | QStandardItemModel * sourceModel = new QStandardItemModel(); | |||
| 454 | ||||
| 455 | GList * walker = item->values; | |||
| 456 | int selIndex = 0; | |||
| 457 | while (walker && walker->data) | |||
| 458 | { | |||
| 459 | ext_toolbar_value_t * listvalue = gxx_list_data(ext_toolbar_value_t *, walker)((walker) ? ((reinterpret_cast<ext_toolbar_value_t *>(walker ->data))) : nullptr); | |||
| 460 | ||||
| 461 | QStandardItem * si = new QStandardItem(listvalue->display); | |||
| 462 | si->setData(VariantPointer<ext_toolbar_value_t>::asQVariant(listvalue), Qt::UserRole); | |||
| 463 | sourceModel->appendRow(si); | |||
| 464 | ||||
| 465 | if (listvalue->is_default) | |||
| 466 | selIndex = sourceModel->rowCount(); | |||
| 467 | ||||
| 468 | walker = gxx_list_next(walker)((walker) ? ((reinterpret_cast<GList *>(walker))->next ) : nullptr); | |||
| 469 | } | |||
| 470 | ||||
| 471 | myBox->setModel(sourceModel); | |||
| 472 | myBox->setCurrentIndex(selIndex); | |||
| 473 | ||||
| 474 | #ifdef Q_OS_MAC | |||
| 475 | myBox->setAttribute(Qt::WA_MacSmallSize, true); | |||
| 476 | #endif | |||
| 477 | ||||
| 478 | frame->layout()->addWidget(myBox); | |||
| 479 | ||||
| 480 | connect(myBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), | |||
| 481 | this, &AdditionalToolbarWidgetAction::onSelectionInWidgetChanged); | |||
| 482 | ||||
| 483 | ext_toolbar_register_update_cb(item, (ext_toolbar_action_cb)&toolbar_selector_cb, (void *)myBox); | |||
| 484 | ||||
| 485 | return frame; | |||
| 486 | } | |||
| 487 | ||||
| 488 | ext_toolbar_t * AdditionalToolbarWidgetAction::extractToolbarItemFromObject(QObject * object) | |||
| 489 | { | |||
| 490 | QWidget * widget = dynamic_cast<QWidget *>(object); | |||
| 491 | if (! widget) | |||
| 492 | return 0; | |||
| 493 | ||||
| 494 | QVariant propValue = widget->property(propertyName); | |||
| 495 | ||||
| 496 | /* If property is invalid, look if our parent has this property */ | |||
| 497 | if (! propValue.isValid()) | |||
| 498 | { | |||
| 499 | QWidget * frame = dynamic_cast<QWidget *>(widget->parent()); | |||
| 500 | if (! frame) | |||
| 501 | return 0; | |||
| 502 | ||||
| 503 | propValue = frame->property(propertyName); | |||
| 504 | } | |||
| 505 | ||||
| 506 | if (! propValue.isValid()) | |||
| 507 | return 0; | |||
| 508 | ||||
| 509 | return VariantPointer<ext_toolbar_t>::asPtr(propValue); | |||
| 510 | } | |||
| 511 | ||||
| 512 | void AdditionalToolbarWidgetAction::onButtonClicked() | |||
| 513 | { | |||
| 514 | ext_toolbar_t * item = extractToolbarItemFromObject(sender()); | |||
| 515 | if (! item) | |||
| 516 | return; | |||
| 517 | ||||
| 518 | item->callback(item, 0, item->user_data); | |||
| 519 | } | |||
| 520 | ||||
| 521 | #if QT_VERSION((6<<16)|(4<<8)|(2)) >= QT_VERSION_CHECK(6, 7, 0)((6<<16)|(7<<8)|(0)) | |||
| 522 | void AdditionalToolbarWidgetAction::onCheckBoxChecked(Qt::CheckState checkState) | |||
| 523 | #else | |||
| 524 | void AdditionalToolbarWidgetAction::onCheckBoxChecked(int checkState) | |||
| 525 | #endif | |||
| 526 | { | |||
| 527 | ext_toolbar_t * item = extractToolbarItemFromObject(sender()); | |||
| 528 | if (! item) | |||
| 529 | return; | |||
| 530 | ||||
| 531 | // Qt::PartiallyChecked is not a possibility? | |||
| 532 | bool value = checkState == Qt::Checked ? true : false; | |||
| 533 | ||||
| 534 | item->callback(item, &value, item->user_data); | |||
| 535 | } | |||
| 536 | ||||
| 537 | void AdditionalToolbarWidgetAction::sendTextToCallback() | |||
| 538 | { | |||
| 539 | ext_toolbar_t * item = extractToolbarItemFromObject(sender()); | |||
| 540 | if (! item) | |||
| 541 | return; | |||
| 542 | ||||
| 543 | if (item->item_type != EXT_TOOLBAR_STRING) | |||
| 544 | return; | |||
| 545 | ||||
| 546 | ApplyLineEdit * editor = dynamic_cast<ApplyLineEdit *>(sender()); | |||
| 547 | if (! editor) | |||
| 548 | { | |||
| 549 | /* Called from button, searching for accompanying line edit */ | |||
| 550 | QWidget * parent = dynamic_cast<QWidget *>(sender()->parent()); | |||
| 551 | if (parent) | |||
| 552 | { | |||
| 553 | QList<ApplyLineEdit *> children = parent->findChildren<ApplyLineEdit *>(); | |||
| 554 | if (children.count() >= 0) | |||
| 555 | editor = children.at(0); | |||
| 556 | } | |||
| 557 | } | |||
| 558 | ||||
| 559 | if (editor) | |||
| 560 | item->callback(item, qstring_strdup(editor->text()), item->user_data); | |||
| 561 | } | |||
| 562 | ||||
| 563 | void AdditionalToolbarWidgetAction::onSelectionInWidgetChanged(int idx) | |||
| 564 | { | |||
| 565 | QComboBox * editor = dynamic_cast<QComboBox *>(sender()); | |||
| 566 | ext_toolbar_t * item = extractToolbarItemFromObject(editor); | |||
| 567 | if (! item || item->item_type != EXT_TOOLBAR_SELECTOR) | |||
| 568 | return; | |||
| 569 | ||||
| 570 | QStandardItemModel * sourceModel = (QStandardItemModel *) editor->model(); | |||
| 571 | if (sourceModel->rowCount() <= idx) | |||
| 572 | return; | |||
| 573 | ||||
| 574 | QModelIndex mdIdx = sourceModel->index(idx, 0); | |||
| 575 | QVariant dataSet = sourceModel->data(mdIdx, Qt::UserRole); | |||
| 576 | if (dataSet.isValid()) | |||
| 577 | { | |||
| 578 | ext_toolbar_value_t * value_entry = VariantPointer<ext_toolbar_value_t>::asPtr(dataSet); | |||
| 579 | item->callback(item, value_entry, item->user_data); | |||
| 580 | } | |||
| 581 | } |