annotate view/PaneStack.cpp @ 606:fbab21439115

Column stretch 0 avoids spare empty space at the right when property boxes are off
author Chris Cannam
date Mon, 30 Jan 2012 13:24:55 +0000
parents a7a89ebe4b02
children 156a120345ae
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@127 42 m_splitter(new QSplitter),
Chris@127 43 m_propertyStackStack(new QStackedWidget),
Chris@127 44 m_viewManager(viewManager),
Chris@127 45 m_layoutStyle(PropertyStackPerPaneLayout)
Chris@127 46 {
Chris@127 47 QHBoxLayout *layout = new QHBoxLayout;
Chris@127 48 layout->setMargin(0);
Chris@127 49 layout->setSpacing(0);
Chris@127 50
Chris@127 51 m_splitter->setOrientation(Qt::Vertical);
Chris@127 52 m_splitter->setOpaqueResize(false);
Chris@127 53
Chris@127 54 layout->addWidget(m_splitter);
Chris@127 55 layout->setStretchFactor(m_splitter, 1);
Chris@127 56 layout->addWidget(m_propertyStackStack);
Chris@127 57 m_propertyStackStack->hide();
Chris@127 58
Chris@127 59 setLayout(layout);
Chris@127 60 }
Chris@127 61
Chris@127 62 Pane *
Chris@127 63 PaneStack::addPane(bool suppressPropertyBox)
Chris@127 64 {
Chris@539 65 return insertPane(getPaneCount(), suppressPropertyBox);
Chris@539 66 }
Chris@539 67
Chris@539 68 Pane *
Chris@539 69 PaneStack::insertPane(int index, bool suppressPropertyBox)
Chris@539 70 {
Chris@127 71 QFrame *frame = new QFrame;
Chris@495 72
Chris@495 73 QGridLayout *layout = new QGridLayout;
Chris@127 74 layout->setMargin(0);
Chris@127 75 layout->setSpacing(2);
Chris@127 76
Chris@323 77 QPushButton *xButton = new QPushButton(frame);
Chris@323 78 xButton->setIcon(IconLoader().load("cross"));
Chris@323 79 xButton->setFixedSize(QSize(16, 16));
Chris@497 80 xButton->setFlat(true);
Chris@495 81 layout->addWidget(xButton, 0, 0);
Chris@323 82 connect(xButton, SIGNAL(clicked()), this, SLOT(paneDeleteButtonClicked()));
Chris@323 83
Chris@500 84 ClickableLabel *currentIndicator = new ClickableLabel(frame);
Chris@500 85 connect(currentIndicator, SIGNAL(clicked()), this, SLOT(indicatorClicked()));
Chris@495 86 layout->addWidget(currentIndicator, 1, 0);
Chris@495 87 layout->setRowStretch(1, 20);
Chris@497 88 currentIndicator->setMinimumWidth(8);
Chris@127 89 currentIndicator->setScaledContents(true);
Chris@127 90
Chris@516 91 long initialCentreFrame = -1;
Chris@516 92 for (int i = 0; i < m_panes.size(); ++i) {
Chris@516 93 long f = m_panes[i].pane->getCentreFrame();
Chris@516 94 initialCentreFrame = f;
Chris@516 95 break;
Chris@516 96 }
Chris@516 97
Chris@127 98 Pane *pane = new Pane(frame);
Chris@516 99 if (initialCentreFrame >= 0) {
Chris@516 100 pane->setViewManager(m_viewManager, initialCentreFrame);
Chris@516 101 } else {
Chris@516 102 pane->setViewManager(m_viewManager);
Chris@516 103 }
Chris@495 104 layout->addWidget(pane, 0, 1, 2, 1);
Chris@495 105 layout->setColumnStretch(1, 20);
Chris@127 106
Chris@127 107 QWidget *properties = 0;
Chris@127 108 if (suppressPropertyBox) {
Chris@127 109 properties = new QFrame();
Chris@127 110 } else {
Chris@127 111 properties = new PropertyStack(frame, pane);
Chris@127 112 connect(properties, SIGNAL(propertyContainerSelected(View *, PropertyContainer *)),
Chris@127 113 this, SLOT(propertyContainerSelected(View *, PropertyContainer *)));
Chris@190 114 connect(properties, SIGNAL(viewSelected(View *)),
Chris@190 115 this, SLOT(viewSelected(View *)));
Chris@189 116 connect(properties, SIGNAL(contextHelpChanged(const QString &)),
Chris@189 117 this, SIGNAL(contextHelpChanged(const QString &)));
Chris@127 118 }
Chris@127 119 if (m_layoutStyle == PropertyStackPerPaneLayout) {
Chris@495 120 layout->addWidget(properties, 0, 2, 2, 1);
Chris@127 121 } else {
Chris@127 122 properties->setParent(m_propertyStackStack);
Chris@127 123 m_propertyStackStack->addWidget(properties);
Chris@127 124 }
Chris@606 125 layout->setColumnStretch(2, 0);
Chris@127 126
Chris@127 127 PaneRec rec;
Chris@127 128 rec.pane = pane;
Chris@127 129 rec.propertyStack = properties;
Chris@605 130 rec.xButton = xButton;
Chris@127 131 rec.currentIndicator = currentIndicator;
Chris@127 132 rec.frame = frame;
Chris@127 133 rec.layout = layout;
Chris@127 134 m_panes.push_back(rec);
Chris@127 135
Chris@127 136 frame->setLayout(layout);
Chris@539 137 m_splitter->insertWidget(index, frame);
Chris@127 138
Chris@127 139 connect(pane, SIGNAL(propertyContainerAdded(PropertyContainer *)),
Chris@127 140 this, SLOT(propertyContainerAdded(PropertyContainer *)));
Chris@127 141 connect(pane, SIGNAL(propertyContainerRemoved(PropertyContainer *)),
Chris@127 142 this, SLOT(propertyContainerRemoved(PropertyContainer *)));
Chris@127 143 connect(pane, SIGNAL(paneInteractedWith()),
Chris@127 144 this, SLOT(paneInteractedWith()));
Chris@127 145 connect(pane, SIGNAL(rightButtonMenuRequested(QPoint)),
Chris@127 146 this, SLOT(rightButtonMenuRequested(QPoint)));
Chris@312 147 connect(pane, SIGNAL(dropAccepted(QStringList)),
Chris@312 148 this, SLOT(paneDropAccepted(QStringList)));
Chris@312 149 connect(pane, SIGNAL(dropAccepted(QString)),
Chris@312 150 this, SLOT(paneDropAccepted(QString)));
Chris@127 151
Chris@271 152 emit paneAdded(pane);
Chris@271 153 emit paneAdded();
Chris@271 154
Chris@127 155 if (!m_currentPane) {
Chris@127 156 setCurrentPane(pane);
Chris@127 157 }
Chris@127 158
Chris@605 159 showOrHidePaneAccessories();
Chris@605 160
Chris@127 161 return pane;
Chris@127 162 }
Chris@127 163
Chris@127 164 void
Chris@235 165 PaneStack::setPropertyStackMinWidth(int mw)
Chris@235 166 {
Chris@235 167 for (std::vector<PaneRec>::iterator i = m_panes.begin();
Chris@235 168 i != m_panes.end(); ++i) {
Chris@235 169 i->propertyStack->setMinimumWidth(mw);
Chris@235 170 }
Chris@235 171 m_propertyStackMinWidth = mw;
Chris@235 172 }
Chris@235 173
Chris@235 174 void
Chris@127 175 PaneStack::setLayoutStyle(LayoutStyle style)
Chris@127 176 {
Chris@127 177 if (style == m_layoutStyle) return;
Chris@127 178 m_layoutStyle = style;
Chris@127 179
Chris@127 180 std::vector<PaneRec>::iterator i;
Chris@127 181
Chris@127 182 switch (style) {
Chris@127 183
Chris@179 184 case NoPropertyStacks:
Chris@127 185 case SinglePropertyStackLayout:
Chris@127 186
Chris@127 187 for (i = m_panes.begin(); i != m_panes.end(); ++i) {
Chris@127 188 i->layout->removeWidget(i->propertyStack);
Chris@127 189 i->propertyStack->setParent(m_propertyStackStack);
Chris@127 190 m_propertyStackStack->addWidget(i->propertyStack);
Chris@127 191 }
Chris@179 192 m_propertyStackStack->setVisible(style != NoPropertyStacks);
Chris@127 193 break;
Chris@127 194
Chris@127 195 case PropertyStackPerPaneLayout:
Chris@127 196
Chris@127 197 for (i = m_panes.begin(); i != m_panes.end(); ++i) {
Chris@127 198 m_propertyStackStack->removeWidget(i->propertyStack);
Chris@127 199 i->propertyStack->setParent(i->frame);
Chris@495 200 i->layout->addWidget(i->propertyStack, 0, 2, 2, 1);
Chris@127 201 i->propertyStack->show();
Chris@127 202 }
Chris@127 203 m_propertyStackStack->hide();
Chris@127 204 break;
Chris@127 205 }
Chris@127 206 }
Chris@127 207
Chris@127 208 Pane *
Chris@127 209 PaneStack::getPane(int n)
Chris@127 210 {
Chris@277 211 if (n < m_panes.size()) {
Chris@277 212 return m_panes[n].pane;
Chris@277 213 } else {
Chris@277 214 return 0;
Chris@277 215 }
Chris@277 216 }
Chris@277 217
Chris@277 218 int
Chris@277 219 PaneStack::getPaneIndex(Pane *pane)
Chris@277 220 {
Chris@277 221 for (int i = 0; i < getPaneCount(); ++i) {
Chris@277 222 if (pane == getPane(i)) {
Chris@277 223 return i;
Chris@277 224 }
Chris@277 225 }
Chris@277 226 return -1;
Chris@127 227 }
Chris@127 228
Chris@127 229 Pane *
Chris@127 230 PaneStack::getHiddenPane(int n)
Chris@127 231 {
Chris@127 232 return m_hiddenPanes[n].pane;
Chris@127 233 }
Chris@127 234
Chris@127 235 void
Chris@127 236 PaneStack::deletePane(Pane *pane)
Chris@127 237 {
Chris@127 238 std::vector<PaneRec>::iterator i;
Chris@127 239 bool found = false;
Chris@127 240
Chris@127 241 for (i = m_panes.begin(); i != m_panes.end(); ++i) {
Chris@127 242 if (i->pane == pane) {
Chris@127 243 m_panes.erase(i);
Chris@127 244 found = true;
Chris@127 245 break;
Chris@127 246 }
Chris@127 247 }
Chris@127 248
Chris@127 249 if (!found) {
Chris@127 250
Chris@127 251 for (i = m_hiddenPanes.begin(); i != m_hiddenPanes.end(); ++i) {
Chris@127 252 if (i->pane == pane) {
Chris@127 253 m_hiddenPanes.erase(i);
Chris@127 254 found = true;
Chris@127 255 break;
Chris@127 256 }
Chris@127 257 }
Chris@127 258
Chris@127 259 if (!found) {
Chris@127 260 std::cerr << "WARNING: PaneStack::deletePane(" << pane << "): Pane not found in visible or hidden panes, not deleting" << std::endl;
Chris@127 261 return;
Chris@127 262 }
Chris@127 263 }
Chris@127 264
Chris@271 265 emit paneAboutToBeDeleted(pane);
Chris@271 266
Chris@127 267 delete pane->parent();
Chris@127 268
Chris@127 269 if (m_currentPane == pane) {
Chris@127 270 if (m_panes.size() > 0) {
Chris@127 271 setCurrentPane(m_panes[0].pane);
Chris@127 272 } else {
Chris@127 273 setCurrentPane(0);
Chris@127 274 }
Chris@127 275 }
Chris@271 276
Chris@605 277 showOrHidePaneAccessories();
Chris@605 278
Chris@271 279 emit paneDeleted();
Chris@127 280 }
Chris@127 281
Chris@605 282 void
Chris@605 283 PaneStack::showOrHidePaneAccessories()
Chris@605 284 {
Chris@605 285 std::cerr << "PaneStack::showOrHidePaneAccessories: count == " << getPaneCount() << std::endl;
Chris@605 286
Chris@605 287 bool multi = (getPaneCount() > 1);
Chris@605 288 for (std::vector<PaneRec>::iterator i = m_panes.begin();
Chris@605 289 i != m_panes.end(); ++i) {
Chris@605 290 i->xButton->setVisible(multi);
Chris@605 291 i->currentIndicator->setVisible(multi);
Chris@605 292 }
Chris@605 293 }
Chris@605 294
Chris@127 295 int
Chris@127 296 PaneStack::getPaneCount() const
Chris@127 297 {
Chris@127 298 return m_panes.size();
Chris@127 299 }
Chris@127 300
Chris@127 301 int
Chris@127 302 PaneStack::getHiddenPaneCount() const
Chris@127 303 {
Chris@127 304 return m_hiddenPanes.size();
Chris@127 305 }
Chris@127 306
Chris@127 307 void
Chris@127 308 PaneStack::hidePane(Pane *pane)
Chris@127 309 {
Chris@127 310 std::vector<PaneRec>::iterator i = m_panes.begin();
Chris@127 311
Chris@127 312 while (i != m_panes.end()) {
Chris@127 313 if (i->pane == pane) {
Chris@127 314
Chris@127 315 m_hiddenPanes.push_back(*i);
Chris@127 316 m_panes.erase(i);
Chris@127 317
Chris@127 318 QWidget *pw = dynamic_cast<QWidget *>(pane->parent());
Chris@127 319 if (pw) pw->hide();
Chris@127 320
Chris@127 321 if (m_currentPane == pane) {
Chris@127 322 if (m_panes.size() > 0) {
Chris@127 323 setCurrentPane(m_panes[0].pane);
Chris@127 324 } else {
Chris@127 325 setCurrentPane(0);
Chris@127 326 }
Chris@127 327 }
Chris@127 328
Chris@605 329 showOrHidePaneAccessories();
Chris@605 330 emit paneHidden(pane);
Chris@605 331 emit paneHidden();
Chris@127 332 return;
Chris@127 333 }
Chris@127 334 ++i;
Chris@127 335 }
Chris@127 336
Chris@127 337 std::cerr << "WARNING: PaneStack::hidePane(" << pane << "): Pane not found in visible panes" << std::endl;
Chris@127 338 }
Chris@127 339
Chris@127 340 void
Chris@127 341 PaneStack::showPane(Pane *pane)
Chris@127 342 {
Chris@127 343 std::vector<PaneRec>::iterator i = m_hiddenPanes.begin();
Chris@127 344
Chris@127 345 while (i != m_hiddenPanes.end()) {
Chris@127 346 if (i->pane == pane) {
Chris@127 347 m_panes.push_back(*i);
Chris@127 348 m_hiddenPanes.erase(i);
Chris@127 349 QWidget *pw = dynamic_cast<QWidget *>(pane->parent());
Chris@127 350 if (pw) pw->show();
Chris@127 351
Chris@127 352 //!!! update current pane
Chris@127 353
Chris@605 354 showOrHidePaneAccessories();
Chris@605 355
Chris@127 356 return;
Chris@127 357 }
Chris@127 358 ++i;
Chris@127 359 }
Chris@127 360
Chris@127 361 std::cerr << "WARNING: PaneStack::showPane(" << pane << "): Pane not found in hidden panes" << std::endl;
Chris@127 362 }
Chris@127 363
Chris@127 364 void
Chris@127 365 PaneStack::setCurrentPane(Pane *pane) // may be null
Chris@127 366 {
Chris@127 367 if (m_currentPane == pane) return;
Chris@127 368
Chris@127 369 std::vector<PaneRec>::iterator i = m_panes.begin();
Chris@127 370
Chris@127 371 // We used to do this by setting the foreground and background
Chris@127 372 // role, but it seems the background role is ignored and the
Chris@127 373 // background drawn transparent in Qt 4.1 -- I can't quite see why
Chris@127 374
Chris@127 375 QPixmap selectedMap(1, 1);
Chris@127 376 selectedMap.fill(QApplication::palette().color(QPalette::Foreground));
Chris@127 377
Chris@127 378 QPixmap unselectedMap(1, 1);
Chris@127 379 unselectedMap.fill(QApplication::palette().color(QPalette::Background));
Chris@127 380
Chris@127 381 bool found = false;
Chris@127 382
Chris@127 383 while (i != m_panes.end()) {
Chris@127 384 if (i->pane == pane) {
Chris@127 385 i->currentIndicator->setPixmap(selectedMap);
Chris@179 386 if (m_layoutStyle != PropertyStackPerPaneLayout) {
Chris@127 387 m_propertyStackStack->setCurrentWidget(i->propertyStack);
Chris@127 388 }
Chris@127 389 found = true;
Chris@127 390 } else {
Chris@127 391 i->currentIndicator->setPixmap(unselectedMap);
Chris@127 392 }
Chris@127 393 ++i;
Chris@127 394 }
Chris@127 395
Chris@127 396 if (found || pane == 0) {
Chris@127 397 m_currentPane = pane;
Chris@127 398 emit currentPaneChanged(m_currentPane);
Chris@127 399 } else {
Chris@127 400 std::cerr << "WARNING: PaneStack::setCurrentPane(" << pane << "): pane is not a visible pane in this stack" << std::endl;
Chris@127 401 }
Chris@127 402 }
Chris@127 403
Chris@127 404 void
Chris@127 405 PaneStack::setCurrentLayer(Pane *pane, Layer *layer) // may be null
Chris@127 406 {
Chris@127 407 setCurrentPane(pane);
Chris@127 408
Chris@127 409 if (m_currentPane) {
Chris@127 410
Chris@127 411 std::vector<PaneRec>::iterator i = m_panes.begin();
Chris@127 412
Chris@127 413 while (i != m_panes.end()) {
Chris@127 414
Chris@127 415 if (i->pane == pane) {
Chris@127 416 PropertyStack *stack = dynamic_cast<PropertyStack *>
Chris@127 417 (i->propertyStack);
Chris@127 418 if (stack) {
Chris@127 419 if (stack->containsContainer(layer)) {
Chris@127 420 stack->setCurrentIndex(stack->getContainerIndex(layer));
Chris@127 421 emit currentLayerChanged(pane, layer);
Chris@127 422 } else {
Chris@127 423 stack->setCurrentIndex
Chris@127 424 (stack->getContainerIndex
Chris@127 425 (pane->getPropertyContainer(0)));
Chris@127 426 emit currentLayerChanged(pane, 0);
Chris@127 427 }
Chris@127 428 }
Chris@127 429 break;
Chris@127 430 }
Chris@127 431 ++i;
Chris@127 432 }
Chris@127 433 }
Chris@127 434 }
Chris@127 435
Chris@127 436 Pane *
Chris@127 437 PaneStack::getCurrentPane()
Chris@127 438 {
Chris@127 439 return m_currentPane;
Chris@127 440 }
Chris@127 441
Chris@127 442 void
Chris@127 443 PaneStack::propertyContainerAdded(PropertyContainer *)
Chris@127 444 {
Chris@127 445 sizePropertyStacks();
Chris@127 446 }
Chris@127 447
Chris@127 448 void
Chris@127 449 PaneStack::propertyContainerRemoved(PropertyContainer *)
Chris@127 450 {
Chris@127 451 sizePropertyStacks();
Chris@127 452 }
Chris@127 453
Chris@127 454 void
Chris@127 455 PaneStack::propertyContainerSelected(View *client, PropertyContainer *pc)
Chris@127 456 {
Chris@127 457 std::vector<PaneRec>::iterator i = m_panes.begin();
Chris@127 458
Chris@127 459 while (i != m_panes.end()) {
Chris@127 460 PropertyStack *stack = dynamic_cast<PropertyStack *>(i->propertyStack);
Chris@127 461 if (stack &&
Chris@127 462 stack->getClient() == client &&
Chris@127 463 stack->containsContainer(pc)) {
Chris@127 464 setCurrentPane(i->pane);
Chris@127 465 break;
Chris@127 466 }
Chris@127 467 ++i;
Chris@127 468 }
Chris@127 469
Chris@127 470 Layer *layer = dynamic_cast<Layer *>(pc);
Chris@127 471 if (layer) emit currentLayerChanged(m_currentPane, layer);
Chris@127 472 else emit currentLayerChanged(m_currentPane, 0);
Chris@127 473 }
Chris@127 474
Chris@127 475 void
Chris@190 476 PaneStack::viewSelected(View *v)
Chris@190 477 {
Chris@190 478 Pane *p = dynamic_cast<Pane *>(v);
Chris@190 479 if (p) setCurrentPane(p);
Chris@190 480 }
Chris@190 481
Chris@190 482 void
Chris@127 483 PaneStack::paneInteractedWith()
Chris@127 484 {
Chris@127 485 Pane *pane = dynamic_cast<Pane *>(sender());
Chris@127 486 if (!pane) return;
Chris@127 487 setCurrentPane(pane);
Chris@127 488 }
Chris@127 489
Chris@127 490 void
Chris@127 491 PaneStack::rightButtonMenuRequested(QPoint position)
Chris@127 492 {
Chris@127 493 Pane *pane = dynamic_cast<Pane *>(sender());
Chris@127 494 if (!pane) return;
Chris@127 495 emit rightButtonMenuRequested(pane, position);
Chris@127 496 }
Chris@127 497
Chris@127 498 void
Chris@127 499 PaneStack::sizePropertyStacks()
Chris@127 500 {
Chris@127 501 int maxMinWidth = 0;
Chris@127 502
Chris@235 503 if (m_propertyStackMinWidth > 0) maxMinWidth = m_propertyStackMinWidth;
Chris@235 504
Chris@127 505 for (size_t i = 0; i < m_panes.size(); ++i) {
Chris@127 506 if (!m_panes[i].propertyStack) continue;
Chris@247 507 #ifdef DEBUG_PANE_STACK
Chris@587 508 SVDEBUG << "PaneStack::sizePropertyStacks: " << i << ": min "
Chris@243 509 << m_panes[i].propertyStack->minimumSizeHint().width() << ", hint "
Chris@243 510 << m_panes[i].propertyStack->sizeHint().width() << ", current "
Chris@585 511 << m_panes[i].propertyStack->width() << endl;
Chris@247 512 #endif
Chris@127 513
Chris@246 514 if (m_panes[i].propertyStack->sizeHint().width() > maxMinWidth) {
Chris@246 515 maxMinWidth = m_panes[i].propertyStack->sizeHint().width();
Chris@127 516 }
Chris@127 517 }
Chris@127 518
Chris@247 519 #ifdef DEBUG_PANE_STACK
Chris@587 520 SVDEBUG << "PaneStack::sizePropertyStacks: max min width " << maxMinWidth << endl;
Chris@247 521 #endif
Chris@127 522
Chris@127 523 int setWidth = maxMinWidth;
Chris@127 524
Chris@127 525 m_propertyStackStack->setMaximumWidth(setWidth + 10);
Chris@127 526
Chris@127 527 for (size_t i = 0; i < m_panes.size(); ++i) {
Chris@127 528 if (!m_panes[i].propertyStack) continue;
Chris@127 529 m_panes[i].propertyStack->setMinimumWidth(setWidth);
Chris@127 530 }
Chris@180 531
Chris@363 532 emit propertyStacksResized(setWidth);
Chris@180 533 emit propertyStacksResized();
Chris@127 534 }
Chris@127 535
Chris@312 536 void
Chris@312 537 PaneStack::paneDropAccepted(QStringList uriList)
Chris@312 538 {
Chris@312 539 Pane *pane = dynamic_cast<Pane *>(sender());
Chris@312 540 emit dropAccepted(pane, uriList);
Chris@312 541 }
Chris@312 542
Chris@312 543 void
Chris@312 544 PaneStack::paneDropAccepted(QString text)
Chris@312 545 {
Chris@312 546 Pane *pane = dynamic_cast<Pane *>(sender());
Chris@312 547 emit dropAccepted(pane, text);
Chris@312 548 }
Chris@127 549
Chris@320 550 void
Chris@323 551 PaneStack::paneDeleteButtonClicked()
Chris@323 552 {
Chris@323 553 QObject *s = sender();
Chris@605 554 for (size_t i = 0; i < m_panes.size(); ++i) {
Chris@605 555 if (m_panes[i].xButton == s) {
Chris@605 556 emit paneDeleteButtonClicked(m_panes[i].pane);
Chris@323 557 }
Chris@323 558 }
Chris@323 559 }
Chris@323 560
Chris@323 561 void
Chris@500 562 PaneStack::indicatorClicked()
Chris@500 563 {
Chris@500 564 QObject *s = sender();
Chris@500 565
Chris@500 566 for (size_t i = 0; i < m_panes.size(); ++i) {
Chris@500 567 if (m_panes[i].currentIndicator == s) {
Chris@500 568 setCurrentPane(m_panes[i].pane);
Chris@500 569 return;
Chris@500 570 }
Chris@500 571 }
Chris@500 572 }
Chris@500 573
Chris@500 574 void
Chris@320 575 PaneStack::sizePanesEqually()
Chris@320 576 {
Chris@320 577 QList<int> sizes = m_splitter->sizes();
Chris@320 578 if (sizes.empty()) return;
Chris@320 579
Chris@320 580 int count = sizes.size();
Chris@320 581
Chris@320 582 int total = 0;
Chris@320 583 for (int i = 0; i < count; ++i) {
Chris@320 584 total += sizes[i];
Chris@320 585 }
Chris@320 586
Chris@320 587 if (total == 0) return;
Chris@320 588
Chris@320 589 sizes.clear();
Chris@320 590
Chris@320 591 int each = total / count;
Chris@320 592 int remaining = total;
Chris@320 593
Chris@320 594 for (int i = 0; i < count; ++i) {
Chris@320 595 if (i == count - 1) {
Chris@320 596 sizes.push_back(remaining);
Chris@320 597 } else {
Chris@320 598 sizes.push_back(each);
Chris@320 599 remaining -= each;
Chris@320 600 }
Chris@320 601 }
Chris@320 602
Chris@320 603 /*
Chris@320 604 std::cerr << "sizes: ";
Chris@320 605 for (int i = 0; i < sizes.size(); ++i) {
Chris@320 606 std::cerr << sizes[i] << " ";
Chris@320 607 }
Chris@320 608 std::cerr << std::endl;
Chris@320 609 */
Chris@320 610
Chris@320 611 m_splitter->setSizes(sizes);
Chris@320 612 }
Chris@320 613
Chris@320 614