//----------------------------------------------------------------------------- void ctkMatrixWidgetPrivate::init() { CTK_P(ctkMatrixWidget); // Set Read-only p->setEditable(false); // Set parameters for the spinbox this->Minimum = -100; this->Maximum = 100; this->Decimals = 2; this->SingleStep = 0.01; // Hide headers p->verticalHeader()->hide(); p->horizontalHeader()->hide(); // Disable scrollBars p->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); p->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // Don't expand for no reason p->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); // Disable the frame by default p->setFrameStyle(QFrame::NoFrame); // Register custom editors QItemEditorFactory *editorFactory = new QItemEditorFactory; editorFactory->registerEditor(QVariant::Double, new QStandardItemEditorCreator<CustomDoubleSpinBox>); QStyledItemDelegate* defaultItemDelegate = qobject_cast<QStyledItemDelegate*>(p->itemDelegate()); Q_ASSERT(defaultItemDelegate); defaultItemDelegate->setItemEditorFactory(editorFactory); // Define prototype item QTableWidgetItem* _item = new QTableWidgetItem(); _item->setData(Qt::DisplayRole, QVariant(0.0)); _item->setTextAlignment(Qt::AlignCenter); // The table takes ownership of the prototype. p->setItemPrototype(_item); // Initialize p->reset(); }
SceneGraphPropertyViewImpl::SceneGraphPropertyViewImpl(SceneGraphPropertyView* self) : self(self) { tableWidget = new CustomizedTableWidget(self); tableWidget->setFrameShape(QFrame::NoFrame); tableWidget->setColumnCount(2); tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); tableWidget->setSelectionMode(QAbstractItemView::NoSelection); tableWidget->horizontalHeader()->hide(); tableWidget->horizontalHeader()->setStretchLastSection(true); tableWidget->verticalHeader()->hide(); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) tableWidget->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); #else tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); #endif QStyledItemDelegate* delegate = new CustomizedItemDelegate(tableWidget); QItemEditorFactory* factory = new QItemEditorFactory; QItemEditorCreatorBase* selectionListCreator = new QStandardItemEditorCreator<SelectionListEditor>(); factory->registerEditor(QVariant::StringList, selectionListCreator); delegate->setItemEditorFactory(factory); tableWidget->setItemDelegate(delegate); QVBoxLayout* layout = new QVBoxLayout(); layout->addWidget(tableWidget); self->setLayout(layout); self->sigActivated().connect(std::bind(&SceneGraphPropertyViewImpl::onActivated, this, true)); self->sigDeactivated().connect(std::bind(&SceneGraphPropertyViewImpl::onActivated, this ,false)); currentObject = 0; fontPointSizeDiff = 0; MappingPtr config = AppConfig::archive()->openMapping("SceneGraphPropertyView"); int storedFontPointSizeDiff; if(config->read("fontZoom", storedFontPointSizeDiff)){ zoomFontSize(storedFontPointSizeDiff); } }
/** * Construct a settings dialog. The actions in the list should have * a "defaultshortcut" property for reset to default to work. * * @param actions list of customizeable actions (for shortcut editing) * @param parent parent widget */ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent) { _ui = new Ui_SettingsDialog; _ui->setupUi(this); connect(_ui->pickFfmpeg, &QToolButton::clicked, [this]() { QString path = QFileDialog::getOpenFileName(this, tr("Set ffmepg path"), _ui->ffmpegpath->text(), #ifdef Q_OS_WIN tr("Executables (%1)").arg("*.exe") + ";;" + #endif QApplication::tr("All files (*)") ); if(!path.isEmpty()) _ui->ffmpegpath->setText(path); }); connect(_ui->pickRecordingFolder, &QToolButton::clicked, [this]() { QString path = QFileDialog::getExistingDirectory(this, tr("Recording folder"), _ui->recordingFolder->text()); if(!path.isEmpty()) _ui->recordingFolder->setText(path); }); connect(_ui->notificationVolume, &QSlider::valueChanged, [this](int val) { if(val>0) _ui->volumeLabel->setText(QString::number(val) + "%"); else _ui->volumeLabel->setText(tr("off", "notifications sounds")); }); // Get available languages _ui->languageBox->addItem(tr("Default"), QString()); _ui->languageBox->addItem(QStringLiteral("English"), QStringLiteral("en")); const QLocale localeC = QLocale::c(); QStringList locales; for(const QString &datapath : DrawpileApp::dataPaths()) { QStringList files = QDir(datapath + "/i18n").entryList(QStringList("drawpile_*.qm"), QDir::Files, QDir::Name); for(const QString &file : files) { QString localename = file.mid(9, file.length() - 3 - 9); QLocale locale(localename); if(locale != localeC && !locales.contains(localename)) { locales << localename; _ui->languageBox->addItem(locale.nativeLanguageName(), localename); } } } // Editable shortcuts _customShortcuts = new CustomShortcutModel(this); auto filteredShortcuts = new QSortFilterProxyModel(this); filteredShortcuts->setSourceModel(_customShortcuts); connect(_ui->shortcutFilter, &QLineEdit::textChanged, filteredShortcuts, &QSortFilterProxyModel::setFilterFixedString); filteredShortcuts->setFilterCaseSensitivity(Qt::CaseInsensitive); _ui->shortcuts->setModel(filteredShortcuts); _ui->shortcuts->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); _ui->shortcuts->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); // QKeySequence editor delegate QStyledItemDelegate *keyseqdel = new QStyledItemDelegate(this); QItemEditorFactory *itemeditorfactory = new QItemEditorFactory; itemeditorfactory->registerEditor(QVariant::nameToType("QKeySequence"), new KeySequenceEditFactory); keyseqdel->setItemEditorFactory(itemeditorfactory); _ui->shortcuts->setItemDelegateForColumn(1, keyseqdel); // Deselect item before saving. This causes the editor widget to close // and commit the change. connect(_ui->buttonBox, &QDialogButtonBox::accepted, [this]() { _ui->shortcuts->setCurrentIndex(QModelIndex()); }); // Known hosts list connect(_ui->knownHostList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(viewCertificate(QListWidgetItem*))); connect(_ui->knownHostList, SIGNAL(itemSelectionChanged()), this, SLOT(certificateSelectionChanged())); connect(_ui->trustKnownHosts, SIGNAL(clicked()), this, SLOT(markTrustedCertificates())); connect(_ui->removeKnownHosts, SIGNAL(clicked()), this, SLOT(removeCertificates())); connect(_ui->importTrustedButton, SIGNAL(clicked()), this, SLOT(importTrustedCertificate())); QStringList pemfilter; pemfilter << "*.pem"; QDir knownHostsDir(QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/known-hosts/"); for(const QString &filename : knownHostsDir.entryList(pemfilter, QDir::Files)) { auto *i = new QListWidgetItem(filename.left(filename.length()-4), _ui->knownHostList); i->setData(Qt::UserRole, false); i->setData(Qt::UserRole+1, knownHostsDir.absoluteFilePath(filename)); } QDir trustedHostsDir(QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/trusted-hosts/"); QIcon trustedIcon("builtin:trusted.svg"); for(const QString &filename : trustedHostsDir.entryList(pemfilter, QDir::Files)) { auto *i = new QListWidgetItem(trustedIcon, filename.left(filename.length()-4), _ui->knownHostList); i->setData(Qt::UserRole, true); i->setData(Qt::UserRole+1, trustedHostsDir.absoluteFilePath(filename)); } // Session listing server list _listservers = new sessionlisting::ListServerModel(false, this); _ui->listserverview->setModel(_listservers); _ui->listserverview->setItemDelegate(new sessionlisting::ListServerDelegate(this)); connect(_ui->addListServer, &QPushButton::clicked, this, &SettingsDialog::addListingServer); connect(_ui->removeListServer, &QPushButton::clicked, this, &SettingsDialog::removeListingServer); // Load configuration restoreSettings(); // Settings saving connect(_ui->buttonBox, SIGNAL(accepted()), this, SLOT(rememberSettings())); connect(_ui->buttonBox, SIGNAL(accepted()), this, SLOT(saveCertTrustChanges())); connect(_ui->buttonBox->button(QDialogButtonBox::Reset), SIGNAL(clicked()), this, SLOT(resetSettings())); }
//----------------------------------------------------------------------------- void ctkMatrixWidgetPrivate::init() { Q_Q(ctkMatrixWidget); this->Table->setParent(q); QHBoxLayout* layout = new QHBoxLayout(q); layout->addWidget(this->Table); layout->setContentsMargins(0,0,0,0); q->setLayout(layout); // Set parameters for the spinbox // TODO: not sure [-100. 100.] is the right default range this->Minimum = -100; this->Maximum = 100; this->Decimals = 2; this->SingleStep = 0.01; // Don't select the items this->Table->setSelectionMode(QAbstractItemView::NoSelection); // Hide headers this->Table->verticalHeader()->hide(); this->Table->horizontalHeader()->hide(); // Disable scrollBars this->Table->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); this->Table->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // Don't expand for no reason q->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); // Disable the frame by default this->Table->setFrameStyle(QFrame::NoFrame); // Register custom editors QItemEditorFactory *editorFactory = new QItemEditorFactory; editorFactory->registerEditor(QVariant::Double, new QStandardItemEditorCreator<ctkMatrixDoubleSpinBox>); QStyledItemDelegate* defaultItemDelegate = qobject_cast<QStyledItemDelegate*>(this->Table->itemDelegate()); Q_ASSERT(defaultItemDelegate); defaultItemDelegate->setItemEditorFactory(editorFactory); // Define prototype item QTableWidgetItem* _item = new QTableWidgetItem; _item->setData(Qt::DisplayRole, QVariant(0.0)); _item->setTextAlignment(Qt::AlignCenter); // The table takes ownership of the prototype. this->Table->setItemPrototype(_item); QObject::connect(this->Table, SIGNAL(cellChanged(int,int)), q, SIGNAL(matrixChanged())); /// \todo Wrap model signals to emit signals when the matrix is changed. /// Right now you can connect to the signal: /// matrixWidget->model()->dataChanged(...) // Set Read-only q->setEditable(true); // Initialize this->validateItems(); this->updateGeometries(); }