Bug 135048

Summary: easy comparing similar pictures using a lighttable
Product: [Applications] digikam Reporter: Oliver Doerr <kde>
Component: LightTable-EngineAssignee: Digikam Developers <digikam-bugs-null>
Status: RESOLVED FIXED    
Severity: wishlist CC: Julien, lure, marcel.wiesweg, mikmach
Priority: NOR    
Version: 0.9.0   
Target Milestone: ---   
Platform: unspecified   
OS: Linux   
Latest Commit: Version Fixed In: 0.9.2
Sentry Crash Report:
Attachments: First Mocup of lighttable in album gui
Second Light Table sidebar with content resizable...
first (and uncomplete) light table implementation...
patch to test new Thumbbar implementation depending of digiKam DB
Thumbbar for LT using digiKam DB informations.

Description Oliver Doerr 2006-10-03 16:16:02 UTC
Version:           0.9.0-beta2 (using KDE 3.5.4 Level "a" , unofficial build of SUSE )
Compiler:          Target: i586-suse-linux
OS:                Linux (i686) release 2.6.13-15-default

Hi.

i have sometimes similar pictures and try to find the best of  them. A "lighttable" would be very handsome for this job. I think of the following workflow...
1. Open the Lighttable as a small window (perhaps a sidebar)
2. Use drag and drop to put the photos in there (normally 3, 4, 5 or so)
3. Resize the Lighttable to full screen -> the thumbs of all pictures in there will be increased to a size that they all fit in the lighttable
4. I select some of the pictures using the mouse for a closer look and use the wheel on the mouse to increase their preview size -> this leeds to a smaller size for the pictures that i did'nt have selected (would be 
really cool, if the unselected pictures move to the border of the window while the selected windows move to the center).

This function would make it much easier to compare pictures manually to find the one that i like best.
Comment 1 Arnd Baecker 2006-10-03 19:56:24 UTC
Yes, I agree, this is a very common situation, in particular
with digital cameras one for example easily takes 10-20 pictures
of a group of people to find just one good shot ;-).

To compare details (like sharpness, ...)
it would be very helpful (essential?) to have something
like "linked zooming". I.e. one images is declared as the "master
image" (default would be the first).
Zooming inside the master image (or any of the others)
also zooms into all the others images
in the light box. Moving around in the master image also
moves the other images accordingly.
Moving around in one of the other images does not affect
the master image (and also none of the other ones);
this would allow to accomodate for shifts in the images easily.

Concerning the interface:
Maybe a layout like a time-line view below, together with the
lighttable above is suitable:


[         ]   [         ]      (+ other variants like 2x1, 1x2,
[         ]   [         ]         3x1, 1x3, 2x2, 3x2, 2x3, 3x3)
[ Image 1 ]   [ Image 2 ]
[         ]   [         ]
[         ]   [         ]
---------------------------------------
[ ... Thumb0 Thumb1 Thumb2 Thumb3 ....]


Then one could select one (or several) thumbs and drag them onto
the lighttable.

Could this be an extension of the F3 view in digikam?

Best, Arnd
Comment 2 Arnd Baecker 2006-12-12 09:28:11 UTC
A couple of nice screenshots are at
http://www.macworld.com/news/2006/01/08/lightroomfirstlook/index.php


Comment 3 caulier.gilles 2006-12-12 12:49:23 UTC
*** Bug 121311 has been marked as a duplicate of this bug. ***
Comment 4 Dotan Cohen 2007-02-20 01:30:54 UTC
I agree that this would be a killer app. I'm often looking at 4-5 similar pictures that I've snapped with my digital camera. This could save a lot of time.
Comment 5 Michael 2007-02-26 08:58:54 UTC
*** This bug has been confirmed by popular vote. ***
Comment 6 caulier.gilles 2007-03-06 09:54:45 UTC
Hey guy,

If you want a "light table" tool in digiKam, i need to get some inspirations from LightRoom and others software witch support this feature. Please attach screenshots of this tool in action in this file. Thanks in advance

Gilles Caulier  
Comment 7 Mikolaj Machowski 2007-03-06 10:25:36 UTC
No screenshot, but link to page demonstrating various form of comparing form in Apple's Aperture:

http://www.apple.com/aperture/compare/index.html

----------------------------------------------------
Producenci "Opowie
Comment 8 Arnd Baecker 2007-03-06 11:17:30 UTC
This might be a quite good description:
http://www.iview-multimedia.com/mediapro/3_lighttable.php

and also 3 and 8 at:
http://digitalmedia.oreilly.com/2006/11/01/top-ten-aperture-features.html
(BTW: the Loupe mentioned in 7 sounds great ;-).

It seems that a couple of the lighttable tools allow
for free form placement of images etc.
I am not sure if this is really the most important aspect,
as a normal arangement might be enough for the purpose.

However, it is not obvious, what the best realization would be;
some thoughts:
- select a bunch of images in the album view
- invoke the light-table.
  In this one the images shown as large as possible.
  Should this be
   a) a separate full-screen view?
   b) a view, embedded like the one obtained from F3?
   c) should it be (optionally) possible  to see
      the thumbnails as well (in a much smaller size?)
      (See e.g.
      http://www.apple.com/aperture/compare/compare.html)
- linked zooming and panning is important
  (to detect closed eyes, judge sharpness, ...)
- once zoomed in:
  a) do we need small scroll-bars at each image?
  b) A small pop-up thumb, in the lower right corner where
     the scroll-bars (would) meet, to navigate in the image
     (see gimp)
- there has to be a simple way to remove images from the lighttable
  (without deleting them and maybe also with deletion)
- rating should work

Best, Arnd
Comment 9 Michael 2007-03-06 19:17:06 UTC
From my point of view a first solution might be as simple as allowing multiple instances of the viewing window (for me two pictures simultaneously are enough).

Another idea is from (amateur) astronomy: To find moving objects within astronomical pictures (of the same area) one quickly shows two figures one after the other. The minor change of the moving asteroid clearly shows up (because this typically is the only difference).

For me a similar approach would be helpful to compare two pictures, show them quickly one after the other, e.g. by pressing spacebar to immediately switch to the next picture or automatically at a selectable frequency (if display is fast enough).
One might extend that idea to display two selectable regions even of the same picture to compare color/brightness...
The advantage of showing the two pictures in sequence is that one has less constraints with monitor size resp. reduced picture size.

Since my proposal only compares two pictures the GUI might be simple, too. Select two pictures from digikam albums and press the (new) compare button. Zooming and moving can be done on each display individually, maybe with an additional sync button to show the same portion of picture1 within picture2.
Comment 10 Mikolaj Machowski 2007-03-06 19:25:30 UTC
Here is very good screenshot of Aperture's lighttable:

http://www.apple.com/au/aperture/compare/lighttable.html

And simpler compare form:

http://www.apple.com/au/aperture/compare/compare.html

Note that at least partial solution would be possibility to multiple
instances of ImageEditor.
Comment 11 caulier.gilles 2007-04-08 08:59:54 UTC
*** Bug 103351 has been marked as a duplicate of this bug. ***
Comment 12 caulier.gilles 2007-04-11 09:11:11 UTC
Created attachment 20223 [details]
First Mocup of lighttable in album gui

This is my first moc-up of a possible light table in albumgui. 

On the left, a new sidebar tab named "Light Table" appear. It include a
thumbbar view instance (same than showfoto) where you can drag and drop image
from album view. The Light Table view sound like a virtual album where you put
the picture to compares. 

On the center, the current Preview mode witch zoom/pan the current selected
picture on light table.

Current problem is than thumbbar view has a fixed size. If this first light
table approach is fine for you, i will working on thummbar to perform auto
resizing of content depending of sidebar size...

Gilles
Comment 13 Arnd Baecker 2007-04-11 10:00:37 UTC
I think that this mock-up lacks the most important bit: to compare
several (2, 3, ...) pictures side-by-side, like the second one of #10,
with linked zooming and panning to judge about sharpness etc,
but maybe I am missing something (it is not yet in svn to test, right?)

The thumbbar to the left looks fine to me.

Gilles, I think this will be (at least to me) one of the 
most important new features
for digikam and it seems to be a non-trivial one to get it right, 
so it might take a couple of iterations until everyone 
is really happy with it ;-) ...

Comment 14 Gerhard Kulzer 2007-04-11 10:13:26 UTC
Am Wednesday 11 April 2007 schrieb Arnd Baecker:
> I think that this mock-up lacks the most important bit: to compare
> several (2, 3, ...) pictures side-by-side, like the second one of #10,
> with linked zooming and panning to judge about sharpness etc,
> but maybe I am missing something (it is not yet in svn to test, right?)


I agree with Arnd, direct comparison is paramount for a light table. (The 
other functions [close-up inspection] of a real light table of the past are 
covered by the great zoom functions, that work perfect after the last patch).

Gerhard
Comment 15 Mikolaj Machowski 2007-04-11 10:24:41 UTC
> This is my first moc-up of a possible light table in albumgui.
> 
> On the left, a new sidebar tab named "Light Table" appear. It include a
> thumbbar view instance (same than showfoto) where you can drag and drop
> image
> from album view. The Light Table view sound like a virtual album where
> you put
> the picture to compares.
> 
> On the center, the current Preview mode witch zoom/pan the current
> selected
> picture on light table.
> 
> Current problem is than thumbbar view has a fixed size. If this first
> light
> table approach is fine for you, i will working on thummbar to perform auto
> resizing of content depending of sidebar size...


Looks good.

I am not sure about method of LT population. Wouldn't it be 
easier/faster to populate it automatically by showing current selection 
from album? It will limit LT only to current Album view but it includes 
also Tags, Date and Searches.

Most LT comparisons are done for very similar images which will probably 
from the same album/tag/date. I would view LT as fast temporary tag. 
What other users think?

----------------------------------------------------
Ka
Comment 16 caulier.gilles 2007-04-11 10:28:37 UTC
To Arnd, #13 :

>I think that this mock-up lacks the most important bit: to compare
>several (2, 3, ...) pictures side-by-side, like the second one of #10,
>with linked zooming and panning to judge about sharpness etc,
>but maybe I am missing something (it is not yet in svn to test, right?)

This first moc-up only introduce the way to place somewhere the pictures to compare in the Light Table. The way to display picture on preview is a second pass, especially how to render preview :

- Simple Preview (like now),
- Side By Side preview,
- On mouse over Preview,
etc.

>The thumbbar to the left looks fine to me.

>Gilles, I think this will be (at least to me) one of the
>most important new features
>for digikam and it seems to be a non-trivial one to get it right,
>so it might take a couple of iterations until everyone
>is really happy with it ;-) ... 

sure. I will progress step by step with this feature.

Gilles
Comment 17 caulier.gilles 2007-04-11 10:32:55 UTC
To Mik, #15 : 

>I am not sure about method of LT population. Wouldn't it be
>easier/faster to populate it automatically by showing current selection
>from album? 

Well it simple : 

1/ you can drag and drop the selection from and album to LT sidebar icon.
2/ use the new option "put on LT" from album view pop-up menu.

>It will limit LT only to current Album view but it includes
>also Tags, Date and Searches.

no. Thumbbar work with KURL. we can put images from everywhere.

Gilles
Comment 18 Mikolaj Machowski 2007-04-11 10:34:36 UTC
> covered by the great zoom functions, that work perfect after the last
> patch).


While I am not afraid for multiple comparisons in main view (Gilles post 
to Marcel few days ago) I see one problem with zoom. While it is great 
function for regular use it uses some downscaled version of image. For 
real comparison when you need to compare minor details down to pixel 
level it is not good enough. If I misunderstood Gilles post from 
yesterday(? - sorry, writing from work and cannot give proper 
quotations) I would be very happy.

----------------------------------------------------
Diane Wei Liang "OKO JADEITU" - 
Comment 19 Julien Narboux 2007-04-11 10:39:08 UTC
> - Simple Preview (like now),
> - Side By Side preview,
> - On mouse over Preview, 

Gilles, why not use the same widget as the one for the preview for filters ? it could be generalised for n pictures.
Comment 20 Mikolaj Machowski 2007-04-11 10:41:23 UTC
#17 Gilles:

> 2/ use the new option "put on LT" from album view pop-up menu. 
Would it be possible to make an option: "Automatically put selection in LT" ?

> no. Thumbbar work with KURL. we can put images from everywhere. 
My proposition would limit places of origin. Your solution gives more flexibility but slows down workflow (IMO).
Comment 21 Arnd Baecker 2007-04-11 11:24:37 UTC
> I am not sure about method of LT population. Wouldn't it be
> easier/faster to populate it automatically by showing current selection
> from album?


Sounds rather efficient: just select and one keypress (whatever
that will be ;-) brings one into the LT mode with those images.

> It will limit LT only to current Album view but it includes
> also Tags, Date and Searches.


I think that this would be fine (and not a real limitation)

> Most LT comparisons are done for very similar images which will probably
> from the same album/tag/date. I would view LT as fast temporary tag.
> What other users think?


It is behind the scenes to the user, so that's fine.
At some later point a workflow for selecting/rejecting images
from the lightable should be added (maybe the rating CTRL-1 CTRL 5)
is already enough.

In the longer run: the idea of stacks of images
(described in point4 of
http://digitalmedia.oreilly.com/2006/11/01/top-ten-aperture-features.html
)
seems also relevant in this context and should presumably kept in mind.
(Of course, grouping of images has been mentioned as a wish
http://bugs.kde.org/show_bug.cgi?id=121310
before, but would require changes to the digikam database)
Comment 22 caulier.gilles 2007-04-11 11:47:20 UTC
Created attachment 20226 [details]
Second Light Table sidebar with content resizable...
Comment 23 Arnd Baecker 2007-04-11 12:11:57 UTC
Nice!
A minor detail: as it is only one vertical
sequence of thumbs, one could reduce the spacing between the
images (I don't think that there is a  need to leave
space for a  portrait image).
Comment 24 caulier.gilles 2007-04-11 13:49:50 UTC
To Arnd, #23:

The resizable ThumbBar implementation is in svn now. Showfoto is patched to use it. Load a collection of images in Showfoto and resize the bar to look how it's work...

Gilles
Comment 25 caulier.gilles 2007-04-11 13:58:05 UTC
To Julien, #19:

>Gilles, why not use the same widget as the one for the preview for filters ? it >could be generalised for n pictures. 

Yes, this is the way to do... but the current code of the widget witch give the comparison tools in image plugins depand of core image editor. We cannot use it directly in album gui.

I need to refactorize the code in another way : make a generic comparison tools implementation undependant of core editor and create new derivate class to use it in image plugins.

This a tedious coding activity. I need more time. I will do in first a LT without comparison tools. Just a pan/scrolling mode, and when this one will be finalized and tested indeep, i will code the comparison tools part... I'm not sure to do it for 0.9.2...

Of course, if somebody is interressed to help me to implement it, let's me hear. This will save time for me and speed up development...

Guy, it's time to learn C++/Qt/KDE coding (:=)))

Gilles
Comment 26 Arnd Baecker 2007-04-11 15:46:50 UTC
OK - works very well and fast!!

Only going from one image to the next (and back-and-forth), takes
longer than for example in gqview - caching is not yet used here, right?)

Minor point: Even in fit to window mode, the small cross in
the lower right-corner (to pan the window) is shown.
In this case one can move the red-white enclosed box by around
2 pixels (either horizontally or vertically); might be some
round-off error.

Second minor point is the vertical spacing
between images in landscape orientation: is it technically possible
to have different vertical sizes for portrait and landscape
images?
Comment 27 caulier.gilles 2007-04-11 15:59:40 UTC
>Only going from one image to the next (and back-and-forth), takes
>longer than for example in gqview - caching is not yet used here, right?) 

You want mean, if there is a cache system in showfoto/image editor to load images ? Well yes, there is. I let's Marcel explain to you how it's work. This part have been coded by him (:=)))...

About others point, let's me take a look...

Gilles
Comment 28 Gerhard Kulzer 2007-04-11 16:00:24 UTC
Am Wednesday 11 April 2007 schrieb Arnd Baecker:
>
> It is behind the scenes to the user, so that's fine.
> At some later point a workflow for selecting/rejecting images
> from the lightable should be added (maybe the rating CTRL-1 CTRL 5)
> is already enough.
>
> In the longer run: the idea of stacks of images
> (described in point4 of
> http://digitalmedia.oreilly.com/2006/11/01/top-ten-aperture-features.html
> )


I was just listening to this podcast about aperture:
http://digitalmedia.oreilly.com/2006/12/21/inside_aperture_podcast-5.html

