annotate view/PaneStack.cpp @ 607:5b72899d692b

Give a dedicated key to toggling the centre line, and move it out of the overlay level setting -- reducing number of overlay levels to 3. Introduce two distinct vertical scale types (so that we can hide the spectrogram colour scale part easily)
author Chris Cannam
date Mon, 30 Jan 2012 16:01:59 +0000
parents fbab21439115
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