Skip to content

Commit

Permalink
Merge pull request #8 from urobots-io/files-navigation
Browse files Browse the repository at this point in the history
Files navigation
  • Loading branch information
multilexa authored Feb 21, 2024
2 parents ce0e341 + 13faad6 commit 4bd9ed8
Show file tree
Hide file tree
Showing 20 changed files with 622 additions and 95 deletions.
6 changes: 5 additions & 1 deletion anno/ApplicationModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@
using namespace std;

ApplicationModel::ApplicationModel(QObject *parent)
: QObject(parent) {
: QObject(parent)
, navigation_model_(nullptr)
{
}

ApplicationModel::~ApplicationModel() {
Expand All @@ -54,6 +56,8 @@ void ApplicationModel::ClearProject() {
files_loader_ = QJsonObject();
file_models_.clear();

navigation_model_.Clear();

PropertyDatabase::Instance().Clear();
set_is_modified(false);
}
Expand Down
5 changes: 5 additions & 0 deletions anno/ApplicationModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "ImageConverter.h"
#include "implement_q_property.h"
#include "LabelDefinitionsTreeModel.h"
#include "NavigationModel.h"
#include "SourcePicturesTreeModel.h"
#include <QObject>

Expand All @@ -21,6 +22,8 @@ class ApplicationModel : public QObject, public FileModelProviderInterface
Q_PROPERTY(std::shared_ptr<FilesystemInterface> filesystem READ get_filesystem WRITE set_filesystem NOTIFY filesystem_changed);
Q_PROPERTY(QJsonObject user_data READ get_user_data WRITE set_user_data NOTIFY user_data_changed);

NavigationModel* get_navigation_model() { return &navigation_model_; }

void NewProject(QString images_folder);
bool OpenProject(QString filename, QStringList &errors);
bool SaveProject(QStringList & errors, QString filename = QString());
Expand Down Expand Up @@ -119,6 +122,8 @@ public slots:

QString project_script_;

NavigationModel navigation_model_;

public:
IMPLEMENT_Q_PROPERTY_READ(is_modified);
IMPLEMENT_Q_PROPERTY_READ(user_data);
Expand Down
18 changes: 16 additions & 2 deletions anno/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "ImageSettingsWidget.h"
#include "LabelDefinitionPropertiesWidget.h"
#include "messagebox.h"
#include "NavigationWidget.h"
#include "ProjectDefinitionsDialog.h"
#include "ProjectSettingsWidget.h"
#include "LabelPropertiesWidget.h"
Expand Down Expand Up @@ -112,6 +113,21 @@ MainWindow::MainWindow(QWidget *parent)
ui.mouse_pos_label->setElideMode(Qt::ElideRight);
ui.color_value_label->setElideMode(Qt::ElideRight);

// navigation
ui.mainToolBar->addSeparator();

NavigationWidget* navigationWidget = new NavigationWidget(model_.get_navigation_model(), this);
ui.mainToolBar->addWidget(navigationWidget);

/*
QWidget *spacerWidget = new QWidget(this);
spacerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
spacerWidget->setVisible(true);
ui.mainToolBar->addWidget(spacerWidget);
*/



UpdateApplicationTitle();
UpdateProjectControls();

Expand Down Expand Up @@ -435,8 +451,6 @@ void MainWindow::OnImageFileChanged(std::shared_ptr<FileModel> value) {
connect(ui.undo_action, &QAction::triggered, stack, &QUndoStack::undo);
connect(ui.redo_action, &QAction::triggered, stack, &QUndoStack::redo);
}

ui.desktop_status_label->setText(selected_file_ ? selected_file_->get_id() : QString());
}

void MainWindow::CanUndoChanged(bool value) {
Expand Down
2 changes: 1 addition & 1 deletion anno/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public slots:
void OnProjectSettings();
void UpdateApplicationTitle();
void UpdateProjectControls();
void OnEvaluateInROI();
void OnEvaluateInROI();

private:
bool CloseActiveProject();
Expand Down
65 changes: 33 additions & 32 deletions anno/MainWindow.qrc
Original file line number Diff line number Diff line change
@@ -1,34 +1,35 @@
<RCC>
<qresource prefix="/MainWindow">
<file>Resources/paste.ico</file>
<file>Resources/3d.ico</file>
<file>Resources/open.ico</file>
<file>Resources/save.ico</file>
<file>Resources/Redo.ico</file>
<file>Resources/Undo.ico</file>
<file>Resources/file.ico</file>
<file>Resources/folder.ico</file>
<file>Resources/image.ico</file>
<file>Resources/delete.ico</file>
<file>Resources/refresh.ico</file>
<file>Resources/configuration.ico</file>
<file>Resources/folder_network.ico</file>
<file>Resources/file_blue.ico</file>
<file>Resources/add.ico</file>
<file>Resources/fit_to_size.ico</file>
<file>Resources/fix.ico</file>
<file>Resources/restart.ico</file>
<file>Resources/select.png</file>
<file>Resources/anno.ico</file>
<file>Resources/new.ico</file>
<file>Resources/copy.ico</file>
<file>Resources/find.ico</file>
<file>Resources/nav_back.ico</file>
<file>Resources/nav_forward.ico</file>
<file>Resources/rename.ico</file>
<file>Resources/clean.ico</file>
<file>Resources/tree_view.ico</file>
<file>Resources/component.ico</file>
<file>Resources/search-inside.ico</file>
</qresource>
<qresource prefix="/MainWindow">
<file>Resources/paste.ico</file>
<file>Resources/info.ico</file>
<file>Resources/3d.ico</file>
<file>Resources/open.ico</file>
<file>Resources/save.ico</file>
<file>Resources/Redo.ico</file>
<file>Resources/Undo.ico</file>
<file>Resources/file.ico</file>
<file>Resources/folder.ico</file>
<file>Resources/image.ico</file>
<file>Resources/delete.ico</file>
<file>Resources/refresh.ico</file>
<file>Resources/configuration.ico</file>
<file>Resources/folder_network.ico</file>
<file>Resources/file_blue.ico</file>
<file>Resources/add.ico</file>
<file>Resources/fit_to_size.ico</file>
<file>Resources/fix.ico</file>
<file>Resources/restart.ico</file>
<file>Resources/select.png</file>
<file>Resources/anno.ico</file>
<file>Resources/new.ico</file>
<file>Resources/copy.ico</file>
<file>Resources/find.ico</file>
<file>Resources/nav_back.ico</file>
<file>Resources/nav_forward.ico</file>
<file>Resources/rename.ico</file>
<file>Resources/clean.ico</file>
<file>Resources/tree_view.ico</file>
<file>Resources/component.ico</file>
<file>Resources/search-inside.ico</file>
</qresource>
</RCC>
29 changes: 8 additions & 21 deletions anno/MainWindow.ui
Original file line number Diff line number Diff line change
Expand Up @@ -184,30 +184,17 @@
</widget>
</item>
<item>
<widget class="Line" name="line_2">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>15</height>
</size>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="ElidedLabelWidget" name="desktop_status_label" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</widget>
</spacer>
</item>
<item>
<widget class="QLabel" name="label">
Expand Down
49 changes: 49 additions & 0 deletions anno/NavigationModel.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#include "NavigationModel.h"

void NavigationModel::Clear() {
paths_.clear();
set_current_path({});
set_can_back(false);
set_can_forward(false);
}

void NavigationModel::SetPath(const QString & path) {
if (path.isEmpty()) {
return;
}

while (index_ + 1 < paths_.size()) {
paths_.removeLast();
}

while (paths_.size() > 100) {
paths_.removeFirst();
}

paths_ << path;
index_ = paths_.size() - 1;

set_current_path(path);
set_can_back(index_ > 0);
set_can_forward(false);

}

void NavigationModel::Back() {
if (index_ > 0) {
index_--;
set_current_path(paths_[index_]);
set_can_back(index_ > 0);
set_can_forward(true);
}
}

void NavigationModel::Forward() {
if (index_ + 1 < paths_.size()) {
index_++;
set_current_path(paths_[index_]);
set_can_back(true);
set_can_forward(index_ + 1 < paths_.size());
}
}

48 changes: 48 additions & 0 deletions anno/NavigationModel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#pragma once
#include <QObject>
#include <QString>
#include "implement_q_property.h"

class NavigationModel : public QObject {
Q_OBJECT

public:
NavigationModel(QObject *parent) : QObject(parent) {}
~NavigationModel() {}

Q_PROPERTY(QString current_path READ get_current_path WRITE set_current_path NOTIFY current_path_changed);
Q_PROPERTY(bool can_back READ get_can_back WRITE set_can_back NOTIFY can_back_changed);
Q_PROPERTY(bool can_forward READ get_can_forward WRITE set_can_forward NOTIFY can_forward_changed);

void SetPath(const QString & path);

signals:
void current_path_changed(QString);
void can_back_changed(bool);
void can_forward_changed(bool);

public slots:
void Back();
void Forward();
void Clear();

private:
IMPLEMENT_Q_PROPERTY_WRITE(QString, current_path);
IMPLEMENT_Q_PROPERTY_WRITE(bool, can_back);
IMPLEMENT_Q_PROPERTY_WRITE(bool, can_forward);

private:
QString current_path_;

bool can_back_ = false;
bool can_forward_ = false;

int index_ = 0;

QStringList paths_;

public:
IMPLEMENT_Q_PROPERTY_READ(current_path);
IMPLEMENT_Q_PROPERTY_READ(can_back);
IMPLEMENT_Q_PROPERTY_READ(can_forward);
};
23 changes: 23 additions & 0 deletions anno/NavigationWidget.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Anno Labeling Tool
// 2020-2024 (c) urobots GmbH, https://urobots.io/en/portfolio/anno/
#include "NavigationWidget.h"

NavigationWidget::NavigationWidget(NavigationModel *model, QWidget *parent)
: QWidget(parent)
, model_(model)
{
ui.setupUi(this);

connect(model_, &NavigationModel::current_path_changed, ui.filename_lineEdit, &QLineEdit::setText);
connect(model_, &NavigationModel::can_back_changed, ui.back_toolButton, &QToolButton::setEnabled);
connect(model_, &NavigationModel::can_forward_changed, ui.forward_toolButton, &QToolButton::setEnabled);

connect(ui.back_toolButton, &QToolButton::clicked, model_, &NavigationModel::Back);
connect(ui.forward_toolButton, &QToolButton::clicked, model_, &NavigationModel::Forward);

ui.back_toolButton->setEnabled(false);
ui.forward_toolButton->setEnabled(false);
}

NavigationWidget::~NavigationWidget() {
}
23 changes: 23 additions & 0 deletions anno/NavigationWidget.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#pragma once
#include "NavigationModel.h"
#include "ui_NavigationWidget.h"
#include <QWidget>


class NavigationWidget : public QWidget
{
Q_OBJECT

public:
NavigationWidget(NavigationModel *model, QWidget *parent = nullptr);
~NavigationWidget();

signals:

public slots:


private:
Ui::NavigationWidget ui;
NavigationModel *model_;
};
Loading

0 comments on commit 4bd9ed8

Please sign in to comment.