It is really appalling to hear Apple sell the stuff we have implemented in 
digiKam since quite a while as the newest and latest hype on the market. It 
is really time that we hit the big market and bust their fat asses :-)

Gerhard
Comment 29 caulier.gilles 2007-04-11 21:38:33 UTC
Created attachment 20237 [details]
first (and uncomplete) light table implementation...

This patch is an uncomplete approach of Light Table embedded in album gui and
using a sidebar tab on the left.

Do not claim than this implentation do not work in any case: it's uncomplete
and not fully tested.

I post this patch to have a first feedback, epecially to see if the way to have
the Light table embedded in Album Gui is the right way. 

I'm not fully satisfied by it (:=))). I think than light table must be a
separate tool like Image Editor... But i'm not sure...

Of course the tool do not provide yet the way to compare image. The light table
sidebar tab is just a container to group the image to compare. When you select
an idem, it appear on the center using preview mode. You can just pan/scroll...


To add a picture to light table container, just use the pop-up menu with album
view and select the "Insert item to Light Table"

Limitation : the items cannot be yet removed from Light Table. digiKam do not
remember yet the items list in Light Table between session... and certainly
others stuff of course.

Please, try to be contructive. This is not yet time to request specific missing
features for Light Table. The implementation is in alpha stage...

Thansk in advance

Gilles
Comment 30 lparrab 2007-04-11 23:36:17 UTC
If you have access to a windows (or mac) machine, it would be great if you could download the trial version of adobe lightroom. (or at least download one of the video-tutorials for example from luminous-landscape.com [very complete, about 15 USD] or one of the short demonstration videos from adobe.com [free])

Digikam is definitively one of the best photo-management applications I've seen on linux, and I really love it... I would almost dare to say that feature-wise, it is not much behind lightroom: the two BIG features missing are the lighttable/compare mode, and the non-destructive image edits.

So, again, Digikam is great. but the one thing in which Lightroom is years ahead is IMHO user-interface simplicity/consistency.

in LR there is a thumbbar *all the time* at the bottom of the screen containing the current "folder/collection/filtered" images (folder "x", with tags "y" and rating "z")

when you start in "library" mode, the thumbbar and the "preview/grid"-area contain the same thumbnails (as bar and grid, respectiv.) when you then double click on an image, it goes into preview mode, but the thumbbar stays at the bottom showing the current (maybe filtered)folder. you can then change images by clicking on the thumbbar. if you then select more than one image (hold CTL-key and select) they are shown side by side in the central area, with option to zoom in and to sync/link focus (position and zoom level).

to "exit" compare-mode, you can click on the "grid" icon to return to grid, or deselect the images (leave only one selected) to return to "preview" mode.

note that I don't mean to say that Digikam must copy or implement this or other features exactly like adobe, but I think they've put a great deal of time into getting the interface to be very "fluid" (powerful and yet simple/easy/quick), so maybe you want to look at it and eventually get some inspiration.

best regards. luis
Comment 31 Arnd Baecker 2007-04-12 10:50:04 UTC
Ad Gilles, #29, not yet reflecting the comments by Luis in #30

> Do not claim than this implentation do not work in any case: it's uncomplete
> and not fully tested.


For that it does work very well ;-)

> I post this patch to have a first feedback, epecially to see if the way to have
> the Light table embedded in Album Gui is the right way.
>
> I'm not fully satisfied by it (:=))). I think than light table must be a
> separate tool like Image Editor... But i'm not sure...



To me it does look like the right way - having another tool,
in a separate window, would lead to a less coherent appearance,
I think. Image selection (via the light table),
and rating and tagging are quite closely related, so
they should appear in the same framework
(e.g. sometimes it is only possible by zooming into a picture
to distinguish one type of duck from another;
but zooming into a picture is already necessary to judge
sharpness. So in a sense these two steps, selection and tagging,
can be done in one go).

Before going into the details, maybe it is worth
to think about the possible workflow:
a) Situation: several similar images
   Aim: select the best (according to whatever criterion) of them
b) select the relevant images in the Album view
   and add them to the light-table thumbs
c) all (or a subset?) of them will be displayed in the middle,
   as large as possible.
   Joint zooming and panning allows to see
   a magnified view of all selected images
d) Select the best one:
   - kick out images from the light-table view or
   - rate images

That's all. (or is anything missing?...;-)
Of course there might be different ways to set up the workflow
(so the opinion of users which have experience with
other software is definitively helpful).

Concerning c):
I am not sure if the default should be to display
just all thumbs placed in the lighttable
(otherwise we would have another selection step)?
It might be nice to be able to display the current picture
just alone in the middle (i.e., as it is at the moment) and
quickly switch back to the comparison view, where all
are shown. (But presumably  this is a minor detail at this point).

For d) one could use an additional color
label (eg. red, yellow, green, blue, and purple)
as available in other applications .

> Of course the tool do not provide yet the way to compare image. The light table
> sidebar tab is just a container to group the image to compare. When you select
> an idem, it appear on the center using preview mode. You can just pan/scroll...
>
>
> To add a picture to light table container, just use the pop-up menu with album
> view and select the "Insert item to Light Table"
>
> Limitation : the items cannot be yet removed from Light Table. digiKam do not
> remember yet the items list in Light Table between session... and certainly
> others stuff of course.
>
> Please, try to be contructive. This is not yet time to request specific missing
> features for Light Table. The implementation is in alpha stage...


There are of course a couple of *small* glitches
(just let me know if you would like to have a list
already at this point).

To mention one point already now:
I find the following a bit confusing:
- Go to Album view in a folder with images
- go to the light-table (empty or non empty, does not matter):
  now the images of the previous album folder are still displayed

Changing to the light-table side-bar should just display
the first (or later all) of its images in the middle.
(After changing to one of the thumbs in the ligtht-table,
this works as expected, so maybe it is just a simple initializatoin
call missing when selecting the light-table view).

Best, Arnd
Comment 32 Mikolaj Machowski 2007-04-12 18:33:18 UTC
> This patch is an uncomplete approach of Light Table embedded in album
> gui and using a sidebar tab on the left.
>
> Do not claim than this implentation do not work in any case: it's
> uncomplete and not fully tested.


It compiles and what was said works, it works. 

One major regression mentioned by Arnd: after playing with LT it is
impossible to Preview images with context menu and click. Only F3 works.

> I post this patch to have a first feedback, epecially to see if the way
> to have the Light table embedded in Album Gui is the right way.


Looks OK. Scaling works.

> I'm not fully satisfied by it (:=))). I think than light table must be a
> separate tool like Image Editor... But i'm not sure...


If this is technically much easier for produce/maintaining/expanding OK.
But already IE as separate window can confuse users.
>
>
> To add a picture to light table container, just use the pop-up menu with
> album view and select the "Insert item to Light Table"


Not sure if it is "missing feature" or design: it is not possible to
drag'n'drop to LT.
Comment 33 caulier.gilles 2007-04-12 19:04:02 UTC
To Mik, #32 :

>It compiles and what was said works, it works.

>One major regression mentioned by Arnd: after playing with LT it is
>impossible to Preview images with context menu and click. Only F3 works.

Yes, the implementation is not complete. Some control cases are missing.

>Looks OK. Scaling works.

>If this is technically much easier for produce/maintaining/expanding OK.
>But already IE as separate window can confuse users.

To maintain, it will more easy to do. This is why i'm more favorable to have a separate window for LT.

Since multiple context are implemented in Album gui (album view, preview, welcome page, etc.), adding LT is not trivial as well.

Marcel, i woukd to have your viewpoint about LT...

>Not sure if it is "missing feature" or design: it is not possible to
>drag'n'drop to LT. 

It not yet implemented (:=)))

Gilles
Comment 34 Mikolaj Machowski 2007-04-12 19:37:39 UTC
> Since multiple context are implemented in Album gui (album view,
> preview, welcome page, etc.), adding LT is not trivial as well.


What about adding it to IE?
Comment 35 caulier.gilles 2007-04-12 19:50:33 UTC
>What about adding it to IE? 

Yes, this is one other possibility...

Gilles
Comment 36 Arnd Baecker 2007-04-13 08:33:49 UTC
I am much more in favor of having it integrated
(Reasons: see #31).
Is there any other application out there which does something
like this in a separate window?
Comment 37 caulier.gilles 2007-04-13 08:36:12 UTC
This is my main question...

The LT implementation will continue depending of the responses/investiguations from others developpers/users. It's important...

You know already my viewpoint (:=)))

