annotate view/PaneStack.cpp @ 855:57efeb75880d

Simplify some logic where loop was used with an unconditional "break" that meant it could only happen once (from coverity scan)
author Chris Cannam
date Wed, 03 Sep 2014 12:05:45 +0100
parents 4c8ca536b54f
children 99373ca20caf 4a578a360011
rev   line source
Chris@127 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@127 2
Chris@127 3 /*
Chris@127 4 Sonic Visualiser
Chris@127 5 An audio file viewer and annotation editor.
Chris@127 6 Centre for Digital Music, Queen Mary, University of London.
Chris@182 7 This file copyright 2006 Chris Cannam and QMUL.
Chris@127 8
Chris@127 9 This program is free software; you can redistribute it and/or
Chris@127 10 modify it under the terms of the GNU General Public License as
Chris@127 11 published by the Free Software Foundation; either version 2 of the
Chris@127 12 License, or (at your option) any later version. See the file
Chris@127 13 COPYING included with this distribution for more information.
Chris@127 14 */
Chris@127 15
Chris@127 16 #include "PaneStack.h"
Chris@127 17
Chris@128 18 #include "Pane.h"
Chris@127 19 #include "widgets/PropertyStack.h"
Chris@323 20 #include "widgets/IconLoader.h"
Chris@500 21 #include "widgets/ClickableLabel.h"
Chris@128 22 #include "layer/Layer.h"
Chris@128 23 #include "ViewManager.h"
Chris@127 24
Chris@127 25 #include <QApplication>
Chris@127 26 #include <QHBoxLayout>
Chris@323 27 #include <QVBoxLayout>
Chris@127 28 #include <QPainter>
Chris@127 29 #include <QPalette>
Chris@127 30 #include <QLabel>
Chris@323 31 #include <QPushButton>
Chris@127 32 #include <QSplitter>
Chris@127 33 #include <QStackedWidget>
Chris@127 34
Chris@127 35 #include <iostream>
Chris@127 36
Chris@247 37 //#define DEBUG_PANE_STACK 1
Chris@247 38
Chris@127 39 PaneStack::PaneStack(QWidget *parent, ViewManager *viewManager) :
Chris@127 40 QFrame(parent),
Chris@127 41 m_currentPane(0),
Chris@712 42 m_showAccessories(true),
Chris@127 43 m_splitter(new QSplitter),
Chris@127 44 m_propertyStackStack(new QStackedWidget),
Chris@127 45 m_viewManager(viewManager),
Chris@615 46 m_propertyStackMinWidth(100),
Chris@127 47 m_layoutStyle(PropertyStackPerPaneLayout)
Chris@127 48 {
Chris@127 49 QHBoxLayout *layout = new QHBoxLayout;
Chris@127 50 layout->setMargin(0);
Chris@127 51 layout->setSpacing(0);
Chris@127 52
Chris@127 53 m_splitter->setOrientation(Qt::Vertical);
Chris@127 54 m_splitter->setOpaqueResize(false);
Chris@127 55
Chris@127 56 layout->addWidget(m_splitter);
Chris@127 57 layout->setStretchFactor(m_splitter, 1);
Chris@127 58 layout->addWidget(m_propertyStackStack);
Chris@127 59 m_propertyStackStack->hide();
Chris@127 60
Chris@127 61 setLayout(layout);
Chris@127 62 }
Chris@127 63
Chris@712 64 void
Chris@712 65 PaneStack::setShowPaneAccessories(bool show)
Chris@712 66 {
Chris@712 67 m_showAccessories = show;
Chris@712 68 }
Chris@712 69
Chris@127 70 Pane *
Chris@127 71 PaneStack::addPane(bool suppressPropertyBox)
Chris@127 72 {
Chris@539 73 return insertPane(getPaneCount(), suppressPropertyBox);
Chris@539 74 }
Chris@539 75
Chris@539 76 Pane *
Chris@539 77 PaneStack::insertPane(int index, bool suppressPropertyBox)
Chris@539 78 {
Chris@127 79 QFrame *frame = new QFrame;
Chris@495 80
Chris@495 81 QGridLayout *layout = new QGridLayout;
Chris@127 82 layout->setMargin(0);
Chris@127 83 layout->setSpacing(2);
Chris@127 84
Chris@323 85 QPushButton *xButton = new QPushButton(frame);
Chris@323 86 xButton->setIcon(IconLoader().load("cross"));
Chris@323 87 xButton->setFixedSize(QSize(16, 16));
Chris@497 88 xButton->setFlat(true);
Chris@712 89 xButton->setVisible(m_showAccessories);
Chris@495 90 layout->addWidget(xButton, 0, 0);
Chris@323 91 connect(xButton, SIGNAL(clicked()), this, SLOT(paneDeleteButtonClicked()));
Chris@323 92
Chris@500 93 ClickableLabel *currentIndicator = new ClickableLabel(frame);
Chris@500 94 connect(currentIndicator, SIGNAL(clicked()), this, SLOT(indicatorClicked()));
Chris@495 95 layout->addWidget(currentIndicator, 1, 0);
Chris@495 96 layout->setRowStretch(1, 20);
Chris@497 97 currentIndicator->setMinimumWidth(8);
Chris@127 98 currentIndicator->setScaledContents(true);
Chris@712 99 currentIndicator->setVisible(m_showAccessories);
Chris@127 100
Chris@806 101 int initialCentreFrame = -1;
Chris@855 102 if (!m_panes.empty()) {
Chris@855 103 initialCentreFrame = m_panes[0].pane->getCentreFrame();
Chris@516 104 }
Chris@516 105
Chris@127 106 Pane *pane = new Pane(frame);
Chris@516 107 if (initialCentreFrame >= 0) {
Chris@516 108 pane->setViewManager(m_viewManager, initialCentreFrame);
Chris@516 109 } else {
Chris@516 110 pane->setViewManager(m_viewManager);
Chris@516 111 }
Chris@495 112 layout->addWidget(pane, 0, 1, 2, 1);
Chris@495 113 layout->setColumnStretch(1, 20);
Chris@127 114
Chris@127 115 QWidget *properties = 0;
Chris@127 116 if (suppressPropertyBox) {
Chris@127 117 properties = new QFrame();
Chris@127 118 } else {
Chris@127 119 properties = new PropertyStack(frame, pane);
Chris@127 120 connect(properties, SIGNAL(propertyContainerSelected(View *, PropertyContainer *)),
Chris@127 121 this, SLOT(propertyContainerSelected(View *, PropertyContainer *)));
Chris@190 122 connect(properties, SIGNAL(viewSelected(View *)),
Chris@190 123 this, SLOT(viewSelected(View *)));
Chris@189 124 connect(properties, SIGNAL(contextHelpChanged(const QString &)),
Chris@189 125 this, SIGNAL(contextHelpChanged(const QString &)));
Chris@127 126 }
Chris@127 127 if (m_layoutStyle == PropertyStackPerPaneLayout) {
Chris@495 128 layout->addWidget(properties, 0, 2, 2, 1);
Chris@127 129 } else {
Chris@127 130 properties->setParent(m_propertyStackStack);
Chris@127 131 m_propertyStackStack->addWidget(properties);
Chris@127 132 }
Chris@606 133 layout->setColumnStretch(2, 0);
Chris@127 134
Chris@127 135 PaneRec rec;
Chris@127 136 rec.pane = pane;
Chris@127 137 rec.propertyStack = properties;
Chris@605 138 rec.xButton = xButton;
Chris@127 139 rec.currentIndicator = currentIndicator;
Chris@127 140 rec.frame = frame;
Chris@127 141 rec.layout = layout;
Chris@127 142 m_panes.push_back(rec);
Chris@127 143
Chris@127 144 frame->setLayout(layout);
Chris@539 145 m_splitter->insertWidget(index, frame);
Chris@127 146
Chris@127 147 connect(pane, SIGNAL(propertyContainerAdded(PropertyContainer *)),
Chris@127 148 this, SLOT(propertyContainerAdded(PropertyContainer *)));
Chris@127 149 connect(pane, SIGNAL(propertyContainerRemoved(PropertyContainer *)),
Chris@127 150 this, SLOT(propertyContainerRemoved(PropertyContainer *)));
Chris@127 151 connect(pane, SIGNAL(paneInteractedWith()),
Chris@127 152 this, SLOT(paneInteractedWith()));
Chris@127 153 connect(pane, SIGNAL(rightButtonMenuRequested(QPoint)),
Chris@127 154 this, SLOT(rightButtonMenuRequested(QPoint)));
Chris@312 155 connect(pane, SIGNAL(dropAccepted(QStringList)),
Chris@312 156 this, SLOT(paneDropAccepted(QStringList)));
Chris@312 157 connect(pane, SIGNAL(dropAccepted(QString)),
Chris@312 158 this, SLOT(paneDropAccepted(QString)));
Chris@806 159 connect(pane, SIGNAL(doubleClickSelectInvoked(int)),
Chris@806 160 this, SIGNAL(doubleClickSelectInvoked(int)));
Chris@127 161
Chris@271 162 emit paneAdded(pane);
Chris@271 163 emit paneAdded();
Chris@271 164
Chris@127 165 if (!m_currentPane) {
Chris@127 166 setCurrentPane(pane);
Chris@127 167 }
Chris@127 168
Chris@605 169 showOrHidePaneAccessories();
Chris@605 170
Chris@127 171 return pane;
Chris@127 172 }
Chris@127 173
Chris@127 174 void
Chris@235 175 PaneStack::setPropertyStackMinWidth(int mw)
Chris@235 176 {
Chris@235 177 for (std::vector<PaneRec>::iterator i = m_panes.begin();
Chris@235 178 i != m_panes.end(); ++i) {
Chris@235 179 i->propertyStack->setMinimumWidth(mw);
Chris@235 180 }
Chris@235 181 m_propertyStackMinWidth = mw;
Chris@235 182 }
Chris@235 183
Chris@235 184 void
Chris@127 185 PaneStack::setLayoutStyle(LayoutStyle style)
Chris@127 186 {
Chris@127 187 if (style == m_layoutStyle) return;
Chris@127 188 m_layoutStyle = style;
Chris@127 189
Chris@127 190 std::vector<PaneRec>::iterator i;
Chris@127 191
Chris@127 192 switch (style) {
Chris@127 193
Chris@179 194 case NoPropertyStacks:
Chris@127 195 case SinglePropertyStackLayout:
Chris@127 196
Chris@127 197 for (i = m_panes.begin(); i != m_panes.end(); ++i) {
Chris@127 198 i->layout->removeWidget(i->propertyStack);
Chris@127 199 i->propertyStack->setParent(m_propertyStackStack);
Chris@127 200 m_propertyStackStack->addWidget(i->propertyStack);
Chris@127 201 }
Chris@179 202 m_propertyStackStack->setVisible(style != NoPropertyStacks);
Chris@127 203 break;
Chris@127 204
Chris@127 205 case PropertyStackPerPaneLayout:
Chris@127 206
Chris@127 207 for (i = m_panes.begin(); i != m_panes.end(); ++i) {
Chris@127 208 m_propertyStackStack->removeWidget(i->propertyStack);
Chris@127 209 i->propertyStack->setParent(i->frame);
Chris@495 210 i->layout->addWidget(i->propertyStack, 0, 2, 2, 1);
Chris@127 211 i->propertyStack->show();
Chris@127 212 }
Chris@127 213 m_propertyStackStack->hide();
Chris@127 214 break;
Chris@127 215 }
Chris@127 216 }
Chris@127 217
Chris@127 218 Pane *
Chris@127 219 PaneStack::getPane(int n)
Chris@127 220 {
Chris@806 221 if (n < (int)m_panes.size()) {
Chris@277 222 return m_panes[n].pane;
Chris@277 223 } else {
Chris@277 224 return 0;
Chris@277 225 }
Chris@277 226 }
Chris@277 227
Chris@277 228 int
Chris@277 229 PaneStack::getPaneIndex(Pane *pane)
Chris@277 230 {
Chris@277 231 for (int i = 0; i < getPaneCount(); ++i) {
Chris@277 232 if (pane == getPane(i)) {
Chris@277 233 return i;
Chris@277 234 }
Chris@277 235 }
Chris@277 236 return -1;
Chris@127 237 }
Chris@127 238
Chris@127 239 Pane *
Chris@127 240 PaneStack::getHiddenPane(int n)
Chris@127 241 {
Chris@127 242 return m_hiddenPanes[n].pane;
Chris@127 243 }
Chris@127 244
Chris@127 245 void
Chris@127 246 PaneStack::deletePane(Pane *pane)
Chris@127 247 {
Chris@729 248 cerr << "PaneStack::deletePane(" << pane << ")" << endl;
Chris@729 249
Chris@127 250 std::vector<PaneRec>::iterator i;
Chris@127 251 bool found = false;
Chris@127 252
Chris@729 253 QWidget *stack = 0;
Chris@729 254
Chris@127 255 for (i = m_panes.begin(); i != m_panes.end(); ++i) {
Chris@127 256 if (i->pane == pane) {
Chris@729 257 stack = i->propertyStack;
Chris@127 258 m_panes.erase(i);
Chris@127 259 found = true;
Chris@127 260 break;
Chris@127 261 }
Chris@127 262 }
Chris@127 263
Chris@127 264 if (!found) {
Chris@127 265
Chris@127 266 for (i = m_hiddenPanes.begin(); i != m_hiddenPanes.end(); ++i) {
Chris@127 267 if (i->pane == pane) {
Chris@729 268 stack = i->propertyStack;
Chris@127 269 m_hiddenPanes.erase(i);
Chris@127 270 found = true;
Chris@127 271 break;
Chris@127 272 }
Chris@127 273 }
Chris@127 274
Chris@127 275 if (!found) {
Chris@682 276 cerr << "WARNING: PaneStack::deletePane(" << pane << "): Pane not found in visible or hidden panes, not deleting" << endl;
Chris@127 277 return;
Chris@127 278 }
Chris@127 279 }
Chris@127 280
Chris@271 281 emit paneAboutToBeDeleted(pane);
Chris@271 282
Chris@729 283 cerr << "PaneStack::deletePane: about to delete parent " << pane->parent() << " of pane " << pane << endl;
Chris@729 284
Chris@729 285 // The property stack associated with the parent was initially
Chris@729 286 // created with the same parent as it, so it would be deleted when
Chris@729 287 // we delete the pane's parent in a moment -- but it may have been
Chris@729 288 // reparented depending on the layout. We'd better delete it
Chris@729 289 // separately first. (This fixes a crash on opening a new layer
Chris@729 290 // with a new unit type in it, when a long-defunct property box
Chris@729 291 // could be signalled from the unit database to tell it that a new
Chris@729 292 // unit had appeared.)
Chris@729 293 delete stack;
Chris@729 294
Chris@127 295 delete pane->parent();
Chris@127 296
Chris@127 297 if (m_currentPane == pane) {
Chris@127 298 if (m_panes.size() > 0) {
Chris@127 299 setCurrentPane(m_panes[0].pane);
Chris@127 300 } else {
Chris@127 301 setCurrentPane(0);
Chris@127 302 }
Chris@127 303 }
Chris@271 304
Chris@605 305 showOrHidePaneAccessories();
Chris@605 306
Chris@271 307 emit paneDeleted();
Chris@127 308 }
Chris@127 309
Chris@605 310 void
Chris@605 311 PaneStack::showOrHidePaneAccessories()
Chris@605 312 {
Chris@682 313 cerr << "PaneStack::showOrHidePaneAccessories: count == " << getPaneCount() << endl;
Chris@605 314
Chris@605 315 bool multi = (getPaneCount() > 1);
Chris@605 316 for (std::vector<PaneRec>::iterator i = m_panes.begin();
Chris@605 317 i != m_panes.end(); ++i) {
Chris@712 318 i->xButton->setVisible(multi && m_showAccessories);
Chris@712 319 i->currentIndicator->setVisible(multi && m_showAccessories);
Chris@605 320 }
Chris@605 321 }
Chris@605 322
Chris@127 323 int
Chris@127 324 PaneStack::getPaneCount() const
Chris@127 325 {
Chris@127 326 return m_panes.size();
Chris@127 327 }
Chris@127 328
Chris@127 329 int
Chris@127 330 PaneStack::getHiddenPaneCount() const
Chris@127 331 {
Chris@127 332 return m_hiddenPanes.size();
Chris@127 333 }
Chris@127 334
Chris@127 335 void
Chris@127 336 PaneStack::hidePane(Pane *pane)
Chris@127 337 {
Chris@127 338 std::vector<PaneRec>::iterator i = m_panes.begin();
Chris@127 339
Chris@127 340 while (i != m_panes.end()) {
Chris@127 341 if (i->pane == pane) {
Chris@127 342
Chris@127 343 m_hiddenPanes.push_back(*i);
Chris@127 344 m_panes.erase(i);
Chris@127 345
Chris@127 346 QWidget *pw = dynamic_cast<QWidget *>(pane->parent());
Chris@127 347 if (pw) pw->hide();
Chris@127 348
Chris@127 349 if (m_currentPane == pane) {
Chris@127 350 if (m_panes.size() > 0) {
Chris@127 351 setCurrentPane(m_panes[0].pane);
Chris@127 352 } else {
Chris@127 353 setCurrentPane(0);
Chris@127 354 }
Chris@127 355 }
Chris@127 356
Chris@605 357 showOrHidePaneAccessories();
Chris@605 358 emit paneHidden(pane);
Chris@605 359 emit paneHidden();
Chris@127 360 return;
Chris@127 361 }
Chris@127 362 ++i;
Chris@127 363 }
Chris@127 364
Chris@682 365 cerr << "WARNING: PaneStack::hidePane(" << pane << "): Pane not found in visible panes" << endl;
Chris@127 366 }
Chris@127 367
Chris@127 368 void
Chris@127 369 PaneStack::showPane(Pane *pane)
Chris@127 370 {
Chris@127 371 std::vector<PaneRec>::iterator i = m_hiddenPanes.begin();
Chris@127 372
Chris@127 373 while (i != m_hiddenPanes.end()) {
Chris@127 374 if (i->pane == pane) {
Chris@127 375 m_panes.push_back(*i);
Chris@127 376 m_hiddenPanes.erase(i);
Chris@127 377 QWidget *pw = dynamic_cast<QWidget *>(pane->parent());
Chris@127 378 if (pw) pw->show();
Chris@127 379
Chris@127 380 //!!! update current pane
Chris@127 381
Chris@605 382 showOrHidePaneAccessories();
Chris@605 383
Chris@127 384 return;
Chris@127 385 }
Chris@127 386 ++i;
Chris@127 387 }
Chris@127 388
Chris@682 389 cerr << "WARNING: PaneStack::showPane(" << pane << "): Pane not found in hidden panes" << endl;
Chris@127 390 }
Chris@127 391
Chris@127 392 void
Chris@127 393 PaneStack::setCurrentPane(Pane *pane) // may be null
Chris@127 394 {
Chris@127 395 if (m_currentPane == pane) return;
Chris@127 396
Chris@127 397 std::vector<PaneRec>::iterator i = m_panes.begin();
Chris@127 398
Chris@127 399 // We used to do this by setting the foreground and background
Chris@127 400 // role, but it seems the background role is ignored and the
Chris@127 401 // background drawn transparent in Qt 4.1 -- I can't quite see why
Chris@127 402
Chris@127 403 QPixmap selectedMap(1, 1);
Chris@127 404 selectedMap.fill(QApplication::palette().color(QPalette::Foreground));
Chris@127 405
Chris@127 406 QPixmap unselectedMap(1, 1);
Chris@127 407 unselectedMap.fill(QApplication::palette().color(QPalette::Background));
Chris@127 408
Chris@127 409 bool found = false;
Chris@127 410
Chris@127 411 while (i != m_panes.end()) {
Chris@127 412 if (i->pane == pane) {
Chris@127 413 i->currentIndicator->setPixmap(selectedMap);
Chris@179 414 if (m_layoutStyle != PropertyStackPerPaneLayout) {
Chris@127 415 m_propertyStackStack->setCurrentWidget(i->propertyStack);
Chris@127 416 }
Chris@127 417 found = true;
Chris@127 418 } else {
Chris@127 419 i->currentIndicator->setPixmap(unselectedMap);
Chris@127 420 }
Chris@127 421 ++i;
Chris@127 422 }
Chris@127 423
Chris@127 424 if (found || pane == 0) {
Chris@127 425 m_currentPane = pane;
Chris@127 426 emit currentPaneChanged(m_currentPane);
Chris@127 427 } else {
Chris@682 428 cerr << "WARNING: PaneStack::setCurrentPane(" << pane << "): pane is not a visible pane in this stack" << endl;
Chris@127 429 }
Chris@127 430 }
Chris@127 431
Chris@127 432 void
Chris@127 433 PaneStack::setCurrentLayer(Pane *pane, Layer *layer) // may be null
Chris@127 434 {
Chris@127 435 setCurrentPane(pane);
Chris@127 436
Chris@127 437 if (m_currentPane) {
Chris@127 438
Chris@127 439 std::vector<PaneRec>::iterator i = m_panes.begin();
Chris@127 440
Chris@127 441 while (i != m_panes.end()) {
Chris@127 442
Chris@127 443 if (i->pane == pane) {
Chris@127 444 PropertyStack *stack = dynamic_cast<PropertyStack *>
Chris@127 445 (i->propertyStack);
Chris@127 446 if (stack) {
Chris@127 447 if (stack->containsContainer(layer)) {
Chris@127 448 stack->setCurrentIndex(stack->getContainerIndex(layer));
Chris@127 449 emit currentLayerChanged(pane, layer);
Chris@127 450 } else {
Chris@127 451 stack->setCurrentIndex
Chris@127 452 (stack->getContainerIndex
Chris@127 453 (pane->getPropertyContainer(0)));
Chris@127 454 emit currentLayerChanged(pane, 0);
Chris@127 455 }
Chris@127 456 }
Chris@127 457 break;
Chris@127 458 }
Chris@127 459 ++i;
Chris@127 460 }
Chris@127 461 }
Chris@127 462 }
Chris@127 463
Chris@127 464 Pane *
Chris@127 465 PaneStack::getCurrentPane()
Chris@127 466 {
Chris@127 467 return m_currentPane;
Chris@127 468 }
Chris@127 469
Chris@127 470 void
Chris@127 471 PaneStack::propertyContainerAdded(PropertyContainer *)
Chris@127 472 {
Chris@127 473 sizePropertyStacks();
Chris@127 474 }
Chris@127 475
Chris@127 476 void
Chris@127 477 PaneStack::propertyContainerRemoved(PropertyContainer *)
Chris@127 478 {
Chris@127 479 sizePropertyStacks();
Chris@127 480 }
Chris@127 481
Chris@127 482 void
Chris@127 483 PaneStack::propertyContainerSelected(View *client, PropertyContainer *pc)
Chris@127 484 {
Chris@127 485 std::vector<PaneRec>::iterator i = m_panes.begin();
Chris@127 486
Chris@127 487 while (i != m_panes.end()) {
Chris@127 488 PropertyStack *stack = dynamic_cast<PropertyStack *>(i->propertyStack);
Chris@127 489 if (stack &&
Chris@127 490 stack->getClient() == client &&
Chris@127 491 stack->containsContainer(pc)) {
Chris@127 492 setCurrentPane(i->pane);
Chris@127 493 break;
Chris@127 494 }
Chris@127 495 ++i;
Chris@127 496 }
Chris@127 497
Chris@127 498 Layer *layer = dynamic_cast<Layer *>(pc);
Chris@127 499 if (layer) emit currentLayerChanged(m_currentPane, layer);
Chris@127 500 else emit currentLayerChanged(m_currentPane, 0);
Chris@127 501 }
Chris@127 502
Chris@127 503 void
Chris@190 504 PaneStack::viewSelected(View *v)
Chris@190 505 {
Chris@190 506 Pane *p = dynamic_cast<Pane *>(v);
Chris@190 507 if (p) setCurrentPane(p);
Chris@190 508 }
Chris@190 509
Chris@190 510 void
Chris@127 511 PaneStack::paneInteractedWith()
Chris@127 512 {
Chris@127 513 Pane *pane = dynamic_cast<Pane *>(sender());
Chris@127 514 if (!pane) return;
Chris@127 515 setCurrentPane(pane);
Chris@127 516 }
Chris@127 517
Chris@127 518 void
Chris@127 519 PaneStack::rightButtonMenuRequested(QPoint position)
Chris@127 520 {
Chris@127 521 Pane *pane = dynamic_cast<Pane *>(sender());
Chris@127 522 if (!pane) return;
Chris@127 523 emit rightButtonMenuRequested(pane, position);
Chris@127 524 }
Chris@127 525
Chris@127 526 void
Chris@127 527 PaneStack::sizePropertyStacks()
Chris@127 528 {
Chris@127 529 int maxMinWidth = 0;
Chris@127 530
Chris@235 531 if (m_propertyStackMinWidth > 0) maxMinWidth = m_propertyStackMinWidth;
Chris@235 532
Chris@806 533 for (int i = 0; i < (int)m_panes.size(); ++i) {
Chris@127 534 if (!m_panes[i].propertyStack) continue;
Chris@247 535 #ifdef DEBUG_PANE_STACK
Chris@587 536 SVDEBUG << "PaneStack::sizePropertyStacks: " << i << ": min "
Chris@243 537 << m_panes[i].propertyStack->minimumSizeHint().width() << ", hint "
Chris@243 538 << m_panes[i].propertyStack->sizeHint().width() << ", current "
Chris@585 539 << m_panes[i].propertyStack->width() << endl;
Chris@247 540 #endif
Chris@127 541
Chris@246 542 if (m_panes[i].propertyStack->sizeHint().width() > maxMinWidth) {
Chris@246 543 maxMinWidth = m_panes[i].propertyStack->sizeHint().width();
Chris@127 544 }
Chris@127 545 }
Chris@127 546
Chris@247 547 #ifdef DEBUG_PANE_STACK
Chris@587 548 SVDEBUG << "PaneStack::sizePropertyStacks: max min width " << maxMinWidth << endl;
Chris@247 549 #endif
Chris@127 550
Chris@127 551 int setWidth = maxMinWidth;
Chris@127 552
Chris@127 553 m_propertyStackStack->setMaximumWidth(setWidth + 10);
Chris@127 554
Chris@806 555 for (int i = 0; i < (int)m_panes.size(); ++i) {
Chris@127 556 if (!m_panes[i].propertyStack) continue;
Chris@127 557 m_panes[i].propertyStack->setMinimumWidth(setWidth);
Chris@127 558 }
Chris@180 559
Chris@363 560 emit propertyStacksResized(setWidth);
Chris@180 561 emit propertyStacksResized();
Chris@127 562 }
Chris@127 563
Chris@312 564 void
Chris@312 565 PaneStack::paneDropAccepted(QStringList uriList)
Chris@312 566 {
Chris@312 567 Pane *pane = dynamic_cast<Pane *>(sender());
Chris@312 568 emit dropAccepted(pane, uriList);
Chris@312 569 }
Chris@312 570
Chris@312 571 void
Chris@312 572 PaneStack::paneDropAccepted(QString text)
Chris@312 573 {
Chris@312 574 Pane *pane = dynamic_cast<Pane *>(sender());
Chris@312 575 emit dropAccepted(pane, text);
Chris@312 576 }
Chris@127 577
Chris@320 578 void
Chris@323 579 PaneStack::paneDeleteButtonClicked()
Chris@323 580 {
Chris@323 581 QObject *s = sender();
Chris@806 582 for (int i = 0; i < (int)m_panes.size(); ++i) {
Chris@605 583 if (m_panes[i].xButton == s) {
Chris@605 584 emit paneDeleteButtonClicked(m_panes[i].pane);
Chris@323 585 }
Chris@323 586 }
Chris@323 587 }
Chris@323 588
Chris@323 589 void
Chris@500 590 PaneStack::indicatorClicked()
Chris@500 591 {
Chris@500 592 QObject *s = sender();
Chris@500 593
Chris@806 594 for (int i = 0; i < (int)m_panes.size(); ++i) {
Chris@500 595 if (m_panes[i].currentIndicator == s) {
Chris@500 596 setCurrentPane(m_panes[i].pane);
Chris@500 597 return;
Chris@500 598 }
Chris@500 599 }
Chris@500 600 }
Chris@500 601
Chris@500 602 void
Chris@320 603 PaneStack::sizePanesEqually()
Chris@320 604 {
Chris@320 605 QList<int> sizes = m_splitter->sizes();
Chris@320 606 if (sizes.empty()) return;
Chris@320 607
Chris@320 608 int count = sizes.size();
Chris@320 609
Chris@687 610 int fixed = 0, variable = 0, total = 0;
Chris@687 611 int varicount = 0;
Chris@687 612
Chris@320 613 for (int i = 0; i < count; ++i) {
Chris@320 614 total += sizes[i];
Chris@320 615 }
Chris@320 616
Chris@687 617 variable = total;
Chris@687 618
Chris@687 619 for (int i = 0; i < count; ++i) {
Chris@687 620 int minh = m_panes[i].pane->minimumSize().height();
Chris@687 621 if (minh == m_panes[i].pane->maximumSize().height()) {
Chris@687 622 fixed += minh;
Chris@687 623 variable -= minh;
Chris@687 624 } else {
Chris@687 625 varicount++;
Chris@687 626 }
Chris@687 627 }
Chris@687 628
Chris@320 629 if (total == 0) return;
Chris@320 630
Chris@320 631 sizes.clear();
Chris@320 632
Chris@687 633 int each = (varicount > 0 ? (variable / varicount) : 0);
Chris@320 634 int remaining = total;
Chris@320 635
Chris@320 636 for (int i = 0; i < count; ++i) {
Chris@320 637 if (i == count - 1) {
Chris@320 638 sizes.push_back(remaining);
Chris@320 639 } else {
Chris@687 640 int minh = m_panes[i].pane->minimumSize().height();
Chris@687 641 if (minh == m_panes[i].pane->maximumSize().height()) {
Chris@687 642 sizes.push_back(minh);
Chris@687 643 remaining -= minh;
Chris@687 644 } else {
Chris@687 645 sizes.push_back(each);
Chris@687 646 remaining -= each;
Chris@687 647 }
Chris@320 648 }
Chris@320 649 }
Chris@320 650
Chris@320 651 /*
Chris@682 652 cerr << "sizes: ";
Chris@320 653 for (int i = 0; i < sizes.size(); ++i) {
Chris@682 654 cerr << sizes[i] << " ";
Chris@320 655 }
Chris@682 656 cerr << endl;
Chris@320 657 */
Chris@320 658
Chris@320 659 m_splitter->setSizes(sizes);
Chris@320 660 }
Chris@320 661