vymview.cpp
author insilmaril
Wed, 25 Nov 2009 10:58:21 +0000
changeset 807 f9f7922989d8
parent 806 2a33304714ba
child 808 b163492fda17
permissions -rw-r--r--
Added demos/vym-contribute.vym, fixes for selecting items
insilmaril@726
     1
#include "vymview.h"
insilmaril@726
     2
insilmaril@727
     3
#include <iostream>
insilmaril@742
     4
using namespace std;
insilmaril@727
     5
insilmaril@804
     6
#include "branchitem.h"
insilmaril@732
     7
#include "mainwindow.h"
insilmaril@726
     8
#include "mapeditor.h"
insilmaril@769
     9
#include "treeeditor.h"
insilmaril@726
    10
insilmaril@732
    11
extern Main *mainWindow;
insilmaril@732
    12
insilmaril@732
    13
insilmaril@742
    14
VymView::VymView(VymModel *m)
insilmaril@726
    15
{
insilmaril@742
    16
	model=m;
insilmaril@742
    17
insilmaril@726
    18
	// Create TreeView
insilmaril@769
    19
	treeEditor=new TreeEditor (model);
insilmaril@788
    20
	//treeEditor->setModel ((QAbstractItemModel*)model);
insilmaril@769
    21
	//treeEditor->setMinimumWidth (50);
insilmaril@761
    22
insilmaril@788
    23
	treeEditor->setColumnWidth (0,150);
insilmaril@788
    24
	treeEditor->setAnimated (true);
insilmaril@726
    25
insilmaril@804
    26
	// FIXME-2 use proxySelModel=treeEditor->selectionModel();
insilmaril@801
    27
	selModel=new QItemSelectionModel (model);
insilmaril@801
    28
insilmaril@801
    29
	//model->setSelectionModel (proxySelModel);
insilmaril@728
    30
	model->setSelectionModel (selModel);
insilmaril@804
    31
	treeEditor->setSelectionModel (selModel);
insilmaril@727
    32
insilmaril@726
    33
	// Create good old MapEditor
insilmaril@761
    34
	mapEditor=model->getMapEditor();
insilmaril@761
    35
	if (!mapEditor) mapEditor=new MapEditor (model);
insilmaril@772
    36
insilmaril@801
    37
	// Connect selections
insilmaril@801
    38
insilmaril@801
    39
		// Proxymodel changed
insilmaril@804
    40
		/*
insilmaril@801
    41
		connect (
insilmaril@801
    42
			proxySelModel, SIGNAL (selectionChanged(const QItemSelection &, const QItemSelection &)), 
insilmaril@801
    43
			this,SLOT (changeProxySelection(const QItemSelection &,const QItemSelection &)));
insilmaril@804
    44
*/
insilmaril@801
    45
insilmaril@804
    46
		// Selection in Model changed	
insilmaril@801
    47
		connect (
insilmaril@801
    48
			selModel, SIGNAL (selectionChanged(const QItemSelection &, const QItemSelection &)), 
insilmaril@801
    49
			this,SLOT (changeSelection(const QItemSelection &,const QItemSelection &)));
insilmaril@801
    50
insilmaril@804
    51
		// Tell MapEditor to update selection
insilmaril@807
    52
		/* FIXME-3 done implicit here in VymView
insilmaril@801
    53
		connect (
insilmaril@801
    54
			selModel, SIGNAL (selectionChanged(const QItemSelection &, const QItemSelection &)), 
insilmaril@801
    55
			mapEditor,SLOT (updateSelection(const QItemSelection &,const QItemSelection &)));
insilmaril@807
    56
			*/
insilmaril@801
    57
insilmaril@804
    58
		// FIXME-2 testing, if that reenables updating selbox during animation
insilmaril@804
    59
		connect (
insilmaril@804
    60
			model, SIGNAL (selectionChanged(const QItemSelection &, const QItemSelection &)), 
insilmaril@804
    61
			mapEditor,SLOT (updateSelection(const QItemSelection &,const QItemSelection &)));
insilmaril@804
    62
insilmaril@801
    63
	// Connect data changed signals	
insilmaril@753
    64
	connect (
insilmaril@753
    65
		model, SIGNAL (dataChanged(const QModelIndex &, const QModelIndex &)), 
insilmaril@761
    66
		mapEditor,SLOT (updateData(const QModelIndex &) ) );
insilmaril@726
    67
insilmaril@800
    68
	connect (
insilmaril@800
    69
		model, SIGNAL (sortFilterChanged (const QString &)),
insilmaril@800
    70
		treeEditor, SLOT (setSortFilter (const QString &) ) );
insilmaril@800
    71
insilmaril@746
    72
	connect (
insilmaril@753
    73
		model, SIGNAL (noteHasChanged(QModelIndex) ),
insilmaril@753
    74
		mainWindow, SLOT (updateNoteEditor (QModelIndex) ) );
insilmaril@746
    75
		
insilmaril@763
    76
	connect (
insilmaril@763
    77
		model, SIGNAL (expandAll() ),
insilmaril@763
    78
		this, SLOT (expandAll () ) );
insilmaril@763
    79
		
insilmaril@763
    80
	connect (
insilmaril@804
    81
		model, SIGNAL (expandOneLevel() ),
insilmaril@804
    82
		this, SLOT (expandOneLevel() ) );
insilmaril@804
    83
		
insilmaril@804
    84
	connect (
insilmaril@804
    85
		model, SIGNAL (collapseOneLevel() ),
insilmaril@804
    86
		this, SLOT (collapseOneLevel() ) );
insilmaril@804
    87
		
insilmaril@804
    88
	connect (
insilmaril@763
    89
		model, SIGNAL (showSelection() ),
insilmaril@763
    90
		this, SLOT (showSelection() ) );
insilmaril@763
    91
		
insilmaril@726
    92
insilmaril@761
    93
	mapEditor->setAntiAlias (mainWindow->isAliased());
insilmaril@761
    94
	mapEditor->setSmoothPixmap(mainWindow->hasSmoothPixmapTransform());
insilmaril@726
    95
insilmaril@769
    96
	addWidget (treeEditor);
insilmaril@761
    97
	addWidget (mapEditor);
insilmaril@726
    98
insilmaril@726
    99
	// Set geometry
insilmaril@761
   100
	QList <int> widths;
insilmaril@788
   101
	widths<<200;
insilmaril@761
   102
	widths<<600;
insilmaril@761
   103
	setSizes(widths);
insilmaril@726
   104
}
insilmaril@726
   105
