summaryrefslogtreecommitdiffstats
path: root/ui/qt/accordion_frame.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /ui/qt/accordion_frame.cpp
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ui/qt/accordion_frame.cpp')
-rw-r--r--ui/qt/accordion_frame.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/ui/qt/accordion_frame.cpp b/ui/qt/accordion_frame.cpp
new file mode 100644
index 0000000..8f8cc43
--- /dev/null
+++ b/ui/qt/accordion_frame.cpp
@@ -0,0 +1,107 @@
+/* accordion_frame.cpp
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "config.h"
+#include <glib.h>
+
+#include "accordion_frame.h"
+
+#include "ui/util.h"
+#include <ui/qt/utils/color_utils.h>
+
+#include <QLayout>
+#include <QPropertyAnimation>
+
+const int duration_ = 150;
+
+AccordionFrame::AccordionFrame(QWidget *parent) :
+ QFrame(parent),
+ frame_height_(0)
+{
+ updateStyleSheet();
+
+ animation_ = new QPropertyAnimation(this, "maximumHeight", this);
+ animation_->setDuration(duration_);
+ animation_->setEasingCurve(QEasingCurve::InOutQuad);
+ connect(animation_, &QPropertyAnimation::finished, this, &AccordionFrame::animationFinished);
+}
+
+void AccordionFrame::animatedShow()
+{
+ if (isVisible()) {
+ show();
+ return;
+ }
+
+ if (!display_is_remote()) {
+ QWidget *parent = parentWidget();
+
+ if (parent && parent->layout()) {
+ // Force our parent layout to update its geometry. There are a number
+ // of ways of doing this. Calling invalidate + activate seems to
+ // be the best.
+ show();
+ parent->layout()->invalidate(); // Calls parent->layout()->update()
+ parent->layout()->activate(); // Calculates sizes then calls parent->updateGeometry()
+ frame_height_ = height();
+ hide();
+ }
+ if (frame_height_ > 0) {
+ animation_->setStartValue(0);
+ animation_->setEndValue(frame_height_);
+ animation_->start();
+ }
+ }
+ show();
+}
+
+void AccordionFrame::animatedHide()
+{
+ if (!isVisible()) {
+ hide();
+ return;
+ }
+
+ if (!display_is_remote()) {
+ animation_->setStartValue(frame_height_);
+ animation_->setEndValue(0);
+ animation_->start();
+ } else {
+ hide();
+ }
+}
+
+void AccordionFrame::animationFinished()
+{
+ if (animation_->currentValue().toInt() < 1) {
+ hide();
+ setMaximumHeight(frame_height_);
+ }
+}
+
+void AccordionFrame::updateStyleSheet()
+{
+ QString style_sheet(
+ "QLineEdit#goToLineEdit {"
+ " max-width: 5em;"
+ "}"
+ );
+
+#ifdef Q_OS_MAC
+ style_sheet += QString(
+ "QLineEdit {"
+ " border: 1px solid palette(%1);"
+ " border-radius: 3px;"
+ " padding: 1px;"
+ "}"
+ ).arg(ColorUtils::themeIsDark() ? QString("light") : QString("dark"));
+#endif
+
+ setStyleSheet(style_sheet);
+} \ No newline at end of file