Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
LO21_Pin_Noir_Boucher_Bouri_Detree
CellulutLO21
Commits
6255f283
Commit
6255f283
authored
Jun 01, 2021
by
Yann Boucher
Browse files
Fixed an issue with cell selection
parent
0e92d18d
Changes
2
Hide whitespace changes
Inline
Side-by-side
include/gridview.hpp
View file @
6255f283
...
...
@@ -134,11 +134,11 @@ private:
void
set_cell_state
(
Coord
pos
,
unsigned
state
);
void
update_gridview
();
QGraphicsRectItem
*
create_selection_rect
(
const
QRectF
&
rect
=
QRectF
());
void
copy_selection
();
void
paste_clipboard
();
void
delete_selection
();
Coord
top_left_of_selection
()
const
;
void
select_all
();
const
QPixmap
&
grid_pixmap
()
const
;
...
...
@@ -157,7 +157,6 @@ private:
QImage
m_grid_image
;
QPixmap
m_grid_pixmap
;
Grid
m_grid
;
std
::
set
<
Coord
>
m_selected_cells
;
std
::
vector
<
QGraphicsRectItem
*>
m_selection_rects
;
bool
m_handling_rubberband
;
DragDropHandlerItem
*
m_drag_drop_handler
;
...
...
src/gridview.cpp
View file @
6255f283
...
...
@@ -293,6 +293,7 @@ GridView::GridView(QWidget *parent)
m_view
->
viewport
()
->
setCursor
(
Qt
::
ArrowCursor
);
m_view
->
setBackgroundBrush
(
QBrush
(
Qt
::
gray
));
m_view
->
setRubberBandSelectionMode
(
Qt
::
IntersectsItemBoundingRect
);
// provides better performance
m_view
->
scale
(
20
,
20
);
// Begin with 20x20 pixels cells
m_zoom
=
new
detail
::
Graphics_view_zoom
(
m_view
);
...
...
@@ -382,20 +383,21 @@ void GridView::clear_selection()
m_scene
->
removeItem
(
rect
);
}
m_selection_rects
.
clear
();
m_selected_cells
.
clear
();
m_handling_rubberband
=
false
;
}
Structure
GridView
::
selected_cells
()
const
{
if
(
m_scene
->
selectedItems
().
empty
())
return
Structure
{};
std
::
vector
<
std
::
pair
<
Coord
,
unsigned
>>
cells
;
for
(
auto
coord
:
m_select
ed_cell
s
)
for
(
const
auto
&
item
:
m_select
ion_rect
s
)
{
cells
.
push_back
(
std
::
make_pair
(
coord
,
m_grid
.
get_state
(
coord
)));
const
auto
&
rect
=
item
->
rect
().
toRect
();
for
(
int
i
=
rect
.
top
();
i
<=
rect
.
bottom
();
++
i
)
for
(
int
j
=
rect
.
left
();
j
<=
rect
.
right
();
++
j
)
{
cells
.
push_back
({
Coord
{
j
,
i
},
m_grid
.
get_state
(
Coord
{
j
,
i
})});
}
}
return
Structure
(
cells
.
begin
(),
cells
.
end
());
}
...
...
@@ -446,6 +448,18 @@ void GridView::update_gridview()
m_scene
->
update
();
}
QGraphicsRectItem
*
GridView
::
create_selection_rect
(
const
QRectF
&
rect
)
{
QGraphicsRectItem
*
item
=
new
QGraphicsRectItem
();
item
->
setPen
(
Qt
::
NoPen
);
item
->
setBrush
(
QBrush
(
QColor
(
220
,
220
,
220
,
200
)));
item
->
setRect
(
rect
);
m_selection_rects
.
push_back
(
item
);
m_scene
->
addItem
(
item
);
return
item
;
}
void
GridView
::
copy_selection
()
{
m_copy_paste_buffer
=
selected_cells
();
...
...
@@ -453,13 +467,13 @@ void GridView::copy_selection()
void
GridView
::
paste_clipboard
()
{
// la destination est la cellule sélectionnée actuelle, on ne fait rien si on est pas dans ce cas
if
(
m_scene
->
selectedItems
().
size
()
<
1
)
return
;
push_history
();
Coord
origin
=
top_left_of_selection
();
auto
scene_pos
=
m_view
->
mapToScene
(
m_view
->
mapFromGlobal
(
QCursor
::
pos
()));
if
(
!
m_scene
->
sceneRect
().
contains
(
scene_pos
))
return
;
Coord
origin
=
{
scene_pos
.
toPoint
().
x
(),
scene_pos
.
toPoint
().
y
()};
paste_structure_at
(
origin
,
m_copy_paste_buffer
);
}
...
...
@@ -468,10 +482,16 @@ void GridView::fill_selection(unsigned state)
{
push_history
();
for
(
auto
coord
:
m_select
ed_cell
s
)
for
(
const
auto
&
item
:
m_select
ion_rect
s
)
{
set_cell_state
(
coord
,
state
);
const
auto
&
rect
=
item
->
rect
().
toRect
();
for
(
int
i
=
rect
.
top
();
i
<=
rect
.
bottom
();
++
i
)
for
(
int
j
=
rect
.
left
();
j
<=
rect
.
right
();
++
j
)
{
set_cell_state
(
Coord
{(
int
)
j
,
(
int
)
i
},
state
);
}
}
update_gridview
();
}
...
...
@@ -481,6 +501,12 @@ void GridView::delete_selection()
clear_selection
();
}
void
GridView
::
select_all
()
{
clear_selection
();
create_selection_rect
(
QRect
(
0
,
0
,
m_width
,
m_height
));
}
void
GridView
::
paste_structure_at
(
Coord
origin
,
const
Structure
&
s
)
{
push_history
();
...
...
@@ -494,22 +520,6 @@ void GridView::paste_structure_at(Coord origin, const Structure &s)
update_gridview
();
}
Coord
GridView
::
top_left_of_selection
()
const
{
// on calcule la position du coin supérieur gauche de la sélection
Coord
selection_top_left
=
Coord
{
std
::
numeric_limits
<
int
>::
max
(),
std
::
numeric_limits
<
int
>::
max
()};
for
(
const
auto
&
rect
:
m_selection_rects
)
{
if
(
rect
->
pos
().
x
()
<
selection_top_left
.
x
)
selection_top_left
.
x
=
rect
->
pos
().
x
();
if
(
rect
->
pos
().
y
()
<
selection_top_left
.
y
)
selection_top_left
.
y
=
rect
->
pos
().
y
();
}
return
selection_top_left
;
}
const
QPixmap
&
GridView
::
grid_pixmap
()
const
{
return
m_grid_pixmap
;
...
...
@@ -521,11 +531,7 @@ void GridView::handle_rubberband(QRect rubberBandRect, QPointF fromScenePoint, Q
if
(
!
m_handling_rubberband
)
{
m_handling_rubberband
=
true
;
item
=
new
QGraphicsRectItem
();
item
->
setPen
(
Qt
::
NoPen
);
item
->
setBrush
(
QBrush
(
QColor
(
220
,
220
,
220
,
200
)));
m_selection_rects
.
push_back
(
item
);
m_scene
->
addItem
(
item
);
item
=
create_selection_rect
();
}
else
{
...
...
@@ -537,14 +543,6 @@ void GridView::handle_rubberband(QRect rubberBandRect, QPointF fromScenePoint, Q
if
(
rubberBandRect
.
isNull
())
{
m_handling_rubberband
=
false
;
// Add the cells to the selection
QRect
rect
=
m_selection_rects
.
back
()
->
rect
().
toRect
();
for
(
int
i
=
rect
.
top
();
i
<=
rect
.
bottom
();
++
i
)
for
(
int
j
=
rect
.
left
();
j
<=
rect
.
right
();
++
j
)
{
m_selected_cells
.
insert
(
Coord
{
j
,
i
});
}
return
;
}
...
...
@@ -583,7 +581,7 @@ void GridView::keyPressEvent(QKeyEvent *event)
}
else
if
(
event
->
key
()
==
Qt
::
Key_A
)
{
// TODO
select_all
();
}
else
if
(
event
->
key
()
==
Qt
::
Key_Plus
)
{
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment