Skip to content

Commit

Permalink
Support case sensitivity in author filter in commit log
Browse files Browse the repository at this point in the history
  • Loading branch information
ArekPiekarz committed Jul 12, 2022
1 parent 18773f0 commit 043b3f8
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 6 deletions.
8 changes: 8 additions & 0 deletions src/commit_log_author_filter_entry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ impl CommitLogAuthorFilterEntry
let widget = guiElementProvider.get::<gtk::Entry>("Commit log author filter entry");
let cssProvider = setupCss(&widget);
connectWidget(&widget, sender.clone());
setupCaseSensitivityButton(guiElementProvider, sender.clone());
setupRegexButton(guiElementProvider, sender);
Self{widget, cssProvider}
}
Expand Down Expand Up @@ -72,6 +73,13 @@ fn connectWidget(widget: &gtk::Entry, sender: Sender)

}

fn setupCaseSensitivityButton(guiElementProvider: &GuiElementProvider, sender: Sender)
{
let button = guiElementProvider.get::<gtk::ToggleButton>("Commit log author filter case button");
button.connect_toggled(move |button|
sender.send((Source::CommitLogAuthorFilterCaseButton, Event::Toggled(button.is_active()))).unwrap());
}

fn setupRegexButton(guiElementProvider: &GuiElementProvider, sender: Sender)
{
let button = guiElementProvider.get::<gtk::ToggleButton>("Commit log author filter regex button");
Expand Down
7 changes: 7 additions & 0 deletions src/commit_log_model_filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ impl IEventHandler for CommitLogModelFilter
match (source, event) {
(_, Event::RefilterRequested) => self.onRefilterRequested(),
(_, Event::TextEntered(filter)) => self.onCommitAuthorFilterChanged(filter),
(Source::CommitLogAuthorFilterCaseButton, Event::Toggled(shouldEnable)) => self.onCaseSensitivityToggled(*shouldEnable),
(Source::CommitLogAuthorFilterRegexButton, Event::Toggled(shouldEnable)) => self.onRegexToggled(*shouldEnable),
_ => handleUnknown(source, event)
}
Expand All @@ -51,6 +52,12 @@ impl CommitLogModelFilter
self.handleChangeResult(result);
}

fn onCaseSensitivityToggled(&mut self, shouldEnable: bool)
{
let result = self.authorFilter.borrow_mut().setCaseSensitivityEnabled(shouldEnable);
self.handleChangeResult(result);
}

