[libcamera-devel,5/6] qcam: Provide initial icon buttons "Play/Stop"

Message ID 20200206150504.24204-6-kieran.bingham@ideasonboard.com
State Superseded
Headers show
Series
  • qcam: Provide an initial toolbar
Related show

Commit Message

Kieran Bingham Feb. 6, 2020, 3:05 p.m. UTC
Provide Quit, Play, Pause, Stop icons.

Utilise the provided QT resources to present icons for the toolbar.

Update the Quit button with a 'cross', and implement Play/Pause/Stop
buttons.

'Pause' is a no-op currently and likely could be removed, but I wanted
an ability to distinguish between holding the stream and restarting it.

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
 src/qcam/main_window.cpp | 12 +++++++++++-
 src/qcam/main_window.h   |  7 +++----
 src/qcam/meson.build     |  8 +++++++-
 3 files changed, 21 insertions(+), 6 deletions(-)

Comments

Laurent Pinchart Feb. 7, 2020, midnight UTC | #1
Hi Kieran,

Thank you for the patch.

On Thu, Feb 06, 2020 at 03:05:03PM +0000, Kieran Bingham wrote:
> Provide Quit, Play, Pause, Stop icons.
> 
> Utilise the provided QT resources to present icons for the toolbar.

s/QT/Qt/

> 
> Update the Quit button with a 'cross', and implement Play/Pause/Stop
> buttons.

I really like the Breeze icons from KDE, they have a quit button, but
they're unfortunately licensed under LGPL-3+, not LGPL-2.1+.

> 'Pause' is a no-op currently and likely could be removed, but I wanted
> an ability to distinguish between holding the stream and restarting it.

How about adding pause when we'll have that ability ? :-) A no-op button
is confusing.

> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> ---
>  src/qcam/main_window.cpp | 12 +++++++++++-
>  src/qcam/main_window.h   |  7 +++----
>  src/qcam/meson.build     |  8 +++++++-
>  3 files changed, 21 insertions(+), 6 deletions(-)
> 
> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> index 1c7260f32d0a..0ae4c60b8699 100644
> --- a/src/qcam/main_window.cpp
> +++ b/src/qcam/main_window.cpp
> @@ -11,6 +11,7 @@
>  #include <sys/mman.h>
>  
>  #include <QCoreApplication>
> +#include <QIcon>
>  #include <QInputDialog>
>  #include <QTimer>
>  #include <QToolBar>
> @@ -63,7 +64,7 @@ int MainWindow::createToolbars(CameraManager *cm)
>  
>  	toolbar_ = addToolBar("");
>  
> -	action = toolbar_->addAction("Quit");
> +	action = toolbar_->addAction(QIcon(":x-circle.svg"), "Quit");
>  	connect(action, &QAction::triggered, this, &MainWindow::quit);
>  
>  	QAction *cameraAction = new QAction("&Cameras", this);
> @@ -79,6 +80,15 @@ int MainWindow::createToolbars(CameraManager *cm)
>  		connect(action, &QAction::triggered, this, [=]() { this->setCamera(cam); });
>  	}
>  
> +	action = toolbar_->addAction(QIcon(":play-circle.svg"), "start");
> +	connect(action, &QAction::triggered, this, &MainWindow::startCapture);
> +
> +	toolbar_->addAction(QIcon(":pause-circle.svg"), "pause");
> +	/* TODO: Connect an action to perform when 'pause' requested? or remove */
> +
> +	action = toolbar_->addAction(QIcon(":stop-circle.svg"), "stop");
> +	connect(action, &QAction::triggered, this, &MainWindow::stopCapture);
> +
>  	return 0;
>  }
>  
> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
> index f7c96fdd5c30..b0bf16dd2a09 100644
> --- a/src/qcam/main_window.h
> +++ b/src/qcam/main_window.h
> @@ -46,14 +46,13 @@ private Q_SLOTS:
>  
>  	int setCamera(const std::shared_ptr<Camera> &cam);
>  
> +	int startCapture();
> +	void stopCapture();
> +
>  private:
>  	int createToolbars(CameraManager *cm);
>  	std::string chooseCamera(CameraManager *cm);
>  	int openCamera(CameraManager *cm);
> -
> -	int startCapture();
> -	void stopCapture();
> -
>  	void requestComplete(Request *request);
>  	int display(FrameBuffer *buffer);
>  
> diff --git a/src/qcam/meson.build b/src/qcam/meson.build
> index 1e71f20fa15e..b6544dbf3f2b 100644
> --- a/src/qcam/meson.build
> +++ b/src/qcam/meson.build
> @@ -11,6 +11,10 @@ qcam_moc_headers = files([
>      'main_window.h',
>  ])
>  
> +qcam_resources = files([
> +    'assets/feathericons/feathericons.qrc',
> +])

I wonder, should we only import the icons we use ? Would it also make
sense to generate the qrc file as part of the build process, or is it
supposed to be part of the sources ?

