Skip to content

Commit 4bd9ed8

Browse files
authored
Merge pull request #8 from urobots-io/files-navigation
Files navigation
2 parents ce0e341 + 13faad6 commit 4bd9ed8

20 files changed

+622
-95
lines changed

anno/ApplicationModel.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@
3939
using namespace std;
4040

4141
ApplicationModel::ApplicationModel(QObject *parent)
42-
: QObject(parent) {
42+
: QObject(parent)
43+
, navigation_model_(nullptr)
44+
{
4345
}
4446

4547
ApplicationModel::~ApplicationModel() {
@@ -54,6 +56,8 @@ void ApplicationModel::ClearProject() {
5456
files_loader_ = QJsonObject();
5557
file_models_.clear();
5658

59+
navigation_model_.Clear();
60+
5761
PropertyDatabase::Instance().Clear();
5862
set_is_modified(false);
5963
}

anno/ApplicationModel.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "ImageConverter.h"
44
#include "implement_q_property.h"
55
#include "LabelDefinitionsTreeModel.h"
6+
#include "NavigationModel.h"
67
#include "SourcePicturesTreeModel.h"
78
#include <QObject>
89

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

25+
NavigationModel* get_navigation_model() { return &navigation_model_; }
26+
2427
void NewProject(QString images_folder);
2528
bool OpenProject(QString filename, QStringList &errors);
2629
bool SaveProject(QStringList & errors, QString filename = QString());
@@ -119,6 +122,8 @@ public slots:
119122

120123
QString project_script_;
121124

125+
NavigationModel navigation_model_;
126+
122127
public:
123128
IMPLEMENT_Q_PROPERTY_READ(is_modified);
124129
IMPLEMENT_Q_PROPERTY_READ(user_data);

anno/MainWindow.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "ImageSettingsWidget.h"
1010
#include "LabelDefinitionPropertiesWidget.h"
1111
#include "messagebox.h"
12+
#include "NavigationWidget.h"
1213
#include "ProjectDefinitionsDialog.h"
1314
#include "ProjectSettingsWidget.h"
1415
#include "LabelPropertiesWidget.h"
@@ -112,6 +113,21 @@ MainWindow::MainWindow(QWidget *parent)
112113
ui.mouse_pos_label->setElideMode(Qt::ElideRight);
113114
ui.color_value_label->setElideMode(Qt::ElideRight);
114115

116+
// navigation
117+
ui.mainToolBar->addSeparator();
118+
119+
NavigationWidget* navigationWidget = new NavigationWidget(model_.get_navigation_model(), this);
120+
ui.mainToolBar->addWidget(navigationWidget);
121+
122+
/*
123+
QWidget *spacerWidget = new QWidget(this);
124+
spacerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
125+
spacerWidget->setVisible(true);
126+
ui.mainToolBar->addWidget(spacerWidget);
127+
*/
128+
129+
130+
115131
UpdateApplicationTitle();
116132
UpdateProjectControls();
117133

@@ -435,8 +451,6 @@ void MainWindow::OnImageFileChanged(std::shared_ptr<FileModel> value) {
435451
connect(ui.undo_action, &QAction::triggered, stack, &QUndoStack::undo);
436452
connect(ui.redo_action, &QAction::triggered, stack, &QUndoStack::redo);
437453
}
438-
439-
ui.desktop_status_label->setText(selected_file_ ? selected_file_->get_id() : QString());
440454
}
441455

442456
void MainWindow::CanUndoChanged(bool value) {

anno/MainWindow.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public slots:
4747
void OnProjectSettings();
4848
void UpdateApplicationTitle();
4949
void UpdateProjectControls();
50-
void OnEvaluateInROI();
50+
void OnEvaluateInROI();
5151

5252
private:
5353
bool CloseActiveProject();

anno/MainWindow.qrc

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,35 @@
11
<RCC>
2-
<qresource prefix="/MainWindow">
3-
<file>Resources/paste.ico</file>
4-
<file>Resources/3d.ico</file>
5-
<file>Resources/open.ico</file>
6-
<file>Resources/save.ico</file>
7-
<file>Resources/Redo.ico</file>
8-
<file>Resources/Undo.ico</file>
9-
<file>Resources/file.ico</file>
10-
<file>Resources/folder.ico</file>
11-
<file>Resources/image.ico</file>
12-
<file>Resources/delete.ico</file>
13-
<file>Resources/refresh.ico</file>
14-
<file>Resources/configuration.ico</file>
15-
<file>Resources/folder_network.ico</file>
16-
<file>Resources/file_blue.ico</file>
17-
<file>Resources/add.ico</file>
18-
<file>Resources/fit_to_size.ico</file>
19-
<file>Resources/fix.ico</file>
20-
<file>Resources/restart.ico</file>
21-
<file>Resources/select.png</file>
22-
<file>Resources/anno.ico</file>
23-
<file>Resources/new.ico</file>
24-
<file>Resources/copy.ico</file>
25-
<file>Resources/find.ico</file>
26-
<file>Resources/nav_back.ico</file>
27-
<file>Resources/nav_forward.ico</file>
28-
<file>Resources/rename.ico</file>
29-
<file>Resources/clean.ico</file>
30-
<file>Resources/tree_view.ico</file>
31-
<file>Resources/component.ico</file>
32-
<file>Resources/search-inside.ico</file>
33-
</qresource>
2+
<qresource prefix="/MainWindow">
3+
<file>Resources/paste.ico</file>
4+
<file>Resources/info.ico</file>
5+
<file>Resources/3d.ico</file>
6+
<file>Resources/open.ico</file>
7+
<file>Resources/save.ico</file>
8+
<file>Resources/Redo.ico</file>
9+
<file>Resources/Undo.ico</file>
10+
<file>Resources/file.ico</file>
11+
<file>Resources/folder.ico</file>
12+
<file>Resources/image.ico</file>
13+
<file>Resources/delete.ico</file>
14+
<file>Resources/refresh.ico</file>
15+
<file>Resources/configuration.ico</file>
16+
<file>Resources/folder_network.ico</file>
17+
<file>Resources/file_blue.ico</file>
18+
<file>Resources/add.ico</file>
19+
<file>Resources/fit_to_size.ico</file>
20+
<file>Resources/fix.ico</file>
21+
<file>Resources/restart.ico</file>
22+
<file>Resources/select.png</file>
23+
<file>Resources/anno.ico</file>
24+
<file>Resources/new.ico</file>
25+
<file>Resources/copy.ico</file>
26+
<file>Resources/find.ico</file>
27+
<file>Resources/nav_back.ico</file>
28+
<file>Resources/nav_forward.ico</file>
29+
<file>Resources/rename.ico</file>
30+
<file>Resources/clean.ico</file>
31+
<file>Resources/tree_view.ico</file>
32+
<file>Resources/component.ico</file>
33+
<file>Resources/search-inside.ico</file>
34+
</qresource>
3435
</RCC>

anno/MainWindow.ui

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -184,30 +184,17 @@
184184
</widget>
185185
</item>
186186
<item>
187-
<widget class="Line" name="line_2">
188-
<property name="maximumSize">
189-
<size>
190-
<width>16777215</width>
191-
<height>15</height>
192-
</size>
193-
</property>
194-
<property name="frameShadow">
195-
<enum>QFrame::Raised</enum>
196-
</property>
187+
<spacer name="horizontalSpacer">
197188
<property name="orientation">
198-
<enum>Qt::Vertical</enum>
189+
<enum>Qt::Horizontal</enum>
199190
</property>
200-
</widget>
201-
</item>
202-
<item>
203-
<widget class="ElidedLabelWidget" name="desktop_status_label" native="true">
204-
<property name="sizePolicy">
205-
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
206-
<horstretch>0</horstretch>
207-
<verstretch>0</verstretch>
208-
</sizepolicy>
191+
<property name="sizeHint" stdset="0">
192+
<size>
193+
<width>40</width>
194+
<height>20</height>
195+
</size>
209196
</property>
210-
</widget>
197+
</spacer>
211198
</item>
212199
<item>
213200
<widget class="QLabel" name="label">

anno/NavigationModel.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#include "NavigationModel.h"
2+
3+
void NavigationModel::Clear() {
4+
paths_.clear();
5+
set_current_path({});
6+
set_can_back(false);
7+
set_can_forward(false);
8+
}
9+
10+
void NavigationModel::SetPath(const QString & path) {
11+
if (path.isEmpty()) {
12+
return;
13+
}
14+
15+
while (index_ + 1 < paths_.size()) {
16+
paths_.removeLast();
17+
}
18+
19+
while (paths_.size() > 100) {
20+
paths_.removeFirst();
21+
}
22+
23+
paths_ << path;
24+
index_ = paths_.size() - 1;
25+
26+
set_current_path(path);
27+
set_can_back(index_ > 0);
28+
set_can_forward(false);
29+
30+
}
31+
32+
void NavigationModel::Back() {
33+
if (index_ > 0) {
34+
index_--;
35+
set_current_path(paths_[index_]);
36+
set_can_back(index_ > 0);
37+
set_can_forward(true);
38+
}
39+
}
40+
41+
void NavigationModel::Forward() {
42+
if (index_ + 1 < paths_.size()) {
43+
index_++;
44+
set_current_path(paths_[index_]);
45+
set_can_back(true);
46+
set_can_forward(index_ + 1 < paths_.size());
47+
}
48+
}
49+

anno/NavigationModel.h

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#pragma once
2+
#include <QObject>
3+
#include <QString>
4+
#include "implement_q_property.h"
5+
6+
class NavigationModel : public QObject {
7+
Q_OBJECT
8+
9+
public:
10+
NavigationModel(QObject *parent) : QObject(parent) {}
11+
~NavigationModel() {}
12+
13+
Q_PROPERTY(QString current_path READ get_current_path WRITE set_current_path NOTIFY current_path_changed);
14+
Q_PROPERTY(bool can_back READ get_can_back WRITE set_can_back NOTIFY can_back_changed);
15+
Q_PROPERTY(bool can_forward READ get_can_forward WRITE set_can_forward NOTIFY can_forward_changed);
16+
17+
void SetPath(const QString & path);
18+
19+
signals:
20+
void current_path_changed(QString);
21+
void can_back_changed(bool);
22+
void can_forward_changed(bool);
23+
24+
public slots:
25+
void Back();
26+
void Forward();
27+
void Clear();
28+
29+
private:
30+
IMPLEMENT_Q_PROPERTY_WRITE(QString, current_path);
31+
IMPLEMENT_Q_PROPERTY_WRITE(bool, can_back);
32+
IMPLEMENT_Q_PROPERTY_WRITE(bool, can_forward);
33+
34+
private:
35+
QString current_path_;
36+
37+
bool can_back_ = false;
38+
bool can_forward_ = false;
39+
40+
int index_ = 0;
41+
42+
QStringList paths_;
43+
44+
public:
45+
IMPLEMENT_Q_PROPERTY_READ(current_path);
46+
IMPLEMENT_Q_PROPERTY_READ(can_back);
47+
IMPLEMENT_Q_PROPERTY_READ(can_forward);
48+
};

anno/NavigationWidget.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Anno Labeling Tool
2+
// 2020-2024 (c) urobots GmbH, https://urobots.io/en/portfolio/anno/
3+
#include "NavigationWidget.h"
4+
5+
NavigationWidget::NavigationWidget(NavigationModel *model, QWidget *parent)
6+
: QWidget(parent)
7+
, model_(model)
8+
{
9+
ui.setupUi(this);
10+
11+
connect(model_, &NavigationModel::current_path_changed, ui.filename_lineEdit, &QLineEdit::setText);
12+
connect(model_, &NavigationModel::can_back_changed, ui.back_toolButton, &QToolButton::setEnabled);
13+
connect(model_, &NavigationModel::can_forward_changed, ui.forward_toolButton, &QToolButton::setEnabled);
14+
15+
connect(ui.back_toolButton, &QToolButton::clicked, model_, &NavigationModel::Back);
16+
connect(ui.forward_toolButton, &QToolButton::clicked, model_, &NavigationModel::Forward);
17+
18+
ui.back_toolButton->setEnabled(false);
19+
ui.forward_toolButton->setEnabled(false);
20+
}
21+
22+
NavigationWidget::~NavigationWidget() {
23+
}

anno/NavigationWidget.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#pragma once
2+
#include "NavigationModel.h"
3+
#include "ui_NavigationWidget.h"
4+
#include <QWidget>
5+
6+
7+
class NavigationWidget : public QWidget
8+
{
9+
Q_OBJECT
10+
11+
public:
12+
NavigationWidget(NavigationModel *model, QWidget *parent = nullptr);
13+
~NavigationWidget();
14+
15+
signals:
16+
17+
public slots:
18+
19+
20+
private:
21+
Ui::NavigationWidget ui;
22+
NavigationModel *model_;
23+
};

0 commit comments

Comments
 (0)