Show notebooks in a tree widget
This commit is contained in:
parent
6b9556e711
commit
9319e27c5a
5 changed files with 154 additions and 7 deletions
|
@ -16,15 +16,19 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "main_window.hpp"
|
#include "main_window.hpp"
|
||||||
|
#include "notebook_tree_model.hpp"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include <QLabel>
|
#include <QTreeView>
|
||||||
|
|
||||||
namespace duck {
|
namespace duck {
|
||||||
MainWindow::MainWindow() {
|
MainWindow::MainWindow (Node* tree) :
|
||||||
|
m_tree(new QTreeView)
|
||||||
|
{
|
||||||
setWindowTitle(APP_NAME);
|
setWindowTitle(APP_NAME);
|
||||||
QLabel* const main_label = new QLabel("Main label thing");
|
setCentralWidget(m_tree);
|
||||||
setCentralWidget(main_label);
|
|
||||||
main_label->setAlignment(Qt::AlignCenter);
|
auto* model = new NotebookTreeModel(tree, m_tree);
|
||||||
|
m_tree->setModel(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow() noexcept = default;
|
MainWindow::~MainWindow() noexcept = default;
|
||||||
|
|
|
@ -19,11 +19,18 @@
|
||||||
|
|
||||||
#include <QMainWindow>
|
#include <QMainWindow>
|
||||||
|
|
||||||
|
class QTreeView;
|
||||||
|
|
||||||
namespace duck {
|
namespace duck {
|
||||||
|
class Node;
|
||||||
|
|
||||||
class MainWindow : public QMainWindow {
|
class MainWindow : public QMainWindow {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
MainWindow();
|
MainWindow (Node* tree);
|
||||||
virtual ~MainWindow() noexcept;
|
virtual ~MainWindow() noexcept;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QTreeView* m_tree;
|
||||||
};
|
};
|
||||||
} //namespace duck
|
} //namespace duck
|
||||||
|
|
|
@ -20,7 +20,10 @@ qt5 = import('qt5')
|
||||||
qt5_dep = dependency('qt5', modules: ['Core', 'Gui', 'Widgets'])
|
qt5_dep = dependency('qt5', modules: ['Core', 'Gui', 'Widgets'])
|
||||||
|
|
||||||
moc_files = qt5.preprocess(
|
moc_files = qt5.preprocess(
|
||||||
moc_headers: 'main_window.hpp',
|
moc_headers: [
|
||||||
|
'main_window.hpp',
|
||||||
|
'notebook_tree_model.hpp',
|
||||||
|
],
|
||||||
dependencies: qt5_dep
|
dependencies: qt5_dep
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -33,6 +36,7 @@ executable(meson.project_name(),
|
||||||
'main_window.cpp',
|
'main_window.cpp',
|
||||||
moc_files,
|
moc_files,
|
||||||
'notebook_tree.cpp',
|
'notebook_tree.cpp',
|
||||||
|
'notebook_tree_model.cpp',
|
||||||
dependencies: [
|
dependencies: [
|
||||||
simdjson_dep,
|
simdjson_dep,
|
||||||
qt5_dep,
|
qt5_dep,
|
||||||
|
|
90
notebook_tree_model.cpp
Normal file
90
notebook_tree_model.cpp
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
/* Copyright 2021, Michele Santullo
|
||||||
|
* This file is part of remarkable_tool.
|
||||||
|
*
|
||||||
|
* remarkable_tool is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Remarkable_tool is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with remarkable_tool. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "notebook_tree_model.hpp"
|
||||||
|
#include "notebook_tree.hpp"
|
||||||
|
|
||||||
|
namespace duck {
|
||||||
|
NotebookTreeModel::NotebookTreeModel (Node* root, QObject* parent) :
|
||||||
|
QAbstractItemModel(parent),
|
||||||
|
m_tree(root)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NotebookTreeModel::~NotebookTreeModel() noexcept = default;
|
||||||
|
|
||||||
|
int NotebookTreeModel::rowCount (const QModelIndex& parent) const {
|
||||||
|
if (parent.column() > 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (not parent.isValid())
|
||||||
|
return static_cast<int>(m_tree->children.size());
|
||||||
|
else
|
||||||
|
return static_cast<int>(static_cast<Node*>(parent.internalPointer())->children.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
int NotebookTreeModel::columnCount (const QModelIndex&) const {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Qt::ItemFlags NotebookTreeModel::flags (const QModelIndex& index) const {
|
||||||
|
if (!index.isValid())
|
||||||
|
return Qt::NoItemFlags;
|
||||||
|
|
||||||
|
return QAbstractItemModel::flags(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex NotebookTreeModel::index (
|
||||||
|
int row,
|
||||||
|
int column,
|
||||||
|
const QModelIndex& parent
|
||||||
|
) const {
|
||||||
|
if (not hasIndex(row, column, parent))
|
||||||
|
return {};
|
||||||
|
|
||||||
|
Node* const parent_item = (parent.isValid() ? static_cast<Node*>(parent.internalPointer()) : m_tree);
|
||||||
|
Node* child_item = &parent_item->children[row];
|
||||||
|
return createIndex(row, column, child_item);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant NotebookTreeModel::data (const QModelIndex& index, int role) const {
|
||||||
|
if (not index.isValid() or role != Qt::DisplayRole)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
Node* const item = static_cast<Node*>(index.internalPointer());
|
||||||
|
return QString::fromUtf8(item->info->visible_name.data(), static_cast<int>(item->info->visible_name.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant NotebookTreeModel::headerData (int section, Qt::Orientation orientation, int role) const {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex NotebookTreeModel::parent (const QModelIndex& index) const {
|
||||||
|
if (not index.isValid())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
Node* const curr_node = static_cast<Node*>(index.internalPointer());
|
||||||
|
if (curr_node->parent == m_tree) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const Node* const parent_node = curr_node->parent;
|
||||||
|
const int parent_index = static_cast<int>(parent_node - parent_node->parent->children.data());
|
||||||
|
return createIndex(parent_index, 0, const_cast<Node*>(parent_node));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} //namespace duck
|
42
notebook_tree_model.hpp
Normal file
42
notebook_tree_model.hpp
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/* Copyright 2021, Michele Santullo
|
||||||
|
* This file is part of remarkable_tool.
|
||||||
|
*
|
||||||
|
* remarkable_tool is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Remarkable_tool is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with remarkable_tool. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QAbstractItemModel>
|
||||||
|
|
||||||
|
namespace duck {
|
||||||
|
class Node;
|
||||||
|
|
||||||
|
class NotebookTreeModel : public QAbstractItemModel {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
NotebookTreeModel (Node* root, QObject* parent);
|
||||||
|
virtual ~NotebookTreeModel() noexcept;
|
||||||
|
|
||||||
|
int rowCount (const QModelIndex& parent = QModelIndex()) const override;
|
||||||
|
int columnCount (const QModelIndex& parent = QModelIndex()) const override;
|
||||||
|
Qt::ItemFlags flags (const QModelIndex& index) const override;
|
||||||
|
QModelIndex index (int row, int column, const QModelIndex& parent = QModelIndex()) const override;
|
||||||
|
QVariant data (const QModelIndex& index, int role) const override;
|
||||||
|
QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||||
|
QModelIndex parent (const QModelIndex& index) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Node* m_tree;
|
||||||
|
};
|
||||||
|
} //namespace duck
|
Loading…
Reference in a new issue