Gilles
Comment 38 Arnd Baecker 2007-04-13 08:43:29 UTC
Concerning what is actually displayed in the center of the light-table:
The 1:1 zoom, makes clear that the representation
in the middle of the light-table
is a reduced version of the original, i.e. a 3456 x 2304
image does almost fit on a 1024x768 screen.

While something like this is maybe needed for performance reasons,
a light-table has to display the unmodified image.
Would be Frank's suggestion #16, in 
http://bugs.kde.org/show_bug.cgi?id=140131
a possible solution, also from the users perspective?

How do other application deal with this problem in their light-tables?
Comment 39 Gerhard Kulzer 2007-04-13 09:09:54 UTC
Obviously, if you compare several images they can't be at 100% zoom. The magnifying tool can be used to quickly compare details of images. Possibly there could be a parallel magnifier moving over the same spot in 2 images.

The second comparison mode should be sequenced images. Let me explain. It is often difficult to compare side by side when it's a question of tonality for example. A mode that lets you sequence images without refreshing the screen (as ajax does in the browser) is the best mode for this. This mode is nicely implemented in the plugin widgets pointer mode, you move the mouse in and out of the image and the change is applied or not.
Comment 40 Mikolaj Machowski 2007-04-13 10:11:41 UTC
> The LT implementation will continue depending of the
> responses/investiguations from others developpers/users. It's
> important...


IMO - better is: better solution with more features in new, separate 
window than crippled implementation in existing window.

The only issue I see is live manipulation of LT list from album view 
with LT in separate window. LT window could bring one nice feature (I 
cannot see how to do in current window constellation) - multiple LT 
windows and browsing through stacks of photos.

> You know already my viewpoint (:=)))


Yeah, I am just looking at my Thinking in C++ copy... Without much hope :(

----------------------------------------------------
Ka
Comment 41 Mikolaj Machowski 2007-04-13 10:18:09 UTC
> Obviously, if you compare several images they can't be at 100% zoom. The
> magnifying tool can be used to quickly compare details of images.
> Possibly there could be a parallel magnifier moving over the same spot
> in 2 images.


As I understand images should be shown in some grid, each image with 
identical zoom factor and viewport. When changing zoom factor and 
viewport it should be done for all images at the same time. I think this 
is the simpliest method.

But there should be way to turn off binding of images. Some checkbox 
like in Konqueror for chaining views. This would be required to compare: 
landscape and portrait images; various compositions.

> The second comparison mode should be sequenced images. Let me explain.


You mean like quick Alt-Tab between windows? That would be nice too.

> this. This mode is nicely implemented in the plugin widgets pointer
> mode, you move the mouse in and out of the image and the change is
> applied or not.


But limited only to two versions.

----------------------------------------------------
Ka
Comment 42 Gerhard Kulzer 2007-04-13 12:03:43 UTC
 ------- You are receiving this mail because: -------
> You are the assignee for the bug, or are watching the assignee.
>
> http://bugs.kde.org/show_bug.cgi?id=135048
>
>
>
>
> ------- Additional Comments From mikmach wp pl  2007-04-13 10:18 -------
>
> > Obviously, if you compare several images they can't be at 100% zoom. The
> > magnifying tool can be used to quickly compare details of images.
> > Possibly there could be a parallel magnifier moving over the same spot
> > in 2 images.
>
> As I understand images should be shown in some grid, each image with
> identical zoom factor and viewport. When changing zoom factor and
> viewport it should be done for all images at the same time. I think this
> is the simpliest method.


Agreed

> But there should be way to turn off binding of images. Some checkbox
> like in Konqueror for chaining views. This would be required to compare:
> landscape and portrait images; various compositions.
>
> > The second comparison mode should be sequenced images. Let me explain.
>
> You mean like quick Alt-Tab between windows? That would be nice too.
>
> > this. This mode is nicely implemented in the plugin widgets pointer
> > mode, you move the mouse in and out of the image and the change is
> > applied or not.
>
> But limited only to two versions.
>

No, one could use the mousewheel in this mode to sift through a stack of 
images, very elegantly!

Gerhard
Comment 43 caulier.gilles 2007-04-19 16:06:21 UTC
Created attachment 20326 [details]
patch to test new Thumbbar implementation depending of digiKam DB

This patch is a test implementation to use the new thumbbar witch use digiKam
DB.
This thumbbar will be used by future LT implementation.
Comment 44 caulier.gilles 2007-04-19 16:11:37 UTC
Created attachment 20328 [details]
Thumbbar for LT using digiKam DB informations.

THis screenshot give a view of the new thumbbar for LT with tooltip in action
Comment 45 Mikolaj Machowski 2007-04-19 19:59:44 UTC
> This patch is a test implementation to use the new thumbbar witch use
> digiKam DB.


Looks nice but it miss arrow in the corner pointing to right image.
Comment 46 Mikolaj Machowski 2007-04-20 23:42:04 UTC
Dnia pi
Comment 47 caulier.gilles 2007-05-03 17:21:19 UTC
SVN commit 660737 by cgilles:

digiKam from trunk : first implementation of digiKam Light Table tool. It not yet suitable as well because the tool do not provide yet a comparison method between 2 images.

The Light Table is a pictures container witch can handle items from everywhere on Albums library. Just use the Album Gui pop-up menu to insert an item in Light Table. The Light table has a thumbar on the right. when you click on one item, it's displayed on central view, where you can process zooming and panning.

http://digikam3rdparty.free.fr/Screenshots/lighttable_v2.png

Gerhard, this implementation is in _alpha_ stage, and must be _disable_ for next 0.9.2-beta1 release. Paco and me we working on actually. To disable it before to release digiKam 0.9.2-beta1, please just comment the line 26 from digikam/albumiconview.cpp. Thanks in advance

CCBUG: 135048
CCMAIL: digikam-devel@kde.org 
CCMAIL: francisco.jct@gmail.com
CCMAIL: gerhard@kulzer.net

 M  +76 -7     digikam/albumiconview.cpp  
 M  +8 -6      digikam/albumiconview.h  
 M  +18 -8     utilities/lighttable/Makefile.am  
 AM            utilities/lighttable/lighttableview.cpp   [License: GPL]
 AM            utilities/lighttable/lighttableview.h   [License: GPL]
 AM            utilities/lighttable/lighttablewindow.cpp   [License: GPL]
 AM            utilities/lighttable/lighttablewindow.h   [License: GPL]
 A             utilities/lighttable/lighttablewindowui.rc  


--- trunk/extragear/graphics/digikam/digikam/albumiconview.cpp #660736:660737
@@ -1,12 +1,13 @@
 /* ============================================================
- * Authors: Renchi Raju <renchi@pooh.tam.uiuc.edu>
- *          Caulier Gilles 
- *          Marcel Wiesweg <marcel.wiesweg@gmx.de>
- * Date   : 2002-16-10
+ * Authors     : Renchi Raju 
+ *               Caulier Gilles 
+ *               Marcel Wiesweg 
+ * Date        : 2002-16-10
  * Description : album icon view 
  * 
- * Copyright 2002-2005 by Renchi Raju by Gilles Caulier <caulier dot gilles at gmail dot com>
- * Copyright 2006-2007 by Gilles Caulier <caulier dot gilles at gmail dot com> and Marcel Wiesweg
+ * Copyright 2002-2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu>
+ * Copyright 2002-2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ * Copyright 2006-2007 by Marcel Wiesweg <marcel.wiesweg@gmx.de>
  *
  * This program is free software; you can redistribute it
  * and/or modify it under the terms of the GNU General
@@ -21,6 +22,9 @@
  * 
  * ============================================================ */
 
+// Uncomment this line to enable Light Table tool.
+#define ENABLE_LIGHTTABLE 1
+
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
@@ -120,6 +124,7 @@
 #include "albumiconitem.h"
 #include "albumicongroupitem.h"
 #include "loadingcacheinterface.h"
+#include "lighttablewindow.h"
 #include "statusprogressbar.h"
 #include "metadatahub.h"
 #include "albumiconview.h"
@@ -526,6 +531,10 @@
     popmenu.insertItem(SmallIcon("editimage"), i18n("Edit..."), 10);
     popmenu.insertItem(i18n("Open With"), &openWithMenu, 11);
 
+#ifdef ENABLE_LIGHTTABLE
+    popmenu.insertItem(SmallIcon("idea"), i18n("Insert to Light Table"), 19);
+#endif
+
     // Merge in the KIPI plugins actions ----------------------------
 
     KIPI::PluginLoader* kipiPluginLoader      = KIPI::PluginLoader::instance();
@@ -674,6 +683,12 @@
           break;
       }
   
+      case 19: 
+      {
+          slotInsertToLightTable(iconItem);
+          break;
+      }
+
       default:
           break;
     }
@@ -931,7 +946,7 @@
         setCurrentItem(item);
 }
 
-void AlbumIconView::slotDisplayItem(AlbumIconItem *item )
+void AlbumIconView::slotDisplayItem(AlbumIconItem *item)
 {
     if (!item) return;
 
@@ -1015,6 +1030,60 @@
     imview->setFocus();
 }
 
+void AlbumIconView::slotInsertToLightTable(AlbumIconItem *item)
+{
+    AlbumSettings *settings = AlbumSettings::instance();
+
+    if (!settings) return;
+
+    QString imagefilter = settings->getImageFileFilter().lower() +
+                          settings->getImageFileFilter().upper();
+
+    if (KDcrawIface::DcrawBinary::instance()->versionIsRight())
+    {
+        // add raw files only if dcraw is available
+        imagefilter += settings->getRawFileFilter().lower() +
+                       settings->getRawFileFilter().upper();
+    }
+
+    // Run Light Table with all selected image files in the current Album.
+
+    ImageInfoList imageInfoList;
+    ImageInfo *currentImageInfo = 0;
+
+    for (IconItem *it = firstItem() ; it ; it = it->nextItem())
+    {
+        if ((*it).isSelected())
+        {
+            AlbumIconItem *iconItem = static_cast<AlbumIconItem *>(it);
+            QString fileExtension = iconItem->imageInfo()->kurl().fileName().section( '.', -1 );
+    
+            if ( imagefilter.find(fileExtension) != -1 )
+            {
+                ImageInfo *info = new ImageInfo(*iconItem->imageInfo());
+                info->setViewItem(0);
+                imageInfoList.append(info);
+                if (iconItem == item)
+                    currentImageInfo = info;
+            }
+        }
+    }
+
+    LightTableWindow *ltview = LightTableWindow::lightTableWindow();
+
+    ltview->disconnect(this);
+
+    // TODO: Added slots connection here if necessary.
+
+    ltview->loadImageInfos(imageInfoList, currentImageInfo);
+
+    if (ltview->isHidden())
+        ltview->show();
+
+    ltview->raise();
+    ltview->setFocus();
+}
+
 // ------------------------------------------------------------------------------
 
 AlbumIconItem* AlbumIconView::firstSelectedItem() const
--- trunk/extragear/graphics/digikam/digikam/albumiconview.h #660736:660737
@@ -1,12 +1,13 @@
 /* ============================================================
- * Authors: Renchi Raju <renchi@pooh.tam.uiuc.edu>
- *          Caulier Gilles 
- *          Marcel Wiesweg <marcel.wiesweg@gmx.de>
- * Date   : 2002-16-10
+ * Authors     : Renchi Raju 
+ *               Caulier Gilles 
+ *               Marcel Wiesweg 
+ * Date        : 2002-16-10
  * Description : album icon view 
  * 
- * Copyright 2002-2005 by Renchi Raju by Gilles Caulier <caulier dot gilles at gmail dot com>
- * Copyright 2006-2007 by Gilles Caulier <caulier dot gilles at gmail dot com> and Marcel Wiesweg
+ * Copyright 2002-2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu>
+ * Copyright 2002-2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ * Copyright 2006-2007 by Marcel Wiesweg <marcel.wiesweg@gmx.de>
  *
  * This program is free software; you can redistribute it
  * and/or modify it under the terms of the GNU General
@@ -132,6 +133,7 @@
     void slotDeleteSelectedItems(bool deletePermanently = false);
     void slotDeleteSelectedItemsDirectly(bool useTrash);
     void slotDisplayItem(AlbumIconItem *item=0);
+    void slotInsertToLightTable(AlbumIconItem *item=0);
     void slotAlbumModified();
     void slotSetAlbumThumbnail(AlbumIconItem *iconItem);
     void slotCopy();
--- trunk/extragear/graphics/digikam/utilities/lighttable/Makefile.am #660736:660737
@@ -1,17 +1,27 @@
 METASOURCES = AUTO
 
 INCLUDES = -I$(top_srcdir)/digikam/digikam \
-	   -I$(top_srcdir)/digikam/libs/dimg \
-	   -I$(top_srcdir)/digikam/libs/thumbbar \
-	   -I$(top_srcdir)/digikam/libs/dmetadata \
-	   -I$(top_srcdir)/digikam/libs/themeengine \
-	   -I$(top_srcdir)/digikam/libs/threadimageio \
-	   $(all_includes)
+	       -I$(top_srcdir)/digikam/libs/widgets/common \
+	       -I$(top_srcdir)/digikam/libs/dialogs \
+	       -I$(top_srcdir)/digikam/libs/thumbbar \
+	       -I$(top_srcdir)/digikam/libs/dimg \
+	       -I$(top_srcdir)/digikam/libs/themeengine \
+	       -I$(top_srcdir)/digikam/libs/dmetadata \
+	       -I$(top_srcdir)/digikam/libs/dimg/filters \
+	       -I$(top_srcdir)/digikam/libs/imageproperties \
+	       -I$(top_srcdir)/digikam/libs/threadimageio \
+	       -I$(top_srcdir)/digikam/utilities/setup \
+	       -I$(top_srcdir)/digikam/utilities/slideshow \
+	       -I$(top_srcdir)/digikam/utilities/imageeditor/canvas \
+	       -I$(top_srcdir)/digikam/utilities/imageeditor/tools \
+	       -I$(top_builddir)/digikam/libs/dialogs \
+	       $(LIBKEXIV2_CFLAGS) $(LIBKDCRAW_CFLAGS) $(all_includes) 
 
 noinst_LTLIBRARIES = liblighttable.la 
 
-liblighttable_la_SOURCES = lighttablebar.cpp  
+liblighttable_la_SOURCES = lighttablebar.cpp lighttablewindow.cpp lighttableview.cpp
 
 liblighttable_la_LDFLAGS = $(all_libraries) $(KDE_RPATH)
 
-
+rcdir = $(kde_datadir)/digikam
+rc_DATA = lighttablewindowui.rc
** trunk/extragear/graphics/digikam/utilities/lighttable/lighttableview.cpp #property svn:eol-style
   + native
** trunk/extragear/graphics/digikam/utilities/lighttable/lighttableview.h #property svn:eol-style
   + native
** trunk/extragear/graphics/digikam/utilities/lighttable/lighttablewindow.cpp #property svn:eol-style
   + native
** trunk/extragear/graphics/digikam/utilities/lighttable/lighttablewindow.h #property svn:eol-style
   + native
Comment 48 caulier.gilles 2007-05-03 17:25:52 UTC
To digiKam users:

The Light Table implemented in svn is not yet suitable. We working on with Paco. Please to not post comments in this room if a functionnality do not work. all in not yet implemented.

Also, i think this tool will not be enable in 0.9.2-fianl, excepted if we find more free time to finalize it. Considerate this tool in alpha stage.

Gilles Caulier
Comment 49 caulier.gilles 2007-05-04 13:59:47 UTC
SVN commit 661014 by cgilles:

digiKam from trunk : Light Table improvements.

The new LT is now able to compare 2 images at the same time. Just insert some pictures to LT and set one on left panel and one other to right panel using the thumbbar context menu. On the bottom (status bar) there are 2 sliders to zoom independantly the right or the left panel.

In a first time i have targeted to sync left and right panel but its complex to do it if size of left and right images are not the same.

There is a screenshot of LT in action at this url :

http://digikam3rdparty.free.fr/Screenshots/lighttable_v3.png

The LT still under alpha stage. there are some part witch are not yet implemented/tested...

CCBUG: 135048
CCMAIL: digikam-devel@kde.org
CCMAIL: francisco.jct@gmail.com
CCMAIL: gerhard@kulzer.net 





 M  +2 -1      Makefile.am  
 AM            lighttableview.cpp   [License: GPL]
 AM            lighttableview.h   [License: GPL]
 M  +125 -61   lighttablewindow.cpp  
 M  +4 -3      lighttablewindow.h  


--- trunk/extragear/graphics/digikam/utilities/lighttable/Makefile.am #661013:661014
@@ -19,7 +19,8 @@
 
 noinst_LTLIBRARIES = liblighttable.la 
 
-liblighttable_la_SOURCES = lighttablebar.cpp lighttablewindow.cpp lighttablepreview.cpp
+liblighttable_la_SOURCES = lighttablebar.cpp lighttablewindow.cpp lighttablepreview.cpp \
+                           lighttableview.cpp 
 
 liblighttable_la_LDFLAGS = $(all_libraries) $(KDE_RPATH)
 
** trunk/extragear/graphics/digikam/utilities/lighttable/lighttableview.cpp #property svn:eol-style
   + native
** trunk/extragear/graphics/digikam/utilities/lighttable/lighttableview.h #property svn:eol-style
   + native
--- trunk/extragear/graphics/digikam/utilities/lighttable/lighttablewindow.cpp #661013:661014
@@ -75,10 +75,12 @@
         removeFullScreenButton              = false;
         cancelSlideShow                     = false;
         accelerators                        = 0;
+        leftSidebar                         = 0;
         rightSidebar                        = 0;
         previewView                         = 0;
         barView                             = 0;
-        splitter                            = 0;
+        hSplitter                           = 0;
+        vSplitter                           = 0;
         fileDeleteAction                    = 0;
         slideShowAction                     = 0;
         fullScreenAction                    = 0;
@@ -97,7 +99,8 @@
         zoomMinusAction                     = 0;
         zoomTo100percents                   = 0;
         nameLabel                           = 0;
-        zoomBar                             = 0;  
+        leftZoomBar                         = 0;  
+        rightZoomBar                        = 0;  
     }
 
     bool                      fullScreenHideToolBar;
@@ -105,7 +108,8 @@
     bool                      removeFullScreenButton;
     bool                      cancelSlideShow;
 
-    QSplitter                *splitter;
+    QSplitter                *hSplitter;
+    QSplitter                *vSplitter;
 
     KAction                  *fileDeleteAction;
     KAction                  *slideShowAction;
@@ -132,10 +136,12 @@
 
     LightTableView           *previewView;
 
-    StatusZoomBar            *zoomBar;
+    StatusZoomBar            *leftZoomBar;
+    StatusZoomBar            *rightZoomBar;
 
     StatusProgressBar        *nameLabel;
 
+    ImagePropertiesSideBarDB *leftSidebar;
     ImagePropertiesSideBarDB *rightSidebar;
 };
 
@@ -175,14 +181,20 @@
 
     //-------------------------------------------------------------
 
+    d->leftSidebar->loadViewState();
     d->rightSidebar->loadViewState();
+    d->leftSidebar->populateTags();
     d->rightSidebar->populateTags();
 
     KConfig* config = kapp->config();
     config->setGroup("LightTable Settings");
-    if(config->hasKey("Splitter Sizes"))
-        d->splitter->setSizes(config->readIntListEntry("Splitter Sizes"));
 
+    if(config->hasKey("Vertical Splitter Sizes"))
+        d->vSplitter->setSizes(config->readIntListEntry("Vertical Splitter Sizes"));
+
+    if(config->hasKey("Horizontal Splitter Sizes"))
+        d->hSplitter->setSizes(config->readIntListEntry("Horizontal Splitter Sizes"));
+
     setAutoSaveSettings("LightTable Settings");
 }
 
@@ -201,7 +213,8 @@
 
     KConfig* config = kapp->config();
     config->setGroup("LightTable Settings");
-    config->writeEntry("Splitter Sizes", d->splitter->sizes());
+    config->writeEntry("Vertical Splitter Sizes", d->vSplitter->sizes());
+    config->writeEntry("Horizontal Splitter Sizes", d->hSplitter->sizes());
     config->sync();
 
     e->accept();
@@ -209,61 +222,94 @@
 
 void LightTableWindow::setupUserArea()
 {
-    QWidget* widget  = new QWidget(this);
-    QHBoxLayout *lay = new QHBoxLayout(widget);
-    d->splitter      = new QSplitter(widget);
-    d->barView       = new LightTableBar(d->splitter, ThumbBarView::Vertical);
-    d->previewView   = new LightTableView(d->splitter);
-    d->rightSidebar  = new ImagePropertiesSideBarDB(widget, "LightTable Right Sidebar", d->splitter,
-                                                    Sidebar::Right, true);
-    lay->addWidget(d->splitter);
-    lay->addWidget(d->rightSidebar);
+    QWidget* mainW    = new QWidget(this);
+    d->hSplitter      = new QSplitter(Qt::Horizontal, mainW);
+    QHBoxLayout *hlay = new QHBoxLayout(mainW);
+    d->leftSidebar    = new ImagePropertiesSideBarDB(mainW, "LightTable Left Sidebar", d->hSplitter,
+                                                     Sidebar::Left, true);
 
-    d->splitter->setFrameStyle( QFrame::NoFrame );
-    d->splitter->setFrameShadow( QFrame::Plain );
-    d->splitter->setFrameShape( QFrame::NoFrame );
-    d->splitter->setOpaqueResize(false);
-    setCentralWidget(widget);
+    QWidget* centralW = new QWidget(d->hSplitter);
+    QVBoxLayout *vlay = new QVBoxLayout(centralW);
+    d->vSplitter      = new QSplitter(Qt::Vertical, centralW);
+    d->barView        = new LightTableBar(d->vSplitter, ThumbBarView::Horizontal);
+    d->previewView    = new LightTableView(d->vSplitter);
+    vlay->addWidget(d->vSplitter);
+
+    d->rightSidebar   = new ImagePropertiesSideBarDB(mainW, "LightTable Right Sidebar", d->hSplitter,
+                                                     Sidebar::Right, true);
+
+    hlay->addWidget(d->leftSidebar);
+    hlay->addWidget(d->hSplitter);
+    hlay->addWidget(d->rightSidebar);
+
+    d->hSplitter->setFrameStyle( QFrame::NoFrame );
+    d->hSplitter->setFrameShadow( QFrame::Plain );
+    d->hSplitter->setFrameShape( QFrame::NoFrame );
+    d->hSplitter->setOpaqueResize(false);
+    d->vSplitter->setFrameStyle( QFrame::NoFrame );
+    d->vSplitter->setFrameShadow( QFrame::Plain );
+    d->vSplitter->setFrameShape( QFrame::NoFrame );
+    d->vSplitter->setOpaqueResize(false);
+
+    setCentralWidget(mainW);
 }
 
 void LightTableWindow::setupStatusBar()
 {
+    d->leftZoomBar = new StatusZoomBar(statusBar());
+    statusBar()->addWidget(d->leftZoomBar, 1);
+
     d->nameLabel = new StatusProgressBar(statusBar());
     d->nameLabel->setAlignment(Qt::AlignCenter);
     d->nameLabel->setMaximumHeight(fontMetrics().height()+2);    
     statusBar()->addWidget(d->nameLabel, 100);
  
-    d->zoomBar = new StatusZoomBar(statusBar());
-    statusBar()->addWidget(d->zoomBar, 1, true);
+    d->rightZoomBar = new StatusZoomBar(statusBar());
+    statusBar()->addWidget(d->rightZoomBar, 1);
 }
 
 void LightTableWindow::setupConnections()
 {
-    connect(d->barView, SIGNAL(signalLightTableBarItemSelected(ImageInfo*)),
-            this, SLOT(slotLightTableBarItemSelected(ImageInfo*)));
+    connect(d->barView, SIGNAL(setLeftPanelInfo(ImageInfo*)),
+            this, SLOT(slotSetLeftPanelInfo(ImageInfo*)));
 
+    connect(d->barView, SIGNAL(setRightPanelInfo(ImageInfo*)),
+            this, SLOT(slotSetRightPanelInfo(ImageInfo*)));
+
     connect(d->nameLabel, SIGNAL(signalCancelButtonPressed()),
             this, SLOT(slotNameLabelCancelButtonPressed()));
 
-    ImageAttributesWatch *watch = ImageAttributesWatch::instance();
+    connect(d->leftZoomBar, SIGNAL(signalZoomMinusClicked()),
+            d->previewView, SLOT(slotDecreaseLeftZoom()));
 
-    connect(watch, SIGNAL(signalFileMetadataChanged(const KURL &)),
-            this, SLOT(slotFileMetadataChanged(const KURL &)));
+    connect(d->leftZoomBar, SIGNAL(signalZoomPlusClicked()),
+            d->previewView, SLOT(slotIncreaseLeftZoom()));
 
-    connect(d->zoomBar, SIGNAL(signalZoomMinusClicked()),
-           d->previewView, SLOT(slotDecreaseZoom()));
+    connect(d->leftZoomBar, SIGNAL(signalZoomSliderChanged(int)),
+            d->previewView, SLOT(slotLeftZoomSliderChanged(int)));
 
-    connect(d->zoomBar, SIGNAL(signalZoomPlusClicked()),
-           d->previewView, SLOT(slotIncreaseZoom()));
+    connect(d->rightZoomBar, SIGNAL(signalZoomMinusClicked()),
+            d->previewView, SLOT(slotDecreaseRightZoom()));
 
-    connect(d->zoomBar, SIGNAL(signalZoomSliderChanged(int)),
-           this, SLOT(slotZoomSliderChanged(int)));
+    connect(d->rightZoomBar, SIGNAL(signalZoomPlusClicked()),
+            d->previewView, SLOT(slotIncreaseRightZoom()));
 
-    connect(d->previewView, SIGNAL(signalZoomFactorChanged(double)),
-           this, SLOT(slotZoomFactorChanged(double)));
+    connect(d->rightZoomBar, SIGNAL(signalZoomSliderChanged(int)),
+            d->previewView, SLOT(slotRightZoomSliderChanged(int)));
 
+    connect(d->previewView, SIGNAL(signalLeftZoomFactorChanged(double)),
+            this, SLOT(slotLeftZoomFactorChanged(double)));
+
+    connect(d->previewView, SIGNAL(signalRightZoomFactorChanged(double)),
+            this, SLOT(slotRightZoomFactorChanged(double)));
+
     connect(d->previewView, SIGNAL(signalSlideShow()),
-           this, SLOT(slotToggleSlideShow()));
+            this, SLOT(slotToggleSlideShow()));
+
+    ImageAttributesWatch *watch = ImageAttributesWatch::instance();
+
+    connect(watch, SIGNAL(signalFileMetadataChanged(const KURL &)),
+            this, SLOT(slotFileMetadataChanged(const KURL &)));
 }
 
 void LightTableWindow::setupActions()
@@ -373,13 +419,14 @@
 
 void LightTableWindow::loadImageInfos(const ImageInfoList &list, ImageInfo *imageInfoCurrent)
 {
-    d->previewView->setImageInfo(imageInfoCurrent);
-
     for (QPtrList<ImageInfo>::const_iterator it = list.begin(); it != list.end(); ++it)
     {
-        LightTableBarItem *item = new LightTableBarItem(d->barView, *it);
-        if (*it == imageInfoCurrent)
-            d->barView->setSelected(item);
+        if (!d->barView->findItemByInfo(*it))
+        {
+            LightTableBarItem *item = new LightTableBarItem(d->barView, *it);
+            if (*it == imageInfoCurrent)
+                d->barView->setSelected(item);
+        }
     }   
 
     // if window is iconified, show it
@@ -387,17 +434,24 @@
     {
         KWin::deIconifyWindow(winId());
     }
+}   
+
+void LightTableWindow::slotSetLeftPanelInfo(ImageInfo* info)
+{
+    d->previewView->setLeftImageInfo(info);
+    d->leftSidebar->itemChanged(info);
 }
 
-void LightTableWindow::slotLightTableBarItemSelected(ImageInfo* info)
+void LightTableWindow::slotSetRightPanelInfo(ImageInfo* info)
 {
-    d->previewView->setImageInfo(info);
+    d->previewView->setRightImageInfo(info);
     d->rightSidebar->itemChanged(info);
 }
 
 void LightTableWindow::slotZoomTo100Percents()
 {
-    d->previewView->setZoomFactor(1.0);
+    d->previewView->setLeftZoomFactor(1.0);
+    d->previewView->setRightZoomFactor(1.0);
 }
 
 void LightTableWindow::slotFitToWindow()
@@ -671,40 +725,50 @@
     }
 }
 
-void LightTableWindow::slotZoomFactorChanged(double zoom)
+void LightTableWindow::slotLeftZoomFactorChanged(double zoom)
 {
     double h    = (double)ThumbnailSize::Huge;
     double s    = (double)ThumbnailSize::Small;
-    double zmin = d->previewView->zoomMin();
-    double zmax = d->previewView->zoomMax();
+    double zmin = d->previewView->leftZoomMin();
+    double zmax = d->previewView->leftZoomMax();
     double b    = (zmin-(zmax*s/h))/(1-s/h);
     double a    = (zmax-b)/h;
     int size    = (int)((zoom - b) /a); 
 
-    d->zoomBar->setZoomSliderValue(size);
-    d->zoomBar->setZoomTrackerText(i18n("zoom: %1%").arg((int)(zoom*100.0)));
+    d->leftZoomBar->setZoomSliderValue(size);
+    d->leftZoomBar->setZoomTrackerText(i18n("zoom: %1%").arg((int)(zoom*100.0)));
 
-    d->zoomBar->setEnableZoomPlus(true);
-    d->zoomBar->setEnableZoomMinus(true);
+    d->leftZoomBar->setEnableZoomPlus(true);
+    d->leftZoomBar->setEnableZoomMinus(true);
 
-    if (d->previewView->maxZoom())
-        d->zoomBar->setEnableZoomPlus(false);
+    if (d->previewView->leftMaxZoom())
+        d->leftZoomBar->setEnableZoomPlus(false);
 
-    if (d->previewView->minZoom())
-        d->zoomBar->setEnableZoomMinus(false);
+    if (d->previewView->leftMinZoom())
+        d->leftZoomBar->setEnableZoomMinus(false);
 }
 
-void LightTableWindow::slotZoomSliderChanged(int size)
+void LightTableWindow::slotRightZoomFactorChanged(double zoom)
 {
     double h    = (double)ThumbnailSize::Huge;
     double s    = (double)ThumbnailSize::Small;
-    double zmin = d->previewView->zoomMin();
-    double zmax = d->previewView->zoomMax();
+    double zmin = d->previewView->rightZoomMin();
+    double zmax = d->previewView->rightZoomMax();
     double b    = (zmin-(zmax*s/h))/(1-s/h);
     double a    = (zmax-b)/h;
-    double z    = a*size+b; 
+    int size    = (int)((zoom - b) /a); 
 
-    d->previewView->setZoomFactor(z);
+    d->rightZoomBar->setZoomSliderValue(size);
+    d->rightZoomBar->setZoomTrackerText(i18n("zoom: %1%").arg((int)(zoom*100.0)));
+
+    d->rightZoomBar->setEnableZoomPlus(true);
+    d->rightZoomBar->setEnableZoomMinus(true);
+
+    if (d->previewView->rightMaxZoom())
+        d->rightZoomBar->setEnableZoomPlus(false);
+
+    if (d->previewView->rightMinZoom())
+        d->rightZoomBar->setEnableZoomMinus(false);
 }
 
 }  // namespace Digikam
--- trunk/extragear/graphics/digikam/utilities/lighttable/lighttablewindow.h #661013:661014
@@ -77,7 +77,8 @@
 
 private slots:
 
-    void slotLightTableBarItemSelected(ImageInfo*);
+    void slotSetLeftPanelInfo(ImageInfo*);
+    void slotSetRightPanelInfo(ImageInfo*);
     void slotZoomTo100Percents();
     void slotFitToWindow();
     void slotNameLabelCancelButtonPressed();
@@ -90,8 +91,8 @@
     void slotNewToolbarConfig();
     void slotSetup();
     void slotFileMetadataChanged(const KURL &);
-    void slotZoomSliderChanged(int);
-    void slotZoomFactorChanged(double);
+    void slotLeftZoomFactorChanged(double);
+    void slotRightZoomFactorChanged(double);
 
 private:
 
Comment 50 Mikolaj Machowski 2007-05-04 17:07:26 UTC
> In a first time i have targeted to sync left and right panel but its
> complex to do it if size of left and right images are not the same.


I think you should give up when images aren't identical in terms of
size.
Comment 51 Arnd Baecker 2007-05-05 09:39:58 UTC
Hey, this looks close to useable!
(Compile went fine and no crashes so far ;-)

Some thoughts (feel free to ignore if they are premature;
I know the light-table is alpha)
- the light-table has to work with non-scaled images
  (i.e. like the image editor); otherwise
  a control of the quality is not possible.
- joint zooming and joint panning is essential
  (I agree with Mikolaj that for images not idential in size
   this should just be disabled;
   maybe there is a way to deal with this, but this
   really looks like a rare situation)

  In addition, even for similar pictures, the
  subject of interest might not be at the same place.
  For this the possibility to create an additional shift
  (while still keeping the linked panning and zooming) would
  be helpful. This could be achieved by declaring
  the left image as master and the right one just follows
  any zoom and pan.
  If one pans in the right image, only this one is
  affected. If one then pans in the left one,
  the right one follows, as before, but with
  the additional shift
  (there might be some issues near the borders, but
   one thing after another ;-).
- the whole process feels too complicated:
  a) select images
  b) add them to the light-table
  c) in the light-table:
     select image for the left view
     select image for the right view
  There is not much one can do about a) and b),
  apart from maybe providing a keyboard short-cut
  at some later stage.
  For c): what about displaying the first two images
  directly as left and right one?
  (maybe they should also be marked as selected ones,
   with different colors?)

  (Gilles, here should really stop reading, because
   the rest is even more like feature wishes...)
  - Maybe drag-and-drop from the thumbs would be helpful.
  - Then, to go through a sequence of similar
    images, a kind of "Next - two" comparison would
    speed up things considerably.
    Here the right image becomes the left one and
    the next thumb becomes the new right image.
    (The same for "Previus Two")

What I am not sure about concerns the simultaneous comparison
of more than two images (3, 4, ....)?
Whether this is useful or not, presumably depends
on the size of the screen. For a small 12'' laptop
anything more than 2 might not work out, whereas on a
large 20'' display much more is possible.

OK, I will shut up now.

Keep on this great work on the light-table - it
looks extremely promising!!!

Best, Arnd
Comment 52 caulier.gilles 2007-05-05 14:51:38 UTC
Arnd, 

I'm aware about all feedback, so i try to read all comments on B.K.O... But time missing and i'm not easy to follow all directions (:=)))

Gilles
Comment 53 Mikolaj Machowski 2007-05-05 21:19:47 UTC
Dnia sobota 05 maj 2007, Arnd Baecker napisaƂ:
> - joint zooming and joint panning is essential
>   (I agree with Mikolaj that for images not idential in size
>    this should just be disabled;
>    maybe there is a way to deal with this, but this
>    really looks like a rare situation)

I suppose Gilles tried to make proportional sync: moving of panning from
top-left to bottom-right works always regardless of size of image.
I think basic sync by pixel would be enough.
>   - Maybe drag-and-drop from the thumbs would be helpful.

Would be extremely helpful. First time I opened LT I thought this is
buggy...
> What I am not sure about concerns the simultaneous comparison
> of more than two images (3, 4, ....)?

I think all images should be opened in compare part of LT. Only later
they could be removed, re-added, etc.
> Keep on this great work on the light-table - it
> looks extremely promising!!!

Agree :)
Comment 54 caulier.gilles 2007-05-07 16:06:36 UTC
SVN commit 662113 by cgilles:

digikam from trunk : added Insert to Light Table action on album gui Image menu... Now the new Light Table tool is officially available on digiKam.
BUG: 135048 


 M  +0 -6      albumiconview.cpp  
 M  +11 -0     digikamapp.cpp  
 M  +2 -0      digikamappprivate.h  
 M  +1 -0      digikamui.rc  
 M  +8 -0      digikamview.cpp  
 M  +1 -0      digikamview.h  


--- trunk/extragear/graphics/digikam/digikam/albumiconview.cpp #662112:662113
@@ -23,9 +23,6 @@
  * 
  * ============================================================ */
 
