From 8c37b557d6f865b4320f7b1168030e7d54adacd0 Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Tue, 30 Aug 2011 16:25:38 +0000 Subject: added "arrange windows in rows" and "in columns" functions --- muse2/muse/app.cpp | 94 +++++++++++++++++++++++++++++++++++++++ muse2/muse/app.h | 5 +++ muse2/muse/midiedit/scoreedit.cpp | 12 +---- 3 files changed, 100 insertions(+), 11 deletions(-) diff --git a/muse2/muse/app.cpp b/muse2/muse/app.cpp index cece85ed..91dbaed8 100644 --- a/muse2/muse/app.cpp +++ b/muse2/muse/app.cpp @@ -542,6 +542,8 @@ MusE::MusE(int argc, char** argv) : QMainWindow() //-------- Windows Actions windowsCascadeAction = new QAction(tr("Cascade"), this); windowsTileAction = new QAction(tr("Tile"), this); + windowsRowsAction = new QAction(tr("In rows"), this); + windowsColumnsAction = new QAction(tr("In columns"), this); //-------- Settings Actions @@ -841,6 +843,8 @@ MusE::MusE(int argc, char** argv) : QMainWindow() menuWindows->addAction(windowsCascadeAction); menuWindows->addAction(windowsTileAction); + menuWindows->addAction(windowsRowsAction); + menuWindows->addAction(windowsColumnsAction); //------------------------------------------------------------- // popup Settings @@ -896,6 +900,8 @@ MusE::MusE(int argc, char** argv) : QMainWindow() mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setCentralWidget(mdiArea); connect(windowsTileAction, SIGNAL(activated()), mdiArea, SLOT(tileSubWindows())); + connect(windowsRowsAction, SIGNAL(activated()), this, SLOT(arrangeSubWindowsRows())); + connect(windowsColumnsAction, SIGNAL(activated()), this, SLOT(arrangeSubWindowsColumns())); connect(windowsCascadeAction, SIGNAL(activated()), mdiArea, SLOT(cascadeSubWindows())); @@ -3202,6 +3208,8 @@ void MusE::updateWindowMenu() menuWindows->addAction(windowsCascadeAction); menuWindows->addAction(windowsTileAction); + menuWindows->addAction(windowsRowsAction); + menuWindows->addAction(windowsColumnsAction); sep=false; for (iToplevel it=toplevels.begin(); it!=toplevels.end(); it++) @@ -3237,6 +3245,8 @@ void MusE::updateWindowMenu() windowsCascadeAction->setEnabled(there_are_subwins); windowsTileAction->setEnabled(there_are_subwins); + windowsRowsAction->setEnabled(there_are_subwins); + windowsColumnsAction->setEnabled(there_are_subwins); } void MusE::bringToFront(QWidget* widget) @@ -3261,3 +3271,87 @@ void MusE::setFullscreen(bool val) else showNormal(); } + + + +list get_all_visible_subwins(QMdiArea* mdiarea) +{ + QList wins = mdiarea->subWindowList(); + list result; + + for (QList::iterator it=wins.begin(); it!=wins.end(); it++) + if ((*it)->isVisible() && ((*it)->isMinimized()==false)) + result.push_back(*it); + + return result; +} + +void MusE::arrangeSubWindowsColumns() +{ + list wins=get_all_visible_subwins(mdiArea); + int n=wins.size(); + + if (n==0) + return; + else if (n==1) + (*wins.begin())->showMaximized(); + else + { + int width = mdiArea->width(); + int height = mdiArea->height(); + int x_add = (*wins.begin())->frameGeometry().width() - (*wins.begin())->geometry().width(); + int y_add = (*wins.begin())->frameGeometry().height() - (*wins.begin())->geometry().height(); + int width_per_win = width/n; + + if (x_add >= width_per_win) + { + printf("ERROR: tried to arrange subwins in columns, but there's too few space.\n"); + return; + } + + int i=0; + for (list::iterator it=wins.begin(); it!=wins.end(); it++, i++) + { + int left = (float) width*i/n; + int right = (float) width*(i+1.0)/n; + + (*it)->move(left,0); + (*it)->resize(right-left-x_add, height-y_add); + } + } +} + +void MusE::arrangeSubWindowsRows() +{ + list wins=get_all_visible_subwins(mdiArea); + int n=wins.size(); + + if (n==0) + return; + else if (n==1) + (*wins.begin())->showMaximized(); + else + { + int width = mdiArea->width(); + int height = mdiArea->height(); + int x_add = (*wins.begin())->frameGeometry().width() - (*wins.begin())->geometry().width(); + int y_add = (*wins.begin())->frameGeometry().height() - (*wins.begin())->geometry().height(); + int height_per_win = height/n; + + if (y_add >= height_per_win) + { + printf("ERROR: tried to arrange subwins in rows, but there's too few space.\n"); + return; + } + + int i=0; + for (list::iterator it=wins.begin(); it!=wins.end(); it++, i++) + { + int top = (float) height*i/n; + int bottom = (float) height*(i+1.0)/n; + + (*it)->move(0,top); + (*it)->resize(width-x_add, bottom-top-y_add); + } + } +} diff --git a/muse2/muse/app.h b/muse2/muse/app.h index 8ff0f72c..83fb70ae 100644 --- a/muse2/muse/app.h +++ b/muse2/muse/app.h @@ -132,6 +132,8 @@ class MusE : public QMainWindow // Window Menu Actions QAction* windowsCascadeAction; QAction* windowsTileAction; + QAction* windowsRowsAction; + QAction* windowsColumnsAction; // Settings Menu Actions QAction *settingsGlobalAction, *settingsShortcutsAction, *settingsMetronomeAction, *settingsMidiSyncAction; @@ -296,6 +298,9 @@ class MusE : public QMainWindow void bringToFront(QWidget* win); void setFullscreen(bool); + + void arrangeSubWindowsRows(); + void arrangeSubWindowsColumns(); public slots: bool saveAs(); diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp index bf52f94b..eee92a9b 100644 --- a/muse2/muse/midiedit/scoreedit.cpp +++ b/muse2/muse/midiedit/scoreedit.cpp @@ -4450,21 +4450,11 @@ void staff_t::update_part_indices() * * CURRENT TODO * M o remove that ugly "bool initalizing" stuff. it's probably unneeded (watch out for the FINDMICH message) - * m o shortcuts, especially for fullscreen + * M o shortcuts for "pencil" in score editor etc. * o mirror most menus to an additional right-click context menu to avoid the long mouse pointer * journey to the menu bar. try to find a way which does not involve duplicate code! * o implement borland-style maximize: free windows do not cover the main menu, even when maximized * - * o window menu -> "arrange" -> "all in rows" / "all in columns" - * o add everything of the function-menus of the midieditors to - * the arranger; except "move notes": call it "move parts" and - * actually move parts not notes - * how it works: - * there will be extra dialogs for the arranger - * when such a dialog has been executed, the "selected" option - * only controls the set, but not the "selected" option - * which is given to the actual function call. the range option - * is kept. * o replace "insert empty measure" by a "global insert"-like operation * o replace "insert" and "paste" by a paste-dialog ("move other notes" or "overwrite notes" or "mix with notes") * skip dialog when there is nothing to erase, move or merge with (i.e., at the end of the song) -- cgit v1.2.3