Skip to content

Commit 652b596

Browse files
author
Matthias Koefferlein
committed
Reworked implementation to include user feedback
1 parent 7c81a8e commit 652b596

File tree

7 files changed

+162
-60
lines changed

7 files changed

+162
-60
lines changed

src/ant/ant/antPropertiesPage.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -375,8 +375,9 @@ PropertiesPage::count () const
375375
void
376376
PropertiesPage::select_entries (const std::vector<size_t> &entries)
377377
{
378-
tl_assert (entries.size () == 1);
379-
m_index = entries.front ();
378+
if (! entries.empty ()) {
379+
m_index = entries.front ();
380+
}
380381
}
381382

382383
std::string

src/edt/edt/edtPropertiesPages.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ ShapePropertiesPage::do_apply (bool current_only, bool relative, bool commit)
283283
}
284284
}
285285

286-
int new_layer = layer_selector ()->current_layer ();
286+
int new_layer = layer_selector ()->current_layer_ensure ();
287287
if (new_layer >= 0 && int (pos->layer ()) != new_layer) {
288288
unsigned int gs_layer = cv->layout ().guiding_shape_layer ();
289289
ChangeLayerApplicator *cla = new ChangeLayerApplicator (cv_index, (unsigned int) new_layer);

src/img/img/imgPropertiesPage.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,10 @@ PropertiesPage::count () const
181181
void
182182
PropertiesPage::select_entries (const std::vector<size_t> &entries)
183183
{
184-
tl_assert (entries.size () == 1);
185-
m_index = entries.front ();
186-
invalidate ();
184+
if (! entries.empty ()) {
185+
m_index = entries.front ();
186+
invalidate ();
187+
}
187188
}
188189

189190
std::string

src/layui/layui/layPropertiesDialog.cc

Lines changed: 65 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -235,10 +235,11 @@ PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager,
235235
m_current_object = 0;
236236

237237
// look for next usable editable
238+
m_object_indexes.resize (mp_properties_pages.size ());
238239
if (m_index >= int (mp_properties_pages.size ())) {
239240
m_index = -1;
240241
} else {
241-
m_object_indexes.push_back (0);
242+
m_object_indexes [m_index].push_back (0);
242243
}
243244

244245
update_title ();
@@ -383,6 +384,7 @@ BEGIN_PROTECTED
383384
delete *p;
384385
} else {
385386
mp_properties_pages.push_back (*p);
387+
(*p)->set_page_set (this);
386388
}
387389
}
388390
}
@@ -398,10 +400,11 @@ BEGIN_PROTECTED
398400
// look for next usable editable
399401
m_index = 0;
400402
m_object_indexes.clear ();
403+
m_object_indexes.resize (mp_properties_pages.size ());
401404
if (m_index >= int (mp_properties_pages.size ())) {
402405
m_index = -1;
403406
} else {
404-
m_object_indexes.push_back (0);
407+
m_object_indexes [m_index].push_back (0);
405408
}
406409

407410
mp_tree_model->end_reset_model ();
@@ -436,6 +439,7 @@ PropertiesDialog::current_index_changed (const QModelIndex &index, const QModelI
436439
}
437440

438441
m_object_indexes.clear ();
442+
m_object_indexes.resize (mp_properties_pages.size ());
439443

440444
if (! index.isValid ()) {
441445

@@ -462,56 +466,66 @@ PropertiesDialog::current_index_changed (const QModelIndex &index, const QModelI
462466

463467
}
464468

465-
if (mp_tree_model->parent (index).isValid ()) {
466-
467-
m_index = mp_tree_model->page_index (index);
469+
m_index = -1;
468470

469-
if (mp_properties_pages [m_index]->can_apply_to_all ()) {
471+
auto selection = mp_ui->tree->selectionModel ()->selectedIndexes ();
470472

471-
m_object_indexes.push_back (size_t (mp_tree_model->object_index (index)));
473+
// establish a single-selection on the current item
474+
if (mp_tree_model->parent (index).isValid ()) {
475+
int oi = mp_tree_model->object_index (index);
476+
int pi = mp_tree_model->page_index (index);
477+
m_index = pi;
478+
m_object_indexes [pi].push_back (size_t (oi));
479+
}
472480

473-
auto selection = mp_ui->tree->selectionModel ()->selectedIndexes ();
474-
for (auto i = selection.begin (); i != selection.end (); ++i) {
475-
if (mp_tree_model->parent (*i).isValid () && mp_tree_model->page_index (*i) == m_index) {
476-
int oi = mp_tree_model->object_index (*i);
477-
if (oi != int (m_object_indexes.front ())) {
478-
m_object_indexes.push_back (size_t (oi));
479-
}
480-
}
481+
// establish individual selections for the other items
482+
// as far as allowed by "can_apply_to_all"
483+
for (auto i = selection.begin (); i != selection.end (); ++i) {
484+
if (*i != index && mp_tree_model->parent (*i).isValid ()) {
485+
int oi = mp_tree_model->object_index (*i);
486+
int pi = mp_tree_model->page_index (*i);
487+
if (mp_properties_pages [pi]->can_apply_to_all ()) {
488+
m_object_indexes [pi].push_back (size_t (oi));
481489
}
482-
483-
} else {
484-
485-
m_object_indexes.push_back (size_t (mp_tree_model->object_index (index)));
486-
487490
}
491+
}
488492

489-
} else {
490-
491-
m_index = index.row ();
492-
493-
if (mp_properties_pages [m_index]->can_apply_to_all ()) {
494-
495-
for (size_t oi = 0; oi < mp_properties_pages [m_index]->count (); ++oi) {
496-
m_object_indexes.push_back (oi);
493+
// establish group node selection as current item -> translate into "all" for "can_apply_to_all" pages
494+
// or first item unless an item is explicitly selected.
495+
if (! mp_tree_model->parent (index).isValid ()) {
496+
int pi = index.row ();
497+
m_index = pi;
498+
m_object_indexes [pi].clear ();
499+
if (mp_properties_pages [pi]->can_apply_to_all ()) {
500+
for (size_t oi = 0; oi < mp_properties_pages [pi]->count (); ++oi) {
501+
m_object_indexes [pi].push_back (oi);
497502
}
498-
499-
} else if (mp_properties_pages [m_index]->count () > 0) {
500-
501-
m_object_indexes.push_back (0);
502-
503+
} else if (mp_properties_pages [pi]->count () > 0 && m_object_indexes [pi].empty ()) {
504+
m_object_indexes [pi].push_back (0);
503505
}
506+
}
504507

508+
// establish group node selection for other items -> translate into "all" for "can_apply_to_all" pages
509+
for (auto i = selection.begin (); i != selection.end (); ++i) {
510+
if (*i != index && ! mp_tree_model->parent (*i).isValid ()) {
511+
int pi = i->row ();
512+
m_object_indexes [pi].clear ();
513+
if (mp_properties_pages [pi]->can_apply_to_all ()) {
514+
for (size_t oi = 0; oi < mp_properties_pages [pi]->count (); ++oi) {
515+
m_object_indexes[pi].push_back (oi);
516+
}
517+
}
518+
}
505519
}
506520

507521
}
508522

509-
if (! m_object_indexes.empty ()) {
523+
if (m_index >= 0 && ! m_object_indexes [m_index].empty ()) {
510524
m_current_object = 0;
511525
for (int i = 0; i < m_index; ++i) {
512526
m_current_object += mp_properties_pages [i]->count ();
513527
}
514-
m_current_object += int (m_object_indexes.front ());
528+
m_current_object += int (m_object_indexes [m_index].front ());
515529
} else {
516530
m_current_object = -1;
517531
}
@@ -552,7 +566,10 @@ PropertiesDialog::update_controls ()
552566
mp_ui->ok_button->setEnabled (! mp_properties_pages [m_index]->readonly ());
553567
mp_ui->tree->setEnabled (true);
554568

555-
mp_properties_pages [m_index]->select_entries (m_object_indexes);
569+
for (int i = 0; i < int (mp_properties_pages.size ()); ++i) {
570+
mp_properties_pages [i]->select_entries (m_object_indexes [i]);
571+
}
572+
556573
mp_properties_pages [m_index]->update ();
557574

558575
}
@@ -563,7 +580,7 @@ PropertiesDialog::next_pressed ()
563580
{
564581
BEGIN_PROTECTED
565582

566-
if (m_object_indexes.empty ()) {
583+
if (m_index < 0 || m_object_indexes [m_index].empty ()) {
567584
return;
568585
}
569586

@@ -576,7 +593,7 @@ BEGIN_PROTECTED
576593
}
577594

578595
// advance the current entry
579-
int object_index = int (m_object_indexes.front ());
596+
int object_index = int (m_object_indexes [m_index].front ());
580597
++object_index;
581598

582599
// look for next usable editable if at end
@@ -593,7 +610,8 @@ BEGIN_PROTECTED
593610
}
594611

595612
m_object_indexes.clear ();
596-
m_object_indexes.push_back (object_index);
613+
m_object_indexes.resize (mp_properties_pages.size ());
614+
m_object_indexes [m_index].push_back (object_index);
597615

598616
++m_current_object;
599617
update_title ();
@@ -611,7 +629,7 @@ PropertiesDialog::prev_pressed ()
611629
{
612630
BEGIN_PROTECTED
613631

614-
if (m_object_indexes.empty ()) {
632+
if (m_index < 0 || m_object_indexes [m_index].empty ()) {
615633
return;
616634
}
617635

@@ -624,7 +642,7 @@ BEGIN_PROTECTED
624642
}
625643

626644
// advance the current entry
627-
int object_index = int (m_object_indexes.front ());
645+
int object_index = int (m_object_indexes [m_index].front ());
628646
if (object_index == 0) {
629647

630648
// look for last usable editable if at end
@@ -643,7 +661,8 @@ BEGIN_PROTECTED
643661
--object_index;
644662

645663
m_object_indexes.clear ();
646-
m_object_indexes.push_back (object_index);
664+
m_object_indexes.resize (mp_properties_pages.size ());
665+
m_object_indexes [m_index].push_back (object_index);
647666

648667
--m_current_object;
649668
update_title ();
@@ -669,12 +688,12 @@ PropertiesDialog::update_title ()
669688
bool
670689
PropertiesDialog::any_next () const
671690
{
672-
if (m_object_indexes.empty ()) {
691+
if (m_index < 0 || m_object_indexes [m_index].empty ()) {
673692
return false;
674693
}
675694

676695
int index = m_index;
677-
if (m_object_indexes.front () + 1 >= mp_properties_pages [index]->count ()) {
696+
if (m_object_indexes [m_index].front () + 1 >= mp_properties_pages [index]->count ()) {
678697
++index;
679698
}
680699

@@ -685,12 +704,12 @@ PropertiesDialog::any_next () const
685704
bool
686705
PropertiesDialog::any_prev () const
687706
{
688-
if (m_object_indexes.empty ()) {
707+
if (m_index < 0 || m_object_indexes [m_index].empty ()) {
689708
return false;
690709
}
691710

692711
int index = m_index;
693-
if (m_object_indexes.front () == 0) {
712+
if (m_object_indexes [m_index].front () == 0) {
694713
--index;
695714
}
696715

src/layui/layui/layPropertiesDialog.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ Q_OBJECT
9595
db::Manager *mp_manager;
9696
lay::Editables *mp_editables;
9797
int m_index, m_prev_index;
98-
std::vector<size_t> m_object_indexes;
98+
std::vector<std::vector<size_t> > m_object_indexes;
9999
QStackedLayout *mp_stack;
100100
QLabel *mp_none;
101101
lay::MainWindow *mp_mw;

src/layui/layui/layWidgets.cc

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ struct LayerSelectionComboBoxPrivateData
514514
};
515515

516516
LayerSelectionComboBox::LayerSelectionComboBox (QWidget *parent)
517-
: QComboBox (parent), dm_update_layer_list (this, &LayerSelectionComboBox::do_update_layer_list)
517+
: QComboBox (parent), dm_update_layer_list (this, &LayerSelectionComboBox::do_update_layer_list), m_ignore_layer_list_changed (false)
518518
{
519519
mp_private = new LayerSelectionComboBoxPrivateData ();
520520
mp_private->no_layer_available = false;
@@ -651,7 +651,9 @@ LayerSelectionComboBox::set_view (lay::LayoutViewBase *view, int cv_index, bool
651651
void
652652
LayerSelectionComboBox::on_layer_list_changed (int)
653653
{
654-
update_layer_list ();
654+
if (! m_ignore_layer_list_changed) {
655+
update_layer_list ();
656+
}
655657
}
656658

657659
void
@@ -795,8 +797,8 @@ LayerSelectionComboBox::set_current_layer (const db::LayerProperties &props)
795797
setCurrentIndex (-1);
796798
}
797799

798-
void
799-
LayerSelectionComboBox::set_current_layer (int l)
800+
const db::Layout *
801+
LayerSelectionComboBox::layout () const
800802
{
801803
const db::Layout *layout = mp_private->layout;
802804
if (! layout && mp_private->view) {
@@ -805,9 +807,22 @@ LayerSelectionComboBox::set_current_layer (int l)
805807
layout = & cv->layout ();
806808
}
807809
}
810+
return layout;
811+
}
812+
813+
db::Layout *
814+
LayerSelectionComboBox::layout ()
815+
{
816+
return const_cast<db::Layout *> (((const LayerSelectionComboBox *) this)->layout ());
817+
}
808818

809-
if (l >= 0 && layout && layout->is_valid_layer ((unsigned int) l)) {
810-
mp_private->last_props = layout->get_properties ((unsigned int) l);
819+
void
820+
LayerSelectionComboBox::set_current_layer (int l)
821+
{
822+
const db::Layout *ly = layout ();
823+
824+
if (l >= 0 && ly && ly->is_valid_layer ((unsigned int) l)) {
825+
mp_private->last_props = ly->get_properties ((unsigned int) l);
811826
}
812827

813828
if (l < 0) {
@@ -821,6 +836,12 @@ LayerSelectionComboBox::set_current_layer (int l)
821836
}
822837
}
823838

839+
bool
840+
LayerSelectionComboBox::is_no_layer_selected () const
841+
{
842+
return currentIndex () < 0;
843+
}
844+
824845
int
825846
LayerSelectionComboBox::current_layer () const
826847
{
@@ -832,7 +853,40 @@ LayerSelectionComboBox::current_layer () const
832853
}
833854
}
834855

835-
db::LayerProperties
856+
int
857+
LayerSelectionComboBox::current_layer_ensure ()
858+
{
859+
int i = currentIndex ();
860+
if (i < 0 || i > int (mp_private->layers.size ())) {
861+
862+
return -1;
863+
864+
} else if (mp_private->layers [i].second < 0) {
865+
866+
db::Layout *ly = layout ();
867+
if (! ly) {
868+
return -1;
869+
}
870+
871+
m_ignore_layer_list_changed = true;
872+
try {
873+
unsigned int l = ly->insert_layer (mp_private->layers [i].first);
874+
mp_private->layers [i].second = l;
875+
m_ignore_layer_list_changed = false;
876+
return l;
877+
} catch (...) {
878+
m_ignore_layer_list_changed = false;
879+
throw;
880+
}
881+
882+
} else {
883+
884+
return mp_private->layers [i].second;
885+
886+
}
887+
}
888+
889+
db::LayerProperties
836890
LayerSelectionComboBox::current_layer_props () const
837891
{
838892
int i = currentIndex ();

0 commit comments

Comments
 (0)