fn onRegexToggled(&mut self, shouldEnable: bool)
{
let result = self.authorFilter.borrow_mut().setRegexEnabled(shouldEnable);
Expand Down
1 change: 1 addition & 0 deletions src/event.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ pub enum Source
CommitButton,
CommitDiffViewWidget,
CommitLogAuthorFilterEntry,
CommitLogAuthorFilterCaseButton,
CommitLogAuthorFilterRegexButton,
CommitLogModelFilter,
CommitLogView,
Expand Down
1 change: 1 addition & 0 deletions src/gui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ fn setupDispatching(gui: GuiObjects, mut repository: Rc<RefCell<Repository>>, re
(S::CommitButton, E::CommitRequested(_)) => repository.handle(source, &event),
(S::CommitDiffViewWidget, E::ZoomRequested(_)) => commitDiffView.handle(source, &event),
(S::CommitLogAuthorFilterEntry, E::TextEntered(_)) => commitLogModelFilter.handle(source, &event),
(S::CommitLogAuthorFilterCaseButton, E::Toggled(_)) => commitLogModelFilter.handle(source, &event),
(S::CommitLogAuthorFilterRegexButton, E::Toggled(_)) => commitLogModelFilter.handle(source, &event),
(S::CommitLogModelFilter, E::RefilterRequested) => (&mut commitLogView, &mut commitLogModelFilter).handle(source, &event),
(S::CommitLogModelFilter, E::RefilterEnded) => commitLogView.handle(source, &event),
Expand Down
16 changes: 15 additions & 1 deletion src/main_window.glade
Original file line number Diff line number Diff line change
Expand Up @@ -455,7 +455,7 @@
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<!-- n-columns=3 n-rows=1 -->
<!-- n-columns=4 n-rows=1 -->
<object class="GtkGrid" id="Commit log filters grid">
<property name="name">Commit log filters grid</property>
<property name="can-focus">False</property>
Expand Down Expand Up @@ -494,6 +494,20 @@
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Regular expressions</property>
</object>
<packing>
<property name="left-attach">3</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkToggleButton" id="Commit log author filter case button">
<property name="label" translatable="yes">Aa</property>
<property name="name">Commit log author filter case button</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Case sensitivity</property>
</object>
<packing>
<property name="left-attach">2</property>
<property name="top-attach">0</property>
Expand Down
36 changes: 31 additions & 5 deletions src/text_filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use regex::{Regex, RegexBuilder};

pub(crate) struct TextFilter
{
caseSensitive: bool,
regexState: RegexState
}

Expand All @@ -18,15 +19,15 @@ impl TextFilter
{
pub(crate) fn new() -> Self
{
Self{regexState: RegexState::Disabled{text: String::new()}}
Self{caseSensitive: false, regexState: RegexState::Disabled{text: String::new()}}
}

pub(crate) fn setText(&mut self, newText: &str) -> Result<()>
{
match &mut self.regexState {
RegexState::Disabled{text} => *text = newText.into(),
RegexState::Invalid{text} => {
match RegexBuilder::new(newText).case_insensitive(true).build() {
match RegexBuilder::new(newText).case_insensitive(!self.caseSensitive).build() {
Ok(newRegex) => self.regexState = RegexState::Valid{regex: newRegex},
Err(e) => {
*text = newText.into();
Expand All @@ -35,7 +36,7 @@ impl TextFilter
}
},
RegexState::Valid{regex} => {
match RegexBuilder::new(newText).case_insensitive(true).build() {
match RegexBuilder::new(newText).case_insensitive(!self.caseSensitive).build() {
Ok(newRegex) => *regex = newRegex,
Err(e) => {
self.regexState = RegexState::Invalid{text: newText.into()};
Expand All @@ -47,12 +48,31 @@ impl TextFilter
Ok(())
}

pub(crate) fn setCaseSensitivityEnabled(&mut self, shouldEnable: bool) -> Result<()>
{
self.caseSensitive = shouldEnable;
match &mut self.regexState {
RegexState::Disabled{..} => (),
RegexState::Invalid{..} => bail!(""),
RegexState::Valid{regex} => {
match RegexBuilder::new(regex.as_str()).case_insensitive(!shouldEnable).build() {
Ok(newRegex) => self.regexState = RegexState::Valid{regex: newRegex},
Err(e) => {
self.regexState = RegexState::Invalid{text: regex.as_str().into()};
bail!(e)
}
}
}
}
Ok(())
}

pub(crate) fn setRegexEnabled(&mut self, shouldEnable: bool) -> Result<()>
{
if shouldEnable {
match &mut self.regexState {
RegexState::Disabled{text} => {
match RegexBuilder::new(&text).case_insensitive(true).build() {
match RegexBuilder::new(&text).case_insensitive(!self.caseSensitive).build() {
Ok(regex) => self.regexState = RegexState::Valid{regex},
Err(e) => {
self.regexState = RegexState::Invalid{text: text.clone()};
Expand Down Expand Up @@ -85,7 +105,13 @@ impl TextFilter
pub(crate) fn isMatch(&self, input: &str) -> bool
{
match &self.regexState {
RegexState::Disabled{text} => input.to_lowercase().contains(text),
RegexState::Disabled{text} => {
if self.caseSensitive {
input.contains(text)
} else {
input.to_lowercase().contains(&text.to_lowercase())
}
},
RegexState::Invalid{..} => false,
RegexState::Valid{regex} => regex.is_match(input)
}
Expand Down

0 comments on commit 043b3f8

Please sign in to comment.