> +
>  qt5 = import('qt5')
>  qt5_dep = dependency('qt5',
>                       method : 'pkg-config',
> @@ -33,7 +37,9 @@ if qt5_dep.found()
>      moc_files = qt5.preprocess(moc_headers: qcam_moc_headers,
>                                 dependencies: qt5_dep)
>  
> -    qcam  = executable('qcam', qcam_sources, moc_files,
> +    resources = qt5.preprocess(qresources : qcam_resources)

How about combining the moc and rcc ?

    resources = qt5.preprocess(moc_headers: qcam_moc_headers,
                               qresources : qcam_resources,
                               dependencies: qt5_dep)

    qcam  = executable('qcam', qcam_sources, resources,
                       install : true,
                       dependencies : [libcamera_dep, qt5_dep],
                       cpp_args : qt5_cpp_args)

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> +
> +    qcam  = executable('qcam', qcam_sources, moc_files, resources,
>                         install : true,
>                         dependencies : [libcamera_dep, qt5_dep],
>                         cpp_args : qt5_cpp_args)
Kieran Bingham Feb. 13, 2020, 10:51 p.m. UTC | #2
Hi Laurent,

On 07/02/2020 00:00, Laurent Pinchart wrote:
> Hi Kieran,
> 
> Thank you for the patch.
> 
> On Thu, Feb 06, 2020 at 03:05:03PM +0000, Kieran Bingham wrote:
>> Provide Quit, Play, Pause, Stop icons.
>>
>> Utilise the provided QT resources to present icons for the toolbar.
> 
> s/QT/Qt/
> 
>>
>> Update the Quit button with a 'cross', and implement Play/Pause/Stop
>> buttons.
> 
> I really like the Breeze icons from KDE, they have a quit button, but
> they're unfortunately licensed under LGPL-3+, not LGPL-2.1+.
> 
>> 'Pause' is a no-op currently and likely could be removed, but I wanted
>> an ability to distinguish between holding the stream and restarting it.
> 
> How about adding pause when we'll have that ability ? :-) A no-op button
> is confusing.

Pause is removed.


> 
>> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
>> ---
>>  src/qcam/main_window.cpp | 12 +++++++++++-
>>  src/qcam/main_window.h   |  7 +++----
>>  src/qcam/meson.build     |  8 +++++++-
>>  3 files changed, 21 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
>> index 1c7260f32d0a..0ae4c60b8699 100644
>> --- a/src/qcam/main_window.cpp
>> +++ b/src/qcam/main_window.cpp
>> @@ -11,6 +11,7 @@
>>  #include <sys/mman.h>
>>  
>>  #include <QCoreApplication>
>> +#include <QIcon>
>>  #include <QInputDialog>
>>  #include <QTimer>
>>  #include <QToolBar>
>> @@ -63,7 +64,7 @@ int MainWindow::createToolbars(CameraManager *cm)
>>  
>>  	toolbar_ = addToolBar("");
>>  
>> -	action = toolbar_->addAction("Quit");
>> +	action = toolbar_->addAction(QIcon(":x-circle.svg"), "Quit");
>>  	connect(action, &QAction::triggered, this, &MainWindow::quit);
>>  
>>  	QAction *cameraAction = new QAction("&Cameras", this);
>> @@ -79,6 +80,15 @@ int MainWindow::createToolbars(CameraManager *cm)
>>  		connect(action, &QAction::triggered, this, [=]() { this->setCamera(cam); });
>>  	}
>>  
>> +	action = toolbar_->addAction(QIcon(":play-circle.svg"), "start");
>> +	connect(action, &QAction::triggered, this, &MainWindow::startCapture);
>> +
>> +	toolbar_->addAction(QIcon(":pause-circle.svg"), "pause");
>> +	/* TODO: Connect an action to perform when 'pause' requested? or remove */
>> +
>> +	action = toolbar_->addAction(QIcon(":stop-circle.svg"), "stop");
>> +	connect(action, &QAction::triggered, this, &MainWindow::stopCapture);
>> +
>>  	return 0;
>>  }
>>  
>> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
>> index f7c96fdd5c30..b0bf16dd2a09 100644
>> --- a/src/qcam/main_window.h
>> +++ b/src/qcam/main_window.h
>> @@ -46,14 +46,13 @@ private Q_SLOTS:
>>  
>>  	int setCamera(const std::shared_ptr<Camera> &cam);
>>  
>> +	int startCapture();
>> +	void stopCapture();
>> +
>>  private:
>>  	int createToolbars(CameraManager *cm);
>>  	std::string chooseCamera(CameraManager *cm);
>>  	int openCamera(CameraManager *cm);
>> -
>> -	int startCapture();
>> -	void stopCapture();
>> -
>>  	void requestComplete(Request *request);
>>  	int display(FrameBuffer *buffer);
>>  
>> diff --git a/src/qcam/meson.build b/src/qcam/meson.build
>> index 1e71f20fa15e..b6544dbf3f2b 100644
>> --- a/src/qcam/meson.build
>> +++ b/src/qcam/meson.build
>> @@ -11,6 +11,10 @@ qcam_moc_headers = files([
>>      'main_window.h',
>>  ])
>>  
>> +qcam_resources = files([
>> +    'assets/feathericons/feathericons.qrc',
>> +])
> 
> I wonder, should we only import the icons we use ? Would it also make
> sense to generate the qrc file as part of the build process, or is it
> supposed to be part of the sources ?


