From 359b73c2a3ea785e6e8f545f0488d3d93da1f046 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Thu, 4 Jun 2009 00:29:56 +0200 Subject: [PATCH] ResourcesBrowser: implemented item-sensitive context menu Implemented context menu for ResourcesBrowser with various actions inside depending on selected item. Signed-off-by: Tobias Doerffel --- data/themes/default/edit-delete.png | Bin 0 -> 1333 bytes .../default/mimetypes/folder-downloads.png | Bin 0 -> 1351 bytes .../default/mimetypes/network-workgroup.png | Bin 0 -> 2226 bytes include/resources_browser.h | 25 ++++ src/gui/resources_browser.cpp | 129 ++++++++++++++++++ 5 files changed, 154 insertions(+) create mode 100644 data/themes/default/edit-delete.png create mode 100644 data/themes/default/mimetypes/folder-downloads.png create mode 100644 data/themes/default/mimetypes/network-workgroup.png diff --git a/data/themes/default/edit-delete.png b/data/themes/default/edit-delete.png new file mode 100644 index 0000000000000000000000000000000000000000..351659ba4b5edf19d2d46ca0c4ed7ca507ba6777 GIT binary patch literal 1333 zcmV-51q?g~GXWD-rVdtQ- z)eByHw%>lw^Zh>G|M{K&|9=hv_)nP&@c#~QlF0D1rDelefBzfR1_sVEH9bw_^nj334Uwb1;nE|$4J((T-rE!6AzsfEKm<(lDT9|V zR-ndYO%=|)<_O*!Vw`k@c9Nc-7CYlX**Ca<>RX7%NgW}k9e$hzRV*A;@4#eM7K8^? z6*%K*53UWB6HPgeqeLzhTs!0CfO|(Yn9R(?-~0Aq;zS9=OFYF}Z-8S&^_46b`1C!D zr*FsY?T<-M$3%H4zV}dpdxmA;znUT#A|mY$3#3 zZ-7!F#}cB!YCBW>xgj1siHX`ICu8K$S19CxJ9zL0qVe5M*67dQi|(YPDgA#PIlzIf zA)ex`H-J#Yjm3PPCu|p?XMHp-M{Cm=6NA3IY-BoGAl<Eb0N|2F>4e2v2GRGmM>Shz%&H~p^<5Qymuub0llARU{Iq*1%EoC6^|Es z6z8+SL86;wR>tUxeI2d7zK;kDL}yeKx>HhdZPR9SZQO`oSFAu&up5qA8bLIoot1Y1 zo4Mq(VX1_8HykZ|wJm(*=Ts`x&YOo?A_%RkJW#^JrB^hw_A<(4vphB}wlqdtuqVzE zO$XP!AU)EXJ6i#Ah@AJc;bAKibcA}Ni6ufK(;z%rEBhT`J~(W>2%^b((IXH8wS1A- zuq)gT9Yhe?nTyN?LDrA5S0NtEv)zW-M2>q{s9}TN$Ytm!(xQ)PjSND7jT!uz^K0I~4XHgv zZ_Jy}s4O8~;yI%LyNu_%v0zYy{cLcHNQ+UXGbRKp?X0kp=w1-f{S~~vv^HF7Q~LYk zBB8OjMUJ82P?4XXyWRj<<|e&)OT2M&T@>ySX)(cEi+u}WDjTdOy1SLgQwZiD;ky!xwreA>ig?w`?I0A2h8NhAKH((YXL00000NkvXXu0mjfs{d(= literal 0 HcmV?d00001 diff --git a/data/themes/default/mimetypes/folder-downloads.png b/data/themes/default/mimetypes/folder-downloads.png new file mode 100644 index 0000000000000000000000000000000000000000..8d4c84c046412b1e556505666382daa22edae706 GIT binary patch literal 1351 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 Av;Y7A literal 0 HcmV?d00001 diff --git a/include/resources_browser.h b/include/resources_browser.h index dbc92335c..e63109832 100644 --- a/include/resources_browser.h +++ b/include/resources_browser.h @@ -28,18 +28,43 @@ #include "side_bar_widget.h" +class QAction; +class ResourcesItem; class ResourcesTreeModel; class ResourcesTreeView; class ResourcesBrowser : public sideBarWidget { + Q_OBJECT public: + enum Actions + { + EditProperties, + LoadProject, + LoadInNewTrackSongEditor, + LoadInNewTrackBBEditor, + LoadInActiveInstrumentTrack, + DownloadIntoCollection, + UploadToWWW, + DeleteLocalResource, + ImportFile, + NumActions + } ; + ResourcesBrowser( QWidget * _parent ); virtual ~ResourcesBrowser(); +private slots: + void showContextMenu( const QPoint & _pos ); + + private: + void triggerAction( Actions _action, ResourcesItem * _item ); + + QAction * m_actions[NumActions]; + ResourcesTreeModel * m_treeModel; ResourcesTreeView * m_treeView; diff --git a/src/gui/resources_browser.cpp b/src/gui/resources_browser.cpp index 90d572f7e..db3b9f7ba 100644 --- a/src/gui/resources_browser.cpp +++ b/src/gui/resources_browser.cpp @@ -22,7 +22,9 @@ * */ +#include #include +#include #include "resources_browser.h" #include "resources_tree_model.h" @@ -32,6 +34,37 @@ #include "embed.h" +struct ActionDesc +{ + ResourcesBrowser::Actions action; + const char * pixmap; + const char * text; +} ; + +static ActionDesc resourcesBrowserActions[] = +{ + { ResourcesBrowser::EditProperties, "edit_draw", + QT_TRANSLATE_NOOP( "ResourcesBrowser", "Show/edit properties" ) }, + { ResourcesBrowser::LoadProject, "project_open", + QT_TRANSLATE_NOOP( "ResourcesBrowser", "Load project" ) }, + { ResourcesBrowser::LoadInNewTrackSongEditor, "songeditor", + QT_TRANSLATE_NOOP( "ResourcesBrowser", "Load in new track in Song Editor" ) }, + { ResourcesBrowser::LoadInNewTrackBBEditor, "bb_track", + QT_TRANSLATE_NOOP( "ResourcesBrowser", "Load in new track in B+B Editor" ) }, + { ResourcesBrowser::LoadInActiveInstrumentTrack, "instrument_track", + QT_TRANSLATE_NOOP( "ResourcesBrowser", "Load into active instrument track" ) }, + { ResourcesBrowser::DownloadIntoCollection, "mimetypes/folder-downloads", + QT_TRANSLATE_NOOP( "ResourcesBrowser", "Download into collection" ) }, + { ResourcesBrowser::UploadToWWW, "mimetypes/network-workgroup", + QT_TRANSLATE_NOOP( "ResourcesBrowser", "Upload to WWW" ) }, + { ResourcesBrowser::DeleteLocalResource, "edit-delete", + QT_TRANSLATE_NOOP( "ResourcesBrowser", "Delete resource" ) }, + { ResourcesBrowser::ImportFile, "project_import", + QT_TRANSLATE_NOOP( "ResourcesBrowser", "Import file" ) } +} ; + + + ResourcesBrowser::ResourcesBrowser( QWidget * _parent ) : sideBarWidget( tr( "Resources Browser" ), @@ -47,6 +80,12 @@ ResourcesBrowser::ResourcesBrowser( QWidget * _parent ) : QLineEdit * filterEdit = new QLineEdit ( contentParent() ); + // set up context menu handling + m_treeView->setContextMenuPolicy( Qt::CustomContextMenu ); + connect( m_treeView, + SIGNAL( customContextMenuRequested( const QPoint & ) ), + this, SLOT( showContextMenu( const QPoint & ) ) ); + // add widgets to us (we're a SideBarWidget) addContentWidget( m_treeView ); addContentWidget( filterEdit ); @@ -55,6 +94,19 @@ ResourcesBrowser::ResourcesBrowser( QWidget * _parent ) : // instantly apply filter when typing into filterEdit connect( filterEdit, SIGNAL( textChanged( const QString & ) ), m_treeView, SLOT( setFilter( const QString & ) ) ); + + // setup actions to be used in context menu + for( int i = 0;i < (int) ( sizeof( resourcesBrowserActions ) / + sizeof( ActionDesc ) ); ++i ) + { + Actions a = resourcesBrowserActions[i].action; + m_actions[a] = new QAction( + embed::getIconPixmap( + resourcesBrowserActions[i].pixmap ), + tr( resourcesBrowserActions[i].text ), + this ); + m_actions[a]->setData( i ); + } } @@ -68,5 +120,82 @@ ResourcesBrowser::~ResourcesBrowser() + +void ResourcesBrowser::showContextMenu( const QPoint & _pos ) +{ + // clicked at a valid position? + QModelIndex idx = m_treeView->indexAt( _pos ); + if( !idx.isValid() ) + { + return; + } + + // construct menu depending on selected item + QMenu m; + + ResourcesItem * item = m_treeModel->item( idx ); + switch( item->type() ) + { + case ResourcesItem::TypeSample: + case ResourcesItem::TypeSoundFont: + case ResourcesItem::TypePreset: + case ResourcesItem::TypePlugin: + m.addAction( m_actions[LoadInNewTrackSongEditor] ); + m.addAction( m_actions[LoadInNewTrackBBEditor] ); + m.addAction( m_actions[LoadInActiveInstrumentTrack] ); + break; + case ResourcesItem::TypeProject: + m.addAction( m_actions[LoadProject] ); + break; + case ResourcesItem::TypeForeignProject: + case ResourcesItem::TypeMidiFile: + m.addAction( m_actions[ImportFile] ); + break; + case ResourcesItem::TypeImage: + case ResourcesItem::TypeDirectory: + case ResourcesItem::TypeUnknown: + case ResourcesItem::NumTypes: + break; + } + + if( item->type() != ResourcesItem::TypeDirectory ) + { + m.addSeparator(); + if( item->isLocalResource() ) + { + m.addAction( m_actions[DeleteLocalResource] ); + m.addAction( m_actions[UploadToWWW] ); + } + else + { + m.addAction( m_actions[DownloadIntoCollection] ); + } + } + + m.addSeparator(); + m.addAction( m_actions[EditProperties] ); + + // show and exec menu + QAction * a = m.exec( m_treeView->mapToGlobal( _pos ) ); + if( a ) + { + // trigger action if one has been selected + triggerAction( static_cast( a->data().toInt() ), + item ); + } + +} + + + + +void ResourcesBrowser::triggerAction( Actions _action, ResourcesItem * _item ) +{ + // TODO +} + + + + #include "moc_resources_browser.cxx"