insilmaril@772
   106
VymView::~VymView()
insilmaril@772
   107
{
insilmaril@772
   108
	//cout << "Destructor VymView\n";
insilmaril@772
   109
}
insilmaril@772
   110
insilmaril@772
   111
VymModel* VymView::getModel()
insilmaril@772
   112
{
insilmaril@772
   113
	return model;
insilmaril@772
   114
}
insilmaril@772
   115
insilmaril@772
   116
MapEditor* VymView::getMapEditor()
insilmaril@772
   117
{
insilmaril@772
   118
	return mapEditor;
insilmaril@772
   119
}
insilmaril@772
   120
insilmaril@769
   121
void VymView::initFocus()
insilmaril@769
   122
{
insilmaril@769
   123
	mapEditor->setFocus();
insilmaril@769
   124
}
insilmaril@769
   125
insilmaril@807
   126
void VymView::changeSelection (const QItemSelection &newsel, const QItemSelection &oldsel)	
insilmaril@727
   127
{
insilmaril@807
   128
	//cout << "VV::changeSelection   newsel.count="<<newsel.indexes().count()<<endl;
insilmaril@804
   129
insilmaril@807
   130
	mainWindow->changeSelection (model,newsel,oldsel);	
insilmaril@807
   131
	mapEditor->updateSelection (newsel,oldsel);
insilmaril@804
   132
insilmaril@804
   133
	if (newsel.indexes().count()>0)
insilmaril@804
   134
	{
insilmaril@804
   135
insilmaril@804
   136
	/* FIXME-2 use proxymodel
insilmaril@804
   137
		proxySelModel->select (
insilmaril@804
   138
			treeEditor->getProxyModel()->mapSelectionFromSource (newsel),
insilmaril@804
   139
			QItemSelectionModel::ClearAndSelect );
insilmaril@804
   140
		*/
insilmaril@807
   141
		
insilmaril@804
   142
		QModelIndex ix=newsel.indexes().first();
insilmaril@804
   143
		selModel->setCurrentIndex (ix,QItemSelectionModel::ClearAndSelect  );
insilmaril@804
   144
		treeEditor->setCurrentIndex (ix);
insilmaril@804
   145
		showSelection();
insilmaril@807
   146
		
insilmaril@804
   147
	}
insilmaril@801
   148
}
insilmaril@777
   149
