Improved free text macro functionality.

The macro edit  page in the settings dialog  now allows multiple items
to be selected in an extended selection.

The macro items can be rearranged  by drag and drop of single items or
whole selections.

The  delete button  and  context menu  item  will now  delete all  the
selected items.

The  free text  macro drop  down combo  boxes on  the main  screen now
automatically insert new  macros into the macros list  (at the end) if
the ENTER key is pressed while the combobox has focus.

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@4038 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Bill Somerville 2014-04-16 23:10:45 +00:00
parent ed2de0ed08
commit 2e8c4c4ec0
3 changed files with 249 additions and 175 deletions

View File

@ -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 ());
}

View File

@ -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>

View File

@ -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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If orange, click to read dial frequency&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If orange, click to read dial frequency&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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">