diff --git a/Configuration.cpp b/Configuration.cpp index 83531fdd6..76be13ffe 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -148,6 +148,23 @@ private: QLineEdit description_; }; +class RearrangableMacrosModel + : public QStringListModel +{ +public: + Qt::ItemFlags flags (QModelIndex const& index) const override + { + auto flags = QStringListModel::flags (index); + if (index.isValid ()) + { + // disallow drop onto existing items + flags &= ~Qt::ItemIsDropEnabled; + } + return flags; + } +}; + + // Fields that are transceiver related. // // These are aggregated in a structure to enable a non-equivalence to @@ -268,6 +285,7 @@ private: Q_SLOT void on_add_macro_line_edit_editingFinished (); Q_SLOT void delete_macro (); + void delete_selected_macros (QModelIndexList); Q_SLOT void on_save_path_select_push_button_clicked (bool); @@ -318,7 +336,7 @@ private: float jt9w_max_dt_; QStringListModel macros_; - QStringListModel next_macros_; + RearrangableMacrosModel next_macros_; QAction * macro_delete_action_; Bands bands_; @@ -1222,6 +1240,9 @@ bool Configuration::impl::validate () int Configuration::impl::exec () { + // macros can be modified in the main window + next_macros_.setStringList (macros_.stringList ()); + ptt_state_ = false; have_rig_ = rig_active_; // record that we started with a rig open @@ -1596,17 +1617,44 @@ void Configuration::impl::on_add_macro_line_edit_editingFinished () void Configuration::impl::on_delete_macro_push_button_clicked (bool /* checked */) { - auto index = ui_->macros_list_view->selectionModel ()->currentIndex (); - if (index.isValid ()) + auto selection_model = ui_->macros_list_view->selectionModel (); + if (selection_model->hasSelection ()) { - next_macros_.removeRow (index.row ()); + // delete all selected items + delete_selected_macros (selection_model->selectedRows ()); } } void Configuration::impl::delete_macro () { - auto index = ui_->macros_list_view->currentIndex (); - if (index.isValid ()) + auto selection_model = ui_->macros_list_view->selectionModel (); + if (!selection_model->hasSelection ()) + { + // delete item under cursor if any + auto index = selection_model->currentIndex (); + if (index.isValid ()) + { + next_macros_.removeRow (index.row ()); + } + } + else + { + // delete the whole selection + delete_selected_macros (selection_model->selectedRows ()); + } +} + +void Configuration::impl::delete_selected_macros (QModelIndexList selected_rows) +{ + // sort in reverse row order so that we can delete without changing + // indices underneath us + qSort (selected_rows.begin (), selected_rows.end (), [] (QModelIndex const& lhs, QModelIndex const& rhs) + { + return rhs.row () < lhs.row (); // reverse row ordering + }); + + // now delete them + Q_FOREACH (auto index, selected_rows) { next_macros_.removeRow (index.row ()); } diff --git a/Configuration.ui b/Configuration.ui index 5c3883a13..6b315acf1 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>508</width> - <height>471</height> + <width>586</width> + <height>550</height> </rect> </property> <property name="windowTitle"> @@ -1390,6 +1390,11 @@ both here.</string> <property name="contextMenuPolicy"> <enum>Qt::ActionsContextMenu</enum> </property> + <property name="toolTip"> + <string>Drag and drop items to rearrange order +Right click for item specific actions +Click, SHIFT+Click and, CRTL+Click to select items</string> + </property> <property name="styleSheet"> <string notr="true">QListView { show-decoration-selected: 1; /* make the selection span the entire width of the view */ @@ -1418,8 +1423,17 @@ QListView::item:hover { stop: 0 #FAFBFE, stop: 1 #DCDEF1); }</string> </property> + <property name="dragDropMode"> + <enum>QAbstractItemView::InternalMove</enum> + </property> + <property name="defaultDropAction"> + <enum>Qt::MoveAction</enum> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> <property name="selectionMode"> - <enum>QAbstractItemView::SingleSelection</enum> + <enum>QAbstractItemView::ExtendedSelection</enum> </property> <property name="uniformItemSizes"> <bool>true</bool> @@ -1801,12 +1815,12 @@ soundcard changes</string> </connection> </connections> <buttongroups> + <buttongroup name="TX_audio_source_button_group"/> <buttongroup name="TX_mode_button_group"/> + <buttongroup name="split_mode_button_group"/> <buttongroup name="CAT_stop_bits_button_group"/> + <buttongroup name="PTT_method_button_group"/> <buttongroup name="CAT_data_bits_button_group"/> <buttongroup name="CAT_handshake_button_group"/> - <buttongroup name="TX_audio_source_button_group"/> - <buttongroup name="split_mode_button_group"/> - <buttongroup name="PTT_method_button_group"/> </buttongroups> </ui> diff --git a/mainwindow.ui b/mainwindow.ui index 87cc35fe0..9a216ad6d 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -591,6 +591,46 @@ p, li { white-space: pre-wrap; } </item> <item> <layout class="QGridLayout" name="gridLayout_3"> + <item row="2" column="6"> + <widget class="QSpinBox" name="TxFreqSpinBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>113</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>105</width> + <height>16777215</height> + </size> + </property> + <property name="toolTip"> + <string>Audio Tx frequency</string> + </property> + <property name="suffix"> + <string> Hz</string> + </property> + <property name="prefix"> + <string>Tx </string> + </property> + <property name="minimum"> + <number>200</number> + </property> + <property name="maximum"> + <number>5000</number> + </property> + <property name="value"> + <number>1500</number> + </property> + </widget> + </item> <item row="3" column="3"> <widget class="QLabel" name="labAz"> <property name="sizePolicy"> @@ -876,46 +916,6 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="2" column="6"> - <widget class="QSpinBox" name="TxFreqSpinBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>113</width> - <height>0</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>105</width> - <height>16777215</height> - </size> - </property> - <property name="toolTip"> - <string>Audio Tx frequency</string> - </property> - <property name="suffix"> - <string> Hz</string> - </property> - <property name="prefix"> - <string>Tx </string> - </property> - <property name="minimum"> - <number>200</number> - </property> - <property name="maximum"> - <number>5000</number> - </property> - <property name="value"> - <number>1500</number> - </property> - </widget> - </item> <item row="0" column="3" colspan="2"> <widget class="QLabel" name="labDialFreq"> <property name="sizePolicy"> @@ -985,6 +985,28 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> + <item row="0" column="6"> + <widget class="QCheckBox" name="txFirstCheckBox"> + <property name="minimumSize"> + <size> + <width>105</width> + <height>23</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>105</width> + <height>16777215</height> + </size> + </property> + <property name="toolTip"> + <string>Check to Tx in even minutes, uncheck for odd minutes</string> + </property> + <property name="text"> + <string>Tx even</string> + </property> + </widget> + </item> <item row="1" column="3"> <widget class="QLabel" name="label_3"> <property name="sizePolicy"> @@ -1077,74 +1099,6 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="2" column="1" rowspan="5"> - <widget class="QSlider" name="inGain"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>160</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>20</width> - <height>160</height> - </size> - </property> - <property name="toolTip"> - <string>Digital gain for audio input</string> - </property> - <property name="minimum"> - <number>-50</number> - </property> - <property name="maximum"> - <number>50</number> - </property> - <property name="value"> - <number>20</number> - </property> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="invertedAppearance"> - <bool>false</bool> - </property> - <property name="invertedControls"> - <bool>false</bool> - </property> - <property name="tickPosition"> - <enum>QSlider::TicksBelow</enum> - </property> - </widget> - </item> - <item row="0" column="6"> - <widget class="QCheckBox" name="txFirstCheckBox"> - <property name="minimumSize"> - <size> - <width>105</width> - <height>23</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>105</width> - <height>16777215</height> - </size> - </property> - <property name="toolTip"> - <string>Check to Tx in even minutes, uncheck for odd minutes</string> - </property> - <property name="text"> - <string>Tx even</string> - </property> - </widget> - </item> <item row="1" column="6"> <widget class="QPushButton" name="pbTxMode"> <property name="enabled"> @@ -1158,6 +1112,16 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> + <item row="1" column="0" colspan="2"> + <widget class="QCheckBox" name="cbPlus2kHz"> + <property name="toolTip"> + <string>Add 2 kHz to requested dial frequency</string> + </property> + <property name="text"> + <string>+2 kHz</string> + </property> + </widget> + </item> <item row="5" column="3" rowspan="2" colspan="2"> <widget class="QLabel" name="labUTC"> <property name="sizePolicy"> @@ -1203,13 +1167,19 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="1" column="0" colspan="2"> - <widget class="QCheckBox" name="cbPlus2kHz"> + <item row="1" column="2"> + <widget class="QPushButton" name="readFreq"> + <property name="maximumSize"> + <size> + <width>15</width> + <height>15</height> + </size> + </property> <property name="toolTip"> - <string>Add 2 kHz to requested dial frequency</string> + <string><html><head/><body><p>If orange, click to read dial frequency</p></body></html></string> </property> <property name="text"> - <string>+2 kHz</string> + <string/> </property> </widget> </item> @@ -1273,7 +1243,7 @@ p, li { white-space: pre-wrap; } <enum>QTabWidget::Triangular</enum> </property> <property name="currentIndex"> - <number>0</number> + <number>1</number> </property> <widget class="QWidget" name="tab"> <attribute name="title"> @@ -1778,11 +1748,17 @@ p, li { white-space: pre-wrap; } <height>16777215</height> </size> </property> + <property name="toolTip"> + <string>Enter a free text message (maximum 13 characters) +or select a predefined macro from the dropdown list. +Press ENTER to add the current text to the predefined +list. The list can be maintained in Settings (F2).</string> + </property> <property name="editable"> <bool>true</bool> </property> <property name="insertPolicy"> - <enum>QComboBox::NoInsert</enum> + <enum>QComboBox::InsertAtBottom</enum> </property> </widget> </item> @@ -1990,11 +1966,17 @@ p, li { white-space: pre-wrap; } <height>0</height> </size> </property> + <property name="toolTip"> + <string>Enter a free text message (maximum 13 characters) +or select a predefined macro from the dropdown list. +Press ENTER to add the current text to the predefined +list. The list can be maintained in Settings (F2).</string> + </property> <property name="editable"> <bool>true</bool> </property> <property name="insertPolicy"> - <enum>QComboBox::NoInsert</enum> + <enum>QComboBox::InsertAtBottom</enum> </property> </widget> </item> @@ -2031,19 +2013,10 @@ p, li { white-space: pre-wrap; } </layout> </widget> </item> - <item row="1" column="2"> - <widget class="QPushButton" name="readFreq"> - <property name="maximumSize"> - <size> - <width>15</width> - <height>15</height> - </size> - </property> - <property name="toolTip"> - <string><html><head/><body><p>If orange, click to read dial frequency</p></body></html></string> - </property> + <item row="0" column="9"> + <widget class="QLabel" name="label"> <property name="text"> - <string/> + <string>Pwr</string> </property> </widget> </item> @@ -2063,6 +2036,34 @@ p, li { white-space: pre-wrap; } </property> </spacer> </item> + <item row="1" column="9" rowspan="6"> + <widget class="QSlider" name="outAttenuation"> + <property name="toolTip"> + <string>Adjust Tx audio level</string> + </property> + <property name="maximum"> + <number>300</number> + </property> + <property name="value"> + <number>0</number> + </property> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="invertedAppearance"> + <bool>true</bool> + </property> + <property name="invertedControls"> + <bool>true</bool> + </property> + <property name="tickPosition"> + <enum>QSlider::TicksBelow</enum> + </property> + <property name="tickInterval"> + <number>10</number> + </property> + </widget> + </item> <item row="0" column="0" colspan="3"> <widget class="QComboBox" name="bandComboBox"> <property name="sizePolicy"> @@ -2094,41 +2095,6 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="0" column="9"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Pwr</string> - </property> - </widget> - </item> - <item row="1" column="9" rowspan="6"> - <widget class="QSlider" name="outAttenuation"> - <property name="toolTip"> - <string>Adjust Tx audio level</string> - </property> - <property name="maximum"> - <number>300</number> - </property> - <property name="value"> - <number>0</number> - </property> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="invertedAppearance"> - <bool>true</bool> - </property> - <property name="invertedControls"> - <bool>true</bool> - </property> - <property name="tickPosition"> - <enum>QSlider::TicksBelow</enum> - </property> - <property name="tickInterval"> - <number>10</number> - </property> - </widget> - </item> <item row="3" column="7"> <widget class="QPushButton" name="pbT2R"> <property name="sizePolicy"> @@ -2237,6 +2203,52 @@ p, li { white-space: pre-wrap; } </item> </layout> </item> + <item row="2" column="1" rowspan="5"> + <widget class="QSlider" name="inGain"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>160</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>20</width> + <height>160</height> + </size> + </property> + <property name="toolTip"> + <string>Digital gain for audio input</string> + </property> + <property name="minimum"> + <number>-50</number> + </property> + <property name="maximum"> + <number>50</number> + </property> + <property name="value"> + <number>20</number> + </property> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="invertedAppearance"> + <bool>false</bool> + </property> + <property name="invertedControls"> + <bool>false</bool> + </property> + <property name="tickPosition"> + <enum>QSlider::TicksBelow</enum> + </property> + </widget> + </item> </layout> </item> </layout> @@ -2247,7 +2259,7 @@ p, li { white-space: pre-wrap; } <x>0</x> <y>0</y> <width>780</width> - <height>21</height> + <height>20</height> </rect> </property> <widget class="QMenu" name="menuFile">