2017-03-12 23:26:04 +01:00
/*
KLayout Layout Viewer
Copyright ( C ) 2006 - 2017 Matthias Koefferlein
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
# include "laySaltManagerDialog.h"
2017-03-25 00:08:17 +01:00
# include "laySaltModel.h"
2017-03-19 22:44:46 +01:00
# include "laySaltGrainPropertiesDialog.h"
2017-03-18 00:22:45 +01:00
# include "laySalt.h"
2017-03-23 22:19:13 +01:00
# include "ui_SaltGrainTemplateSelectionDialog.h"
2017-03-18 00:22:45 +01:00
# include "tlString.h"
2017-03-23 23:46:25 +01:00
# include "tlExceptions.h"
2017-03-18 00:22:45 +01:00
# include <QTextDocument>
# include <QPainter>
# include <QDir>
2017-03-18 22:36:33 +01:00
# include <QTextStream>
# include <QBuffer>
2017-03-23 22:19:13 +01:00
# include <QResource>
2017-03-25 00:08:17 +01:00
# include <QMessageBox>
# include <QAbstractItemModel>
# include <QStyledItemDelegate>
2017-03-12 23:26:04 +01:00
namespace lay
{
2017-03-18 22:36:33 +01:00
// --------------------------------------------------------------------------------------
2017-03-23 22:19:13 +01:00
/**
* @ brief A tiny dialog to select a template and a name for the grain
*/
class SaltGrainTemplateSelectionDialog
: public QDialog , private Ui : : SaltGrainTemplateSelectionDialog
{
public :
2017-03-23 23:46:25 +01:00
SaltGrainTemplateSelectionDialog ( QWidget * parent , lay : : Salt * salt )
: QDialog ( parent ) , mp_salt ( salt )
2017-03-23 22:19:13 +01:00
{
Ui : : SaltGrainTemplateSelectionDialog : : setupUi ( this ) ;
m_salt_templates . add_location ( " :/salt_templates " ) ;
salt_view - > setModel ( new SaltModel ( this , & m_salt_templates ) ) ;
salt_view - > setItemDelegate ( new SaltItemDelegate ( this ) ) ;
salt_view - > setCurrentIndex ( salt_view - > model ( ) - > index ( 0 , 0 , QModelIndex ( ) ) ) ;
}
lay : : SaltGrain templ ( ) const
{
SaltModel * model = dynamic_cast < SaltModel * > ( salt_view - > model ( ) ) ;
tl_assert ( model ! = 0 ) ;
SaltGrain * g = model - > grain_from_index ( salt_view - > currentIndex ( ) ) ;
tl_assert ( g ! = 0 ) ;
return * g ;
}
2017-03-23 23:46:25 +01:00
std : : string name ( ) const
{
return tl : : to_string ( name_edit - > text ( ) ) ;
}
2017-03-23 22:19:13 +01:00
void accept ( )
{
name_alert - > clear ( ) ;
std : : string name = tl : : to_string ( name_edit - > text ( ) . simplified ( ) ) ;
if ( name . empty ( ) ) {
name_alert - > error ( ) < < tr ( " Name must not be empty " ) ;
} else if ( ! SaltGrain : : valid_name ( name ) ) {
name_alert - > error ( ) < < tr ( " Name is not valid (must be composed of letters, digits or underscores. \n Groups and names need to be separated with slashes. " ) ;
} else {
2017-03-23 23:46:25 +01:00
// check, if this name does not exist yet
for ( Salt : : flat_iterator g = mp_salt - > begin_flat ( ) ; g ! = mp_salt - > end_flat ( ) ; + + g ) {
if ( ( * g ) - > name ( ) = = name ) {
name_alert - > error ( ) < < tr ( " A package with this name already exists " ) ;
return ;
}
}
2017-03-23 22:19:13 +01:00
QDialog : : accept ( ) ;
2017-03-23 23:46:25 +01:00
2017-03-23 22:19:13 +01:00
}
}
private :
lay : : Salt m_salt_templates ;
2017-03-23 23:46:25 +01:00
lay : : Salt * mp_salt ;
2017-03-23 22:19:13 +01:00
} ;
2017-03-18 22:36:33 +01:00
// --------------------------------------------------------------------------------------
// SaltManager implementation
2017-03-18 00:22:45 +01:00
// @@@
lay : : Salt salt ;
static bool salt_initialized = false ;
void make_salt ( )
{
if ( ! salt_initialized ) {
salt_initialized = true ;
salt . add_location ( tl : : to_string ( QDir : : homePath ( ) + QString : : fromUtf8 ( " /.klayout/salt " ) ) ) ;
}
}
2017-03-25 10:15:24 +01:00
lay : : Salt * get_salt ( )
{
salt = lay : : Salt ( ) ; salt_initialized = false ;
make_salt ( ) ;
return & salt ;
}
// @@@
// @@@
lay : : Salt salt_mine ;
void make_salt_mine ( )
{
salt_mine . load ( " /home/matthias/salt.mine " ) ;
}
lay : : Salt * get_salt_mine ( )
{
make_salt_mine ( ) ;
return & salt_mine ;
}
2017-03-18 00:22:45 +01:00
// @@@
2017-03-12 23:26:04 +01:00
SaltManagerDialog : : SaltManagerDialog ( QWidget * parent )
2017-03-18 22:36:33 +01:00
: QDialog ( parent ) ,
m_current_changed_enabled ( true )
2017-03-12 23:26:04 +01:00
{
Ui : : SaltManagerDialog : : setupUi ( this ) ;
2017-03-19 22:44:46 +01:00
mp_properties_dialog = new lay : : SaltGrainPropertiesDialog ( this ) ;
connect ( edit_button , SIGNAL ( clicked ( ) ) , this , SLOT ( edit_properties ( ) ) ) ;
2017-03-23 22:19:13 +01:00
connect ( create_button , SIGNAL ( clicked ( ) ) , this , SLOT ( create_grain ( ) ) ) ;
connect ( delete_button , SIGNAL ( clicked ( ) ) , this , SLOT ( delete_grain ( ) ) ) ;
2017-03-12 23:26:04 +01:00
2017-03-25 10:15:24 +01:00
mp_salt = get_salt ( ) ;
mp_salt_mine = get_salt_mine ( ) ;
SaltModel * model ;
2017-03-18 22:36:33 +01:00
2017-03-25 10:15:24 +01:00
model = new SaltModel ( this , mp_salt ) ;
2017-03-18 22:36:33 +01:00
salt_view - > setModel ( model ) ;
2017-03-18 00:22:45 +01:00
salt_view - > setItemDelegate ( new SaltItemDelegate ( this ) ) ;
2017-03-25 10:15:24 +01:00
model = new SaltModel ( this , mp_salt_mine ) ;
salt_mine_view - > setModel ( model ) ;
salt_mine_view - > setItemDelegate ( new SaltItemDelegate ( this ) ) ;
mode_tab - > setCurrentIndex ( mp_salt - > is_empty ( ) ? 1 : 0 ) ;
connect ( mode_tab , SIGNAL ( currentChanged ( int ) ) , this , SLOT ( mode_changed ( ) ) ) ;
2017-03-18 22:36:33 +01:00
connect ( mp_salt , SIGNAL ( collections_changed ( ) ) , this , SLOT ( salt_changed ( ) ) ) ;
2017-03-25 10:15:24 +01:00
connect ( mp_salt_mine , SIGNAL ( collections_changed ( ) ) , this , SLOT ( salt_mine_changed ( ) ) ) ;
2017-03-18 22:36:33 +01:00
salt_changed ( ) ;
2017-03-25 10:15:24 +01:00
salt_mine_changed ( ) ;
2017-03-18 22:36:33 +01:00
connect ( salt_view - > selectionModel ( ) , SIGNAL ( currentChanged ( const QModelIndex & , const QModelIndex & ) ) , this , SLOT ( current_changed ( ) ) ) ;
2017-03-25 10:15:24 +01:00
connect ( salt_mine_view - > selectionModel ( ) , SIGNAL ( currentChanged ( const QModelIndex & , const QModelIndex & ) ) , this , SLOT ( mine_current_changed ( ) ) ) ;
2017-03-18 22:36:33 +01:00
2017-03-19 22:44:46 +01:00
// @@@
}
2017-03-18 22:36:33 +01:00
2017-03-25 10:15:24 +01:00
void
SaltManagerDialog : : mode_changed ( )
{
// keeps the splitters in sync
if ( mode_tab - > currentIndex ( ) = = 1 ) {
splitter_new - > setSizes ( splitter - > sizes ( ) ) ;
} else if ( mode_tab - > currentIndex ( ) = = 0 ) {
splitter - > setSizes ( splitter_new - > sizes ( ) ) ;
}
}
2017-03-19 22:44:46 +01:00
void
SaltManagerDialog : : edit_properties ( )
{
SaltGrain * g = current_grain ( ) ;
if ( g ) {
if ( mp_properties_dialog - > exec_dialog ( g , mp_salt ) ) {
current_changed ( ) ;
}
}
2017-03-12 23:26:04 +01:00
}
2017-03-23 22:19:13 +01:00
void
SaltManagerDialog : : create_grain ( )
{
2017-03-23 23:46:25 +01:00
BEGIN_PROTECTED
SaltGrainTemplateSelectionDialog temp_dialog ( this , mp_salt ) ;
2017-03-23 22:19:13 +01:00
if ( temp_dialog . exec ( ) ) {
2017-03-23 23:46:25 +01:00
SaltGrain target ;
target . set_name ( temp_dialog . name ( ) ) ;
if ( mp_salt - > create_grain ( temp_dialog . templ ( ) , target ) ) {
// select the new one
SaltModel * model = dynamic_cast < SaltModel * > ( salt_view - > model ( ) ) ;
if ( model ) {
for ( int i = model - > rowCount ( QModelIndex ( ) ) ; i > 0 ; ) {
- - i ;
QModelIndex index = model - > index ( i , 0 , QModelIndex ( ) ) ;
SaltGrain * g = model - > grain_from_index ( index ) ;
if ( g & & g - > name ( ) = = target . name ( ) ) {
salt_view - > setCurrentIndex ( index ) ;
break ;
}
}
}
} else {
throw tl : : Exception ( tl : : to_string ( tr ( " Initialization of new package failed - see log window (File/Log Viewer) for details " ) ) ) ;
}
2017-03-23 22:19:13 +01:00
}
2017-03-23 23:46:25 +01:00
END_PROTECTED
2017-03-23 22:19:13 +01:00
}
void
SaltManagerDialog : : delete_grain ( )
{
2017-03-25 00:08:17 +01:00
BEGIN_PROTECTED
2017-03-23 22:19:13 +01:00
2017-03-25 00:08:17 +01:00
SaltGrain * g = current_grain ( ) ;
if ( ! g ) {
throw tl : : Exception ( tl : : to_string ( tr ( " No package selected to delete " ) ) ) ;
}
2017-03-23 22:19:13 +01:00
2017-03-25 00:08:17 +01:00
if ( QMessageBox : : question ( this , tr ( " Delete Package " ) , tr ( " Are you sure to delete package '%1'? " ) . arg ( tl : : to_qstring ( g - > name ( ) ) ) , QMessageBox : : Yes , QMessageBox : : No ) = = QMessageBox : : Yes ) {
mp_salt - > remove_grain ( * g ) ;
}
END_PROTECTED
2017-03-23 22:19:13 +01:00
}
2017-03-18 22:36:33 +01:00
void
SaltManagerDialog : : salt_changed ( )
{
SaltModel * model = dynamic_cast < SaltModel * > ( salt_view - > model ( ) ) ;
if ( ! model ) {
return ;
}
2017-03-25 00:08:17 +01:00
// NOTE: the disabling of the event handler prevents us from
// letting the model connect to the salt's signal directly.
2017-03-18 22:36:33 +01:00
m_current_changed_enabled = false ;
model - > update ( ) ;
m_current_changed_enabled = true ;
if ( mp_salt - > is_empty ( ) ) {
2017-03-23 23:46:25 +01:00
2017-03-18 22:36:33 +01:00
list_stack - > setCurrentIndex ( 1 ) ;
details_frame - > hide ( ) ;
2017-03-23 23:46:25 +01:00
2017-03-18 22:36:33 +01:00
} else {
2017-03-23 23:46:25 +01:00
2017-03-18 22:36:33 +01:00
list_stack - > setCurrentIndex ( 0 ) ;
details_frame - > show ( ) ;
2017-03-23 23:46:25 +01:00
// select the first grain
if ( model - > rowCount ( QModelIndex ( ) ) > 0 ) {
salt_view - > setCurrentIndex ( model - > index ( 0 , 0 , QModelIndex ( ) ) ) ;
}
2017-03-18 22:36:33 +01:00
}
current_changed ( ) ;
}
void
SaltManagerDialog : : current_changed ( )
{
2017-03-19 22:44:46 +01:00
SaltGrain * g = current_grain ( ) ;
2017-03-18 22:36:33 +01:00
details_text - > set_grain ( g ) ;
if ( ! g ) {
details_frame - > setEnabled ( false ) ;
delete_button - > setEnabled ( false ) ;
} else {
details_frame - > setEnabled ( true ) ;
delete_button - > setEnabled ( true ) ;
2017-03-21 22:20:24 +01:00
edit_button - > setEnabled ( ! g - > is_readonly ( ) ) ;
2017-03-18 22:36:33 +01:00
}
}
2017-03-19 22:44:46 +01:00
lay : : SaltGrain *
SaltManagerDialog : : current_grain ( )
{
SaltModel * model = dynamic_cast < SaltModel * > ( salt_view - > model ( ) ) ;
return model ? model - > grain_from_index ( salt_view - > currentIndex ( ) ) : 0 ;
}
2017-03-25 10:15:24 +01:00
void
SaltManagerDialog : : salt_mine_changed ( )
{
SaltModel * model = dynamic_cast < SaltModel * > ( salt_mine_view - > model ( ) ) ;
if ( ! model ) {
return ;
}
// NOTE: the disabling of the event handler prevents us from
// letting the model connect to the salt's signal directly.
m_current_changed_enabled = false ;
model - > update ( ) ;
m_current_changed_enabled = true ;
// select the first grain
if ( model - > rowCount ( QModelIndex ( ) ) > 0 ) {
salt_mine_view - > setCurrentIndex ( model - > index ( 0 , 0 , QModelIndex ( ) ) ) ;
}
mine_current_changed ( ) ;
}
void
SaltManagerDialog : : mine_current_changed ( )
{
SaltGrain * g = mine_current_grain ( ) ;
details_new_text - > set_grain ( g ) ;
details_new_frame - > setEnabled ( g ! = 0 ) ;
}
lay : : SaltGrain *
SaltManagerDialog : : mine_current_grain ( )
{
SaltModel * model = dynamic_cast < SaltModel * > ( salt_mine_view - > model ( ) ) ;
return model ? model - > grain_from_index ( salt_mine_view - > currentIndex ( ) ) : 0 ;
}
2017-03-12 23:26:04 +01:00
}