insilmaril@801
   150
void VymView::changeProxySelection (const QItemSelection &newsel, const QItemSelection &oldsel)
insilmaril@801
   151
{
insilmaril@801
   152
	// Notify mainwindow to update satellites, but map selection to 
insilmaril@801
   153
	// original model first
insilmaril@801
   154
insilmaril@806
   155
	//cout << "VV::changeProxySelection   newsel.count="<<newsel.indexes().count()<<endl;
insilmaril@804
   156
	if (!newsel.indexes().isEmpty())
insilmaril@804
   157
	{
insilmaril@804
   158
	/* FIXME-2 need to set current, too
insilmaril@804
   159
	*/
insilmaril@804
   160
		proxySelModel->setCurrentIndex (
insilmaril@804
   161
			newsel.indexes().first(),
insilmaril@804
   162
			QItemSelectionModel::ClearAndSelect );
insilmaril@804
   163
	treeEditor->setCurrentIndex (newsel.indexes().first() );
insilmaril@804
   164
	}
insilmaril@804
   165
insilmaril@801
   166
	// Re-emit but map selection first
insilmaril@804
   167
	selModel->select (
insilmaril@804
   168
		treeEditor->getProxyModel()->mapSelectionToSource (newsel),
insilmaril@802
   169
		QItemSelectionModel::ClearAndSelect );
insilmaril@804
   170
insilmaril@803
   171
	showSelection();
insilmaril@727
   172
}
insilmaril@727
   173
insilmaril@763
   174
void VymView::expandAll()
insilmaril@763
   175
{
insilmaril@769
   176
	treeEditor->expandAll();
insilmaril@763
   177
}
insilmaril@763
   178
insilmaril@804
   179
