mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-16 18:19:55 +00:00
Merge remote-tracking branch 'cc9cii/mainwindow-scrollbar'
This commit is contained in:
commit
5176e3d84b
7 changed files with 213 additions and 4 deletions
|
@ -46,7 +46,7 @@ opencs_units_noqt (model/tools
|
|||
|
||||
opencs_units (view/doc
|
||||
viewmanager view operations operation subview startup filedialog newgame
|
||||
filewidget adjusterwidget loader globaldebugprofilemenu runlogsubview
|
||||
filewidget adjusterwidget loader globaldebugprofilemenu runlogsubview sizehint
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -143,6 +143,24 @@ void CSMSettings::UserSettings::buildSettingModelDefaults()
|
|||
minWidth->setDefaultValue (325);
|
||||
minWidth->setRange (50, 10000);
|
||||
minWidth->setToolTip ("Minimum width of subviews.");
|
||||
|
||||
QString defaultScroll = "Scrollbar Only";
|
||||
QStringList scrollValues = QStringList() << defaultScroll << "Grow Only" << "Grow then Scroll";
|
||||
|
||||
Setting *mainwinScroll = createSetting (Type_RadioButton, "mainwindow-scrollbar",
|
||||
"Add a horizontal scrollbar to the main view window.");
|
||||
mainwinScroll->setDefaultValue (defaultScroll);
|
||||
mainwinScroll->setDeclaredValues (scrollValues);
|
||||
mainwinScroll->setToolTip ("Scrollbar Only: Simple addition of scrollbars, the view window does not grow"
|
||||
" automatically.\n"
|
||||
"Grow Only: Original Editor behaviour. The view window grows as subviews are added. No scrollbars.\n"
|
||||
"Grow then Scroll: The view window grows. The scrollbar appears once it cannot grow any further.");
|
||||
|
||||
Setting *grow = createSetting (Type_CheckBox, "grow-limit", "Grow Limit Screen");
|
||||
grow->setDefaultValue ("false");
|
||||
grow->setToolTip ("When \"Grow then Scroll\" option is selected, the window size grows to"
|
||||
" the width of the virtual desktop. \nIf this option is selected the the window growth"
|
||||
"is limited to the current screen.");
|
||||
}
|
||||
|
||||
declareSection ("records", "Records");
|
||||
|
|
17
apps/opencs/view/doc/sizehint.cpp
Normal file
17
apps/opencs/view/doc/sizehint.cpp
Normal file
|
@ -0,0 +1,17 @@
|
|||
#include "sizehint.hpp"
|
||||
|
||||
CSVDoc::SizeHintWidget::SizeHintWidget(QWidget *parent) : QWidget(parent)
|
||||
{}
|
||||
|
||||
CSVDoc::SizeHintWidget::~SizeHintWidget()
|
||||
{}
|
||||
|
||||
QSize CSVDoc::SizeHintWidget::sizeHint() const
|
||||
{
|
||||
return mSize;
|
||||
}
|
||||
|
||||
void CSVDoc::SizeHintWidget::setSizeHint(const QSize &size)
|
||||
{
|
||||
mSize = size;
|
||||
}
|
22
apps/opencs/view/doc/sizehint.hpp
Normal file
22
apps/opencs/view/doc/sizehint.hpp
Normal file
|
@ -0,0 +1,22 @@
|
|||
#ifndef CSV_DOC_SIZEHINT_H
|
||||
#define CSV_DOC_SIZEHINT_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QSize>
|
||||
|
||||
namespace CSVDoc
|
||||
{
|
||||
class SizeHintWidget : public QWidget
|
||||
{
|
||||
QSize mSize;
|
||||
|
||||
public:
|
||||
SizeHintWidget(QWidget *parent = 0);
|
||||
~SizeHintWidget();
|
||||
|
||||
virtual QSize sizeHint() const;
|
||||
void setSizeHint(const QSize &size);
|
||||
};
|
||||
}
|
||||
|
||||
#endif // CSV_DOC_SIZEHINT_H
|
|
@ -9,6 +9,10 @@
|
|||
#include <QDockWidget>
|
||||
#include <QtGui/QApplication>
|
||||
#include <QDesktopWidget>
|
||||
#include <QScrollArea>
|
||||
#include <QHBoxLayout>
|
||||
#include <QDesktopWidget>
|
||||
#include <QScrollBar>
|
||||
|
||||
#include "../../model/doc/document.hpp"
|
||||
#include "../../model/settings/usersettings.hpp"
|
||||
|
@ -16,6 +20,7 @@
|
|||
#include "../../model/world/idtable.hpp"
|
||||
|
||||
#include "../world/subviews.hpp"
|
||||
#include "../world/tablesubview.hpp"
|
||||
|
||||
#include "../tools/subviews.hpp"
|
||||
|
||||
|
@ -334,8 +339,15 @@ void CSVDoc::View::updateTitle()
|
|||
void CSVDoc::View::updateSubViewIndicies(SubView *view)
|
||||
{
|
||||
if(view && mSubViews.contains(view))
|
||||
{
|
||||
mSubViews.removeOne(view);
|
||||
|
||||
// adjust (reduce) the scroll area (even floating), except when it is "Scrollbar Only"
|
||||
CSMSettings::UserSettings &settings = CSMSettings::UserSettings::instance();
|
||||
if(settings.settingValue ("window/mainwindow-scrollbar") == "Grow then Scroll")
|
||||
updateScrollbar();
|
||||
}
|
||||
|
||||
CSMSettings::UserSettings &userSettings = CSMSettings::UserSettings::instance();
|
||||
|
||||
bool hideTitle = userSettings.setting ("window/hide-subview", QString ("false"))=="true" &&
|
||||
|
@ -381,7 +393,7 @@ void CSVDoc::View::updateActions()
|
|||
|
||||
CSVDoc::View::View (ViewManager& viewManager, CSMDoc::Document *document, int totalViews)
|
||||
: mViewManager (viewManager), mDocument (document), mViewIndex (totalViews-1),
|
||||
mViewTotal (totalViews)
|
||||
mViewTotal (totalViews), mScroll(0), mScrollbarOnly(false)
|
||||
{
|
||||
int width = CSMSettings::UserSettings::instance().settingValue
|
||||
("window/default-width").toInt();
|
||||
|
@ -400,7 +412,18 @@ CSVDoc::View::View (ViewManager& viewManager, CSMDoc::Document *document, int to
|
|||
|
||||
mSubViewWindow.setDockOptions (QMainWindow::AllowNestedDocks);
|
||||
|
||||
CSMSettings::UserSettings &settings = CSMSettings::UserSettings::instance();
|
||||
if(settings.settingValue ("window/mainwindow-scrollbar") == "Grow Only")
|
||||
{
|
||||
setCentralWidget (&mSubViewWindow);
|
||||
}
|
||||
else
|
||||
{
|
||||
mScroll = new QScrollArea(this);
|
||||
mScroll->setWidgetResizable(true);
|
||||
mScroll->setWidget(&mSubViewWindow);
|
||||
setCentralWidget(mScroll);
|
||||
}
|
||||
|
||||
mOperations = new Operations;
|
||||
addDockWidget (Qt::BottomDockWidgetArea, mOperations);
|
||||
|
@ -527,6 +550,54 @@ void CSVDoc::View::addSubView (const CSMWorld::UniversalId& id, const std::strin
|
|||
|
||||
view->setStatusBar (mShowStatusBar->isChecked());
|
||||
|
||||
// Work out how to deal with additional subviews
|
||||
//
|
||||
// Policy for "Grow then Scroll":
|
||||
//
|
||||
// - Increase the horizontal width of the mainwindow until it becomes greater than or equal
|
||||
// to the screen (monitor) width.
|
||||
// - Move the mainwindow position sideways if necessary to fit within the screen.
|
||||
// - Any more additions increases the size of the mSubViewWindow (horizontal scrollbar
|
||||
// should become visible)
|
||||
// - Move the scroll bar to the newly added subview
|
||||
//
|
||||
CSMSettings::UserSettings &settings = CSMSettings::UserSettings::instance();
|
||||
QString mainwinScroll = settings.settingValue ("window/mainwindow-scrollbar");
|
||||
mScrollbarOnly = mainwinScroll.isEmpty() || mainwinScroll == "Scrollbar Only";
|
||||
|
||||
QDesktopWidget *dw = QApplication::desktop();
|
||||
QRect rect;
|
||||
if(settings.settingValue ("window/grow-limit") == "true")
|
||||
rect = dw->screenGeometry(this);
|
||||
else
|
||||
rect = dw->screenGeometry(dw->screen(dw->screenNumber(this)));
|
||||
|
||||
if (!mScrollbarOnly && mScroll && mSubViews.size() > 1)
|
||||
{
|
||||
int newWidth = width()+minWidth;
|
||||
int frameWidth = frameGeometry().width() - width();
|
||||
if (newWidth+frameWidth <= rect.width())
|
||||
{
|
||||
resize(newWidth, height());
|
||||
// WARNING: below code assumes that new subviews are added to the right
|
||||
if (x() > rect.width()-(newWidth+frameWidth))
|
||||
move(rect.width()-(newWidth+frameWidth), y()); // shift left to stay within the screen
|
||||
}
|
||||
else
|
||||
{
|
||||
// full width
|
||||
resize(rect.width()-frameWidth, height());
|
||||
mSubViewWindow.setMinimumWidth(mSubViewWindow.width()+minWidth);
|
||||
move(0, y());
|
||||
}
|
||||
|
||||
// Make the new subview visible, setFocus() or raise() don't seem to work
|
||||
// On Ubuntu the scrollbar does not go right to the end, even if using
|
||||
// mScroll->horizontalScrollBar()->setValue(mScroll->horizontalScrollBar()->maximum());
|
||||
if (mSubViewWindow.width() > rect.width())
|
||||
mScroll->horizontalScrollBar()->setValue(mSubViewWindow.width());
|
||||
}
|
||||
|
||||
mSubViewWindow.addDockWidget (Qt::TopDockWidgetArea, view);
|
||||
|
||||
updateSubViewIndicies();
|
||||
|
@ -774,6 +845,48 @@ void CSVDoc::View::updateUserSetting (const QString &name, const QStringList &li
|
|||
{
|
||||
subView->updateUserSetting (name, list);
|
||||
}
|
||||
|
||||
if (name=="window/mainwindow-scrollbar")
|
||||
{
|
||||
if(list.at(0) != "Grow Only")
|
||||
{
|
||||
if (mScroll)
|
||||
{
|
||||
if (list.at(0).isEmpty() || list.at(0) == "Scrollbar Only")
|
||||
{
|
||||
mScrollbarOnly = true;
|
||||
mSubViewWindow.setMinimumWidth(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!mScrollbarOnly)
|
||||
return;
|
||||
|
||||
mScrollbarOnly = false;
|
||||
updateScrollbar();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mScroll = new QScrollArea(this);
|
||||
mScroll->setWidgetResizable(true);
|
||||
mScroll->setWidget(&mSubViewWindow);
|
||||
setCentralWidget(mScroll);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mScroll)
|
||||
{
|
||||
mScroll->takeWidget();
|
||||
setCentralWidget (&mSubViewWindow);
|
||||
mScroll->deleteLater();
|
||||
mScroll = 0;
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CSVDoc::View::toggleShowStatusBar (bool show)
|
||||
|
@ -818,3 +931,26 @@ void CSVDoc::View::closeRequest (SubView *subView)
|
|||
else if (mViewManager.closeRequest (this))
|
||||
mViewManager.removeDocAndView (mDocument);
|
||||
}
|
||||
|
||||
void CSVDoc::View::updateScrollbar()
|
||||
{
|
||||
QRect rect;
|
||||
QWidget *topLevel = QApplication::topLevelAt(pos());
|
||||
if (topLevel)
|
||||
rect = topLevel->rect();
|
||||
else
|
||||
rect = this->rect();
|
||||
|
||||
int newWidth = 0;
|
||||
for (int i = 0; i < mSubViews.size(); ++i)
|
||||
{
|
||||
newWidth += mSubViews[i]->width();
|
||||
}
|
||||
|
||||
int frameWidth = frameGeometry().width() - width();
|
||||
|
||||
if ((newWidth+frameWidth) >= rect.width())
|
||||
mSubViewWindow.setMinimumWidth(newWidth);
|
||||
else
|
||||
mSubViewWindow.setMinimumWidth(0);
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
class QAction;
|
||||
class QDockWidget;
|
||||
class QScrollArea;
|
||||
|
||||
namespace CSMDoc
|
||||
{
|
||||
|
@ -47,6 +48,8 @@ namespace CSVDoc
|
|||
SubViewFactoryManager mSubViewFactory;
|
||||
QMainWindow mSubViewWindow;
|
||||
GlobalDebugProfileMenu *mGlobalDebugProfileMenu;
|
||||
QScrollArea *mScroll;
|
||||
bool mScrollbarOnly;
|
||||
|
||||
|
||||
// not implemented
|
||||
|
@ -87,6 +90,8 @@ namespace CSVDoc
|
|||
/// User preference function
|
||||
void resizeViewHeight (int height);
|
||||
|
||||
void updateScrollbar();
|
||||
|
||||
public:
|
||||
|
||||
View (ViewManager& viewManager, CSMDoc::Document *document, int totalViews);
|
||||
|
|
|
@ -3,10 +3,14 @@
|
|||
|
||||
#include <QVBoxLayout>
|
||||
#include <QEvent>
|
||||
#include <QHeaderView>
|
||||
#include <QApplication>
|
||||
#include <QDesktopWidget>
|
||||
|
||||
#include "../../model/doc/document.hpp"
|
||||
#include "../../model/world/tablemimedata.hpp"
|
||||
|
||||
#include "../doc/sizehint.hpp"
|
||||
#include "../filter/filterbox.hpp"
|
||||
#include "table.hpp"
|
||||
#include "tablebottombox.hpp"
|
||||
|
@ -30,11 +34,18 @@ CSVWorld::TableSubView::TableSubView (const CSMWorld::UniversalId& id, CSMDoc::D
|
|||
|
||||
layout->insertWidget (0, mFilterBox);
|
||||
|
||||
QWidget *widget = new QWidget;
|
||||
CSVDoc::SizeHintWidget *widget = new CSVDoc::SizeHintWidget;
|
||||
|
||||
widget->setLayout (layout);
|
||||
|
||||
setWidget (widget);
|
||||
// prefer height of the screen and full width of the table
|
||||
const QRect rect = QApplication::desktop()->screenGeometry(this);
|
||||
int frameHeight = 40; // set a reasonable default
|
||||
QWidget *topLevel = QApplication::topLevelAt(pos());
|
||||
if (topLevel)
|
||||
frameHeight = topLevel->frameGeometry().height() - topLevel->height();
|
||||
widget->setSizeHint(QSize(mTable->horizontalHeader()->length(), rect.height()-frameHeight));
|
||||
|
||||
connect (mTable, SIGNAL (editRequest (const CSMWorld::UniversalId&, const std::string&)),
|
||||
this, SLOT (editRequest (const CSMWorld::UniversalId&, const std::string&)));
|
||||
|
|
Loading…
Reference in a new issue