diff --git a/sublime/idealbuttonbarwidget.h b/sublime/idealbuttonbarwidget.h --- a/sublime/idealbuttonbarwidget.h +++ b/sublime/idealbuttonbarwidget.h @@ -64,6 +64,9 @@ void saveShowState(); bool lastShowState(); + void loadOrderSettings(); + void saveOrderSettings(); + private Q_SLOTS: void showWidget(bool checked); void buttonPressed(bool state); @@ -75,10 +78,17 @@ void actionEvent(QActionEvent *event) override; private: + void applyOrderToLayout(); + void takeOrderFromLayout(); + + IdealToolButton* button(const QString& id); + QString id(const IdealToolButton* button); + Qt::DockWidgetArea _area; IdealController *_controller; QWidget *_corner; bool _showState; + QStringList _buttonsOrder; }; } diff --git a/sublime/idealbuttonbarwidget.cpp b/sublime/idealbuttonbarwidget.cpp --- a/sublime/idealbuttonbarwidget.cpp +++ b/sublime/idealbuttonbarwidget.cpp @@ -25,7 +25,7 @@ #include "idealdockwidget.h" #include "ideallayout.h" #include "idealtoolbutton.h" -#include "document.h" +#include "tooldocument.h" #include "view.h" #include @@ -71,6 +71,11 @@ refreshText(); } + QString id() { + auto document = dynamic_cast(m_dock->view()->document()); + return document->documentSpecifier(); + } + private: bool eventFilter(QObject * watched, QEvent * event) override { @@ -177,6 +182,67 @@ return _showState; } +QString IdealButtonBarWidget::id(const IdealToolButton* button) +{ + foreach (QAction* a, actions()) { + auto tva = dynamic_cast(a); + if (tva && tva->button() == button) + return tva->id(); + } + + return QString(); +} + +IdealToolButton* Sublime::IdealButtonBarWidget::button(const QString& id) +{ + foreach (QAction* a, actions()) { + auto tva = dynamic_cast(a); + if (tva && tva->id() == id) + return tva->button(); + } + + return nullptr; +} + +void IdealButtonBarWidget::loadOrderSettings() +{ + KConfigGroup config = KSharedConfig::openConfig()->group("UI"); + _buttonsOrder = config.readEntry(QStringLiteral("(%1) Tool Views Order").arg(_area), QStringList()); + + applyOrderToLayout(); +} + +void IdealButtonBarWidget::saveOrderSettings() +{ + takeOrderFromLayout(); + + KConfigGroup config = KSharedConfig::openConfig()->group("UI"); + config.writeEntry(QStringLiteral("(%1) Tool Views Order").arg(_area), _buttonsOrder); +} + +void IdealButtonBarWidget::applyOrderToLayout() +{ + foreach(auto a, actions()) { + if (auto tva = dynamic_cast(a)) + layout()->removeWidget(tva->button()); + } + + foreach(auto id, _buttonsOrder) { + if (auto b = button(id)) + layout()->addWidget(b); + } +} + +void IdealButtonBarWidget::takeOrderFromLayout() +{ + _buttonsOrder.clear(); + for (int i = 0; i < layout()->count(); ++i) { + IdealToolButton* button = dynamic_cast(layout()->itemAt(i)->widget()); + if (button) + _buttonsOrder += id(button); + } +} + Qt::Orientation IdealButtonBarWidget::orientation() const { if (_area == Qt::LeftDockWidgetArea || _area == Qt::RightDockWidgetArea) @@ -251,11 +317,20 @@ Q_ASSERT(action->dockWidget()); - layout()->addWidget(button); connect(action, &QAction::toggled, this, static_cast(&IdealButtonBarWidget::showWidget)); connect(button, &IdealToolButton::clicked, this, &IdealButtonBarWidget::buttonPressed); connect(button, &IdealToolButton::customContextMenuRequested, action->dockWidget(), &IdealDockWidget::contextMenuRequested); + + QString buttonId = id(button); + if (!_buttonsOrder.contains(buttonId)) { + if (_area == Qt::BottomDockWidgetArea) + _buttonsOrder.push_front(buttonId); + else + _buttonsOrder.push_back(buttonId); + } + applyOrderToLayout(); + if ( wasEmpty ) { emit emptyChanged(); } diff --git a/sublime/mainwindow_p.cpp b/sublime/mainwindow_p.cpp --- a/sublime/mainwindow_p.cpp +++ b/sublime/mainwindow_p.cpp @@ -522,6 +522,15 @@ void MainWindowPrivate::viewAdded(Sublime::AreaIndex *index, Sublime::View *view) { + static bool orderIsLoaded = false; + + if (!orderIsLoaded) { + orderIsLoaded = true; + idealController->leftBarWidget->loadOrderSettings(); + idealController->bottomBarWidget->loadOrderSettings(); + idealController->rightBarWidget->loadOrderSettings(); + } + if(m_leftTabbarCornerWidget) { m_leftTabbarCornerWidget->hide(); m_leftTabbarCornerWidget->setParent(nullptr); @@ -571,6 +580,15 @@ void MainWindowPrivate::aboutToRemoveView(Sublime::AreaIndex *index, Sublime::View *view) { + static bool orderIsSaved = false; + + if (!orderIsSaved) { + orderIsSaved = true; + idealController->leftBarWidget->saveOrderSettings(); + idealController->bottomBarWidget->saveOrderSettings(); + idealController->rightBarWidget->saveOrderSettings(); + } + QSplitter *splitter = m_indexSplitters[index]; if (!splitter) return;