void VymView::expandOneLevel()
insilmaril@804
   180
{
insilmaril@804
   181
	int level=999999;
insilmaril@804
   182
	int d;
insilmaril@804
   183
	BranchItem *cur=NULL;
insilmaril@804
   184
	BranchItem *prev=NULL;
insilmaril@804
   185
	QModelIndex pix;
insilmaril@804
   186
insilmaril@804
   187
	// Find level to expand
insilmaril@804
   188
	model->nextBranch(cur,prev);
insilmaril@804
   189
	while (cur) 
insilmaril@804
   190
	{
insilmaril@804
   191
		// FIXME-2 use proxy pix=treeEditor->getProxyModel()->mapFromSource (model->index (cur));
insilmaril@804
   192
		pix=model->index (cur);
insilmaril@804
   193
		d=cur->depth();
insilmaril@804
   194
		if (!treeEditor->isExpanded(pix) && d < level)
insilmaril@804
   195
			level=d;
insilmaril@804
   196
		model->nextBranch(cur,prev);	
insilmaril@804
   197
	}
insilmaril@804
   198
insilmaril@804
   199
	// Expand all to level
insilmaril@804
   200
	cur=NULL;
insilmaril@804
   201
	prev=NULL;
insilmaril@804
   202
	model->nextBranch(cur,prev);
insilmaril@804
   203
	while (cur) 
insilmaril@804
   204
	{
insilmaril@804
   205
		// FIXME-2 use proxy pix=treeEditor->getProxyModel()->mapFromSource (model->index (cur));
insilmaril@804
   206
		pix=model->index (cur);
insilmaril@804
   207
		d=cur->depth();
insilmaril@804
   208
		if (!treeEditor->isExpanded(pix) && d <= level && cur->branchCount()>0)
insilmaril@804
   209
			treeEditor->setExpanded(pix,true);
insilmaril@804
   210
		model->nextBranch(cur,prev);	
insilmaril@804
   211
	}
insilmaril@804
   212
	/* FIXME-3 optimize expanding by using flat version of next
insilmaril@804
   213
	model->nextBranch(cur,prev,false);
insilmaril@804
   214
	while (cur) 
insilmaril@804
   215
	{
insilmaril@804
   216
		cout << "ok: "<<cur->getHeadingStd()<<endl./re/videochristinaprison1_wmvl.wmv
insilmaril@804
   217
;
insilmaril@804
   218
		model->nextBranch(cur,prev,false);	
insilmaril@804
   219
	}
insilmaril@804
   220
	*/
insilmaril@804
   221
}
insilmaril@804
   222
insilmaril@804
   223
void VymView::collapseOneLevel()
insilmaril@804
   224
{
insilmaril@804
   225
	int level=-1;
insilmaril@804
   226
	int d;
insilmaril@804
   227
	BranchItem *cur=NULL;
insilmaril@804
   228
	BranchItem *prev=NULL;
insilmaril@804
   229
	QModelIndex pix;
insilmaril@804
   230
insilmaril@804
   231
	// Find level to collapse
insilmaril@804
   232
	model->nextBranch(cur,prev);
insilmaril@804
   233
	while (cur) 
insilmaril@804
   234
	{
insilmaril@804
   235
		// FIXME-2 use proxy pix=treeEditor->getProxyModel()->mapFromSource (model->index (cur));
insilmaril@804
   236
		pix=model->index (cur);
insilmaril@804
   237
		d=cur->depth();
insilmaril@804
   238
		if (treeEditor->isExpanded(pix) && d > level)
insilmaril@804
   239
			level=d;
insilmaril@804
   240
		model->nextBranch(cur,prev);	
insilmaril@804
   241
	}
insilmaril@804
   242
insilmaril@804
   243
	// collapse all to level
insilmaril@804
   244
	cur=NULL;
insilmaril@804
   245
	prev=NULL;
insilmaril@804
   246
	model->nextBranch(cur,prev);
insilmaril@804
   247
	while (cur) 
insilmaril@804
   248
	{
insilmaril@804
   249
		// FIXME-2 use proxy pix=treeEditor->getProxyModel()->mapFromSource (model->index (cur));
insilmaril@804
   250
		pix=model->index (cur);
insilmaril@804
   251
		d=cur->depth();
insilmaril@804
   252
		if (treeEditor->isExpanded(pix) && d >= level)
insilmaril@804
   253
			treeEditor->setExpanded(pix,false);
insilmaril@804
   254
		model->nextBranch(cur,prev);	
insilmaril@804
   255
	}
insilmaril@804
   256
}
insilmaril@804
   257
insilmaril@763
   258
void VymView::showSelection()
insilmaril@763
   259
{
insilmaril@772
   260
	QModelIndex ix=model->getSelectedIndex();
insilmaril@772
   261
	treeEditor->scrollTo( ix, QAbstractItemView::EnsureVisible);
insilmaril@807
   262
	mapEditor->scrollTo ( ix);	// FIXME-3 also called from MapEditor::updateSelection...
insilmaril@763
   263
}
insilmaril@763
   264