-// Uncomment this line to enable Light Table tool.
-#define ENABLE_LIGHTTABLE 1
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
@@ -531,10 +528,7 @@
     popmenu.insertItem(SmallIcon("viewimage"), i18n("View..."), 18);
     popmenu.insertItem(SmallIcon("editimage"), i18n("Edit..."), 10);
     popmenu.insertItem(i18n("Open With"), &openWithMenu, 11);
-
-#ifdef ENABLE_LIGHTTABLE
     popmenu.insertItem(SmallIcon("idea"), i18n("Insert to Light Table"), 19);
-#endif
 
     // Merge in the KIPI plugins actions ----------------------------
 
--- trunk/extragear/graphics/digikam/digikam/digikamapp.cpp #662112:662113
@@ -618,6 +618,15 @@
                                     "image_edit");
     d->imageViewAction->setWhatsThis(i18n("This will open the selected item in the image editor."));
 
+    d->imageLightTableAction = new KAction(i18n("Insert to Light Table"),
+                                    "idea",
+                                    Key_F6,
+                                    d->view,
+                                    SLOT(slotImageLightTable()),
+                                    actionCollection(),
+                                    "image_lighttable");
+    d->imageLightTableAction->setWhatsThis(i18n("This will insert the selected items to light table."));
+
     d->imageRenameAction = new KAction(i18n("Rename..."),
                                     "pencil",
                                     Key_F2,
@@ -940,6 +949,7 @@
 
     d->imageViewAction->setEnabled(false);
     d->imagePreviewAction->setEnabled(false);
+    d->imageLightTableAction->setEnabled(false);
     d->imageRenameAction->setEnabled(false);
     d->imageDeleteAction->setEnabled(false);
     d->imageExifOrientationActionMenu->setEnabled(false);
@@ -1154,6 +1164,7 @@
     bool val = selection.isEmpty() ? false : true;
     d->imageViewAction->setEnabled(val);
     d->imagePreviewAction->setEnabled(val);
+    d->imageLightTableAction->setEnabled(val);
     d->imageRenameAction->setEnabled(val);
     d->imageDeleteAction->setEnabled(val);
     d->imageExifOrientationActionMenu->setEnabled(val);
--- trunk/extragear/graphics/digikam/digikam/digikamappprivate.h #662112:662113
@@ -87,6 +87,7 @@
         editTagAction                        = 0;
         imagePreviewAction                   = 0;
         imageViewAction                      = 0;
+        imageLightTableAction                = 0;
         imageSetExifOrientation1Action       = 0;
         imageSetExifOrientation2Action       = 0;
         imageSetExifOrientation3Action       = 0;
@@ -181,6 +182,7 @@
     
     // Image Actions
     KToggleAction         *imagePreviewAction;
+    KAction               *imageLightTableAction;
     KAction               *imageViewAction;
     KAction               *imageSetExifOrientation1Action;
     KAction               *imageSetExifOrientation2Action;
--- trunk/extragear/graphics/digikam/digikam/digikamui.rc #662112:662113
@@ -42,6 +42,7 @@
    <text>&amp;Image</text>
      <Action name="image_view" />
      <Action name="image_edit" />
+     <Action name="image_lighttable" />
      <Action name="image_set_exif_orientation"/>
    <Separator />
      <ActionList name="image_actions"/>
--- trunk/extragear/graphics/digikam/digikam/digikamview.cpp #662112:662113
@@ -1032,6 +1032,14 @@
     d->iconView->slotSetExifOrientation(orientation);
 }
 
+void DigikamView::slotImageLightTable()
+{
+    AlbumIconItem *item = d->iconView->firstSelectedItem();
+    if (!item) return;
+
+    d->iconView->slotInsertToLightTable(item);
+}
+
 void DigikamView::slotImageRename(AlbumIconItem *iconItem)
 {
     AlbumIconItem *item;
--- trunk/extragear/graphics/digikam/digikam/digikamview.h #662112:662113
@@ -117,6 +117,7 @@
     void slotNewAdvancedSearch();
 
     // Image action slots
+    void slotImageLightTable();
     void slotImagePreview();
     void slotImageEdit();
     void slotImageExifOrientation(int orientation);
Comment 55 caulier.gilles 2007-05-07 16:10:38 UTC
Hey guys,

Today, i have fully implemented the Light Table Drag & Drop support. 

Excepted some improvements and polishing to do, especially in main menu, the Light Table is now ready to use. I will open a new component in B.K.O about. Please post your wishes and bug reports at the right place. Thanks in advance.

Gilles Caulier