ui: Fixed layout of QtBookmarkBrowser
* fixed window size and resizing * fixed layout and spacing * removed focus rects on Mac * fixed filter dropdown style for Mac * reuse button handling from QtWindow * use different colors for category and bookmark rows * allow clicking full row for expansion * show edit and delete button only on hover * ellide bookmark name when little space
This commit is contained in:
@@ -1,17 +1,19 @@
|
||||
#include "QtBookmarkBrowser.h"
|
||||
|
||||
#include "qt/element/QtBookmark.h"
|
||||
#include "qt/element/QtBookmarkCategory.h"
|
||||
#include <QHBoxLayout>
|
||||
#include <QHeaderView>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
#include "data/bookmark/Bookmark.h"
|
||||
|
||||
#include "qt/element/QtBookmark.h"
|
||||
#include "qt/element/QtBookmarkCategory.h"
|
||||
#include "qt/utility/utilityQt.h"
|
||||
#include "utility/ResourcePaths.h"
|
||||
|
||||
QtBookmarkBrowser::QtBookmarkBrowser(QWidget* parent)
|
||||
: QtWindow(parent)
|
||||
, m_headerBackground(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -21,126 +23,116 @@ QtBookmarkBrowser::~QtBookmarkBrowser()
|
||||
|
||||
void QtBookmarkBrowser::setupBookmarkBrowser()
|
||||
{
|
||||
m_layout = new QHBoxLayout();
|
||||
m_layout->setSpacing(0);
|
||||
m_layout->setContentsMargins(0, 0, 0, 0);
|
||||
m_layout->setAlignment(Qt::AlignTop);
|
||||
setLayout(m_layout);
|
||||
|
||||
m_headerBackground = new QWidget(m_window);
|
||||
m_headerBackground->setObjectName("header_background");
|
||||
m_headerBackground->setGeometry(0, 0, 0, 0);
|
||||
m_headerBackground->show();
|
||||
m_headerBackground->lower();
|
||||
|
||||
m_headerLayout = new QVBoxLayout(this);
|
||||
m_headerLayout->setObjectName("header");
|
||||
m_headerLayout->setSpacing(0);
|
||||
m_headerLayout->setContentsMargins(0, 0, 0, 0);
|
||||
m_headerLayout->setAlignment(Qt::AlignTop);
|
||||
m_layout->addLayout(m_headerLayout);
|
||||
|
||||
m_bodyLayout = new QVBoxLayout(this);
|
||||
m_bodyLayout->setObjectName("body");
|
||||
m_bodyLayout->setSpacing(0);
|
||||
m_bodyLayout->setContentsMargins(0, 0, 0, 0);
|
||||
m_bodyLayout->setAlignment(Qt::AlignLeft);
|
||||
m_layout->addLayout(m_bodyLayout);
|
||||
|
||||
m_title = new QLabel(this);
|
||||
m_title->setObjectName("title");
|
||||
m_title->setText("Bookmarks");
|
||||
m_headerLayout->addWidget(m_title);
|
||||
|
||||
m_filterLabel = new QLabel(this);
|
||||
m_filterLabel->setObjectName("filter_label");
|
||||
m_filterLabel->setText("Show:");
|
||||
m_headerLayout->addWidget(m_filterLabel);
|
||||
|
||||
m_filterComboBox = new QComboBox(this);
|
||||
m_filterComboBox->addItem("All");
|
||||
m_filterComboBox->addItem("Nodes");
|
||||
m_filterComboBox->addItem("Edges");
|
||||
m_filterComboBox->setObjectName("filter_box");
|
||||
m_headerLayout->addWidget(m_filterComboBox);
|
||||
|
||||
connect(m_filterComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(filterBoxChanged(const QString&)));
|
||||
|
||||
m_orderLabel = new QLabel(this);
|
||||
m_orderLabel->setObjectName("order_label");
|
||||
m_orderLabel->setText("Sort by:");
|
||||
m_headerLayout->addWidget(m_orderLabel);
|
||||
|
||||
m_orderNames.push_back("Date des.");
|
||||
m_orderNames.push_back("Date asc.");
|
||||
m_orderNames.push_back("Name des.");
|
||||
m_orderNames.push_back("Name asc.");
|
||||
m_currentOrderIndex = 0;
|
||||
|
||||
m_orderComboBox = new QComboBox(this);
|
||||
// m_orderComboBox->setToolTip("Select Bookmark Order");
|
||||
m_orderComboBox->addItem(m_orderNames[0].c_str());
|
||||
m_orderComboBox->addItem(m_orderNames[1].c_str());
|
||||
m_orderComboBox->addItem(m_orderNames[2].c_str());
|
||||
m_orderComboBox->addItem(m_orderNames[3].c_str());
|
||||
m_orderComboBox->setObjectName("order_box");
|
||||
m_headerLayout->addWidget(m_orderComboBox);
|
||||
|
||||
connect(m_orderComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(orderBoxChanged(const QString&)));
|
||||
|
||||
|
||||
m_headerLayout->addWidget(m_orderComboBox);
|
||||
|
||||
m_bookmarkTree = new QTreeWidget();
|
||||
m_bookmarkTree->setObjectName("bookmark_tree");
|
||||
m_bookmarkTree->setSelectionMode(QAbstractItemView::SelectionMode::NoSelection);
|
||||
m_bookmarkTree->header()->close();
|
||||
m_bookmarkTree->setAlternatingRowColors(true);
|
||||
m_bookmarkTree->setIndentation(0);
|
||||
m_bookmarkTree->setHeaderLabel("Bookmarks");
|
||||
|
||||
connect(m_bookmarkTree, SIGNAL(itemExpanded(QTreeWidgetItem*)), this, SLOT(itemExpanded(QTreeWidgetItem*)));
|
||||
connect(m_bookmarkTree, SIGNAL(itemCollapsed(QTreeWidgetItem*)), this, SLOT(itemCollapsed(QTreeWidgetItem*)));
|
||||
|
||||
// m_bookmarkTree->icon
|
||||
|
||||
m_bodyLayout->addWidget(m_bookmarkTree);
|
||||
|
||||
m_closeButton = new QPushButton(this);
|
||||
m_closeButton->setObjectName("windowButton");
|
||||
m_closeButton->setToolTip("Close Window");
|
||||
m_closeButton->setText("Close");
|
||||
m_closeButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac
|
||||
m_bodyLayout->addWidget(m_closeButton);
|
||||
m_bodyLayout->setAlignment(m_closeButton, Qt::AlignRight);
|
||||
|
||||
connect(m_closeButton, SIGNAL(clicked()), this, SLOT(closeButtonClicked()));
|
||||
|
||||
setFixedSize(QSize(790, 600));
|
||||
|
||||
setStyleSheet((
|
||||
utility::getStyleSheet(ResourcePaths::getGuiPath() + "window/window.css") +
|
||||
utility::getStyleSheet(ResourcePaths::getGuiPath() + "bookmark_view/bookmark_view.css")
|
||||
).c_str());
|
||||
|
||||
m_headerBackground->setGeometry(0, 0, 247, size().height()-20);
|
||||
m_headerBackground = new QWidget(m_window);
|
||||
m_headerBackground->setObjectName("header_background");
|
||||
m_headerBackground->setGeometry(0, 0, 0, 0);
|
||||
m_headerBackground->lower();
|
||||
|
||||
QHBoxLayout* layout = new QHBoxLayout();
|
||||
layout->setSpacing(0);
|
||||
layout->setContentsMargins(0, 0, 0, 0);
|
||||
layout->setAlignment(Qt::AlignTop);
|
||||
setLayout(layout);
|
||||
|
||||
{
|
||||
QVBoxLayout* headerLayout = new QVBoxLayout();
|
||||
headerLayout->setSpacing(0);
|
||||
headerLayout->setContentsMargins(30, 35, 25, 35);
|
||||
headerLayout->setAlignment(Qt::AlignTop);
|
||||
layout->addLayout(headerLayout);
|
||||
|
||||
headerLayout->addStrut(150);
|
||||
|
||||
QLabel* title = new QLabel("Bookmarks");
|
||||
title->setObjectName("title");
|
||||
headerLayout->addWidget(title);
|
||||
|
||||
headerLayout->addSpacing(40);
|
||||
|
||||
QLabel* filterLabel = new QLabel("Show:");
|
||||
filterLabel->setObjectName("filter_label");
|
||||
headerLayout->addWidget(filterLabel);
|
||||
|
||||
m_filterComboBox = new QComboBox();
|
||||
m_filterComboBox->addItem("All");
|
||||
m_filterComboBox->addItem("Nodes");
|
||||
m_filterComboBox->addItem("Edges");
|
||||
m_filterComboBox->setObjectName("filter_box");
|
||||
headerLayout->addWidget(m_filterComboBox);
|
||||
|
||||
connect(m_filterComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(filterOrOrderChanged(const QString&)));
|
||||
|
||||
headerLayout->addSpacing(40);
|
||||
|
||||
QLabel* orderLabel = new QLabel("Sort by:");
|
||||
orderLabel->setObjectName("order_label");
|
||||
headerLayout->addWidget(orderLabel);
|
||||
|
||||
m_orderNames.push_back("Date des.");
|
||||
m_orderNames.push_back("Date asc.");
|
||||
m_orderNames.push_back("Name des.");
|
||||
m_orderNames.push_back("Name asc.");
|
||||
|
||||
m_orderComboBox = new QComboBox(this);
|
||||
// m_orderComboBox->setToolTip("Select Bookmark Order");
|
||||
m_orderComboBox->addItem(m_orderNames[0].c_str());
|
||||
m_orderComboBox->addItem(m_orderNames[1].c_str());
|
||||
m_orderComboBox->addItem(m_orderNames[2].c_str());
|
||||
m_orderComboBox->addItem(m_orderNames[3].c_str());
|
||||
m_orderComboBox->setObjectName("order_box");
|
||||
headerLayout->addWidget(m_orderComboBox);
|
||||
|
||||
connect(m_orderComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(filterOrOrderChanged(const QString&)));
|
||||
}
|
||||
|
||||
{
|
||||
QVBoxLayout* bodyLayout = new QVBoxLayout();
|
||||
bodyLayout->setSpacing(0);
|
||||
bodyLayout->setContentsMargins(0, 30, 6, 35);
|
||||
bodyLayout->setAlignment(Qt::AlignLeft);
|
||||
layout->addLayout(bodyLayout);
|
||||
|
||||
m_bookmarkTree = new QTreeWidget();
|
||||
m_bookmarkTree->setObjectName("bookmark_tree");
|
||||
m_bookmarkTree->setAttribute(Qt::WA_MacShowFocusRect, 0);
|
||||
m_bookmarkTree->setSelectionMode(QAbstractItemView::SelectionMode::NoSelection);
|
||||
m_bookmarkTree->header()->close();
|
||||
m_bookmarkTree->setIndentation(0);
|
||||
m_bookmarkTree->setHeaderLabel("Bookmarks");
|
||||
|
||||
connect(m_bookmarkTree, SIGNAL(itemExpanded(QTreeWidgetItem*)), this, SLOT(categoryExpansionChanged(QTreeWidgetItem*)));
|
||||
connect(m_bookmarkTree, SIGNAL(itemCollapsed(QTreeWidgetItem*)), this, SLOT(categoryExpansionChanged(QTreeWidgetItem*)));
|
||||
connect(m_bookmarkTree, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(treeItemClicked(QTreeWidgetItem*, int)));
|
||||
|
||||
bodyLayout->addWidget(m_bookmarkTree);
|
||||
|
||||
bodyLayout->addSpacing(15);
|
||||
|
||||
QHBoxLayout* buttonLayout = createButtons();
|
||||
buttonLayout->setContentsMargins(0, 0, 35, 0);
|
||||
bodyLayout->addLayout(buttonLayout);
|
||||
setPreviousVisible(false);
|
||||
setCloseVisible(false);
|
||||
updateNextButton("Close");
|
||||
}
|
||||
}
|
||||
|
||||
void QtBookmarkBrowser::setBookmarks(const std::vector<std::shared_ptr<Bookmark>>& bookmarks)
|
||||
{
|
||||
m_bookmarkTree->clear();
|
||||
// m_bookmarkTree->adjustSize();
|
||||
|
||||
for (unsigned int i = 0; i < bookmarks.size(); i++)
|
||||
{
|
||||
QtBookmark* bookmark = new QtBookmark();
|
||||
bookmark->setName(bookmarks[i]->getDisplayName());
|
||||
bookmark->setBookmark(bookmarks[i]);
|
||||
|
||||
QTreeWidgetItem* top = findOrCreateTreeCategory(bookmarks[i]->getCategory().getName(), bookmarks[i]->getCategory().getId());
|
||||
QTreeWidgetItem* top = findOrCreateTreeCategory(bookmarks[i]->getCategory());
|
||||
QTreeWidgetItem* treeWidgetItem = new QTreeWidgetItem(top);
|
||||
// treeWidgetItem->setText(0, bookmarks[i]->getDisplayName().c_str());
|
||||
treeWidgetItem->setSizeHint(0, bookmark->minimumSizeHint());
|
||||
m_bookmarkTree->setItemWidget(treeWidgetItem, 0, bookmark);
|
||||
top->addChild(treeWidgetItem);
|
||||
|
||||
@@ -150,51 +142,51 @@ void QtBookmarkBrowser::setBookmarks(const std::vector<std::shared_ptr<Bookmark>
|
||||
}
|
||||
}
|
||||
|
||||
void QtBookmarkBrowser::closeButtonClicked()
|
||||
void QtBookmarkBrowser::resizeEvent(QResizeEvent* event)
|
||||
{
|
||||
try
|
||||
{
|
||||
close();
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
std::string message = e.what();
|
||||
QtWindow::resizeEvent(event);
|
||||
|
||||
LOG_ERROR(message);
|
||||
}
|
||||
m_headerBackground->setGeometry(0, 0, 200, m_window->size().height());
|
||||
}
|
||||
|
||||
void QtBookmarkBrowser::filterBoxChanged(const QString& text)
|
||||
void QtBookmarkBrowser::handleClose()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
void QtBookmarkBrowser::handleNext()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
void QtBookmarkBrowser::filterOrOrderChanged(const QString& text)
|
||||
{
|
||||
MessageDisplayBookmarks(getSelectedFilter(), getSelectedOrder()).dispatch();
|
||||
}
|
||||
|
||||
void QtBookmarkBrowser::orderBoxChanged(const QString& text)
|
||||
void QtBookmarkBrowser::categoryExpansionChanged(QTreeWidgetItem* item)
|
||||
{
|
||||
MessageDisplayBookmarks(getSelectedFilter(), getSelectedOrder()).dispatch();
|
||||
}
|
||||
|
||||
void QtBookmarkBrowser::itemExpanded(QTreeWidgetItem* item)
|
||||
{
|
||||
QWidget* widget = m_bookmarkTree->itemWidget(item, 0);
|
||||
|
||||
QtBookmarkCategory* category = dynamic_cast<QtBookmarkCategory*>(widget);
|
||||
|
||||
QtBookmarkCategory* category = dynamic_cast<QtBookmarkCategory*>(m_bookmarkTree->itemWidget(item, 0));
|
||||
if (category != NULL)
|
||||
{
|
||||
category->updateArrow();
|
||||
}
|
||||
}
|
||||
|
||||
void QtBookmarkBrowser::itemCollapsed(QTreeWidgetItem* item)
|
||||
void QtBookmarkBrowser::treeItemClicked(QTreeWidgetItem* item, int column)
|
||||
{
|
||||
QWidget* widget = m_bookmarkTree->itemWidget(item, 0);
|
||||
|
||||
QtBookmarkCategory* category = dynamic_cast<QtBookmarkCategory*>(widget);
|
||||
|
||||
QtBookmarkCategory* category = dynamic_cast<QtBookmarkCategory*>(m_bookmarkTree->itemWidget(item, 0));
|
||||
if (category != NULL)
|
||||
{
|
||||
category->updateArrow();
|
||||
category->expandClicked();
|
||||
return;
|
||||
}
|
||||
|
||||
QtBookmark* bookmark = dynamic_cast<QtBookmark*>(m_bookmarkTree->itemWidget(item, 0));
|
||||
if (bookmark != NULL)
|
||||
{
|
||||
bookmark->commentToggled();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -250,37 +242,35 @@ MessageDisplayBookmarks::BookmarkOrder QtBookmarkBrowser::getSelectedOrder()
|
||||
}
|
||||
}
|
||||
|
||||
QTreeWidgetItem* QtBookmarkBrowser::findOrCreateTreeCategory(const std::string& name, const Id id)
|
||||
QTreeWidgetItem* QtBookmarkBrowser::findOrCreateTreeCategory(const BookmarkCategory& category)
|
||||
{
|
||||
for (int i = 0; i < m_bookmarkTree->topLevelItemCount(); i++)
|
||||
{
|
||||
QTreeWidgetItem* item = m_bookmarkTree->topLevelItem(i);
|
||||
|
||||
if (item->whatsThis(0).toStdString() == name)
|
||||
if (item->whatsThis(0).toStdString() == category.getName())
|
||||
{
|
||||
return item;
|
||||
}
|
||||
}
|
||||
|
||||
QtBookmarkCategory* category = new QtBookmarkCategory();
|
||||
if (name.length() > 0)
|
||||
QtBookmarkCategory* categoryItem = new QtBookmarkCategory();
|
||||
if (category.getName().length() > 0)
|
||||
{
|
||||
category->setName(name);
|
||||
categoryItem->setName(category.getName());
|
||||
}
|
||||
else
|
||||
{
|
||||
category->setName("No Category");
|
||||
categoryItem->setName("No Category");
|
||||
}
|
||||
category->setId(id);
|
||||
categoryItem->setId(category.getId());
|
||||
|
||||
QTreeWidgetItem* newItem = new QTreeWidgetItem(m_bookmarkTree);
|
||||
newItem->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);
|
||||
newItem->setSizeHint(0, category->minimumSizeHint());
|
||||
newItem->setWhatsThis(0, name.c_str());
|
||||
category->setTreeWidgetItem(newItem);
|
||||
newItem->setWhatsThis(0, category.getName().c_str());
|
||||
|
||||
m_bookmarkTree->setItemWidget(newItem, 0, category);
|
||||
categoryItem->setTreeWidgetItem(newItem);
|
||||
|
||||
m_bookmarkTree->setItemWidget(newItem, 0, categoryItem);
|
||||
m_bookmarkTree->addTopLevelItem(newItem);
|
||||
|
||||
return newItem;
|
||||
|
||||
Reference in New Issue
Block a user