From 962e84ba0762ddbc344f575c71dfe80c80bd0eaf Mon Sep 17 00:00:00 2001 From: petern Date: Mon, 30 Nov 2009 23:46:37 +0000 Subject: [PATCH] Gui changes - highlight tabs on pointer motion Use inheritance for common base properties git-svn-id: file:///home/vcs/svn/jsweeper/trunk@22 6611ac79-6612-48ef-a1e9-b906f853523e --- src/colour.h | 12 +++ src/config.cpp | 2 +- src/matrix.cpp | 176 ++++++++++++++++++++++++++++++---------- src/matrix.h | 9 +- src/port.h | 29 +++---- src/portmanager.cpp | 39 +++++---- src/portmanager.h | 34 +++++++- src/preferences_gui.cpp | 32 +++----- src/rect.h | 20 +++++ 9 files changed, 249 insertions(+), 104 deletions(-) diff --git a/src/colour.h b/src/colour.h index 57dc3e5..39f9bc4 100644 --- a/src/colour.h +++ b/src/colour.h @@ -13,6 +13,18 @@ struct Colour Colour(); Colour(std::string Code); std::string ToCode() const; + + const Colour operator *(float scale) const + { + Colour res = *this; + res.r *= scale; + res.g *= scale; + res.b *= scale; + if (res.r > 1.0) res.r = 1.0; + if (res.g > 1.0) res.g = 1.0; + if (res.b > 1.0) res.b = 1.0; + return res; + } }; #endif // COLOUR_H diff --git a/src/config.cpp b/src/config.cpp index 70fb2dd..3190162 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -87,7 +87,7 @@ void Config::Write() AliasList::const_iterator it; for (it = list.begin(); it != list.end(); ++it) { const Alias &a = *it; - group->SetValue(a.match, a.replace); + group->SetValue(a.m_match, a.m_replace); } ini.SaveToDisk(m_filename); diff --git a/src/matrix.cpp b/src/matrix.cpp index a46da73..afc25cd 100644 --- a/src/matrix.cpp +++ b/src/matrix.cpp @@ -9,12 +9,13 @@ const Rect Rect::None = Rect(0, 0, -1, -1); Matrix::Matrix(PortType port_type) : - m_client_width(0), m_client_height(0), m_port_width(0), m_port_height(0), m_separation(0), m_port_type(port_type) + m_client_width(0), m_client_height(0), m_port_width(0), m_port_height(0), m_separation(0), m_x_rect(Rect::None), m_y_rect(Rect::None), m_port_type(port_type) { set_size_request(0, 0); show(); add_events(Gdk::BUTTON_PRESS_MASK); + add_events(Gdk::POINTER_MOTION_MASK | Gdk::POINTER_MOTION_HINT_MASK); } Matrix::~Matrix() @@ -109,7 +110,7 @@ void Matrix::Refresh() cr->get_text_extents(p->m_name, p->extents); int width = pg->extents.width + p->extents.width + cfg.CellPadding * (pg->extents.width > 0 ? 4 : 2); - if (p->m_flags & JackPortIsInput) { + if (p->m_is_input) { if (width > m_port_height) m_port_height = width; cols++; } else { @@ -291,22 +292,26 @@ void Matrix::Refresh() set_size_request(w, h); } -static void SetColour(Cairo::RefPtr cr, Colour &c) +static void SetColour(Cairo::RefPtr cr, Colour c) { cr->set_source_rgb(c.r, c.g, c.b); } -void Matrix::Box(Cairo::RefPtr cr, Colour &c, Rect &rect) +void Matrix::Box(Cairo::RefPtr cr, Colour &c, Rect &rect, bool highlight) { - SetColour(cr, c); + SetColour(cr, c * (highlight ? 1.5 : 1.0)); cr->rectangle(rect.left, rect.top, rect.width, rect.height); cr->fill(); - cr->set_source_rgb(0.75, 0.75, 0.75); + if (highlight) { + cr->set_source_rgb(1.0, 1.0, 1.0); + } else { + cr->set_source_rgb(0.75, 0.75, 0.75); + } cr->rectangle(rect.left, rect.top, rect.width, rect.height); cr->stroke(); - SetColour(cr, cfg.Text); + SetColour(cr, cfg.Text * (highlight ? 1.5 : 1.0)); } bool Matrix::on_expose_event(GdkEventExpose *event) @@ -351,7 +356,7 @@ bool Matrix::on_expose_event(GdkEventExpose *event) r = c->rect; if (c->m_is_input) { - Box(cr, cfg.TabClient, r); + Box(cr, cfg.TabClient, r, m_y_rect == r); cr->save(); cr->move_to(r.left + cfg.CellPadding - c->extents.y_bearing, r.top + r.height - cfg.CellPadding - c->extents.x_bearing); @@ -376,7 +381,7 @@ bool Matrix::on_expose_event(GdkEventExpose *event) r = pg->rect; if (pg->m_name != "") { - Box(cr, cfg.TabGroup, r); + Box(cr, cfg.TabGroup, r, m_y_rect == r); cr->save(); cr->move_to(r.left + cfg.CellPadding - pg->extents.y_bearing, r.top + r.height - cfg.CellPadding - pg->extents.x_bearing); @@ -405,7 +410,7 @@ bool Matrix::on_expose_event(GdkEventExpose *event) Port *p = *plit; r = p->rect; - Box(cr, p->m_is_midi ? cfg.TabPortMidi : cfg.TabPortAudio, r); + Box(cr, p->m_is_midi ? cfg.TabPortMidi : cfg.TabPortAudio, r, m_y_rect == r); cr->save(); cr->move_to(r.left + cfg.CellPadding - p->extents.y_bearing, r.top + r.height - cfg.CellPadding - p->extents.x_bearing); @@ -426,7 +431,7 @@ bool Matrix::on_expose_event(GdkEventExpose *event) } } } else { - Box(cr, cfg.TabClient, r); + Box(cr, cfg.TabClient, r, m_x_rect == r); cr->move_to(r.left + cfg.CellPadding - c->extents.x_bearing, r.top + cfg.CellPadding - c->extents.y_bearing); cr->show_text(c->m_name); @@ -448,7 +453,7 @@ bool Matrix::on_expose_event(GdkEventExpose *event) r = pg->rect; if (pg->m_name != "") { - Box(cr, cfg.TabGroup, r); + Box(cr, cfg.TabGroup, r, m_x_rect == r); cr->move_to(r.left + cfg.CellPadding - pg->extents.x_bearing, r.top + cfg.CellPadding - pg->extents.y_bearing); cr->show_text(pg->m_name); @@ -473,7 +478,7 @@ bool Matrix::on_expose_event(GdkEventExpose *event) Port *p = *plit; r = p->rect; - Box(cr, p->m_is_midi ? cfg.TabPortMidi : cfg.TabPortAudio, r); + Box(cr, p->m_is_midi ? cfg.TabPortMidi : cfg.TabPortAudio, r, m_x_rect == r); cr->move_to(r.left + cfg.CellPadding - p->extents.x_bearing, r.top + cfg.CellPadding - p->extents.y_bearing); cr->show_text(p->m_name); @@ -493,6 +498,8 @@ bool Matrix::on_expose_event(GdkEventExpose *event) } } + float radius = (float)(m_separation - cfg.CellPadding) * 0.4; + int x = m_client_width + m_port_width + cfg.CellPadding; BaseList::iterator bit1; for (bit1 = across.begin(); bit1 != across.end(); ++bit1) { @@ -506,12 +513,13 @@ bool Matrix::on_expose_event(GdkEventExpose *event) ConnectionMode cm = b1->ConnectedTo(b2); if (cm != CM_NONE) { -// if (p1->m_is_midi) { -// cr->set_source_rgb(MIDI_COLOUR); -// } else { - SetColour(cr, cfg.TabPortAudio); -// } - cr->rectangle(x + 1, y + 1, m_separation - 2, m_separation - 2); + if (b1->m_is_midi) { + SetColour(cr, cfg.TabPortMidi * 1.5); + } else { + SetColour(cr, cfg.TabPortAudio * 1.5); + } + //cr->rectangle(x + 1, y + 1, m_separation - 2, m_separation - 2); + cr->arc((float)x + m_separation * 0.5, (float)y + m_separation * 0.5, radius, 0, 2 * M_PI); cr->fill(); } @@ -520,32 +528,35 @@ bool Matrix::on_expose_event(GdkEventExpose *event) x += m_separation; } -/* - PortList::iterator plit1; - for (plit1 = pm.m_ports.begin(); plit1 != pm.m_ports.end(); ++plit1) { - Port *p1 = *plit1; - if (p1->pos == 0) continue; - PortList::iterator plit2; - for (plit2 = p1->m_connections.begin(); plit2 != p1->m_connections.end(); ++plit2) { - Port *p2 = *plit2; - if (p2->pos == 0) continue; -// cr->imove_to(p2->pos, p1->pos); -// cr->arc(p1->pos, p2->pos, (m_separation - cfg.CellPadding * 2) / 2.0, 0, 2 * M_PI); - if (p1->m_is_midi) { - cr->set_source_rgb(MIDI_COLOUR); - } else { - cr->set_source_rgb(AUDIO_COLOUR); - } - cr->rectangle(p1->pos + 1, p2->pos + 1, m_separation - 1, m_separation - 1); - cr->fill(); - } + + if (m_x_rect && m_y_rect && m_x_is_midi == m_y_is_midi) { + int x = m_client_width + m_port_width + cfg.CellPadding; + int y = m_client_height + m_port_height + cfg.CellPadding; + + float line_x = (float)m_y_rect.left + m_separation * 0.5; + float line_y = (float)m_x_rect.top + m_separation * 0.5; + + SetColour(cr, cfg.Text); + + cr->move_to(x, line_y); + cr->line_to(line_x - radius, line_y); + cr->move_to(line_x, y); + cr->line_to(line_x, line_y - radius); + cr->stroke(); + + cr->arc(line_x, line_y, radius, 0, 2 * M_PI); + cr->stroke(); } -*/ + return true; } bool Matrix::on_button_press_event(GdkEventButton *event) { + // Adjust for window borders + int x = event->x - 1; + int y = event->y - 1; + // Check expandable boxes ClientList::iterator clit; for (clit = pm.m_clients.begin(); clit != pm.m_clients.end(); ++clit) { @@ -553,7 +564,7 @@ bool Matrix::on_button_press_event(GdkEventButton *event) if (m_port_type != PT_ALL && m_port_type != (c->m_is_midi ? PT_MIDI : PT_AUDIO)) continue; - if (c->rect.Hit(event->x, event->y)) { + if (c->rect.Hit(x, y)) { c->m_expanded = !c->m_expanded; Refresh(); queue_draw(); @@ -563,7 +574,7 @@ bool Matrix::on_button_press_event(GdkEventButton *event) PortGroupList::iterator pglit; for (pglit = c->m_groups.begin(); pglit != c->m_groups.end(); ++pglit) { PortGroup *pg = *pglit; - if (pg->rect.Hit(event->x, event->y)) { + if (pg->rect.Hit(x, y)) { pg->m_expanded = !pg->m_expanded; Refresh(); queue_draw(); @@ -572,6 +583,9 @@ bool Matrix::on_button_press_event(GdkEventButton *event) } } + // Nothing selected... + if (!m_x_rect || !m_y_rect) return false; + // Check port hit PortGroup *pg1 = NULL; PortGroup *pg2 = NULL; @@ -591,8 +605,8 @@ bool Matrix::on_button_press_event(GdkEventButton *event) for (plit = pg->m_ports.begin(); plit != pg->m_ports.end(); ++plit) { Port *p = *plit; - if (p->rect.HitX(event->x)) p1 = p; - if (p->rect.HitY(event->y)) p2 = p; + if (p->rect.HitX(x)) p1 = p; + if (p->rect.HitY(y)) p2 = p; if (p1 != NULL && p2 != NULL) { pm.ToggleConnect(p1, p2); @@ -600,8 +614,8 @@ bool Matrix::on_button_press_event(GdkEventButton *event) } } - if (pg->rect.HitX(event->x)) pg1 = pg; - if (pg->rect.HitY(event->y)) pg2 = pg; + if (pg->rect.HitX(x)) pg1 = pg; + if (pg->rect.HitY(y)) pg2 = pg; if (p1 != NULL && pg2 != NULL) { pm.ToggleConnect(p1, pg2); @@ -620,3 +634,75 @@ bool Matrix::on_button_press_event(GdkEventButton *event) return false; } + +bool Matrix::on_motion_notify_event(GdkEventMotion *event) +{ + int x = event->x; + int y = event->y; + + Gdk::ModifierType state = Gdk::ModifierType(event->state); + if (event->is_hint) { + get_window()->get_pointer(x, y, state); + } + + x -= 1; + y -= 1; + + Rect x_rect = Rect::None; + Rect y_rect = Rect::None; + bool x_set = false; + bool y_set = false; + + ClientList::iterator clit; + PortGroupList::iterator pglit; + PortList::iterator plit; + + for (clit = pm.m_clients.begin(); clit != pm.m_clients.end(); ++clit) { + Client *c = *clit; + + if (m_port_type != PT_ALL && m_port_type != (c->m_is_midi ? PT_MIDI : PT_AUDIO)) continue; + + if (c->m_is_input) { + for (pglit = c->m_groups.begin(); pglit != c->m_groups.end() && !y_rect; ++pglit) { + PortGroup *pg = *pglit; + PortList::iterator plit; + for (plit = pg->m_ports.begin(); plit != pg->m_ports.end() && !y_rect; ++plit) { + Port *p = *plit; + p->rect.SetIfHitX(x, y_rect); + } + pg->rect.SetIfHitX(x, y_rect); + } + c->rect.SetIfHitX(x, y_rect); + if (y_rect && !y_set) { m_y_is_midi = c->m_is_midi; y_set = true; } + } else { + for (pglit = c->m_groups.begin(); pglit != c->m_groups.end() && !x_rect; ++pglit) { + PortGroup *pg = *pglit; + PortList::iterator plit; + for (plit = pg->m_ports.begin(); plit != pg->m_ports.end() && !x_rect; ++plit) { + Port *p = *plit; + p->rect.SetIfHitY(y, x_rect); + } + pg->rect.SetIfHitY(y, x_rect); + } + c->rect.SetIfHitY(y, x_rect); + if (x_rect && !x_set) { m_x_is_midi = c->m_is_midi; x_set = true; } + } + if (x_rect && y_rect) break; + } + + // If either box is unselected, make sure both are. + if (!x_rect || !y_rect) { + x_rect = Rect::None; + y_rect = Rect::None; + } + + // If the selection has changed, redraw matrix. + if (x_rect != m_x_rect || y_rect != m_y_rect) { + m_x_rect = x_rect; + m_y_rect = y_rect; + + queue_draw(); + } + + return true; +} diff --git a/src/matrix.h b/src/matrix.h index 875080b..dde50db 100644 --- a/src/matrix.h +++ b/src/matrix.h @@ -26,6 +26,12 @@ private: int m_width; int m_height; + Rect m_x_rect; + Rect m_y_rect; + + bool m_x_is_midi; + bool m_y_is_midi; + PortType m_port_type; BaseList across; @@ -38,9 +44,10 @@ public: void Refresh(); protected: - void Box(Cairo::RefPtr cr, Colour &c, Rect &rect); + void Box(Cairo::RefPtr cr, Colour &c, Rect &rect, bool highlight); virtual bool on_expose_event(GdkEventExpose *event); virtual bool on_button_press_event(GdkEventButton *event); + virtual bool on_motion_notify_event(GdkEventMotion *event); }; #endif // MATRIX_H diff --git a/src/port.h b/src/port.h index b94428f..a6b5e07 100644 --- a/src/port.h +++ b/src/port.h @@ -48,6 +48,12 @@ struct Base { } } + bool m_is_input; + bool m_is_midi; + Cairo::TextExtents extents; + bool m_expanded; + Rect rect; + virtual ConnectionMode ConnectedTo(Client *client) = 0; virtual ConnectionMode ConnectedTo(PortGroup *group) = 0; virtual ConnectionMode ConnectedTo(Port *port) = 0; @@ -56,13 +62,8 @@ struct Base { struct Client : Base { std::string m_name; - bool m_is_input; - bool m_is_midi; PortGroupList m_groups; PortList m_ports; - Cairo::TextExtents extents; - bool m_expanded; - Rect rect; virtual ConnectionMode ConnectedTo(Port *port); virtual ConnectionMode ConnectedTo(PortGroup *group); @@ -74,11 +75,7 @@ struct Client : Base struct PortGroup : Base { std::string m_name; - JackPortFlags m_flags; PortList m_ports; - Cairo::TextExtents extents; - bool m_expanded; - Rect rect; virtual ConnectionMode ConnectedTo(Port *port); virtual ConnectionMode ConnectedTo(PortGroup *group); @@ -89,15 +86,11 @@ struct PortGroup : Base struct Port : Base { - jack_port_t *m_port; - JackPortFlags m_flags; - std::string m_name; - bool m_is_midi; - Client *m_client; - PortGroup *m_group; - PortList m_connections; - Cairo::TextExtents extents; - Rect rect; + jack_port_t *m_port; + std::string m_name; + Client *m_client; + PortGroup *m_group; + PortList m_connections; virtual ConnectionMode ConnectedTo(Port *port); virtual ConnectionMode ConnectedTo(PortGroup *group); diff --git a/src/portmanager.cpp b/src/portmanager.cpp index 963cb5e..2e69e87 100644 --- a/src/portmanager.cpp +++ b/src/portmanager.cpp @@ -6,19 +6,30 @@ #include "portmanager.h" #include "config.h" +Alias::Alias(std::string match, std::string replace) +{ + m_match = match; + m_replace = replace; +} + bool Alias::Match(std::string name) { - pcrecpp::RE re(match); + pcrecpp::RE re(m_match); return re.FullMatch(name); } std::string Alias::Replace(std::string name) { - pcrecpp::RE re(match); - re.Replace(replace, &name); + pcrecpp::RE re(m_match); + re.Replace(m_replace, &name); return name; } +bool Connection::Match(std::string port1, std::string port2) +{ + return false; +} + void PortManager::Refresh() { // Clear all information @@ -92,14 +103,14 @@ void PortManager::Add(jack_port_t *port) Port *p = new Port(); p->m_port = port; - p->m_flags = (JackPortFlags)jack_port_flags(port); + p->m_is_input = (JackPortFlags)jack_port_flags(port) & JackPortIsInput; std::string type = jack_port_type(port); p->m_is_midi = type == JACK_DEFAULT_MIDI_TYPE; // Client client_name = jack_name.substr(0, pos1); - p->m_client = FindOrMakeClient(client_name, p->m_flags & JackPortIsInput, p->m_is_midi); + p->m_client = FindOrMakeClient(client_name, p->m_is_input, p->m_is_midi); if (pos2 != std::string::npos) { // Group @@ -110,7 +121,7 @@ void PortManager::Add(jack_port_t *port) port_name = jack_name.substr(pos1 + 1); } - p->m_group = FindOrMakeGroup(p->m_client, p->m_flags, group_name); + p->m_group = FindOrMakeGroup(p->m_client, group_name); p->m_group->m_ports.push_back(p); p->m_name = port_name; @@ -164,7 +175,7 @@ void PortManager::Connect(jack_port_t *port_a, jack_port_t *port_b) return; } - if (p1->m_flags & JackPortIsInput) { + if (p1->m_is_input) { p1->m_connections.push_back(p2); } else { p2->m_connections.push_back(p1); @@ -183,7 +194,7 @@ void PortManager::Disconnect(jack_port_t *port_a, jack_port_t *port_b) return; } - if (p1->m_flags & JackPortIsInput) { + if (p1->m_is_input) { p1->m_connections.remove(p2); } else { p2->m_connections.remove(p1); @@ -217,17 +228,18 @@ Client *PortManager::FindOrMakeClient(std::string name, bool is_input, bool is_m return c; } -PortGroup *PortManager::FindOrMakeGroup(Client *client, JackPortFlags flags, std::string name) +PortGroup *PortManager::FindOrMakeGroup(Client *client, std::string name) { PortGroupList::iterator it; for (it = client->m_groups.begin(); it != client->m_groups.end(); ++it) { PortGroup *pg = *it; - if (pg->m_flags == flags && pg->m_name == name) return pg; + if (pg->m_name == name) return pg; } PortGroup *pg = new PortGroup(); pg->m_name = name; - pg->m_flags = flags; + pg->m_is_input = client->m_is_input; + pg->m_is_midi = client->m_is_midi; pg->m_expanded = cfg.ExpandGroups; client->m_groups.push_back(pg); @@ -388,10 +400,7 @@ void PortManager::AliasClear() void PortManager::AliasAdd(std::string source, std::string target) { - Alias a; - a.match = source; - a.replace = target; - m_aliases.push_back(a); + m_aliases.push_back(Alias(source, target)); } /* diff --git a/src/portmanager.h b/src/portmanager.h index c18e504..2cb510e 100644 --- a/src/portmanager.h +++ b/src/portmanager.h @@ -7,14 +7,27 @@ struct Alias { - std::string match; - std::string replace; + std::string m_match; + std::string m_replace; + Alias(std::string match, std::string replace); bool Match(std::string name); std::string Replace(std::string name); }; +struct Connection +{ + std::string m_match1; + std::string m_match2; + int m_disconnect:1; + int m_continue:1; + int m_condition:1; + + bool Match(std::string port1, std::string port2); +}; + typedef std::vector AliasList; +typedef std::vector ConnectionList; class PortManager { @@ -34,7 +47,7 @@ public: void Rename(jack_port_t *port); Client *FindOrMakeClient(std::string name, bool is_input, bool is_midi); - PortGroup *FindOrMakeGroup(Client *client, JackPortFlags flags, std::string name); + PortGroup *FindOrMakeGroup(Client *client, std::string name); Port *FindPort(jack_port_t *port); void Sort(); @@ -43,6 +56,21 @@ public: void ToggleConnect(Port *a, PortGroup *b); void ToggleConnect(PortGroup *a, Port *b); void ToggleConnect(PortGroup *a, PortGroup *b); + void ToggleConnect(Base *a, Base *b) + { + switch (a->get_type()) { + case 1: + switch (b->get_type()) { + case 1: ToggleConnect((PortGroup *)a, (PortGroup *)b); break; + case 2: ToggleConnect((PortGroup *)a, (Port *)b); break; + } + case 2: + switch (b->get_type()) { + case 1: ToggleConnect((Port *)a, (PortGroup *)b); break; + case 2: ToggleConnect((Port *)a, (Port *)b); break; + } + } + } std::string GetAlias(std::string port_name); void AliasBay(jack_port_t *port, int num_aliases, char *aliases[2]); diff --git a/src/preferences_gui.cpp b/src/preferences_gui.cpp index 310af72..2f8ddc4 100644 --- a/src/preferences_gui.cpp +++ b/src/preferences_gui.cpp @@ -56,17 +56,7 @@ Preferences::Preferences(BaseObjectType *cobject, const Glib::RefPtrset_model(m_tree_model_aliases); - const AliasList &list = pm.AliasGetList(); - AliasList::const_iterator it; - int i = 0; - for (it = list.begin(); it != list.end(); ++it, i++) { - const Alias &a = *it; - Gtk::TreeModel::Row row = *(m_tree_model_aliases->append()); - - row[m_columns.m_row] = i; - row[m_columns.m_first] = a.match; - row[m_columns.m_second] = a.replace; - } + RefreshAliases(); treeview_aliases->append_column("Match", m_columns.m_first); treeview_aliases->append_column("Replace", m_columns.m_second); @@ -128,8 +118,8 @@ void Preferences::RefreshAliases() Gtk::TreeModel::Row row = *(m_tree_model_aliases->append()); row[m_columns.m_row] = i; - row[m_columns.m_first] = a.match; - row[m_columns.m_second] = a.replace; + row[m_columns.m_first] = a.m_match; + row[m_columns.m_second] = a.m_replace; } } @@ -202,12 +192,12 @@ void Preferences::on_button_aliases_up_click() Gtk::TreeModel::Row trow2 = m_tree_model_aliases->children()[row - 1]; trow1[m_columns.m_row] = row; - trow1[m_columns.m_first] = list[row].match; - trow1[m_columns.m_second] = list[row].replace; + trow1[m_columns.m_first] = list[row].m_match; + trow1[m_columns.m_second] = list[row].m_replace; trow2[m_columns.m_row] = row - 1; - trow2[m_columns.m_first] = list[row - 1].match; - trow2[m_columns.m_second] = list[row - 1].replace; + trow2[m_columns.m_first] = list[row - 1].m_match; + trow2[m_columns.m_second] = list[row - 1].m_replace; treeview_aliases->get_selection()->select(trow2); } @@ -228,12 +218,12 @@ void Preferences::on_button_aliases_down_click() Gtk::TreeModel::Row trow2 = m_tree_model_aliases->children()[row + 1]; trow1[m_columns.m_row] = row; - trow1[m_columns.m_first] = list[row].match; - trow1[m_columns.m_second] = list[row].replace; + trow1[m_columns.m_first] = list[row].m_match; + trow1[m_columns.m_second] = list[row].m_replace; trow2[m_columns.m_row] = row + 1; - trow2[m_columns.m_first] = list[row + 1].match; - trow2[m_columns.m_second] = list[row + 1].replace; + trow2[m_columns.m_first] = list[row + 1].m_match; + trow2[m_columns.m_second] = list[row + 1].m_replace; treeview_aliases->get_selection()->select(trow2); } diff --git a/src/rect.h b/src/rect.h index 7834a1b..26faf7a 100644 --- a/src/rect.h +++ b/src/rect.h @@ -23,6 +23,16 @@ struct Rect return !(*this == other); } + bool operator !() const + { + return *this == None; + } + + operator bool() const + { + return *this != None; + } + bool HitX(int x) const { return x >= left && x < left + width; @@ -37,6 +47,16 @@ struct Rect { return HitX(x) && HitY(y); } + + void SetIfHitX(int x, Rect &other) + { + if (!other && HitX(x)) other = *this; + } + + void SetIfHitY(int y, Rect &other) + { + if (!other && HitY(y)) other = *this; + } }; #endif // RECT_H