Skip to content
Snippets Groups Projects
Commit b69a29ce authored by Riccardo Musso's avatar Riccardo Musso
Browse files

Implemented working tabs

parent 62cf68aa
Branches arp-rotating
No related tags found
No related merge requests found
#include "tabsmodule.h"
#include "Core/modulesmanager.h"
#include <QLabel>
#include <QBoxLayout>
#include <QDebug>
TabsModule::TabsModule(QWidget* parent)
: DefaultModule{parent} {
setupUi();
defaultContextMenuSetup();
addTab("prova1");
addTab("prova2");
QObject::connect(tabNames, &QListWidget::currentRowChanged, tabContents, &QStackedWidget::setCurrentIndex);
QObject::connect(tabNames, &QListWidget::itemDoubleClicked, this, &TabsModule::onDoubleClickedItem);
}
TabsModule::~TabsModule() {}
......@@ -28,39 +29,72 @@ void TabsModule::fromXmlObject(const XmlObject& xmlObject) {
Q_UNUSED(xmlObject);
}
bool TabsModule::addTab(const QString& tabName, Module* module) {
if(!tabNames->findItems(tabName, Qt::MatchExactly).isEmpty())
return false;
connect(module->getModuleEventsHandler(), &ModuleEventsHandler::replaceMeWith, this, &TabsModule::replaceTabContent);
connect(module->getModuleEventsHandler(), &ModuleEventsHandler::contextMenuRequest, this, &TabsModule::onSkywardHubContextMenuRequested);
connect(module->getModuleEventsHandler(), &ModuleEventsHandler::beforeDelete, this, &TabsModule::deleteTab);
auto* listItem = new QListWidgetItem();
listItem->setText(tabName);
listItem->setTextAlignment(Qt::AlignCenter);
tabNames->addItem(listItem);
bool TabsModule::removeTab(const QString& tabName) {
for(unsigned i = 0; i < getTabCount(); i++) {
auto item = tabNames->item(i);
auto* container = new QWidget();
auto* layout = new QBoxLayout(QBoxLayout::LeftToRight, container);
layout->addWidget(module->toWidget(), 0, Qt::AlignCenter);
tabContents->addWidget(container);
if(item->text() == tabName) {
tabNames->removeItemWidget(item);
tabContents->removeWidget(tabContents->widget(i));
// TODO select another tab
contentModules.append(module);
tabNames->setCurrentItem(listItem);
return true;
}
}
return false;
void TabsModule::replaceTabContent(Module* from, Module* to) {
int index = contentModules.indexOf(from);
if(index == -1)
return;
contentModules.replace(index, to);
auto* layout = static_cast<QBoxLayout*>(tabContents->widget(index)->layout());
layout->removeWidget(from->toWidget());
layout->addWidget(to->toWidget(), 0, Qt::AlignCenter);
// Connect the module to the slots
connect(to->getModuleEventsHandler(), &ModuleEventsHandler::replaceMeWith, this, &TabsModule::replaceTabContent);
connect(to->getModuleEventsHandler(), &ModuleEventsHandler::contextMenuRequest, this, &TabsModule::onSkywardHubContextMenuRequested);
connect(to->getModuleEventsHandler(), &ModuleEventsHandler::beforeDelete, this, &TabsModule::deleteTab);
// forces UI update
tabContents->update();
}
bool TabsModule::addTab(const QString& tabName, int index) {
if(index < 0 || static_cast<unsigned>(index) > getTabCount())
index = getTabCount();
void TabsModule::deleteTab(Module* module) {
int index = contentModules.indexOf(module);
if(!tabNames->findItems(tabName, Qt::MatchExactly).isEmpty())
return false;
if(index == -1)
return;
auto* listItem = new QListWidgetItem();
listItem->setText(tabName);
listItem->setTextAlignment(Qt::AlignCenter);
tabNames->insertItem(index, listItem);
contentModules.removeAt(index);
tabContents->removeWidget(tabContents->widget(index));
tabNames->takeItem(index);
tabContents->insertWidget(index, new QWidget(this));
return true;
if(contentModules.isEmpty()) {
emit getModuleEventsHandler()->replaceMeWith(this, getCore()->getModulesManager()->instantiateDefaultModule());
this->deleteLater();
} else {
tabNames->setCurrentItem(tabNames->item(index == 0 ? 0 : index - 1));
}
}
unsigned TabsModule::getTabCount() {
return tabNames->count();
void TabsModule::onDoubleClickedItem(QListWidgetItem* item) {
item->setFlags(item->flags() | Qt::ItemIsEditable);
tabNames->setCurrentItem(item);
tabNames->editItem(item);
}
void TabsModule::addCustomActionsToMenu() {
......@@ -73,6 +107,7 @@ constexpr const char* tabNamesStyleSheet = R"x(
QListWidget {
show-decoration-selected: 1;
color: #d7d6d6;
border: none;
font-weight: bold;
font-size: 16px;
}
......@@ -83,6 +118,7 @@ constexpr const char* tabNamesStyleSheet = R"x(
}
QListWidget::item:selected {
color: #d7d6d6;
border-left-style: solid;
border-left-width: 8px;
border-left-color: #a8a8a9;
......@@ -101,12 +137,14 @@ void TabsModule::setupUi() {
tabNames->setStyleSheet(tabNamesStyleSheet);
tabNames->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
tabNames->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
tabNames->setSelectionMode(QAbstractItemView::SingleSelection);
// --- Right component
tabContents = new QStackedWidget;
// --- Putting all together
QBoxLayout* outerLayout = new QBoxLayout(QBoxLayout::LeftToRight, this);
outerLayout->setContentsMargins(0, 0, 0, 0);
outerLayout->setSpacing(0);
QWidget* leftBar = new QWidget;
......
......@@ -13,9 +13,8 @@ class TabsModule : public DefaultModule {
TabsModule(QWidget* parent = nullptr);
~TabsModule();
bool removeTab(const QString& tabName);
bool addTab(const QString& tabName, int index = -1);
unsigned getTabCount();
bool addTab(const QString& tabName, Module* module);
QString generateUnusedTabName();
void addCustomActionsToMenu() override;
......@@ -23,9 +22,15 @@ class TabsModule : public DefaultModule {
XmlObject toXmlObject() override;
void fromXmlObject(const XmlObject& xmlObject) override;
protected slots:
void deleteTab(Module* module);
void replaceTabContent(Module* from, Module* to);
void onDoubleClickedItem(QListWidgetItem* item);
private:
QListWidget* tabNames;
QStackedWidget* tabContents;
QList<Module*> contentModules;
void setupUi();
};
......
......@@ -201,7 +201,9 @@ void ModulesList::createModuleList() {
#ifdef TABSMODULE_H
ModuleInfo tabs(ModuleId::TABS, "Tabs", ModuleCategory::UTILITY);
tabs.setFactory([]() {
return new TabsModule();
auto* module = new TabsModule();
module->addTab("New Tab", SkywardHubCoreProxy::getCore()->getModulesManager()->instantiateDefaultModule());
return module;
});
tabs.addModuleSourceFiles("Modules/Tabs/");
addModuleInfo(tabs);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment