Skip to content

Commit

Permalink
New feature tabbed output window for query results more than 2. #1591…
Browse files Browse the repository at this point in the history
… #1403.
  • Loading branch information
simsekgokhan committed Feb 23, 2019
1 parent 3deba89 commit 1d9d694
Show file tree
Hide file tree
Showing 6 changed files with 153 additions and 34 deletions.
15 changes: 8 additions & 7 deletions src/robomongo/gui/widgets/workarea/OutputItemContentWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
namespace Robomongo
{
OutputItemContentWidget::OutputItemContentWidget(ViewMode viewMode, MongoShell *shell,
const QString &text, double secs,
const QString &text, double secs, bool tabbedResults,
bool multipleResults, bool firstItem, bool lastItem,
AggrInfo aggrInfo, QWidget *parent) :
BaseClass(parent),
Expand All @@ -51,15 +51,15 @@ namespace Robomongo
_viewMode(viewMode),
_aggrInfo(aggrInfo)
{
setup(secs, multipleResults, firstItem, lastItem);
setup(secs, tabbedResults, multipleResults, firstItem, lastItem);
}

OutputItemContentWidget::OutputItemContentWidget(ViewMode viewMode, MongoShell *shell,
const QString &type,
const std::vector<MongoDocumentPtr> &documents,
const MongoQueryInfo &queryInfo, double secs,
bool multipleResults, bool firstItem,
bool lastItem, AggrInfo aggrInfo,
bool tabbedResults, bool multipleResults,
bool firstItem, bool lastItem, AggrInfo aggrInfo,
QWidget *parent) :
BaseClass(parent),
_textView(NULL),
Expand All @@ -86,13 +86,14 @@ namespace Robomongo
_viewMode(viewMode),
_aggrInfo(aggrInfo)
{
setup(secs, multipleResults, firstItem, lastItem);
setup(secs, tabbedResults, multipleResults, firstItem, lastItem);
}

void OutputItemContentWidget::setup(double secs, bool multipleResults, bool firstItem, bool lastItem)
void OutputItemContentWidget::setup(double secs, bool tabbedResults, bool multipleResults,
bool firstItem, bool lastItem)
{
setContentsMargins(0, 0, 0, 0);
_header = new OutputItemHeaderWidget(this, multipleResults, firstItem, lastItem);
_header = new OutputItemHeaderWidget(this, tabbedResults, multipleResults, firstItem, lastItem);

if (_queryInfo._info.isValid()) {
_header->setCollection(QtUtils::toQString(_queryInfo._info._ns.collectionName()));
Expand Down
8 changes: 4 additions & 4 deletions src/robomongo/gui/widgets/workarea/OutputItemContentWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@ namespace Robomongo
public:
typedef QWidget BaseClass;
OutputItemContentWidget(ViewMode viewMode, MongoShell *shell, const QString &text, double secs,
bool multipleResults, bool firstItem, bool lastItem,
bool tabbedResults, bool multipleResults, bool firstItem, bool lastItem,
AggrInfo aggrInfo, QWidget *parent);

OutputItemContentWidget(ViewMode viewMode, MongoShell *shell, const QString &type,
const std::vector<MongoDocumentPtr> &documents,
const MongoQueryInfo &queryInfo, double secs, bool multipleResults,
bool firstItem, bool lastItem, AggrInfo aggrInfo,
const MongoQueryInfo &queryInfo, double secs, bool tabbedResults,
bool multipleResults, bool firstItem, bool lastItem, AggrInfo aggrInfo,
QWidget *parent);
int _initialSkip;
int _initialLimit;
Expand Down Expand Up @@ -71,7 +71,7 @@ namespace Robomongo
void paging_leftClicked(int skip, int limit);

private:
void setup(double secs, bool multipleResults, bool firstItem, bool lastItem);
void setup(double secs, bool tabbedResults, bool multipleResults, bool firstItem, bool lastItem);
FindFrame *configureLogText();
BsonTreeModel *configureModel();

Expand Down
20 changes: 11 additions & 9 deletions src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,12 @@ namespace
namespace Robomongo
{

OutputItemHeaderWidget::OutputItemHeaderWidget(OutputItemContentWidget *outputItemContentWidget, bool multipleResults,
bool firstItem, bool lastItem, QWidget *parent) :
OutputItemHeaderWidget::OutputItemHeaderWidget(
OutputItemContentWidget *outputItemContentWidget, bool multipleResults,
bool tabbedResults, bool firstItem, bool lastItem, QWidget *parent) :
QFrame(parent),
_maxButton(nullptr), _dockUndockButton(nullptr), _maximized(false), _multipleResults(multipleResults),
_maxButton(nullptr), _dockUndockButton(nullptr), _maximized(false),
_multipleResults(multipleResults),
_firstItem(firstItem), _lastItem(lastItem), _orientation(Qt::Vertical)
{
setContentsMargins(5, 0, 0, 0);
Expand Down Expand Up @@ -140,9 +142,8 @@ namespace Robomongo
if (outputItemContentWidget->isTextModeSupported())
layout->addWidget(_textButton, 0, Qt::AlignRight);

if (_multipleResults) {
if (_multipleResults)
layout->addWidget(_maxButton, 0, Qt::AlignRight);
}

layout->addSpacing(3);
_verticalLine = createVerticalLine();
Expand All @@ -153,13 +154,15 @@ namespace Robomongo
setLayout(layout);

// Update dock/undock button visibility
if (_multipleResults) {
if (_multipleResults)
updateDockButtonOnToggleOrientation();
}
else {
_verticalLine->setVisible(true);
_dockUndockButton->setVisible(true);
}

if(tabbedResults)
setStyleSheet("background-color: white");
}

void OutputItemHeaderWidget::mouseDoubleClickEvent(QMouseEvent *)
Expand Down Expand Up @@ -251,9 +254,8 @@ namespace Robomongo
void OutputItemHeaderWidget::maximizeMinimizePart()
{
// No maximize/minimize behaviour if there is only one query result
if (!_multipleResults) {
if (!_multipleResults)
return;
}

if (_maximized) { // restoring original size
emit restoredSize();
Expand Down
4 changes: 2 additions & 2 deletions src/robomongo/gui/widgets/workarea/OutputItemHeaderWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ namespace Robomongo
Q_OBJECT

public:
OutputItemHeaderWidget(OutputItemContentWidget *output, bool multipleResults, bool firstItem, bool lastItem,
QWidget *parent = nullptr);
OutputItemHeaderWidget(OutputItemContentWidget *output, bool multipleResults, bool tabbedResults,
bool firstItem, bool lastItem, QWidget *parent = nullptr);
PagingWidget *paging() const { return _paging; }
void showText();
void showTree();
Expand Down
132 changes: 123 additions & 9 deletions src/robomongo/gui/widgets/workarea/OutputWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,20 @@

#include <QHBoxLayout>
#include <QSplitter>
#include <QWidget>

#include "robomongo/core/AppRegistry.h"
#include "robomongo/core/settings/SettingsManager.h"
#include "robomongo/core/utils/QtUtils.h"

#include "robomongo/gui/widgets/workarea/OutputItemContentWidget.h"
#include "robomongo/gui/widgets/workarea/ProgressBarPopup.h"
#include "robomongo/gui/widgets/workarea/WorkAreaTabBar.h"

namespace Robomongo
{
OutputWidget::OutputWidget(QWidget *parent) :
QFrame(parent),
QTabWidget(parent),
_splitter(new QSplitter)
{
_splitter->setOrientation(Qt::Vertical);
Expand All @@ -25,23 +27,33 @@ namespace Robomongo
layout->setSpacing(0);
layout->addWidget(_splitter);
setLayout(layout);

setTabsClosable(true);
setElideMode(Qt::ElideRight);
setMovable(true);
setDocumentMode(true);
setStyleSheet(buildStyleSheet());
VERIFY(connect(this, SIGNAL(tabCloseRequested(int)), SLOT(tabCloseRequested(int))));

_progressBarPopup = new ProgressBarPopup(this);
}

void OutputWidget::present(MongoShell *shell, const std::vector<MongoShellResult> &results)
{
if (_prevResultsCount > 0) {
if (_prevResultsCount > 0)
clearAllParts();
}

int const RESULTS_SIZE = _prevResultsCount = results.size();
bool const multipleResults = (RESULTS_SIZE > 1);

_outputItemContentWidgets.clear();
bool const tabbedResults = (RESULTS_SIZE > 2);
_splitter->setHidden(tabbedResults ? true : false);
_outputItemContentWidgets.clear();

while (count() > 0)
removeTab(count()-1);

for (int i = 0; i < RESULTS_SIZE; ++i) {
MongoShellResult shellResult = results[i];

double secs = shellResult.elapsedMs() / 1000.f;
ViewMode viewMode = AppRegistry::instance().settingsManager()->viewMode();
if (_prevViewModes.size()) {
Expand All @@ -56,16 +68,21 @@ namespace Robomongo
if (shellResult.documents().size() > 0) {
item = new OutputItemContentWidget(viewMode, shell, QtUtils::toQString(shellResult.type()),
shellResult.documents(), shellResult.queryInfo(), secs,
multipleResults, firstItem, lastItem,
tabbedResults, multipleResults, firstItem, lastItem,
shellResult.aggrInfo(), this);
} else {
item = new OutputItemContentWidget(viewMode, shell, QtUtils::toQString(shellResult.response()),
secs, multipleResults, firstItem, lastItem,
secs, tabbedResults, multipleResults, firstItem, lastItem,
shellResult.aggrInfo(), this);
}
VERIFY(connect(item, SIGNAL(maximizedPart()), this, SLOT(maximizePart())));
VERIFY(connect(item, SIGNAL(restoredSize()), this, SLOT(restoreSize())));
_splitter->addWidget(item);

if (tabbedResults)
addTab(item, QString::number(i + 1));
else
_splitter->addWidget(item);

_outputItemContentWidgets.push_back(item);
}

Expand Down Expand Up @@ -155,6 +172,11 @@ namespace Robomongo
}
}

void OutputWidget::tabCloseRequested(int index)
{
removeTab(index);
}

void OutputWidget::restoreSize()
{
int count = _splitter->count();
Expand Down Expand Up @@ -210,6 +232,98 @@ namespace Robomongo
}
}

QString OutputWidget::buildStyleSheet()
{
QColor background = palette().window().color();
QColor gradientZero = QColor("#ffffff"); //Qt::white;//.lighter(103);
QColor gradientOne = background.lighter(104); //Qt::white;//.lighter(103);
QColor gradientTwo = background.lighter(108); //.lighter(103);
QColor selectedBorder = background.darker(103);

QString aga1 = gradientOne.name();
QString aga2 = gradientTwo.name();
QString aga3 = background.name();

QString styles = QString(
#ifndef __APPLE__
"QTabBar::tab:first {"
// "margin-left: 4px;"
"} "
"QTabBar::tab:last {"
// "margin-right: 1px;"
"} "
#endif
"QTabBar::close-button { "
#ifdef __APPLE__
"image: url(:/robomongo/icons/close_2_Mac_16x16.png);"
#else
"image: url(:/robomongo/icons/close_2_16x16.png);"
#endif
"width: 10px;"
"height: 10px;"
// "margin-left: 4px;"
// "background-color: red;"
"}"
"QTabBar::close-button:hover { "
"image: url(:/robomongo/icons/close_hover_16x16.png);"
"width: 15px;"
"height: 15px;"
"}"
"QTabBar::tab {"
// "width: 15px;"
// "background-color: yellow;"
"background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,"
"stop: 0 #F0F0F0, stop: 0.4 #DEDEDE,"
"stop: 0.5 #E6E6E6, stop: 1.0 #E1E1E1);"
"border: 1px solid #C4C4C3;"
"border-bottom-color: #B8B7B6;" // #C2C7CB same as the pane color
"border-top-left-radius: 3px;"
"border-top-right-radius: 3px;"
"padding: 4px 0px 4px 4px;" // top r b l
// "margin-right: 1px;"
#ifndef __APPLE__
"max-width: 200px;"
"margin: 0px;"
"margin-left: 1px;"
"margin-right: -3px;"
// it should be -(tab:first:margin-left + tab:last:margin-left)
// to fix incorrect text elidement
#endif
"}"
"QTabBar::tab:selected, QTabBar::tab:hover {"
"/* background: qlineargradient(x1: 0, y1: 1, x2: 0, y2: 0,"
"stop: 0 %1, stop: 0.3 %2," //#fafafa, #f4f4f4
"stop: 0.6 %3, stop: 1.0 %4); */" //#e7e7e7, #fafafa
"background-color: white;"
// "background-color: yellow;"
"}"

"QTabBar::tab:selected {"
"width: 28px;"
"margin-right: 1px;"
"margin-top: 1px;"
"border-color: #9B9B9B;" //
"border-bottom-color: %4;" //#fafafa
"}"

"QTabBar::tab:!selected {"
"width: 28px;"
"margin-right: 1px;"
"margin-top: 1px;"
// "margin-top: 2px;" // make non-selected tabs look smaller
"} "
#ifndef __APPLE__
"QTabBar::tab:only-one {"
//"margin-top: 2px; margin-left:4px;"
"}"
#endif
).arg(gradientZero.name(), gradientOne.name(), gradientTwo.name(), "#ffffff");

QString aga = palette().window().color().name();

return styles;
}

void OutputWidget::tryToMakeAllPartsEqualInSize()
{
int resultsCount = _splitter->count();
Expand Down
8 changes: 5 additions & 3 deletions src/robomongo/gui/widgets/workarea/OutputWidget.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#pragma once

#include <QFrame>
#include <QTabWidget>
QT_BEGIN_NAMESPACE
class QSplitter;
QT_END_NAMESPACE
Expand All @@ -14,7 +14,7 @@ namespace Robomongo
class ProgressBarPopup;
class MongoShell;

class OutputWidget : public QFrame
class OutputWidget : public QTabWidget
{
Q_OBJECT

Expand Down Expand Up @@ -45,11 +45,13 @@ namespace Robomongo
private Q_SLOTS:
void restoreSize();
void maximizePart();
void tabCloseRequested(int);
private:
void clearAllParts();
QString buildStyleSheet();
void tryToMakeAllPartsEqualInSize();
std::vector<ViewMode> _prevViewModes;
int _prevResultsCount;
void tryToMakeAllPartsEqualInSize();
QSplitter *_splitter;
ProgressBarPopup *_progressBarPopup;
std::vector<OutputItemContentWidget*> _outputItemContentWidgets;
Expand Down

0 comments on commit 1d9d694

Please sign in to comment.