void QSplitterPrivate::doMove(bool backwards, int hPos, int index, int delta, bool mayCollapse, int *positions, int *widths) { if (index < 0 || index >= list.count()) return; #ifdef QSPLITTER_DEBUG qDebug() << "QSplitterPrivate::doMove" << backwards << hPos << index << delta << mayCollapse; #endif QSplitterLayoutStruct *s = list.at(index); QWidget *w = s->widget; int nextId = backwards ? index - delta : index + delta; if (w->isHidden()) { doMove(backwards, hPos, nextId, delta, collapsible(nextId), positions, widths); } else { int hs =s->handle->isHidden() ? 0 : s->getHandleSize(orient); int ws = backwards ? hPos - pick(s->rect.topLeft()) : pick(s->rect.bottomRight()) - hPos -hs + 1; if (ws > 0 || (!s->collapsed && !mayCollapse)) { ws = qMin(ws, pick(w->maximumSize())); ws = qMax(ws, pick(qSmartMinSize(w))); } else { ws = 0; } positions[index] = backwards ? hPos - ws : hPos + hs; widths[index] = ws; doMove(backwards, backwards ? hPos - ws - hs : hPos + hs + ws, nextId, delta, collapsible(nextId), positions, widths); } }
void QSplitterPrivate::setSizes_helper(const QList<int> &sizes, bool clampNegativeSize) { int j = 0; for (int i = 0; i < list.size(); ++i) { QSplitterLayoutStruct *s = list.at(i); s->collapsed = false; s->sizer = sizes.value(j++); if (clampNegativeSize && s->sizer < 0) s->sizer = 0; int smartMinSize = pick(qSmartMinSize(s->widget)); // Make sure that we reset the collapsed state. if (s->sizer == 0) { if (collapsible(s) && smartMinSize > 0) { s->collapsed = true; } else { s->sizer = smartMinSize; } } else { if (s->sizer < smartMinSize) s->sizer = smartMinSize; } } doResize(); }
static void collapse(char *path) { char *names = (path[0] == '/') ? path + 1 : path; /* Preserve first '/' */ int nc; char **ix; int i, j; char *p, *q; nc = collapsible(names); if (nc < 2) return; /* Nothing to do */ ix = (char **)alloca(nc * sizeof(char *)); splitNames(names, ix); for (i = 0; i < nc; i++) { int dots = 0; /* Find next occurrence of "." or ".." */ do { char *p = ix[i]; if (p[0] == '.') { if (p[1] == '\0') { dots = 1; break; } if ((p[1] == '.') && (p[2] == '\0')) { dots = 2; break; } } i++; } while (i < nc); if (i >= nc) break; /* At this point i is the index of either a "." or a "..", so take the appropriate action and then continue the outer loop */ if (dots == 1) { /* Remove this instance of "." */ ix[i] = 0; } else { /* If there is a preceding name, remove both that name and this instance of ".."; otherwise, leave the ".." as is */ for (j = i - 1; j >= 0; j--) { if (ix[j]) break; } if (j < 0) continue; ix[j] = 0; ix[i] = 0; } /* i will be incremented at the top of the loop */ } joinNames(names, nc, ix); }
int QSplitterPrivate::findWidgetJustBeforeOrJustAfter(int index, int delta, int &collapsibleSize) const { if (delta < 0) index += delta; do { QWidget *w = list.at(index)->widget; if (!w->isHidden()) { if (collapsible(list.at(index))) collapsibleSize = pick(qSmartMinSize(w)); return index; } index += delta; } while (index >= 0 && index < list.count()); return -1; }