There's no facility in meson to generate the qrc, which would have been
nice.

I'd rather specify the icons used in a meson variable and have it
generate. We could pull together our own script - but for now we can
just hard code the entries in the .qrc file itself.


>> +
>>  qt5 = import('qt5')
>>  qt5_dep = dependency('qt5',
>>                       method : 'pkg-config',
>> @@ -33,7 +37,9 @@ if qt5_dep.found()
>>      moc_files = qt5.preprocess(moc_headers: qcam_moc_headers,
>>                                 dependencies: qt5_dep)
>>  
>> -    qcam  = executable('qcam', qcam_sources, moc_files,
>> +    resources = qt5.preprocess(qresources : qcam_resources)
> 
> How about combining the moc and rcc ?
> 
>     resources = qt5.preprocess(moc_headers: qcam_moc_headers,
>                                qresources : qcam_resources,
>                                dependencies: qt5_dep)

Aha, for some reason I had assumed that had to be separated.

I'll update it and if it works, it's in.


> 
>     qcam  = executable('qcam', qcam_sources, resources,
>                        install : true,
>                        dependencies : [libcamera_dep, qt5_dep],
>                        cpp_args : qt5_cpp_args)
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
>> +
>> +    qcam  = executable('qcam', qcam_sources, moc_files, resources,
>>                         install : true,
>>                         dependencies : [libcamera_dep, qt5_dep],
>>                         cpp_args : qt5_cpp_args)
>

Patch

diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index 1c7260f32d0a..0ae4c60b8699 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -11,6 +11,7 @@ 
 #include <sys/mman.h>
 
 #include <QCoreApplication>
+#include <QIcon>
 #include <QInputDialog>
 #include <QTimer>
 #include <QToolBar>
@@ -63,7 +64,7 @@  int MainWindow::createToolbars(CameraManager *cm)
 
 	toolbar_ = addToolBar("");
 
-	action = toolbar_->addAction("Quit");
+	action = toolbar_->addAction(QIcon(":x-circle.svg"), "Quit");
 	connect(action, &QAction::triggered, this, &MainWindow::quit);
 
 	QAction *cameraAction = new QAction("&Cameras", this);
@@ -79,6 +80,15 @@  int MainWindow::createToolbars(CameraManager *cm)
 		connect(action, &QAction::triggered, this, [=]() { this->setCamera(cam); });
 	}
 
+	action = toolbar_->addAction(QIcon(":play-circle.svg"), "start");
+	connect(action, &QAction::triggered, this, &MainWindow::startCapture);
+
+	toolbar_->addAction(QIcon(":pause-circle.svg"), "pause");
+	/* TODO: Connect an action to perform when 'pause' requested? or remove */
+
+	action = toolbar_->addAction(QIcon(":stop-circle.svg"), "stop");
+	connect(action, &QAction::triggered, this, &MainWindow::stopCapture);
+
 	return 0;
 }
 
diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
index f7c96fdd5c30..b0bf16dd2a09 100644
--- a/src/qcam/main_window.h
+++ b/src/qcam/main_window.h
@@ -46,14 +46,13 @@  private Q_SLOTS:
 
 	int setCamera(const std::shared_ptr<Camera> &cam);
 
+	int startCapture();
+	void stopCapture();
+
 private:
 	int createToolbars(CameraManager *cm);
 	std::string chooseCamera(CameraManager *cm);
 	int openCamera(CameraManager *cm);
-
-	int startCapture();
-	void stopCapture();
-
 	void requestComplete(Request *request);
 	int display(FrameBuffer *buffer);
 
diff --git a/src/qcam/meson.build b/src/qcam/meson.build
index 1e71f20fa15e..b6544dbf3f2b 100644
--- a/src/qcam/meson.build
+++ b/src/qcam/meson.build
@@ -11,6 +11,10 @@  qcam_moc_headers = files([
     'main_window.h',
 ])
 
+qcam_resources = files([
+    'assets/feathericons/feathericons.qrc',
+])
+
 qt5 = import('qt5')
 qt5_dep = dependency('qt5',
                      method : 'pkg-config',
@@ -33,7 +37,9 @@  if qt5_dep.found()
     moc_files = qt5.preprocess(moc_headers: qcam_moc_headers,
                                dependencies: qt5_dep)
 
-    qcam  = executable('qcam', qcam_sources, moc_files,
+    resources = qt5.preprocess(qresources : qcam_resources)
+
+    qcam  = executable('qcam', qcam_sources, moc_files, resources,
                        install : true,
                        dependencies : [libcamera_dep, qt5_dep],
                        cpp_args : qt5_cpp_args)