annotate view/PaneStack.cpp @ 583:4c484636d5ec

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