mirror of
https://github.com/opentx/opentx.git
synced 2025-07-24 16:55:20 +03:00
A new solution for avoiding to select the same channel several times in the same dialog. This time a real one, that should work regardless of how many channels are selected in a dialog, etc.
This commit is contained in:
parent
a3344f399b
commit
3d5a05538a
4 changed files with 72 additions and 53 deletions
|
@ -22,6 +22,7 @@ Channel::Channel()
|
||||||
void Channel::clear()
|
void Channel::clear()
|
||||||
{
|
{
|
||||||
page = Page_None;
|
page = Page_None;
|
||||||
|
prebooked = false;
|
||||||
input1 = NO_INPUT;
|
input1 = NO_INPUT;
|
||||||
input2 = NO_INPUT;
|
input2 = NO_INPUT;
|
||||||
weight1 = 0;
|
weight1 = 0;
|
||||||
|
|
|
@ -67,6 +67,7 @@ class Channel
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WizardPage page; // Originating dialog, only of interest for producer
|
WizardPage page; // Originating dialog, only of interest for producer
|
||||||
|
bool prebooked; // Temporary lock variable
|
||||||
Input input1;
|
Input input1;
|
||||||
Input input2;
|
Input input2;
|
||||||
int weight1;
|
int weight1;
|
||||||
|
|
|
@ -151,35 +151,11 @@ int StandardPage::getDefaultChannel(const Input input)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int StandardPage::firstNonDefaultChannel()
|
int StandardPage::nextFreeChannel(int channel)
|
||||||
{
|
{
|
||||||
for(int i=4;i<8; i++)
|
for(int i=channel;i<8; i++)
|
||||||
if (wizDlg->mix.channel[i].page == Page_None)
|
if (wizDlg->mix.channel[i].page == Page_None)
|
||||||
return i;
|
return i;
|
||||||
for(int i=0;i<4; i++)
|
|
||||||
if (wizDlg->mix.channel[i].page == Page_None)
|
|
||||||
return i;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int StandardPage::secondNonDefaultChannel()
|
|
||||||
{
|
|
||||||
bool firstFound = false;
|
|
||||||
for(int i=4;i<8; i++){
|
|
||||||
if (wizDlg->mix.channel[i].page == Page_None){
|
|
||||||
if(firstFound)
|
|
||||||
return i;
|
|
||||||
else
|
|
||||||
firstFound=true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(int i=0;i<4; i++)
|
|
||||||
if (wizDlg->mix.channel[i].page == Page_None){
|
|
||||||
if(firstFound)
|
|
||||||
return i;
|
|
||||||
else
|
|
||||||
firstFound=true;
|
|
||||||
}
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,6 +163,7 @@ void StandardPage::populateCB(QComboBox *cb, int preferred)
|
||||||
{
|
{
|
||||||
cb->clear();
|
cb->clear();
|
||||||
|
|
||||||
|
// Add all unbooked channels and select the preferred one
|
||||||
for (int i=0; i<WIZ_MAX_CHANNELS; i++) {
|
for (int i=0; i<WIZ_MAX_CHANNELS; i++) {
|
||||||
if (wizDlg->mix.channel[i].page == Page_None) {
|
if (wizDlg->mix.channel[i].page == Page_None) {
|
||||||
cb->addItem(tr("Channel %1").arg(i+1), i);
|
cb->addItem(tr("Channel %1").arg(i+1), i);
|
||||||
|
@ -195,6 +172,19 @@ void StandardPage::populateCB(QComboBox *cb, int preferred)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Avoid selecting prebooked channels
|
||||||
|
int channel = cb->itemData(cb->currentIndex()).toInt();
|
||||||
|
if(wizDlg->mix.channel[channel].prebooked){
|
||||||
|
for(int i=cb->count()-1; i>=0; i--){
|
||||||
|
if( !wizDlg->mix.channel[i].prebooked ){
|
||||||
|
cb->setCurrentIndex(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Prebook the selected channel
|
||||||
|
channel = cb->itemData(cb->currentIndex()).toInt();
|
||||||
|
wizDlg->mix.channel[channel].prebooked = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StandardPage::bookChannel(QComboBox * cb, Input input1, int weight1, Input input2, int weight2 )
|
bool StandardPage::bookChannel(QComboBox * cb, Input input1, int weight1, Input input2, int weight2 )
|
||||||
|
@ -214,7 +204,7 @@ bool StandardPage::bookChannel(QComboBox * cb, Input input1, int weight1, Input
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StandardPage::releaseChannels()
|
void StandardPage::releaseBookings()
|
||||||
{
|
{
|
||||||
for (int i=0; i<WIZ_MAX_CHANNELS; i++)
|
for (int i=0; i<WIZ_MAX_CHANNELS; i++)
|
||||||
{
|
{
|
||||||
|
@ -224,9 +214,22 @@ void StandardPage::releaseChannels()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StandardPage::releasePreBookings()
|
||||||
|
{
|
||||||
|
for (int i=0; i<WIZ_MAX_CHANNELS; i++)
|
||||||
|
{
|
||||||
|
wizDlg->mix.channel[i].prebooked = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StandardPage::initializePage()
|
||||||
|
{
|
||||||
|
releasePreBookings(); // All prebookings are void after page has initialized
|
||||||
|
}
|
||||||
|
|
||||||
void StandardPage::cleanupPage()
|
void StandardPage::cleanupPage()
|
||||||
{
|
{
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
}
|
}
|
||||||
|
|
||||||
int StandardPage::nextId() const
|
int StandardPage::nextId() const
|
||||||
|
@ -370,11 +373,12 @@ ThrottlePage::ThrottlePage(WizardDialog *dlg, QString image, QString title, QStr
|
||||||
void ThrottlePage::initializePage()
|
void ThrottlePage::initializePage()
|
||||||
{
|
{
|
||||||
populateCB(throttleCB, getDefaultChannel(THROTTLE_INPUT));
|
populateCB(throttleCB, getDefaultChannel(THROTTLE_INPUT));
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ThrottlePage::validatePage()
|
bool ThrottlePage::validatePage()
|
||||||
{
|
{
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
if (motorRB->isChecked())
|
if (motorRB->isChecked())
|
||||||
return bookChannel(throttleCB, THROTTLE_INPUT, 100);
|
return bookChannel(throttleCB, THROTTLE_INPUT, 100);
|
||||||
else
|
else
|
||||||
|
@ -408,11 +412,12 @@ AileronsPage::AileronsPage(WizardDialog *dlg, QString image, QString title, QStr
|
||||||
|
|
||||||
void AileronsPage::initializePage(){
|
void AileronsPage::initializePage(){
|
||||||
populateCB(aileron1CB, getDefaultChannel(AILERONS_INPUT));
|
populateCB(aileron1CB, getDefaultChannel(AILERONS_INPUT));
|
||||||
populateCB(aileron2CB, firstNonDefaultChannel());
|
populateCB(aileron2CB, nextFreeChannel(4));
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AileronsPage::validatePage() {
|
bool AileronsPage::validatePage() {
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
if (noAileronsRB->isChecked()) {
|
if (noAileronsRB->isChecked()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -444,12 +449,13 @@ FlapsPage::FlapsPage(WizardDialog *dlg, QString image, QString title, QString te
|
||||||
}
|
}
|
||||||
|
|
||||||
void FlapsPage::initializePage(){
|
void FlapsPage::initializePage(){
|
||||||
populateCB(flap1CB, firstNonDefaultChannel());
|
populateCB(flap1CB, nextFreeChannel(4));
|
||||||
populateCB(flap2CB, secondNonDefaultChannel());
|
populateCB(flap2CB, nextFreeChannel(4));
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FlapsPage::validatePage() {
|
bool FlapsPage::validatePage() {
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
if (noFlapsRB->isChecked()) {
|
if (noFlapsRB->isChecked()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -481,12 +487,13 @@ AirbreaksPage::AirbreaksPage(WizardDialog *dlg, QString image, QString title, QS
|
||||||
}
|
}
|
||||||
|
|
||||||
void AirbreaksPage::initializePage(){
|
void AirbreaksPage::initializePage(){
|
||||||
populateCB(airbreak1CB, firstNonDefaultChannel());
|
populateCB(airbreak1CB, nextFreeChannel(4));
|
||||||
populateCB(airbreak2CB, secondNonDefaultChannel());
|
populateCB(airbreak2CB, nextFreeChannel(4));
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AirbreaksPage::validatePage() {
|
bool AirbreaksPage::validatePage() {
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
if (noAirbreaksRB->isChecked()) {
|
if (noAirbreaksRB->isChecked()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -518,10 +525,11 @@ BankPage::BankPage(WizardDialog *dlg, QString image, QString title, QString text
|
||||||
void BankPage::initializePage(){
|
void BankPage::initializePage(){
|
||||||
populateCB(elevon1CB, getDefaultChannel(ELEVATOR_INPUT));
|
populateCB(elevon1CB, getDefaultChannel(ELEVATOR_INPUT));
|
||||||
populateCB(elevon2CB, getDefaultChannel(AILERONS_INPUT));
|
populateCB(elevon2CB, getDefaultChannel(AILERONS_INPUT));
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BankPage::validatePage() {
|
bool BankPage::validatePage() {
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
if (oneElevonChRB->isChecked()) {
|
if (oneElevonChRB->isChecked()) {
|
||||||
return (bookChannel(elevon1CB, AILERONS_INPUT, 100, ELEVATOR_INPUT, 100 ));
|
return (bookChannel(elevon1CB, AILERONS_INPUT, 100, ELEVATOR_INPUT, 100 ));
|
||||||
}
|
}
|
||||||
|
@ -546,10 +554,11 @@ RudderPage::RudderPage(WizardDialog *dlg, QString image, QString title, QString
|
||||||
|
|
||||||
void RudderPage::initializePage(){
|
void RudderPage::initializePage(){
|
||||||
populateCB(rudderCB, getDefaultChannel(RUDDER_INPUT));
|
populateCB(rudderCB, getDefaultChannel(RUDDER_INPUT));
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RudderPage::validatePage() {
|
bool RudderPage::validatePage() {
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
if (noRudderRB->isChecked())
|
if (noRudderRB->isChecked())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -572,10 +581,11 @@ VTailPage::VTailPage(WizardDialog *dlg, QString image, QString title, QString te
|
||||||
void VTailPage::initializePage(){
|
void VTailPage::initializePage(){
|
||||||
populateCB(tail1CB, getDefaultChannel(ELEVATOR_INPUT));
|
populateCB(tail1CB, getDefaultChannel(ELEVATOR_INPUT));
|
||||||
populateCB(tail2CB, getDefaultChannel(AILERONS_INPUT));
|
populateCB(tail2CB, getDefaultChannel(AILERONS_INPUT));
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VTailPage::validatePage() {
|
bool VTailPage::validatePage() {
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
return (bookChannel(tail1CB, ELEVATOR_INPUT, 100, RUDDER_INPUT, 100) &&
|
return (bookChannel(tail1CB, ELEVATOR_INPUT, 100, RUDDER_INPUT, 100) &&
|
||||||
bookChannel(tail2CB, ELEVATOR_INPUT, 100, RUDDER_INPUT, 100 ));
|
bookChannel(tail2CB, ELEVATOR_INPUT, 100, RUDDER_INPUT, 100 ));
|
||||||
}
|
}
|
||||||
|
@ -596,10 +606,11 @@ TailPage::TailPage(WizardDialog *dlg, QString image, QString title, QString text
|
||||||
void TailPage::initializePage(){
|
void TailPage::initializePage(){
|
||||||
populateCB(elevatorCB, getDefaultChannel(ELEVATOR_INPUT));
|
populateCB(elevatorCB, getDefaultChannel(ELEVATOR_INPUT));
|
||||||
populateCB(rudderCB, getDefaultChannel(RUDDER_INPUT));
|
populateCB(rudderCB, getDefaultChannel(RUDDER_INPUT));
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TailPage::validatePage() {
|
bool TailPage::validatePage() {
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
return( bookChannel(elevatorCB, ELEVATOR_INPUT, 100 ) &&
|
return( bookChannel(elevatorCB, ELEVATOR_INPUT, 100 ) &&
|
||||||
bookChannel(rudderCB, RUDDER_INPUT, 100 ));
|
bookChannel(rudderCB, RUDDER_INPUT, 100 ));
|
||||||
}
|
}
|
||||||
|
@ -616,10 +627,11 @@ SimpleTailPage::SimpleTailPage(WizardDialog *dlg, QString image, QString title,
|
||||||
|
|
||||||
void SimpleTailPage::initializePage(){
|
void SimpleTailPage::initializePage(){
|
||||||
populateCB(elevatorCB, getDefaultChannel(ELEVATOR_INPUT));
|
populateCB(elevatorCB, getDefaultChannel(ELEVATOR_INPUT));
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SimpleTailPage::validatePage() {
|
bool SimpleTailPage::validatePage() {
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
return( bookChannel(elevatorCB, ELEVATOR_INPUT, 100 ));
|
return( bookChannel(elevatorCB, ELEVATOR_INPUT, 100 ));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -640,10 +652,11 @@ CyclicPage::CyclicPage(WizardDialog *dlg, QString image, QString title, QString
|
||||||
}
|
}
|
||||||
|
|
||||||
void CyclicPage::initializePage(){
|
void CyclicPage::initializePage(){
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CyclicPage::validatePage() {
|
bool CyclicPage::validatePage() {
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -662,10 +675,11 @@ GyroPage::GyroPage(WizardDialog *dlg, QString image, QString title, QString text
|
||||||
}
|
}
|
||||||
|
|
||||||
void GyroPage::initializePage(){
|
void GyroPage::initializePage(){
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GyroPage::validatePage() {
|
bool GyroPage::validatePage() {
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -693,10 +707,11 @@ void FblPage::initializePage(){
|
||||||
populateCB(yawCB, getDefaultChannel(RUDDER_INPUT));
|
populateCB(yawCB, getDefaultChannel(RUDDER_INPUT));
|
||||||
populateCB(pitchCB, getDefaultChannel(ELEVATOR_INPUT));
|
populateCB(pitchCB, getDefaultChannel(ELEVATOR_INPUT));
|
||||||
populateCB(rollCB, getDefaultChannel(AILERONS_INPUT));
|
populateCB(rollCB, getDefaultChannel(AILERONS_INPUT));
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FblPage::validatePage() {
|
bool FblPage::validatePage() {
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
return( bookChannel(throttleCB, THROTTLE_INPUT, 100 ) &&
|
return( bookChannel(throttleCB, THROTTLE_INPUT, 100 ) &&
|
||||||
bookChannel( yawCB, RUDDER_INPUT, 100 ) &&
|
bookChannel( yawCB, RUDDER_INPUT, 100 ) &&
|
||||||
bookChannel( pitchCB, ELEVATOR_INPUT, 100 ) &&
|
bookChannel( pitchCB, ELEVATOR_INPUT, 100 ) &&
|
||||||
|
@ -727,10 +742,11 @@ void HeliPage::initializePage(){
|
||||||
populateCB(yawCB, getDefaultChannel(RUDDER_INPUT));
|
populateCB(yawCB, getDefaultChannel(RUDDER_INPUT));
|
||||||
populateCB(pitchCB, getDefaultChannel(ELEVATOR_INPUT));
|
populateCB(pitchCB, getDefaultChannel(ELEVATOR_INPUT));
|
||||||
populateCB(rollCB, getDefaultChannel(AILERONS_INPUT));
|
populateCB(rollCB, getDefaultChannel(AILERONS_INPUT));
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HeliPage::validatePage() {
|
bool HeliPage::validatePage() {
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
return( bookChannel(throttleCB, THROTTLE_INPUT, 100 ) &&
|
return( bookChannel(throttleCB, THROTTLE_INPUT, 100 ) &&
|
||||||
bookChannel( yawCB, RUDDER_INPUT, 100 ) &&
|
bookChannel( yawCB, RUDDER_INPUT, 100 ) &&
|
||||||
bookChannel( pitchCB, ELEVATOR_INPUT, 100 ) &&
|
bookChannel( pitchCB, ELEVATOR_INPUT, 100 ) &&
|
||||||
|
@ -761,10 +777,11 @@ void MultirotorPage::initializePage(){
|
||||||
populateCB(yawCB, getDefaultChannel(RUDDER_INPUT));
|
populateCB(yawCB, getDefaultChannel(RUDDER_INPUT));
|
||||||
populateCB(pitchCB, getDefaultChannel(ELEVATOR_INPUT));
|
populateCB(pitchCB, getDefaultChannel(ELEVATOR_INPUT));
|
||||||
populateCB(rollCB, getDefaultChannel(AILERONS_INPUT));
|
populateCB(rollCB, getDefaultChannel(AILERONS_INPUT));
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MultirotorPage::validatePage() {
|
bool MultirotorPage::validatePage() {
|
||||||
releaseChannels();
|
releaseBookings();
|
||||||
return( bookChannel(throttleCB, THROTTLE_INPUT, 100 ) &&
|
return( bookChannel(throttleCB, THROTTLE_INPUT, 100 ) &&
|
||||||
bookChannel(yawCB, RUDDER_INPUT, 100 ) &&
|
bookChannel(yawCB, RUDDER_INPUT, 100 ) &&
|
||||||
bookChannel(pitchCB, ELEVATOR_INPUT, 100 ) &&
|
bookChannel(pitchCB, ELEVATOR_INPUT, 100 ) &&
|
||||||
|
@ -786,6 +803,7 @@ ConclusionPage::ConclusionPage(WizardDialog *dlg, QString image, QString title,
|
||||||
void ConclusionPage::initializePage(){
|
void ConclusionPage::initializePage(){
|
||||||
WizardPrinter p(&wizDlg->mix);
|
WizardPrinter p(&wizDlg->mix);
|
||||||
textLabel->setText(p.print());
|
textLabel->setText(p.print());
|
||||||
|
StandardPage::initializePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ConclusionPage::validatePage() {
|
bool ConclusionPage::validatePage() {
|
||||||
|
|
|
@ -46,14 +46,13 @@ class StandardPage: public QWizardPage
|
||||||
StandardPage(WizardPage curPage, WizardDialog *dlg, QString image, QString title, QString text, int nextPage=-1);
|
StandardPage(WizardPage curPage, WizardDialog *dlg, QString image, QString title, QString text, int nextPage=-1);
|
||||||
WizardDialog *wizDlg;
|
WizardDialog *wizDlg;
|
||||||
|
|
||||||
// TODO public for these 3 ones?
|
protected:
|
||||||
void releaseChannels();
|
void releaseBookings();
|
||||||
|
void releasePreBookings();
|
||||||
|
void initializePage();
|
||||||
void cleanupPage();
|
void cleanupPage();
|
||||||
|
|
||||||
protected:
|
|
||||||
int getDefaultChannel(const Input input);
|
int getDefaultChannel(const Input input);
|
||||||
int firstNonDefaultChannel();
|
int nextFreeChannel(int channel = 0);
|
||||||
int secondNonDefaultChannel();
|
|
||||||
void populateCB(QComboBox * cb, int preferred=-1);
|
void populateCB(QComboBox * cb, int preferred=-1);
|
||||||
bool bookChannel(QComboBox * cb, Input input1, int weight1, Input input2=NO_INPUT, int weight2=0);
|
bool bookChannel(QComboBox * cb, Input input1, int weight1, Input input2=NO_INPUT, int weight2=0);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue